saclib2.2.8/0000775002275300236100000000000014017255433011751 5ustar wcbrownscssaclib2.2.8/src/0000775002275300236100000000000014017255270012537 5ustar wcbrownscssaclib2.2.8/src/AFUPHIBRI.c0000664002275300236100000001322214017255270014214 0ustar wcbrownscs/*====================================================================== AFUPHIBRI(M,I,B; L,t) Algebraic number field univariate polynomial hardware interval basis real root isolation. Inputs M : the minimal integral polynomial of an algebraic number \alpha. I : an open standard logarithmic isolating interval for \alpha. B : a non-empty list of univariate polynomials over Q(\alpha). B is a squarefree basis. Each element of B has its nonzero coefficients represented by a pair (r,a) where r is a rational number and a is a univariate integral polynomial of degree less than n. Outputs L : If t = 0, L is a a list (I_1,B_1,...,I_m,B_m). (I_1,...,I_m) is a list of strongly disjoint intervals, each of which has logarithmic binary rational endpoints and is either open or one-point, and that are isolating intervals for the real roots of B. I_1 < I_2 < ... < I_m and each I_i is an isolating interval for a root of B_i. t : 0, 1 or 2. If t = 1, the program failed to produce an isolation list L because of exponent limitation. If t = 2, the failure was due to mantissa limitation. ======================================================================*/ #include "saclib.h" void AFUPHIBRI(M,I,B, L_,t_) Word M,I,B; Word *L_; BDigit *t_; { Word a1,a2,B1,Bp,*D,I1,L,L1,Lp,Lp1,*N,*T,*X; BDigit h,i,j,k,m,n,n1,n2,np,q,r,s,s1,t,t1,u,x,i1,is3; interval *A,*Bp1,*J,K,**P; ieee F1,F2; double p,w1,w2; Step1: /* Convert the isolating interval for \alpha to a hardware interval. */ L = NIL; LBRNIEEEE(FIRST(I), &t,&F1,&n1); if (t != 0) goto Return; w1 = F1.num; LBRNIEEEE(SECOND(I), &t,&F2,&n2); if (t != 0) goto Return; w2 = F2.num; np = MIN(n1,n2); Step2: /* Convert the minimal polynomial to a hardware interval polynomial and refine the hardware interval. */ FPCATCH(); IUPHIP(M,&A,&t); if (t == 0) { t = 1; goto Return; } n = PDEG(M); t = HIPFES(n,A,w2); if (FPCHECK() == 1) { FREEARRAY(A); t = 1; goto Return; } if (t == NIL) { FREEARRAY(A); t = 2; goto Return; } u = 0; while (u == 0 && np > 0) { p = (w1 + w2) / 2.0; s = HIPFES(n,A,p); if ((FPCHECK() == 1) || (s == NIL)) u = 1; else if (s == t) w2 = p; else if (s == -t) w1 = p; else { w1 = p; w2 = p; } np = np - 1; } K.left = w1; K.right = w2; FREEARRAY(A); Step3: /* Convert the basis polynomials to hardware interval polynomials; isolate and count their roots. */ L = NIL; m = LENGTH(B); P = GETAHIA(m); D = GETARRAY(m); r = 0; Bp = B; i = 0; while (Bp != NIL) { ADV(Bp, &B1,&Bp); AFPHIP(K,B1, &Bp1,&t); n1 = PDEG(B1); D[i] = n1; P[i] = Bp1; HIPRRID(n1,Bp1, &L1,&t); if (t != 0) { for(i1 = 0; i1 <= i; ++i1) { FREEARRAY(P[i1]); } FREEARRAY(P); FREEARRAY(D); L = NIL; goto Return; } r = r + LENGTH(L1); L = COMP(L1,L); i = i + 1; } is3 = i; L = INV(L); if (r == 0) { for(i1 = 0; i1 < is3; ++i1) { FREEARRAY(P[i1]); } FREEARRAY(P); FREEARRAY(D); L = NIL; goto Return; } Step4: /* Convert the isolating intervals to hardware intervals; store their indices, trends and numbers of trailing zero bits. */ J = GETHIPARRAY(r); X = GETARRAY(r); N = GETARRAY(r); T = GETARRAY(r); Bp = B; Lp = L; i = 0; j = 0; while (Bp != NIL) { ADV(Bp, &B1,&Bp); ADV(Lp, &L1,&Lp); n1 = PDEG(B1); s1 = ISIGNF(PLDCF(B1)); if ((EVEN(n1) && s1 > 0) || (ODD(n1) && s1 < 0)) t1 = -1; else t1 = +1; Lp1 = L1; while (Lp1 != NIL) { ADV(Lp1, &I1,&Lp1); FIRST2(I1, &a1,&a2); LBRNIEEEE(a1, &t,&F1,&n1); if (t != 0) goto Step7; LBRNIEEEE(a2, &t,&F2,&n2); if (t != 0) goto Step7; n = MIN(n1,n2); J[j].left = F1.num; J[j].right = F2.num; X[j] = i; T[j] = t1; N[j] = n; t1 = - t1; j = j + 1; } i = i + 1; } Step5: /* Bubble-sort the isolating intervals, refining as necessary. */ q = r; do { i = -1; for (j = 0; j < q - 1; j++) { while (!(J[j].right < J[j+1].left) && !(J[j+1].right < J[j].left)) { w1 = J[j].right - J[j].left; w2 = J[j + 1].right - J[j + 1].left; if (w1 > w2) h = j; else h = j + 1; if (N[h] <= 0) { t = 2; goto Step7; } p = (J[h].right + J[h].left) / 2.0; k = X[h]; s = HIPFES(D[k],P[k],p); if (s == NIL) { t = 2; goto Step7; } if (FPCHECK() == 1) { t = 1; goto Step7; } if (s == T[h]) J[h].right = p; else if (s == - T[h]) J[h].left = p; else { J[h].left = p; J[h].right = p; } N[h] = N[h] - 1; } if (J[j + 1].right < J[j].left) { K = J[j]; J[j] = J[j + 1]; J[j + 1] = K; x = X[j]; X[j] = X[j + 1]; X[j + 1] = x; t = T[j]; T[j] = T[j + 1]; T[j + 1] = t; n = N[j]; N[j] = N[j + 1]; N[j + 1] = n; i = j + 1; } } q = i; } while (q > 0); Step6: /* Convert the isolating intervals to binary rational and match each with a basis polynomial. */ L = NIL; for (i = r - 1; i >= 0; i--) { j = X[i]; B1 = LELTI(B,j + 1); I1 = HILBRI(J[i]); L = COMP2(I1,B1,L); } t = 0; Step7: /* Free arrays. */ for(i1 = 0; i1 < is3; ++i1) { FREEARRAY(P[i1]); } FREEARRAY(P); FREEARRAY(D); FREEARRAY(J); FREEARRAY(N); FREEARRAY(T); FREEARRAY(X); Return: /* Return L and t. */ *L_ = L; *t_ = t; return; } saclib2.2.8/src/DEGCD.c0000664002275300236100000000470014017255270013512 0ustar wcbrownscs/*========================================================================= DEGCD(a,b;c,u,v) Digit extended greatest common divisor. Inputs a, b : BETA-digits, a >= b >= 0. Outputs c : a BETA-digit, c = gcd(a,b), c >= 0. u, v : BETA-digits such that au + bv=c, with |u| <= b/(2c), |v| <= a/(2c). Method The Euclidean algorithm with divisions performed by shifting and subtraction. ===========================================================================*/ #include "saclib.h" void DEGCD(a,b, c_,u_,v_) Word a,b, *c_,*u_,*v_; { Word a1,a2,a3,b2,q,u1,u2,u3,v1,v2,v3,d; Step1: /* b = 0. */ if (b == 0) { a2 = a; u2 = 0; v2 = 0; goto Return; } Step2: /* Initialize. */ a1 = a; a2 = b; u1 = 1; u2 = 0; v1 = 0; v2 = 1; Step3: /* Quotient is less than 11. */ a3 = a1 - a2; u3 = u1 - u2; v3 = v1 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; u3 = u3 - u2; v3 = v3 - v2; d = a3 - a2; if (d < 0) goto Step5; Step4: /* Quotient is 11 or more; divide by shifting and subtraction. */ b2 = a2 << 1; d = 1; while (b2 <= a3) { b2 = b2 << 1; d = d << 1; } b2 = b2 >> 1; q = 0; while (b2 >= a2) { if (b2 <= a3) { a3 = a3 - b2; q = q + d; } d = d >> 1; b2 = b2 >> 1; } u3 = u3 - q * u2; v3 = v3 - q * v2; Step5: /* Check for completion. */ if (a3 == 0) goto Return; Step6: /* Update and go back to Step3. */ a1 = a2; a2 = a3; u1 = u2; u2 = u3; v1 = v2; v2 = v3; goto Step3; Return: /* Prepare for return. */ *c_ = a2; *u_ = u2; *v_ = v2; return; } saclib2.2.8/src/IUPEVAL.c0000664002275300236100000000144314017255270014012 0ustar wcbrownscs/*====================================================================== b <- IUPEVAL(A,a) Integral univariate polynomial evaluation. Inputs A : a univariate integral polynomial. a : an integer Outputs b : the integer A(a). ======================================================================*/ #include "saclib.h" Word IUPEVAL(A,a) Word A,a; { Word a2,Ap,b,e1,e2,i; Step1: /* A = 0. */ if (A == 0) { b = 0; goto Return; } Step2: /* Apply Horner's method. */ ADV2(A,&e1,&b,&Ap); while (Ap != NIL) { ADV2(Ap,&e2,&a2,&Ap); for (i = 1; i <= e1 - e2; i++) b = IPROD(a,b); b = ISUM(b,a2); e1 = e2; } for (i = 1; i <= e1; i++) b = IPROD(a,b); Return: /* Return b. */ return(b); } saclib2.2.8/src/AFPFIP.c0000664002275300236100000000173214017255270013653 0ustar wcbrownscs/*====================================================================== B <- AFPFIP(r,A) Algebraic number field polynomial from integral polynomial. Inputs r : a BETA-digit, r >= 1. A : in Z[X1,...,Xr]. Outputs B : in Q(alpha)[X1,...,Xr], B = A. ======================================================================*/ #include "saclib.h" Word AFPFIP(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = AFFINT(A); goto Return; } Step3: /* Recursion on r. */ B = NIL; Ap = A; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); b = AFPFIP(rp,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); goto Return; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LAST.c0000664002275300236100000000073014017255270013446 0ustar wcbrownscs/*====================================================================== l <- LAST(L) Last element of list. Inputs L : a non-empty list. Outputs l : the last element of L. ======================================================================*/ #include "saclib.h" Word LAST(L) Word L; { Word a; Step1: /* Extract the element in the last cell of L. */ a = FIRST(LASTCELL(L)); Return: /* Return a. */ return(a); } saclib2.2.8/src/SIAFEE.c0000664002275300236100000000233014017255270013635 0ustar wcbrownscs/*====================================================================== J <- SIAFEE(B,I,p) Software interval algebraic field element evaluation. Inputs B : a univariate rational polynomial, represented as a rational number and a positive primitive integral polynomial. I : a logarithmic binary rational interval containing an algebraic number alpha.. p : a positive BETA-digit. Output J : a logarithmic binary rational interval containing B(alpha). Method B is converted to a p-precision software interval polynomial B', I is converted to a p-precision software interval I', and J' = B'(I'), evaluated with p-precision software interval arithmetic. J' is then converted to a logarithmic binary rational interval J. ======================================================================*/ #include "saclib.h" Word SIAFEE(B,I,p) Word B,I; BDigit p; { BDigit *Ip,*Jp,q; Word J; Step1: /* B = 0? */ if (B == 0) { J = LIST2(0,0); goto Return; } Step2: /* ANSI converts and evaluates B. */ q = p + p + 6; Ip = GETARRAY(q); LBRISI(I,p,Ip); Jp = GETARRAY(q); ANSI(Ip,B,Jp); J = SILBRI(Jp); FREEARRAY(Ip); FREEARRAY(Jp); Return: /* Return J. */ return(J); } saclib2.2.8/src/NORMFCTS.c0000664002275300236100000000777414017255270014155 0ustar wcbrownscs/*=========================================================================== NORMFCTS(N,p,Q,Qp,q,K,L,d,W1,N1; F,Nb,Ib) Norm polynomial factor combination test subroutine. Inputs N : the norm of a polynomial A[alpha,x] in Z[alpha][x], where alpha is an algebraic number. N is squarefree. p : an odd medium prime. Q : a positive power of p. Qp: the floor function of the square root of Q/2. q : a BETA-digit, q = ILOG2(Qp). K : a list of lists of modular factors for the trial combination. L : a (possibly empty) list of pairs ((d_2,L_2),...,(d_s,L_s)). Let M be the minimal polynomial of alpha, and let M_1 * M_2 * ... * M_s be a complete factorization of M (mod p). Then d_i = deg(M_i) and L_i is a pair (n_i,A_i), where A_i is a GCArray containing the distinct monic irreducible factors (with tags) of res_t(M_i(t),A(t,x)) (mod p). T : a (possibly empty) list (T_1,...,T_s) of GCA handles. The jth element of T_i is the value of the the jth element of A_i evaluated at 1. d : a BETA-digit, the degree of the possible factor of A[alpha,x]. W0 : the product of the elements of K evaluated at 1. N1 : in Z, N1 = N(1). Outputs F : an irreducible factor of N (may be = 1). Nb : N divided by F. Ib : a (possible empty) list of lists I_i of indices j_i such that if f_{j_i} is the j_ith element of L_i, then f_{j_i} was combined to produce F. ===========================================================================*/ #include "saclib.h" void NORMFCTS(N,p,Q,Qp,q,K,L,T,d,W0,N1, F_,Nb_,Ib_) Word N,p,Q,Qp,q,K,L,T,d,W0,N1, *F_,*Nb_,*Ib_; { Word A,A1,C,F,*I,I1,Ib,Kp,L1,Lp,Nb,Tp,T1,W,W1, e,f,i,k,max,min,n,t,tp; Step1: /* L = NIL. */ if (L == NIL) { NORMFT(N,p,Q,Qp,q,K,W0,N1,&F,&Nb); Ib = NIL; goto Return; } Step2: /* Get the next group of factors and compute the degree e that the degree of the product must equal. */ ADV(L,&L1,&Lp); FIRST2(L1,&e,&L1); e = e*d; FIRST2(L1,&n,&A); ADV(T,&T1,&Tp); Step3: /* Initialize number of factors to combine. */ k = 1; Step4: /* Check minimum and maximum possible degree. */ min = max = 0; for (i = 0; i < k; i++) max += PDEG(SECOND(GCAGET(A,i))); if (max < e) /* not enough factors. */ goto Step10; for (i = n-1; i >= n - k; i--) min += PDEG(SECOND(GCAGET(A,i))); if (min > e) /* too many factors. */ goto Step11; Step5: /* Initialize I, combination array W, the array for the products of the polynomials evaluated at 1 t, the last changed index in combination and tp, the last changed index in trailing coefficient product. */ I = GETARRAY(k); for (i = 0; i < k; i++) I[i] = i; W = GCAMALLOC(k,GC_CHECK); t = tp = 0; Step6: /* Get combination of factors and compute degree of product. */ C = NIL; f = 0; for (i = 0; i < k; i++) { A1 = SECOND(GCAGET(A,I[i])); f += PDEG(A1); C = COMP(A1,C); } if (f != e) goto Step9; Kp = COMP(C,K); Step7: /* Update the trailing coefficient product. */ if (tp == 0) W1 = W0; else W1 = GCAGET(W,tp-1); for (i = tp; i < k; i++) { W1 = MIPROD(Q,GCAGET(T1,I[i]),W1); GCASET(W,i,W1); } tp = t; Step8: /* Recursion. */ NORMFCTS(N,p,Q,Qp,q,Kp,Lp,Tp,d,W1,N1, &F,&Nb,&Ib); if (PDEG(F) > 0) { I1 = NIL; for (i = k-1; i >= 0; i--) I1 = COMP(I[i],I1); Ib = COMP(I1,Ib); goto Return; } Step9: /* Get next combination, if any. */ LEXNEXTC(n,k,I,&t); if (t < tp) tp = t; if (I[0] >= 0) goto Step6; FREEARRAY(I); Step10: /* Increment number of factors to combine. */ k++; if (k < n) goto Step4; Step11: /* No factors found. */ F = PMON(1,0); Nb = N; Ib = NIL; Return: /* Prepare for return. */ *F_ = F; *Nb_ = Nb; *Ib_ = Ib; return; } saclib2.2.8/src/PTRADV.c0000664002275300236100000000163114017255270013704 0ustar wcbrownscs/*====================================================================== PTRADV(L; a,Lp) Advance. (assuming the "first" element of L is a pointer) Inputs L : a non-empty list. Outputs a : PTRFIRST(L). Lp : reductum of L (assuming the "first" element of L is a pointer). ======================================================================*/ #include "saclib.h" void PTRADV(L,a_,Lp_) Word L, **a_, *Lp_; { #if __WORDSIZE == 64 Word Lp, t; unsigned long long res = 0; ADV(L,&t,&Lp); res = t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; *Lp_ = Lp; *a_ = (Word*)res; #else /* Assumes 32-bit pointers. */ Word Lp, t; unsigned int res = 0; ADV(L,&t,&Lp); res = t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; *Lp_ = Lp; *a_ = (Word*)res; #endif } saclib2.2.8/src/AIMP2.c0000664002275300236100000000230214017255270013510 0ustar wcbrownscs/*======================================================================= AIMP2(A,h,B) Array integer multiplication by a power of 2. Inputs A : an array integer. h : a nonnegative BETA integer. B : an array. Let m = [h / ZETA], n = L(A). The size of B must be at least m + n + 3. Effect 2^h * A is placed in the array B. ========================================================================*/ #include "saclib.h" void AIMP2(A,h,B) BDigit *A,h,*B; { BDigit b,i,k,kp,m,n,p; Step1: /* A = 0 or h = 0. */ if (A[0] == 0 || h == 0) { AICOPY(A,B); goto Return; } Step2: /* Express h as m * ZETA + k. */ if (h < ZETA) { m = 0; k = h; } else { m = h / ZETA; k = h - m * ZETA; } Step3: /* Get n annd set p = m + n. */ n = A[1]; p = n + m; Step4: /* Shift. */ kp = ZETA - k; B[p + 2] = A[n + 1] >> kp; for (i = n + 1; i > 2; i--) { b = (A[i] << k) & BETA1; B[i +m] = (A[i - 1] >> kp) | b; } B[m + 2] = (A[2] << k) & BETA1; for (i = 2; i < m + 2; i++) B[i] = 0; Step5: /* Insert length and sign. */ if (B[p + 2] != 0) B[1] = p + 1; else B[1] = p; B[0] = A[0]; Return: /* Return. */ return; } saclib2.2.8/src/IDQ.c0000664002275300236100000000100314017255270013312 0ustar wcbrownscs/*========================================================================== C <- IDQ(A,b) Integer-digit quotient. Inputs A : in Z. b : non-zero BETA-digit. Outputs C : in Z, the integral part of A / b. ==========================================================================*/ #include "saclib.h" Word IDQ(A,b) Word A,b; { Word C,r; /* hide algorithm */ Step1: /* Compute. */ IDQR(A,b,&C,&r); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPIPP.c0000664002275300236100000000121114017255270013557 0ustar wcbrownscs/*====================================================================== Ab <- IPIPP(r,A) Integral polynomial integer primitive part. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr] Outputs Ab : in Z[X1,...,Xr]. If A non-zero then Ab = A/a where a is the integer content of A. Otherwise Ab = 0. ======================================================================*/ #include "saclib.h" Word IPIPP(r,A) Word r,A; { Word Ab,a; /* hide algorithm */ Step1: /* Compute. */ IPICPP(r,A,&a,&Ab); Return: /* Prepare for return. */ return(Ab); } saclib2.2.8/src/BKSP.c0000664002275300236100000000070514017255270013444 0ustar wcbrownscs/*====================================================================== BKSP() Backspace. Side effects The last character read is put back onto the input stream. ======================================================================*/ #include "saclib.h" #include void BKSP() { /* hide algorithm */ Step1: /* Put back. */ ungetc(LASTCHAR,stdin); Return: /* Prepare for return. */ return; } saclib2.2.8/src/ASSPR.c0000664002275300236100000000626714017255270013606 0ustar wcbrownscs/*====================================================================== ASSPR(A; p,m) Assignment problem. Inputs A : an n by n square matrix of BETA-digits. Outputs p : an n-permutation for which A[1,p(1)] + ... + A[n,p(n)] is maximal. m : in Z, the maximal sum above. Algorithm See "Combinatorial Theory" by Marshall Hall, Jr, Blaisdell Pub. Co, 1967, pages 58-62. Analysis Let M_i be the maximum of the elements in row i of A and let M be the sum of the M_i. Let m be the maximal sum above. Then the computing time is dominated by (M - m + 1) n^3. ======================================================================*/ #include "saclib.h" void ASSPR(A, p_,m_) Word A, *p_,*m_; { BDigit a11,i,j,m,u1,v1; Word A1,Ap,I,Ip,J,p,S,S1,Sp,U,Us,V,Vs; Step1: /* Set U = (u_1,...,u_n) where u_i is the maximum of the elements in row i of A and V = (0,...,0). */ Ap = A; U = NIL; V = NIL; do { ADV(Ap,&A1,&Ap); ADV(A1,&u1,&A1); while (A1 != NIL) { ADV(A1,&a11,&A1); u1 = MAX(u1,a11); } U = COMP(u1,U); V = COMP(0,V); } while (Ap != NIL); U = INV(U); V = INV(V); Step2: /* Compute S = (S_1,...,S_n) where. S_i = {j: u_1 + v_j = a_{i,j}. */ S = NIL; Ap = A; Us = U; do { S1 = NIL; ADV(Ap,&A1,&Ap); ADV(Us,&u1,&Us); Vs = V; j = 1; do { ADV(Vs,&v1,&Vs); ADV(A1,&a11,&A1); if (u1 + v1 == a11) S1 = COMP(j,S1); j = j + 1; } while (Vs != NIL); S1 = INV(S1); S = COMP(S1,S); } while (!(Ap == NIL)); S = INV(S); Step3: /* Solve the SDR problem for S. */ SDR(S,&p,&I); Step4: /* Optimal assignment found, compute its value.. */ if (p != NIL) { m = 0; Us = U; Vs = V; do { ADV(Us,&u1,&Us); ADV(Vs,&v1,&Vs); m = m + u1 + v1; } while (Us != NIL); goto Return; } Step5: /* No SDR, compute the union J of the sets S_i such that i is in I. */ J = NIL; Sp = S; Ip = I; i = 1; do { ADV(Sp,&S1,&Sp); if (Ip != NIL && FIRST(Ip) == i) { Ip = RED(Ip); J = SUNION(J,S1); } i = i + 1; } while (Ip != NIL); Step6: /* Replace u_i by u_i - 1 for all i in I Replace v_j by v_j + 1 for all j in J. Then return to Step 2. */ Us = U; i = 1; do { if (I != NIL && FIRST(I) == i) { SFIRST(Us,FIRST(Us) - 1); I = RED(I); } Us = RED(Us); i = i + 1; } while (I != NIL); Vs = V; j = 1; do { if (J != NIL && FIRST(J) == j) { SFIRST(Vs,FIRST(Vs) + 1); J = RED(J); } Vs = RED(Vs); j = j + 1; } while (J != NIL); goto Step2; Return: /* Return p and m. */ *p_ = p; *m_ = m; return; } saclib2.2.8/src/LGIE.c0000664002275300236100000000147214017255270013427 0ustar wcbrownscs/*========================================================================== Lp <- LGIE(L,I) List, get indexed elements. Inputs L : a list (A_0, A_1, ..., A_n). I : a list (i_1, ..., i_k) of distinct BETA-digits such that 0 <= i_1 < ... < i_k <= n. Output Lp : the list (A_{i_1}, ..., A_{i_k}). ==========================================================================*/ #include "saclib.h" Word LGIE(L,I) Word L,I; { Word Lp,Ls,L1,Is,i1,i; Step1: /* Initialize. */ Ls = L; Is = I; Lp = NIL; i = -1; Step2: /* Extract the elements. */ while (Is != NIL) { ADV(Is,&i1,&Is); while (i != i1) { ADV(Ls,&L1,&Ls); i++; } Lp = COMP(L1,Lp); } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/IAI.c0000664002275300236100000000176014017255270013311 0ustar wcbrownscs/*======================================================================== B = IAI(A) Integer to array integer. Input A : an integer. Output B : The array representation of A. ========================================================================*/ #include "saclib.h" BDigit *IAI(A) Word A; { BDigit *B,i,n; Word Ap; Step1: /* A a beta-digit. */ if (A < BETA) { B = GETARRAY(3); B[2] = ABS(A); if (A == 0) { B[0] = 0; B[1] = 0; } else { B[1] = 1; if (A > 0) B[0] = 1; else B[0] = -1; } goto Return; } Step2: /* Compute the length of A and get an array. */ n = LENGTH(A); B = GETARRAY(n + 2); B[1] = n; Step3: /* Copy the beta-digits. */ Ap = A; for (i = 1; i < n; i++) { B[i + 1] = ABS(FIRST(Ap)); Ap = RED(Ap); } B[n + 1] = ABS(FIRST(Ap)); Step4: /* Store the sign of A. */ if (FIRST(Ap) > 0) B[0] = 1; else B[0] = -1; Return: /* Return B. */ return(B); } saclib2.2.8/src/MIUPSE.c0000664002275300236100000000174614017255270013715 0ustar wcbrownscs/*=========================================================================== MIUPSE(M,A,B,S,T,C; U,V) Modular integral univariate polynomial, solution of equation. Inputs M : in Z, M > 0. A,B,S,T : in Z/(M)[X], ldcf(A) a unit, deg(T) < deg(A), and A*S + B*T = 1. C : in Z/(M)[X]. Outputs U,V : in Z/(M)[X], U and V are unique elements such that A*U + B*V = C, and deg(V) < deg(A). ===========================================================================*/ #include "saclib.h" void MIUPSE(M,A,B,S,T,C, U_,V_) Word M,A,B,S,T,C, *U_,*V_; { Word J,K,L,Q,U,V,Y,h,k,m,n; Step1: /* Compute. */ n = PDEG(C); h = PDEG(A); k = PDEG(B); m = MAX(n - h + 1,k); Y = MIPPR(1,M,T,C); MIUPQR(M,Y,A,&Q,&V); J = IUPTPR(m,S,C); K = IUPTPR(m,B,Q); L = IPSUM(1,J,K); U = MIPHOM(1,M,L); Return: /* Prepare for return. */ *U_ = U; *V_ = V; return; } saclib2.2.8/src/MPHOM.c0000664002275300236100000000174414017255270013571 0ustar wcbrownscs/*=========================================================================== B <- MPHOM(r,m,A) Modular polynomial homomorphism. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. m : a BETA-digit. Outputs B : in Z/(m)[X1,...,Xr],the image of A under the homomorphism H_m . ===========================================================================*/ #include "saclib.h" Word MPHOM(r,m,A) Word r,m,A; { Word Ap,B,a,b,e,rp; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = MDHOM(m,A); goto Return; } Step3: /* General case. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = MDHOM(m,a); else b = MPHOM(rp,m,a); if (b != 0) B = COMP2(b,e,B); } while (Ap != NIL); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFUPRRS.c0000664002275300236100000000565614017255270014041 0ustar wcbrownscs/*====================================================================== AFUPRRS(M,I,A1,A2,I1,I2; Is1,Is2,s) Algebraic number field univariate polynomial real root separation. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. A1,A2 : in Q(alpha)[x], deg(A1) > 0, deg(A2) > 0. I1,I2 : Binary rational intervals, each of which is either left-open and right-closed, or a one-point interval. I1 contains a unique root alpha1 of A1 of odd multiplicity, and I2 contains a unique root alpha2 not equal alpha1 of A2 of odd multiplicity. Outputs Is1,Is2 : Binary rational intervals. Is1 is a subinterval of I1 containing alpha1 and Is2 is a subinterval of I2 containing alpha2. Is1 and Is2 are strongly disjoint. If I1 is left-open and right-closed then so is Is1, and similarly for I2 and Is2. s : a BETA-digit, s = -1 if Is1 < Is2, and s = 1 if Is1 > Is2. ======================================================================*/ #include "saclib.h" void AFUPRRS(M,I,A1,A2,I1,I2, Is1_,Is2_,s_) Word M,I,A1,A2,I1,I2, *Is1_,*Is2_,*s_; { Word Is1,Is2,a1,a2,b1,b2,c,d1,d2,s,s1,s2,t,u,v; /* hide s,s1,s2,t,u,v; */ Step1: /* I1 and I2 disjoint. */ FIRST2(I1,&a1,&b1); FIRST2(I2,&a2,&b2); if (RNCOMP(b1,a2) < 0) { Is1 = I1; Is2 = I2; s = -1; goto Return; } if (RNCOMP(b2,a1) < 0) { Is1 = I1; Is2 = I2; s = 1; goto Return; } Step2: /* Initialize. */ d1 = RNDIF(b1,a1); d2 = RNDIF(b2,a2); s1 = 2; s2 = 2; Step3: /* Bisect I1. */ t = RNCOMP(d1,d2); if (t >= 0) { if (s1 > 1) s1 = AFUPSR(M,I,A1,b1); c = RIB(a1,b1); u = AFUPSR(M,I,A1,c); if (s1 == 0 || s1 * u < 0) { a1 = c; v = 1; } else { b1 = c; s1 = u; v = -1; } d1 = RNDIF(b1,a1); } Step4: /* Bisect I2. */ if (t < 0) { if (s2 > 1) s2 = AFUPSR(M,I,A2,b2); c = RIB(a2,b2); u = AFUPSR(M,I,A2,c); if (s2 == 0 || s2 * u < 0) { a2 = c; v = -1; } else { b2 = c; s2 = u; v = 1; } d2 = RNDIF(b2,a2); } Step5: /* I1 and I2 disjoint. */ if (v < 0 && RNCOMP(b1,a2) < 0) s = -1; else if (v > 0 && RNCOMP(b2,a1) < 0) s = 1; else goto Step3; Is1 = LIST2(a1,b1); Is2 = LIST2(a2,b2); Return: /* Prepare for return. */ *Is1_ = Is1; *Is2_ = Is2; *s_ = s; return; } saclib2.2.8/src/OREAD.c0000664002275300236100000000113014017255270013530 0ustar wcbrownscs/*====================================================================== B <- OREAD() Object read. Outputs B : an object. Side effects The object B is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word OREAD() { Word B,C; /* hide algorithm */ Step1: /* Read list or atom. */ C = CREADB(); BKSP(); if (C == '(') B = LREAD(); else B = AREAD(); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPRCH.c0000664002275300236100000000260414017255270013552 0ustar wcbrownscs/*=========================================================================== L <- IPRCH(A,I,k) Integral polynomial real root calculation, high precision. Inputs A : in Z[x], deg(A) > 0. I : either the null list () or a standard interval or an interval whose positive and non-positive parts are standard. k : a BETA-digit. Outputs L : a list ((e_1,I_1),...,(e_r,I_r)) where the e_j are BETA-digits, 1 <= e_1 <= ... <= e_r, and the I_j are binary rational isolating intervals, I_j=(a_j,b_j), for the r distinct real roots of A if I = (), or for the r distinct real roots of A in I if I /= (). ej is the multiplicity of the root alpha_j in I_j and |b_j-a_j| <= 2^k. I_j is a left-open and right-closed interval if a_j < b_j, a one-point interval if a_j=b_j. ===========================================================================*/ #include "saclib.h" Word IPRCH(A,I,k) Word A,I,k; { Word A1,Ab,J,L,L1,L2,P,e; Step1: /* Squarefree factorization. */ Ab = IPABS(1,A); L1 = IPSFSD(1,Ab); Step2: /* Compute roots of factors. */ L = NIL; do { ADV(L1,&P,&L1); FIRST2(P,&e,&A1); L2 = IPRCHS(A1,I,k); while (L2 != NIL) { ADV(L2,&J,&L2); P = LIST2(e,J); L = COMP(P,L); } } while (L1 != NIL); L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/AFPAFQ.c0000664002275300236100000000214114017255270013637 0ustar wcbrownscs/*====================================================================== C <- AFPAFQ(r,M,A,b) Algebraic number field polynomial algebraic number field element quotient. Inputs r : a BETA-digit, r >= 1, the number of variables. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : an element of Q(alpha)[X1,...,Xr]. b : an element of Q(alpha), b not zero. Outputs C : an element Q(alpha)[X1,...,Xr], C = A/b. ======================================================================*/ #include "saclib.h" Word AFPAFQ(r,M,A,b) Word r,M,A,b; { Word Ap,C,a,c,e,rp; /* hide a,rp; */ Step1: /* A equal 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* A not equal 0. */ Ap = A; rp = r - 1; C = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) c = AFQ(M,a,b); else c = AFPAFQ(rp,M,a,b); C = COMP2(c,e,C); } while (Ap != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IODD.c0000664002275300236100000000102414017255270013417 0ustar wcbrownscs/*====================================================================== t <- IODD(A) Integer odd. Inputs A : in Z. Outputs t : If A is odd then t = 1 and otherwise t = 0. ======================================================================*/ #include "saclib.h" Word IODD(A) Word A; { Word t; /* hide algorithm */ Step1: /* Determine. */ if (A < BETA) t = ODD(A); else t = ODD(FIRST(A)); Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/RPWRITE.c0000664002275300236100000000203214017255270014034 0ustar wcbrownscs/*====================================================================== RPWRITE(r,A,V) Rational polynomial write. Inputs A : in Q[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. V : a variable list for A. Side effects : A is written in the output stream in recursive format using the variable list V. ======================================================================*/ #include "saclib.h" void RPWRITE(r,A,V) Word r,A,V; { Word rp,Ap,Vp,v,e,a; Step1: /* r = 0 or A = 0 */ if (r == 0 || A == 0) { RNWRITE(A); return; } Step2: /* r = 1 */ if (r == 1) { v = FIRST(V); RUPWRITE(A,v); return; } Step3: /* r > 1 */ rp = r - 1; Ap = A; Vp = CINV(V); ADV(Vp,&v,&Vp); Vp = INV(Vp); CWRITE('('); do { ADV2(Ap,&e,&a,&Ap); RPWRITE(rp,a,Vp); if (e > 0) VWRITE(v); if (e > 1) { CWRITE('^'); AWRITE(e); } if (Ap != NIL) CWRITE('+'); } while (Ap != NIL); CWRITE(')'); } saclib2.2.8/src/IMP2.c0000664002275300236100000000531714017255270013420 0ustar wcbrownscs/*=========================================================================== B <- IMP2(A,h) Integer multiplication by power of 2. Inputs A : in Z. h : a non-negative BETA-integer. Outputs B : A * (2^h). ===========================================================================*/ #include "saclib.h" Word IMP2(A,h) Word A,h; { Word a,a0,a1,b,bp,D,d,i,k,kp,M,n,q,s; Word Ap,B,*Bp,*Bpp,Bh[FIXED]; Step1: /* A = 0 or h = 0. */ if (A == 0 || h == 0) { B = A; goto Return; } Step2: /* h = q * ZETA + k. */ if (h < ZETA) { q = 0; k = h; } else { q = h / ZETA; k = h - q * ZETA; } Step3: /* Mask. */ kp = ZETA - k; M = ~(~0 << kp); Step4: /* A non-zero BETA-digit. Shift by k bits. */ if (A < BETA) { if (A > 0) { b = (A & M) << k; /* shifted kp low order bits. */ bp = A >> kp; } /* k high order bits. */ else { a = -A; b = -((a & M) << k); bp = -(a >> kp); } if (bp == 0) B = b; else B = COMP(b,COMP(bp,NIL)); goto Step14; } Step5: /* Initialize. */ Bp = Bh; D = FIXED - 1; Step6: /* A double precision. Shift by k bits. */ if (RED2(A) == NIL) { FIRST2(A,&a0,&a1); if (a1 < 0) { a0 = -a0; a1 = -a1; s = -1; } else s = 1; Bp[0] = (a0 & M) << k; bp = a0 >> kp; Bp[1] = ((a1 & M) << k) ^ bp; bp = a1 >> kp; if (bp == 0) n = 2; else { Bp[2] = bp; n = 3; } goto Step12; } Step7: /* Trailing zeros. Determine sign. */ Ap = A; a = FIRST(Ap); while (a == 0) { q = q + 1; Ap = RED(Ap); a = FIRST(Ap); } if (a < 0) s = -1; else s = 1; Step8: /* Initialize for shifting. */ n = 0; bp = 0; Step9: /* Shift remaining digits by k bits. */ if (s == -1) do { ADV(Ap,&a,&Ap); a = -a; b = a & M; Bp[n] = (b << k) ^ bp; bp = a >> kp; n = n + 1; } while (Ap != NIL && n < D); else do { ADV(Ap,&a,&Ap); b = a & M; Bp[n] = (b << k) ^ bp; bp = a >> kp; n = n + 1; } while (Ap != NIL && n < D); Step10: /* Allocate sufficiently large array. Resume shifting. */ if (Ap != NIL) { D = n + LENGTH(Ap) + 1; Bpp = GETARRAY(D); for (i = 0; i < n; i++) Bpp[i] = Bp[i]; Bp = Bpp; goto Step9; } Step11: /* Last carry. */ if (bp != 0) { Bp[n] = bp; n = n + 1; } Step12: /* Store result in list. */ B = IFATL(Bp,n,s); Step13: /* Free up memory. */ if (D >= FIXED) FREEARRAY(Bp); Step14: /* Append q BETA-zeros. */ if (q != 0) IMPB(B,q,&B,&d); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/DDPCC.c0000664002275300236100000000636114017255270013526 0ustar wcbrownscs/*=========================================================================== DDPCC(a1,a0,b1,b0; u1,u2,v1,v2) Double-digit partial cosequence calculation. Inputs: a1, a0, b1, b0: non-negative BETA-digits, with a1 >= BETA/2, b1 > 0 and a = a1 * BETA + a0 >= b = b1 * BETA + b0. Outputs: u1, u2, v1, v2: BETA-digits. Let A and B be positive integers such that, for some k >= 0, we have a = [A / 2^k] and b = [B / 2^k]. Then, for some i, nearly as large as possible, A_i = u1 A + v1 B and A_{i+1} = u2 A + v2 B, where A_j is the j-th term of the remainder sequence of A and B. ===========================================================================*/ #include "saclib.h" void DDPCC(a1,a0,b1,b0,u1_,u2_,v1_,v2_) Word a1,a0,b1,b0,*u1_,*u2_,*v1_,*v2_; { Word a10,a11,a20,a21,a30,a31,b20,b21,c0,c1,d,i,k,q, u1,u2,u3,v1,v2,v3,w; Step1: /* Initialize. */ a11 = a1; a10 = a0; a21 = b1; a20 = b0; u1 = 1; v1 = 0; u2 = 0; v2 = 1; Step2: /* Set b2 = b21 * BETA + b20 = a2 * 2^k, where k is such that a1 / a2 < 2^{k+1}, and k is minimal. */ k = 0; b21 = a21 << 1; while (b21 <= a11) { b21 = b21 << 1; k = k + 1; } b21 = b21 >> 1; if (k > 0) { b21 = b21 | (a20 >> (ZETA - k)); b20 = (a20 << k) & BETA1; } else b20 = a20; Step3: /* Divide by shifting and subtraction. */ d = 01 << k; a31 = a11; a30 = a10; q = 0; for (i = 0; i <= k; i++) { if ((b21 < a31) || (b21 == a31 && b20 <= a30)) { a31 = a31 - b21; a30 = a30 - b20; if (a30 < 0) { a30 = a30 + BETA; a31 = a31 - 1; } q = q + d; } d = d >> 1; b20 = (b20 >> 1) | ((b21 & 01) << (ZETA - 1)); b21 = b21 >> 1; } u3 = u1; v3 = v1; switch (q) { case 2: u3 -= u2; v3 -= v2; case 1: u3 -= u2; v3 -= v2; break; default: u3 -= q * u2; v3 -= q * v2; } Step4: /* Test for completion. */ if (a31 == 0) { if (a30 >= absm(v3)) { c0 = a20 - a30; if (c0 < 0) { c1 = a21 - 1; c0 += BETA; } else c1 = a21; w = v2 - v3; w = absm(w); if (w >= BETA) { w -= BETA; c1--; } c0 -= w; if (c1 > 0 || (c1 == 0 && c0 >= 0)) { u1 = u2; v1 = v2; u2 = u3; v2 = v3; } } goto Return; } c1 = a21 - a31; if (c1 <= 1) { c0 = a20 - a30; if (c1 == 1) c0 = c0 + BETA; w = v3 - v2; if (c0 < absm(w)) goto Return; } Step5: /* Update sequence values and return to Step 2. */ a11 = a21; a10 = a20; a21 = a31; a20 = a30; u1 = u2; v1 = v2; u2 = u3; v2 = v3; goto Step2; Return: /* Return. */ *u1_ = u1; *u2_ = u2; *v1_ = v1; *v2_ = v2; return; } saclib2.2.8/src/IUPTPR.c0000664002275300236100000000204214017255270013724 0ustar wcbrownscs/*====================================================================== C <- IUPTPR(n,A,B) Integral univariate polynomial truncated product. Inputs n : in Z, n >= 0. A,B : in Z[X]. Outputs C : in Z[X], C(x) = A(x)*B(x) (modulo x^n) and C = 0 or deg(C) < n. ======================================================================*/ #include "saclib.h" Word IUPTPR(n,A,B) Word n,A,B; { Word Ap,As,Bs,C,Cp,a,b,c,e,f; Step1: /* n=0 or A=0 or B=0. */ C = 0; if (n == 0 || A == 0 || B == 0) goto Return; Step2: /* General case. */ As = CINV(A); Bs = CINV(B); while (Bs != NIL && SECOND(Bs) < n) { ADV2(Bs,&b,&f,&Bs); Ap = As; Cp = NIL; while (Ap != NIL && SECOND(Ap) < n - f) { ADV2(Ap,&a,&e,&Ap); c = IPROD(a,b); Cp = COMP2(e + f,c,Cp); } if (Cp != NIL) C = IPSUM(1,C,Cp); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/LSIM.c0000664002275300236100000000171314017255270013451 0ustar wcbrownscs/*====================================================================== c <- LSIM(a,b) Logarithmic standard interval midpoint. Inputs a, b : the endpoints of a logarithmic standard interval; a < b. Outputs c : the midpoint of the interval (a,b), a logarithmic binary rational number. ======================================================================*/ #include "saclib.h" Word LSIM(a,b) Word a,b; { Word c,e,f,g,k,m,n; Step1: /* a or b zero. */ if (a == 0) { n = FIRST(b); g = SECOND(b) + 1; goto Step3; } if (b == 0) { n = FIRST(a); g = SECOND(a) + 1; goto Step3; } Step2: /* a and b non-zero. */ FIRST2(a,&k,&e); FIRST2(b,&m,&f); if (e > f) { n = ISUM(IMP2(k,1),1); g = e + 1; } else { n = IDIF(IMP2(m,1),1); g = f + 1; } Step3: /* Assemble c. */ c = LIST2(n,g); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/LBRNRN.c0000664002275300236100000000126314017255270013702 0ustar wcbrownscs/*======================================================================== B <- LBRNRN(A) Logarithmic binary rational number to rational number. Input A : a logarithmic binary rational number. Output B : A represented as a rational number. =========================================================================*/ #include "saclib.h" Word LBRNRN(A) Word A; { Word a,b,k,B; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ FIRST2(A,&a,&k); if (k >= 0) b = IMP2(1,k); else { a = IMP2(a,-k); b = 1; } B = LIST2(a,b); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LIBS.c0000664002275300236100000000202514017255270013433 0ustar wcbrownscs/*====================================================================== LIBS(L) List of intervals bubble sort. Inputs L : a list of disjoint open or one-point logarithmic binary rational intervals. Side effects L is sorted into non-decreasing order by the bubble-sort method. The list L, though not its location, is modified. ======================================================================*/ #include "saclib.h" void LIBS(L) Word L; { Word t,Ip,Ipp,Lp,Lpp,M,Mp; Step1: /* Trivial case. */ if (L == NIL) goto Return; Step2: /* General case. */ M = NIL; do { Lp = L; Lpp = RED(Lp); Ip = FIRST(Lp); Mp = NIL; while (Lpp != M) { Ipp = FIRST(Lpp); t = LBRNCOMP(FIRST(Ip),FIRST(Ipp)); if (t > 0 || (t == 0 && (EQUAL(FIRST(Ipp),SECOND(Ipp))))) { SFIRST(Lp,Ipp); SFIRST(Lpp,Ip); Mp = Lpp; } else Ip = Ipp; Lp = Lpp; Lpp = RED(Lp); } M = Mp; } while (M != NIL); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPIIS.c0000664002275300236100000000647314017255270013572 0ustar wcbrownscs/*====================================================================== IPIIS(A1,A2,I1,I2,t1,t2; J1,J2,s) Integral polynomial isolating interval separation. Inputs A1,A2 : integral univariate polynomials. I1,I2 : standard logarithmic isolating intervals for simple real roots alpha_1 and alpha_2 of A1 and A2 respectively, alpha_1 /= alpha_2. t1,t2 : the trends of I1 and I2 with respect to A1 and A2 respectively. Outputs J1,J2 : disjoint standard logarithmic subintervals of I1 and I2. s : s = -1 if J1 < J2 and s = +1 otherwise. ======================================================================*/ #include "saclib.h" void IPIIS(A1,A2,I1,I2,t1,t2,J1_,J2_,s_) Word A1,A2,I1,I2,t1,t2,*J1_,*J2_,*s_; { Word a1,a2,b1,b2,c,J1,J2,r,s,u,u1,u2,w1,w2; Step1: /* Get the interval endpoints. */ FIRST2(I1,&a1,&b1); FIRST2(I2,&a2,&b2); Step2: /* Case that the intervals are already disjoint. */ if (LBRNCOMP(b1,a2) <= 0) { J1 = I1; J2 = I2; s = -1; goto Return; } else if (LBRNCOMP(b2,a1) <= 0) { J1 = I1; J2 = I2; s = 1; goto Return; } else s = 0; Step3: /* Compute the logarithms of the interval widths. */ if (EQUAL(a1,b1)) w1 = -BETA; else w1 = LSILW(I1); if (EQUAL(a2,b2)) w2 = -BETA; else w2 = LSILW(I2); Step4: /* If one interval properly contains the other, bisect it until separation is achieved or the intervals are the same. Note that if the larger interval is bisected, then the smaller interval is contained in one of the two open halves (unless the smaller interval is a point. */ while (w1 > w2 && s == 0) { c = LSIM(a1,b1); r = LBRNCOMP(c,a2); u = IUPBRES(A1,c); if (u == 0) { a1 = c; b1 = c; if (r <= 0) s = -1; else s = 1; } else { w1 = w1 - 1; if (u == t1) { if (r <= 0) s = -1; } else { if (r >= 0) s = 1; } } } while (w2 > w1 && s == 0) { c = LSIM(a2,b2); r = LBRNCOMP(c,a1); u = IUPBRES(A2,c); if (u == 0) { a2 = c; b2 = c; if (r <= 0) s = 1; else s = -1; } else { w2 = w2 - 1; if (u == t2) { if (r <= 0) s = 1; } else { if ( r >= 0) s = -1; } } } Step5: /* If now the intervals are identical, bisect each until separation is achieved. */ while (s == 0) { c = LSIM(a1,b1); u1 = IUPBRES(A1,c); if (u1 == 0) { a1 = c; b1 = c; } else if (u1 == t1) b1 = c; else a1 = c; u2 = IUPBRES(A2,c); if (u2 == 0) { a2 = c; b2 = c; } else if (u2 == t2) b2 = c; else a2 = c; if (u1 != -t1 && u2 != t2) s = -1; if (u1 != t1 && u2 != -t2) s = 1; } Step6: /* Compose the output intervals. */ J1 = LIST2(a1,b1); J2 = LIST2(a2,b2); Return: /* Return J1, J2 and s. */ *J1_ = J1; *J2_ = J2; *s_ = s; return; } saclib2.2.8/src/AFUPRII.c0000664002275300236100000001366714017255270014017 0ustar wcbrownscs/*====================================================================== L <- AFUPRII(M,J,A,Ap,d,Lp) Algebraic number field univariate polynomial real root isolation induction. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. J : an acceptable isolating interval for alpha. A : in Q(alpha)[x], positive and deg(A) > 0. Ap : in Q(alpha)[x], the derivative of A. d : a binary rational real root bound for A. Lp : a strong isolation list for Ap. Outputs L : a strong isolation list for A. ======================================================================*/ #include "saclib.h" Word AFUPRII(M,J,A,Ap,d,Lp) Word M,J,A,Ap,d,Lp; { Word Abp,B,B1,B2,I,I1,Ip,Ipp,L,Ls,a1,a2,ahs1,as1,b0,b1,bhs1, bs1,c,ch,dp,k,m,m1,n,r,r0,r1,s,s1,s2,sbp,sbp1,sp,ss1,t0, t1,tp0,tp1,ts1,u,u1,u2,up,up1,us1,v1,vp1,vs1,ws0,ws1,z, z1,z2; /* hide B1,B2,I1,Ls,a1,a2,b0,b1,k,m,m1,n,r,r0,r1,s,s1,s2,sbp, sbp1,sp,ss1,t0,t1,tp0,tp1,ts1,ws0,ws1; */ Step1: /* Ap without roots. */ dp = RNNEG(d); if (Lp == NIL) { I = LIST2(dp,d); L = LIST2(I,1); goto Return; } Step2: /* Initialize. */ Abp = AFUPGS(M,Ap); AFUPGC(M,A,Abp,&B,&B1,&B2); n = PDEG(A); k = PDEG(B); Ls = Lp; if (EVEN(n)) t0 = 1; else t0 = -1; tp0 = -t0; b0 = dp; I1 = FIRST(Ls); a1 = FIRST(I1); u1 = AFPEMV(1,M,A,AFFRN(a1)); s1 = AFSIGN(M,J,u1); L = NIL; if (t0 * s1 > 0) r0 = 0; else { r0 = 1; I = LIST2(b0,a1); L = COMP2(1,I,L); } if (EVEN(k)) ws0 = 1; else ws0 = -1; m = PDEG(Abp); if (EVEN(m)) sbp1 = 1; else sbp1 = -1; Step3: /* Root of A in (bi,A_{i+1}). */ ADV2(Ls,&I1,&m1,&Ls); b1 = SECOND(I1); v1 = AFPEMV(1,M,A,AFFRN(b1)); t1 = AFSIGN(M,J,v1); if (EVEN(m1)) tp1 = tp0; else tp1 = -tp0; ts1 = t1; if (t1 == 0) ts1 = tp1; if (Ls == NIL) a2 = d; else a2 = FIRST(FIRST(Ls)); if (RNCOMP(b1,a2) < 0) { u2 = AFPEMV(1,M,A,AFFRN(a2)); s2 = AFSIGN(M,J,u2); if (ts1 * s2 <= 0) r1 = 1; else r1 = 0; } else { u2 = v1; s2 = t1; r1 = 0; } Step4: /* alpha_i a root of A. */ if (k == 0) ws1 = ws0; else { ws1 = AFUPSR(M,J,B,b1); if (ws1 == 0) ws1 = -ws0; } if (ws0 * ws1 < 0) { L = COMP2(m1 + 1,I1,L); goto Step9; } Step5: /* Other roots of A in (ai,bi). */ r = r0 + r1; if (r == 2) goto Step9; if (s1 != 0) ss1 = s1; else ss1 = tp0; if (r == 1 || EVEN(m1)) { if (ss1 * t1 <= 0) goto Step6; else goto Step9; } if (t1 == 0) { if (ss1 * tp0 > 0) goto Step6; as1 = a1; bs1 = b1; goto Step8; } if (ss1 * t1 < 0) goto Step6; if (ss1 * tp0 > 0) goto Step9; else goto Step7; Step6: /* One root in (ai,bi). */ I = AFUPRRI(M,J,A,Abp,I1,ss1,sbp1); L = COMP2(1,I,L); goto Step9; Step7: /* Zero or two roots of A in (ai,bi). */ as1 = a1; bs1 = b1; us1 = u1; vs1 = v1; ahs1 = AFFRN(as1); bhs1 = AFFRN(bs1); up1 = AFPEMV(1,M,Ap,ahs1); vp1 = AFPEMV(1,M,Ap,bhs1); if (vp1 == 0) goto Step9; do { z = AFQ(M,us1,up1); z1 = AFDIF(ahs1,z); z = AFQ(M,vs1,vp1); z2 = AFDIF(bhs1,z); z = AFCOMP(M,J,z1,z2); if (z >= 0) goto Step9; c = RIB(as1,bs1); ch = AFFRN(c); u = AFPEMV(1,M,A,ch); s = AFSIGN(M,J,u); up = AFPEMV(1,M,Ap,ch); sp = AFSIGN(M,J,up); if (ss1 * s > 0 && sp == 0) goto Step9; if (s == 0 && tp0 * sp < 0) { bs1 = c; goto Step8; } if (ss1 * s <= 0) { Ip = LIST2(as1,c); Ipp = LIST2(c,bs1); if (tp0 * sp <= 0) { I = AFUPRRI(M,J,A,Abp,Ip,ss1,sbp1); L = COMP4(1,Ipp,1,I,L); } else { I = AFUPRRI(M,J,A,Abp,Ipp,-ss1,sbp1); L = COMP4(1,I,1,Ip,L); } goto Step9; } if (tp0 * sp > 0) { as1 = c; us1 = u; up1 = up; } else { bs1 = c; vs1 = u; vp1 = up; } } while (1); Step8: /* Roots at bsi and in (asi,bsi) */ do { c = RIB(as1,bs1); s = AFUPSR(M,J,A,c); if (ss1 * s <= 0) { sbp = AFUPSR(M,J,Abp,c); Ip = LIST2(as1,c); Ipp = LIST2(c,bs1); if (sbp1 * sbp <= 0) { I = AFUPRRI(M,J,A,Abp,Ip,ss1,sbp1); L = COMP4(1,Ipp,1,I,L); } else { I = AFUPRRI(M,J,A,Abp,Ipp,-ss1,sbp1); L = COMP4(1,I,1,Ip,L); } goto Step9; } as1 = c; } while (1); Step9: /* Update. */ if (r1 == 1) { I = LIST2(b1,a2); L = COMP2(1,I,L); } a1 = a2; r0 = r1; tp0 = tp1; s1 = s2; ws0 = ws1; sbp1 = -sbp1; u1 = u2; if (Ls != NIL) goto Step3; Step10: /* Finish. */ L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IPRRISD.c0000664002275300236100000000337314017255270014025 0ustar wcbrownscs/*====================================================================== L <- IPRRISD(A,a,b) Integral polynomial real root isolation, standard interval, Descartes method. Inputs A : in Z[x], squarefree. a, b: logarithmic binary rational numbers, a < b, such that (a,b) is an open logarithmic standard interval. Output L : (T(I_1),...,T(I_r)), where (I_1,...,I_r) is a list of logarithmic standard isolating intervals for all the roots of A in the open interval (0,1) and T is the linear fractional transformation, T(x) = (b - a) x + a, that maps (0,1) onto (a,b). Each I_j is either an open interval or a one-point interval, and T(I_1) < ... < T(I_r). ======================================================================*/ #include "saclib.h" Word IPRRISD(A,a,b) Word A,a,b; { Word B,c,d,e,K,Kp,L,v; Step1: /* Trivial cases. */ L = NIL; if (A == 0) goto Return; v = IPVCHTP(A); if (v == 0) goto Return; if (v == 1) { L = LIST1(LIST2(a,b)); goto Return; } Step2: /* Initialize lists. */ L = NIL; K = LIST3(A,a,b); Step3: /* Make passes over to-do list. */ while (K != NIL) { Kp = K; K = NIL; while (Kp != NIL) { ADV3(Kp,&B,&c,&d,&Kp); e = LSIM(c,d); B = IUPBHT(B,-1); v = IPVCHTP(B); if (v == 1) L = COMP(LIST2(c,e),L); else if (v > 1) K = COMP3(B,c,e,K); B = IUPTR1(B); if (PORD(B) > 0) L = COMP(LIST2(e,e),L); if (IUPVART(B) == 1) { v = IPVCHTP(B); if (v == 1) L = COMP(LIST2(e,d),L); else if (v > 1) K = COMP3(B,e,d,K); } } } Step4: /* Sort isolating intervals. */ LIBS(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/SIPTR1.c0000664002275300236100000000233114017255270013664 0ustar wcbrownscs/*====================================================================== SIPTR1(A,B) Software interval polynomial translation by 1. Inputs A : a software interval polynomial of positive degree. B : an array large enough for A(x + 1). Effect The software interval polynomial A(x + 1) is placed in B. ======================================================================*/ #include "saclib.h" void SIPTR1(A,B) BDigit *A,*B; { BDigit i,j,n,p,q1,q2,t; BDigit *Ap,*Bp,*C,*Cp,*Dp; Step1: /* Get sizes. */ n = A[0]; p = A[3]; q1 = p + 3; q2 = q1 + q1; t = n * q2; Step2: /* Get an array C. */ C = GETARRAY(t + q2 + 1); Step3: /* Start with array B if n is even, else with array C. */ Ap = A + 1; if (EVEN(n)) { Bp = B + 1; Cp = C + 1; } else { Bp = C + 1; Cp = B + 1; } Step4: /* Apply Horner's method. */ SICOPY(Ap + t,Bp + t); SICOPY(Ap + t,Cp + t); for (j = t; j > 0; j = j - q2) { SISUM(Ap + j - q2,Bp + j,Cp + j - q2); for (i = j; i < t; i = i + q2) SISUM(Bp + i,Bp + i + q2,Cp + i); Dp = Bp; Bp = Cp; Cp = Dp; } Step5: /* Store the degree in B. */ B[0] = n; Step6: /* Free array C. */ FREEARRAY(C); Return: /* Return. */ return; } saclib2.2.8/src/RNFCL2.c0000664002275300236100000000230614017255270013632 0ustar wcbrownscs/*====================================================================== RNFCL2(a; m,n) Rational number floor and ceiling of logarithm, base 2. Inputs a : a non-zero rational number, not necessarily reduced. Outputs m : a BETA-digit, m = floor(log2(abs(a))). n : a BETA-digit, n = ceiling(log2(abs(a))). ======================================================================*/ #include "saclib.h" void RNFCL2(a, m_,n_) Word a, *m_,*n_; { Word a1,a2,ap1,c,d,m,m1,m2,n,n1,n2,s; /* hide a1,a2,d,m,m1,m2,n,n1,n2,s; */ Step1: /* Apply IFCL2 to numerator and denominator. */ FIRST2(a,&a1,&a2); IFCL2(a1,&m1,&n1); IFCL2(a2,&m2,&n2); m = m1 - n2; n = n1 - m2; Step2: /* n <= m+1. */ if (n <= m + 1) goto Return; Step3: /* Resolve uncertainty. */ ap1 = IABSF(a1); if (m + 1 >= 0) { c = ap1; d = IMP2(a2,m + 1); } else { c = IMP2(ap1,-m - 1); d = a2; } s = ICOMP(c,d); if (s < 0) n = n - 1; else m = m + 1; Return: /* Prepare for return. */ *m_ = m; *n_ = n; return; } saclib2.2.8/src/MMAPBM.c0000664002275300236100000000300214017255270013647 0ustar wcbrownscs/*=========================================================================== B <- MMAPBM(p,A) Medium modulus array polynomial Berlekamp matrix. Inputs p : a medium prime. A : in Z/(p)[x], deg(A) = n >= 2, monic and squarefree. A is in array representation. Output B : an n x n array which contains the coefficients of x^{i*p} modulo A(x) in row i, with the coefficient of x^j in column j. ===========================================================================*/ #include "saclib.h" Word **MMAPBM(p,A) Word p,*A; { Word n,**B,i,*C,*D,*E; Step1: /* Get array for matrix. */ n = MAPDEG(A); B = GETMATRIX(n,n); Step2: /* Compute row 0. */ MATELT(B,0,0) = 1; for (i = 1; i < n; i++) MATELT(B,0,i) = 0; Step3: /* Compute row 1. */ E = MMAPEXP(p,A,p); MRFMAP(E,n,B,1); Step4: /* n = 2? */ if (n == 2) { MAPFREE(E); goto Return; } Step5: /* Get workspace arrays. */ C = MAPGET(2 * (n - 1)); D = MAPGET(2 * (n - 1)); Step6: /* Compute row 2. */ MMAPPROD(p,E,E,C); MMAPREM(p,C,A); MRFMAP(C,n,B,2); Step7: /* Compute remaining rows. */ for (i = 3; i < n; i++) if (ODD(i)) { MMAPPROD(p,C,E,D); MMAPREM(p,D,A); MRFMAP(D,n,B,i); } else { MMAPPROD(p,D,E,C); MMAPREM(p,C,A); MRFMAP(C,n,B,i); } Step8: /* Free arrays. */ MAPFREE(C); MAPFREE(D); MAPFREE(E); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MPUP.c0000664002275300236100000000214514017255270013466 0ustar wcbrownscs/*====================================================================== B <- MPUP(r,m,c,A) Modular polynomial univariate product. Inputs A : in Z/(m)[X1,...,Xr]. c : in Z/(m)[X1]. r : a BETA-digit, r >= 1. m : a BETA-digit, m > 0. Outputs B : in Z/(m)[X1,...,Xr], B(X1,...,Xr) = c(X1) * A(X1,...,Xr). ======================================================================*/ #include "saclib.h" Word MPUP(r,m,c,A) Word r,m,c,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* c=0 or A=0. */ if (c == 0 || A == 0) { B = 0; goto Return; } Step2: /* r=1. */ if (r == 1) { B = MPPROD(r,m,c,A); goto Return; } Step3: /* General case. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e,&a,&Ap); b = MPUP(rp,m,c,a); if (b != 0) B = COMP2(b,e,B); } while (!(Ap == NIL)); if (B == NIL) B = 0; else B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFSIGN.c0000664002275300236100000000152514017255270013655 0ustar wcbrownscs/*====================================================================== s <- AFSIGN(M,I,a) Algebraic number field sign. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. a : in Q(alpha). Outputs s : a BETA-digit, s = sign(a). ======================================================================*/ #include "saclib.h" Word AFSIGN(M,I,a) Word M,I,a; { Word A,r,s,sp; /* hide s,sp; */ Step1: /* a rational. */ if (a == 0) { s = 0; goto Return; } FIRST2(a,&r,&A); s = RNSIGN(r); if (PDEG(A) == 0) goto Return; Step2: /* Compute sign of A(alpha). */ sp = AMSIGN(M,I,A); s = s * sp; Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/ANPEDE.c0000664002275300236100000000371314017255270013643 0ustar wcbrownscs/*====================================================================== ANPEDE(A,B;C,t) Algebraic number primitive element for a double extension. Inputs A : in Z[x]. A is the integral minimal polynomial of an algebraic number alpha. B : in Z[x]. B is the integral minimal polynomial of an algebraic number beta. Outputs C : a list (C1,...,Cn), where Ck in Z[x]. Ck is the minimal polynomial for a primitive element of the multiple extension field Q(alpha_i,beta_j), where alpha_i and beta_j are conjugates of alpha and beta. t : in Z. Q(alpha_i + t beta_j) = Q(alpha_i,beta_j). ======================================================================*/ #include "saclib.h" void ANPEDE(A,B, C_,t_) Word A,B; Word *C_, *t_; { Word C,t; Word m,n,Ap,P,Bp,R,Rp,Rb,Rbp,s,c; Step1: /* A and B have degree 1. */ t = 0; m = PDEG(A); n = PDEG(B); if (m == 1 && n == 1) { C = LIST1(PMON(1,1)); t = 0; goto Return; } Step2: /* A or B has degree 1. */ if (m == 1) { C = LIST1(B); t = 1; goto Return; } if (n == 1) { C = LIST1(A); t = 0; goto Return; } Step3: /* Find t such that alpha + t*beta is primitive. */ t = 1; Bp = PINV(1,B,1); do { P = PBIN(PMON(-t,0),1,PMON(1,1),0); Ap = IPGSUB(1,A,2,LIST1(P)); R = IPRES(2,Ap,Bp); Rp = IPDMV(1,R); IPGCDC(1,R,Rp,&C,&Rb,&Rbp); if (PDEG(C) > 0) { if (t > 0) t = -t; else t = -t + 1; } } while (PDEG(C) > 0); Step4: /* Get minimal polynomials for conjugates alpha_i + t*beta_j. */ IPSCPP(1,R,&s,&c,&R); C = IUSFPF(R); Return: *t_ = t; *C_ = C; return; } saclib2.2.8/src/IPFRP.c0000664002275300236100000000213714017255270013566 0ustar wcbrownscs/*====================================================================== B <- IPFRP(r,A) Integral polynomial from rational polynomial. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Q[X1,...,Xr], The base coefficients of A are integers. Outputs B : in Z[X1,...,Xr], B is A converted to integral polynomial representation. ======================================================================*/ #include "saclib.h" Word IPFRP(r,A) Word r,A; { Word As,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { B = FIRST(A); goto Return; } Step3: /* r > 0. */ As = A; rp = r - 1; B = NIL; do { ADV2(As,&e,&a,&As); if (rp == 0) b = FIRST(a); else b = IPFRP(rp,a); B = COMP2(b,e,B); } while (As != NIL); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/COMP2.c0000664002275300236100000000142314017255270013523 0ustar wcbrownscs/*=========================================================================== M <- COMP2(a,b,L) Composition 2. Inputs a, b : objects. L : list. Outputs M : the list (a,b) concatenated with the list L. ===========================================================================*/ #include "saclib.h" Word COMP2(a,b,L) Word a,b,L; { Word M,N; Step1: /* Store a. */ M = AVAIL; if (M == NIL) { GC(); goto Step1; } SFIRST(M,a); Step2: /* Store b. */ N = RED(M); if (N == NIL) { GC(); goto Step1; } SFIRST(N,b); Step3: /* Set AVAIL to the reductum of N. */ AVAIL = RED(N); Step4: /* Set the reductum of N to L. */ SRED(N,L); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/PERMCY.c0000664002275300236100000000127614017255270013710 0ustar wcbrownscs/*====================================================================== Pp <- PERMCY(P) Permutation, cyclic. Inputs P : a list (P1,P2,...,Pn), n >= 0. Outputs Pp : (P2, P3,..., Pn, P1). ======================================================================*/ #include "saclib.h" Word PERMCY(P) Word P; { Word Pp,Ps,p,p1; /* hide Ps,p,p1; */ Step1: /* Compute. */ Pp = NIL; if (P == NIL) goto Return; ADV(P,&p1,&Ps); while (Ps != NIL) { ADV(Ps,&p,&Ps); Pp = COMP(p,Pp); } Pp = COMP(p1,Pp); Pp = INV(Pp); Return: /* Prepare for return. */ return(Pp); } saclib2.2.8/src/PPERMV.c0000664002275300236100000000171114017255270013714 0ustar wcbrownscs/*=========================================================================== B <- PPERMV(r,A,P) Polynomial permutation of variables. Inputs A : in R[x_1,...,x_r], R ring. r : a BETA-digit, r >= 0. P : a list (P1,...,Pr) whose elements are the BETA-digits 1 through r. Outputs B : B(x_P1,...,x_Pr) = A(x_1,...,x_r). ===========================================================================*/ #include "saclib.h" Word PPERMV(r,A,P) Word r,A,P; { Word Ap,B,Bp,a,d,dp,t; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Convert A to distributive representation and reorder. */ Ap = DIPFP(r,A); Bp = NIL; do { ADV2(Ap,&a,&d,&Ap); dp = CINV(d); dp = LPERM(dp,P); dp = INV(dp); DIPINS(a,dp,Bp,&t,&Bp); } while (Ap != NIL); Step3: /* Convert back to recursive representation. */ B = PFDIP(r,Bp); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/FAIL.c0000664002275300236100000001515214017255270013422 0ustar wcbrownscs/*====================================================================== FAIL(algName,msg,...) Failure handler. Inputs algName : the name of the algorithm which called this algorithm. msg : a string giving the reason for the failure. ... : any other arguments that the calling algorithm passed. Side effects This algorithm display the information about why the failure occurred and aborts the whole program. ======================================================================*/ #include "saclib.h" #include #include #include #ifdef __STDC__ void FAIL(const char *algName, const char *msg,...) #else void FAIL(algName,msg) __noreturn const char *algName; const char *msg; #endif { va_list argPtr; Step1: /* Basic message. */ SWRITE("\n\n"); SWRITE("Failure occurred in: "); SWRITE(algName); SWRITE("\n"); SWRITE("Reason for the failure: "); SWRITE(msg); SWRITE("\n\n"); Step2: /* Failures from the SACLIB library. */ va_start(argPtr,msg); /* GCSI marking stack */ if (!strcmp(algName,"GCSI (marking stack)")) { /* Note that this step is NOT portable since we are assuming that pointers fit into integers. */ SWRITE("BACSTACK = "); fprintf(stderr,"%p\n",va_arg(argPtr,char *)); //GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); SWRITE("EACSTACK = "); fprintf(stderr,"%p\n",va_arg(argPtr,char *)); //GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); goto Abort; } /* GCSI final check */ if (!strcmp(algName,"GCSI (final check)")) { SWRITE("N = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("NU = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("RHO = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* GREAD */ if (!strcmp(algName,"GREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* AREAD */ if (!strcmp(algName,"AREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* LREAD */ if (!strcmp(algName,"LREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IREAD */ if (!strcmp(algName,"IREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIIPREAD */ if (!strcmp(algName,"DIIPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIRPREAD */ if (!strcmp(algName,"DIRPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IPREAD */ if (!strcmp(algName,"IPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* RPREAD */ if (!strcmp(algName,"RPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VLREAD */ if (!strcmp(algName,"VLREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VREAD */ if (!strcmp(algName,"VREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* SFRLS */ if (!strcmp(algName,"SFRLS")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("a = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("e = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRQ */ if (!strcmp(algName,"SFRQ")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRSUM */ if (!strcmp(algName,"SFRSUM")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* MAIPDM */ if (!strcmp(algName,"MAIPDM")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("b = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("bp = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* MMPDMA */ if (!strcmp(algName,"MMPDMA")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("p = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* IPGCDC */ if (!strcmp(algName,"IPGCDC")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("gb = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* IPRES */ if (!strcmp(algName,"IPRES")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("f = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("Q = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* AFINV */ if (!strcmp(algName,"AFINV")) { SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } Abort: /* Prepare for abort. */ SWRITE("\n\nNow the FAIL handler is aborting the program ...\n"); va_end(argPtr); abort(); Exit: /* Prepare for exit. */ SWRITE("\n\nNow the FAIL handler is exiting the program ...\n"); va_end(argPtr); exit(1); } saclib2.2.8/src/RHI.c0000664002275300236100000000312014017255270013321 0ustar wcbrownscs/*====================================================================== RHI(a,b; I,t) Ratio to hardware interval. Inputs a : a nonzero integer. b : a positive integer. Outputs I : If t = 1, I is a hardware interval, nearly the smallest, containing a / b. Otherwise t = 0 and I is undefined because of exponent limitation. t : 0 or 1. ======================================================================*/ #include "saclib.h" void RHI(a,b,I_,t_) Word a,b; interval *I_; BDigit *t_; { BDigit e,e1,e2,f,g,m01,m02,m11,m12,s1,s2,t,t1,t2; ieee F1,F2,G1,G2; interval F,G,I; Step1: /* Apply ISEM to both a and b. */ ISEM(a,&s1,&e1,&m11,&m01,&t1); ISEM(b,&s2,&e2,&m12,&m02,&t2); Step2: /* Adjust exponents. */ e = MAX(e1,e2); f = MIN(e1,e2); if (e - f > 2000) { t = 0; goto Return; } else t = 1; g = (e + f) / 2; e1 = e1 - g + BIAS; e2 = e2 - g + BIAS; Step3: /* Construct IEEE doubles. */ F1.rep.sign = s1; F1.rep.exp = e1; F1.rep.mant_h = m11; F1.rep.mant_l = m01; G1.rep.sign = s2; G1.rep.exp = e2; G1.rep.mant_h = m12; G1.rep.mant_l = m02; if (t1 == 0) F2 = F1; else { IEEENEIGH(F1,+1,&F2,&t); if (t == 0) goto Return; } if (t2 == 0) G2 = G1; else { IEEENEIGH(G1,+1,&G2,&t); if (t == 0) goto Return; } Step4: /* Divide to get endpoints. */ F.left = F1.num; F.right = F2.num; G.left = G1.num; G.right = G2.num; FPCATCH(); I = HIQUOT(F,G); if (FPCHECK() == 1) { t = 0; FPCATCH(); } Return: /* Return I and t. */ *I_ = I; *t_ = t; return; } saclib2.2.8/src/FRAPCR.c0000664002275300236100000000135614017255270013665 0ustar wcbrownscs/*========================================================================== Ap <- FRAPCR(A) Finite ring array polynomial convert representation. Inputs A : in (Z/(p)[x])/(M)[y], A is in array representation. Outputs Ap : in (Z/(p)[x])/(M)[y], Ap = A, with Ap in list representation. ==========================================================================*/ #include "saclib.h" Word FRAPCR(A) Word **A; { Word Ap,i,n,c; Step1: /* A = NIL. */ if (FRAPDEG(A) < 0) { Ap = NIL; goto Return; } Step2: /* Convert to list. */ Ap = 0; n = FRAPDEG(A); for (i = 0; i <= n; i++) { c = MUPFMAP(FRAPCF(A,i)); Ap = PPLT(i,c,Ap); } Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/IUPLHS.c0000664002275300236100000000465414017255270013720 0ustar wcbrownscs/*========================================================================== IUPLHS(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B; Y,Z,Us,As,Bs) Integral univariate polynomial linear Hensel step. Inputs q : a positive BETA-digit. Q : in Z, Q = q^k, k >= 2. Qpp : Q / q^2. Ab,Bb,Sb,Tb : in Z_q[x] such that Ab*Sb + Bb*Tb = 1, deg(Sb) < deg(Bb), deg(Tb) < deg(Ab) and ldcf(Ab) = 1. Ap,Bp : in Z_{Q/q}[x], Ab = H_q(Ap), Bp = H_q(Bp). Yp,Zp : in Z_q[x] such that A = Ap + (Q/q) Zp, B = Bp + (Q/q) Yp. U : in Z[x]. Yp,Zp,U satisy Ab*Yp + Bb*Zp = U (mod q). D : in Z_q[x]. A,B : in Z_Q[x]. A = Ap + (Q/q)Zp, B = Bp + (Q/q)Yp. Outputs Y,Z : in Z_q[x]. Us : in Z[x]. Y, Z, and U satisfy Ab*Y + Bb*Z = Us (mod q). As,Bs : in Z_{qQ}[x]. A = H_Q(As), B = H_Q(Bs) and As*Bs = A*B + Q*D (mod qQ). ==========================================================================*/ #include "saclib.h" void IUPLHS(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B, Y_,Z_,Us_,As_,Bs_) Word q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B, *Y_,*Z_,*Us_,*As_,*Bs_; { Word As,Bs,Uc,Us,V,Vt,Y,Z,t,t1,t2; Word *Abp,*Bbp,*Sbp,*Tbp,*Ucp,*Ypp,*Zpp; Step1: /* Compute Us = D + V/q - Q/q^2 Yp Zp and Uc = Us (mod q). */ t1 = IPPROD(1,Ap,Yp); t2 = IPPROD(1,Bp,Zp); t = IPSUM(1,t1,t2); V = IPDIF(1,U,t); Vt = IPEQ(1,V,PMON(q,0)); t = IPSUM(1,D,Vt); t1 = IPPROD(1,Yp,Zp); t2 = IPIP(1,Qpp,t1); Us = IPDIF(1,t,t2); if (Qpp == 1) Uc = MPHOM(1,q,Us); else Uc = MPHOM(1,q,t); Step2: /* Convert to arrays. */ Abp = MAPFMUP(Ab); Bbp = MAPFMUP(Bb); Sbp = MAPFMUP(Sb); Tbp = MAPFMUP(Tb); Ucp = MAPFMUP(Uc); Ypp = MAPGET(MAX(MAPDEG(Bbp) - 1,MAPDEG(Ucp) - MAPDEG(Abp))); Zpp = MAPGET(MAPDEG(Abp)-1); Step3: /* Solve the equation Ab * Y + Bb * Z = Uc for Y and Z. */ MAPSE(q,Abp,Bbp,Sbp,Tbp,Ucp, Ypp,Zpp); Step4: /* Convert to lists and free arrays. */ Y = MUPFMAP(Ypp); Z = MUPFMAP(Zpp); MAPFREE(Abp); MAPFREE(Bbp); MAPFREE(Sbp); MAPFREE(Tbp); MAPFREE(Ucp); MAPFREE(Ypp); MAPFREE(Zpp); Step5: /* Set As = A + Q * Z and Bs = B + Q * Y. */ As = IPSUM(1,A,IPIP(1,Q,Z)); Bs = IPSUM(1,B,IPIP(1,Q,Y)); Return: /* Prepare for return. */ *Y_ = Y; *Z_ = Z; *Us_ = Us; *As_ = As; *Bs_ = Bs; return; } saclib2.2.8/src/IPNT.c0000664002275300236100000000215614017255270013461 0ustar wcbrownscs/*====================================================================== B <- IPNT(r,A,i) Integral polynomial negative transformation. Inputs r : a positive BETA digit. A : an element of Z[X1,...,Xr]. i : 1 <= i <= r. Outputs B : an element of Z[X1,...,Xr]. B(X1,...,Xr) = A(X1,...,-Xi,...,Xr). ======================================================================*/ #include "saclib.h" Word IPNT(r,A,i) Word r,A,i; { Word B; Word Ap,a,b,e,n,rp; Step1: /* Degree zero. */ n = PDEG(A); if (n == 0) { B = A; goto Return; } Step2: /* r=1. */ if (r == 1) { B = IUPNT(A); goto Return; } Step3: /* r > 1. */ B = NIL; Ap = A; rp = r - 1; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); if (r == i) { if (ODD(e)) b = IPNEG(rp,a); else b = a; } else b = IPNT(rp,a,i); B = COMP2(b,e,B); } B = INV(B); Return: return(B); } saclib2.2.8/src/IPTR1LV.c0000664002275300236100000000176014017255270014010 0ustar wcbrownscs/*====================================================================== B <- IPTR1LV(r,A) Integral polynomial translation by one, leading variable. Inputs r : A BETA-digit. r >= 0. A : an element of Z[X1,...,Xr]. Outputs B : an element of Z[X1,...,Xr]. B(X1,...,Xr) = A(X1+1,X2,...,Xr). ======================================================================*/ #include "saclib.h" Word IPTR1LV(r,A) Word r,A; { Word B; Word Ap,a,b,e; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=1. */ if (r == 1) { B = IUPTR1(A); goto Return; } Step3: /* r>1. */ B = NIL; Ap = A; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = IPTR1LV(r - 1,a); if (b != 0) B = COMP2(b,e,B); } if (B == NIL) B = 0; else B = INV(B); Return: return(B); } saclib2.2.8/src/IUPTR1.c0000664002275300236100000000617614017255270013701 0ustar wcbrownscs/*====================================================================== B <- IUPTR1(A) Integral univariate polynomial translation by 1. Inputs A : in Z[x]. Outputs B : in Z[x], B(x) = A(x+1). ======================================================================*/ #include "saclib.h" Word IUPTR1(A) Word A; { Word Ap,B,*P,a,a1,ap,c,e,f,fb,h,i,j,k,m,n,s,t; /* hide Ap,a1,ap,c,e,f,fb,h,i,j,k,m,n,s,t; */ Step1: /* Degree zero. */ n = PDEG(A); if (n == 0) { B = A; goto Return; } Step2: /* Compute maximum coefficient length. */ fb = 0; Ap = A; do { Ap = RED(Ap); ADV(Ap,&a,&Ap); f = ILOG2(a); if (f > fb) fb = f; } while (Ap != NIL); Step3: /* Store coefficients in array. */ k = (fb + n + ZETA - 1) / ZETA; m = k * (n + 1); if (m > NPTR1 - 1) { GCAFREE(GCAPTR1); NPTR1 = m + 1; GCAPTR1 = GCAMALLOC(NPTR1,GC_NO_CHECK); } P = GCA2PTR(GCAPTR1); Ap = A; i = 1; for (h = n; h >= 0; h--) { if (Ap == NIL) e = -1; else e = FIRST(Ap); if (e == h) ADV2(Ap,&e,&a,&Ap); else a = 0; ap = a; if (ap < BETA) ap = LIST1(ap); for (j = 1; j <= k; j++) { if (ap != NIL) ADV(ap,&a1,&ap); else a1 = 0; P[i] = a1; i = i + 1; } } Step4: /* Apply synthetic division. */ for (h = n; h >= 1; h--) { c = 0; m = m - k; for (i = 1; i <= m; i++) { s = P[i] + P[i + k] + c; c = 0; if (s >= BETA) { s = s - BETA; c = 1; } else if (s <= -BETA) { s = s + BETA; c = -1; } P[i + k] = s; } } Step5: /* Convert B to normal form. */ B = NIL; e = 0; i = k * n; do { a = NIL; j = k; do { s = P[i + j]; j = j - 1; } while (s == 0 && j != 0); if (s != 0) { c = 0; h = i + 1; j = j + 1; for (t = 1; t <= j; t++) { a1 = P[h] + c; c = 0; if (s > 0 && a1 < 0) { a1 = a1 + BETA; c = -1; } if (s < 0 && a1 > 0) { a1 = a1 - BETA; c = 1; } a = COMP(a1,a); h = h + 1; } while (FIRST(a) == 0) a = RED(a); if (RED(a) == BETA) a = FIRST(a); else a = INV(a); B = COMP2(e,a,B); } e = e + 1; i = i - k; } while (e <= n); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MMPIQR.c0000664002275300236100000000252614017255270013715 0ustar wcbrownscs/*============================================================================ MMPIQR(r,M,D,A,B; Q,R) Modular monic polynomial mod ideal quotient and remainder. Inputs M : in Z, M > 0. D : a list (d_1,...,d_{r-1}) of non-negative BETA-digits. r : a BETA-digit, r >= 1. A,B : in (Z/(M))[X_1,...,X_{r-1},Y] / (X_1^d_1,...,X_{r-1}^d_{r-1}), with B monic. Outputs Q,R : in (Z/(M))[X_1,...,X_{r-1},Y] / (X_1^d_1,...,X_{r-1}^d_{r-1}). If B divides A then Q = A / B and R = 0. Otherwise A = B * Q + R with deg_y(R) < deg_y(B). ============================================================================*/ #include "saclib.h" void MMPIQR(r,M,D,A,B, Q_,R_) Word r,M,D,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,d,m,n; Step1: /* Initialize. */ n = PDEG(B); Bp = PRED(B); Q = NIL; R = A; Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); Q = COMP2(a,d,Q); Q1 = LIST2(d,a); Rp = PRED(R); Qp = MIPIPR(r,M,D,Bp,Q1); R = MIPDIF(r,M,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/IUPLRB.c0000664002275300236100000000247614017255270013711 0ustar wcbrownscs/*====================================================================== b <- IUPLRB(A) Integral univariate polynomial logarithmic root bound. Inputs A : in Z[X], deg(A) > 0. Outputs b : a logarithmic binary rational number which is a root bound for A. If A(x) = a_n x^n +...+ a_0, a_n /= 0, then b is the smallest power of 2 such that 2 |a_{n-k} / a_n|^{1/k} <= b for 1 <= k <= n. If a_{n-k} = 0 for 1 <= k <= n then b = 1. ======================================================================*/ #include "saclib.h" Word IUPLRB(A) Word A; { Word Ap,a,a1,ab,ab1,abp,b,d,h,h1,k,m,m1,n,n1,q,r,s,t; Step1: /* Initialize. */ ADV2(A,&n,&a,&Ap); h = -1; if (Ap == NIL) goto Step3; ab = IABSF(a); m = ILOG2(ab); t = 0; Step2: /* Process terms. */ do { ADV2(Ap,&n1,&a1,&Ap); k = n - n1; m1 = ILOG2(a1); d = m1 - m - 1; QREM(d,k,&q,&r); if (r < 0) { r = r + k; q = q - 1; } h1 = q + 1; if (r == k - 1) { ab1 = IABSF(a1); abp = ITRUNC(ab,-h1 * k); s = ICOMP(ab1,abp); if (s > 0) h1 = h1 + 1; } if (t == 0 || h1 > h) h = h1; t = 1; } while (Ap != NIL); Step3: /* Compute b. */ h = h+ 1; b = LIST2(1,-h); Return: /* Return b. */ return(b); } saclib2.2.8/src/ISPROD.c0000664002275300236100000000366014017255270013710 0ustar wcbrownscs/*====================================================================== ISPROD(A,n1,B,n2,C) Integer special short product. Inputs n1,n2: BETA-digits, n1 >= n2 >= 2. A : positive integer of length n1 in array representation. B : positive integer of length n2 in array representation. C : array of length >= n1 + 2. Effect A X_n2 B is written into C. This means that if a_h, h = 1,...,n1, are the BETA-digits in A (low order to high order), b_j, j = 1,...,n2, are the BETA-digits in B, then C = sum_{h = 1,...,n1; j = 1,...,n2; h + j >= n2} a_h b_j BETA^(h+j-n2). ======================================================================*/ #include "saclib.h" void ISPROD(A,n1,B,n2,C) Word *A; BDigit n1; Word *B; BDigit n2; Word *C; { BDigit b,c0,c1,cp,i,j,k; Word c; Step1: /* Initialize with first row of digit products. */ b = B[0]; k = 0; cp = 0; for (i = n2 - 2; i < n1; i++) { DPRNN(A[i],b,&c1,&c0); c = c0 + cp; cp = c >> ZETA; C[k] = c & BETA1; cp = cp + c1; k++; } C[k] = cp; Step2: /* Add rows of digit products. */ for (j = 1; j < n2 - 1; j++) { b = B[j]; k = 0; cp = 0; for (i = n2 - j - 2; i < n1; i++) { DPRNN(A[i],b,&c1,&c0); c = C[k] + c0 + cp; cp = c >> ZETA; c = c & BETA1; C[k] = c; cp = cp + c1; k++; } C[k] = cp; } Step3: /* Add last row of digit products. */ b = B[n2 - 1]; k = 1; cp = 0; for (i = 0; i < n1; i++) { DPRNN(A[i],b,&c1,&c0); c = C[k] + c0 + cp; cp = c >> ZETA; c = c & BETA1; C[k] = c; cp = cp + c1; k++; } C[k] = cp; Return: /* Prepare for return. */ return; } saclib2.2.8/src/PINV.c0000664002275300236100000000211014017255270013451 0ustar wcbrownscs/*====================================================================== B <- PINV(r,A,k) Polynomial introduction of new variables. Inputs A : in R[X1,...,Xr], R ring. r : a BETA-digit, r >= 0. k : a BETA-digit, k >= 0. Outputs B : in R[Y1,...,Yk,X1,...,Xr], B(Y1,...,Yk,X1,...,Xr) = = A(X1,...,Xr). ======================================================================*/ #include "saclib.h" Word PINV(r,A,k) Word r,A,k; { Word A1,Ap,B,B1,e1,i,rp; /* hide i,rp; */ Step1: /* A=0 or k=0. */ if (A == 0 || k == 0) { B = A; goto Return; } Step2: /* r=0. */ if (r == 0) { B = A; for (i = 1; i <= k; i++) B = LIST2(0,B); goto Return; } Step3: /* r > 0. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e1,&A1,&Ap); B1 = PINV(rp,A1,k); B = COMP2(B1,e1,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/INVPERM.c0000664002275300236100000000127114017255270014024 0ustar wcbrownscs/*======================================================================= B <- INVPERM(n,A) Invert permutation. Inputs n : a positive beta digit. A : an array of n beta digits such that, for 0 <= i < n, there exists j, 0 <= j < n, such that A[j] = i. Output B : an array of n beta digits such that B[i] = j if and only if A[j] = i. =======================================================================*/ #include "saclib.h" BDigit *INVPERM(n,A) BDigit n,*A; { BDigit i,j,*B; Step1: /* Get an array and assign its elements. */ B = GETARRAY(n); for (i = 0; i < n; i++) { j = A[i]; B[j] = i; } Return: /* Return B. */ return(B); } saclib2.2.8/src/AFUPRB.c0000664002275300236100000000331414017255270013663 0ustar wcbrownscs/*====================================================================== b <- AFUPRB(M,I,A) Algebraic number field univariate polynomial root bound. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Q(alpha)[x]. A is a monic and deg(A) > 0. Outputs b : a binary rational number. b is a root bound for A. If A(x) = x^n + a_{n-1} x^{n-1} + ... + a1 x + a0, then b is the smallest power of 2 such that 2*abs(a_{n-k})^{1/k} <= b for 1 <= k <= n. If a_{n-k} = 0 for 1 <= k <= n then b = 1. ======================================================================*/ #include "saclib.h" Word AFUPRB(M,I,A) Word M,I,A; { Word Ap,J,N,a,a1,b,e,h,h1,h2,hp,i,n,n1,q,r,t,u,v; /* hide Ap,N,a,a1,e,h,h1,h2,hp,i,n,n1,q,r,t,u,v; */ Step1: /* Initialize. */ ADV2(A,&n,&a,&Ap); if (Ap == NIL) { e = -1; goto Step3; } t = 0; Step2: /* Process terms. */ do { ADV2(Ap,&n1,&a1,&Ap); i = n - n1; ANFAF(M,I,a1,&N,&J); J = ISFPIR(N,J,0); FIRST2(J,&u,&v); if (u == 0) RNFCL2(v,&hp,&h); else if (v == 0) RNFCL2(u,&hp,&h); else { RNFCL2(u,&hp,&h1); RNFCL2(v,&hp,&h2); h = MAX(h1,h2); } QREM(h,i,&q,&r); if (r > 0) q = q + 1; if (t == 0 || q > e) e = q; t = 1; } while (!(Ap == NIL)); Step3: /* Compute b. */ b = RNP2(e + 1); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/MUPRAN.c0000664002275300236100000000131014017255270013700 0ustar wcbrownscs/*====================================================================== A <- MUPRAN(p,n) Modular univariate polynomial, random. Inputs p : a BETA-digit. n : a BETA-digit. Outputs A : in Z/(p)[X], a random polynomial of degree n. ======================================================================*/ #include "saclib.h" Word MUPRAN(p,n) Word p,n; { Word A,a,i; /* hide a,i; */ Step1: /* Compute. */ A = NIL; for (i = 0; i <= n - 1; i++) { a = MDRAN(p); if (a != 0) A = COMP2(i,a,A); } a = MDRAN(p - 1) + 1; A = COMP2(n,a,A); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IUPEFD.c0000664002275300236100000001003314017255270013654 0ustar wcbrownscs/*=========================================================================== IUPEFD(p,Q,C,M,L,G,D,d; F,Cb,Gb,Mb,Ib,Db) Integral univariate polynomial early factor detection. Inputs p : an odd medium prime. Q : a positive power of p. C : a positive, primitive and squarefree integral polynomial. M : in Z, the two-factor lifting bound for C. L : a list of monic factors of C modulo Q whose product is equal to C. G : a list of pairs (p_i,G_i), where p_i is an element of SPRIME and G_i is the distinct-degree factorization of C (mod p_i), i.e., G_i is a list ((n_1,H_1),...,(n_k,H_k)) of pairs, where H_i is the product of all monic irreducible factors of C (mod p_i) of degree n_i. D : a characteristic set, a superset of the possible degrees of integral factors of C. d : a non-negative BETA-digit, the maximum degree of trial factors. Outputs F : a (possibly empty) list of all the irreducible factors of C that are obtained by performing early factor detection on combinations of elements of L whose product is <= d. Cb : C divided by the product of the elements of F. Gb : a list of pairs (p_i,Gb_i), where p_i is as in the specifications of the input variable G above, and Gb_i is the distinct-degree factorization of Cb (mod p_i). Mb : in Z, the two-factor lifting bound for Cb. If Cb = 1 then Mb = 0. Ib : a (possibly empty) list of increasing indices i where if L_i is the i-th element of L then L_i could not be combined so as to produce a true factor of C. Db : a characteristic set, a superset of the possible degrees of integral factors of Cb. If Cb = 1 then Db = 0. Note For algorithm details, see Collins & Encarnacion "Improved Techniques for Factoring Univariate Polynomials", JSC Vol. 21, No. 3 (March 1996) ===========================================================================*/ #include "saclib.h" void IUPEFD(p,Q,C,M,L,G,D,d,F_,Cb_,Gb_,Mb_,Ib_,Db_) Word p,Q,C,M,L,G,D,d,*F_,*Cb_,*Gb_,*Mb_,*Ib_,*Db_; { Word Cb,Db,F,F1,Fp,Gb,*I,Ib,L1,Lb,Lt,Mb,Qp,*S,c,dp,e,i,j,k,n,q,s; Step1: /* Initialize. */ Qp = IQ(Q,2); ISQRT(Qp,&Qp,&s); q = ILOG2(Qp); Cb = C; Mb = M; Lb = L; Gb = G; Ib = NIL; Db = D; F = NIL; n = LENGTH(L); k = n - 1; Fp = NIL; dp = d; e = 1; Step2: /* Initialize I and S, the arrays for factor removal flags, s, the number of remaining factors and c, the counter for the number of factors to combine. */ I = GETARRAY(n); S = GETARRAY(n); for (i = 0; i < n; i++) { I[i] = 1; S[i] = i; } s = n; c = 1; /* Entering loop for each number of factors to combine. */ Step3: /* Perform factor combination tests. */ IUPFCT(p,Q,Qp,q,Cb,Mb,Lb,Gb,Db,e,dp,c,&Fp,&Cb,&Mb,&Lt,&Gb,&Db); F = CONC(F,Fp); Step4: /* Update factor removal flags and modular factor list. */ if (Fp != NIL) { k = LENGTH(Lt)-1; Lb = NIL; j = 0; while (Lt != NIL) { ADV(Lt,&L1,&Lt); i = FIRST(L1)-1; F1 = SECOND(L1); while (j < i) { I[S[j]] = 0; j++; } j++; Lb = COMP(F1,Lb); } for (j = i+1; j < s; j++) I[S[j]] = 0; Lb = INV(Lb); s = 0; for (j = 0; j < n; j++) if (I[j] == 1) { S[s] = j; s++; } } Step6: /* Check for completion. */ if (PDEG(Cb) == 0) s = 0; else { if (c < k) { c++; goto Step3; } else if (F != NIL && ICOMP(Q,Mb) >= 0) { /* all out search for factors, but we have already tested products having degree <= dp. */ e = dp + 1; dp = PDEG(Cb) - 1; c = 1; goto Step3; } } Step7: /* Prepare the list Ib and free arrays. */ Ib = NIL; for (i = 0; i < s; i++) Ib = COMP(S[i],Ib); Ib = INV(Ib); FREEARRAY(I); FREEARRAY(S); Return: /* Prepare for return. */ *F_ = F; *Cb_ = Cb; *Gb_ = Gb; *Mb_ = Mb; *Ib_ = Ib; *Db_ = Db; return; } saclib2.2.8/src/RNFMR.c0000664002275300236100000000215314017255270013570 0ustar wcbrownscs/*=========================================================================== R <- RNFMR(M,Mp,m,u) Rational number from modular residue. Inputs M : in Z, M > 1, and M odd. [That M is odd is used in certain inequality tests.] Mp: in Z, Mp = floor((M/2)^(1/2)). m : a BETA-digit, m = ILOG2(Mp). U : in Z/(M). Outputs R : in Q, or R = NIL. If there exist integers A and B such that (1) A = B U (mod M), (2) 1 <= B < (M/2)^(1/2), |A| < (M/2)^(1/2), and (3) gcd(A,B) = gcd(B,M) = 1, then R = A / B; otherwise R = NIL. If such A and B exist, they are unique. ===========================================================================*/ #include "saclib.h" Word RNFMR(M,Mp,m,U) Word M,Mp,m,U; { Word A,B,R; Step1: /* Solve the congruence. */ R = ISMC(M,Mp,m,U); if (R == NIL || R == 0) goto Return; Step2: /* Check the denominator. */ A = FIRST(R); B = SECOND(R); if (IGCD(A,B) != 1) R = NIL; Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/IPIPR.c0000664002275300236100000000246014017255270013570 0ustar wcbrownscs/*====================================================================== C <- IPIPR(r,D,A,B) Integral polynomial mod ideal product. Inputs D : a list (d1,...,d_{r-1}) of non-negative BETA-digits. r : a BETA-digit, r >= 1. A,B : in Z[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}). Outputs C : in Z[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}), C = A * B. ======================================================================*/ #include "saclib.h" Word IPIPR(r,D,A,B) Word r,D,A,B; { Word Ap,As,Bs,C,C1,a,b,c,e,f,rp; /* hide a,b,e,f,rp; */ Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* General case. */ As = CINV(A); Bs = CINV(B); C = 0; rp = r - 1; do { ADV2(Bs,&b,&f,&Bs); Ap = As; C1 = NIL; do { ADV2(Ap,&a,&e,&Ap); if (rp == 0) c = IPROD(a,b); else c = IPTPR(rp,D,a,b); if (c != 0) C1 = COMP2(e + f,c,C1); } while (!(Ap == NIL)); if (C1 != NIL) C = IPSUM(r,C,C1); } while (!(Bs == NIL)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IFEC.c0000664002275300236100000000310614017255270013411 0ustar wcbrownscs/*====================================================================== t <- IFEC(I,p,A) Integer to floating, exact conversion. Inputs I : an integer. p : a positive beta digit, the desired precision. A : an array of size at least p + 3. Output t : 0 or 1. Effect If t = 0, I could not be exactly converted to a p-precision software float and the content of A is undefined. If t = 1, the p-precision software float equal to I is placed in A. ========================================================================*/ #include "saclib.h" BDigit IFEC(I,p,A) Word I; BDigit p,*A; { BDigit a,e,i,k,n,s,t; Word J; Step1: /* I = 0. */ if (I == 0) { A[0] = 0; A[1] = 0; A[2] = p; t = 1; goto Return; } Step2: /* Invert the list for I. */ if (I < BETA) J = LIST1(I); else J = CINV(I); Step3: /* Put the leading p + 1 digits in array A. */ s = SIGN(FIRST(J)); k = p + 2; while (J != NIL && k >= 2) { ADV(J, &a,&J); A[k] = ABS(a); k = k - 1; } for (i = k; i >= 2; i--) A[i] = 0; Step4: /* Normalize. */ n = ZETA - PDLOG2(A[p+2]); if (n > 0) ILSA(A + 2,p + 1,n); e = (p + 2 - k) * ZETA - n; Step5:/* Exact conversion? */ t = 0; if (A[2] != 0 ) goto Return; while (J != NIL) { a = FIRST(J); if (a != 0) goto Return; e = e + ZETA; J = RED(J); } t = 1; A[0] = e; A[1] = s; A[2] = p; Return: /* Return t. */ return(t); } saclib2.2.8/src/MAPSEV.c0000664002275300236100000000125714017255270013703 0ustar wcbrownscs/*======================================================================= b <- MAPSEV(A,a) Modular array polynomial special evaluation. Inputs A : a modular array polynomial over Z_p for some medium prime p. a : a nonnegative beta digit such that A(a) (evaluation in Z. not in Z_p) is a beta digit. Output b : A(a), a beta digit. =======================================================================*/ #include "saclib.h" BDigit MAPSEV(A,a) BDigit *A,a; { BDigit b,i,n; Step1: /* Apply Horner's method. */ n = MAPDEG(A); b = MAPCF(A,n); for (i = n - 1; i >= 0; i--) b = b * a + MAPCF(A,i); Return: /* Return b. */ return(b); } saclib2.2.8/src/RPPROD.c0000664002275300236100000000211214017255270013705 0ustar wcbrownscs/*====================================================================== C <- RPPROD(r,A,B) Rational polynomial product. Inputs A, B : in Q[X1,...,Xr]. r : a BETA-digit, r >= 0. Outputs C : in Q[X1,...,Xr], C = A * B. ======================================================================*/ #include "saclib.h" Word RPPROD(r,A,B) Word r,A,B; { Word Ap,As,Bs,C,C1,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { C = RNPROD(A,B); goto Return; } Step3: /* General case. */ As = CINV(A); Bs = CINV(B); C = 0; rp = r - 1; do { ADV2(Bs,&b,&f,&Bs); Ap = As; C1 = NIL; do { ADV2(Ap,&a,&e,&Ap); if (rp == 0) c = RNPROD(a,b); else c = RPPROD(rp,a,b); C1 = COMP2(e + f,c,C1); } while (Ap != NIL); C = RPSUM(r,C,C1); } while (Bs != NIL); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MIPMIP.c0000664002275300236100000000171214017255270013677 0ustar wcbrownscs/*=========================================================================== C <- MIPMIP(r,M,a,B) Modular integral polynomial modular integer product. Inputs r : a BETA-digit, r >= 1, the number of variables; M : in Z, M > 1. a : in Z/(M). B : in Z/(M)[X1,...,Xr]. Outputs C : in Z/(M)[X1,...,Xr], C = a * B. ===========================================================================*/ #include "saclib.h" Word MIPMIP(r,M,a,B) Word r,M,a,B; { Word Bp,C,b,c,e,rp; Step1: /* C = 0. */ if (a == 0 || B == 0) { C = 0; goto Return; } Step2: /* General case. */ Bp = B; C = NIL; rp = r - 1; do { ADV2(Bp,&e,&b,&Bp); if (rp == 0) c = MIPROD(M,a,b); else c = MIPMIP(rp,M,a,b); C = COMP2(c,e,C); } while (Bp != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/CSUN.c0000664002275300236100000000227714017255270013463 0ustar wcbrownscs/*====================================================================== C <- CSUN(A,B) Characteristic set union. Inputs A,B : characteristic sets. Outputs C : the union of A and B. ======================================================================*/ #include "saclib.h" Word CSUN(A,B) Word A,B; { Word Ap,Bp,C,Cp,a,b; /* hide Ap,Bp,C,a,b; */ Step1: /* A and B single-precision. */ if (A < BETA && B < BETA) { C = DOR(A,B); goto Return; } Step2: /* A single-precision. */ if (A < BETA) { ADV(B,&b,&Bp); C = COMP(DOR(A,b),Bp); goto Return; } Step3: /* B single-precision. */ if (B < BETA) { ADV(A,&a,&Ap); C = COMP(DOR(a,B),Ap); goto Return; } Step4: /* General case. */ Cp = NIL; Ap = A; Bp = B; do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); Cp = COMP(DOR(a,b),Cp); } while (!(Ap == NIL || Bp == NIL)); if (Ap == NIL) Ap = Bp; C = INV(Cp); SRED(Cp,Ap); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/BERNOULLIPOL.c0000664002275300236100000000330114017255270014606 0ustar wcbrownscs/*====================================================================== A <- BERNOULLIPOL(n,L) Bernoulli polynomial. The n-th Bernoulli polynomial is computed. Inputs n : a non-negative BETA-digit. L : a list of the first m Bernoulli numbers, L = (B_0,...,B_m) where m >= n. Outputs A : in Q[x], A is the n-th Bernoulli polynomial, A(x) = sum_{k=0}^n (n choose k) B_k x^{n-k}. Cast d : (n choose k) r : B_k s : B_{n-k} B : sum_{j=0}^k (n choose k) B_k x^{n-k} C : sum_{j=0}^k (n choose k) B_{n-k} x^k ======================================================================*/ #include "saclib.h" Word BERNOULLIPOL(n,L) BDigit n; Word L; { BDigit k; Word A,B,C,d,e,Lp,R,r,S,s; Step1: /* n = 0. */ if (n == 0) { A = PMON(RNINT(1),0); goto Return; } Step2: /* Lists of binomial coefficients. */ R = L; Lp = L; S = NIL; for (k = 0; k <= n; k++) { ADV(Lp,&s,&Lp); S = COMP(s,S); } Step3: /* Binomial coefficients by recursion. Exploit symmetry. */ d = 1; ADV(R,&r,&R); B = LIST2(r,n); ADV(S,&s,&S); if (s == 0) C = NIL; else C = LIST2(0,s); for (k = 1; k <= (n-1)/2; k++) { d = IDEQ(IDPR(d,n-k+1),k); e = RNINT(d); ADV(R,&r,&R); if (r != 0) B = COMP2(RNPROD(e,r),n-k,B); ADV(S,&s,&S); if (s != 0) C = COMP2(k,RNPROD(e,s),C); } if (EVEN(n)) { ADV(S,&s,&S); if (s != 0) { k = n/2; d = IDEQ(IDPR(d,n-k+1),k); e = RNINT(d); C = COMP2(k,RNPROD(e,s),C); } } Step4: /* Compose A. */ if (C == NIL) C = 0; A = RPSUM(1,INV(B),C); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IPIIRB.c0000664002275300236100000000207214017255270013662 0ustar wcbrownscs/*==================================================================== J <- IPIIRB(A,I,t,k) Integral polynomial isolating interval refinement - bisection. Inputs A: in Z[x], squarefree. I: a logarithmic open or one-point standard interval for a root \alpha of A. t: the trend of I. k: a BETA-integer. Output J: a logarithmic open or one-point standard isolating subinterval of I of width 2^{k} or less. =====================================================================*/ #include "saclib.h" Word IPIIRB(A,I,t,k) Word A,I,t,k; { Word a,b,c,h,J,s; Step1: /* Decompose. */ FIRST2(I,&a,&b); Step2: /* One-point interval. */ if (EQUAL(a,b) == 1) goto Step5; Step3: /* Width of I. */ h = LSILW(I); Step4: /* Bisect as needed. */ while (h > k) { c = LSIM(a,b); s = IUPBRES(A,c); if (s == 0) { a = c; b = c; goto Step5; } if (s == t) b = c; else a = c; h--; } Step5: /* Compose. */ J = LIST2(a,b); Return: /* Return. */ return(J); } saclib2.2.8/src/MDINVB.c0000664002275300236100000000216514017255270013666 0ustar wcbrownscs/*=========================================================================== b <- MDINVB(a) Modular digit inverse, modulo BETA. Inputs: a : an odd positive BETA-integer. Output b : a^{-1}, the inverse of a modulo BETA, a positive BETA-integer. Method: Jebelean's method is applied four times. Warning: This program is correct only if BETA = 2^29; otherwise it must be modified. ===========================================================================*/ #include "saclib.h" Word MDINVB(a) Word a; { Word a1,a2,b,b1,b2,c,d,i; Step1: /* Look up the inverse modulo 2^8 in the global array TMI. */ a1 = a & 0377; i = a1 >> 1; b1 = TMI[i]; Step2: /* Compute the inverse modulo 2^15. */ a2 = a & 077777; c = a2 * b1 - 1; c = c & 077777; if (c != 0) c = 0100000- c; c = c * b1 + b1; b2 = c & 077777; Step3: /* Compute the inverse modulo 2^29. */ DPR(a,b2,&d,&c); c = c - 1; if (c != 0) c = BETA - c; DPR(c,b2,&d,&c); c = c + b2; b = c & BETA1; Return: /* Return. */ return(b); } saclib2.2.8/src/IPFACTREAD.c0000664002275300236100000000270614017255270014312 0ustar wcbrownscs/*====================================================================== IPFACTREAD(r,V; A,t) Integral polynomial factor read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : in Z[X1,...,Xr], with variables in V. t : 1 if successful, 0 otherwise. ======================================================================*/ #include "saclib.h" void IPFACTREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,C,N,k,t,v; /* hide C,k,t; */ Step1: /* Setup and Classify. */ t = 1; C = CREADB(); if (LETTER(C)) { BKSP(); goto Step2; } if (DIGIT(C)) { BKSP(); goto Step3; } if (C == '(') goto Step4; SWRITE("Error IPFACTREAD: Unexpected character.\n"); goto Step5; Step2: /* Variable. */ v = VREAD(); k = VLSRCH(v,V); if (k == 0) { SWRITE("Error IPFACTREAD: Unknown variable.\n"); goto Step5; } A = PFBRE(k-1,1); A = LIST2(1,A); A = PFBRE(r-k,A); goto Return; Step3: /* Number. */ N = IREAD(); A = PFBRE(r,N); goto Return; Step4: /* Parenthesized expression. */ IPEXPREAD(r,V,&A,&t); if (t == 0) goto Return; C = CREADB(); if (C != ')') { SWRITE("Error IPFACTREAD: ')' was expected.\n"); goto Step5; } goto Return; Step5: /* Error exit. */ DIELOC(); t = 0; Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/IUPIHT.c0000664002275300236100000000116114017255270013704 0ustar wcbrownscs/*====================================================================== B <- IUPIHT(A,n) Integral univariate polynomial integer homothetic transformation. Inputs A : in Z[X], non-zero. n : in Z, non-zero. Outputs B : in Z[X], the primitive part of A(nx). ======================================================================*/ #include "saclib.h" Word IUPIHT(A,n) Word A,n; { Word B,M,c,s; /* hide c,s; */ Step1: /* Compute. */ M = PMON(n,1); B = IPGSUB(1,A,1,LIST1(M)); IPSCPP(1,B,&s,&c,&B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LBRISI.c0000664002275300236100000000132414017255270013667 0ustar wcbrownscs/*====================================================================== LBRISI(I,p,J) Logarithmic binary rational interval to software interval. Inputs I : a logarithmic binary rational interval. p : a BETA-digit, the desired precision. J : (pointer to) an array of size at least 2 p + 6. Effect The smallest p-precision software interval containing I is placed in J. ======================================================================*/ #include "saclib.h" void LBRISI(I,p,J) Word I; BDigit p; Word *J; { Step1: /* Apply LBRNF to endpoints. */ LBRNF(FIRST(I),p,-1,J); LBRNF(SECOND(I),p,+1,J + p + 3); Return: /* Return. */ return; } saclib2.2.8/src/IHI.c0000664002275300236100000000230114017255270013310 0ustar wcbrownscs/*====================================================================== IHI(A; I,u) Integer to hardware interval. Inputs A : in Z Outputs I : the hardware floating point interval of minimal width containing A. u : If u = 0, the program failed because of exponent overflow. Otherwise u = 1. ======================================================================*/ #include "saclib.h" void IHI(A, I_,u_) Word A; interval *I_; BDigit *u_; { BDigit t,u; ieee a,b; interval I; Step1: /* Round towards zero. */ IIEEET(A,&a,&t,&u); Step2: /* Test for overflow. */ if (u == 0) goto Return; Step3: /* Construct the other endpoint. */ if (t == 0) { I.left = a.num; I.right = a.num; } else { if (a.rep.sign == 0) { I.left = a.num; IEEENEIGH(a,1,&b,&u); if (u == 0) goto Return; else I.right = b.num; } else { I.right = a.num; IEEENEIGH(a,-1,&b,&u); if (u == 0) goto Return; else I.left = b.num; } } Return: /* Return I and u. */ *I_ = I; *u_ = u; return; } saclib2.2.8/src/IPMONFACT.c0000664002275300236100000000242614017255270014227 0ustar wcbrownscs/*=========================================================================== IPMONFACT(r,A; L,Ap) Integral polynomial monomial factors. Inputs r : a BETA-digit, the number of variables, r >= 1. A : in Z[x_1,...,x_r], A non-zero. Output L : a list ((e_i,x_i),...,(e_j,x_j)) of the monomial factors of A with multiplicities, i.e., x_k^{e_k} divides A but x_k^{e_k + 1} does not, and e_k > 0. If (e_i,x_i) appears before (e_j,x_j) in L then i < j. Each x_k is represented as an element of Z[x_1,...,x_r]. Ap : in Z[x_1,...,x_r], the quotient of A and the product of the elements in L. ===========================================================================*/ #include "saclib.h" void IPMONFACT(r,A, L_,Ap_) Word r,A, *L_,*Ap_; { Word L,Ap,E,e,a,i; Step1: /* Initialize. */ Ap = A; L = NIL; Step2: /* Get highest powers of variables dividing A. */ E = IPPVED(r,A); Step3: /* Divide A by these powers of variables and form the output list. */ i = r+1; while (E != NIL) { ADV(E,&e,&E); i--; if (e > 0) { Ap = PDPV(r,Ap,i,e); a = PMONSV(r,1,i,1); L = COMP(LIST2(e,a),L); } } Return: /* Prepare for return. */ *L_ = L; *Ap_ = Ap; return; } saclib2.2.8/src/AMUPBHT.c0000664002275300236100000000120414017255270014000 0ustar wcbrownscs/*=========================================================================== B <- AMUPBHT(A,k) Algebraic module univariate polynomial binary homothetic transformation. Inputs A : in Z[alpha,X], A non-zero. k : a BETA-digit. Outputs B : in Z[X], B(X) = 2^(-h) * A(2^k*X), where h is uniquely determined so that B is an integral polynomial not divisible by 2. ===========================================================================*/ #include "saclib.h" Word AMUPBHT(A,k) Word A,k; { Word B; Step1: /* Compute. */ B = IPBHTMV(2,A,k); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MAPQR.c0000664002275300236100000000326214017255270013566 0ustar wcbrownscs/*=========================================================================== MAPQR(m,A,B,Q) Modular array polynomial quotient and remainder. Inputs m : a postive BETA-digit. A,B : in Z/(m)[x], non-zero and in array representation. The leading coefficient of B is a unit in Z/(m). Q : an array large enough to contain the quotient of A divided by B. Side effects The quotient of A divided by B is computed in put in Q. The remainder of A divided by B is put into the array A. ===========================================================================*/ #include "saclib.h" void MAPQR(m,A,B,Q) Word m,*A,*B,*Q; { Word n1,n2,a,bp,q,k,i; Step1: /* deg(B) = 0 or deg(A) < deg(B). */ n1 = MAPDEG(A); n2 = MAPDEG(B); if (n1 < n2) { MAPDEG(Q) = 0; MAPCF(Q,0) = 0; goto Return; } if (n2 == 0) { bp = MDINV(m,MAPLDCF(B)); for (i = 0; i <= n1; i++) { q = MDPROD(m,bp,MAPCF(A,i)); MAPCF(Q,i) = q; } MAPDEG(Q) = n1; MAPDEG(A) = 0; MAPCF(A,0) = 0; goto Return; } Step2: /* deg(B) > 0, compute quotient and remainder. */ bp = MDINV(m,MAPLDCF(B)); for (k = n1 - n2; k >= 0; k--) { q = MDPROD(m,MAPCF(A,n2 + k),bp); MAPCF(Q,k) = q; if (q != 0) for (i = n2 + k - 1; i >= k; i--) { a = MDPROD(m,MAPCF(Q,k),MAPCF(B,i - k)); a = MDDIF(m,MAPCF(A,i),a); MAPCF(A,i) = a; } } Step3: /* Determine degree of remainder. */ i = n2 - 1; while (MAPCF(A,i) == 0 && i > 0) i--; MAPDEG(A) = i; Step4: /* Determine degree of quotient. */ i = n1 - n2; while(MAPCF(Q,i) == 0 && i > 0) i--; MAPDEG(Q) = i; Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPPGSD.c0000664002275300236100000000157314017255270013677 0ustar wcbrownscs/*====================================================================== B <- IPPGSD(r,A) Integral polynomial primitive greatest squarefree divisor. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr]. Outputs B : in Z[X1,...,Xr], if A is non-zero then B is the greatest squarefree divisor of the primitive part of A. Otherwise, B = 0. ======================================================================*/ #include "saclib.h" Word IPPGSD(r,A) Word r,A; { Word B,Bp,C,D; /* hide C,D; */ Step1: /* A equal 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A not equal 0. */ B = IPPP(r,A); if (FIRST(B) > 0) { Bp = IPDMV(r,B); IPGCDC(r,B,Bp,&C,&B,&D); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/PTRCOMP.c0000664002275300236100000000147614017255270014037 0ustar wcbrownscs/*====================================================================== M <- PTRCOMP(a,L) Composition. Inputs a : a pointer (i.e. Word*). L : list. Outputs M : the composition of a and L. ======================================================================*/ #include "saclib.h" Word PTRCOMP(p,L) Word *p, L; { #if __WORDSIZE == 64 unsigned long long t = (unsigned long long)p; Word a,b,c,d; a = (Word)(t & BETA1); t = t >> BETALENGTH; b = (Word)(t & BETA1); t = t >> BETALENGTH; c = (Word)(t & BETA1); t = t >> BETALENGTH; d = (Word)(t & BETA1); return COMP4(d,c,b,a,L); #else /* Assumes 32-bit pointers. */ unsigned int t = (unsigned int)p; Word a,b,c,d; a = (Word)(t & BETA1); t = t >> BETALENGTH; b = (Word)(t & BETA1); return COMP2(b,a,L); #endif } saclib2.2.8/src/CSSUB.c0000664002275300236100000000233114017255270013561 0ustar wcbrownscs/*====================================================================== t <- CSSUB(A,B) Characteristic set subset. Inputs A, B : characteristic sets. Outputs t : integer, t = 1 if A is a subset of B and otherwise t = 0. ======================================================================*/ #include "saclib.h" Word CSSUB(A,B) Word A,B; { Word Ap,Bp,a,b,c,t; /* hide algorithm */ Step1: /* A single-precision. */ if (A < BETA) { if (B < BETA) b = B; else b = FIRST(B); c = DNIMP(A,b); if (c == 0) t = 1; else t = 0; goto Return; } Step2: /* B single-precision. */ if (B < BETA) { t = 0; goto Return; } Step3: /* General case. */ Ap = A; Bp = B; do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); c = DNIMP(a,b); if (c != 0) { t = 0; goto Return; } } while (!(Ap == NIL || Bp == NIL)); if (Ap != NIL) t = 0; else t = 1; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/FRESL.c0000664002275300236100000000541514017255270013563 0ustar wcbrownscs/*====================================================================== FRESL(n; m,L) Fermat residue list. Inputs n : a positive integer with no prime divisors less than 17. Outputs m : a positive BETA-digit. L : an ordered list of the elements of Z(m) such that if x^2-n is a square then x is congruent to a (modulo m) for some a in L. ======================================================================*/ #include "saclib.h" void FRESL(n, m_,L_) Word n, *m_,*L_; { Word H,L,L1,M,a1,a2,a3,a4,b1,h,k,k1,m,m1; /* hide a1,a2,a3,a4,b1,h,k,k1,m,m1; */ Step1: /* Modulus 2^5. */ a1 = IDREM(n,32); a2 = REM(a1,16); a3 = REM(a2,8); a4 = REM(a3,4); if (a4 == 3) { m = 4; if (a3 == 3) b1 = 2; else b1 = 0; } else if (a3 == 1) { m = 8; if (a2 == 1) b1 = 1; else b1 = 3; } else { m = 16; switch (a1 / 8) { case 0: b1 = 3; break; case 1: b1 = 7; break; case 2: b1 = 5; break; case 3: b1 = 1; break; } } if (m == 4) L = LIST1(b1); else L = LIST2(b1,m - b1); k = LENGTH(L); Step2: /* Modulus 3^3. */ a1 = IDREM(n,27); a2 = REM(a1,3); if (a2 == 2) { m1 = 3; k1 = 1; L1 = LIST1(0); } else { m1 = 27; k1 = 4; L1 = FRLSM(m1,a1); } Step3: /* Combine. */ L = MDLCRA(m,m1,L,L1); m = m * m1; k = k * k1; Step4: /* Modulus 5^2. */ a1 = IDREM(n,25); a2 = REM(a1,5); if (a2 == 2 || a2 == 3) { m1 = 5; L1 = LIST2(a2 - 1,6 - a2); k1 = 2; } else { m1 = 25; L1 = FRLSM(m1,a1); k1 = 7; } Step5: /* Combine. */ if (m1 >= BETA / m) goto Return; k = k * k1; L = MDLCRA(m,m1,L,L1); m = m * m1; Step6: /* Moduli 7,11,13. */ M = LIST3(7,11,13); H = LIST3(64,48,0); do { ADV(M,&m1,&M); if (m1 >= BETA / m) goto Return; a1 = IDREM(n,m1); L1 = FRLSM(m1,a1); k1 = LENGTH(L1); L = MDLCRA(m,m1,L,L1); m = m * m1; k = k * k1; ADV(H,&h,&H); if (k > h) goto Return; } while (1); Return: /* Prepare for return. */ *m_ = m; *L_ = L; return; } saclib2.2.8/src/LLCOPY.c0000664002275300236100000000114514017255270013706 0ustar wcbrownscs/*=========================================================================== Lp <- LLCOPY(L) List of lists copy. Input L : is a list of lists of objects. Output Lp : is a copy of L. The objects are not copied. ===========================================================================*/ #include "saclib.h" Word LLCOPY(L) Word L; { Word L_i,Lp,Lp_i,Ls; Step1: /* Copy. */ Lp = NIL; Ls = L; while (Ls != NIL) { ADV(Ls,&L_i,&Ls); Lp_i = LCOPY(L_i); Lp = COMP(Lp_i,Lp); } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/DIIPWRITE.c0000664002275300236100000000276114017255270014251 0ustar wcbrownscs/*=========================================================================== DIIPWRITE(r,A,V) Distributive integral polynomial write. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Z[x_1,...,x_r], distributive representation. A is written in the output stream. V : a variable list for A. ===========================================================================*/ #include "saclib.h" void DIIPWRITE(r,A,V) Word r,A,V; { Word Ap,E,Ep,Vp,a,e,s,v; char fc,z; Step1: /* r = 0 or A = 0. */ if (r == 0 || A == 0) { IWRITE(A); goto Return; } Step2: /* Initialize */ Ap = A; fc = 1; CWRITE('('); Step3: /* General case. */ do { ADV2(Ap,&a,&E,&Ap); /* write coefficient */ s = ISIGNF(a); if (fc == 1) { fc = 0; if (a != 1 && a != -1) { CWRITE(' '); IWRITE(a); } else if (a == -1) SWRITE(" -"); } else { CWRITE(' '); if (a != 1 && a != -1) { if (s > 0) CWRITE('+'); IWRITE(a); } else if (a == 1) CWRITE('+'); else CWRITE('-'); } /* write monomial */ Ep = CINV(E); Vp = V; z = 0; do { ADV(Ep,&e,&Ep); ADV(Vp,&v,&Vp); if (e > 0) { z = 1; CWRITE(' '); CLOUT(v); } if (e > 1) { CWRITE('^'); AWRITE(e); } } while (Ep != NIL); if (z == 0 && (a == 1 || a == -1)) CWRITE('1'); } while (Ap != NIL); SWRITE(" )"); Return: /* Prepare for return. */ return; } saclib2.2.8/src/MPPROD.c0000664002275300236100000000227714017255270013714 0ustar wcbrownscs/*====================================================================== C <- MPPROD(r,m,A,B) Modular polynomial product. Inputs A,B : in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. m : a BETA-digit. Outputs C : in Z/(m)[X1,...,Xr], C = A * B. ======================================================================*/ #include "saclib.h" Word MPPROD(r,m,A,B) Word r,m,A,B; { Word Ap,As,Bs,C,C1,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { C = MDPROD(m,A,B); goto Return; } Step3: /* General case. */ As = CINV(A); Bs = CINV(B); C = 0; rp = r - 1; do { ADV2(Bs,&b,&f,&Bs); Ap = As; C1 = NIL; do { ADV2(Ap,&a,&e,&Ap); if (rp == 0) c = MDPROD(m,a,b); else c = MPPROD(rp,m,a,b); if (c != 0) C1 = COMP2(e + f,c,C1); } while (Ap != NIL); if (C1 != NIL) C = MPSUM(r,m,C,C1); } while (Bs != NIL); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/FIRST.c0000664002275300236100000000056214017255270013575 0ustar wcbrownscs/*====================================================================== a <- FIRST(L) First. Inputs L : list of length 1 or more. Outputs a : the first element of L. ======================================================================*/ #include "sactypes.h" extern Word *SPACEB1; Word FIRST(L) Word L; { return(SPACEB1[L]); } saclib2.2.8/src/CHEBY.c0000664002275300236100000000137614017255270013544 0ustar wcbrownscs/*====================================================================== A <- CHEBY(n) Chebyshev polynomial. Input n : a non-negative beta-digit. Output A : The Chebyshev polynomial of degree n, a univariate integral polynomial. ======================================================================*/ #include "saclib.h" Word CHEBY(n) BDigit n; { Word A,A1,A2,A3,i; Step1: /* Initialize. */ A1 = LIST2(0,1); if (n == 0) { A = A1; goto Return; } A2 = LIST2(1,1); if (n == 1) { A = A2; goto Return; } i = 1; Step2: /* Apply recurrence relation. */ A3 = IPIP(1,2,PMPMV(A2,1)); A3 = IPDIF(1,A3,A1); A1 = A2; A2 = A3; i = i + 1; if (i < n) goto Step2; A = A2; Return: /* Return A. */ return(A); } saclib2.2.8/src/BDGCD.c0000664002275300236100000000223714017255270013512 0ustar wcbrownscs/*=========================================================================== c <- BDGCD(a,b) Binary digit greatest common divisor. Inputs a, b : BETA-digits, a >= b >= 0. Outputs c : a BETA-digit, c = gcd(a,b). Method The binary gcd algorithm is used. ===========================================================================*/ #include "saclib.h" Word BDGCD(a,b) Word a,b; { Word a1,a2,a3,c,e; Step1: /* b = 0. */ if (b == 0) { c = a; goto Return; } Step2: /* Compute highest power e of 2 dividing the gcd. */ a1 = a; a2 = b; e = 0; while (((a1 & 1) == 0) && ((a2 & 1) == 0)) { a1 >>= 1; a2 >>= 1; e++; } Step3: /* Compute gcd of a/2^e and b/2^e. */ while ((a1 & 1) == 0) a1 >>= 1; while ((a2 & 1) == 0) a2 >>= 1; if (a1 < a2) { a3 = a1; a1 = a2; a2 = a3; } while (a2 != 0) { a3 = a1 - a2; if (a3 == 0) goto Step4; while ((a3 & 1) == 0) a3 >>= 1; if (a3 < a2) { a1 = a2; a2 = a3; } else a1 = a3; } Step4: /* Multiply by 2^e. */ c = a1 << e; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/IPONE.c0000664002275300236100000000137014017255270013556 0ustar wcbrownscs/*====================================================================== t <- IPONE(r,A) Integral polynomial one. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs t : in Z,if A=1 then t=1, otherwise t=0. ======================================================================*/ #include "saclib.h" Word IPONE(r,A) Word r,A; { Word a,i,t; /* hide algorithm */ Step1: /* Dtermine. */ t = 0; if (A == 0) goto Return; a = A; for (i = 1; i <= r; i++) { if (PDEG(a) != 0) goto Return; a = PLDCF(a); } if (a == 1) t = 1; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/IFCL2.c0000664002275300236100000000174414017255270013510 0ustar wcbrownscs/*=========================================================================== IFCL2(a; m,n) Integer, floor and ceiling, logarithm, base 2. Inputs a : non-zero integer. Outputs m, n : BETA-digits, are the floor and ceiling of log2(abs(a)) respectively. ===========================================================================*/ #include "saclib.h" void IFCL2(a, m_,n_) Word a, *m_,*n_; { Word a1,ap,b,k,m,n,t; Step1: /* Process BETA-digits. */ t = 0; if (a < BETA) { a1 = a; m = 0; } else { ap = a; m = -ZETA; do { ADV(ap,&a1,&ap); m = m + ZETA; if (ap != NIL && a1 != 0) t = 1; } while (ap != NIL); } Step2: /* Process leading digit. */ if (a1 < 0) a1 = -a1; k = PDLOG2(a1) - 1; m = m + k; b = (01 << k); if (a1 != b) t = 1; Step3: /* Finish. */ n = m + t; Return: /* Prepare for return. */ *m_ = m; *n_ = n; return; } saclib2.2.8/src/AFUPRL.c0000664002275300236100000000141614017255270013676 0ustar wcbrownscs/*====================================================================== a <- AFUPRL(M,A) Algebraic number field univariate polynomial, root of a linear polynomial. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A : in Q(alpha)[x]. deg(A) = 1. Outputs a : in Q(alpha). a is the unique element of Q(alpha) such that A(a) = 0. ======================================================================*/ #include "saclib.h" Word AFUPRL(M,A) Word M,A; { Word L,a,c,d; /* hide c,d; */ Step1: if (PRED(A) == 0) a = 0; else { L = PCL(A); FIRST2(L,&c,&d); a = AFQ(M,AFNEG(d),c); } Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/ICOMP.c0000664002275300236100000000225614017255270013557 0ustar wcbrownscs/*=========================================================================== s <- ICOMP(A,B) Integer comparison. Inputs A, B : in Z. Outputs s = sign(A-B). ===========================================================================*/ #include "saclib.h" Word ICOMP(A,B) Word A,B; { Word Ap,Bp,a,b,d,s,u,v; Step1: /* A and B single-precision. */ if (A < BETA && B < BETA) { s = SIGN(A - B); goto Return; } Step2: /* A single-precision. */ if (A < BETA) { s = -ISIGNF(B); goto Return; } Step3: /* B single-precision. */ if (B < BETA) { s = ISIGNF(A); goto Return; } Step4: /* Compare corresponding digits. */ s = 0; Ap = A; Bp = B; do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); u = SIGN(a); v = SIGN(b); if (u * v == -1) { s = u; goto Return; } d = a - b; if (d != 0) s = SIGN(d); } while (Ap != NIL && Bp != NIL); Step5: /* Same length */ if (Ap == NIL && Bp == NIL) goto Return; Step6: /* Use sign of longer input. */ if (Ap == NIL) s = -ISIGNF(Bp); else s = ISIGNF(Ap); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/KARATSUBA.c0000664002275300236100000000457014017255270014226 0ustar wcbrownscs/*=========================================================================== KARATSUBA(A,n1,B,n2,C,W) Integer product - array representation. Karatsuba's and Maeder's method. Inputs n1,n2: positive beta-integers, n1 >= n2. A, B : non-negative integers of lengths n1 and n2 in array representation. C : an array of length >= n1 + n2 + 1. W : a work array of length >= 2(n1 - a + 3 floor(log_2(n1 - 3))), where a = 2^(k - 1) + 3 * k, with k = ceiling(log_2(MAXCLASSICAL - 3)). Effect : A * B is added to C. ===========================================================================*/ #include "saclib.h" void KARATSUBA(A,n1,B,n2,C,W) Word *A,n1,*B,n2,*C,*W; { Word h,l,l1,l2,m; Step1: /* Use classical algorithm if A,B are small. */ if (n1 <= MAXCLASSICAL) { PRODUCT(A,n1,B,n2,C); goto Return; } Step2: /* A at least twice as long as B. */ m = (n1 + 1) / 2; if (m >= n2) { KARATSUBA(A + 0, m, B, n2, C, W); if (n1 - m >= n2) KARATSUBA(A + m, n1 - m, B, n2, C + m, W); else KARATSUBA(B, n2, A + m, n1 - m, C + m, W); goto Return; } Step3: /* Sum high and low order part of each number. */ COPYTO(W + 0, A + 0, m); W[m] = 0; ADDTO(W + 0, A + m, n1 - m); if (W[m] == 0) l1 = m; else l1 = m + 1; COPYTO(W + (m+1), B + 0, m); W[m+1+m] = 0; ADDTO(W + (m+1), B + m, n2 - m); if (W[m+1+m] == 0) l2 = m; else l2 = m + 1; Step4: /* Multiply the sums. Put product into result. */ if ( l1 >= l2) KARATSUBA(W + 0, l1, W + (m+1), l2, C + m, W + 2*(m+1)); else KARATSUBA(W + (m+1), l2, W + 0, l1, C + m, W + 2*(m+1)); Step5: /* Multiply high order parts. */ h = (n1 - m) + (n2 - m) + 1; CLEAR(W + 0, h); KARATSUBA(A + m, n1 - m, B + m, n2 - m, W + 0, W + h); Step6: /* Put high order product into result. */ ADDTO(C + 2*m, W, (n1 - m) + (n2 - m)); SUBFROM(C + m, W, (n1 - m) + (n2 - m)); Step7: /* Multiply low order parts. */ l = m + m + 1; CLEAR(W + 0, l); KARATSUBA(A, m, B, m, W + 0, W + l); Step8: /* Put low order product into result. */ ADDTO(C + 0, W, m + m); SUBFROM(C + m, W, m + m); Return: /* Prepare for return. */ return; } saclib2.2.8/src/RPFIP.c0000664002275300236100000000205714017255270013567 0ustar wcbrownscs/*====================================================================== B <- RPFIP(r,A) Rational polynomial from integral polynomial. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Z[X1,...,Xr]. Outputs B : in Q[X1,...,Xr], B is A converted to rational polynomial representation. ======================================================================*/ #include "saclib.h" Word RPFIP(r,A) Word r,A; { Word As,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { B = RNINT(A); goto Return; } Step3: /* r > 0. */ As = A; rp = r - 1; B = NIL; do { ADV2(As,&e,&a,&As); if (rp == 0) b = RNINT(a); else b = RPFIP(rp,a); B = COMP2(b,e,B); } while (As != NIL); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/FPROD1.c0000664002275300236100000000327414017255270013644 0ustar wcbrownscs/*====================================================================== FPROD1(A,B,d,C) Floating-point product, precision 1. Inputs A, B : single-precision floating-point numbers. d : a sign (rounding direction). C : an array of size at least 4. Output C : a single-precision floating-point number approximating the product of A and B. If d = -1, C is the greatest single-precision floating-point number less than or equal to the product. If d = +1, C is the least single-precision floating-point number greater than or equal to the product. If d = 0, C is the nearest single-precision floating-point number to the product (if two are equally near, the one with even mantissa is chosen). ======================================================================*/ #include "saclib.h" void FPROD1(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit f,g,t; Step1: /* A or B zero. */ if (A[1] == 0 || B[1] == 0) { C[1] = 0; C[2] = 1; goto Return; } Step2: /* Compute exponent, sign and precision. */ C[0] = A[0] + B[0]; if (A[1] == B[1]) C[1] = 1; else C[1] = -1; C[2] = 1; Step3: /* Multiply. */ DPRNN(A[3],B[3], &f,&g); Step4: /* Normalize. */ if (f < BETA2) { t = g; g = g << 1 & BETA1; t = t >> (ZETA - 1); f = f << 1 | t; C[0] = C[0] - 1; } Step5: /* Round. */ if (d != 0) { if (d == C[1] && g != 0) f = f + 1; } else if (g >= BETA2) { if (g > BETA2) { f = f + 1; } else if (ODD(f)) { f = f + 1; } } if (f == BETA) { C[3] = BETA2; C[0] = C[0] + 1; } else C[3] = f; Return: /* Return. */ return; } saclib2.2.8/src/IUPNT.c0000664002275300236100000000140214017255270013577 0ustar wcbrownscs/*====================================================================== B <- IUPNT(A) Integral univariate polynomial negative transformation. Inputs A : in Z[X]. Outputs B : in Z[X], B(X)=A(-X). ======================================================================*/ #include "saclib.h" Word IUPNT(A) Word A; { Word Ap,B,a,e; /* hide Ap,e; */ Step1: /* Compute. */ if (A == 0) { B = 0; goto Return; } B = NIL; Ap = A; do { ADV2(Ap,&e,&a,&Ap); if (ODD(e) == 1) a = INEG(a); B = COMP2(a,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/VINEG.c0000664002275300236100000000117614017255270013560 0ustar wcbrownscs/*====================================================================== B <- VINEG(A) Vector of integers negation. Inputs A : a vector over Z. Outputs B : a vector over Z, B = -A. ======================================================================*/ #include "saclib.h" Word VINEG(A) Word A; { Word Ap,B,a,b; /* hide Ap,a; */ Step1: /* Compute. */ B = NIL; Ap = A; do { ADV(Ap,&a,&Ap); b = INEG(a); B = COMP(b,B); } while (Ap != NIL); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPPSR.c0000664002275300236100000000201214017255270013573 0ustar wcbrownscs/*=========================================================================== C <- IPPSR(r,A,B) Integral polynomial pseudo-remainder. Inputs r : a BETA-digit, r >= 0, the number of variables. A,B : in Z[x_1,...,x_r], B non-zero. Outputs C : in Z[x_1,...,x_r], the pseudo-remainder of A and B. ===========================================================================*/ #include "saclib.h" Word IPPSR(r,A,B) Word r,A,B; { Word B1,Bb,Bs,C,C1,c,i,l,m,n; Step1: /* deg(B) = 0. */ n = PDEG(B); if (n == 0) { C = 0; goto Return; } Step2: /* deg(B) > 0. */ m = PDEG(A); C = A; Bb = PRED(B); B1 = PMON(PLDCF(B),0); for (i = m; i >= n; i--) { if (C == 0) goto Return; l = PDEG(C); if (l == i) { c = PLDCF(C); C = PRED(C); C = IPPROD(r,C,B1); C1 = PMON(c,l - n); Bs = IPPROD(r,Bb,C1); C = IPDIF(r,C,Bs); } else C = IPPROD(r,C,B1); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPCRA.c0000664002275300236100000000320014017255270013534 0ustar wcbrownscs/*=========================================================================== As <- IPCRA(M,m,mp,r,A,a) Integral polynomial chinese remainder algorithm. Inputs M : in Z, M > 0. m : BETA-digit, m > 0, gcd(M,m)=1. mp : in Z/(m), the inverse of M modulo m. r : a BETA-digit,r >= 0, the number of variables. A : in Z'/(M)[x_1,...,x_r]. a : in Z/(m) [x_1,...,x_r]. Outputs As : in Z'/(Ms)[x_1,...,x_r], where Ms = M * m. As is the unique polynomial which is congruent to A modulo M and to a modulo m. ===========================================================================*/ #include "saclib.h" Word IPCRA(M,m,mp,r,A,a) Word M,m,mp,r,A,a; { Word A1,Ap,As,As1,E,Es,a1,ap,e,rp; Step1: /* r=0. */ if (r == 0) { As = MIDCRA(M,m,mp,A,a); goto Return; } Step2: /* General case. */ if (A == 0) Ap = NIL; else Ap = A; if (a == 0) ap = NIL; else ap = a; rp = r - 1; As = NIL; while (Ap != NIL || ap != NIL) { if (Ap == NIL) { A1 = 0; ADV2(ap,&Es,&a1,&ap); } else if (ap == NIL) { a1 = 0; ADV2(Ap,&Es,&A1,&Ap); } else { E = FIRST(Ap); e = FIRST(ap); if (E > e) { ADV2(Ap,&Es,&A1,&Ap); a1 = 0; } else if (E < e) { ADV2(ap,&Es,&a1,&ap); A1 = 0; } else { ADV2(Ap,&Es,&A1,&Ap); ADV2(ap,&Es,&a1,&ap); } } if (rp == 0) As1 = MIDCRA(M,m,mp,A1,a1); else As1 = IPCRA(M,m,mp,rp,A1,a1); As = COMP2(As1,Es,As); } if (As == NIL) As = 0; else As = INV(As); Return: /* Prepare for return. */ return(As); } saclib2.2.8/src/ISQRT.c0000664002275300236100000000227214017255270013610 0ustar wcbrownscs/*====================================================================== ISQRT(A; B,t) Integer square root. Inputs A : in Z. A >= 0. Outputs B : the floor function of the square root of A. t : the sign of A - B * B. ======================================================================*/ #include "saclib.h" void ISQRT(A, B_,t_) Word A, *B_,*t_; { Word B,C,D,R,a,b,h,k,s,t; /* hide a,b,h,k,s,t; */ Step1: /* A single-precision. */ if (A < BETA) { DSQRTF(A,&B,&t); goto Return; } Step2: /* Compute single-precision approximation. */ k = ILOG2(A); h = k - ZETA; h = h + ODD(h); a = IDP2(A,h); DSQRTF(a,&b,&t); b = b + 1; B = IMP2(b,h / 2); Step3: /* Iterate modified newton method. */ do { IQR(A,B,&C,&R); s = ICOMP(B,C); if (s <= 0) goto Step4; D = ISUM(B,C); B = IDQ(D,2); } while (1); Step4: /* Compute t. */ if (R == 0 && s == 0) t = 0; else t = 1; Return: /* Prepare for return. */ *B_ = B; *t_ = t; return; } saclib2.2.8/src/ITRUNC.c0000664002275300236100000000116614017255270013713 0ustar wcbrownscs/*=========================================================================== B <- ITRUNC(A,n) Integer truncation. Inputs A : in Z. n : a BETA-integer. Outputs B : integral part of A/2^n. ===========================================================================*/ #include "saclib.h" Word ITRUNC(A,n) Word A,n; { Word B; Step1: /* A=0 or n=0. */ B = A; if (A == 0 || n == 0) goto Return; Step2: /* n > 0. */ if (n > 0) { B = IDP2(A,n); goto Return; } Step3: /* n < 0. */ B = IMP2(A,- n); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/GICONJ.c0000664002275300236100000000112314017255270013651 0ustar wcbrownscs/*=========================================================================== B <- GICONJ(A) Gaussian integer conjugation. Input A : a Gaussian integer. Output B : The conjugate of A, a Gaussian integer. ===========================================================================*/ #include "saclib.h" Word GICONJ(A) Word A; { Word B; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ B = LIST2(FIRST(A),INEG(SECOND(A))); Return: /* Return B. */ return(B); } saclib2.2.8/src/MIPRAN.c0000664002275300236100000000273114017255270013674 0ustar wcbrownscs/*====================================================================== A <- MIPRAN(r,M,q,N) Modular integral polynomial, random. Inputs M : in Z, M > 0. q : in Q, q = q1/q2, with 0 < q1 <= q2 < BETA. N : a list (nr,...,n1) of non-negative BETA-digits. r : a BETA-digit, r >= 0, the number of variables. Outputs A : in Z/(M)[X1,...,Xr], a random polynomial with deg_i(A) <= ni for 1 <= i <= r. q is the probability that any particular term of A has a non-zero coefficient. ======================================================================*/ #include "saclib.h" Word MIPRAN(r,M,q,N) Word r,M,q,N; { Word A,Np,a,d,e,n,q1,q2,qs,rp,t; /* hide d,e,q1,q2,qs,rp,t; */ Step1: /* Compute qls=int(q*BETA). */ FIRST2(q,&q1,&q2); DQR(q1,0,q2,&qs,&t); Step2: /* r=0. */ if (r == 0) { d = DRANN(); if (d < qs) A = MIRAN(M); else A = 0; goto Return; } Step3: /* r > 0. */ rp = r - 1; ADV(N,&n,&Np); A = NIL; for (e = 0; e <= n; e++) { if (rp == 0) { d = DRANN(); if (d < qs) a = MIRAN(M); else a = 0; } else a = MIPRAN(rp,M,q,Np); if (a != 0) A = COMP2(e,a,A); } if (A == NIL) A = 0; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/LBRNIEEE.c0000664002275300236100000000255314017255270014075 0ustar wcbrownscs/*====================================================================== LBRNIEEE(A,d; F,u) Logarithmic binary rational number to IEEE conversion. Inputs A : a logarithmic binary rational number. d : rounding direction: d = -1 : round down. d = 0 : round to nearest. d = 1 : round up. Outputs F : a hardware float. If d = -1, F is the greatest hardware float that is <= A; If d = 1, F is the smallest hardware float that is >= A. If d = 0, F is the hardware float that is nearest to A, and is even if two are equally near. u : If u = 0, exponent overflow or underflow occurred and F is undefined. Otherwise u = 1. ======================================================================*/ #include "saclib.h" void LBRNIEEE(A,d,F_,u_) Word A; BDigit d; ieee *F_; BDigit *u_; { BDigit e,k,u; Word a; ieee F; Step1: /* A = 0. */ if (A == 0) { F.num = 0.0; u = 1; goto Return; } Step2: /* Extract mantissa, exponent. */ FIRST2(A,&a,&k); Step3: /* Convert mantissa, increment exponent. */ IIEEE(a,d, &F,&u); if (u == 0) goto Return; else { e = F.rep.exp; e = e - k; if (e <= 0) { u = 0; goto Return; } F.rep.exp = e; u = 1; } Return: /* Return F and u. */ *F_ = F; *u_ = u; return; } saclib2.2.8/src/BITRAN.c0000664002275300236100000000102314017255270013656 0ustar wcbrownscs/*====================================================================== b <- BITRAN() Bit, random. Outputs b : a random bit, 0 or 1. ======================================================================*/ #include "saclib.h" Word BITRAN() { Word a,b; /* hide algorithm */ Step1: /* Compute a random bit. */ a = DRANN(); a = a + a; if (a >= BETA) b = 1; else b = 0; goto Return; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/LETTER.c0000664002275300236100000000106214017255270013701 0ustar wcbrownscs/*====================================================================== t <- LETTER(C) Letter. Inputs C : a character. Outputs t : If C is a letter then t=1 and otherwise t=0. ======================================================================*/ #include "saclib.h" Word LETTER(C) Word C; { Word t; /* hide algorithm */ Step1: /* Decide. */ if ((C >= 'A' && C <= 'Z') || (C >= 'a' && C <= 'z')) t = 1; else t = 0; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/PTMV.c0000664002275300236100000000252314017255270013473 0ustar wcbrownscs/*====================================================================== B <- PTMV(r,A) Polynomial transpose main variables. Inputs r : a beta integer, r >= 2. A : an element of R[x_1,...,x_r] for some ring R. Outputs B : an element of R[x_1,...,x_r]. B(x_1,...,x_r) = A(x_1,...,x{r-2},x_r,x_{r-1}). ======================================================================*/ #include "saclib.h" Word PTMV(r,A) Word r,A; { BDigit j,k,m; Word a,A1,Ap,App,B,B1; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Find the degree of A in x_{r-1} and invert A. */ m = PDEGSV(r,A,r-1); Ap = CINV(A); Step3: /* For k = m, m-1,...,0, extract from A' the terms of degree k in x_{r-1}. */ B = NIL; for (k = m; k >= 0; k--) { B1 = NIL; App = Ap; while (App != NIL) { A1 = FIRST(App); if (A1 != NIL && FIRST(A1) == k) { a = SECOND(A1); j = SECOND(App); B1 = COMP2(j,a,B1); A1 = RED2(A1); SFIRST(App,A1); } App = RED2(App); } if (B1 != NIL) B = COMP2(B1,k,B); } B = INV(B); Return: /* Return B. */ return(B); } saclib2.2.8/src/MAPTPR.c0000664002275300236100000000270114017255270013706 0ustar wcbrownscs/*=========================================================================== MAPTPR(m,n,A,B,C) Modular array polynomial truncated product. Inputs m : a BETA-digit. n : in Z, n >= 0. A,B : in Z/(m)[x]. A and B are in array representation. C : an array large enough to hold a polynomial of degree n-1. Side effects. C(x) = A(x)*B(x) (modulo x^n) is computed and put in C. C(x) = 0 or deg(C(x)) < n. ===========================================================================*/ #include "saclib.h" void MAPTPR(m,n,A,B,C) Word m,n,*A,*B,*C; { Word *Ct,*Cs,*Cp,*T,ap,bp,i,j,k,d,c,np; Step1: /* n = 0 or A = 0 or B = 0. */ if (n == 0 || MAPZERO(A) || MAPZERO(B)) { MAPDEG(C) = 0; MAPCF(C,0) = 0; goto Return; } Step2: /* General case. */ ap = MAPDEG(A); bp = MAPDEG(B); Cp = MAPGET(n-1); Cs = MAPGET(n-1); Ct = MAPGET(n-1); MAPDEG(Cs) = 0; for (i = 0; i < n; i++) MAPCF(Cs,i) = 0; np = MIN(n,bp+1); for (i = 0; i < np; i++) { for (j = 0; j < i; j++) MAPCF(Cp,j) = 0; d = 0; for (j = 0; j < n-i && j <= ap; j++) { k = i+j; c = MDPROD(m,MAPCF(A,j),MAPCF(B,i)); MAPCF(Cp,k) = c; if (c != 0) d = k; } MAPDEG(Cp) = d; MAPSUM(m,Cs,Cp,Ct); T = Cs; Cs = Ct; Ct = T; } MAPFREE(Ct); MAPFREE(Cp); MAPASSIGN(Cs,C); MAPFREE(Cs); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPIP.c0000664002275300236100000000165514017255270013453 0ustar wcbrownscs/*========================================================================== C <- IPIP(r,a,B) Integral polynomial integer product. Inputs r : a BETA-digit, r >= 0, the number of variables. a : in Z; B : in Z[x_1,...,x_r]. Outputs C : in Z[x_1,...,x_r], C = a * B. ==========================================================================*/ #include "saclib.h" Word IPIP(r,a,B) Word r,a,B; { Word C,Bp,rp,e,b,c; Step1: /* C = 0. */ if (a == 0 || B == 0) { C = 0; goto Return; } Step2: /* r = 0 */ if (r == 0) { C = IPROD(a,B); goto Return; } Step3: /* General case. */ Bp = B; C = NIL; rp = r - 1; do { ADV2(Bp,&e,&b,&Bp); if (rp == 0) c = IPROD(a,b); else c = IPIP(rp,a,b); C = COMP2(c,e,C); } while (Bp != NIL); C = INV(C); Return: /* Return C. */ return(C); } saclib2.2.8/src/PRODUCT.c0000664002275300236100000000234614017255270014030 0ustar wcbrownscs/*=========================================================================== PRODUCT(A,n1,B,n2,C) Integer product - array representation. Classical method. Inputs n1,n2: positive BETA-digits. A, B : non-negative integers of lengths n1 and n2 in array representation. C : an array of length >= n1 + n2 containing non-negative BETA-digits. Effect : A * B is added to C. ===========================================================================*/ #include "saclib.h" void PRODUCT(A,n1,B,n2,C) Word *A,n1,*B,n2,*C; { Word b,c,c0,c1,cp,i,j,k; Step1: /* Add rows of digit products. */ for (j = 0; j < n2; j++) { b = B[j]; k = j; cp = 0; for (i = 0; i < n1; i++) { DPR(A[i],b,&c1,&c0); c = C[k] + c0 + cp; cp = c >> ZETA; C[k] = c & BETA1; cp = cp + c1; k++; } while (cp != 0) { c = C[k] + cp; if (c >= BETA) { c = c - BETA; cp = 1; } else cp =0; C[k] = c; k++; } } Return: /* Prepare for return. */ return; } saclib2.2.8/src/COMP.c0000664002275300236100000000120014017255270013432 0ustar wcbrownscs/*====================================================================== M <- COMP(a,L) Composition. Inputs a : object. L : list. Outputs M : the composition of a and L. ======================================================================*/ #include "saclib.h" Word COMP(a,L) Word a,L; { Word M; /* hide algorithm */ Step1: /* Is AVAIL empty? */ if (AVAIL == NIL) GC(); Step2: /* Get new cell. */ M = AVAIL; AVAIL = RED(M); Step3: /* Store a and L. */ SFIRST(M,a); SRED(M,L); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/MAPFMD.c0000664002275300236100000000131314017255270013645 0ustar wcbrownscs/*========================================================================== A <- MAPFMD(a,n) Modular array polynomial from modular digit. Inputs a : an element of Z/(m), for some positive BETA-digit m. n : a non-negative BETA-digit. Outputs A : an array large enough to hold a polynomial of degree n. A represents a as an element of Z/(m)[x]. ==========================================================================*/ #include "saclib.h" Word *MAPFMD(a,n) Word a,n; { Word *A; Step1: /* Get array for A. */ A = MAPGET(n); Step2: /* Initialize A. */ MAPDEG(A) = 0; MAPLDCF(A) = a; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/AADV.c0000664002275300236100000000125114017255270013415 0ustar wcbrownscs/*====================================================================== AADV(L; a,Lp) Arithmetic advance. Inputs L : list. Outputs a : if L = () then a = 0, otherwise a = FIRST(L). Lp : if L = () then Lp = (), otherwise Lp = RED(L). ======================================================================*/ #include "saclib.h" void AADV(L, a_,Lp_) Word L, *a_,*Lp_; { Word Lp,a; /* hide algorithm */ Step1: /* Advance. */ if (L != NIL) ADV(L,&a,&Lp); else { a = 0; Lp = NIL; } Return: /* Prepare for return. */ *a_ = a; *Lp_ = Lp; return; } saclib2.2.8/src/LEXNEX.c0000664002275300236100000000215214017255270013706 0ustar wcbrownscs/*====================================================================== B <- LEXNEX(A) Lexicographically next. Inputs A : a non-null list (a1,...,am) such that ai is a non-null reductum of a_{i+1} for each 1 <= i < m. Outputs B : the lexicographically next such list of the same length, if one exists, and is () otherwise. ======================================================================*/ #include "saclib.h" Word LEXNEX(A) Word A; { Word B,a,b,c,i,j; /* hide a,b,c,i,j; */ Step1: /* Step first element. */ ADV(A,&b,&B); c = RED(b); if (c != NIL) { B = COMP(c,B); goto Return; } i = 1; Step2: /* Find an element to step. */ while (B != NIL) { ADV(B,&a,&B); i = i + 1; c = RED(a); if (c != b) goto Step3; b = a; } goto Return; Step3: /* Found one. */ for (j = 1; j <= i; j++) { B = COMP(c,B); c = RED(c); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/RMDUP.c0000664002275300236100000000125614017255270013576 0ustar wcbrownscs/*=========================================================================== Lp <- RMDUP(L) Remove duplicate elements from a list. Input L : a list. Output Lp : the list obtained by removing duplicate elements from L. The relative positions of the elements in L are preserved in Lp. ===========================================================================*/ #include "saclib.h" Word RMDUP(L) Word L; { Word L1,Lp,Ls; Step1: /* Remove. */ Lp = NIL; Ls = L; while (Ls != NIL) { ADV(Ls,&L1,&Ls); if (!MEMBER(L1,Lp)) Lp = COMP(L1,Lp); } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/IUPVOI.c0000664002275300236100000000214314017255270013716 0ustar wcbrownscs/*====================================================================== v <- IUPVOI(A,I) Integral univariate polynomial, variations for open interval. Inputs A : in Z[X], non-zero. I : an open interval (a,b) with a and b binary rational numbers such that a < b. Let T(z) be the transformation mapping the right half-plane onto the circle having I as diameter. Let B(x) = A(T(x)). Outputs v : the number of sign variations in the coefficients of B. ======================================================================*/ #include "saclib.h" Word IUPVOI(A,I) Word A,I; { Word B,C,D,a,b,d,k,m,n,v; /* hide a,b,k,v; */ Step1: /* Compute m,n, and k such that a = m * 2^k,b = n * 2^k. */ FIRST2(I,&a,&b); RNBCR(a,b,&m,&n,&k); Step2: /* Transform and count variations. */ if (k != 0) B = IUPBHT(A,k); else B = A; if (m != 0) C = IUPTR(B,m); else C = B; d = IDIF(n,m); D = IUPIHT(C,d); v = IPVCHT(D); Return: /* Prepare for return. */ return(v); } saclib2.2.8/src/IPCSFB.c0000664002275300236100000000177514017255270013663 0ustar wcbrownscs/*====================================================================== B <- IPCSFB(r,A) Integral polynomial coarsest squarefree basis. Inputs r : a BETA-digit, r > 0. A : a list of positive primitive polynomials in Z[X1,...,Xr] each of which is of positive degree in its main variable. A may be the empty list. Outputs B : a list of polynomials in Z[X1,...,Xr], a coarsest squarefree basis for A. ======================================================================*/ #include "saclib.h" Word IPCSFB(r,A) Word r,A; { Word A1,Ap,Ap1,As,B,L,L1; /* hide A1,Ap; */ Step1: /* Compute. */ As = NIL; Ap = A; while (Ap != NIL) { ADV(Ap,&A1,&Ap); L = IPSF(r,A1); do { ADV(L,&L1,&L); Ap1 = SECOND(L1); As = COMP(Ap1,As); } while (L != NIL); } B = ISPSFB(r,As); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/HIPCHT.c0000664002275300236100000000162214017255270013663 0ustar wcbrownscs/*====================================================================== B <- HIPCHT(n,A) Hardware interval polynomial circle to half-plane transformation. Inputs n : a BETA-digit, n >= 1. A : in HI[X], deg(A) = n. Output B : in HI[X]. Let A'(x) = x^n A(1/x). Then B(x) = A'(x + 1). ======================================================================*/ #include "saclib.h" interval *HIPCHT(n,A) BDigit n; interval A[]; { interval a,*B; BDigit i,j; Step1: /* Put reciprocal transform of A into B. */ B = HIPRT(n,A); Step2: /* Translate by 1. */ for (i = 0; i < n; i++) { a = A[0]; rounddown(); for (j = n-1; j >= i; j--) { a.left = a.left + B[j].left; B[j].left = a.left; } roundup(); for (j = n-1; j >= i; j--) { a.right= a.right + B[j].right; B[j].right = a.right; } } Return: /* Return B. */ return(B); } saclib2.2.8/src/RIRNP.c0000664002275300236100000000132014017255270013571 0ustar wcbrownscs/*====================================================================== J <- RIRNP(I,c) Rational interval rational number product. Inputs I : an interval with rational endpoints. c : a rational number. Outputs J : an interval with rational endpoints, J = c I. ======================================================================*/ #include "saclib.h" Word RIRNP(I,c) Word I,c; { Word J,a,ap,b,bp; /* hide a,b; */ Step1: /* Compute. */ FIRST2(I,&a,&b); ap = RNPROD(a,c); bp = RNPROD(b,c); if (RNSIGN(c) >= 0) J = LIST2(ap,bp); else J = LIST2(bp,ap); Return: /* Prepare for return. */ return(J); } saclib2.2.8/src/LDSSBR.c0000664002275300236100000000427014017255270013677 0ustar wcbrownscs/*====================================================================== LDSSBR(A,b; xs,N) Linear diophantine system solution, based on Rosser ideas. Inputs A : an m by n matrix over Z. A is represented as a list of columns. b : an m-vector over Z. Outputs xs : an n-vector over Z (a particular solution to Ax = b) if the system is consistent, the empty list otherwise. N : a list of n-vectors over Z (basis vectors of the solution module of Ax = 0) if the system is consistent, the empty list otherwise. Remarks: A and b are modified. ======================================================================*/ #include "saclib.h" void LDSSBR(A,b, xs_,N_) Word A,b, *xs_,*N_; { Word B,C,C1,C2,Cp,N,b1,m,n,s,xs; /* hide C2,Cp,N,b1,m,n,s,xs; */ Step1: /* Initialize. */ n = LENGTH(A); m = LENGTH(b); Step2: /* Adjoin identity matrix to A and zero vector to -b. */ C = MIAIM(A); B = VIAZ(VINEG(b),n); Step3: /* Sort columns of c. */ C = MINNCT(C); C = MICS(C); Step4: /* Pivot row zero. */ C1 = FIRST(C); if (FIRST(C1) == 0) goto Step6; Step5: /* Eliminate pivot row. */ do { B = VIERED(B,C1,1); C = RED(C); if (C == NIL) s = 0; else { C2 = FIRST(C); s = FIRST(C2); if (s != 0) { C1 = VIERED(C1,C2,1); C = MICINS(C,C1); C1 = C2; } } } while (s != 0); n = n - 1; Step6: /* System inconsistent. */ ADV(B,&b1,&B); if (b1 != 0) { xs = NIL; N = NIL; goto Return; } Step7: /* Remove pivot row. */ Cp = C; while (Cp != NIL) { C1 = FIRST(Cp); C1 = RED(C1); SFIRST(Cp,C1); Cp = RED(Cp); } m = m - 1; Step8: /* Finished. */ if (m > 0) { if (n > 0) goto Step3; else goto Step6; } xs = B; N = C; Return: /* Prepare for return. */ *xs_ = xs; *N_ = N; return; } saclib2.2.8/src/SIPES.c0000664002275300236100000000552414017255270013574 0ustar wcbrownscs/*====================================================================== s <- SIPES(A,a) Software interval polynomial evaluation of sign. Inputs A : a software interval polynomial. a : a software floating-point number. Output s : the sign of A(a), if this can be determined with floating point arithmetic of precision max(p,q), where p is the precision of A and q is the precision of a. Otherwise s = NIL. Synopsis Step 4 computes a lower bound for A(a). If the lower bound is positive then s = 1. Otherwise Step 6 then computes an upper bound for A(a). If the two bounds have the same sign, then that sign is s. Otherwise s = NIL. In each step, if a < 0 then A(a) is evaluated as B(-a) where B(x) = A(-x). ======================================================================*/ #include "saclib.h" Word SIPES(A,a) Word *A,*a; { BDigit c1,c2,i,n,p,q,r,t,u,v; BDigit *d,*e; Word s; Step1: /* Get sizes. */ n = A[0]; p = A[3]; q = a[2]; r = MAX(p,q); c1 = p + 3; c2 = c1 + c1; t = n * c2 + 1; Step2: /* a = 0? */ if (a[1] == 0) { s = A[2]; if (s != A[c1 + 2]) s = NIL; goto Return; } Step3: /* Get two arrays. */ d = GETARRAY(r + 3); e = GETARRAY(r + 3); Step4: /* Compute a lower bound. */ if (a[1] > 0) { u = t; FCOPY(A + u,d); for (i = 1; i <= n; i++) { FPROD(d,a,-1,e); u = u - c2; FSUM(A + u,e,-1,d); } } else { a[1] = 1; u = t; if (EVEN(n)) { FCOPY(A + u,d); v = 1; } else { FCOPY(A + u + c1,d); d[1] = - d[1]; v = -1; } for (i = 1; i <= n; i++) { FPROD(d,a,-1,e); u = u - c2; v = - v; if (v == 1) FSUM(A + u,e,-1,d); else { A[u + c1 + 1] = - A[u + c1 + 1]; FSUM(A + u + c1,e,-1,d); A[u + c1 + 1] = - A[u + c1 + 1]; } } a[1] = -1; } Step5: /* Is the lower bound positive? */ s = d[1]; if (s == 1) { FREEARRAY(d); FREEARRAY(e); goto Return; } Step6: /* Compute an upper bound. */ if (a[1] >= 0) { u = t + c1; FCOPY(A + u,d); for (i = 1; i <= n; i++) { FPROD(d,a,+1,e); u = u - c2; FSUM(A + u,e,+1,d); } } else { a[1] = 1; u = t; if (EVEN(n)) { FCOPY(A + u + c1,d); v = 1; } else { FCOPY(A + u,d); d[1] = - d[1]; v = -1; } for (i = 1; i <= n; i++) { FPROD(d,a,+1,e); u = u - c2; v = - v; if (v == 1) FSUM(A + u + c1,e,+1,d); else { A[u + 1] = - A[u + 1]; FSUM(A + u,e,+1,d); A[u + 1] = - A[u + 1]; } } a[1] = -1; } Step7: /* Do the two bounds agree? */ if (s != d[1]) s = NIL; FREEARRAY(d); FREEARRAY(e); Return: /* Return s. */ return(s); } saclib2.2.8/src/RNNUM.c0000664002275300236100000000103114017255270013575 0ustar wcbrownscs/*====================================================================== a <- RNNUM(R) Rational number numerator. Inputs R : a rational number. Outputs a : the numerator of R, an integer. ======================================================================*/ #include "saclib.h" Word RNNUM(R) Word R; { Word a; /* hide algorithm */ Step1: /* Compute. */ if (R == 0) a = 0; else a = FIRST(R); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/ISZERO.c0000664002275300236100000000060214017255270013714 0ustar wcbrownscs/*====================================================================== t <- ISZERO(a) Test for zero. Inputs a : an object. Outputs t : a BETA-digit. t = 1 if a is the atom 0, t = 0 otherwise. ======================================================================*/ #include "sactypes.h" Word ISZERO(a) Word a; { return(a == 0); } saclib2.2.8/src/VIDIF.c0000664002275300236100000000073114017255270013545 0ustar wcbrownscs/*====================================================================== C <- VIDIF(A,B) Vector of integers difference. Inputs A,B : n-vectors over Z. Outputs C : an n-vector over Z, C = A-B. ======================================================================*/ #include "saclib.h" Word VIDIF(A,B) Word A,B; { Word C; Step1: /* Compute. */ C = VISUM(A,VINEG(B)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/QREM.c0000664002275300236100000000136314017255270013452 0ustar wcbrownscs/*=========================================================================== QREM(a,b; q,r) Quotient and remainder. Inputs a, b : C integers, b non-zero. Outputs q : integral part of a / b. r : a - b * q. ===========================================================================*/ #include "saclib.h" void QREM(a,b, q_,r_) Word a,b, *q_,*r_; { Word q,r; Step1: /* Compute q. */ if (a == 0) q = 0; else if (a > 0) { if (b > 0) q = a / b; else q = -(a / -b); } else { if (b > 0) q = -(-a / b); else q = -a / -b; } Step2: /* Compute r. */ r = a - q * b; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/src/IBCOEFS.c0000664002275300236100000000144714017255270013763 0ustar wcbrownscs/*=========================================================================== L <- IBCOEFFS(n) Integer binomial coefficients. Input n : a BETA-digit, n >= 0. Output L : a list (b_0,...,b_n) of the binomial coefficients b_i = (n choose i). ===========================================================================*/ #include "saclib.h" Word IBCOEFS(n) Word n; { Word A,i,Lp,L,np; Step1: /* n = 0. */ if (n == 0) { L = LIST1(1); goto Return; } Step2: /* General case. */ np = (n-1)/2; A = 1; L = LIST1(A); for (i = 0; i < np; i++) { A = IBCIND(A,n,i); L = COMP(A,L); } Lp = CINV(L); if (EVEN(n)) { A = IBCIND(A,n,np); L = COMP(A,L); } L = CONC(Lp,L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IPRIMW.c0000664002275300236100000000262614017255270013720 0ustar wcbrownscs/*====================================================================== L <- IPRIMW(A) Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. Inputs A : in Z[X], non-zero, squarefree. Outputs L : a list (I1,...,Ir) of standard open or one-point binary rational isolating intervals for all of the real roots of A. Let (aj,bj) denote the endpoints of Ij; then a1 <= b1 <= ... <= ar <= br. ======================================================================*/ #include "saclib.h" Word IPRIMW(A) Word A; { Word Ab,As,I,L,Ls,b,bs,h,k,n; /* hide h,k,n; */ Step1: /* Degree zero. */ n = PDEG(A); L = NIL; if (n == 0) goto Return; Step2: /* Compute positive roots. */ Ab = PDBORD(A); b = IUPRB(Ab); RNFCL2(b,&h,&k); As = IUPBHT(Ab,k); Ls = IPRIMU(As); while (Ls != NIL) { ADV(Ls,&I,&Ls); I = RIRNP(I,b); L = COMP(I,L); } L = INV(L); Step3: /* Zero root. */ if (FIRST(Ab) < n) L = COMP(LIST2(0,0),L); Step4: /* Compute negative roots. */ As = IUPNT(As); Ls = IPRIMU(As); bs = RNNEG(b); while (Ls != NIL) { ADV(Ls,&I,&Ls); I = RIRNP(I,bs); L = COMP(I,L); } Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/FRLSM.c0000664002275300236100000000212014017255270013561 0ustar wcbrownscs/*====================================================================== L <- FRLSM(m,a) Fermat residue list, single modulus. Inputs m : positive BETA-digit. a : an element of Z(m). Outputs L : a list of the distinct elements b in Z(m) such that b^2-a is a square in Z(m). ======================================================================*/ #include "saclib.h" Word FRLSM(m,a) Word m,a; { Word L,S,Sp,i,ip,j,mp,s,sp; /* hide Sp,i,ip,j,mp,s,sp; */ Step1: /* Compute list of squares of z(m). */ mp = m / 2; S = NIL; for (i = 0; i <= mp; i++) { s = MDPROD(m,i,i); S = COMP(s,S); } Step2: /* Compute L. */ L = NIL; Sp = S; for (i = mp; i >= 0 ; i--) { ADV(Sp,&s,&Sp); sp = MDDIF(m,s,a); j = LSRCH(sp,S); if (j != 0) { L = COMP(i,L); ip = MDNEG(m,i); if (ip != i) L = COMP(ip,L); } } Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/VILCOM.c0000664002275300236100000000110114017255270013665 0ustar wcbrownscs/*====================================================================== C <- VILCOM(a,b,A,B) Vector of integers linear combination. Inputs a,b : in Z. A,B : n-vectors over Z. Outputs C : an n-vector over Z, C = aA+bB. ======================================================================*/ #include "saclib.h" Word VILCOM(a,b,A,B) Word a,b,A,B; { Word C,S,T; /* hide C; */ Step1: /* Compute. */ S = VISPR(a,A); T = VISPR(b,B); C = VISUM(S,T); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/ADV3.c0000664002275300236100000000133414017255270013401 0ustar wcbrownscs/*====================================================================== ADV3(L; a1,a2,a3,Lp) Advance 3. Inputs L : a list of length 3 or more. Outputs a1 : the first element of L. a2 : the second element of L. a3 : the third element of L. Lp : the third reductum of L. ======================================================================*/ #include "saclib.h" void ADV3(L, a1_,a2_,a3_,Lp_) Word L, *a1_,*a2_,*a3_,*Lp_; { Word Lp,a1,a2,a3; /* hide algorithm */ Step1: /* Advance three times. */ ADV2(L,&a1,&a2,&Lp); ADV(Lp,&a3,&Lp); Return: /* Prepare for return. */ *a1_ = a1; *a2_ = a2; *a3_ = a3; *Lp_ = Lp; return; } saclib2.2.8/src/RPME.c0000664002275300236100000000137014017255270013447 0ustar wcbrownscs/*=========================================================================== B <- RPME(r,A,b) Rational polynomial multiple evaluation. Inputs r : a positive BETA-digit. A : in Q[x_1,...,x_r]. b : a list (b_1...,b_k) of elements of Q, with 1 <= k <= r. Output B : in Q[x_{k+1},...,x_r] such that B = A(b_1,...,b_k,x_{k+1},...,x_r). ===========================================================================*/ #include "saclib.h" Word RPME(r,A,b) Word r,A,b; { Word B,b1,bp,i; Step1: /* Evaluate. */ i = r; bp = b; B = A; do { ADV(bp,&b1,&bp); B = RPEV(i,B,1,b1); i--; } while (bp != NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPFAC.c0000664002275300236100000000457614017255270013541 0ustar wcbrownscs/*====================================================================== IPFAC(r,A; s,c,L) Integral polynomial factorization. Inputs r : a BETA-digit, r >= 1. A : in Z[X1,...,Xr], A non-zero. Outputs s : a BETA-digit, s = sign(A). c : in Z, the integer content of A. L : a list ((e1,A1),...,(ek,Ak)), k >= 0, with ei in Z, ei > 0, Ai in Z[X1,...,Xr], the distinct positive irreducible integral factors of A, and A = s * c * A1^e1 * ... * Ak^ek. ======================================================================*/ #include "saclib.h" void IPFAC(r,A, s_,c_,L_) Word r,A, *s_,*c_,*L_; { Word A1,Ab,Ap1,L,L1,Lb,Ls,P,c,cs,e1,rp,s,ss,n; Word k,B,t,d,M,N,F,f,B1; Step1: /* r = 1. */ if (r == 1) { IUPFAC(A,&s,&c,&L); goto Return; } Step2: /* Get monomial factors. */ IPMONFACT(r,A,&M,&Ab); Step3: /* Compute sign, content and primitive part. */ IPSCPP(r,Ab,&s,&cs,&Ab); Step4: /* Factor content. */ rp = r - 1; IPFAC(rp,cs,&ss,&c,&Ls); Step5: /* Degree 0. */ n = PDEG(Ab); if (n == 0) { L = NIL; goto Step11; } Step6: /* Degree 1. */ if (n == 1) { L = LIST1(LIST2(1,Ab)); goto Step11; } Step7: /* Degree 2. */ if (n == 2) { L = IPPFAC2(r,Ab); goto Step11; } Step8: /* Look for variable of degree 1 or 2. */ IPVDEG12(r,Ab,&k,&B); if (k > 0) { IPFAC(r,B,&t,&d,&N); L = NIL; while (N != NIL) { ADV(N,&F,&N); FIRST2(F,&f,&B1); B1 = PCPV(r,B1,k,r); B1 = IPABS(r,B1); L = COMP(LIST2(f,B1),L); } goto Step11; } Step9: /* Compute squarefree factorization of primitive part. */ if (PDEG(Ab) == 0) Lb = NIL; else Lb = IPSF(r,Ab); Step10: /* Factor squarefree factors and combine. */ Lb = INV(Lb); L = NIL; while (Lb != NIL) { ADV(Lb,&P,&Lb); FIRST2(P,&e1,&A1); L1 = ISFPF(r,A1); do { ADV(L1,&A1,&L1); L = COMP(LIST2(e1,A1),L); } while (L1 != NIL); } Step11: /* Adjoin monomial factors and factors of content. */ L = CONC(L,M); Ls = INV(Ls); while (Ls != NIL) { ADV(Ls,&P,&Ls); FIRST2(P,&e1,&Ap1); A1 = PMON(Ap1,0); L = COMP(LIST2(e1,A1),L); } Return: /* Prepare for return. */ *s_ = s; *c_ = c; *L_ = L; return; } saclib2.2.8/src/HIPVCHT.c0000664002275300236100000000245014017255270014011 0ustar wcbrownscs/*====================================================================== HIPVCHT(n,A; v,t) Hardware interval polynomial, variations after circle to half-plane transformation. Inputs n : a BETA-digit, n >= 1. A : in HI[X], deg(A) = n. Outputs v : A beta-digit. Let B(x) = x^n A(1/x), C(x) = B(x + 1). If t = 0, v is an indication of the number of sign variations in C(x) as follows. If v = 0 or 1, v is the number of variations. If v = 2, the number of variations is at least 2. If t /= 0 then v is undefined. t : 0,1 or 2. If t = 1, the program failed due to exponent limitation. If t = 2, the program failed due to mantissa limitation. ======================================================================*/ #include "saclib.h" void HIPVCHT(n,A, v_,t_) BDigit n; interval *A; BDigit *v_,*t_; { interval *B,*C; BDigit t,v; Step1: /* Compute B(x). */ FPCATCH(); B = HIPRT(n,A); Step2: /* Compute C(x). */ FPCATCH(); C = HIPTR1(n,B); FREEARRAY(B); if (FPCHECK() == 1) { FPCATCH(); FREEARRAY(C); v = 0; t = 1; goto Return; } Step3: /* Count variations. */ v = HIPSV(n,C); FREEARRAY(C); if (v < 0) t = 2; else t = 0; Return: /* Return v and t. */ *v_ = v; *t_ = t; return; } saclib2.2.8/src/IPGSUB.c0000664002275300236100000000156114017255270013677 0ustar wcbrownscs/*=========================================================================== C <- IPGSUB(r,A,s,L) Integral polynomial general substitution. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Z[x_1,...,x_r]. s : a BETA-digit, s >= 1. L : a list (B_1,...,B_r), with B_i in Z[y_1,...,y_s]. Outputs C : in Z[y_1,...,y_s], C(y_1,...,y_s) = A(B_1(y_1,...,y_s),...,B_r(y_1,...,y_s)). ===========================================================================*/ #include "saclib.h" Word IPGSUB(r,A,s,L) Word r,A,s,L; { Word B,C,Lp,t; Step1: /* A = 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* A /= 0. */ C = PINV(r,A,s); Lp = L; t = r + s; do { ADV(Lp,&B,&Lp); C = IPSUB(t,C,s+1,B); t = t - 1; } while (Lp != NIL); Return: /* Return. */ return(C); } saclib2.2.8/src/USINT.c0000664002275300236100000000122314017255270013603 0ustar wcbrownscs/*=========================================================================== C <- USINT(A,B) Unordered set intersection. Inputs A,B : unordered lists of objects. (A, B represent sets of objects.) Outputs C : an unordered list representing the intersection of the sets A and B. ===========================================================================*/ #include "saclib.h" Word USINT(A,B) Word A,B; { Word Ap,C,a; Step1: /* Compute. */ Ap = A; C = NIL; while (Ap != NIL) { ADV(Ap,&a,&Ap); if (MEMBER(a,B) == 1) C = COMP(a,C); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/PUNT.c0000664002275300236100000000166314017255270013477 0ustar wcbrownscs/*====================================================================== b <- PUNT(r,A) Polynomial univariate test. Inputs A : in R[X1,...,Xr], R ring. r : a BETA-digit, r >= 1. Outputs b : integer, b = 2 if A has degree zero in all variables. b = 1 if A has degree zero in X2,...,Xr, but positive degree in X1. Otherwise b = 0. ======================================================================*/ #include "saclib.h" Word PUNT(r,A) Word r,A; { Word Ap,b,i; /* hide b,i; */ Step1: /* A = 0. */ b = 2; if (A == 0) goto Return; Step2: /* A /= 0. */ Ap = A; for (i = 1; i <= r - 1; i++) { if (PDEG(Ap) != 0) { b = 0; goto Return; } else Ap = PLDCF(Ap); } if (PDEG(Ap) > 0) b = 1; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/LBRNNEG.c0000664002275300236100000000106214017255270013771 0ustar wcbrownscs/*===================================================================== S <- LBRNNEG(R) Logarithmic binary rational number negative. Input R : a logarithmic binary rational number. Output S : -R, a logarithmic binary rational number. =====================================================================*/ #include "saclib.h" Word LBRNNEG(R) Word R; { Word a,e,S; Step1: /* Do it. */ if (R == 0) S = 0; else { FIRST2(R,&a,&e); S = LIST2(INEG(a),e); } Return: /* Return S. */ return(S); } saclib2.2.8/src/MPEMV.c0000664002275300236100000000235314017255270013572 0ustar wcbrownscs/*====================================================================== B <- MPEMV(r,m,A,a) Modular polynomial evaluation of main variable. Inputs A : in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. m : a BETA-digit. a : in Z/(m). Outputs B : in Z/(m)[X1,...,X_{r-1}], B(X1,...,X_{r-1})=A(X1,...,X_{r-1},a). ======================================================================*/ #include "saclib.h" Word MPEMV(r,m,A,a) Word r,m,A,a; { Word Ap,B,a1,e1,e2,i,rp; /* hide Ap,a1,e1,e2,i,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Apply Horners method. */ ADV(A,&e1,&Ap); B = 0; rp = r - 1; do { ADV(Ap,&a1,&Ap); if (rp == 0) B = MDSUM(m,B,a1); else B = MPSUM(rp,m,B,a1); if (Ap != NIL) ADV(Ap,&e2,&Ap); else e2 = 0; for (i = 1; i <= e1 - e2; i++) if (rp == 0) B = MDPROD(m,a,B); else B = MPMDP(rp,m,a,B); e1 = e2; } while (!(Ap == NIL)); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IUPFAC.c0000664002275300236100000000261114017255270013652 0ustar wcbrownscs/*=========================================================================== IUPFAC(A; s,c,L) Integral univariate polynomial factorization. Inputs A : in Z[x], A non-zero. Outputs s : a BETA-digit, s = sign(A). c : in Z, c = cont(A). L : a list ((e_1,A_1),...,(e_k,A_k)), k >= 0, with e_i in Z, e_i > 0, e_1 <= e_2 <= ... <= e_k, A_i in Z[x], A_i irreducible, positive, and A = s * c * A_1^e_1 * ... * A_k^e_k. ===========================================================================*/ #include "saclib.h" void IUPFAC(A, s_,c_,L_) Word A, *s_,*c_,*L_; { Word A1,Ab,L,L1,P,S,c,e1,n,s; Step1: /* Compute sign, content and primitive part. */ IPSCPP(1,A,&s,&c,&Ab); Step2: /* Degree 0. */ n = PDEG(A); if (n == 0) { L = NIL; goto Return; } Step3: /* Degree 1. */ if (n == 1) { L = LIST1(LIST2(1,Ab)); goto Return; } Step4: /* Degree 2. */ if (n == 2) { L = IPPFAC2(1,Ab); goto Return; } Step5: /* Compute squarefree factorization. */ S = IPSF(1,Ab); Step6: /* Factor squarefree factors */ S = INV(S); L = NIL; do { ADV(S,&P,&S); FIRST2(P,&e1,&A1); L1 = IUSFPF(A1); do { ADV(L1,&A1,&L1); L = COMP(LIST2(e1,A1),L); } while (L1 != NIL); } while (S != NIL); Return: /* Prepare for return. */ *s_ = s; *c_ = c; *L_ = L; return; } saclib2.2.8/src/IPPVED.c0000664002275300236100000000205314017255270013672 0ustar wcbrownscs/*=========================================================================== E <- IPPVED(r,A) Integral polynomial powers-of-variables exact divisors. Inputs r : a BETA-digit, the number of variables, r >= 1. A : in Z[x_1,...,x_r], A non-zero. Outputs E : the list (e_r,e_{r-1}...,e_1) of BETA-digits, such that x_i^e_i divides A but x_i^(e_i+1) does not. ===========================================================================*/ #include "saclib.h" Word IPPVED(r,A) Word r,A; { Word Ap,rp,E,Es,Ep,a,d; Step1: /* r = 1. */ Ap = A; if (r == 1) { do { d = PDEG(Ap); Ap = PRED(Ap); } while (Ap != 0); E = LIST1(d); goto Return; } Step2: /* Initialize. */ rp = r-1; d = PDEG(Ap); a = PLDCF(Ap); Es = IPPVED(rp,a); Ap = PRED(Ap); Step3: /* Loop. */ while (Ap != 0) { d = PDEG(Ap); a = PLDCF(Ap); Ep = IPPVED(rp,a); Es = VMIN(Es,Ep); Ap = PRED(Ap); } E = COMP(d,Es); Return: /* Prepare for return. */ return(E); } saclib2.2.8/src/DIGIT.c0000664002275300236100000000102214017255270013536 0ustar wcbrownscs/*====================================================================== t <- DIGIT(C) Digit. Inputs C : a character. Outputs t : t = 1 if C is a digit, 0 otherwise. ======================================================================*/ #include "saclib.h" #include Word DIGIT(C) Word C; { Word t; /* hide algorithm */ Step1: /* Decide. */ if (isdigit(C)) t = 1; else t = 0; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/MDNEG.c0000664002275300236100000000112614017255270013535 0ustar wcbrownscs/*====================================================================== b <- MDNEG(m,a) Modular digit negative. Inputs m : a positive BETA-integer. a : an element of Z_m. Outputs b : -a. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word MDNEG(m,a) Word m,a; { Word b; /* hide algorithm */ Step1: /* Compute. */ if (a == 0) b = 0; else b = m - a; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/HIPTR1.c0000664002275300236100000000163214017255270013654 0ustar wcbrownscs/*====================================================================== B <- HIPTR1(n,A) Hardware interval polynomial translation by 1. Inputs n : a BETA-digit, n >= 1. A : in HI[X], deg(A) = n. Output B : in HI[X], B(x) = A(x + 1). Remark HIPTR1 is not floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" interval *HIPTR1(n,A) BDigit n; interval A[]; { interval a,*B; BDigit i,j; Step1: /* Copy A into B. */ B = HIPCOPY(n,A); Step2: /* Apply synthetic division. */ for (i = 0; i < n; i++) { a = A[n]; rounddown(); for (j = n-1; j >= i; j--) { a.left = a.left + B[j].left; B[j].left = a.left; } roundup(); for (j = n-1; j >= i; j--) { a.right= a.right + B[j].right; B[j].right = a.right; } } Return: /* Return B. */ return(B); } saclib2.2.8/src/RINEG.c0000664002275300236100000000103614017255270013547 0ustar wcbrownscs/*====================================================================== J <- RINEG(I) Rational interval negation. Inputs I : a rational interval. Outputs J : a rational interval. J = -I. ======================================================================*/ #include "saclib.h" Word RINEG(I) Word I; { Word J; Word a1,a2; Step1: /* Get endpoints of I and J. */ FIRST2(I,&a1,&a2); Step2: /* Negate endpoints. */ J = LIST2(RNNEG(a2),RNNEG(a1)); Return: return(J); } saclib2.2.8/src/PFBRE.c0000664002275300236100000000117014017255270013540 0ustar wcbrownscs/*=========================================================================== A <- PFBRE(r,a) Polynomial from base ring element. Input r : a non-negative BETA-digit. a : an element of a ring R. Output A : a represented as an element of R[x_1,...,x_r]. ===========================================================================*/ #include "saclib.h" Word PFBRE(r,a) Word r,a; { Word A,i; Step1: /* a = 0. */ if (a == 0) { A = 0; goto Return; } Step2: /* a != 0. */ A = a; for (i = 1; i <= r; i++) A = PMON(A,0); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/RNNEG.c0000664002275300236100000000112114017255270013547 0ustar wcbrownscs/*====================================================================== S <- RNNEG(R) Rational number negative. Inputs R : a rational number. Outputs S : -R. ======================================================================*/ #include "saclib.h" Word RNNEG(R) Word R; { Word R1,Rp,Rp1,S; /* hide R1,Rp,S; */ Step1: /* Compute. */ if (R == 0) S = 0; else { ADV(R,&R1,&Rp); Rp1 = INEG(R1); S = COMP(Rp1,Rp); } Return: /* Prepare for return. */ return(S); } saclib2.2.8/src/AITRS.c0000664002275300236100000000234314017255270013567 0ustar wcbrownscs/*======================================================================= a <- AITRS(A,n,k) Array integer truncate and round, small result. Inputs A : an integer in array representation. n, k : nonnegative BETA digits, with 0 <= k < ZETA. Let m = n * ZETA + k. The bit length of A is less than m + ZETA. Output a : a BETA digit. a = sign(A) * {(|A| / 2^m)}, where {x} denotes the nearest integer to x. ========================================================================*/ #include "saclib.h" BDigit AITRS(A,n,k) BDigit *A,n,k; { BDigit a,b,c,d,h,p;; Step1: /* A = 0. */ if (A[0] == 0) { a = 0; goto Return; } Step2: /* Divide by 2^m. */ p = A[1]; b = A[p + 1]; h = PDLOG2(b); if (p - 1 == n) a = b >> k; else if (p - 1 > n) { c = A[p]; a = ((b << (ZETA - k)) | (c >> k)); } else a = 0; Steo3: /* Round. */ if (p - 1 == n) { if (h <= k) d = 0; else d = (b >> (k - 1)) & 1; } else if (p - 1 > n) { if (k == 0) d = (A[p - 1] >> (ZETA -1)) & 1; else d = (A[p] >> (k - 1)) & 1; } else d = 0; a = a + d; Step4: /* Confer the sign of A. */ if (A[0] < 0) a = - a; Return: /* Return a. */ return(a); } saclib2.2.8/src/AMUPTR.c0000664002275300236100000000076614017255270013724 0ustar wcbrownscs/*====================================================================== B <- AMUPTR(A,h) Algebraic module univariate polynomial translation. Inputs A : in Z[alpha,X]. h : in Z. Outputs B : in Z[alpha,X], B(X) = A(X+h). ======================================================================*/ #include "saclib.h" Word AMUPTR(A,h) Word A,h; { Word B; Step1: /* Translate. */ B = IPTR(2,A,2,h); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IRLSA.c0000664002275300236100000000176614017255270013567 0ustar wcbrownscs/*========================================================================= IRLSA(A,n,k; n') Integer restricted left shift in array. Inputs A : An array of size at least n + 1, containing a non-negative integer A' of length n. n : a non-negative BETA-digit. k : a non-negative BETA-digit, k < ZETA. Output n' : The length of the integer 2^k * A'. Effect : The integer A' is replaced in A by the integer 2^k * A'. =========================================================================*/ #include "saclib.h" void IRLSA(A,n,k, np_) Word *A,n,k, *np_; { Word a,ap,i,kp,np; Step1: /* n = 0 or k = 0. */ if (n == 0 || k == 0) { np = n; goto Return; } Step2: /* Shift loop. */ kp = ZETA - k; ap = 0; for (i = 0; i < n; i++) { a = A[i]; A[i] = ((a << k) & BETA1) | ap; ap = a >> kp; } Step3: /* Last carry. */ if (ap != 0) { A[n] = ap; np = n + 1; } else np = n; Return: /* Return n'. */ *np_ = np; } saclib2.2.8/src/IPROD3X3.c0000664002275300236100000000421114017255270014054 0ustar wcbrownscs/*=========================================================================== C <- IPROD3X3(A,B) Integer product - 3x3-multiplication. Inputs A, B : integers of length 3. Outputs C : an integer. C = A * B. ===========================================================================*/ #include "saclib.h" Word IPROD3X3(A,B) Word A,B; { Word a0,a1,a2; Word b0,b1,b2; Word s; Word c001,c010,c011,c020,c021; Word c100,c101,c110,c111,c120,c121; Word c200,c201,c210,c211,c220,c221; Word c1,c2,c3,c4,c5; Word Ch[6]; Word C; Step1: /* Read digits. */ FIRST3(A,&a0,&a1,&a2); FIRST3(B,&b0,&b1,&b2); if (a2 < 0) { s = -1; a0 = -a0; a1 = -a1; a2 = -a2; } else s = 1; if (b2 < 0) { s = -s; b0 = -b0; b1 = -b1; b2 = -b2; } Step2: /* Compute digit products. */ DPR(a0,b0,&c001,&Ch[0]); DPR(a0,b1,&c011,&c010); DPR(a0,b2,&c021,&c020); DPR(a1,b0,&c101,&c100); DPR(a1,b1,&c111,&c110); DPR(a1,b2,&c121,&c120); DPR(a2,b0,&c201,&c200); DPR(a2,b1,&c211,&c210); DPR(a2,b2,&c221,&c220); Step3: /* Add digit products. */ /* Note that cxx0 <= BETA-1, cxx1 <= BETA-2. */ c1 = c001 + c100 + c010; Ch[1] = c1 & BETA1; c2 = c1 >> ZETA; /* Note that c2 <= 2. */ c2 = c2 + c101 + c011 + c200; c3 = c2 >> ZETA; c2 = c2 & BETA1; c2 = c2 + c110 + c020; Ch[2] = c2 & BETA1; c2 = c2 >> ZETA; c3 = c3 + c2; /* Note that c3 <= 4. */ c3 = c3 + c201 + c111 + c021; c4 = c3 >> ZETA; c3 = c3 & BETA1; c3 = c3 + c210 + c120; Ch[3] = c3 & BETA1; c3 = c3 >> ZETA; c4 = c4 + c3; /* Note that c4 <= 4. */ c4 = c4 + c211 + c121 + c220; Ch[4] = c4 & BETA1; c5 = c4 >> ZETA; Ch[5] = c5 + c221; /* Note that Ch[5] <= BETA - 1. */ Step4: /* Construct list. */ C = IFATL(Ch,6,s); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IUPSWN.c0000664002275300236100000000207714017255270013736 0ustar wcbrownscs/*=========================================================================== b <- IUPSWN(A) Integral univariate polynomial, square of the weighted norm. Input A : in Z[x]. Output b : in Z, the square of the weighted norm of A. If A = sum_{i=0}^n a_i, then b = sum_{i=0}^n ceiling(a_i^2/(n choose i)). ===========================================================================*/ #include "saclib.h" Word IUPSWN(A) Word A; { Word b,n,C,Ap,i,a,e,a2,c,r,s; Step1: /* A = 0. */ if (A == 0) { b = 0; goto Return; } Step2: /* Compute the binomial coefficients. */ n = PDEG(A); C = IBCOEFS(n); Step3: /* Compute weighted sum. */ Ap = A; b = 0; i = n; do { a = PLDCF(Ap); e = PDEG(Ap); a2 = IPROD(a,a); while (e < i) { C = RED(C); i--; } ADV(C,&c,&C); i--; r = RNRED(a2,c); s = RNCEIL(r); b = ISUM(b,s); Ap = PRED(Ap); } while (Ap != 0); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/GIWRITE.c0000664002275300236100000000170614017255270014021 0ustar wcbrownscs/*======================================================================= GIWRITE(a) Gaussian integer write. Input a : a Gaussian integer. Effect a is written to the output stream in the form a1 + a2 i. =======================================================================*/ #include "saclib.h" void GIWRITE(a) Word a; { Word b; BDigit s; Step1: /* Write the output. */ if (a == 0) IWRITE(0); else { b = SECOND(a); if (FIRST(a) != 0) { IWRITE(FIRST(a)); if (b != 0) { s = ISIGNF(b); if (s > 0) SWRITE (" + "); else { b = INEG(b); SWRITE(" - "); } if (b != 1) IWRITE(b); SWRITE(" i"); } } else { if (b == 1) SWRITE("i"); else if (b == -1) SWRITE("- i"); else { IWRITE(b); SWRITE(" i"); } } } Return: /* Return. */ return; } saclib2.2.8/src/MPFFAP1.c0000664002275300236100000000214414017255270013736 0ustar wcbrownscs/*======================================================================= C <- MPFFAP1(p,q,A,B) Medium prime finite field array for plus 1. Inputs p : a medium prime beta digit. q : the size of a finite field GF(p^n), a beta digit. A : an array of q beta digits such that A[0] = 0 and for 0 < i < q, A[i] = G^i(p), where G is a generator of the field. G^i is evaluated at p in Z, not in Z^p. B : an array of q beta-integers such that B[i] = j if and only if A[j] = i. Output C : an array of q beta digits. For 0 <= i < q, i is the discrete logarithm of some a in GF(p^n) and C[i] is the discrete logarithm of a + 1 in GF(p^n). =======================================================================*/ #include "saclib.h" BDigit *MPFFAP1(p,q,A,B) BDigit p,q,*A,*B; { BDigit a,b,i,r; BDigit *C; Step1: /* Use arrays A and B. */ C = GETARRAY(q); C[0] = q - 1; for (i = 1; i < q; i++) { a = A[i]; r = a % p; if (r == p - 1) b = a - r; else b = a + 1; C[i] = B[b]; } Return: /* Return C. */ return (C); } saclib2.2.8/src/IPROD2X2.c0000664002275300236100000000263514017255270014062 0ustar wcbrownscs/*=========================================================================== C <- IPROD2X2(A,B) Integer product - 2x2-multiplication. Inputs A, B : integers of length 2. Outputs C : an integer. C = A * B. ===========================================================================*/ #include "saclib.h" Word IPROD2X2(A,B) Word A,B; { Word a0,a1; Word b0,b1; Word s; Word c001; Word c100,c101; Word c010,c011; Word c110,c111; Word c1,c2,c3; Word Ch[4]; Word C; Step1: /* Read digits. */ FIRST2(A,&a0,&a1); FIRST2(B,&b0,&b1); if (a1 < 0) { s = -1; a0 = -a0; a1 = -a1; } else s = 1; if (b1 < 0) { s = -s; b0 = -b0; b1 = -b1; } Step2: /* Compute digit products. */ DPR(a0,b0,&c001,&Ch[0]); DPR(a0,b1,&c011,&c010); DPR(a1,b0,&c101,&c100); DPR(a1,b1,&c111,&c110); Step3: /* Add digit products. */ c1 = c001 + c100 + c010; Ch[1] = c1 & BETA1; c2 = c1 >> ZETA; /* Note that c2 <= 2. */ c2 = c2 + c101 + c011 + c110; Ch[2] = c2 & BETA1; c3 = c2 >> ZETA; Ch[3] = c3 + c111; /* Note that Ch[3] <= BETA - 1. */ Step4: /* Construct list. */ C = IFATL(Ch,4,s); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/COMP3.c0000664002275300236100000000100614017255270013521 0ustar wcbrownscs/*====================================================================== M <- COMP3(a1,a2,a3,L) Composition 3. Inputs a1, a2, a3 : objects L : list Outputs M : COMP(a1,COMP(a2,COMP(a3,L))). ======================================================================*/ #include "saclib.h" Word COMP3(a1,a2,a3,L) Word a1,a2,a3,L; { Word M; Step1: /* Compose. */ M = COMP(a1,COMP(a2,COMP(a3,L))); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/RPBLGS.c0000664002275300236100000000302414017255270013673 0ustar wcbrownscs/*====================================================================== RPBLGS(r,A; a,b,s) Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. Inputs r : a BETA-digit, r >= 0. A : in Q[X1,...,Xr]. Outputs a : in Z, the lcm of the denominators of the base coefficients of A. If A = 0 then a = 0. b : in Z, the gcd of the numerators of the base coefficients of A. If A = 0 then b = 0. s : a BETA-digit, the sign of the leading base coefficient of A. If A = 0 then s = 0. ======================================================================*/ #include "saclib.h" void RPBLGS(r,A, a_,b_,s_) Word r,A, *a_,*b_,*s_; { Word As,a,ap,b,bp,c,e,rp,s,sp; /* hide e,rp,s,sp; */ Step1: /* A = 0. */ if (A == 0) { a = 0; b = 0; s = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { bp = FIRST(A); s = ISIGNF(bp); b = IABSF(bp); a = SECOND(A); goto Return; } Step3: /* General case. */ rp = r - 1; ADV2(A,&e,&c,&As); RPBLGS(rp,c,&a,&b,&s); while (As != NIL) { ADV2(As,&e,&c,&As); if (rp == 0) FIRST2(c,&bp,&ap); else RPBLGS(rp,c,&ap,&bp,&sp); a = ILCM(a,ap); if (b != 1) b = IGCD(b,bp); } Return: /* Prepare for return. */ *a_ = a; *b_ = b; *s_ = s; return; } saclib2.2.8/src/GETAHIA.c0000664002275300236100000000113414017255270013744 0ustar wcbrownscs/*======================================================================= A <- GETAHIA(n) Get array of hardware interval arrays. Input n : a positive BETA-digit. Output A : An array of n pointers to arrays of hardware intervals. =======================================================================*/ #include #include "saclib.h" interval **GETAHIA(n) BDigit (n); { interval **A; Step1: /* Allocate memory for the array. */ A = (interval **)malloc((n) * sizeof(interval *)); if (A == NULL) FAIL("GETAHIA","Out of memory."); Return: /* Return A. */ return(A); } saclib2.2.8/src/LBRNP2PROD.c0000664002275300236100000000122014017255270014322 0ustar wcbrownscs/*====================================================================== s <- LBRNP2PROD(r,k) Logarithmic binary rational number power of 2 product. Inputs r : a logarithmic binary rational number. k : a BETA-digit. Outputs s : a logarithmic binary rational representation of r*2^k ======================================================================*/ #include "saclib.h" Word LBRNP2PROD(r,k) Word r,k; { Word s,r1,r2; Step1: /* Construct r*2^k. */ if (r == 0) s = 0; else { FIRST2(r,&r1,&r2); s = LIST2(r1, r2 - k); } Return: /* Prepare to return. */ return (s); } saclib2.2.8/src/IPVCHTP.c0000664002275300236100000000415214017255270014022 0ustar wcbrownscs/*====================================================================== k <- IPVCHTP(A) Integral polynomial variations after circle to half-plane transformation, partial count. Inputs A : in Z[x], non-zero. Outputs k : Let n = deg(A), A'(x) = x^n A(1/x) and B(x)=A'(x+1). Let h be the number of sign variations in the coefficients of B. Then k = min(h,2). ======================================================================*/ #include "saclib.h" #define IPVCHTP_SIZE 1000 Word IPVCHTP(A) Word A; { Word Ab[IPVCHTP_SIZE]; Word Ap,*P,a,a1,ap,c,e,f,fb,g,h,i,j,k,m,n,s,t; Step1: /* Compute maximum coefficient length. */ fb = 0; Ap = A; do { Ap = RED(Ap); ADV(Ap,&a,&Ap); f = ILOG2(a); if (f > fb) fb = f; } while (Ap != NIL); Step2: /* Store coefficients in array. */ n = PDEG(A); g = (fb + n + ZETA - 1) / ZETA; m = g * (n + 1); if (m <= IPVCHTP_SIZE) P = Ab; else P = GETARRAY(m); Ap = PRT(A); i = 0; for (h = n; h >= 0; h--) { if (Ap == NIL) e = -1; else e = FIRST(Ap); if (e == h) ADV2(Ap,&e,&a,&Ap); else a = 0; ap = a; if (ap < BETA) ap = LIST1(ap); for (j = 1; j <= g; j++) { if (ap != NIL) ADV(ap,&a1,&ap); else a1 = 0; P[i] = a1; i = i + 1; } } Step3: /* Count sign variations while applying synthetic division . */ k = 0; t = 0; m = m - 1; j = 1; while ((j <= n + 1) && (k < 2)) { c = 0; m = m - g; for (i = 0; i <= m; i++) { a1 = P[i] + P[i + g] + c; c = 0; if (a1 >= BETA) { a1 = a1 - BETA; c = 1; } else if (a1 <= -BETA) { a1 = a1 + BETA; c = -1; } P[i + g] = a1; } s = 0; i = m + g; while (s == 0 && i > m) { if (P[i] != 0) s = P[i]; i = i - 1; } s = signm(s); if (s == - t && t != 0) k = k + 1; if (s != 0) t = s; j = j + 1; } Step4: /* Free array. */ if (P != Ab) FREEARRAY(P); Return: /* Prepare for return. */ return(k); } saclib2.2.8/src/HSIGN.c0000664002275300236100000000073214017255270013555 0ustar wcbrownscs/*====================================================================== s <- HSIGN(a) Hardware sign. Input a : a hardware double precision number. Output s : The sign of a. ======================================================================*/ #include "saclib.h" BDigit HSIGN(a) double a; { BDigit s; Step1: /* Obtain sign. */ if (a > 0) s = 1; else if (a < 0) s = -1; else s = 0; Return: /* Return s. */ return(s); } saclib2.2.8/src/AFPSIR.c0000664002275300236100000000314514017255270013672 0ustar wcbrownscs/*====================================================================== K = AFPSIR(p,I,B,J) Algebraic field polynomial software interval refinement. Inputs p : a nonnegative BETA digit (the precision). I : a standard logarithmic binary rational that is a refined isolating interval for an algebraic number alpha. I must be exactly convertible to a precision p software interval. B : a univariate polynomial of positive degree over Q(alpha). Each coefficient of B is represented as a rational number and a univariate polynomial over Z[alpha]. J : a standard logarithmic binary rational isolating interval for a root beta of B(x). Output K : a standard logarithmic binary rational isolating interval for beta, as small as could be achieved using precision p software interval arithmetic, where p is the precision of I. ======================================================================*/ #include "saclib.h" Word AFPSIR(p,I,B,J) BDigit p; Word I,B,J; { BDigit *Bp,n,q,S,t,*T1,*T2; Word b2,J2,K; Step1: /* Convert B to a software interval polynomial. */ q = p + p + 6; n = PDEG(B); S = (n + 1) * q + 1; Bp = GETARRAY(S); AFPSIP(I,B,p,Bp); Step2: /* Compute the trend of beta. */ b2 = SECOND(J); J2 = LIST2(b2,b2); T1 = GETARRAY(q); LBRISI(J2,p,T1); T2 = GETARRAY(q); SIPEVAL(Bp,T1,T2); FREEARRAY(T1); t = SISIGN(T2); FREEARRAY(T2); if (t == NIL) { K = J; goto Step4; } Step3: /* Refine J. */ K = SIPIR(Bp,J,t,-p * ZETA); Step4: /* Free array Bp. */ FREEARRAY(Bp); Return: /* Return K. */ return(K); } saclib2.2.8/src/IUSFPF.c0000664002275300236100000000167314017255270013706 0ustar wcbrownscs/*=========================================================================== L <- IUSFPF(A) Integral univariate squarefree polynomial factorization. Inputs A : in Z[x], A squarefree, positive, primitive, and of positive degree. Outputs L : a list (a_1,...,a_k), with a_i in Z[X], of the positive, irreducible factors of A. ===========================================================================*/ #include "saclib.h" Word IUSFPF(A) Word A; { Word C,F,G,L,p; Step1: /* Degree 1. */ if (PDEG(A) == 1) { L = LIST1(A); goto Return; } Step2: /* Degree 2. */ if (PDEG(A) == 2) { L = IUSFPF2(A); goto Return; } Step3: /* Compute modular factorization. */ IUSFPMF(A,&p,&F,&C,&G); if (p == 0) { L = LIST1(A); goto Return; } Step5: /* Apply binary lifting with early factor detection. */ L = IUPHLEFD(p,F,A,C,G); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/CSFS.c0000664002275300236100000000114314017255270013440 0ustar wcbrownscs/*=========================================================================== C <- CSFS(S) Characteristic set from set. Input S : a list of non-negative BETA-digits. Output C : a characteristic set. An element is in C if and only if it is in S. ===========================================================================*/ #include "saclib.h" Word CSFS(S) Word S; { Word C,Sp,s; Step1: /* Initialize. */ C = 0; Step2: /* Loop. */ Sp = S; while (Sp != NIL) { ADV(Sp,&s,&Sp); C = CSUN(C,IMP2(1,s)); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/VWRITE.c0000664002275300236100000000111014017255270013714 0ustar wcbrownscs/*====================================================================== VWRITE(v) Variable write. Inputs v : a variable name. Side effects The variable name v is written to the output stream. ======================================================================*/ #include "saclib.h" void VWRITE(v) Word v; { Word C,vp; /* hide algorithm */ Step1: /* Write them out. */ vp = v; while (vp != NIL) { ADV(vp,&C,&vp); CWRITE(C); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/AFGEN.c0000664002275300236100000000105314017255270013522 0ustar wcbrownscs/*=========================================================================== a <- AFGEN() Algebraic number field generator. Output a : in Q(alpha). If alpha is any irrational algebraic number, a is the representation of alpha as an element of the algebraic number field Q(alpha). ===========================================================================*/ #include "saclib.h" Word AFGEN() { Word a; Step1: /* Construct. */ a = LIST2(RNINT(1),PMON(1,1)); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/LBRINPROD.c0000664002275300236100000000126414017255270014241 0ustar wcbrownscs/*====================================================================== J <- LBRINPROD(I,c) Logarithmic binary rational interval number product. Inputs I : a logarithmic binary rational interval. c : a nonzero logarithmic binary rational number. Output J : a logarithmic binary rational interval. J = I * c. ======================================================================*/ #include "saclib.h" Word LBRINPROD(I,c) Word I,c; { Word a,b,J; Step1: /* Multiply each endpoint by c. */ FIRST2(I,&a,&b); a = LBRNPROD(a,c); b = LBRNPROD(b,c); if (LBRNSIGN(c) > 0) J = LIST2(a,b); else J = LIST2(b,a); Return: /* Return J. */ return(J); } saclib2.2.8/src/RNFLOR.c0000664002275300236100000000125014017255270013703 0ustar wcbrownscs/*====================================================================== a <- RNFLOR(r) Rational number, floor of. Inputs r : a rational number. Outputs a : floor(r), an integer. ======================================================================*/ #include "saclib.h" Word RNFLOR(r) Word r; { Word a,b,r1,r2,s; /* hide r1,r2,s; */ Step1: /* r=0. */ if (r == 0) { a = 0; goto Return; } Step2: /* r /= 0. */ FIRST2(r,&r1,&r2); IQR(r1,r2,&a,&b); s = ISIGNF(b); if (s < 0) a = ISUM(a,s); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/ILWORDS.c0000664002275300236100000000275114017255270014033 0ustar wcbrownscs/*=========================================================================== ILWORDS(A,m,B,n; a1,a0,b1,b0) Integer leading words. Inputs A, B: in Z, in array representation, A, B > 0. If u and v are the bit-lengths of A and B, respectively, then u >= 2 * ZETA and u - v < ZETA. m, n: BETA digits, the word lengths of A and B, respectively. Outputs a1, a0, b1, b0: BETA digits. a1 consists of the leading ZETA bits of A. a0 consists of the next ZETA bits of A after a1. b1 consists of the leading (ZETA - u + v) bits of B. b0 consists of the next ZETA bits of B after b1. ===========================================================================*/ #include "saclib.h" void ILWORDS(A,m,B,n, a1_,a0_,b1_,b0_) Word *A,m,*B,n, *a1_,*a0_,*b1_,*b0_; { Word a0,a1,b0,b1,d,e; Step1: /* Get the leading words of A. */ a1 = A[m-1]; a0 = A[m-2]; d = PDLOG2(a1); e = ZETA - d; if (e > 0) { a1 = (a1 << e) | (a0 >> d); a0 = (A[m-3] >> d) | ((a0 << e) & BETA1); } Step2: /* Get the leading words of B. */ b1 = B[n-1]; b0 = B[n-2]; if (m == n) { if (n > 2) { b1 = (b1 << e) | (b0 >> d); b0 = (B[n-3] >> d) | ((b0 << e) & BETA1); } } else { b0 = (b0 >> d) | ((b1 << e) & BETA1); b1 >>= d; } Return: /* Prepare for return. */ *a1_ = a1; *a0_ = a0; *b1_ = b1; *b0_ = b0; return; } saclib2.2.8/src/IGCDCF.c0000664002275300236100000000135414017255270013625 0ustar wcbrownscs/*=========================================================================== IGCDCF(A,B; C,Ab,Bb) Integer greatest common divisor and cofactors. Inputs A,B : in Z. Outputs C : gcd(A,B). Ab : If C = 0, then Ab = 0, otherwise Ab = A/C. Bb : If C = 0, then Bb = 0, otherwise Bb = B/C. ===========================================================================*/ #include "saclib.h" void IGCDCF(A,B, C_,Ab_,Bb_) Word A,B, *C_,*Ab_,*Bb_; { Word Ab,Bb,C; Step1: /* Compute. */ C = IGCD(A,B); if (C == 0 || C == 1) { Ab = A; Bb = B; } else { Ab = IEQ(A,C); Bb = IEQ(B,C); } Return: /* Prepare for return. */ *C_ = C; *Ab_ = Ab; *Bb_ = Bb; return; } saclib2.2.8/src/MAPMON.c0000664002275300236100000000137614017255270013701 0ustar wcbrownscs/*=========================================================================== B = MAPMON(p,A) Modular array polynomial monic. Input A : a modular array polynomial. Output B : the monic associate of A. ========================================================================*/ #include "saclib.h" Word *MAPMON(p,A) BDigit p,*A; { BDigit ap,*B,i,n; Step1: /* Get array for B. */ n = MAPDEG(A); B = MAPGET(n); Step2: /* Compute the inverse of the leading coefficient. */ ap = MDINV(p,MAPLDCF(A)); Step3: /* Store the degree and leading coefficients of B. */ B[-1] = n; B[n] = 1; Step4: /* Compute the coefficients of B. */ for (i = 0; i <= n-1; i++) B[i] = MDPROD(p,ap,A[i]); B[n] = 1; Return: /* Return B. */ return(B); } saclib2.2.8/src/IPRRID.c0000664002275300236100000000252614017255270013701 0ustar wcbrownscs/*====================================================================== L <- IPRRID(A) Integral polynomial real root isolation, Descartes method. Inputs A : in Z[x], non-zero, squarefree. Outputs L : a list (I_1,...,I_r) of standard logarithmic open or one-point binary rational isolating intervals for all of the real roots of A. Let (a_j,b_j) denote the endpoints of I_j. Then a_1 <= b_1 <= ... <= a_r <= b_r. ======================================================================*/ #include "saclib.h" Word IPRRID(A) Word A; { Word n,k; Word Ab,As,I,L,Ls,a,b; Step1: /* Degree zero. */ n = PDEG(A); L = NIL; if (n == 0) goto Return; Step2: /* Isolate positive roots. */ Ab = PDBORD(A); b = IUPPRB(Ab); if (b == 0) goto Step3; k = -SECOND(b); As = IUPBHT(Ab,k); L = IPRRISD(As,0,b); Step3: /* Is 0 a root? */ if (FIRST(Ab) < n) L = COMP(LIST2(0,0),L); Step4: /* Isolate negative roots. */ Ab = IUPNT(Ab); b = IUPPRB(Ab); if (b == 0) goto Return; k = -SECOND(b); As = IUPBHT(Ab,k); Ls = IPRRISD(As,0,b); while (Ls != NIL) { ADV(Ls,&I,&Ls); FIRST2(I,&a,&b); I = LIST2(LBRNNEG(b),LBRNNEG(a)); L = COMP(I,L); } Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/PRT.c0000664002275300236100000000135714017255270013356 0ustar wcbrownscs/*====================================================================== B <- PRT(A) Polynomial reciprocal transformation. Inputs A : a non-zero polynomial. Outputs B : polynomial in the same ring as A, B(X) = X^n A(1/X), where X is the main variable of A and n = deg(A). ======================================================================*/ #include "saclib.h" Word PRT(A) Word A; { Word Ap,B,a,e,n; /* hide Ap,a,e,n; */ Step1: /* Compute. */ n = FIRST(A); Ap = A; B = NIL; do { ADV2(Ap,&e,&a,&Ap); e = n - e; B = COMP2(e,a,B); } while (!(Ap == NIL)); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFUPGC1.c0000664002275300236100000000322214017255270013730 0ustar wcbrownscs/*=========================================================================== AFUPGC1(M,A,B; C,Ab,Bb) Algebraic number field univariate polynomial greatest common divisor and cofactors, degree 1. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A,B : in Q(alpha)[x], deg A = 1 or deg B = 1. Outputs C : in Q(alpha)[x], C is a gcd of A and B. Ab, Bb : in Q(alpha)[x], the cofactors Ab = A / C and Bb = B / C. ===========================================================================*/ #include "saclib.h" void AFUPGC1(M,A,B, C_,Ab_,Bb_) Word M,A,B,*C_,*Ab_,*Bb_; { Word C,Ab,Bb,R; Step1: /* Apply fast relative-primality test. */ if (AFUPFRPT(M,A,B) == 1) goto Step5; Step2: /* Both have degree 1. */ if (PDEG(A) == 1 && PDEG(B) == 1) if (EQUAL(PLDCF(A),AFFINT(1))) { C = A; AFUPQR(M,B,C,&Bb,&R); if (R == 0) { Ab = PMON(PLDCF(A),0); goto Return; } else goto Step5; } else { C = AFPMON(1,M,B); AFUPQR(M,A,C,&Ab,&R); if (R == 0) { Bb = PMON(PLDCF(B),0); goto Return; } else goto Step5; } Step3: /* deg A = 1. */ if (PDEG(A) == 1) { C = AFPMON(1,M,A); AFUPQR(M,B,C,&Bb,&R); if (R == 0) { Ab = PMON(PLDCF(A),0); goto Return; } else goto Step5; } Step4: /* deg B = 1. */ C = AFPMON(1,M,B); AFUPQR(M,A,C,&Ab,&R); if (R == 0) { Bb = PMON(PLDCF(B),0); goto Return; } Step5: /* Relatively prime. */ C = PMON(AFFINT(1),0); Ab = A; Bb = B; Return: /* Prepare for return. */ *C_ = C; *Ab_ = Ab; *Bb_ = Bb; return; } saclib2.2.8/src/IBCOEF.c0000664002275300236100000000113014017255270013625 0ustar wcbrownscs/*====================================================================== A <- IBCOEF(n,k) Integer binomial coefficient. Inputs n,k : BETA-digits with 0 <= k <= n. Outputs A : the binomial coefficient (n choose k). ======================================================================*/ #include "saclib.h" Word IBCOEF(n,k) Word n,k; { Word A,j,kp; /* hide j,kp; */ Step1: /* Compute. */ kp = MIN(k,n - k); A = 1; for (j = 0; j <= kp - 1; j++) A = IBCIND(A,n,j); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/AFPNEG.c0000664002275300236100000000177314017255270013653 0ustar wcbrownscs/*====================================================================== B <- AFPNEG(r,A) Algebraic number field polynomial negative. Inputs r : a BETA-digit, r >= 0. A : in Q(alpha)[X1,...,Xr]. Outputs B : in Q(alpha)[X1,...,Xr], B = -A. ======================================================================*/ #include "saclib.h" Word AFPNEG(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { B = AFNEG(A); goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = AFNEG(a); else b = AFPNEG(rp,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LDSMKB.c0000664002275300236100000000642414017255270013665 0ustar wcbrownscs/*====================================================================== LDSMKB(A,b; xs,N) Linear diophantine system solution, modified Kannan and Bachem algorithm. Inputs A : an m by n matrix over Z. A is represented as a list of columns. b : an m-vector over Z. Outputs xs : an n-vector over Z (a particular solution to Ax = b) if the system is consistent, the empty list otherwise. N : a list of n-vectors over Z (basis vectors of the solution module of Ax = 0) if the system is consistent, the empty list otherwise. Remarks: A and b are modified. ======================================================================*/ #include "saclib.h" void LDSMKB(A,b, xs_,N_) Word A,b, *xs_,*N_; { Word B,C,C1,Cp,Cp1,Cs,Cs1,N,R,Rp,T,c,h,i,j,k,m,n,r,xs; /* hide C1,Cp,Cp1,Cs,N,Rp,c,h,i,j,k,m,n,r,xs; */ Step1: /* Adjoin identity matrix to A and zero vector to -b. */ n = LENGTH(A); C = MIAIM(A); B = VIAZ(VINEG(b),n); Step2: /* Initialize. */ m = LENGTH(b); C1 = FIRST(C); j = 0; do { j = j + 1; ADV(C1,&c,&C1); } while (c == 0); R = LIST1(j); if (j <= m) r = 1; else r = 0; k = 1; if (n == 1) goto Step5; Step3: /* Eliminate column k+1 and augment row-sequence. */ Cs = REDI(C,k); Cs1 = FIRST(Cs); Cp = C; Rp = R; for (h = 1; h <= k + 1; h++) { if (h <= k) ADV(Rp,&i,&Rp); else i = m + n + 1; Cp1 = Cs1; j = 0; do { j = j + 1; ADV(Cp1,&c,&Cp1); } while (c == 0); if (j >= i) { if (j == i) { C1 = FIRST(Cp); VIUT(C1,Cs1,i,&C1,&Cs1); SFIRST(Cp,C1); } Cp = RED(Cp); } else { SFIRST(Cs,Cs1); C = LEROT(C,h,k + 1); R = LEINST(R,h - 1,j); if (j <= m) r = r + 1; goto Step4; } } Step4: /* Normalize off-diagonal elements. */ for (j = h; j >= 1; j--) { Cs = REDI(C,j - 1); ADV(Cs,&T,&Cp); Rp = REDI(R,j); while (Rp != NIL) { ADV(Cp,&Cp1,&Cp); ADV(Rp,&i,&Rp); T = VIERED(T,Cp1,i); } SFIRST(Cs,T); } k = k + 1; if (k < n) goto Step3; Step5: /* Check consistency of the system. */ for (j = 1; j <= r; j++) { ADV(C,&T,&C); ADV(R,&i,&R); B = VIERED(B,T,i); } j = 0; do { j = j + 1; ADV(B,&c,&B); } while (j != m && c == 0); Step6: /* System consistent. */ if (c == 0) { Cp = C; while (Cp != NIL) { Cp1 = FIRST(Cp); Cp1 = REDI(Cp1,m); SFIRST(Cp,Cp1); Cp = RED(Cp); } xs = B; N = C; goto Return; } Step7: /* System inconsistent. */ xs = NIL; N = NIL; Return: /* Prepare for return. */ *xs_ = xs; *N_ = N; return; } saclib2.2.8/src/PTRRED.c0000664002275300236100000000100614017255270013700 0ustar wcbrownscs/*====================================================================== Lp <- PTRRED(L) Reductum 1. (assuming first element of L is a pointer) Inputs L : list of length 1 or more. Outputs Lp : the first reductum of L. (assuming 1st elt of L is a pointer) ======================================================================*/ #include "saclib.h" Word PTRRED(L) Word L; { #if __WORDSIZE == 64 return RED4(L); #else /* Assumes 32-bit pointers. */ return RED2(L); #endif } saclib2.2.8/src/IPLSEVAL.c0000664002275300236100000000136414017255270014126 0ustar wcbrownscs/*====================================================================== S <- IPLSEVAL(L,a) Integral polynomial list sign evaluation, logarithmic. Inputs L : a list (A_1,A_2,...,A_t) of univariate integral polynomials. a : a logarithmic binary rational number. Outputs L : the list (s_1,...,s_t) where s_i = sign(A_i(a)). ======================================================================*/ #include "saclib.h" Word IPLSEVAL(L,a) Word L,a; { Word s; Word A,Lp,S; Step1: /* Initialize. */ Lp = L; S = NIL; Step2: /* Evaluate polynomials. */ while (Lp != NIL) { ADV(Lp,&A,&Lp); s = IUPBRES(A,a); S = COMP(s,S); } S = INV(S); Return: /* Return S. */ return(S); } saclib2.2.8/src/EVEN.c0000664002275300236100000000105714017255270013443 0ustar wcbrownscs/*====================================================================== t <- EVEN(a) EVEN. Inputs a : a C integer. Outputs t : t = 1 if a is even and t = 0 otherwise. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word EVEN(a) Word a; { Word t; Step1: /* Compute. */ t = REM(a,2); if (t < 0) t = 0; else t = 1 - t; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/GCASET.c0000664002275300236100000000103114017255270013644 0ustar wcbrownscs/*====================================================================== GCASET(A,i,a) Garbage collected array set element. Inputs A : a GCA handle. i : a BETA-digit. a : a Word. Side effects The i-th element of the array referenced by A is set to a (with 0 being the index of the first element). ======================================================================*/ #include "sactypes.h" extern GCArray *GCASPACEBp; void GCASET(A,i,a) Word A,i,a; { GCASPACEBp[(A)].array[(i)] = (a); } saclib2.2.8/src/MDDIF.c0000664002275300236100000000113614017255270013527 0ustar wcbrownscs/*====================================================================== c <- MDDIF(m,a,b) Modular digit difference. Inputs m : a positive BETA-integer. a, b : elements of z/(m). Outpus c : a - b. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word MDDIF(m,a,b) Word m,a,b; { Word c; /* hide algorithm */ Step1: /* Compute. */ c = a - b; if (c < 0) c = c + m; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MMAPPROD.c0000664002275300236100000000203014017255270014115 0ustar wcbrownscs/*=========================================================================== MMAPPROD(m,A,B,C) Medium modulus array polynomial product. Inputs m : a medium BETA-digit. A,B : in Z/(m)[x] in array representation. C : an array large enough to hold a polynomial of degree deg(A) + deg(B). Side effects C is modified to contain A * B. ===========================================================================*/ #include "saclib.h" void MMAPPROD(m,A,B,C) Word m,*A,*B,*C; { Word b,d,e,i,k; Step1: /* Get degrees. */ d = MAPDEG(A); e = MAPDEG(B); Step2: /* A = 0 or B = 0. */ if (MAPZERO(A) || MAPZERO(B)) { MAPDEG(C) = 0; MAPCF(C,0) = 0; goto Return; } Step3: /* Set deg(C) to m + n and coefficients of C to 0. */ k = d + e; MAPDEG(C) = k; for (i = 0; i <= k; i++) MAPCF(C,i) = 0; Step4: /* Multiply-add loop. */ for (i = 0; i <= e; i++) { b = MAPCF(B,i); MMAPMADD(m,A,b,i,C); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPSIP.c0000664002275300236100000000307514017255270013574 0ustar wcbrownscs/*====================================================================== IPSIP(A,p,B) Integral polynomial to soft-float interval polynomial. Inputs A : in Z[X]. Let n = deg(A). p : a positive BETA-digit, the desired precision. B : an array of size at least (n+1)(2p+6)+1. Effect B(x), the smallest precision p software interval polynomial of degree n containing A(x) is placed in the array B. That is, each coefficient of B(x) is the smallest precision p software interval containing the corresponding coefficient of A(x). B(x) is represented as follows (let c=2p+6 be the length of the coefficients) B[0] = degree B[1],...,B[c] = constant coefficient ... B[n*c+1],...,B[(n+1)*c] = leading coefficient. ======================================================================*/ #include "saclib.h" void IPSIP(A,p,B) Word A; BDigit p; Word *B; { Word a,Ap; BDigit k,K,n,q1,q2,s; Step1: /* Coefficient size. */ q1 = p + 3; q2 = q1 + q1; Step2: /* A = 0. */ if (A == 0) { B[0] = 0; ISI(0,p,B + 1); return; } Step3: /* Degree and size. */ n = FIRST(A); B[0] = n; s = (n+1) * q2 + 1; Step4: /* Convert coefficients. */ K = s - q2; Ap = A; for (k = n; k >= 0; k--) { if (Ap == NIL || FIRST(Ap) < k) ISI(0,p,B + K); else { Ap = RED(Ap); ADV(Ap,&a,&Ap); ISI(a,p,B+K); } K = K - q2; } Return: /* return. */ return; } saclib2.2.8/src/AFUPMPR.c0000664002275300236100000000253414017255270014021 0ustar wcbrownscs/*====================================================================== AFUPMPR(M,I,B,J,L; Js,j) Algebraic number field univariate polynomial minimal polynomial of a real root. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. J : a Binary rational interval which is either left-open and right-closed or a one-point interval. B : in Q(alpha)[x]. B has a unique root beta of odd multiplicity in J. L : is a nonempty list (L1,...,Lt) of positive irreducible elements of Z[x]. Exactly one Li has beta as a root. Outputs Js : a Binary rational interval. Js is a subinterval of J which is an isolating interval for beta as a root of Lj. Js is either left-open and right-closed or a one-point interval. j : a BETA-digit. Lj is the unique element of L having beta as a root. ======================================================================*/ #include "saclib.h" void AFUPMPR(M,I,B,J,L, Js_,j_) Word M,I,B,J,L, *Js_,*j_; { Word Js,j,Bb; /* hide j; */ Step1: /* Compute similar polynomial in Z[alpha,x]. */ Bb = AMPSAFP(1,B); Step2: /* Find minimal polynomial. */ AMUPMPR(M,I,Bb,J,L,&Js,&j); Return: /* Prepare for return. */ *Js_ = Js; *j_ = j; return; } saclib2.2.8/src/IPIIWS.c0000664002275300236100000000630214017255270013710 0ustar wcbrownscs/*====================================================================== IPIIWS(A,L) Integral polynomial isolating intervals weakly disjoint to strongly disjoint. Inputs A : in Z[X], squarefree, def(A) > 0. L : a list (I1,...,Ir) of open or one-point isolating intervals for real roots of A. Each Ij is a pair (aj,bj) of binary rational numbers, with a1 <= b1 <= ... <= ar <= br. Either a1 = b1 or A(a1) /= 0. Side effects The input list L is modified such that (1) L=(J1,...,Jr) is a list of strongly disjoint isolating intervals for real roots of A (2) each Jk is a subinterval of Ik. (3) If Ik is a standard interval then Jk is either a one-point or a standard interval. ======================================================================*/ #include "saclib.h" void IPIIWS(A,L) Word A,L; { Word I1,I2,Lp,a,a1,ap,b,b1,bp,c,r2,t,y1,y3; /* hide t,y1,y3; */ Step1: /* Make intervals strongly disjoint. */ Lp = L; r2 = RNINT(2); while (L != NIL && RED(Lp) != NIL) { I1 = FIRST(Lp); I2 = SECOND(Lp); FIRST2(I1,&a,&b); FIRST2(I2,&ap,&bp); if (RNCOMP(b,ap) == 0) { /* I1<=I2 adjacent. */ if (RNCOMP(a,b) < 0) { /* I1 open interval. */ /* move I1's right end left. */ b1 = b; t = 0; do { c = RNQ(RNSUM(a,b),r2); y3 = IUPBES(A,c); if (y3 == 0) { /* zero at c */ a = c; b1 = c; } else { if (t == 0) { y1 = IUPBES(A,a); t = 1; } if (y1 * y3 < 0) b1 = c; else { /* zero right of c */ a = c; y1 = y3; } } } while (!(RNCOMP(b1,b) < 0)); I1 = LIST2(a,b1); } else { /* I1 one-point interval */ /* move I2's left end right. */ a1 = ap; t = 0; do { c = RNQ(RNSUM(ap,bp),r2); y3 = IUPBES(A,c); if (y3 == 0) { /* zero at c */ a1 = c; bp = c; } else { if (t == 0) { y1 = IUPBES(IPDER(1,A,1),ap); t = 1; } if (y1 * y3 > 0) a1 = c; else bp = c; } } while (!(RNCOMP(ap,a1) < 0)); I2 = LIST2(a1,bp); } } /* Now I1= n1-k; i--) d_min += PDEG(SECOND(GCAGET(L1,i))); d_min /= ds; if (d_min > d) goto Return; none_ok = 1; all_ok = 1; for (i = d_min; i <= d_max; i++) if (ISCSELT(i,Cb)) none_ok = 0; else all_ok = 0; if (none_ok) goto Step13; Step2: /* Initialize F, the list of factors found, Nb, the polynomial that remains to be factored, Gb, the other modular factors, Bb, the two-factor lifting bound of Nb, Cb, the factor-degree set of A[alpha,x], Db, the factor-dergee set for the first set of factors, m, the number of remaining modular factors in the first group, I, the combination array, W, the array of the products of the polynomials evaluated at 1. t, the last-changed index of combination and tp, the last-changed index of trailing coefficient product. */ F = NIL; Nb = N; Gb = G; Bb = B; Cb = C; D = NIL; S = SFCS(C); while (S != NIL) { ADV(S,&s,&S); D = COMP(s*ds,D); } Db = CSFS(D); /* factor-degree set for first group */ d_min = ds * e; d_max = ds * d; m = n1; I = GETARRAY(k); for (i = 0; i < k; i++) I[i] = i; W = GCAMALLOC(k,GC_CHECK); t = tp = 0; /* Entering loop executed of each combination. */ Step3: /* Test whether the degree of the factor combination product is a possible factor degree. */ dp = 0; K = NIL; for (i = 0; i < k; i++) { f1 = SECOND(GCAGET(L1,I[i])); dp += PDEG(f1); K = COMP(f1,K); } if (!all_ok && ((dp > d_max) || (dp < d_min) || (!ISCSELT(dp,Db)))) goto Step12; Step4: /* Update the product of the polynomials evaluated at 1. */ if (tp == 0) W1 = 1; else W1 = GCAGET(W,tp-1); for (i = tp; i < k; i++) { W1 = MIPROD(Q,GCAGET(T1,I[i]),W1); GCASET(W,i,W1); } tp = t; Step5: /* Check if this combination yields a factor. */ NORMFCTS(Nb,p,Q,Qp,q,LIST1(K),Lp,Tp,dp/ds,W1,Nb1, &Fb,&Nb,&Ib); if (PDEG(Fb) == 0) goto Step12; Step6: /* Put factor in factor list. */ F = COMP(Fb,F); Step7: /* Remove combined factors from arrays and update the number of remaining factors. */ I1 = NIL; for (i = k-1; i >= 0; i--) I1 = COMP(I[i],I1); ARIE(L1,m,I1); ARIE(T1,m,I1); m = m - k; Lpp = NIL; Tpp = NIL; while (Ib != NIL) { ADV(Ib,&Ib1,&Ib); ADV(Lp,&Lp1,&Lp); ADV(Tp,&Tp1,&Tp); FIRST2(Lp1,&dt,&Lp1); FIRST2(Lp1,&nt,&Lp1); ARIE(Lp1,nt,Ib1); ARIE(Tp1,nt,Ib1); nt = nt - LENGTH(Ib1); Lp1 = LIST2(nt,Lp1); Lp1 = LIST2(dt,Lp1); Lpp = COMP(Lp1,Lpp); Tpp = COMP(Tp1,Tpp); } Lp = INV(Lpp); Tp = INV(Tpp); Step8: /* Recompute factor degree set. */ Lpp = COMP(LIST2(ds,LIST2(m,L1)),Lp); J = CSUN(IMP2(1,PDEG(Nb)/n),1); Ct = IDIF(IMP2(1,(PDEG(Nb)/n)+1),1); Cb = CSINT(Cb,Ct); while (Lpp != NIL) { ADV(Lpp,&Lp1,&Lpp); FIRST2(Lp1,&dt,&Lp1); FIRST2(Lp1,&m1,&Lp1); Ct = NIL; for (i = 0; i < m1; i++) { f1 = SECOND(GCAGET(Lp1,i)); d1 = PDEG(f1); Ct = COMP(d1/dt,Ct); } Cb = CSINT(Cb,CSFPAR(Ct)); if (EQUAL(Cb,J)) { F = COMP(Nb,F); Nb = PMON(1,0); Bb = 0; Lb = NIL; Tb = NIL; Gb = NIL; Cb = 0; goto Return; } } Gp = Gb; Gt = NIL; while (Gp != NIL) { ADV(Gp,&G1,&Gp); FIRST2(G1,&p1,&G1); /* p1 = current prime */ Fp = MPHOM(1,p1,Fb); G1t = NIL; while (G1 != NIL) { ADV(G1,&H1,&G1); FIRST2(H1,&e1,&H1); /* e1 = degree of factor of minpoly */ Ct = NIL; H1p = NIL; while (H1 != NIL) { ADV(H1,&Hb,&H1); FIRST2(Hb,&g1,&Hb); MPGCDC(1,p1,Fp,Hb,&c1,&Fp,&Hb); hb = PDEG(Hb); if (hb > 0) { k1 = hb/g1; g1p = g1/e1; for (i = 1; i <= k1; i++) Ct = COMP(g1p,Ct); H1p = COMP(LIST2(g1,Hb),H1p); } } Cb = CSINT(Cb,CSFPAR(Ct)); if (EQUAL(Cb,J)) { F = COMP(Nb,F); Nb = PMON(1,0); Bb = 0; Lb = NIL; Tb = NIL; Gb = NIL; Cb = 0; goto Return; } H1p = INV(H1p); G1t = COMP(LIST2(e1,H1p),G1t); } G1t = INV(G1t); Gt = COMP(LIST2(p1,G1t),Gt); } Gb = INV(Gt); Step9: /* Recompute the two-factor lifting bound and Nb(1). */ Bb = IUPLB(Nb,2); Nb1 = IPEMV(1,Nb,1); Step10: /* Check whether we have lifted beyond the new bound and have combined enough factors to prove irreducibility of the remaining polynomial. */ if (k >= m && d >= PDEG(Nb)/n - 1 && ICOMP(Q,Bb) >= 0) { F = COMP(Nb,F); Nb = PMON(1,0); Bb = 0; Lb = NIL; Tb = NIL; Gb = NIL; Cb = 0; Nb1 = 1; goto Return; } Step11: /* Get next combination after finding a factor. */ j = I[0]; t = 0; for (i = 1; i < k; i++) I[i] = j+i; if (k < m && I[k-1] < m) goto Step3; else goto Step13; Step12: /* Get next combination, if any. */ LEXNEXTC(m,k,I,&t); if (t < tp) tp = t; if (I[0] >= 0) goto Step3; FREEARRAY(I); Step13: /* Check whether we have lifted beyond the new bound and have combined enough factors to prove irreducibility of the remaining polynomial. */ if (k >= m-1 && d >= PDEG(Nb)/n - 1 && ICOMP(Q,Bb) >= 0) { F = COMP(Nb,F); Nb = PMON(1,0); Bb = 0; Lb = NIL; Gb = NIL; Cb = 0; Nb1 = 1; } Step14: /* Prepare the list Lb. */ Lp1 = LIST2(ds,LIST2(m,L1)); Lb = COMP(Lp1,Lp); Return: /* Prepare for return. */ *F_ = F; *Nb_ = Nb; *Bb_ = Bb; *Lb_ = Lb; *Tb_ = Tb; *Gb_ = Gb; *Cb_ = Cb; *Nb1_ = Nb1; return; } saclib2.2.8/src/PERMR.c0000664002275300236100000000150514017255270013571 0ustar wcbrownscs/*====================================================================== L <- PERMR(n) Permutation, random. Inputs n : a BETA-digit, 0 < n <= 100. Outputs L : a list of the first n positive integers in random order. ======================================================================*/ #include "saclib.h" Word PERMR(n) Word n; { Word A[101],L,i,j,t; /* hide i,j,t; */ Step1: /* Initialize array. */ for (i = 1; i <= n; i++) A[i] = i; Step2: /* Random interchanges. */ for (j = n; j >= 1; j--) { i = MDRAN(j) + 1; t = A[i]; A[i] = A[j]; A[j] = t; } Step3: /* Form list. */ L = NIL; for (i = 1; i <= n; i++) L = COMP(A[i],L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IUPILHS.c0000664002275300236100000000664214017255270014030 0ustar wcbrownscs/*=========================================================================== IUPILHS(q,Q,Ab,Bb,Sb,Tb,C; Y,Z,Us,As,Bs) Integral univariate polynomial initial linear Hensel step. Inputs q : a single-precision power of a prime p. Q : in Z, Q = q^2. Ab,Bb,Sb,Tb : lists (Ab_1,...,Ab_r), (Bb_1,...,Bb_{r-1}), (Sb_1,...,Sb_{r-1}), (Tb_1,...,Tb_{r-1}) of elements of Z/(q)[x] such that: (1) Bb_{i-1} = Ab_i*Bb_i, for i = 2, ..., r-1. (2) Ab_i*Sb_i + Bb_i*Tb_i = 1, for i = 2, ..., r-1. (3) deg(Sb_i) < deg(Bb_i) and deg(Tb_i) < deg(Ab_i), for i = 1, ..., r-1. (4) ldcf(Ab_i) = 1, for i = 1, ..., r. The elements of Ab, Bb, Sb, and Tb are in array representation. C : in Z[x]. C is congruent to Ab_1*Bb_1 modulo q. Outputs Y,Z : lists (Y_1,...,Y_{r-1}), (Z_1,...,Z_{r-1}) of elements of Z/(q)[x]; Us : a list (U_1,...,U_{r-1}) of elements of Z[x], such that Y_i, Z_i, U_i satisfy Ab_i*Y_i + Bb_i*Z_i = U_i (mod q). As,Bs : lists (As_1,...,As_r), (Bs_1,...,Bs_{r-1}) of elements of Z/(Q)[x] such that: (1) Bs_{i-1} = As_i*Bs_i, for i = 2, ..., r-1. (2) ldcf(Ab_i) = 1, for i = 1, ..., r. (3) Ab_i = H_q(As_i), Bb_i = H_q(Bs_i). (4) C is congruent to As_1*Bs_1 modulo Q. ===========================================================================*/ #include "saclib.h" void IUPILHS(q,Q,Ab,Bb,Sb,Tb,C, Y_,Z_,Us_,As_,Bs_) Word q,Q,Ab,Bb,Sb,Tb,C, *Y_,*Z_,*Us_,*As_,*Bs_; { Word Ab1,Abt,As,As1,Bb1,Bbt,Bs,Bs1,C1,R1,Sb1,Sbt,Tb1,Tbt, Ub1,Us,Us1,Y,Y1,Z,Z1; Word *Ap,*Bp,*Sp,*Tp,*Up,*Yp,*Zp; Step1: /* Initialize. */ Abt = Ab; Bbt = Bb; Sbt = Sb; Tbt = Tb; C1 = C; Y = NIL; Z = NIL; Us = NIL; As = NIL; Bs = NIL; Step2: /* Loop through the lists. */ ADV(Abt,&Ab1,&Abt); ADV(Bbt,&Bb1,&Bbt); ADV(Sbt,&Sb1,&Sbt); ADV(Tbt,&Tb1,&Tbt); Step3: /* Compute Us1 = (As1 * Bs1 - Ab1 * Bb1)/q. */ R1 = IPDIF(1,C1,IPPROD(1,Ab1,Bb1)); Us1 = IPEQ(1,R1,PMON(q,0)); Ub1 = MPHOM(1,q,Us1); Step4: /* Convert to arrays. */ Ap = MAPFMUP(Ab1); Bp = MAPFMUP(Bb1); Sp = MAPFMUP(Sb1); Tp = MAPFMUP(Tb1); Up = MAPFMUP(Ub1); Yp = MAPGET(MAPDEG(Bp)); Zp = MAPGET(MAPDEG(Ap)-1); Step5: /* Solve the equation Ap Yp + Bp Zp = Up for Yp and Zp. */ MAPSE(q,Ap,Bp,Sp,Tp,Up, Yp,Zp); Step6: /* Convert to lists and free arrays. */ Y1 = MUPFMAP(Yp); Z1 = MUPFMAP(Zp); MAPFREE(Ap); MAPFREE(Bp); MAPFREE(Sp); MAPFREE(Tp); MAPFREE(Up); MAPFREE(Yp); MAPFREE(Zp); Step7: /* Lift Ab1, Bb1. */ As1 = IPSUM(1,Ab1,IPIP(1,q,Z1)); Bs1 = IPSUM(1,Bb1,IPIP(1,q,Y1)); Step8: /* Put the results into the output lists and update C1. */ Y = COMP(Y1,Y); Z = COMP(Z1,Z); Us = COMP(Us1,Us); As = COMP(As1,As); Bs = COMP(Bs1,Bs); C1 = Bs1; Step9: /* Loop. */ if (RED(Abt) != NIL) goto Step2; Step10: /* Clean up. */ As1 = MIPMON(1,Q,Bs1); As = COMP(As1,As); Y = INV(Y); Z = INV(Z); Us = INV(Us); As = INV(As); Bs = INV(Bs); Return: /* Prepare for return. */ *Y_ = Y; *Z_ = Z; *Us_ = Us; *As_ = As; *Bs_ = Bs; } saclib2.2.8/src/AFPCR.c0000664002275300236100000000206214017255270013536 0ustar wcbrownscs/*====================================================================== B <- AFPCR(r,A) Algebraic number field polynomial convert representation. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Q(alpha)[X1,...,Xr] represented as an element of Q[x,X1,...,Xr]. Outputs B : in Q(alpha)[X1,...,Xr], where the coefficients of A are represented as (ai,Ai), where ai is in Q and Ai is in Z[x]. ======================================================================*/ #include "saclib.h" Word AFPCR(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide rp; */ Step1: /* A equal 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A not equal 0. */ rp = r - 1; Ap = A; B = NIL; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = AFCR(a); else b = AFPCR(rp,a); B = COMP2(b,e,B); } B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPDIF.c0000664002275300236100000000334614017255270013544 0ustar wcbrownscs/*====================================================================== C <- IPDIF(r,A,B) Integral polynomial difference. Inputs r : a BETA-digit, r >= 0, the number of variables. A,B : in Z[X1,...Xr]. Outputs C : in Z[X1,...Xr], C = A - B. ======================================================================*/ #include "saclib.h" Word IPDIF(r,A,B) Word r,A,B; { Word Ap,Bp,C,Cp,Cpp,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0) { C = IPNEG(r,B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r=0. */ if (r == 0) { C = IDIF(A,B); goto Return; } Step3: /* General case. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = INEG(b); else c = IPNEG(rp,b); Cp = COMP2(c,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = IDIF(a,b); else c = IPDIF(rp,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step4: /* Finish. */ if (Ap == NIL && Bp == NIL) Cpp = NIL; else if (Ap == NIL) Cpp = IPNEG(r,Bp); else Cpp = Ap; C = INV(Cp); if (C == NIL) C = Cpp; else SRED(Cp,Cpp); if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/TSVSLI.c0000664002275300236100000000163114017255270013730 0ustar wcbrownscs/*================================================================== t <- TSVSLI(A,I) Test sign variation on standard logarithmic interval. Inputs A : a univariate integral polynomial of positive degree. I : a standard logarithmic binary rational interval. Outputs t : 0 if A has no sign variations on I, 1 otherwise. =================================================================*/ #include "saclib.h" Word TSVSLI(A,I) Word A,I; { Word As,c,cp,k,t; Step1: /* Let I = (c / 2^k, (c+1) / 2^k). */ SLIWE(I,&k,&c,&cp); Step2: /* Map I to (0,1). */ As = IUPBHT(A,-k); As = IUPTR(As,c); Step3: /* Return if A* has no variations. */ t = IUPVART(As); if (t == 0) goto Return; Step4: /* Map (0,1) to (0,\inf). */ t = IPVCHTP(As); if (t == 2) t = 1; Return: /* Return. */ return(t); } saclib2.2.8/src/MUPRC.c0000664002275300236100000000342114017255270013571 0ustar wcbrownscs/*====================================================================== MUPRC(p,A,B; C,r) Modular univariate polynomial resultant and cofactor. Inputs p : a BETA-digit, prime. A,B : in Z/(p)[X], A and B are of positive degree. Outputs C : in Z/(p)[X] such that for some D in Z/(p)[X], AD+BC = R. R : in Z/(p), the resultant of A and B. ======================================================================*/ #include "saclib.h" void MUPRC(p,A,B, C_,r_) Word p,A,B, *C_,*r_; { Word A1,A2,A3,C,Q,i,n1,n2,n3,r,r2,s,t,v1,v2,v3; /* hide i,n1,n2,n3,r2,s,t; */ Step1: /* Initialize. */ r = 1; A1 = A; A2 = B; v1 = 0; v2 = PMON(1,0); n1 = PDEG(A1); n2 = PDEG(A2); s = 1; if (n1 < n2) { if (ODD(n1) && ODD(n2)) s = -s; t = A1; A1 = A2; A2 = t; v1 = v2; v2 = 0; } Step2: /* Loop. */ do { MPQR(1,p,A1,A2,&Q,&A3); v3 = MPDIF(1,p,v1,MPPROD(1,p,Q,v2)); if (A3 == 0) { r = 0; C = v3; goto Return; } n1 = PDEG(A1); n2 = PDEG(A2); n3 = PDEG(A3); if (ODD(n1) && ODD(n2)) s = -s; r2 = PLDCF(A2); for (i = 1; i <= n1 - n3; i++) r = MDPROD(p,r,r2); A1 = A2; A2 = A3; v1 = v2; v2 = v3; } while (!(n3 == 0)); Step3: /* Finish. */ r2 = PLDCF(A2); for (i = 1; i <= n2 - 1; i++) r = MDPROD(p,r,r2); if (s == -1) r = p - r; C = MPMDP(1,p,r,v2); r = MDPROD(p,r,r2); Return: /* Prepare for return. */ *C_ = C; *r_ = r; return; } saclib2.2.8/src/AFPEMV.c0000664002275300236100000000250714017255270013665 0ustar wcbrownscs/*====================================================================== B <- AFPEMV(r,M,A,a) Algebraic number field polynomial evaluation of main variable. Inputs r : a BETA-integer, r >= 1. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : an element of Q(alpha)[X1,...,Xr]. a : in Q(alpha). Outputs B : in Q(alpha)[X1,...,X_{r-1}], B(X1,...,X_{r-1}) = A(X_1,...,X_{r-1},a). ======================================================================*/ #include "saclib.h" Word AFPEMV(r,M,A,a) Word r,M,A,a; { Word A2,Ap,B,e1,e2,i,rp; /* hide A2,Ap,e1,e2,i,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Apply Horner's method. */ ADV2(A,&e1,&B,&Ap); rp = r - 1; while (Ap != NIL) { ADV2(Ap,&e2,&A2,&Ap); for (i = 1; i <= e1 - e2; i++) if (rp == 0) B = AFPROD(M,a,B); else B = AFPAFP(rp,M,a,B); if (rp == 0) B = AFSUM(B,A2); else B = AFPSUM(rp,B,A2); e1 = e2; } for (i = 1; i <= e1; i++) if (rp == 0) B = AFPROD(M,a,B); else B = AFPAFP(rp,M,a,B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MPPSR.c0000664002275300236100000000232714017255270013610 0ustar wcbrownscs/*====================================================================== C <- MPPSR(r,p,A,B) Modular polynomial pseudo-remainder. Inputs A,B : in Z/(p)[X1,...,Xr], B non-zero. r : a BETA-digit, r >= 1, the number of variables. p : a prime BETA-digit. Outputs C : in Z/(p)[X1,...,Xr], the pseudoremainder of A and B. ======================================================================*/ #include "saclib.h" Word MPPSR(r,p,A,B) Word r,p,A,B; { Word B1,Bb,Bs,C,C1,c,i,l,m,n; /* hide Bb,i,l,m,n; */ Step1: /* Deg(B)=0. */ n = PDEG(B); if (n == 0) { C = 0; goto Return; } Step2: /* Deg(B) > 0. */ m = PDEG(A); C = A; Bb = PRED(B); B1 = LIST2(0,PLDCF(B)); for (i = m; i >= n; i--) { if (C == 0) goto Return; l = PDEG(C); if (l == i) { c = PLDCF(C); C = PRED(C); C = MPPROD(r,p,C,B1); C1 = LIST2(l - n,c); Bs = MPPROD(r,p,Bb,C1); C = MPDIF(r,p,C,Bs); } else C = MPPROD(r,p,C,B1); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/INFOSACLIB.c0000664002275300236100000000235314017255270014317 0ustar wcbrownscs/*====================================================================== INFOSACLIB(s) Write out usage information for SACLIB. Inputs s : a character string; the name of the executable program. Side effects The standard command line usage is written to the output stream. ======================================================================*/ #include "saclib.h" void INFOSACLIB(s) const char *s; { Step1: /* Write out the usage. */ SWRITE("Usage:\n "); SWRITE(s); SWRITE(" \n"); SWRITE("\nSACLIB Options:\n"); SWRITE(" +h : print this usage information."); SWRITE("\n +N : NU <- . default = "); GWRITE(NU); SWRITE("\n +Np : NUp <- . default = "); GWRITE(NUp); SWRITE("\n +G : GCM <- . default = "); GWRITE(GCM); SWRITE("\n +R : RHO <- . default = "); GWRITE(RHO); SWRITE("\n +S : NSPRIME <- . default = "); GWRITE(NSPRIME); SWRITE("\n +M : NMPRIME <- . default = "); GWRITE(NMPRIME); SWRITE("\n +L : NLPRIME <- . default = "); GWRITE(NLPRIME); SWRITE("\n +T : NPTR1 <- . default = "); GWRITE(NPTR1); SWRITE("\n"); } saclib2.2.8/src/IPPSC.c0000664002275300236100000000343114017255270013562 0ustar wcbrownscs/*=========================================================================== P <- IPPSC(r,A,B) Integral polynomial principal subresultant coefficients. Inputs r : a BETA-digit, r > 0. A,B : in Z[x_1,...,x_r], A and B are of positive degree in the main variable. Outputs P : a list of the non-zero principal subresultant coefficients of A and B. If i < j then psc_{i}(A,B) precedes psc_{j}(A,B) in P. ===========================================================================*/ #include "saclib.h" Word IPPSC(r,A,B) Word r,A,B; { Word G1,G2,G3,Gh3,P,d0,d1,g1,h0,h1,hs0,hs1,i,n1,n2,n3,rp,t; Step1: /* Initialize. */ n1 = PDEG(A); n2 = PDEG(B); if (n1 > n2) { G1 = A; G2 = B; } else { G1 = B; G2 = A; t = n1; n1 = n2; n2 = t; } d0 = 0; d1 = n1 - n2; rp = r - 1; i = 1; P = NIL; Step2: /* Compute Gh_{i+2}. */ if (G2 == 0) { Gh3 = 0; n3 = 0; goto Step3; } Gh3 = IPPSR(r,G1,G2); n3 = PDEG(Gh3); if (Gh3 == 0) goto Step3; if (EVEN(d1) == 1) Gh3 = IPNEG(r,Gh3); Step3: /* Compute hi. */ if (i > 1) { g1 = PLDCF(G1); h1 = IPEXP(rp,g1,d0); if (i > 2) { hs0 = IPEXP(rp,h0,d0 - 1); h1 = IPEQ(rp,h1,hs0); P = COMP(h1,P); if (G2 == 0) goto Return; } } Step4: /* Compute G_{i+2}. */ if (i == 1 || Gh3 == 0) G3 = Gh3; else { hs1 = IPEXP(rp,h1,d1); hs1 = IPPROD(rp,g1,hs1); hs1 = PMON(hs1,0); G3 = IPEQ(r,Gh3,hs1); hs1 = 0; } Step5: /* Update. */ n1 = n2; n2 = n3; d0 = d1; d1 = n1 - n2; G1 = G2; G2 = G3; if (i > 1) h0 = h1; i = i + 1; goto Step2; Return: /* Prepare for return. */ return(P); } saclib2.2.8/src/ISPSFB.c0000664002275300236100000000146314017255270013675 0ustar wcbrownscs/*====================================================================== B <- ISPSFB(r,A) Integral squarefree polynomial squarefree basis. Inputs r : a BETA-digit, r > 0. A : a list of positive primitive squarefree polynomials in Z[X1,...,Xr], each of which is of positive degree in its main variable. Outputs B : a list of polynomials in Z[X1,...,Xr], a coarsest squarefree basis for A. ======================================================================*/ #include "saclib.h" Word ISPSFB(r,A) Word r,A; { Word A1,Ap,B; /* hide A1,Ap; */ Step1: /* Compute. */ B = NIL; Ap = A; while (Ap != NIL) { ADV(Ap,&A1,&Ap); B = IPSFBA(r,A1,B); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPAFME.c0000664002275300236100000000144114017255270013644 0ustar wcbrownscs/*=========================================================================== B <- IPAFME(r,M,A,b) Integral polynomial, algebraic number field multiple evaluation. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. r : a BETA-digit, r >= 1. A : in Z[x_1,...,x_r]. b : a list (b_1,...,b_k) of elements of Q(alpha), 1 <= k <= r. Outputs B : in Q(alpha)[x_{k+1},...,x_r], B = A(b_1,...,b_k,x_{k+1},...,x_r). ===========================================================================*/ #include "saclib.h" Word IPAFME(r,M,A,b) Word r,M,A,b; { Word Ap,B; Step1: /* Convert A to a polynomial over Q(alpha). */ Ap = AFPFIP(r,A); Step2: /* Evaluate at b. */ B = AFPME(r,M,Ap,b); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AIWRITE.c0000664002275300236100000000073414017255270014013 0ustar wcbrownscs/*====================================================================== AIWRITE(A) Array integer write. Input A : an integer in array representation. Effect A is written in the output stream. ======================================================================*/ #include "saclib.h" void AIWRITE(A) BDigit *A; { Word B; Step1: /* Convert to list representation and write. */ B = AII(A); IWRITE(B); Return: /* Return. */ return; } saclib2.2.8/src/AGIRSUM.c0000664002275300236100000000213114017255270014007 0ustar wcbrownscs/*======================================================================== AGIRSUM(A,B,k,C) Array Gaussian integer rotated sum. Inputs A, B: array Gaussian integers. k : a BETA digit, k = 0. 1. 2 or 3. C : a Gaussian integer array. The sizes of C[0] and C[1] must be at least as long as the maximum of the lengths of A and B plus 3. Effect The sum of A and i^k * B is placed in C. ========================================================================*/ #include "saclib.h" void AGIRSUM(A,B,k,C) BDigit **A,**B,k,**C; { BDigit *T; Step1: /* Replace B with i^k B. */ if (k == 1 || k == 3) { T = B[0]; B[0] = B[1]; B[1] = T; } if (k == 1 || k == 2) B[0][0] = - B[0][0]; if (k == 2 || k == 3) B[1][0] = - B[1][0]; Step2: /* Add. */ AGISUM(A,B,C); Step3: /* Restore B. */ if (k == 1 || k == 2) B[0][0] = - B[0][0]; if (k == 2 || k == 3) B[1][0] = - B[1][0]; if (k == 1 || k == 3) { T = B[0]; B[0] = B[1]; B[1] = T; } Return: /* Return. */ return; } saclib2.2.8/src/MIQ.c0000664002275300236100000000100114017255270013321 0ustar wcbrownscs/*========================================================================== C <- MIQ(M,A,B) Modular integer quotient. Inputs M : a positive integer. A,B : elements of Z_M, B a unit of Z_M. Outputs C : A/B. ==========================================================================*/ #include "saclib.h" Word MIQ(M,A,B) Word M,A,B; { Word C; Step1: /* Compute. */ C = MIPROD(M,A,MIINV(M,B)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/ISIGNA.c0000664002275300236100000000065014017255270013656 0ustar wcbrownscs/*=========================================================================== s <- ISIGNA(A,n) Integer sign function, array version. Input A : in Z, in array representation. n : a BETA-digt, the word length of A. Output s : the sign of A. #define ISIGNA(A,n) ((n) == 0 ? 0 : (((A)[(n)-1] > 0) ? 1 : -1)) ===========================================================================*/ saclib2.2.8/src/BERNOULLINUM.c0000664002275300236100000000220614017255270014616 0ustar wcbrownscs/*====================================================================== B <- BERNOULLINUM(n) Bernoulli numbers via tangent numbers. Inputs n : a non-negative BETA-digit. Outputs B : a list of rational numbers, B = (B_0,...,B_n) where B_i is the i-th Bernoulli number. ======================================================================*/ #include "saclib.h" Word BERNOULLINUM(n) BDigit n; { Word B,b,T,t; BDigit m,s; Step1: /* n = 0. */ if (n == 0) { B = LIST1(RNINT(1)); goto Return; } Step2: /* n = 1. */ if (n == 1) { B = LIST2(RNINT(1),RNNEG(RNRED(1,2))); goto Return; } Step3: /* Tangent numbers. */ T = TANGENTNUM(n); Step4: /* Bernoulli numbers. */ T = RED(T); B = LIST2(RNNEG(RNRED(1,2)),RNINT(1)); m = 2; s = 1; for (m = 2; m <= n; m++) { ADV(T,&t,&T); if (t == 0) b = 0; else { b = RNRED(IDPR(t,m),IMP2(IDIF(IMP2(1,m),1),m)); if (s == -1) b = RNNEG(b); s = -s; } B = COMP(b,B); } Step5: /* Invert. */ B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AMUPRLS.c0000664002275300236100000000447514017255270014040 0ustar wcbrownscs/*====================================================================== AMUPRLS(M,I,A1,A2,L1,L2; Ls1,Ls2) Algebraic module univariate polynomial real root list separation. Inputs M : in Z[X], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. A1,A2 : in Z[alpha,X]. A1 and A2 do not have any common roots and their real roots are of odd multiplicity. L1,L2 : strong isolation lists for the real roots of A1 and A2 resp. L1 = (I1_1,...,I1_r1), L2 = (I2_1,...,I2_r2). I1_1 < I1_2 < ... < I1_r1 and I2_1 < I2_2 < ... < I2_r2. Outputs Ls1,Ls2 : lists (Isi_1,...,Isi*_r1) where Isi_j is a binary rational subinterval of Ii_j containing the root of Ai in Ii_j. Each Is1_j is strongly disjoint from each Is2_j. ======================================================================*/ #include "saclib.h" void AMUPRLS(M,I,A1,A2,L1,L2, Ls1_,Ls2_) Word M,I,A1,A2,L1,L2, *Ls1_,*Ls2_; { Word I1,I2,Lp1,Lp2,Ls1,Ls2,s; /* hide Lp1,Lp2,s; */ Step1: /* Initialize. */ if (L1 == NIL || L2 == NIL) { Ls1 = L1; Ls2 = L2; goto Return; } ADV(L1,&I1,&Lp1); Ls1 = NIL; ADV(L2,&I2,&Lp2); Ls2 = NIL; Step2: /* Refine and merge. */ do { AMUPRRS(M,I,A1,A2,I1,I2,&I1,&I2,&s); if (s < 0) { Ls1 = COMP(I1,Ls1); if (Lp1 != NIL) ADV(Lp1,&I1,&Lp1); else I1 = 0; } else { Ls2 = COMP(I2,Ls2); if (Lp2 != NIL) ADV(Lp2,&I2,&Lp2); else I2 = 0; } } while (!(I1 == 0 || I2 == 0)); Step3: /* Finish. */ if (I1 == 0) { Ls2 = COMP(I2,Ls2); while (Lp2 != NIL) { ADV(Lp2,&I2,&Lp2); Ls2 = COMP(I2,Ls2); } } else { Ls1 = COMP(I1,Ls1); while (Lp1 != NIL) { ADV(Lp1,&I1,&Lp1); Ls1 = COMP(I1,Ls1); } } Ls1 = INV(Ls1); Ls2 = INV(Ls2); Return: /* Prepare for return. */ *Ls1_ = Ls1; *Ls2_ = Ls2; return; } saclib2.2.8/src/RIPROD.c0000664002275300236100000000332314017255270013703 0ustar wcbrownscs/*====================================================================== d <- RIPROD(I,J) Rational interval product. Inputs I, J : rational intervals. Outputs K : a rational interval. K=I+J. ======================================================================*/ #include "saclib.h" Word RIPROD(I,J) Word I,J; { Word K; Word L,a,a1,a2,b,b1,b2,cp1,cp2,c1,c2; Step1: /* Extract endpoints. */ FIRST2(I,&a1,&a2); FIRST2(J,&b1,&b2); Step2: /* a1 >= 0. */ if (RNSIGN(a1) >= 0) { if (RNSIGN(b1) >= 0) L = LIST4(a1,b1,a2,b2); else if (RNSIGN(b2) < 0) L = LIST4(a2,b1,a1,b2); else L = LIST4(a2,b1,a2,b2); goto Step5; } Step3: /* a2 < 0. */ if (RNSIGN(a2) < 0) { if (RNSIGN(b1) >= 0) L = LIST4(a1,b2,a2,b1); else if (RNSIGN(b2) < 0) L = LIST4(a2,b2,a1,b1); else L = LIST4(a1,b2,a1,b1); goto Step5; } Step4: /* a1 < 0 <= a2. */ if (RNSIGN(b1) >= 0) L = LIST4(a1,b2,a2,b2); else if (RNSIGN(b2) < 0) L = LIST4(a2,b1,a1,b1); else L = CONC(LIST4(a1,b2,a1,b1),LIST4(a2,b1,a2,b2)); Step5: /* Compute endpoints of K. */ ADV2(L,&a,&b,&L); c1 = RNPROD(a,b); ADV2(L,&a,&b,&L); c2 = RNPROD(a,b); if (L != NIL) { ADV2(L,&a,&b,&L); cp1 = RNPROD(a,b); c1 = RNMIN(c1,cp1); ADV2(L,&a,&b,&L); cp2 = RNPROD(a,b); c2 = RNMAX(c2,cp2); } Step6: /* Compose K. */ K = LIST2(c1,c2); Return: return(K); } saclib2.2.8/src/IUPVAR.c0000664002275300236100000000141514017255270013712 0ustar wcbrownscs/*====================================================================== n <- IUPVAR(A) Integral univariate polynomial variations. Inputs A : in Z[X], non-zero. Outputs n : the number of sign variations in the coefficients of A. ======================================================================*/ #include "saclib.h" Word IUPVAR(A) Word A; { Word Ap,a,e,n,s,t; /* hide algorithm */ Step1: /* Compute. */ n = 0; Ap = A; ADV2(Ap,&e,&a,&Ap); s = ISIGNF(a); while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); t = ISIGNF(a); if (s != t) { n = n + 1; s = t; } } Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/ILSA.c0000664002275300236100000000134214017255270013433 0ustar wcbrownscs/*====================================================================== ILSA(A,n,k) Integer left shift in array. Inputs A : an array of size n containing a non-negative integer a that is less than BETA^n / 2^k. n : a positive BETA-digit. k : a positive BETA-digit less than ZETA. Effect The integer a * 2^k replaces a in A. ======================================================================*/ #include "saclib.h" void ILSA(A,n,k) BDigit *A,n,k; { BDigit d,h,i; Step1: /* Shift. */ h = ZETA - k; A[n - 1] = A[n - 1] << k; for (i = n - 2; i >= 0; i--) { d = A[i] >> h; A[i + 1] = A[i + 1] | d; d = A[i] << k; A[i] = d & BETA1; } Return: /* Return. */ return; } saclib2.2.8/src/IBPPOS.c0000664002275300236100000000474414017255270013710 0ustar wcbrownscs/*===================================================================== L <- IBPPOS(A,a,b,e,k) Integral bivariate polynomial points on sections. Inputs A: an integral bivariate polynomial A(x,y) of positive degree in y. a,b: rational numbers, a < b, such that A(x,y) is delineable on the open interval (a,b). e: a positive binary rational number. k: an integer. Output L: Let r be the number of real roots of A(c,y) for any c in (a,b). If r = 0 then L = (). Otherwise, let m be the least integer such that m*e > a, n the greatest integer such that n*e < b. Let a_1,a_2,...,a_h be the numbers m*e,(m+1)*e,...,n*e. L is a list (a_1,L_1, ,a_2,L_2,...,a_h,L_h), where each a_i is a logarithmic binary rational number and L_i is a list (b_1,b_2,...,b_r) of logarithmic binary rational numbers such that the i-th real root of A(a_i,y) is either equal to b_i or is in the open interval (b_i,b_i + 2^{-k}) for 1 <= i <= r. ======================================================================*/ #include "saclib.h" Word IBPPOS(A,a,b,e,k) Word A,a,b,e,k; { Word a1,a2,a3,B,c,d,E,I,L,L1,L2,m,q; Step1: /* Compute m and initialize c to a_1. */ q = RNQ(a,e); m = ISUM(RNFLOR(q),1); c = RNPROD(RNINT(m),e); Step2: /* Initialize L. */ L = NIL; Step3: /* Test for completion. */ if (RNCOMP(c,b) >= 0) goto Step9; Step4: /* Compute B(y) = A(c,y). */ B = IPBREI(2,A,1,c); Step5: /* If this is the first or second loop execution, isolate and refine the real roots of B, extract the left endpoints, and go to Step7, but if r = 0, return. */ if (L == NIL || RED2(L) == NIL) { L1 = IPRRIRDB(B,-k); if (L1 == NIL) goto Return; L2 = NIL; while (L1 != NIL) { ADV(L1,&I,&L1); d = FIRST(I); L2 = COMP(d,L2); } L1 = INV(L2); goto Step7; } Step6: /* Otherwise, compute estimates for the roots using linear interpolation and apply IUPRRAFE. */ L2 = FIRST(L); L1 = THIRD(L); E = NIL; while (L2 != NIL) { ADV(L1,&a1,&L1); ADV(L2,&a2,&L2); d = LBRNDIF(a2,a1); a3 = LBRNSUM(a2,d); E = COMP(a3,E); } E = INV(E); L1= IUPRRAFE(B,E,k); Step7: /* Prefix c and L1 to the list L. */ L = COMP2(L1,RNLBRN(c),L); Step8: /* Increment c and go back to Step3. */ c = RNSUM(c,e); goto Step3; Step9: /* Invert the list L. */ L = INV(L); Return: /* Return L. */ return(L); } saclib2.2.8/src/IPTR.c0000664002275300236100000000157014017255270013464 0ustar wcbrownscs/*====================================================================== B <- IPTR(r,A,i,h) Integral polynomial translation, specified variable. Inputs r : A BETA-digit. r >= 0. A : an element of Z[X1,...,Xr]. i : 1 <= i <= r. Outputs B : an element of Z[X1,...,Xr]. B(X1,...,Xi,...,Xr) = A(X1,...,X{i-1},Xi + h,X{i+1},...,Xr). ======================================================================*/ #include "saclib.h" Word IPTR(r,A,i,h) Word r,A,i,h; { Word B; Word At,Bt; Step1: /*[A=0.]*/ if (A == 0) { B = 0; goto Return; } Step2: /* i=1. */ if (i == 1) { B = IPTRLV(r,A,h); goto Return; } Step3: /* i>1. */ At = PCPV(r,A,1,i); Bt = IPTRLV(r,At,h); B = PICPV(r,Bt,1,i); Return: return(B); } saclib2.2.8/src/IPFSD.c0000664002275300236100000000207214017255270013551 0ustar wcbrownscs/*=========================================================================== L <- IPFSD(r,A) Integral polynomial factorization, second derivative. Inputs A : in Z[X1,...,Xr], positive, primitive, deg(A) > 0. r : a BETA-digit, r >= 1. Outputs L : a list (A1,...,Ak) where k >= 1, Ai in Z[X1,...,Xr], positive, primitive, 0 < deg(Ai) <=2 or gcd(Ai,A''i)=1 (where A''i is the second derivative of Ai). A = A1 +...+Ak. ===========================================================================*/ #include "saclib.h" Word IPFSD(r,A) Word r,A; { Word B,B1,B2,Bpp,C,L,S,n; Step1: /* Compute. */ L = NIL; S = LIST1(A); do { ADV(S,&B,&S); n = PDEG(B); if (n <= 2) L = COMP(B,L); else { Bpp = IPHDMV(r,B,2); IPGCDC(r,B,Bpp,&C,&B1,&B2); if (IPONE(r,C) == 1) L = COMP(B,L); else S = COMP2(B1,C,S); } } while (S != NIL); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IPSRM.c0000664002275300236100000000361414017255270013601 0ustar wcbrownscs/*====================================================================== L <- IPSRM(A,I) Integral polynomial strong real root isolation, modified Uspensky method. Inputs A : in Z[X], without multiple roots and with no real roots in common with A''. I : either the null list () or a standard interval or an interval whose positive and non-negative parts are standard. Outputs L : a list (I1,...,Ir) of isolating intervals for all the real roots of A if I=(), or for all the real roots of A in I if I /= (). The intervals Ij contain no roots of A' or A'', are left-open and right-closed, have binary rational endpoints, and satisfy I1 < I2 < ... < Ir. ======================================================================*/ #include "saclib.h" Word IPSRM(A,I) Word A,I; { Word I1,I2,L,L1,L2,a,b,n; /* hide L,n; */ Step1: /* Degree zero. */ n = PDEG(A); if (n == 0) { L = NIL; goto Return; } Step2: /* Compute intervals. */ if (I == NIL) { b = IUPRB(A); a = RNNEG(b); I1 = LIST2(a,0); I2 = LIST2(0,b); } else { FIRST2(I,&a,&b); if (RNSIGN(a) >= 0) { I1 = NIL; I2 = I; } else if (RNSIGN(b) <= 0) { I1 = I; I2 = NIL; } else { I1 = LIST2(a,0); I2 = LIST2(0,b); } } Step3: /* Compute non-positive roots. */ if (I1 != NIL) L1 = IPSRMS(A,I1); else L1 = NIL; Step4: /* Compute positive roots. */ if (I2 != NIL) L2 = IPSRMS(A,I2); else L2 = NIL; Step5: /* Concatenate. */ L = CONC(L1,L2); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/RUPFMRC.c0000664002275300236100000000521414017255270014023 0ustar wcbrownscs/*=========================================================================== RUPFMRC(M1,M1p,m1,C1,L1,M2,M2p,m2,C2; L2,C) Rational univariate polynomial from modular residues, with comparison. Inputs M1 : in Z, M1 odd. M1p: in Z, M1p = floor((M1/2)^(1/2)). m1 : a BETA-digit, m1 = ILOG2(M1p). C1 : in Z/(M1)[x]. L1 : a (possibly empty) list of rational numbers. Let (c_1,c_2,...,c_n) be the list of non-zero coefficients of C1 sorted by decreasing powers of x (i.e., if c_i is the coefficient of x^e in C1, and c_j that of x^f, then i < j iff e > f). If L1 is non-NIL, then L1 = (r_1,r_2,...,r_k), with r_i = c_i (mod M1), for some k <= n. Possibly, r_k = NIL, in which case, there is no rational number congruent to c_k modulo M1 whose numerator and denominator are both bounded in absolute value by M1p. M2 : in Z, M2 odd. M2p: in Z, M2p = floor((M2/2)^(1/2)). m2 : a BETA-digit, m2 = ILOG2(M2p). C2 : in Z/(M2)[x]. Outputs L2 : a (possibly empty) list of rational numbers. L2 satisfies conditions similar to those satisfied by L1, but with C1 replaced by C2. C : in Q[x] or NIL. If it exists, C is the unique element of Q[x] such that C1 = H_M1(C), C2 = H_M2(C) and all numerators and denominators of the coefficients of C are less than MIN( (M1/2)^(1/2), (M2/2)^(1/2) ) in absolute value. Otherwise, C = NIL. ===========================================================================*/ #include "saclib.h" void RUPFMRC(M1,M1p,m1,C1,L1,M2,M2p,m2,C2, L2_,C_) Word M1,M1p,m1,C1,L1,M2,M2p,m2,C2, *L2_,*C_; { Word C,C1p,C2p,L1p,L2,d1,d2,c1,c2,r1,r2; Step1: /* C1 = 0 \/ C2 = 0 */ if (C1 == 0 || C2 == 0) { L2 = NIL; if (C1 == C2) C = 0; else C = NIL; goto Return; } Step2: /* Initialize. */ L1p = L1; L2 = NIL; C = NIL; C1p = C1; C2p = C2; Step3: /* Recover rational coefficients, if possible. */ while (C1p != 0 || C2p != 0) { PADV(C1p,&d1,&c1,&C1p); PADV(C2p,&d2,&c2,&C2p); if (d1 != d2) { L2 = INV(L2); C = NIL; goto Return; } if (L1p == NIL) { if (ISIGNF(c1) < 0) c1 = ISUM(M1,c1); r1 = RNFMR(M1,M1p,m1,c1); } else ADV(L1p,&r1,&L1p); if (r1 == NIL) { L2 = INV(L2); C = NIL; goto Return; } if (ISIGNF(c2) < 0) c2 = ISUM(M2,c2); r2 = RNFMR(M2,M2p,m2,c2); L2 = COMP(r2,L2); if (EQUAL(r1,r2)) C = COMP2(r1,d1,C); else { L2 = INV(L2); C = NIL; goto Return; } } C = INV(C); Return: /* Prepare for return. */ *L2_ = L2; *C_ = C; } saclib2.2.8/src/SDIFF.c0000664002275300236100000000213214017255270013534 0ustar wcbrownscs/*====================================================================== C <- SDIFF(A,B) Set difference. Inputs A,B : ordered lists of of BETA-integers. (A, B represent sets of BETA-integers). Outputs C : the ordered list representing the difference of the sets A and B. ======================================================================*/ #include "saclib.h" Word SDIFF(A,B) Word A,B; { Word Ap,Bp,C,Cp,a,b; /* hide Ap,Bp,C,a,b; */ Step1: /* Compute. */ Cp = NIL; Ap = A; Bp = B; while (Ap != NIL && Bp != NIL) { a = FIRST(Ap); b = FIRST(Bp); if (a == b) { Ap = RED(Ap); Bp = RED(Bp); } else if (a < b) { Cp = COMP(a,Cp); Ap = RED(Ap); } else Bp = RED(Bp); } if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/ENDSACLIB.c0000664002275300236100000000161714017255270014174 0ustar wcbrownscs/*====================================================================== ENDSACLIB(f) End saclib. Inputs f : a BETA-digit. f = SAC_KEEPMEM, if all memory allocated by a call to GCAMALLOC() should be kept, f = SAC_FREEMEM, if it should be deallocated. Side effects Cleans up the environment of the SACLIB. ======================================================================*/ #include "saclib.h" void ENDSACLIB(f) Word f; { Word i; Step1: /* Release the SPACE. */ free(SPACE); Step2: /* Release the memory allocated using GCAMALLOC(). */ if (f == SAC_FREEMEM) { for (i=1; i<=NUp; i++) if (GCASPACE[i].array != (Word *)0) free(GCASPACE[i].array); } else GCAFREE(GCAPTR1); Step3: /* Release the GCASPACE. */ free(GCASPACE); Return: /* Prepare for return. */ return; } saclib2.2.8/src/GIFQA.c0000664002275300236100000000136614017255270013540 0ustar wcbrownscs/*======================================================================= b = GIFQA(a) Gaussian integer first quadrant associate. Input a : a nonzero Gaussian integer. Output b : b is the first quadrant associate of a. =======================================================================*/ #include "saclib.h" Word GIFQA(a) Word a; { Word a1,a2,b; BDigit s,t; Step1: /* Case analysis. */ FIRST2(a, &a1,&a2); s = ISIGNF(a1); t = ISIGNF(a2); if (s == 1 && t >= 0) { b = a; goto Return; } if (t == 1 && s <= 0) { b = LIST2(a2,INEG(a1)); goto Return; } if (s < 0 && t <= 0) { b = LIST2(INEG(a1),INEG(a2)); goto Return; } b = LIST2(INEG(a2),a1); Return: /* Return b. */ return(b); } saclib2.2.8/src/MPQR.c0000664002275300236100000000272014017255270013463 0ustar wcbrownscs/*====================================================================== MPQR(r,p,A,B; Q,R) Modular polynomial quotient and remainder. Inputs A,B : in Z/(p)[X1,...,Xr], B non-zero. r : a BETA-digit, r >= 1, the number of variables. p : a prime BETA-digit. Outputs Q,R : in Z/(p)[X1,...,Xr], the unique polynomials such that either B divides A, Q=A/B and R=0 or else B does not divide A and A=BQ+R with deg(R) minimal. ======================================================================*/ #include "saclib.h" void MPQR(r,p,A,B, Q_,R_) Word r,p,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,b,d,m,n,q,rp,s; /* hide Rp,a,d,m,n,rp; */ Step1: /* Initialize. */ n = PDEG(B); b = PLDCF(B); Bp = PRED(B); Q = NIL; R = A; rp = r - 1; Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); if (rp == 0) { q = MDQ(p,a,b); s = 0; } else MPQR(rp,p,a,b,&q,&s); if (s != 0) goto Step3; Q = COMP2(q,d,Q); Q1 = LIST2(d,q); Rp = PRED(R); Qp = MPPROD(r,p,Bp,Q1); R = MPDIF(r,p,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/IDPR.c0000664002275300236100000000363514017255270013450 0ustar wcbrownscs/*=========================================================================== C <- IDPR(A,b) Integer-digit product. Inputs A : in Z. b : BETA-digit. Outputs C : the product of A and b. ===========================================================================*/ #include "saclib.h" Word IDPR(A,b) Word A,b; { Word Ap,C,Cp,Cpp,a,c,cp,e,f,s,t; Step1: /* A or b zero. */ if (A == 0 || b == 0) { C = 0; goto Return; } Step2: /* A single-precision. */ if (A < BETA) { DPR(A,b,&e,&f); if (e == 0) C = f; else C = LIST2(f,e); goto Return; } Step3: /* Determine signs of inputs. */ s = ISIGNF(A); t = signm(b); Step4: /* Initialize and branch on signs. */ if (AVAIL == NIL) GC(); C = AVAIL; Cpp = C; Ap = A; if (s != t) goto Step6; Step5: /* Positive product. */ cp = 0; do { Cp = Cpp; a = FIRST(Ap); Ap = RED(Ap); DPR(a,b,&e,&f); c = f + cp; cp = e; if (c >= BETA) { c = c - BETA; cp = cp + 1; } SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (Ap != NIL); if (cp != 0) { SFIRST(Cpp,cp); AVAIL = RED(Cpp); SRED(Cpp,NIL);} else { AVAIL = Cpp; SRED(Cp,NIL);} goto Return; Step6: /* Negative product. */ cp = 0; do { Cp = Cpp; a = FIRST(Ap); Ap = RED(Ap); DPR(a,b,&e,&f); c = f + cp; cp = e; if (c <= -BETA) { c = c + BETA; cp = cp - 1; } SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (Ap != NIL); if (cp != 0) { SFIRST(Cpp,cp); AVAIL = RED(Cpp); SRED(Cpp,NIL);} else { AVAIL = Cpp; SRED(Cp,NIL);} Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/FREEMATRIX.c0000664002275300236100000000117514017255270014355 0ustar wcbrownscs/*=========================================================================== FREEMATRIX(A,n) Free matrix. Input A : a pointer to an array of pointers to Words. The memory for A was allocated by the function GETMATRIX. n : the dimension of A (the number of pointers). Side effect The memory allocated to A is freed. ===========================================================================*/ #include "saclib.h" void FREEMATRIX(A,n) Word **A,n; { Word i; Step1: /* Free memory. */ for (i = 0; i < n; i++) FREEARRAY(A[i]); free(A); Return: /* Prepare for return. */ return; } saclib2.2.8/src/SUFFIX.c0000664002275300236100000000100614017255270013704 0ustar wcbrownscs/*====================================================================== Lp <- SUFFIX(L,b) Suffix. Inputs L : a list (a1,...,an), n >= 0 b : object. Outputs Lp : the list (a1,...,an,b). L is modified. ======================================================================*/ #include "saclib.h" Word SUFFIX(L,b) Word L,b; { Word Lp; /* hide algorithm */ Step1: /* Get it. */ Lp = CONC(L,LIST1(b)); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/ISUM.c0000664002275300236100000000774714017255270013477 0ustar wcbrownscs/*=========================================================================== C <- ISUM(A,B) Integer sum. Inputs A,B : in Z. Output C : A + B. ===========================================================================*/ #include "saclib.h" Word ISUM(A,B) Word A,B; { Word Ap,Bp,C,Cb,Cp,Cpp,Cs,a,b,c,cp,s,t,u; Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* A and B single-precision. */ if (A < BETA && B < BETA) { c = A + B; if (c >= BETA) C = LIST2(c - BETA,1); else if (c <= -BETA) C = LIST2(c + BETA,-1); else C = c; goto Return; } Step3: /* Determine signs of inputs. */ s = ISIGNF(A); t = ISIGNF(B); Step4: /* A or B single-precision. */ if (A < BETA) Ap = LIST1(A); else Ap = A; if (B < BETA) Bp = LIST1(B); else Bp = B; Step5: /* Initialize and branch on signs. */ if (AVAIL == NIL) GC(); C = AVAIL; Cpp = C; if (s != t) goto Step8; else if (s < 0) goto Step7; Step6: /* A and B both positive, add with carry. */ cp = 0; do { Cp = Cpp; if (Ap != NIL) { a = FIRST(Ap); Ap = RED(Ap); } else a = 0; if (Bp != NIL) { b = FIRST(Bp); Bp = RED(Bp); } else b = 0; c = a + b; c = c + cp; if (c >= BETA) { c = c - BETA; cp = 1; } else cp = 0; SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (cp != 0 || (Ap != NIL && Bp != NIL)); if (Ap == NIL) Ap = Bp; AVAIL = Cpp; SRED(Cp,Ap); goto Return; Step7: /* A and B both negative, add with carry. */ cp = 0; do { Cp = Cpp; if (Ap != NIL) { a = FIRST(Ap); Ap = RED(Ap); } else a = 0; if (Bp != NIL) { b = FIRST(Bp); Bp = RED(Bp); } else b = 0; c = a + b; c = c + cp; if (c <= -BETA) { c = c + BETA; cp = -1; } else cp = 0; SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (cp != 0 || (Ap != NIL && Bp != NIL)); if (Ap == NIL) Ap = Bp; AVAIL = Cpp; SRED(Cp,Ap); goto Return; Step8: /* Opposite signs, add without carry. */ u = 0; do { Cp = Cpp; a = FIRST(Ap); Ap = RED(Ap); b = FIRST(Bp); Bp = RED(Bp); c = a + b; if (c != 0) u = c; SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (Ap != NIL && Bp != NIL); if (Ap == NIL) { Ap = Bp; s = t; } Step9: /* Sum zero. */ if (u == 0 && Ap == NIL) { AVAIL = C; C = 0; goto Return; } Step10: /* Continue with longer input. */ if (u == 0 || (Ap != NIL && s != SIGN(u))) { do { Cp = Cpp; a = FIRST(Ap); Ap = RED(Ap); SFIRST(Cp,a); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (a == 0); u = a; } AVAIL = Cpp; SRED(Cp,NIL); Step11: /* Normalize the sum. */ Cb = C; Cs = 0; cp = 0; if (u < 0) do { c = FIRST(Cb); c = c + cp; if (c > 0) { c = c - BETA; cp = 1; } else cp = 0; if (c != 0) Cs = Cb; SFIRST(Cb,c); Cb = RED(Cb); } while (Cb != NIL); else do { c = FIRST(Cb); c = c + cp; if (c < 0) { c = c + BETA; cp = -1; } else cp = 0; if (c != 0) Cs = Cb; SFIRST(Cb,c); Cb = RED(Cb); } while (Cb != NIL); Step12: /* Concatenate or delete leading zeros. */ if (Ap == NIL) SRED(Cs,NIL); else SRED(Cp,Ap); if (RED(C) == NIL) C = FIRST(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/GCAMALLOC.c0000664002275300236100000000225614017255270014172 0ustar wcbrownscs/*====================================================================== A <- GCAMALLOC(s,f) Garbage collected array memory allocation. Inputs s : a BETA-digit, the size of the array in Words. f : a BETA-digit. f = GC_CHECK, if the array will contain list or GCA handles, f = GC_NO_CHECK, otherwise. Outputs A : a GCA handle (NOT the memory pointer) for the array. Side effects A cell is taken from GCAAVAIL, an array of s Words is allocated from the heap. If GCAAVAIL is empty, GC() is called. ======================================================================*/ #include "saclib.h" Word GCAMALLOC(s,f) Word s,f; { Word A; Step1: /* Is GCAAVAIL empty? */ if (GCAAVAIL == NIL) GC(); Step2: /* Get new cell. */ A = GCAAVAIL; GCAAVAIL = GCASPACEBp[A].next; GCASPACEBp[A].next = NIL; Step3: /* Allocate memory. */ GCASPACEBp[A].array = (Word *)malloc((unsigned)(sizeof(Word)*s)); if (GCASPACEBp[A].array == (Word *)0) FAIL("GCAMALLOC","Out of memory."); GCASPACEBp[A].len = s; GCASPACEBp[A].flag = f; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/FIRST3.c0000664002275300236100000000114314017255270013654 0ustar wcbrownscs/*====================================================================== FIRST3(L; a1,a2,a3) First 3. Inputs L : list of length 3 or more. Outputs a1, a2, a3 : the first three elements of L. ======================================================================*/ #include "saclib.h" void FIRST3(L, a1_,a2_,a3_) Word L, *a1_,*a2_,*a3_; { Word Lp,a1,a2,a3; /* hide algorithm */ Step1: /* Get them. */ ADV2(L,&a1,&a2,&Lp); a3 = FIRST(Lp); Return: /* Prepare for return. */ *a1_ = a1; *a2_ = a2; *a3_ = a3; return; } saclib2.2.8/src/IDREM.c0000664002275300236100000000104314017255270013541 0ustar wcbrownscs/*========================================================================== r <- IDREM(A,b) Integer-digit remainder. Inputs A : in Z. b : non-zero BETA-digit. Outputs r : in Z. r = A - b * Q, where Q is the integral part of A / b. ==========================================================================*/ #include "saclib.h" Word IDREM(A,b) Word A,b; { Word Q,r; /* hide algorithm */ Step1: /* Compute. */ IDQR(A,b,&Q,&r); Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/THIRD.c0000664002275300236100000000072614017255270013562 0ustar wcbrownscs/*====================================================================== a <- THIRD(L) Third. Inputs L : list of length 3 or more. Outputs a : the third element of L. ======================================================================*/ #include "saclib.h" Word THIRD(L) Word L; { Word a; /* hide algorithm */ Step1: /* Get it. */ a = FIRST(RED2(L)); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/IPBEZM.c0000664002275300236100000000310314017255270013666 0ustar wcbrownscs/*======================================================================= M <- IPBEZM(r,A,B) Integral polynomial Bezout matrix. Inputs r : a positive beta-digit. A, B : integral polynomials in r variables with deg(A) >= deg(B) >= 1. Output M : the Bezout matrix of A and B, a square matrix of order deg(A), represented row-wise as a list of lists. =======================================================================*/ #include "saclib.h" Word IPBEZM(r,A,B) BDigit r; Word A,B; { BDigit a,b,e,k,m,n; Word Ab,Ap,Bb,Bp,C,D,E,L,L2,M; Step1: /* Get the degrees, m and n. */ m = PDEG(A); n = PDEG(B); Step2: /* Compute the n Bezout polynomials. */ L = NIL; for (k = 1; k <= n; k++) { Ap = A; while (Ap != 0 && PDEG(Ap) > m - k) Ap = PRED(Ap); Bp = B; Bb = NIL; while (Bp != NIL && FIRST(Bp) > n - k) { ADV2(Bp,&e,&b,&Bp); Bb = COMP2(b,e - n + k - 1,Bb); } Bb = INV(Bb); C = IPPROD(r,Ap,Bb); Bp = B; while (Bp != 0 && PDEG(Bp) > n - k) Bp = PRED(Bp); Bp = PMPMV(Bp,m - n); Ap = A; Ab = NIL; while (Ap != NIL && FIRST(Ap) > m - k) { ADV2(Ap,&e,&a,&Ap); Ab = COMP2(a,e - m + k - 1,Ab); } Ab = INV(Ab); D = IPPROD(r,Bp,Ab); E = IPDIF(r,D,C); L = COMP(E,L); } Step3: /* Append the m - n multiples of B. */ L2 = NIL; for (k = m - n - 1; k >= 0; k--) { E = PMPMV(B,k); L2 = COMP(E,L2); } L2 = INV(L2); L = CONC(L,L2); Step4: /* Make a matrix of the polynomial coefficients. */ M = MCPMV(m,L); Return: /* Return M. */ return(M); } saclib2.2.8/src/IPSBLSSIL.c0000664002275300236100000000404314017255270014250 0ustar wcbrownscs/*===================================================================== L <- IPSBLSSIL(A) Integral polynomial squarefree basis labeled strong standard isolation list. Input A : A squarefree basis of integral polynomials, A = (A_1,...,A_m). Output L : A labeled strong standard isolation list for the real roots of A. =====================================================================*/ #include "saclib.h" Word IPSBLSSIL(A) Word A; { Word A1,A2,a1,a2,b1,b2,c,L,Lp,Lpp,I1,I2,s,T1,T2,t1,t2; Step1: /* Apply IPSBLSIL to A. */ L = IPSBLSIL(A); Step2: /* Initialize refinement loop. */ Lp = L; Step3: /* Refinement loop; if two consecutive intervals are adjacent, refine one until they are not. */ while (Lp != NIL && RED(Lp) != NIL) { Lpp = RED(Lp); T1 = FIRST(Lp); T2 = FIRST(Lpp); FIRST3(T1,&I1,&A1,&t1); FIRST3(T2,&I2,&A2,&t2); FIRST2(I1,&a1,&b1); FIRST2(I2,&a2,&b2); if (EQUAL(b1,a2)) { if (!EQUAL(a1,b1)) { do { c = LSIM(a1,b1); s = IUPBRES(A1,c); if (s == -t1) a1 = c; else { b1 = c; if (s == 0) a1 = c; } } while (s == -t1); I1 = LIST2(a1,b1); T1 = LIST3(I1,A1,t1); SFIRST(Lp,T1); } else { do { c = LSIM(a2,b2); s = IUPBRES(A2,c); if (s == t2) b2 = c; else { a2 = c; if (s == 0) b2 = c; } } while (s == t2); I2 = LIST2(a2,b2); T2 = LIST3(I2,A2,t2); SFIRST(Lpp,T2); } } Lp = RED(Lp); } Return: /* Return L. */ return(L); } saclib2.2.8/src/MMPEV.c0000664002275300236100000000214214017255270013566 0ustar wcbrownscs/*====================================================================== B <- MMPEV(r,m,A,k,a) Matrix of modular polynomials evaluation. Inputs r : a BETA-digit, r >= 1. m : a BETA-digit, m > 0. A : a matrix over Z/(m)[X1,...,Xr]. k : a BETA-digit, 1 <= k <= r. a : in Z/(m). Outputs B : a matrix over Z/(m)[X1,...,X_{k-1},X_{k+1},...,Xr], where b_{i,j}(X1,...,X_{k-1},X_{k+1},...,Xr) = a_{i,j}(X1,...,X_{k-1},a,X_{k+1},...,Xr). ======================================================================*/ #include "saclib.h" Word MMPEV(r,m,A,k,a) Word r,m,A,k,a; { Word A1,A11,Ap,B,B1,B11; /* hide A1,A11,Ap; */ Step1: /* Compute. */ Ap = A; B = NIL; do { ADV(Ap,&A1,&Ap); B1 = NIL; do { ADV(A1,&A11,&A1); B11 = MPEVAL(r,m,A11,k,a); B1 = COMP(B11,B1); } while (A1 != NIL); B1 = INV(B1); B = COMP(B1,B); } while (Ap != NIL); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPSCPP.c0000664002275300236100000000204314017255270013700 0ustar wcbrownscs/*=========================================================================== IPSCPP(r,A; s,C,Ab) Integral polynomial sign, content, and primitive part. Inputs r : a BETA-digit, r > 0. A : in Z[x_1,...,x_r]. Outputs s : a BETA-digit, the sign of A. C : in Z[x_1,...,x_{r-1}], the content of A. Ab : in Z[x_1,...,x_r], the primitive part of A. ===========================================================================*/ #include "saclib.h" void IPSCPP(r,A, s_,C_,Ab_) Word r,A, *s_,*C_,*Ab_; { Word A1,Ab,Ap,C,C1,e,rp,s; Step1: /* A = 0. */ if (A == 0) { s = 0; C = 0; Ab = 0; goto Return; } Step2: /* A /= 0. */ s = IPSIGN(r,A); Ap = IPABS(r,A); rp = r - 1; C = IPC(r,Ap); if (IPONE(rp,C) == 1) Ab = Ap; else { Ab = NIL; do { ADV2(Ap,&e,&A1,&Ap); C1 = IPEQ(rp,A1,C); Ab = COMP2(C1,e,Ab); } while (Ap != NIL); Ab = INV(Ab); } Return: /* Prepare for return. */ *s_ = s; *C_ = C; *Ab_ = Ab; return; } saclib2.2.8/src/PCONST.c0000664002275300236100000000146314017255270013715 0ustar wcbrownscs/*====================================================================== b <- PCONST(r,A) Polynomial constant. Inputs A : a polynomial in r variables. r : a BETA-digit,r >= 1. Outputs b : integer, b = 1 if A is a constant polynomial, otherwise b = 0. ======================================================================*/ #include "saclib.h" Word PCONST(r,A) Word r,A; { Word Ap,b,i; /* hide algorithm */ Step1: /* A = 0. */ b = 1; if (A == 0) goto Return; Step2: /* A /= 0. */ Ap = A; for (i = 1; i <= r; i++) { if (PDEG(Ap) != 0) { b = 0; goto Return; } else Ap = PLDCF(Ap); } Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/IUSFPMF.c0000664002275300236100000000677314017255270014031 0ustar wcbrownscs/*=========================================================================== IUSFPMF(A; p,F,C,L) Integral univariate squarefree polynomial modular factorization. Input A : in Z[x], squarefree, positive, primitive, and of positive degree. Outputs p : in Z, the least examined prime in SPRIME for which A has the fewest modular factors, unless A is found to be irreducible, in which case p = 0. F : a list (A_1,...,A_r) of monic irreducible elements of Z/(p)[x] such that A = a A_1 ... A_r (mod p) where a = ldcf(A) (mod p). If p = 0, then F = (). C : a characteristic set, the intersection of the degree sets of factorizations of A (mod q) over Z/(q) for as many as NPMODFAC primes q (fewer only if SPRIME is exhausted or A is proved irreducible; NPMODFAC is defined below). L : a list ((p_1,F_1),...,(p_t,F_t)) of pairs, t = NPMODFAC-1, where p_i is an element of SPRIME and F_i is the distinct- degree factorization of A (mod p_i), i.e., F_i is a list ((n_1,G_1),...,(n_k,G_k)) of pairs, where G_i is the product of all monic irreducible factors of A (mod p_i) of degree n_i. The prime p is not among the primes p_i in the list L. The order in which the p_i's appear in SPRIME is preserved in L. If p = 0, then L = NIL. ===========================================================================*/ #include "saclib.h" /* number of primes for modular factorization */ #define NPMODFAC 5 /* smallest prime for modular factorization */ #define SPMODFAC 3 void IUSFPMF(A, p_,F_,C_,L_) Word A, *p_,*F_,*C_,*L_; { Word B,B1,Bp,C,D,F,F1,Fp,G,H,H1,I,J,L,Lp,P,R, a,b,d,e,f,i,j,k,n,p,q; Step1: /* Initialize. */ p = 0; F = NIL; n = PDEG(A); I = CSUN(IMP2(1,n),1); n = n + 1; C = IDIF(IMP2(1,n),1); L = NIL; a = PLDCF(A); i = 0; P = RED(SPRIME); /* skip over the prime 2 */ while (P != NIL && FIRST(P) < SPMODFAC) P = RED(P); J = PMON(1,0); Step2: /* Get the next suitable prime. */ if (P == NIL) FAIL("IUSFPMF","Prime list exhausted"); ADV(P,&q,&P); if (IDREM(a,q) != 0) { B = MPHOM(1,q,A); Bp = MUPDER(q,B); if (!EQUAL(MMPGCD(q,B,Bp),J)) { goto Step2; } } else { goto Step2; } Step3: /* Compute distinct degree factorization. */ B = MPMON(1,q,B); G = MMPDDF(q,B); Step4: /* Compute the factor degree set. */ H = G; R = NIL; F1 = NIL; k = 0; do { ADV(H,&H1,&H); FIRST2(H1,&f,&b); d = PDEG(b); e = d / f; k += e; for (j = 1; j <= e; j++) R = COMP(f,R); } while (H != NIL); D = CSFPAR(R); C = CSINT(C,D); if (EQUAL(C,I)) { p = 0; F = NIL; L = NIL; goto Return; } if (k < n) { p = q; F = G; n = k; } L = COMP(LIST2(q,G),L); i++; Step5: /* Loop. */ if (i < NPMODFAC) goto Step2; Step6: /* Remove F from the list L. */ Lp = NIL; while (L != NIL) { ADV(L,&G,&L); if (FIRST(G) != p) Lp = COMP(G,Lp); } L = Lp; Step7: /* Completely factor mod p. */ Fp = NIL; while (F != NIL) { ADV(F,&F1,&F); ADV2(F1,&f,&b,&F1); d = PDEG(b); if (d > f) { /* split equal degree factors */ B1 = MMPFBL(p,b,f); Fp = CONC(B1,Fp); } else Fp = COMP(b,Fp); } F = Fp; Return: /* Prepare for return. */ *p_ = p; *F_ = F; *C_ = C; *L_ = L; return; } saclib2.2.8/src/IPEVAL.c0000664002275300236100000000212014017255270013656 0ustar wcbrownscs/*====================================================================== B <- IPEVAL(r,A,i,a) Integral polynomial evaluation. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Z[x_1,...x_r]. i : in Z, 1 <= i <= r. a : in Z. Outputs B : in Z[x_1,...,x_{i-1},x_{i+1},...,x_r], B(x_1,...,x_{i-1},x_{i+1},...,x_r) = = A(x_1,...,x_{i-1},a,x_{i+1},...,x_r). ======================================================================*/ #include "saclib.h" Word IPEVAL(r,A,i,a) Word r,A,i,a; { Word A1,Ap,B,B1,e1,rp; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i = r. */ if (i == r) { B = IPEMV(r,A,a); goto Return; } Step3: /* i < r. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e1,&A1,&Ap); B1 = IPEVAL(rp,A1,i,a); if (B1 != 0) B = COMP2(B1,e1,B); } while (Ap != NIL); B = INV(B); if (B == NIL) B = 0; Return: /* Return B. */ return(B); } saclib2.2.8/src/RINT.c0000664002275300236100000000241214017255270013456 0ustar wcbrownscs/*====================================================================== Is <- RINT(I) Rational interval normalizing transformation. Inputs I : a rational interval (r,s) with r < s. Outputs Is : Let h=floor(lg(s-r))-1 and t=2^h. Is=(rs,ss) where rs is the greatest integer multiple of t which is less than or equal to r, and ss is the least integer multiple of t which is greater than or equal to s. Remarks I is contained in Is and ss-rs <= 2(s-r). ======================================================================*/ #include "saclib.h" Word RINT(I) Word I; { Word Is,d,h,k,kp,r,rs,s,ss,t; /* hide h,k,kp,r,s; */ Step1: /* Compute h=floor(log2(s-r))-1 and t=2^h. */ FIRST2(I,&r,&s); d = RNDIF(s,r); RNFCL2(d,&k,&kp); h = k - 1; t = RNP2(h); Step2: /* Compute rs. */ rs = RNFLOR(RNQ(r,t)); if (rs != 0) { rs = LIST2(rs,1); rs = RNPROD(rs,t); } Step3: /* Compute ss. */ ss = RNCEIL(RNQ(s,t)); if (ss != 0) { ss = LIST2(ss,1); ss = RNPROD(ss,t); } Step4: /* Finish. */ Is = LIST2(rs,ss); Return: /* Prepare for return. */ return(Is); } saclib2.2.8/src/RIB.c0000664002275300236100000000207614017255270013324 0ustar wcbrownscs/*====================================================================== t <- RIB(r,s) Rational interval bisection. Inputs r,s : binary rational numbers, r < s. Outputs t : a binary rational number with r < t < s, defined as follows. Let h = floor(log2(s-r)) and let c be the least integer such that c * 2^h > r. Then t = c2^h if c2^h < s and t = (2c-1)2^(h-1) otherwise. ======================================================================*/ #include "saclib.h" Word RIB(r,s) Word r,s; { Word H,c,d,e,h,hp,n,q,t; /* hide e,h,n; */ Step1: /* Compute h'=2^h. */ d = RNDIF(r,s); RNFCL2(d,&h,&n); hp = RNP2(h); Step2: /* Compute t. */ q = RNQ(r,hp); c = RNCEIL(q); c = RNINT(c); t = RNPROD(c,hp); e = RNCOMP(t,r); if (e == 0) t = RNSUM(t,hp); e = RNCOMP(t,s); if (e >= 0) { H = LIST2(1,2); hp = RNPROD(hp,H); t = RNDIF(t,hp); } Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/IORD2.c0000664002275300236100000000135114017255270013522 0ustar wcbrownscs/*=========================================================================== n <- IORD2(A) Integer, order of 2. Inputs A : in Z, A not 0. Outputs n : the largest integer n such that 2^n divides A. ===========================================================================*/ #include "saclib.h" Word IORD2(A) Word A; { Word a,Ap,n; Step1: /* Count low-order BETA-digits. */ n = 0; if (A < BETA) a = A; else { Ap = A; while (FIRST(Ap) == 0) { Ap = RED(Ap); n = n + ZETA; } a = FIRST(Ap); } Step2: /* Count low-order bits. */ a = absm(a); while ((a & 01) == 0) { a = a >> 1; n = n + 1; } Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/ODD.c0000664002275300236100000000100314017255270013303 0ustar wcbrownscs/*====================================================================== t <- ODD(a) Odd. Inputs a : a C integer. Outpus t : t=1 if a is odd and t=0 otherwise. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word ODD(a) Word a; { Word t; Step1: /* Decide. */ t = REM(a,2); if (t != 0) t = 1; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/IPRNME.c0000664002275300236100000000137014017255270013676 0ustar wcbrownscs/*=========================================================================== B <- IPRNME(r,A,b) Integral polynomial, rational number multiple evaluation. Inputs r : is a positive BETA-digit. A : is an element of Z[x_1,...,x_r]. b : is a list (b_1,...,b_k) of elements of Q, 1 <= k <= r. Output B : an element of Q[x_{k+1},...,x_r] such that B(x_{k+1},...,x_r) = A(b_1,...,b_k,x_{k+1},...,x_r). ===========================================================================*/ #include "saclib.h" Word IPRNME(r,A,b) Word r,A,b; { Word Ap,B; Step1: /* Convert A to a polynomial over Q. */ Ap = RPFIP(r,A); Step2: /* Evaluate at b. */ B = RPME(r,Ap,b); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MIDCRA.c0000664002275300236100000000173614017255270013651 0ustar wcbrownscs/*=========================================================================== As <- MIDCRA(M,m,mp,A,a) Modular integer digit chinese remainder algorithm. Inputs M : a positive integer. m : an odd positive BETA-integer. Gcd(M,m)=1. mp : the inverse of the image of M under the homomorphism H_m. A : an element of Z'_M. a : an element of Z_m. Outpus As : the unique element of Z'_Ms which is congruent to A modulo M and congruent to a modulo m, where Ms = M * m. ===========================================================================*/ #include "saclib.h" Word MIDCRA(M,m,mp,A,a) Word M,m,mp,A,a; { Word As,ab,b,d; Step1: /* As = A. */ ab = MDHOM(m,A); d = MDDIF(m,a,ab); if (d == 0) { As = A; goto Return; } Step2: /* General case. */ b = MDPROD(m,d,mp); if (b + b > m) b = b - m; As = ISUM(IDPR(M,b),A); Return: /* Prepare for return. */ return(As); } saclib2.2.8/src/MIPIPR.c0000664002275300236100000000131514017255270013703 0ustar wcbrownscs/*====================================================================== C <- MIPIPR(r,M,D,A,B) Modular integral polynomial mod ideal product. Inputs D : a list (d1,...,d_{r-1}) of non-negative BETA-digits. r : a BETA-digit, r >= 1. M : in Z, M > 0. A,B : in Z/(M)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d{r-1}). Outputs C : in Z/(M)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d{r-1}), C = A * B. ======================================================================*/ #include "saclib.h" Word MIPIPR(r,M,D,A,B) Word r,M,D,A,B; { Word C,Cp; Step1: /* Compute. */ Cp = IPIPR(r,D,A,B); C = MIPHOM(r,M,Cp); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPIHOM.c0000664002275300236100000000166514017255270013700 0ustar wcbrownscs/*=========================================================================== B <- IPIHOM(r,D,A) Integral polynomial mod ideal homomorphism. Inputs r : a BETA-digit, r >= 0, the number of variables. D : a list (d_1,...,d_{r-1}) of non-negative BETA-digits. A : in Z[x_1,...,x_r]. Outputs B : in Z[x_1,...,x_r]/(x_1^d_1,...,x_{r-1}^d_{r-1}), B = A mod (x_1^d_1,...,x_{r-1}^d_{r-1}). ======================================================================*/ #include "saclib.h" Word IPIHOM(r,D,A) Word r,D,A; { Word As,B,a,b,e,rp; Step1: /* r=0 or A=0. */ if (r == 0 || A == 0) { B = A; goto Return; } Step2: /* General case. */ rp = r - 1; B = NIL; As = CINV(A); while (As != NIL) { ADV2(As,&a,&e,&As); b = IPTRUN(rp,D,a); if (b != 0) B = COMP2(e,b,B); } if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/SEQUAL.c0000664002275300236100000000200414017255270013671 0ustar wcbrownscs/*====================================================================== b <- SEQUAL(A,B) Set equality. Inputs A : a list ( A1,...,Am ), m >= 0 B : a list ( B1,...,Bn ), n >= 0. Outputs b : an integer that has the value 1 if for each Ai there exists at least one Bj such that Ai = Bj, and for each Bj exists at least one Ai such that Bj = Ai. Otherwise b has the value 0. ======================================================================*/ #include "saclib.h" Word SEQUAL(A,B) Word A,B; { Word A1,Ap,B1,Bp,b; /* hide A1,Ap,B1,Bp,b; */ Step1: /* Decide. */ b = 1; Ap = A; while (Ap != NIL) { ADV(Ap,&A1,&Ap); b = MEMBER(A1,B); if (b == 0) goto Return; } Bp = B; while (Bp != NIL) { ADV(Bp,&B1,&Bp); b = MEMBER(B1,A); if (b == 0) goto Return; } Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/MPUPP.c0000664002275300236100000000124014017255270013601 0ustar wcbrownscs/*====================================================================== Ab <- MPUPP(r,p,A) Modular polynomial univariate primitive part. Inputs r : a BETA-digit, r >= 2. p : a BETA-digit, prime. A : in Z/(p)[X1,...,Xr]. Outputs Ab : in Z/(p)[X1,...,Xr]. If A non-zero then Ab = A/a where a is the univariate content of A. Otherwise, Ab = 0. ======================================================================*/ #include "saclib.h" Word MPUPP(r,p,A) Word r,p,A; { Word Ab,a; /* hide algorithm */ Step1: /* Compute. */ MPUCPP(r,p,A,&a,&Ab); Return: /* Prepare for return. */ return(Ab); } saclib2.2.8/src/MPFFPROD.c0000664002275300236100000000161214017255270014120 0ustar wcbrownscs/*======================================================================= C <- MPFFPROD(p,F,A,B) Medium prime finite field product. Inputs p : a medium prime. F : an irreducible monic polynomial over Z_p in array representation of degree n defining a finite field Gf(p^n). A, B : elements of GF(p^n) in array representation. Output C : C = A * B, an element of GF(p^n) in array representation. =======================================================================*/ #include "saclib.h" BDigit *MPFFPROD(p,F,A,B) BDigit p,*F,*A,*B; { BDigit *C,n,*P; Step1: /* Get array for product. */ n = MAPDEG(F); P = MAPGET(n + n); Step2: /* Compute product in Z_p[x]. */ MMAPPROD(p,A,B,P); Step3: /* Reduce product modulo F. */ MMAPREM(p,P,F); Step4: /* Copy result to a smaller array. */ C = MAPCOPY(P); MAPFREE(P); Return: /* Return C. */ return(C); } saclib2.2.8/src/ISLCOMB.c0000664002275300236100000000300214017255270013766 0ustar wcbrownscs/*=========================================================================== ISLCOMB(A,m,B,v,s; mp) Integer special linear combination. Inputs A, B : arrays containing integers A' and B', with A having length at least max(m,n) + 2. m, n : the lengths in BETA-digits of A' and B', respectively. v : a BETA-digit. s : the sign of A'' = A' + v * B'. Outputs mp : The length in BETA-digits of A''. Side effects A'' replaces A' in A. ===========================================================================*/ #include "saclib.h" void ISLCOMB(A,m,B,n,v,s, mp_) Word *A,m,*B,n,v,s, *mp_; { Word a,b,b0,b1,c0,c1,i,k,mp; Step1: /* Multiply and add. */ c1 = 0; k = maxm(m,n); for (i = 0; i < k; i++) { if (i < m) a = A[i]; else a = 0; if (i < n) b = B[i]; else b = 0; DPR(v,b,&b1,&b0); c0 = a + b0 + c1; c1 = b1; if (s > 0) { while (c0 <= 0) { c0 += BETA; c1--; } while (c0 >= BETA) { c0 -= BETA; c1++; } } else { while (c0 > 0) { c0 -= BETA; c1++; } while (c0 <= -BETA) { c0 += BETA; c1--; } } A[i] = c0; } if (absm(c1) >= BETA) { if (s > 0) { A[k] = c1 - BETA; A[k+1] = 1; } else { A[k] = c1 + BETA; A[k+1] = -1; } mp = k + 2; } else { A[k] = c1; mp = k + 1; } Step2: /* Determine lengths. */ while (mp > 0 && A[mp-1] == 0) mp--; Return: /* Prepare for return. */ *mp_ = mp; return; } saclib2.2.8/src/FSUMSESS.c0000664002275300236100000000263414017255270014160 0ustar wcbrownscs/*====================================================================== FSUMSESS(A,B,d,C) Floating-point sum, same exponents, same signs. Inputs A, B : two floating-point numbers having the same precisions, the same exponents and the same signs. d : a sign (rounding direction). C : an array large enough for the sum. Output C : a floating-point number approximating the sum of A and B, rounded according to IEEE standards. ======================================================================*/ #include "saclib.h" void FSUMSESS(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit c,e,f,i,p,r,s; Step1: /* Store exponent, sign and precision. */ C[0] = A[0] + 1; s = A[1]; C[1] = s; p = A[2]; C[2] = p; Step2: /* Set the rounding flag. */ e = A[3] + B[3]; if ((d == s && (e & 1)) || (d == 0 && (e & 1) && (e & 2))) r = 1; else r = 0; Step3: /* Add and shift right one bit. */ for (i = 4; i <= p+2; i++) { c = e >> ZETA; f = e & BETA1; e = A[i] + B[i] + c; C[i-1] = (f>>1) | ((e & 1) << (ZETA-1)); } C[p+2] = e >> 1; Step4: /* Round up if needed. */ if (r == 1) { C[3] = C[3] + 1; i = 3; while (C[i] == BETA) { C[i] = 0; i = i + 1; C[i] = C[i] + 1; } } Return: /* Return. */ return; } saclib2.2.8/src/SWRITE.c0000664002275300236100000000113314017255270013716 0ustar wcbrownscs/*====================================================================== SWRITE(s) String write. Inputs s : a character string (in C format, i.e. an array of char, ending with '\0'). Side effects s is written out to the output stream. ======================================================================*/ #include "saclib.h" void SWRITE(s) const char *s; { /* hide algorithm */ Step1: /* Write out the string. */ while (*s != '\0') { CWRITE(*s); s++; } Return: /* Prepare for return. */ return; } saclib2.2.8/src/SIDWRITE.c0000664002275300236100000000112514017255270014134 0ustar wcbrownscs/*====================================================================== SIDWRITE(I,k) Software interval decimal write. Inputs I : a software interval. k : a positive beta-digit. Effect The endpoints of I are written as decimal fractions with k digits following the decimal point. ======================================================================*/ #include "saclib.h" void SIDWRITE(I,k) BDigit *I,k; { Word J; Step1: /* Convert to logarithmic binary rational and write. */ J = SILBRI(I); LBRIDWRITE(J,k); Return: /* Return. */ return; } saclib2.2.8/src/AFUPSFBA.c0000664002275300236100000000222714017255270014075 0ustar wcbrownscs/*=========================================================================== Bs <- AFUPSFBA(M,A,B) Algebraic number field univariate polynomial squarefree basis augmentation. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A : in Q(alpha)[x], A monic, squarefree, of positive degree. B : a list (B1,...,Bs), s >= 0, of polynomials in Q(alpha)[x]. B is a squarefree basis. Outputs Bs : a list of polynomials in Q(alpha)[x], a coarsest squarefree basis for (A,B1,...,Bs). ===========================================================================*/ #include "saclib.h" Word AFUPSFBA(M,A,B) Word M,A,B; { Word Bs; Word Bp,B1,Ap,C,Abp,Bb1; Step1: Ap = A; Bp = B; Bs = NIL; while (Bp != NIL && PDEG(Ap) > 0) { ADV(Bp,&B1,&Bp); AFUPGC(M,Ap,B1,&C,&Abp,&Bb1); if (PDEG(C) > 0) Bs = COMP(C,Bs); if (PDEG(Bb1) > 0) Bs = COMP(Bb1,Bs); Ap = Abp; } if (PDEG(Ap) > 0) Bs = COMP(Ap,Bs); while (Bp != NIL) { ADV(Bp,&B1,&Bp); Bs = COMP(B1,Bs); } goto Return; Return: /* Prepare for return. */ return(Bs); } saclib2.2.8/src/AISUM.c0000664002275300236100000000514614017255270013567 0ustar wcbrownscs/*======================================================================== AISUM(A,B,C) Array integer sum. Inputs A, B: array integers. C : an array which must be at least as long as the maximum of the lengths of A and B plus 3. Effect The sum of A and B is placed in C. ========================================================================*/ #include "saclib.h" void AISUM(A,B,C) BDigit *A,*B,*C; { BDigit *Ap,*As,*Bp,*Bs,*Cs; BDigit c,d,e,i,k,m,n,s; Step1: /* A or B zero. */ if (A[0] == 0) { AICOPY(B,C); goto Return; } if (B[0] == 0) { AICOPY(A,C); goto Return; } Step2: /* Make the first addend be the longer. */ if (A[1] >= B[1]) { Ap = A; Bp = B; } else { Ap = B; Bp = A; } m = Ap[1]; n = Bp[1]; As = Ap + 2; Bs = Bp + 2; Cs = C + 2; Step3: /* The inputs have the same sign. */ if (A[0] != B[0]) goto Step4; c = 0; for (i = 0; i < n; i++) { d = As[i] + Bs[i] + c; if (d >= BETA) { Cs[i] = d - BETA; c = 1; } else { Cs[i] = d; c = 0; } } for (i = n; i < m; i++) { d = As[i] + c; if (d == BETA) { Cs[i] = 0; c = 1; } else { Cs[i] = d; c = 0; } } if (c != 0) { Cs[m] = c; m = m + 1; } C[1] = m; C[0] = A[0]; goto Return; Step4: /* The inputs have opposite signs and different lengths. */ if (m == n) goto Step5; s = Ap[0]; c = 0; for (i = 0; i < n; i++) { d = As[i] - Bs[i] + c; if (d < 0) { Cs[i] = d + BETA; c = -1; } else { Cs[i] = d; c = 0; } } for (i = n; i < m; i++) { d = As[i] + c; if (d < 0) { Cs[i] = d + BETA; c = -1; } else { Cs[i] = d; c = 0; } } i = i - 1; while (Cs[i] == 0) i = i - 1; C[1] = i + 1; C[0] = s; goto Return; Step5: /* A and B have opposite signs and equal lengths. */ k = m - 1; while (k >= 0 && As[k] == Bs[k]) k = k - 1; if (k == -1) { C[0] = 0; C[1] = 0; C[2] = 0; goto Return; } e = As[k] - Bs[k]; if (e > 0) C[0] = A[0]; else C[0] = B[0]; c = 0; if (e > 0) { for (i = 0; i <= k; i++) { d = As[i] - Bs[i] + c; if (d < 0) { Cs[i] = d + BETA; c = -1; } else { Cs[i] = d; c = 0; } } } else { for (i = 0; i <= k; i++) { d = Bs[i] - As[i] + c; if (d < 0) { Cs[i] = d + BETA; c = -1; } else { Cs[i] = d; c = 0; } } } while (Cs[k] == 0) k = k - 1; C[1] = k + 1; Return: /* Return. */ return; } saclib2.2.8/src/IPBEILV.c0000664002275300236100000000232314017255270013775 0ustar wcbrownscs/*====================================================================== B <- IPBEILV(r,A,c,k,m) Integral polynomial binary rational evaluation, integral polynomial result, leading variable. Inputs r : A BETA-digit. r > 0. A : an element of Z[X1,...,Xr]. c : an element of Z. k : A BETA-digit. k >= 0 m : A non-negative BETA-digit. m >= deg_1(A(X1,...,Xr)). Outputs B : an element of Z[X2,...,Xr]. B(X2,...,Xr) = 2^{km}A(c/2^k,X2,...,Xr). ======================================================================*/ #include "saclib.h" Word IPBEILV(r,A,c,k,m) Word r,A,c,k,m; { Word B; Word Ap,a,b,e,m1; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=1. */ if (r == 1) { m1 = PDEG(A); B = ITRUNC(IUPBEI(A,c,k),k * (m1 - m)); goto Return; } Step3: /* r>1. */ B = NIL; Ap = A; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = IPBEILV(r - 1,a,c,k,m); if (b != 0) B = COMP2(b,e,B); } if (B == NIL) B = 0; else B = INV(B); Return: return(B); } saclib2.2.8/src/FILINE.c0000664002275300236100000000104514017255270013651 0ustar wcbrownscs/*====================================================================== FILINE() Flush the input stream line. Side effects It reads away characters from the input stream unil the first newline character, including the newline. ======================================================================*/ #include "saclib.h" void FILINE() { Word C; /* hide C; */ Step1: /* Read up to the next newline character. */ do C = CREAD(); while (C != '\n'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/HEXP.c0000664002275300236100000000072314017255270013451 0ustar wcbrownscs/*====================================================================== e <- HEXP(a) Hardware exponent. Input a : a hardware double precision number. Output e : The exponent of a. ======================================================================*/ #include "saclib.h" BDigit HEXP(a) double a; { BDigit e; ieee b; Step1: /* Obtain exponent. */ b.num = a; e = b.rep.exp; Return: /* Return e. */ return(e); } saclib2.2.8/src/AFPCMV.c0000664002275300236100000000232214017255270013656 0ustar wcbrownscs/*====================================================================== C <- AFPCMV(r,M,A,B) Algebraic number field polynomial composition in main variable. Inputs: r : a BETA-integer. r >= 0. M : an element of Z[X]. M is the minimal polynomial of alpha. A : an element of Q(alpha)[X1,...,Xr]. B : an element of Q(alpha)[X1,...,Xr]. Outputs: C : an element of Q(alpha)[X1,...,Xr]. C(X1,...,Xr) = A(X1,...,X_{r-1},B(X1,...,Xr)). ======================================================================*/ #include "saclib.h" Word AFPCMV(r,M,A,B) Word r,M,A,B; { Word C; Word Ap,a2,e1,e2,i; Step1: /* A=0. */ if (A == 0) { C = 0; goto Return; } Step2: /* Apply Horner's method. */ ADV2(A,&e1,&a2,&Ap); C = PINV(r - 1,a2,1); if (r>1) C = PCPV(r,C,1,r); while (Ap != NIL) { ADV2(Ap,&e2,&a2,&Ap); a2 = PINV(r - 1,a2,1); if (r>1) a2 = PCPV(r,a2,1,r); for (i = 1; i <= e1 - e2;i++) C = AFPPR(r,M,C,B); C = AFPSUM(r,C,a2); e1 = e2; } for (i = 1; i <= e1; i++) C = AFPPR(r,M,C,B); Return: return(C); } saclib2.2.8/src/IPVCHT.c0000664002275300236100000000121314017255270013675 0ustar wcbrownscs/*====================================================================== k <- IPVCHT(A) Integral polynomial variations after circle to half-plane transformation. Inputs A : in Z[X], non-zero. Let n = deg(A), A'(x) = x^n A(1/x), B(x)=A'(x+1). Outputs k : the number of sign variations in the coefficients of B. ======================================================================*/ #include "saclib.h" Word IPVCHT(A) Word A; { Word Ap,B,k; /* hide k; */ Step1: /* Compute. */ Ap = PRT(A); B = IUPTR1(Ap); k = IUPVAR(B); Return: /* Prepare for return. */ return(k); } saclib2.2.8/src/AGIGCDAE.c0000664002275300236100000000645514017255270014041 0ustar wcbrownscs/*======================================================================= D = AGICDAE(A,B) Array Gaussian integer greatest common divisor, approximative Euclidean. Inputs A, B : array Gaussian integers. Output C : an array Gaussian integer, a greatest common divisor of A and B. ========================================================================*/ #include "saclib.h" BDigit **AGIGCDAE(A,B) BDigit **A,**B; { BDigit **D,**Dt,**E,**Et,**F,**Ft,*Gt,**Q,*T1,*T2,*T3,**U; BDigit d,dp,h,k,kp,M,m,N,n,np,p,t; BDigit d1,d2,e,e1,e2,f1,f2,q1,q2,r1,r2; Step1: /* Set the precision. */ d = 8; Step2: /* Compute the initial bit lengths. */ AGIBL(A, &m,&h); M = m * ZETA + h; AGIBL(B, &n,&k); N = n * ZETA + k; Step3: /* Get Arrays. */ p = m + n + 4; D = GETMATRIX(2,p); E = GETMATRIX(2,p); F = GETMATRIX(2,p); Dt = GETMATRIX(2,p); Et = GETMATRIX(2,p); Ft = GETMATRIX(2,p); Q = GETMATRIX(2,p); U = GETMATRIX(2,p); Gt = GETARRAY(p); T1 = GETARRAY(p); T2 = GETARRAY(p); T3 = GETARRAY(p); Step4: /* Let D be the longer of A and B, E the shorter. */ if (M >= N) { AGICOPY(A,D); AGICOPY(B,E); } else { AGICOPY(B,D); AGICOPY(A,E); t = m; m = n; n = t; t = h; h = k; k = t; t = M; M = N; N = t; } Step5: /* E = 0? */ if (N == 0) goto Step10; Step6: /* Truncate D and E. */ dp = M - N + d; if (M - N + dp + dp <= ZETA) { np = n; kp = k - dp; if (kp < 0) { np = np - 1; kp = kp + ZETA; } if (np < 0) { np = 0; kp = 0; } d1 = AITRS(D[0],np,kp); d2 = AITRS(D[1],np,kp); e1 = AITRS(E[0],np,kp); e2 = AITRS(E[1],np,kp); } else { np = dp / ZETA; kp = dp - np * ZETA; np = n - np; kp = k - kp; if (kp < 0) { kp = kp + ZETA; np = np - 1; } if (np < 0) { np = 0; kp = 0; } AGITR(D,np,kp,Dt); AGITR(E,np,kp,Et); } Step7: /* Compute the approximate nearest quotient, Q. */ if (M - N + dp + dp <= ZETA) { e = e1 * e1 + e2 * e2; f1 = d1 * e1 + d2 * e2; f2 = d2 * e1 - d1 * e2; q1 = f1 / e; r1 = f1 - e * q1; if (f1 >= 0 && r1 + r1 > e) q1 = q1 + 1; else if (f1 <= 0 && r1 + r1 < - e) q1 = q1 - 1; q2 = f2 / e; r2 = f2 - e * q2; if (f2 >= 0 && r2 + r2 > e) q2 = q2 + 1; else if (f2 <= 0 && r2 + r2 < - e) q2 = q2 - 1; Q[0][1] = 1; Q[0][0] = SIGN(q1); Q[0][2] = ABS(q1); Q[1][1] = 1; Q[1][0] = SIGN(q2); Q[1][2] = ABS(q2); } else { Et[1][0] = - Et[1][0]; AGIPROD(Dt,Et,Ft,T1,T2); AGINORM(Et,Gt,T1,T2); AINQ(Ft[0],Gt,Q[0],T1,T2,T3); AINQ(Ft[1],Gt,Q[1],T1,T2,T3); } Step8: /* Compute F = D - E * Q. */ Q[0][0] = - Q[0][0]; Q[1][0] = - Q[1][0]; AGIPROD(E,Q,U,T1,T2); AGISUM(D,U,F); Step9: /*Update variables for next loop pass. */ D = E; E = F; F = D; M = N; m = n; h = k; AGIBL(E, &n,&k); N = n * ZETA + k; goto Step5; Step10: /* Free arrays. */ FREEMATRIX(E,2); FREEMATRIX(F,2); FREEMATRIX(Dt,2); FREEMATRIX(Et,2); FREEMATRIX(Ft,2); FREEMATRIX(Q,2); FREEMATRIX(U,2); FREEARRAY(Gt); FREEARRAY(T1); FREEARRAY(T2); FREEARRAY(T3); Return: /* Return(D). */ return(D); } saclib2.2.8/src/LBRNWRITE.c0000664002275300236100000000407314017255270014257 0ustar wcbrownscs/*====================================================================== LBRNWRITE(A) Logarithmic binary rational number write. Inputs A : a logarithmic binary rational number in internal representation. A is either 0 or a list (a,k) where a is an odd integer and k is a BETA-digit. The list (a,k) represents the number a/2^k. Outputs (to the output stream) Canonical external representation of A. This is the representation a mathematician would use. In particular, the output is 0 if A = 0. Otherwise the output is of the form <*|/> where is omitted if A is positive, is omitted if |A| is a power of 2 and > 1, <*|/> is omitted if |A| is a power of 2 and > 1, or if A is an odd integer, is omitted if A is an odd integer. Here, is + or -, is a positive odd integer in external form, <*|/> is * if A is an integer and / else, is 2 or 2^. Side effects The output is written in the output stream. ======================================================================*/ #include "saclib.h" void LBRNWRITE(A) Word A; { BDigit k,kp; Word a,ap; Step1: /* A = 0. */ if (A == 0) { AWRITE(0); goto Return; } Step2: /* A = (a,k). */ FIRST2(A,&a,&k); ap = IABSF(a); kp = absm(k); Step3: /* Write sign. */ if (ISIGNF(a) < 0) SWRITE("-"); Step4: /* Write unsigned odd integer. */ if (ap != 1 || k >= 0) IWRITE(ap); Step5: /* Write * or /. */ if (k < 0 && ap != 1) SWRITE("*"); else if (k > 0) SWRITE("/"); Step6: /* Write power of 2. */ if (kp != 0) { SWRITE("2"); if (kp > 1) { SWRITE("^"); AWRITE(kp); } } Return: /* Prepare for return. */ return; } saclib2.2.8/src/AMPSAFP.c0000664002275300236100000000110014017255270013762 0ustar wcbrownscs/*====================================================================== B <- AMPSAFP(r,A) Algebraic module polynomial similar to algebraic field polynomial. Inputs r : in Z. r > 0. A : in Q(alpha)[X1,...,Xr]. Outputs B : in Z[alpha,X1,...,Xr]. ======================================================================*/ #include "saclib.h" Word AMPSAFP(r,A) Word r,A; { Word B,b; Step1: /* Convert to Q[alpha,X1,...,Xr]. */ B = AFPICR(r,A); IPSRP(r+1,B,&b,&B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFUPFAC.c0000664002275300236100000000255414017255270013756 0ustar wcbrownscs/*=========================================================================== F <- AFUPFAC(M,B) Algebraic number field univariate polynomial factorization. Inputs M : in Z[t], the minimal polynomial of an algebraic number alpha. B : in Q(alpha)[x]. B is squarefree and deg(B) >= 1. Outputs F : a list (F_1,...,F_r) of the monic factors of F. ===========================================================================*/ #include "saclib.h" Word AFUPFAC(M,B) Word M,B; { Word F,Fs,Fs1,Fb1,F1,G,Bt,Sp,t; Step1: /* deg(B) = 1. */ if (PDEG(B) == 1) { F = LIST1(AFPMON(1,M,B)); goto Return; } Step2: /* Compute factors of squarefree norm. */ AFUPSFN(M,B,&t,&Bt,&Fs); Step3: /* Check if irreducible. */ if (LENGTH(Fs) == 1) { F = LIST1(AFPMON(1,M,B)); goto Return; } Step4: /* Sort by degrees. */ LPBSD(Fs); Step5: /* Obtain factors of B over Q(alpha)[x]. */ F = NIL; G = Bt; Sp = PBIN(PMON(1,0),1,PMON(t,1),0); Sp = RPFIP(2,Sp); Sp = AFPCR(1,Sp); while (RED(Fs) != NIL) { ADV(Fs,&Fs1,&Fs); Fs1 = AFPFIP(1,Fs1); AFUPGC(M,G,Fs1,&F1,&G,&Fb1); if (t != 0) F1 = AFPCMV(1,M,F1,Sp); F = COMP(F1,F); } F1 = AFPMON(1,M,G); if (t != 0) F1 = AFPCMV(1,M,F1,Sp); F = COMP(F1,F); Return: /* Prepare for return. */ return(F); } saclib2.2.8/src/RPNEG.c0000664002275300236100000000172614017255270013564 0ustar wcbrownscs/*====================================================================== B <- RPNEG(r,A) Rational polynomial negative. Inputs A : in Q[X1,...,Xr]. r : a BETA-digit, r >= 0. Outputs B : in Q[X1,...,Xr], B = -A. ======================================================================*/ #include "saclib.h" Word RPNEG(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = RNNEG(A); goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = RNNEG(a); else b = RPNEG(rp,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/SUNION.c0000664002275300236100000000232214017255270013715 0ustar wcbrownscs/*====================================================================== C <- SUNION(A,B) Set union. Inputs A, B : ordered lists of of BETA-integers. (A, B represent sets of BETA-integers.) Outputs C : the ordered list representing the union of the sets A and B. ======================================================================*/ #include "saclib.h" Word SUNION(A,B) Word A,B; { Word Ap,Bp,C,Cp,a,b; /* hide Ap,Bp,C,a,b; */ Step1: /* Compute. */ Cp = NIL; Ap = A; Bp = B; while (Ap != NIL && Bp != NIL) { a = FIRST(Ap); b = FIRST(Bp); if (a == b) { Cp = COMP(a,Cp); Ap = RED(Ap); Bp = RED(Bp); } else if (a < b) { Cp = COMP(a,Cp); Ap = RED(Ap); } else { Cp = COMP(b,Cp); Bp = RED(Bp); } } if (Ap == NIL) Ap = Bp; if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SIQUOT.c0000664002275300236100000000223114017255270013725 0ustar wcbrownscs/*====================================================================== SIQUOT(I,J,K) Software interval quotient. Inputs I, J : software intervals of the same precision, say p, J not containing 0. K : an array of size (at least) 2 * p + 6. Effect The smallest p-precision software interval containing I / J is computed and placed in K. ======================================================================*/ #include "saclib.h" void SIQUOT(I,J,K) BDigit *I,*J,*K; { BDigit p,q; Step1: /* Get the precision. */ p = I[2]; q = p + 3; Step2: /* J > 0. */ if (J[1] > 0) { if (I[1] > 0) { FQUOT(I,J + q,-1,K); FQUOT(I + q,J,+1,K + q); } else if (I[q + 1] < 0) { FQUOT(I,J,-1,K); FQUOT(I + q,J + q,+1,K + q); } else { FQUOT(I,J,-1,K); FQUOT(I + q,J,+1,K + q); } goto Return; } Step3: /* J < 0. */ if (I[1] > 0) { FQUOT(I + q,J,-1,K); FQUOT(I,J + q,+1,K + q); } else if (I[q + 1] < 0) { FQUOT(I + q,J,-1,K); FQUOT(I,J + q,+1,K + q); } else { FQUOT(I + q,J,-1,K); FQUOT(I,J + q,+1,K + q) ; } Return: /* Return. */ return; } saclib2.2.8/src/IPDMV.c0000664002275300236100000000205214017255270013561 0ustar wcbrownscs/*====================================================================== B <- IPDMV(r,A) Integral polynomial derivative, main variable. Inputs r : BETA-digit, r >= 1, the number of variables. A : in Z[X1,...,Xr]. Outputs B : in Z[X1,...,Xr], the derivative of A with respect to its main variable. ======================================================================*/ #include "saclib.h" Word IPDMV(r,A) Word r,A; { Word Ap,B,a,b,e,ep,rp; /* hide a,ep,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* General case. */ Ap = A; rp = r - 1; B = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = IPROD(e,a); else b = IPIP(rp,e,a); ep = e - 1; if (e != 0) B = COMP2(b,ep,B); } while (!(Ap == NIL)); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPRICL.c0000664002275300236100000000222214017255270013663 0ustar wcbrownscs/*====================================================================== L <- IPRICL(A) Integral polynomial real root isolation, Collins-Loos algorithm. Inputs A : an integral polynomial. Outputs L : an inflectionless isolation list for A. ======================================================================*/ #include "saclib.h" Word IPRICL(A) Word A; { Word B,Bp,C,L,Lp,b,c,d; Step1: /* Degree zero. */ if (PDEG(A) == 0) { L = NIL; goto Return; } Step2: /* Initialize. */ B = IPPP(1,A); Bp = IPDMV(1,B); C = NIL; Step3: /* Compute derivatives. */ while (PDEG(B) > 1) { b = PTBCF(1,B); IPCPP(1,Bp,&c,&B); Bp = IPDMV(1,B); C = COMP2(b,c,C); } Step4: /* Isolate roots. */ Lp = NIL; do { d = IUPRB(B); L = IPRRII(B,Bp,d,Lp); if (C == NIL) goto Return; ADV2(C,&b,&c,&C); Bp = IPIP(1,c,B); B = IPINT(1,Bp,b); Lp = L; } while (1); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/RNWRITE.c0000664002275300236100000000217014017255270014035 0ustar wcbrownscs/*====================================================================== RNWRITE(R) Rational number write. Inputs R : a rational number in internal representation. R is either 0 or a list (N,D) where N and D are relatively prime integers and D > 0. Outputs (to the output stream) Canonical external representation of R. Let and be the canonical external representations of N and D, respectively. Then the output is of the following form 0 if R = 0, if D = 1, / if D /= 1. Side effects The output is written in the output stream. ======================================================================*/ #include "saclib.h" void RNWRITE(R) Word R; { Word R1,R2; /* hide algorithm */ Step1: /* Write. */ if (R == 0) AWRITE(R); else { FIRST2(R,&R1,&R2); IWRITE(R1); if (R2 != 1) { CWRITE('/'); IWRITE(R2); } } Return: /* Prepare for return. */ return; } saclib2.2.8/src/AGIMD.c0000664002275300236100000000350214017255270013524 0ustar wcbrownscs/*======================================================================= AGIMD(A,B,C) Array Gaussian integer minimal difference. Inputs A, B : nonzero array Gaussian integers with |A| >= |B|, approximately. C : a Gaussian integer array large enough for A - u * B, where u is any unit. Effect Let u be a unit that minimizes norm(A - u * B). Then A - v * B is placed in C, where either v = u or else v is another unit and norm(A - v * B) = (1 + e) * norm(A - u * b) with |e| < 2^{-8}. =======================================================================*/ #include "saclib.h" void AGIMD(A,B,C) BDigit **A,**B,**C; { BDigit a1,a2,b1,b2,c,cp,h1,h2,k,n,q,qp,q1,q2,t; Step1: /* Obtain the quadrants and half-quadrants. */ AGIQHQ(A, &q1,&h1); AGIQHQ(B, &q2,&h2); Step2: /* If the half-quadrants are the same, compute a rotated sum. */ q = q1 - q2 + 2; if (q < 0) q = q + 4; else if (q > 3) q = q - 4; if (h1 == h2) { AGIRSUM(A,B,q,C); goto Return; } Step3: /* Otherwise, decide among two rotations. */ AGIBL(A, &n,&k); k = k - 10; if (k < 0) { k = k + ZETA; n = n - 1; } if (n < 0) { n = 0; k = 0; } a1 = AITRS(A[0],n,k); a2 = AITRS(A[1],n,k); b1 = AITRS(B[0],n,k); b2 = AITRS(B[1],n,k); if (q == 1) { t = b1; b1 = - b2; b2 = t; } else if (q == 2) { b1 = - b1; b2 = - b2; } else if (q == 3) { t = b1; b1 = b2; b2 = - t; } c = a1 * b1 + a2 * b2; if (h1 == 1) { qp = q - 1; if (qp < 0) qp = 3; t = b1; b1 = b2; b2 = - t; } else { qp = q + 1; if (qp > 3) qp = 0; t = b1; b1 = - b2; b2 = t; } cp = a1 * b1 + a2 * b2; if (c > cp) q = qp; AGIRSUM(A,B,q,C); Return: /* Return. */ return; } saclib2.2.8/src/AGIMP2.c0000664002275300236100000000110214017255270013614 0ustar wcbrownscs/*======================================================================= AGIMP2(A,h,B) Array Gaussian integer multiplication by a power of 2. Inputs A : an array Gaussian integer. h : a nonnegative BETA integer. B : a Gaussian integer array large enough for the result. Effect 2*h A is placed in B. ========================================================================*/ #include "saclib.h" void AGIMP2(A,h,B) BDigit **A,h,**B; { Step1: /* Apply AIMP2. */ AIMP2(A[0],h,B[0]); AIMP2(A[1],h,B[1]); Return: /* Return. */ return; } saclib2.2.8/src/DNIMP.c0000664002275300236100000000143114017255270013551 0ustar wcbrownscs/*====================================================================== c <- DNIMP(a,b) Digit non-implication. Inputs a,b : non-negative BETA-digits. Outputs c : the bit-wise non-implication of a and b. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word DNIMP(a,b) Word a,b; { Word a1,ap,b1,bp,c,cp; /* hide a1,ap,b1,bp,c,cp; */ Step1: /* Compute. */ if (a == 0) c = 0; else { QREM(a,2,&ap,&a1); QREM(b,2,&bp,&b1); cp = DNIMP(ap,bp); c = cp + cp; if (a1 == 1 && b1 == 0) c = c + 1; } Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/FRUPCR.c0000664002275300236100000000215314017255270013705 0ustar wcbrownscs/*========================================================================== Ap <- FRUPCR(A,n) Finite ring univariate polynomial convert representation. Inputs n : a BETA-digit, n >= 1. A : in (Z/(m)[x])/(M)[y], where m is a BETA-digit and M has degree n. Outputs Ap : in (Z/(m)[x])/(M)[y]. Ap = A, where Ap is in array representation. ==========================================================================*/ #include "saclib.h" Word **FRUPCR(A,n) Word A,n; { Word **Ap,*C,At,a,d,c,e,f,i,j; Step1: /* A = 0. */ if (A == 0) { Ap = FRAPFMD(0,n); goto Return; } Step2: /* Get array for Ap and initialize. */ d = PDEG(A); Ap = FRAPGET(d,n); FRAPDEG(Ap) = d; for (i = 0; i <= d; i++) { C = FRAPCF(Ap,i); for (j = 0; j <= n; j++) MAPCF(C,j) = 0; MAPDEG(C) = 0; } Step3: /* Copy the coefficients. */ At = A; while (At != 0) { PADV(At,&e,&c,&At); C = FRAPCF(Ap,e); MAPDEG(C) = PDEG(c); while (c != 0) { PADV(c,&f,&a,&c); MAPCF(C,f) = a; } } Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/AFUPRLS.c0000664002275300236100000000464714017255270014032 0ustar wcbrownscs/*====================================================================== AFUPRLS(M,I,A1,A2,L1,L2; Ls1,Ls2) Algebraic number field univariate polynomial real root list separation. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. A1,A2 : in Q(alpha)[x]. A1 and A2 do not have any common roots and their real roots are of odd multiplicity. L1,L2 : strong isolation lists for the real roots of A1 and A2 resp. L1 = (I1_1,m1_1,...,I1_r1,m1_r1), L2 = (I2_1,m2_1,...,I2_r2,m2_r2). I1_1 < I1_2 < ... < I1_r1 and I2_1 < I2_2 < ... < I2_r2. Outputs Ls1,Ls2 : lists (Isi_1,mi_1,...,Isi*_r1,mi_r1) where Isi_j is a binary rational subinterval of Ii_j containing the root of Ai in Ii_j. Each Is1_j is strongly disjoint from each Is2_j. ======================================================================*/ #include "saclib.h" void AFUPRLS(M,I,A1,A2,L1,L2, Ls1_,Ls2_) Word M,I,A1,A2,L1,L2, *Ls1_,*Ls2_; { Word I1,I2,Lp1,Lp2,Ls1,Ls2,m1,m2,s; /* hide Lp1,Lp2,m1,m2,s; */ Step1: /* Initialize. */ if (L1 == NIL || L2 == NIL) { Ls1 = L1; Ls2 = L2; goto Return; } ADV2(L1,&I1,&m1,&Lp1); Ls1 = NIL; ADV2(L2,&I2,&m2,&Lp2); Ls2 = NIL; Step2: /* Refine and merge. */ do { AFUPRRS(M,I,A1,A2,I1,I2,&I1,&I2,&s); if (s < 0) { Ls1 = COMP2(m1,I1,Ls1); if (Lp1 != NIL) ADV2(Lp1,&I1,&m1,&Lp1); else I1 = 0; } else { Ls2 = COMP2(m2,I2,Ls2); if (Lp2 != NIL) ADV2(Lp2,&I2,&m2,&Lp2); else I2 = 0; } } while (!(I1 == 0 || I2 == 0)); Step3: /* Finish. */ if (I1 == 0) { Ls2 = COMP2(m2,I2,Ls2); while (Lp2 != NIL) { ADV2(Lp2,&I2,&m2,&Lp2); Ls2 = COMP2(m2,I2,Ls2); } } else { Ls1 = COMP2(m1,I1,Ls1); while (Lp1 != NIL) { ADV2(Lp1,&I1,&m1,&Lp1); Ls1 = COMP2(m1,I1,Ls1); } } Ls1 = INV(Ls1); Ls2 = INV(Ls2); Return: /* Prepare for return. */ *Ls1_ = Ls1; *Ls2_ = Ls2; return; } saclib2.2.8/src/AMUPRICS.c0000664002275300236100000000160714017255270014132 0ustar wcbrownscs/*====================================================================== L <- AMUPRICS(M,I,A) Algebraic module univariate polynomial real root isolation, coefficient sign variation method. Inputs M : in Z[X], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Z[alpha,X]. Outputs L : a list (I1,...,Ir) of strongly disjoint isolating intervals for all of the real roots of A. Ij is a standard open or a one-point binary rational interval. I1 < I2 < ... < Ir. ======================================================================*/ #include "saclib.h" Word AMUPRICS(M,I,A) Word M,I,A; { Word L,Is; Step1: /* Isolate roots. */ AMUPRICSW(M,I,A,&L,&Is); Step2: /* Make strongly disjoint. */ AMUPIIWS(M,Is,A,L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MPMDP.c0000664002275300236100000000157514017255270013570 0ustar wcbrownscs/*=========================================================================== C <- MPMDP(r,m,a,B) Modular polynomial modular digit product. Inputs r : a BETA-digit, r >= 1, the number of variables; m : a positive BETA-digit; a : in Z/(m); B : in Z/(m)[x_1,...,x_r]. Outputs C : in Z/(m)[x_1,...,x_r], C = a * B. ===========================================================================*/ #include "saclib.h" Word MPMDP(r,m,a,B) Word r,m,a,B; { Word Bp,C,b,c,e,rp; Step1: /* C = 0. */ if (a == 0 || B == 0) { C = 0; goto Return; } Step2: /* General case. */ Bp = B; C = NIL; rp = r - 1; do { ADV2(Bp,&e,&b,&Bp); if (rp == 0) c = MDPROD(m,a,b); else c = MPMDP(rp,m,a,b); C = COMP2(c,e,C); } while (Bp != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/PAIR.c0000664002275300236100000000131214017255270013433 0ustar wcbrownscs/*====================================================================== C <- PAIR(A,B) Pair. Inputs A,B : lists, A=(a1,...,am) and B=(b1,...,bn), n >= 0, m >= 0. Outputs C : the list (a1,b1,...,ar,br), where r=min(m,n). ======================================================================*/ #include "saclib.h" Word PAIR(A,B) Word A,B; { Word Ap,Bp,C,a,b; /* hide Ap,Bp,a,b; */ Step1: /* Compute. */ Ap = A; Bp = B; C = NIL; while (Ap != NIL && Bp != NIL) { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); C = COMP2(b,a,C); } C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MIPNEG.c0000664002275300236100000000204214017255270013660 0ustar wcbrownscs/*====================================================================== B <- MIPNEG(r,M,A) Modular integral polynomial negation. Inputs M : in Z, M > 0. A : in Z/(M)[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs B : in Z/(M)[X1,...,Xr], B = - A. ======================================================================*/ #include "saclib.h" Word MIPNEG(r,M,A) Word r,M,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = MINEG(M,A); goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = MINEG(M,a); else b = MIPNEG(rp,M,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPRESBEZ.c0000664002275300236100000000175614017255270014137 0ustar wcbrownscs/*====================================================================== C <- IPRESBEZ(r,A,B) Integral polynomial resultant, Bezout. Inputs r : a positive beta digit. A, B : integral polynomials of positive degrees. Output C : the reultant of A and B with respect to the main variable. Method The Bezout matrix of A and B is computed and its determinant is computed by minors evaluation. ======================================================================*/ #include "saclib.h" Word IPRESBEZ(r,A,B) BDigit r; Word A,B; { BDigit s; Word Ap,Bp,M,R; Step1: /* Interchange A and B if necessary. */ if (PDEG(A) >= PDEG(B)) { Ap = A; Bp = B; s = 1; } else { Ap = B; Bp = A; s = -1; } Step2: /* Comstruct the Bezout matrix. */ M = IPBEZM(r,Ap,Bp); Step3: /* Compute the determinant. */ R = MAIPDME(r-1,M); Step4: /* Adjust sign if necessary. */ if (s < 0) R = IPNEG(r-1,R); Return: /* Return R. */ return(R); } saclib2.2.8/src/PMDEG.c0000664002275300236100000000104414017255270013536 0ustar wcbrownscs/*====================================================================== n <- PMDEG(A) Polynomial modified degree. Inputs A : a polynomial. Outputs n : in Z. If A = 0 then n = -1, otherwise n = deg(A). ======================================================================*/ #include "saclib.h" Word PMDEG(A) Word A; { Word n; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) n = -1; else n = FIRST(A); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/IPP2P.c0000664002275300236100000000176714017255270013550 0ustar wcbrownscs/*=========================================================================== C <- IPP2P(r,B,m) Integral polynomial power of 2 product. Inputs r : a BETA-digit, r >= 0, the number of variables. m : a non-negative integer. B : an element of Z[x_1,...,x_r]. Outputs C : an element of Z[x_1...,x_r]. C=(2^m)B. ===========================================================================*/ #include "saclib.h" Word IPP2P(r,B,m) Word r,B,m; { Word C; Word Bp,b,c,e,rp; Step1: /* r = 0 or m = 0 or B = 0. */ if (r == 0) { C = ITRUNC(B,-m); goto Return; } if (m == 0) { C = B; goto Return; } if (B == 0) { C = 0; goto Return; } Step2: /* General case. */ Bp = B; C = NIL; rp = r - 1; do { ADV2(Bp,&e,&b,&Bp); if (rp == 0) c = ITRUNC(b,-m); else c = IPP2P(rp,m,b); C = COMP2(c,e,C); } while (Bp != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFUPRICL.c0000664002275300236100000000250414017255270014111 0ustar wcbrownscs/*====================================================================== L <- AFUPRICL(M,I,A) Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Q(alpha)[x], A is monic and deg(A)=n. Outputs L : a strong isolation list for the real roots of A. ======================================================================*/ #include "saclib.h" Word AFUPRICL(M,I,A) Word M,I,A; { Word Ap,As,C,L,Lp,b,d; Step1: /* Degree zero. */ if (PDEG(A) == 0) { L = NIL; goto Return; } Step2: /* Initialize. */ As = A; Ap = AFPDMV(1,M,A); C = NIL; Step3: /* Compute derivatives. */ while (PDEG(As) > 1) { b = PTBCF(1,As); C = COMP(b,C); As = Ap; Ap = AFPDMV(1,M,As); } Step4: /* Isolate roots. */ Lp = NIL; d = AFUPRB(M,I,A); do { L = AFUPRII(M,I,As,Ap,d,Lp); if (C == NIL) goto Return; ADV(C,&b,&C); Ap = As; As = AFPINT(1,M,Ap,b); Lp = L; } while (1); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MPRESDB.c0000664002275300236100000000305314017255270014000 0ustar wcbrownscs/*====================================================================== C <- MPRESDB(r,p,A,B,D) Modular polynomial resultant, degree bounds. Inputs r : a BETA-digit, r > 0. p : a BETA-digit, prime. A,B : in Z/(p)[X1,...,Xr], A and B are of positive degree. D : D = (d_1,...,d_{r-1}), where d_i is an upper bound for the degree of res(A,B) in x_i. Outputs C : in Z/(p)[X1,...,X_{r-1}], the resultant of A and B, res(A,B). ======================================================================*/ #include "saclib.h" Word MPRESDB(r,p,A,B,D) BDigit r,p; Word A,B,D; { Word As,Bs,C,Cs,Dp,E,Ep,b; BDigit d,i,m,n,rp; Step1: /* r = 1. */ if (r == 1) { C = MUPRES(p,A,B); goto Return; } Step2: /* Initialize. */ m = PDEG(A); n = PDEG(B); rp = r - 1; C = 0; E = LIST2(0,1); i = 0; d = FIRST(D); Dp = RED(D); Step3: /* Recursion. */ while (i < p) { As = MPEVAL(r,p,A,1,i); if (PDEG(As) == m) { Bs = MPEVAL(r,p,B,1,i); if (PDEG(Bs) == n) { Cs = MPRESDB(rp,p,As,Bs,Dp); b = MPEMV(1,p,E,i); b = MDINV(p,b); C = MPINT(p,E,i,b,rp,C,Cs); Ep = LIST4(1,1,0,p - i); E = MPPROD(1,p,E,Ep); if (PDEG(E) > d) goto Return; } } i++; } Step4: /* Algorithm fails. */ FAIL("MPRESDB","Fails",r,p,A,B,D); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/VMPIP.c0000664002275300236100000000167014017255270013602 0ustar wcbrownscs/*====================================================================== c <- VMPIP(r,m,A,B) Vector of modular polynomial inner product. Inputs A,B : vectors of polynomials in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 0. m : a BETA-digit. Outputs c : in Z, the inner product of A and B. ======================================================================*/ #include "saclib.h" Word VMPIP(r,m,A,B) Word r,m,A,B; { Word Ap,Bp,a,b,c; /* hide Ap,Bp,a,b; */ Step1: /* A=0 or B=0. */ c = 0; if (A == 0 || B == 0) goto Return; Step2: /* General case. */ Ap = A; Bp = B; do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); if (r == 0) c = MDSUM(m,c,MDPROD(m,a,b)); else c = MPSUM(r,m,c,MPPROD(r,m,a,b)); } while (!(Ap == NIL)); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/HIPRRISD.c0000664002275300236100000000452614017255270014136 0ustar wcbrownscs/*====================================================================== HIPRRISD(n,A,a,b; L,t) Hardware interval polynomial real root isolation, standard interval, Descartes' method. Inputs n : a positive beta-digit. A : a hardware interval polynomial of degree n. A[n] does not contain 0. a,b: logarithmic binary rational numbers, a < b such that (a,b) is a standard interval. Outputs L : Let T be the linear transformation that maps the interval (a,b) onto the interval (0,1). If t = 0, L is a list of standard and one-point binary rational isolating intervals for the roots of A(T(x)) in (a,b). If L = (I_1,I_2,...,I_r) then I_1 < I_2 < ... < I_r and each I_j is a subinterval of (a,b). If t /= 0 then L is undefined. t : 0, 1 or 2. If t = 1, the program failed to produce the list L because of exponent limitation. If t = 2, the failure is due to mantissa limitation. ======================================================================*/ #include "saclib.h" void HIPRRISD(n,A,a,b, L_,t_) BDigit n; interval *A; Word a,b,*L_; BDigit *t_; { BDigit s,s2,t,v; Word c,L,L1,L2; interval *B,*C; Step1: /* Case that A has at most one variation, */ L = NIL; HIPVCHT(n,A, &v,&t); if (t != 0) goto Return; if (v == 0) { goto Return; } if (v == 1) { L = LIST1(LIST2(a,b)); goto Return; } Step2: /* Isolate the roots of A in (0,1/2). */ HIPBHT(n,A,-1, &B,&t); if (t == 0) { FREEARRAY(B); t = 1; goto Return; } c = LBRIMID(LIST2(a,b)); s = LBRNSIGN(c); if (s > 0) HIPRRISD(n,B,a,c, &L1,&t); else HIPRRISD(n,B,c,b, &L1,&t); if (t >0) { FREEARRAY(B); goto Return; } Step3: /* Isolate the roots of A in (1/2,1). */ FPCATCH(); C = HIPTR1(n,B); FREEARRAY(B); if (FPCHECK()) { FREEARRAY(C); t = 1; goto Return; } s2 = HISIGN(C[0]); if (s2 == NIL) { FREEARRAY(C); t = 2; goto Return; } if (s > 0) HIPRRISD(n,C,c,b, &L2,&t); else HIPRRISD(n,C,a,c, &L2,&t); FREEARRAY(C); if (t > 0) goto Return; Step4: /* Include midpoint if a root. */ if (s > 0) { if (s2 == 0) L2 = COMP(LIST2(c,c),L2); L = CONC(L1,L2); } else { if (s2 == 0) L1 = COMP(LIST2(c,c),L1); L = CONC(L2,L1); } Return: /* Return L and t. */ *L_ = L; *t_ = t; return; } saclib2.2.8/src/AMUPIIR.c0000664002275300236100000000227614017255270014020 0ustar wcbrownscs/*====================================================================== Js <- AMUPIIR(M,I,B,J) Algebraic module polynomial isolating interval refinement. Inputs M : in Z[X]. M is the minimal polynomial for a real algebraic number alpha. I : an acceptable isolating interval for alpha. B : in Z[alpha,y]. B(alpha,y) is squarefree over Q(alpha)[y]. J : a binary rational isolting interval for a real root of B. Outputs Js : a binary rational subinterval of J, obtained by a single application of RIB, containing the same root. ======================================================================*/ #include "saclib.h" Word AMUPIIR(M,I,B,J) Word M,I,B,J; { Word Js; Word a,b,c,s,t; Step1: /* Get the endpoints of J, and bisect. */ FIRST2(J,&a,&b); c = RIB(a,b); Step2: /* If A(b) = 0 then Js = (b,b). */ t = AMUPBES(M,I,B,b); if (t == 0) { Js = LIST2(b,b); goto Return; } Step3: /* Otherwise, compare the signs of B at c and b. */ s = AMUPBES(M,I,B,c); if (s == t) Js = LIST2(a,c); else Js = LIST2(c,b); Return: return(Js); } saclib2.2.8/src/MIPSUM.c0000664002275300236100000000344614017255270013724 0ustar wcbrownscs/*====================================================================== C <- MIPSUM(r,M,A,B) Modular integral polynomial sum. Inputs M : in Z, M > 0. A,B : in Z/(M)[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs C : in Z/(M)[X1,...,Xr], C = A + B. ======================================================================*/ #include "saclib.h" Word MIPSUM(r,M,A,B) Word r,M,A,B; { Word Ap,Bp,C,Cp,a,b,c,e,f,rp; /* hide C,a,b,f,rp; */ Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r=0. */ if (r == 0) { C = MISUM(M,A,B); goto Return; } Step3: /* Match coefficients. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); Cp = COMP2(b,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = MISUM(M,a,b); else c = MIPSUM(rp,M,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (!(Ap == NIL || Bp == NIL)); Step4: /* Finish. */ if (Ap == NIL) Ap = Bp; if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFUPSF.c0000664002275300236100000000225314017255270013671 0ustar wcbrownscs/*====================================================================== L <- AFUPSF(M,A) Algebraic number field univariate polynomial squarefree factorization. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A : in Q(alpha)[x]. deg(A) > 0 and A is monic. Outputs L : a list ((e1,A1),...,(ek,Ak)), where A = A1^e1 * A2^e2 * .... * Ak^ek is the squarefree factorization of A, with 1 <= e1 < e2 < ... < ek and each Ai a monic squarefree polynomial of positive degree. ======================================================================*/ #include "saclib.h" Word AFUPSF(M,A) Word M,A; { Word Ap,B,Bp,C,Cp,D,L,j; /* hide j; */ Step1: /* Initialize. */ L = NIL; Ap = AFPDMV(1,M,A); AFUPGC(M,A,Ap,&B,&C,&Cp); j = 1; Step2: /* Compute factors. */ while (PDEG(B) > 0) { AFUPGC(M,B,C,&D,&Bp,&Cp); if (PDEG(Cp) > 0) L = COMP(LIST2(j,Cp),L); B = Bp; C = D; j = j + 1; } Step3: /* Finish. */ L = COMP(LIST2(j,C),L); L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/DLPROD.c0000664002275300236100000000112714017255270013670 0ustar wcbrownscs/*======================================================================= c <- DLPROD(a,b) Discrete logarithm product. Inputs a, b : elements of a finite field represented as discrete logarithms. Output c : a * b, the finite field product. =======================================================================*/ #include "saclib.h" BDigit DLPROD(a,b) BDigit a,b; { BDigit c; Step1: /* Add logarithms modulo FFSIZE. */ if (a == 0 || b == 0) c = 0; else { c = a + b; if (c > FFSIZE) c = c - FFSIZE; } Return: /* Return c. */ return(c); } saclib2.2.8/src/PMONSV.c0000664002275300236100000000130214017255270013721 0ustar wcbrownscs/*=========================================================================== A <- PMONSV(r,a,i,e) Polynomial monomial, specified variable. Inputs r : a BETA-digit, r >= 1. a : in R, R a ring. i : a BETA-digit, 1 <= i <= r. e : a BETA-digit, e >= 0. Outputs A : in R[x_1,...,x_r], A(x_1,...,x_r) = a x_i^e. ===========================================================================*/ #include "saclib.h" Word PMONSV(r,a,i,e) Word r,a,i,e; { Word A,j; Step1: /* Construct the monomial. */ A = a; for (j = 1; j <= r; j++) { if (j == i) A = PMON(A,e); else A = PMON(A,0); } Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/LIST3.c0000664002275300236100000000074014017255270013542 0ustar wcbrownscs/*====================================================================== L <- LIST3(a1,a2,a3) List, 3 elements. Inputs a1, a2, a3 : objects. Outputs L : the list (a1,a2,a3). ======================================================================*/ #include "saclib.h" Word LIST3(a1,a2,a3) Word a1,a2,a3; { Word L; Step1: /* Compute. */ L = COMP(a1,COMP(a2,COMP(a3,NIL))); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/VCOMP.c0000664002275300236100000000171314017255270013571 0ustar wcbrownscs/*====================================================================== t <- VCOMP(U,V) Vector comparison. Inputs U,V : lists of BETA-digits, U=(u1,...,ur) and V=(v1,...,vr). r : a BETA-digit, r >= 1. Outputs t : If U = V then t=0. If U is not equal to V then t = 1 if ui <= vi for all i, t = 2 if vi <= ui for all i, and t = 3 otherwise. ======================================================================*/ #include "saclib.h" Word VCOMP(U,V) Word U,V; { Word Us,Vs,t,t1,t2,u,v; /* hide algorithm */ Step1: /* Compute. */ t1 = 0; t2 = 0; Us = U; Vs = V; do { ADV(Us,&u,&Us); ADV(Vs,&v,&Vs); if (u < v) t1 = 1; else if (v < u) t2 = 2; } while (!(Us == NIL)); t = t1 + t2; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/GINEG.c0000664002275300236100000000110414017255270013530 0ustar wcbrownscs/*=========================================================================== B <- GINEG(A) Gaussian integer negation. Input A : a Gaussian integer. Output B : -A, a Gaussian integer. ===========================================================================*/ #include "saclib.h" Word GINEG(A) Word A; { Word B; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ B = LIST2(INEG(FIRST(A)),INEG(SECOND(A))); Return: /* Return B. */ return(B); } saclib2.2.8/src/FIRST6.c0000664002275300236100000000127514017255270013665 0ustar wcbrownscs/*=========================================================================== FIRST6(L; a1,a2,a3,a4,a5,a6) First 6. Inputs L : list of length 6 or more. Outputs a1, a2, a3, a4, a5, a6 : the first six elements of L. ===========================================================================*/ #include "saclib.h" void FIRST6(L, a1_,a2_,a3_,a4_,a5_,a6_) Word L, *a1_,*a2_,*a3_,*a4_,*a5_,*a6_; { Word Lp,a1,a2,a3,a4,a5,a6; Step1: /* Compute. */ ADV3(L,&a1,&a2,&a3,&Lp); ADV3(Lp,&a4,&a5,&a6,&Lp); Return: /* Prepare for return. */ *a1_ = a1; *a2_ = a2; *a3_ = a3; *a4_ = a4; *a5_ = a5; *a6_ = a6; return; } saclib2.2.8/src/LASTCELL.c0000664002275300236100000000112314017255270014103 0ustar wcbrownscs/*====================================================================== Lp <- LASTCELL(L) Last cell. Inputs L : a non-null list. Outputs Lp : the list handle of the LAST cell of L. ======================================================================*/ #include "saclib.h" Word LASTCELL(L) Word L; { Word Lp,Lpp; /* hide algorithm */ Step1: /* Compute. */ Lp = L; Lpp = RED(Lp); while (Lpp != NIL) { Lp = Lpp; Lpp = RED(Lp); } Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/MUPFAC.c0000664002275300236100000000170714017255270013663 0ustar wcbrownscs/*=========================================================================== F <- MUPFAC(p,A) Modular univariate polynomial factorization. Inputs p : a medium prime. A : in Z/(p)[x]. A is squarefree and deg(A) >= 2. Output F : a list of the distinct monic irreducible factors of A. ===========================================================================*/ #include "saclib.h" Word MUPFAC(p,A) Word p,A; { Word Ap,B1,F,G,G1,b,d,f; Step1: /* Make monic. */ Ap = MPMON(1,p,A); Step2: /* Distinct-degree factorization. */ G = MMPDDF(p,Ap); Step3: /* Split equal-degree factors. */ F = NIL; while (G != NIL) { ADV(G,&G1,&G); ADV2(G1,&f,&b,&G1); d = PDEG(b); if (d > f) { /* split equal degree factors */ B1 = MMPFBL(p,b,f); F = CONC(B1,F); } else F = COMP(b,F); } Return: /* Prepare for return. */ return(F); } saclib2.2.8/src/IPBHTLV.c0000664002275300236100000000177214017255270014022 0ustar wcbrownscs/*=========================================================================== B <- IPBHTLV(r,A,k) Integral polynomial binary homothetic transformation, leading variable. Inputs r : A BETA-digit. r >= 0. A : an element of Z[x_1,...,x_r]. k : a BETA-digit. Outputs B : an element of Z[x_1,...,x_r]. B(x_1,...,x_r) = 2^{-h} A(2^kx_1,x_2,...,x_r), where h is uniquely determined so that B is an integral polynomial not divisible by 2. ===========================================================================*/ #include "saclib.h" Word IPBHTLV(r,A,k) Word r,A,k; { Word B; Word Ap,a,b,e; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 1. */ if (r == 1) { B = IUPBHT(A,k); goto Return; } Step3: /* r > 1. */ B = NIL; Ap = A; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = IPBHTLV(r - 1,a,k); B = COMP2(b,e,B); } B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/GIHQ.c0000664002275300236100000000114214017255270013431 0ustar wcbrownscs/*======================================================================= h <- GIHQ(a) Gaussian integer half quadrant. Input a : a nonzero first quadrant Gaussian integer. Output h : the half quadrant in which a lies. That is, h = 1 if arg(a) < pi / 4, and otherwise h = 2. =======================================================================*/ #include "saclib.h" BDigit GIHQ(a) Word a; { BDigit h; Word a1,a2; Step1: /* Compare components. */ FIRST2(a, &a1,&a2); if (ICOMP(a1,a2) < 0) h = 1; else h = 2; Return: /* Return h. */ return(h); } saclib2.2.8/src/IPRODA.c0000664002275300236100000000215214017255270013661 0ustar wcbrownscs/*=========================================================================== IPRODA(A,n1,B,n2,C) Integer product - array representation. Classical algorithm. Inputs n1,n2: positive beta-digits. A, B : non-negative integers of lengths n1 and n2 in array representation. C : an array of length n1 + n2. Effect : C = A * B in array representation. ===========================================================================*/ #include "saclib.h" void IPRODA(A,n1,B,n2,C) Word *A,n1,*B,n2,*C; { Word b,c,c0,c1,cp,i,j,k; Step1: /* Initialize with first row of digit products. */ b = B[0]; cp = 0; for (i = 0; i < n1; i++) { DPR(A[i],b,&c1,&c0); c = c0 + cp; cp = c >> ZETA; C[i] = c & BETA1; cp = cp + c1; } C[n1] = cp; Step2: /* Add rows of digit products. */ for (j = 1; j < n2; j++) { b = B[j]; k = j; cp = 0; for (i = 0; i < n1; i++) { DPR(A[i],b,&c1,&c0); c = C[k] + c0 + cp; cp = c >> ZETA; C[k] = c & BETA1; cp = cp + c1; k++; } C[k] = cp; } Return: /* Prepare for return. */ return; } saclib2.2.8/src/MMPDMA.c0000664002275300236100000000343514017255270013663 0ustar wcbrownscs/*====================================================================== D <- MMPDMA (r,p,M) Matrix of modular polynomials determinant, modular algorithm. Inputs r : a non-negative BETA-integer. p : a prime BETA-integer. M : a square matrix over Z/(p)[x_1,...,x_r]. Outputs D : the determinant of M, an element of Z/(p)[x_1,...,x_r]. ======================================================================*/ #include "saclib.h" Word MMPDMA(r,p,M) Word r,p,M; { Word a,b,B,bp,d,D,Ds,M1,M11,Mp,Ms,n,N,N1,N11,X,rp; Step1: /* Matrix of order 1. */ if (RED(M) == NIL) { D = FIRST(FIRST(M)); goto Return; } Step2: /* r=0. */ if (r == 0) { D = MMDDET(p,M); goto Return; } Step3: /* Compute degree bound. */ n = LENGTH(M); Mp = M; N = NIL; do { ADV(Mp,&M1,&Mp); N1 = NIL; do { ADV(M1,&M11,&M1); if (M11 != 0) N11 = PDEGSV(r,M11,1); else N11 = - (BETA / n); N1 = COMP(N11,N1); } while (M1 != NIL); N = COMP(N1,N); } while (Mp != NIL); ASSPR(N,&X,&d); Step4: /* Apply evaluation and interpolation. */ a = 0; rp = r - 1; B = PINV(0,1,1); D = 0; do { if (a == p) FAIL("MMPDMA","Elements of finite field exhausted",r,p,M); Ms = MMPEV(r,p,M,1,a); Ds = MMPDMA(rp,p,Ms); b = MPEMV(1,p,B,a); bp = MDINV(p,b); D = MPINT(p,B,a,bp,r,D,Ds); X = LIST4(1,1,0,MDNEG(p,a)); B = MPPROD(1,p,B,X); a = a + 1; } while (PDEG(B) <= d); Return: /* Return D. */ return(D); } saclib2.2.8/src/PTDEG.c0000664002275300236100000000154714017255270013555 0ustar wcbrownscs/*======================================================================= n = PTDEG(r,A) Polynomial total degree. Inputs r : a positive beta digit. A : a polynomial in r variables over an arbitrary domain, in recursive representation. Output n : the total degree of A. =======================================================================*/ #include "saclib.h" BDigit PTDEG(r,A) BDigit r; Word A; { BDigit e,m,n,rp; Word a,Ap; Step1: /* A = 0. */ if (A == 0) { n = 0; goto Return; } Step2: /* r = 1. */ if (r == 1) { n = PDEG(A); goto Return; } Step3: /* r > 1. */ n = 0; Ap = A; rp = r - 1; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); m = e + PTDEG(rp,a); if (m > n) n = m; } Return: /* Return n. */ return(n); } saclib2.2.8/src/SISUM.c0000664002275300236100000000120514017255270013601 0ustar wcbrownscs/*====================================================================== SISUM(I,J,K) Software interval sum. Inputs I, J : software intervals of the same precision, p. K : an array of size (at least) p + 3. Effect The smallest p-precision software interval containing I + J is computed and stored in K. ======================================================================*/ #include "saclib.h" void SISUM(I,J,K) BDigit *I,*J,*K; { BDigit p,q; Step1: /* Add corresponding endpoints. */ p = I[2]; q = p + 3; FSUM(I,J,-1,K); FSUM(I + q,J + q,+1,K + q); Return: /* Return. */ return; } saclib2.2.8/src/USUN.c0000664002275300236100000000104014017255270013470 0ustar wcbrownscs/*=========================================================================== C <- USUN(A,B) Unordered set union. Inputs A,B : unordered lists of objects. (A, B represent sets of objects.) Outputs C : unordered list representing the union of the sets A and B. ===========================================================================*/ #include "saclib.h" Word USUN(A,B) Word A,B; { Word C; Step1: /* Compute. */ C = CONC(USDIFF(A,B),B); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/GIPGEN.c0000664002275300236100000000437314017255270013663 0ustar wcbrownscs/*====================================================================== GIPGEN(N; L1,L2) Gaussian integer prime generator. Input N : a beta digit, N >= 2. Outputs L1 : A naturally ordered list of all rational Gaussian primes less than or equal to the square root of N. L2 : A list of all non-real first-octant Gaussian primes, ordered by increasing norms, with norms less than or equal to N. Restriction: N must be less than the square of the largest prime in SPRIME, the small prime list. ======================================================================*/ #include "saclib.h" void GIPGEN(N, L1_,L2_) Word N, *L1_,*L2_; { Word *A,f,i,j,L1,L2,n,P,p,q,S,t; Step1: /* Compute n = ceiling(sqrt(N)). */ DSQRTF(N,&n,&t); if (t > 0) n = n + 1; Step2: /* Get array for squares. */ A = GETARRAY(n+1); Step3: /* Compute the squares of the integers from 1 to n. */ A[1] = 1; for (i = 1; i < n; i = i+1) A[i+1] = A[i] + i + i + 1; Step4: /* Loop through the rational primes. */ P = RED(SPRIME); L1 = NIL; L2 = LIST1(LIST2(1,1)); do { ADV(P,&p,&P); if (p > N) goto Step5; if (REM(p,4) == 3) { if (p < n || (p == n && t == 0)) { L1 = COMP(p,L1); } } else { i = 1; j = 2; f = 0; do { S = A[i] + A[j]; if (S == p) { if (i > j) q = LIST2(i,j); else q = LIST2(j,i); L2 = COMP(q,L2); f = 1; } else if (S < p) { if (j < n) { j = j + 2; } else { i = i + 2; j = 2; } } else { i = i + 2; j = 2; } } while (f == 0); } } while (P != NIL); Step5: /* Invert the lists of Gaussian primes. */ L1 = INV(L1); L2 = INV(L2); Return: /* Return L1 and L2. */ *L1_ = L1; *L2_ = L2; return; } saclib2.2.8/src/IMPDS.c0000664002275300236100000000307614017255270013565 0ustar wcbrownscs/*====================================================================== IMPDS(n,a,b; p,q) Integer medium prime divisor search. Inputs n,a,b : in Z. n,a,b > 0. a <= b <= n. n has no positive divisors less than a. Outputs p, q : If n has a prime divisor in the closed interval from a to b then p is the least such prime and q=n/p. Otherwise p=1 and q=n. ======================================================================*/ #include "saclib.h" void IMPDS(n,a,b, p_,q_) Word n,a,b, *p_,*q_; { Word Lp,p,pp,q,r,r1,r2; /* hide Lp,pp,r,r1,r2; */ Step1: /* Determine first divisor. */ r = IDREM(a,210); Lp = UZ210; while (r > FIRST(Lp)) Lp = RED(Lp); r1 = FIRST(Lp); p = ISUM(a,r1 - r); Step2: /* Repeated trial division. */ while (ICOMP(p,b) <= 0) { if (p < BETA) IDQR(n,p,&q,&r); else IQR(n,p,&q,&r); if (r == 0) goto Return; Lp = RED(Lp); if (Lp == NIL) { Lp = UZ210; r2 = r1 - 210; } else r2 = r1; r1 = FIRST(Lp); if (p < BETA) { pp = p + r1 - r2; if (pp >= BETA) p = LIST2(pp - BETA,1); else p = pp; } else p = ISUM(p,r1 - r2); } Step3: /* No divisors found. */ p = 1; q = n; Return: /* Prepare for return. */ *p_ = p; *q_ = q; return; } saclib2.2.8/src/IHEGCD.c0000664002275300236100000000316514017255270013633 0ustar wcbrownscs/*=========================================================================== IHEGCD(A,B; C,V) Integer half-extended greatest common divisor. Inputs A, B : in Z. Outputs C : gcd(A,B). V : If A /= 0, B*V=C(mod A), with abs(V) <= abs(A)/2C. If A=0, V=sign(B). ===========================================================================*/ #include "saclib.h" void IHEGCD(A,B, C_,V_) Word A,B, *C_,*V_; { Word A1,A2,A3,A4,C,Q,V,V1,V2,V3,V4,a,b,h,m1,m2,s,u1,u2,v1,v2; Step1: /* Compute absolute values and compare, and prepare v1, v2. */ A1 = IABSF(A); s = ISIGNF(B); if (s < 0) A2 = INEG(B); else A2 = B; if (ICOMP(A1,A2) < 0) { A3 = A1; A1 = A2; A2 = A3; V1 = s; V2 = 0; } else { V1 = 0; V2 = s; } Step2: /* Compute remainder and cosequence. */ while (A2 != 0) { if (A1 < BETA) { DEGCD(A1,A2,&C,&u1,&v1); V = IDIPR2(V1,V2,u1,v1); goto Return; } m1 = ILOG2(A1); m2 = ILOG2(A2); if (m1 - m2 >= ZETA / 2) { IQR(A1,A2,&Q,&A4); A3 = A2; V3 = V2; V4 = IDIF(V1,IPROD(V2,Q)); } else { h = m1 - ZETA; a = ITRUNC(A1,h); b = ITRUNC(A2,h); DPCC(a,b,&u1,&u2,&v1,&v2); if (v1 == 0) { IQR(A1,A2,&Q,&A4); A3 = A2; V3 = V2; V4 = IDIF(V1,IPROD(V2,Q)); } else { A3 = ILCOMB(A1,A2,u1,v1); A4 = ILCOMB(A1,A2,u2,v2); V3 = IDIPR2(V1,V2,u1,v1); V4 = IDIPR2(V1,V2,u2,v2); } } A1 = A3; A2 = A4; V1 = V3; V2 = V4; } C = A1; V = V1; Return: /* Prepare for return. */ *C_ = C; *V_ = V; return; } saclib2.2.8/src/IUPVART.c0000664002275300236100000000124714017255270014041 0ustar wcbrownscs/*====================================================================== t <- IUPVART(A) Integral univariate polynomial variation test. Inputs A : in Z[x], non-zero. Outputs t : t = 1 if A has at least one sign variation; otherwise t = 0. ======================================================================*/ #include "saclib.h" Word IUPVART(A) Word A; { Word Ap,a,e,s,t,u; Step1: /* Compute. */ Ap = A; ADV2(Ap,&e,&a,&Ap); s = ISIGNF(a); t = 0; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); u = ISIGNF(a); if (u != s) { t = 1; goto Return; } } Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/IEEENEIGH.c0000664002275300236100000000427714017255270014177 0ustar wcbrownscs/*====================================================================== IEEENEIGH(F,d; F',t) IEEE neighbor. Inputs F : An IEEE double. d : -1 or +1. Outputs F' : An IEEE double. F' is the IEEE double that neighbors F in the positive or negative direction, according to whether d is positive or negative. t : If t = 0, overflow or underflow occurred and F' is undefined. ======================================================================*/ #include "saclib.h" void IEEENEIGH(F,d,Fp_,t_) ieee F; BDigit d; ieee *Fp_; BDigit *t_; { BDigit s,e,a1,a0,sp,ep,ap1,ap0,t; ieee Fp; Step1: /* Unpack. */ e = F.rep.exp; a0 = F.rep.mant_l; a1 = F.rep.mant_h; if (F.rep.sign == 0) s = 1; else s = -1; Step2: /* F = 0. */ if (e == 0 && a1 == 0 && a0 == 0) { ep = 0; ap1 = 0; ap0 = 1; if (d == -1) sp = 1; else sp = 0; t = 0; goto Return; } sp = F.rep.sign; if (s != d) goto Step4; Step3: /* Away from zero. */ if (a1 == 0xFFFFF && a0 == 0XFFFFFFFF) { if (e - BIAS == MAXEXP) { t = 0; goto Return; } else { ap1 = 0; ap0 = 0; ep = e + 1; } } else if (a0 == 0xFFFFFFFF) { ap0 = 0; ap1 = a1+1; ep = e; } else { ap0 = a0 + 1; ap1 = a1; ep = e; } goto Step5; Step4: /* Towards zero. */ if (a1 == 0 && a0 == 0) { if (e - BIAS == MINEXP) { t = 0; goto Return; } else { ap0 = 0xFFFFFFFF; ap1 = 0xFFFFF; ep = F.rep.exp - 1; } } else if (a0 == 0) { ap0 = 0xFFFFFFFF; ap1 = a1 - 1; ep = F.rep.exp; } else { ap0 = a0 - 1; ap1 = a1; ep = e; } Step5: /* Compose F'. */ Fp.rep.sign = sp; Fp.rep.exp = ep; Fp.rep.mant_l = ap0; Fp.rep.mant_h = ap1; t = 1; Return: /* Return F' and u. */ *Fp_ = Fp; *t_ = t; return; } saclib2.2.8/src/IPDSCR.c0000664002275300236100000000135214017255270013670 0ustar wcbrownscs/*=========================================================================== B <- IPDSCR(r,A) Integral polynomial discriminant. Inputs r : a BETA-digit, r > 0. A : in Z[x_1,...,x_r], of degree greater than or equal to two in its main variable. Outputs B : in Z[x_1,...,x_{r-1}], the discriminant of A. ===========================================================================*/ #include "saclib.h" Word IPDSCR(r,A) Word r,A; { Word Ap,B,a,n,rp; Step1: /* Compute. */ Ap = IPDMV(r,A); B = IPRES(r,A,Ap); a = PLDCF(A); rp = r - 1; B = IPEQ(rp,B,a); n = PDEG(A); if (REM(n,4) >= 2) B = IPNEG(rp,B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MIPFSM.c0000664002275300236100000000207214017255270013677 0ustar wcbrownscs/*====================================================================== B <- MIPFSM(r,M,A) Modular integral polynomial from symmetric modular. Inputs M : in Z, M > 0. A : in Z'/(M)[X1,...,Xr] r : a BETA-digit, r >= 0, the number of variables. Outputs B : in Z/(M)[X1,...,Xr], with B = A (modulo M). ======================================================================*/ #include "saclib.h" Word MIPFSM(r,M,A) Word r,M,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { if (ISIGNF(A) < 0) B = ISUM(M,A); else B = A; goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); b = MIPFSM(rp,M,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LSRCH.c0000664002275300236100000000116214017255270013556 0ustar wcbrownscs/*=========================================================================== i <- LSRCH(a,A) List search. Input A : is a list (A_1,...,A_n) of objects. a : is an object. Output i : the least j, if any, such that a = A_j; otherwise 0. ===========================================================================*/ #include "saclib.h" Word LSRCH(a,A) Word a,A; { Word Ap,a1,i; Step1: /* Search. */ Ap = A; i = 1; while (Ap != NIL) { ADV(Ap,&a1,&Ap); if (EQUAL(a1,a)) goto Return; i = i + 1; } i = 0; Return: /* Prepare for return. */ return(i); } saclib2.2.8/src/MICS.c0000664002275300236100000000215314017255270013437 0ustar wcbrownscs/*====================================================================== B <- MICS(A) Matrix of integers column sort. Inputs A : a matrix over Z, with nonnegative elements in first row. A is represented as a list of columns. Outputs B : a matrix over Z. B is obtained by sorting columns of A such that elements of the first row are in descending order. Remarks: A is modified. ======================================================================*/ #include "saclib.h" Word MICS(A) Word A; { Word A1,A2,Ap,App,B,a1,a2,s; /* hide algorithm */ Step1: /* Bubble sort columns. */ do { Ap = A; s = 0; while (RED(Ap) != NIL) { ADV(Ap,&A1,&App); A2 = FIRST(App); a1 = FIRST(A1); a2 = FIRST(A2); if (ICOMP(a1,a2) < 0) { SFIRST(Ap,A2); SFIRST(App,A1); s = 1; } Ap = App; } } while (s != 0); B = A; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LPBSD.c0000664002275300236100000000216714017255270013555 0ustar wcbrownscs/*=========================================================================== LPBSD(L) List of polynomials bubble-sort, by degrees. Input L : a list of nonzero polynomials. Side effects L is sorted into non-decreasing degree order by the bubble-sort method. The sort is stable: polynomials with the same degree appear in the sorted list in the same order as they do in the list before the sort. The list L, though not its location, is modified. ===========================================================================*/ #include "saclib.h" void LPBSD(L) Word L; { Word Lp,Lpp,M,Mp,ap,app,dp,dpp; Step1: /* Trivial case. */ if (L == NIL) goto Return; Step2: /* General case. */ M = NIL; do { Lp = L; Lpp = RED(Lp); ap = FIRST(Lp); dp = PDEG(ap); Mp = NIL; while (Lpp != M) { app = FIRST(Lpp); dpp = PDEG(app); if (dp > dpp) { SFIRST(Lp,app); SFIRST(Lpp,ap); Mp = Lpp; } else { ap = app; dp = dpp; } Lp = Lpp; Lpp = RED(Lp); } M = Mp; } while (M != NIL); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IDIF.c0000664002275300236100000001016314017255270013417 0ustar wcbrownscs/*=========================================================================== C <- IDIF(A,B) Integer difference. Inputs A, B : in Z. Outputs C : A - B. ===========================================================================*/ #include "saclib.h" Word IDIF(A,B) Word A,B; { Word Ap,Bp,C,Cb,Cp,Cpp,Cs,a,b,c,cp,s,t,u; Step1: /* A or B zero. */ if (A == 0) { C = INEG(B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* A and B single-precision. */ if (A < BETA && B < BETA) { c = A - B; if (c >= BETA) C = LIST2(c - BETA,1); else if (c <= -BETA) C = LIST2(c + BETA,-1); else C = c; goto Return; } Step3: /* Determine signs of inputs. */ s = ISIGNF(A); t = ISIGNF(B); Step4: /* A or B single-precision. */ if (A < BETA) Ap = LIST1(A); else Ap = A; if (B < BETA) Bp = LIST1(B); else Bp = B; Step5: /* Initialize and branch on signs. */ if (AVAIL == NIL) GC(); C = AVAIL; Cpp = C; if (s == t) goto Step8; else if (s < 0) goto Step7; Step6: /* A positive and B negative, subtract with carry. */ cp = 0; do { Cp = Cpp; if (Ap != NIL) { a = FIRST(Ap); Ap = RED(Ap); } else a = 0; if (Bp != NIL) { b = FIRST(Bp); Bp = RED(Bp); } else b = 0; c = a - b; c = c + cp; if (c >= BETA) { c = c - BETA; cp = 1; } else cp = 0; SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (cp != 0 || (Ap != NIL && Bp != NIL)); AVAIL = Cpp; if (Ap == NIL && Bp != NIL) Ap = INEG(Bp); SRED(Cp,Ap); goto Return; Step7: /* A negative and B positive, subtract with carry. */ cp = 0; do { Cp = Cpp; if (Ap != NIL) { a = FIRST(Ap); Ap = RED(Ap); } else a = 0; if (Bp != NIL) { b = FIRST(Bp); Bp = RED(Bp); } else b = 0; c = a - b; c = c + cp; if (c <= -BETA) { c = c + BETA; cp = -1; } else cp = 0; SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (cp != 0 || (Ap != NIL && Bp != NIL)); AVAIL = Cpp; if (Ap == NIL && Bp != NIL) Ap = INEG(Bp); SRED(Cp,Ap); goto Return; Step8: /* Same signs, subtract without carry. */ u = 0; do { Cp = Cpp; a = FIRST(Ap); Ap = RED(Ap); b = FIRST(Bp); Bp = RED(Bp); c = a - b; if (c != 0) u = c; SFIRST(Cp,c); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (Ap != NIL && Bp != NIL); AVAIL = Cpp; if (Ap == NIL && Bp != NIL) { Ap = INEG(Bp); s = -t; } Cpp = AVAIL; Step9: /* Difference zero. */ if (u == 0 && Ap == NIL) { AVAIL = C; C = 0; goto Return; } Step10: /* Continue with longer input. */ if (u == 0 || (Ap != NIL && s != signm(u))) { do { Cp = Cpp; a = FIRST(Ap); Ap = RED(Ap); SFIRST(Cp,a); Cpp = RED(Cp); if (Cpp == NIL) { AVAIL = NIL; GC(); Cpp = AVAIL; SRED(Cp,Cpp); } } while (a == 0); u = a; } AVAIL = Cpp; SRED(Cp,NIL); Step11: /* Normalize the result. */ Cb = C; Cs = 0; cp = 0; if (u < 0) do { c = FIRST(Cb); c = c + cp; if (c > 0) { c = c - BETA; cp = 1; } else cp = 0; if (c != 0) Cs = Cb; SFIRST(Cb,c); Cb = RED(Cb); } while (Cb != NIL); else do { c = FIRST(Cb); c = c + cp; if (c < 0) { c = c + BETA; cp = -1; } else cp = 0; if (c != 0) Cs = Cb; SFIRST(Cb,c); Cb = RED(Cb); } while (Cb != NIL); Step12: /* Concatenate or delete leading zeros. */ if (Ap == NIL) SRED(Cs,NIL); else SRED(Cp,Ap); if (RED(C) == NIL) C = FIRST(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MPMON.c0000664002275300236100000000154714017255270013600 0ustar wcbrownscs/*====================================================================== Ap <- MPMON(r,m,A) Modular polynomial monic. Inputs r : a BETA-digit, r >= 1, the number of variables; m : a positive BETA-digit; A : in Z/(m)[X1,...,Xr] and lbcf(A) is a unit in Z/(m). Outputs Ap : in Z/(m)[X1,...,Xr]. If A is non-zero then Ap is the polynomial similar to A with lbcf(Ap)=1. If A=0 then Ap=0. ======================================================================*/ #include "saclib.h" Word MPMON(r,m,A) Word r,m,A; { Word Ap,a,ap; /* hide algorithm */ Step1: /* A=0. */ if (A == 0) { Ap = 0; goto Return; } Step2: /* A non-zero. */ a = PLBCF(r,A); ap = MDINV(m,a); Ap = MPMDP(r,m,ap,A); Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/FRAPFREE.c0000664002275300236100000000136214017255270014077 0ustar wcbrownscs/*=========================================================================== FRAPFREE(A) Finite ring array polynomial free memory. Inputs A : a pointer to an array, memory for which was allocated using FRAPGET. Side effects The memory allocated to A is freed. ===========================================================================*/ #include "saclib.h" void FRAPFREE(A) Word **A; { Word d,i; Step1: /* Determine how many coefficients. */ d = FRAPSIZE(A); FREEARRAY(A[-1]); Step2: /* Free memory of each coefficient. */ for (i = 0; i <= d; i++) MAPFREE(FRAPCF(A,i)); Step3: /* Free main array. */ A = A - 1; FREEARRAY(A); Return: /* Prepare for return. */ return; } saclib2.2.8/src/MUPHEG.c0000664002275300236100000000241714017255270013674 0ustar wcbrownscs/*====================================================================== MUPHEG(p,A,B; C,V) Modular univariate polynomial half-extended greatest common divisor. Inputs p : a BETA-digit, prime. A,B : in Z/(p)[X]. Outputs C : in Z/(p)[X], C = gcd(A,B). V : in Z/(p)[X] such that there exists a polynomial U such that AU+BV=C. If deg(A/C) > 0, then deg(V) < deg(A/C). If deg(A/C) = 0, deg(V) = 0. If B = 0, V = 0. ======================================================================*/ #include "saclib.h" void MUPHEG(p,A,B, C_,V_) Word p,A,B, *C_,*V_; { Word A1,A2,A3,C,Q,V,V1,V2,V3,a,ap; /* hide a,ap; */ Step1: /* Compute remainder sequence. */ V1 = 0; V2 = LIST2(0,1); A1 = A; A2 = B; while (A2 != 0) { MPQR(1,p,A1,A2,&Q,&A3); V3 = MPDIF(1,p,V1,MPPROD(1,p,Q,V2)); A1 = A2; A2 = A3; V1 = V2; V2 = V3; } Step2: /* Adjust ldcf. */ if (A1 == 0) { C = 0; V = 0; goto Return; } a = PLDCF(A1); ap = MDINV(p,a); C = MPMDP(1,p,ap,A1); V = MPMDP(1,p,ap,V1); Return: /* Prepare for return. */ *C_ = C; *V_ = V; return; } saclib2.2.8/src/IDENTMAT.c0000664002275300236100000000115714017255270014114 0ustar wcbrownscs/*=========================================================================== M <- IDENTMAT(n) Identity matrix. Input: n : a non-negative BETA-digit. Ouput M : the n by n integer identity matrix. ===========================================================================*/ #include "saclib.h" Word IDENTMAT(n) Word n; { Word M,M1,i,j; Step1: /* Construct. */ M = NIL; for (i = 1; i <= n; i++) { M1 = NIL; for (j = 1; j <= n; j++) if (i == j) M1 = COMP(1,M1); else M1 = COMP(0,M1); M = COMP(M1,M); } Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/DLINV.c0000664002275300236100000000102314017255270013553 0ustar wcbrownscs/*======================================================================= b <- DLINV(a) Discrete logarithm inverse. Input a : a nonzero element of a field represented as a discrete logarithm. Output b : b = 1 / a, the inverse of a in the field. =======================================================================*/ #include "saclib.h" BDigit DLINV(a) BDigit a; { BDigit b; Step1: /* Obvious. */ if (a == FFSIZE) b = a; else b = FFSIZE - a; Return: /* Return b. */ return(b); } saclib2.2.8/src/HIQUOT.c0000664002275300236100000000310614017255270013714 0ustar wcbrownscs/*====================================================================== K <- HIQUOT(I,J) Hardware interval quotient. Inputs I, J : hardware intervals. J does not contain 0. Output K : the smallest hardware interval containing I / J. Warning HIQUOT is not floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" interval HIQUOT(I,J) interval I,J; { double a1,a2,b1,b2; interval K; Step1: /* Extract endpoints. */ a1 = I.left; a2 = I.right; b1 = J.left; b2 = J.right; Step2: /* a1 >= 0. */ if (a1 >= 0) { if (b1 > 0) { rounddown(); K.left = a1 / b2; roundup(); K.right = a2 / b1; } else { rounddown(); K.left = a2 / b2; roundup(); K.right = a1 / b1; } goto Return; } Step3: /* a2 < 0. */ if (a2 < 0) { if (b1 >= 0) { rounddown(); K.left = a1 / b1; roundup(); K.right = a2 / b2; } else { rounddown(); K.left = a2 / b1; roundup(); K.right = a1 / b2; } goto Return; } Step4: /* a1 < 0 <= a2. */ if (b1 >= 0) { rounddown(); K.left = a1 / b1; roundup(); K.right = a2 / b1; } else { rounddown(); K.left = a2 / b2; roundup(); K.right = a1 / b2; } Return: /* Return K. */ return(K); } saclib2.2.8/src/VLSRCH.c0000664002275300236100000000133514017255270013706 0ustar wcbrownscs/*====================================================================== i <- VLSRCH(v,V) Variable list search. Inputs v : a variable. V : a list of variables (v1,...,vn), n non-negative. Outputs i : integer. If v = vj for some j then i=j. Otherwise i=0. ======================================================================*/ #include "saclib.h" Word VLSRCH(v,V) Word v,V; { Word Vp,i,v1; /* hide algorithm */ Step1: /* Search. */ Vp = V; i = 1; while (Vp != NIL) { ADV(Vp,&v1,&Vp); if (EQUAL(v,v1) == 1) goto Return; i = i + 1; } i = 0; Return: /* Prepare for return. */ return(i); } saclib2.2.8/src/RPREAD.c0000664002275300236100000000407114017255270013662 0ustar wcbrownscs/*====================================================================== RPREAD(; r,A) Rational polynomial read. Outputs A : in Q[X1,...Xr]. A is read from the input stream. Any preceding blanks and blanks separating coefficients, variables, exponents and the symbols *,+,- and ^ are skipped. r : a BETA-digit, r >= 0, the number of variables. ======================================================================*/ #include "saclib.h" void RPREAD(r_,A_) Word *r_,*A_; { Word A,C,Cp,a,e,r,rp,v; /* hide A,C,Cpa,e,r,rp,v; */ Step1: /* r = 0. */ C = CREADB(); if (C != '(') { BKSP(); A = RNREAD(); r = 0; goto Return; } Step2: /* Initialize. */ A = NIL; rp = 0; Step3: /* Read first coefficient. */ C = LKAHEAD(); if (LETTER(C) || DIGIT(C) || (C == '(')) { if (LETTER(C)) a = RNINT(1); else if (DIGIT(C)) a = RNREAD(); else if (C == '(') RPREAD(&rp,&a); goto Step5; } Step4: /* Read coefficient. */ C = CREADB(); if (C != '+' && C != '-') goto Step7; Cp = LKAHEAD(); if (LETTER(Cp) || DIGIT(Cp)) { if (LETTER(Cp)) a = RNINT(1); else a = RNREAD(); if (C == '-') a = RNNEG(a); } if (Cp == '(') { RPREAD(&rp,&a); if (C == '-') a = RPNEG(rp,a); } Step5: /* Read variable and exponent. */ C = LKAHEAD(); if (LETTER(C)) { v = VREAD(); C = CREADB(); if (C != '^') { e = 1; BKSP(); } else { C = LKAHEAD(); if (DIGIT(C)) e = AREAD(); else goto Step7; } } else e = 0; Step6: /* Check for end. */ A = COMP2(a,e,A); C = CREADB(); if (C != ')') { BKSP(); goto Step4; } else r = rp + 1; A = INV(A); goto Return; Step7: /* Error. */ FAIL("RPREAD","Unexpected character",C); Return: /* Prepare for return. */ *r_ = r; *A_ = A; return; } saclib2.2.8/src/HIPCOPY.c0000664002275300236100000000106514017255270014020 0ustar wcbrownscs/*====================================================================== B <- HIPCOPY(n,A) Hardware interval polynomial copy. Inputs n : a BETA-digit. A : in HI[X], deg(A) = n. Output B : in HI[X], B(X) = A(X). ======================================================================*/ #include "saclib.h" interval *HIPCOPY(n,A) BDigit n; interval A[]; { BDigit i; interval *B; Step1: /* Get array. */ B = GETHIPARRAY(n); Step2: /* Copy. */ for (i = 0;i <= n;i++) B[i] = A[i]; Return: /* Return B. */ return(B); } saclib2.2.8/src/LBRNDWRITE.c0000664002275300236100000000141014017255270014353 0ustar wcbrownscs/*====================================================================== LBRNDWRITE(R,n) Logarithmic binary rational number decimal write. Inputs R : a logaritghmic binary rational number. n : a non-negative integer. Effect R is printed as a rounded decimal fraction with n decimal digits following the decimal point, and with a trailing '+' or '-' indicating whether the exact value is larger or smaller. ======================================================================*/ #include "saclib.h" void LBRNDWRITE(R,n) Word R; BDigit n; { Word S; Step1: /* Convert from logarithmic representation. */ S = LBRNRN(R); Step2: /* Apply RNDWRITE. */ RNDWRITE(S,n); Return: /* Return. */ return; } saclib2.2.8/src/IBPPOL.c0000664002275300236100000000203514017255270013670 0ustar wcbrownscs/*===================================================================== L <- IBPPOL(A,a,k) Integral bivariate polynomial points on line. Inputs A: an integral bivariate polynomial A(x,y) of positive degree in y. a: a binary rational number. k: an integer. Output L: a list of logarithmic binary rational numbers (a_1, ...,a_r) such that r is the number of real roots of A(a,y) and the i-th real root is either equal to a_i or is in the open interval (a_i,a_i + 2^{-k}. ======================================================================*/ #include "saclib.h" Word IBPPOL(A,a,k) Word A,a,k; { Word B,d,I,L,Lp; Step1: /* Compute B(y) = A(a,y). */ B = IPBREI(2,A,1,a); Step2: /* Isolate and refine the real roots of B. */ if (PDEG(B) == 0) L = NIL; else L = IPRRIRDB(B,-k); Step3: /* Replace each isolating interval with its left endpoint. */ Lp = NIL; while (L != NIL) { ADV(L,&I,&L); d = FIRST(I); Lp = COMP(d,Lp); } L = INV(Lp); Return: /* Return L. */ return(L); } saclib2.2.8/src/IPLCPP.c0000664002275300236100000000255014017255270013674 0ustar wcbrownscs/*====================================================================== IPLCPP(r,A; C,P) Integral polynomial list of contents and primitive parts. Inputs r : a BETA-digit, r > 0. A : a list (A1,...,An), n >= 0, of polynomials in Z[X1,...,Xr]. Outputs C : a list (C1,...,Cs), 0 <= s <= n, of elements of Z[X1,...,X_{r-1}] such that for 1 <= i <= n, content(Ai) = Cj for some j, 1 <= j <= s, if and only if content(Ai) has positive degree in some variable. P : a list (P1,...,Pm), 0 <= m <= n, of polynomials in Z[X1,...,Xr] such that for 1 <= i <= n, primitive_part(Ai) = Pj for some j, 1 <= j <= m, if and only if primitive_part(Ai) has positive degree in its main variable. ======================================================================*/ #include "saclib.h" void IPLCPP(r,A, C_,P_) Word r,A, *C_,*P_; { Word A1,Ap,C,C1,P,P1,rp,s; /* hide A1,Ap,rp,s; */ Step1: /* Compute. */ C = NIL; P = NIL; Ap = A; rp = r - 1; while (Ap != NIL) { ADV(Ap,&A1,&Ap); IPSCPP(r,A1,&s,&C1,&P1); if (!PCONST(rp,C1)) C = COMP(C1,C); if (PDEG(P1) > 0) P = COMP(P1,P); } C = INV(C); P = INV(P); Return: /* Prepare for return. */ *C_ = C; *P_ = P; return; } saclib2.2.8/src/IPRCN1.c0000664002275300236100000000262414017255270013643 0ustar wcbrownscs/*====================================================================== J <- IPRCN1(A,I,s,k) Integral polynomial real root calculation, 1 root. Inputs A : in Z[X], positive, primitive, deg(A) > 0. I : an open standard interval (a1,a2) with binary rational endpoints containing a unique root alpha of A and containing no roots of A' or A''. min(|A'(a1)|,|A'(a2)|) >= (3/4)max(|A'(a1)|,|A'(a2)|). s : a BETA-digit, is the sign of A' * A'' on I. k : a BETA-digit. Outputs J : a subinterval of I of length 2^k or less containing alpha and with binary rational endpoints. ======================================================================*/ #include "saclib.h" Word IPRCN1(A,I,s,k) Word A,I,s,k; { Word Ap,J,b,b1,b2,d1,d2,dp,q1,q2; /* hide b; */ Step1: /* Initialize. */ Ap = IPDMV(1,A); J = I; Step2: /* Refine interval. */ while (RILC(J,k) == 0) { FIRST2(J,&b1,&b2); d1 = IUPBRE(A,b1); d2 = IUPBRE(A,b2); if (s < 0) b = b1; else b = b2; dp = IUPBRE(Ap,b); q1 = RNQ(d1,dp); q2 = RNQ(d2,dp); b1 = RNDIF(b1,q1); b2 = RNDIF(b2,q2); J = LIST2(b1,b2); if (RNCOMP(b1,b2) == 0) goto Return; J = RINT(J); } Return: /* Prepare for return. */ return(J); } saclib2.2.8/src/PICPV.c0000664002275300236100000000151714017255270013570 0ustar wcbrownscs/*====================================================================== B <- PICPV(r,A,i,j) Polynomial inverse cyclic permutation of variables. Inputs r : an element of Z. r >= 2. A : an element of R[X1,...,Xr] i : 1 <= i <= r. j : i < j <= r. Outputs B : an element of R[X1,...,Xr]. B(X1,...,Xr) = A(X1,...,X_{i-1},X_{i+1},...,Xj,Xi,X_{j+1},...,Xr) = A(X_p(1),...,X_p(r)), where p = (i,i+1,...,j) ======================================================================*/ #include "saclib.h" Word PICPV(r,A,i,j) Word r,A,i,j; { Word B; Word B1; Step1: /* (i,...,j) = (j,j-1)(i,...,j-1). */ if (j == i + 1) { B1 = A; } else { B1 = PICPV(r,A,i,j - 1); } B = PTV(r,B1,j); Return: return(B); } saclib2.2.8/src/DGCD.c0000664002275300236100000000311514017255270013404 0ustar wcbrownscs/*========================================================================= c <- DGCD(a,b) Digit greatest common divisor. Inputs a, b : BETA-digits, a >= b >= 0. Outputs c : a BETA-digit, c = gcd(a,b). Method The Euclidean algorithm with divisions performed by shifting and subtraction. ===========================================================================*/ #include "saclib.h" Word DGCD(a,b) Word a,b; { Word a1,a2,a3,b2,c,d; Step1: /* b = 0. */ if (b == 0) { c = a; goto Return; } Step2: /* Initialize. */ a1 = a; a2 = b; Step3: /* Quotient is less than 8. */ a3 = a1 - a2; d = a3 - a2; if (d < 0) goto Step5; a3 = d; d = a3 - a2; if (d < 0) goto Step5; a3 = d; d = a3 - a2; if (d < 0) goto Step5; a3 = d; d = a3 - a2; if (d < 0) goto Step5; a3 = d; d = a3 - a2; if (d < 0) goto Step5; a3 = d; d = a3 - a2; if (d < 0) goto Step5; a3 = d; d = a3 - a2; if (d < 0) goto Step5; Step4: /* Quotient is 8 or more; divide by shifting and subtraction. */ b2 = a2 << 1; while (b2 <= a3) b2 = b2 << 1; b2 = b2 >> 1; while (b2 >= a2) { if (b2 < a3) a3 = a3 - b2; b2 = b2 >> 1; } Step5: /* Check for completion. */ if (a3 == 0) { c = a2; goto Return; } Step6: /* Update and go back to Step3. */ a1 = a2; a2 = a3; goto Step3; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/IPSFBA.c0000664002275300236100000000234014017255270013646 0ustar wcbrownscs/*====================================================================== Bs <- IPSFBA(r,A,B) Integral polynomial squarefree basis augmentation. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr], A primitive, positive, squarefree, and of positive degree in its main variable. B : a list (B1,...,Bs), s >= 0, of polynomials in Z[X1,...,Xr]. B is a squarefree basis. Outputs Bs : a list of polynomials in Z[X1,...,Xr], a coarsest squarefree basis for (A,B1,...,Bs). ======================================================================*/ #include "saclib.h" Word IPSFBA(r,A,B) Word r,A,B; { Word Abp,Ap,B1,Bb1,Bp,Bs,C; /* hide B1,Bp; */ Step1: /* Compute. */ Ap = A; Bp = B; Bs = NIL; while (Bp != NIL && PDEG(Ap) > 0) { ADV(Bp,&B1,&Bp); IPGCDC(r,Ap,B1,&C,&Abp,&Bb1); if (PDEG(C) > 0) Bs = COMP(C,Bs); if (PDEG(Bb1) > 0) Bs = COMP(Bb1,Bs); Ap = Abp; } if (PDEG(Ap) > 0) Bs = COMP(Ap,Bs); while (Bp != NIL) { ADV(Bp,&B1,&Bp); Bs = COMP(B1,Bs); } Return: /* Prepare for return. */ return(Bs); } saclib2.2.8/src/MUPDER.c0000664002275300236100000000141514017255270013700 0ustar wcbrownscs/*=========================================================================== B <- MUPDER(m,A) Modular univariate polynomial derivative. Inputs A : in Z/(m)[X]. m : a BETA-digit. Outputs B : in Z/(m)[X], the derivative of A. ===========================================================================*/ #include "saclib.h" Word MUPDER(m,A) Word m,A; { Word Ap,B,a,e; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ B = NIL; Ap = A; do { ADV2(Ap,&e,&a,&Ap); a = MDPROD(m,e,a); if (a != 0) { e = e - 1; B = COMP2(a,e,B); } } while (Ap != NIL); if (B == NIL) B = 0; else B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPLSILM.c0000664002275300236100000000306714017255270014022 0ustar wcbrownscs/*===================================================================== L <- IPLSILM(L1,L2) Integral polynomial labeled standard isolation list merge. Inputs L1, L2 : labeled standard isolation lists such that the sets of roots isolated by L1 and L2 are disjoint. Outputs L : a labeled standard isolation list for all roots isolated by either L1 or L2. =====================================================================*/ #include "saclib.h" Word IPLSILM(L1,L2) Word L1,L2; { Word A1,A2,I1,I2,Is1,Is2,L,Lp1,Lp2,s,t1,t2,T1,T2; Step1: /* L1 or L2 empty. */ if (L1 == NIL) { L = L2; goto Return; } if (L2 == NIL) { L = L1; goto Return; } Step2: /* Initialize L, T1, T2, Lp1 and Lp2. */ L = NIL; ADV(L1,&T1,&Lp1); ADV(L2,&T2,&Lp2); Step3: /* Get components of T1 and T2. */ FIRST3(T1,&I1,&A1,&t1); FIRST3(T2,&I2,&A2,&t2); Step4: /* Apply IPIIS repeatedly. */ IPIIS(A1,A2,I1,I2,t1,t2,&Is1,&Is2,&s); T1 = LIST3(Is1,A1,t1); T2 = LIST3(Is2,A2,t2); if (s < 0) { L = COMP(T1,L); if (Lp1 == NIL) { L = COMP(T2,L); goto Step5; } else ADV(Lp1,&T1,&Lp1); } else { L = COMP(T2,L); if (Lp2 == NIL) { L = COMP(T1,L); Lp2 = Lp1; goto Step5; } else ADV(Lp2,&T2,&Lp2); } goto Step3; Step5: /* Include remaining elements of Lp2 in L and invert. */ while (Lp2 != NIL) { ADV(Lp2,&T2,&Lp2); L = COMP(T2,L); } L = INV(L); Return: /* Return L. */ return(L); } saclib2.2.8/src/PHDQR.c0000664002275300236100000000232114017255270013557 0ustar wcbrownscs/*====================================================================== PHDQR(a1,a0,b;q,r) Positive half-digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 and a0 non-negative, b < 2^15 and a = a1 * BETA + a0 < b * BETA. Outputs q : a BETA-integer, the integral part of a / b. r : a BETA-integer, a - b * q. Restriction: This program is valid only if the word length is 32 bits and ZETA = 29. ======================================================================*/ #include "saclib.h" void PHDQR(a1,a0,b,q_,r_) Word a1,a0,b,*q_,*r_; { Word a,ap,c,c1,c0,q,q1,q0,r; Step1: /* Compute q1 = [[a / 2^15] / b]. */ ap = (a1<<14) | (a0 >> 15); q1 = ap / b; Step2: /* Subtract 2^15 * b * q1 from a. */ c = b * q1; c1 = c >> 14; c0 = (c << 15) & BETA1; a0 = a0 - c0; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; } a1 = a1 - c1; Step3: /* Compute q0 = [a / b]. */ a = a0; if (a1 > 0) a = a + BETA; q0 = a / b; Step4: /* Compute r = a - b * q0. */ c = b * q0; r = a0 - c; if (r < 0) r = r + BETA; Step5: /* Compute q = 2^15 * q1 + q0. */ q = (q1 << 15) | q0; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/src/ISLIST.c0000664002275300236100000000076214017255270013717 0ustar wcbrownscs/*=========================================================================== t <- ISLIST(a) Is list. Inputs a : a Word. Outputs t : a BETA-digit. t = 1 if a is a list (possibly NIL), t = 0 otherwise. ===========================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word ISLIST(a) Word a; { return((BETA < a && a < BETAp && (a & 1)) || a == BETA); } saclib2.2.8/src/NORMLHS.c0000664002275300236100000000433514017255270014032 0ustar wcbrownscs/*=========================================================================== NORMLHS(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B; Qs,Y,Z,Us,As,Bs) Norm polynomial linear Hensel step. Inputs q : a positive BETA-digit. Q : in Z, Q = q^k, k >= 2. Qpp : Q / q^2. Ab,Bb,Sb,Tb : lists (Ab_1,...,Ab_r),(Bb_1,...,Bb_{r-1}), (Sb_1,...,Sb_{r-1}),(Tb_1,...,Tb_{r-1}) of elements of Z_q[x] such that Ab_i Sb_i + Bb_i Tb_i = 1, deg(Sb_i) < deg(Bb_i), deg(Tb_i) < deg(Ab_i) for i = 1,...,r-1 and ldcf(Ab_i) = 1 for i = 1,...,r. Ap,Bp : lists (Ap_1,...,Ap_r),(Bp_1,...,Bp_{r-1} of elements of Z_{Q/q}[x] such that Ab_i = H_q(Ap_i), Bp_i = H_q(Bp_i) Yp,Zp : lists (Yp_1,...,Yp_{r-1}),(Zp_1,...,Zp_{r-1} of elements of Z_q[x] such that A_i = Ap_i + (Q/q)Zp_i, B_i = Bp_i + (Q/q)Yp_i. U : a list (U_1,...,U_{r-1} of elements of Z[x]. Yp_i,Zp_i,U_i satisy Ab_i Yp_i + Bb_i Zp_i = U_i (mod q). D : in Z_q[x]. A,B : lists (A_1,...,A_r),(B_1,...,B_{r-1}) of elements of Z_Q[x]. A_i = Ap_i + (Q/q)Zp_i, B_i = Bp_i + (Q/q)Yp_i for i = 1,...,r-1 and A_r is the monic associate of B_{r-1}. Outputs Qs : Q * q. Y,Z : lists (Y_1,...,Y_{r-1}),(Z_1,...,Z_{r-1}) of elements of Z_q[x]. Us : a list (U_1,...,U_{r-1}) of elements of Z[x]. Y_i,Z_i,U_i satisfy Ab_i Y_i + Bb_i Z_i = U_i (mod q). As,Bs : lists (As_1,...,As_r), (Bs_1,...,Bs_{r-1}) of elements of Z_{qQ}[x]. A_i = H_Q(As_i), B_i = H_Q(Bs_i). ===========================================================================*/ #include "saclib.h" void NORMLHS(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B,Qs_,Y_,Z_,Us_,As_,Bs_) Word q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B,*Qs_,*Y_,*Z_,*Us_,*As_,*Bs_; { Word As,At,Att,Bs,Qs,Us,Y,Z; Step1: /* Flatten the factor lists. */ At = NORMFL(Ap); Att = NORMFL(A); Step2: /* Lift. */ IUPLHSL(q,Q,Qpp,Ab,Bb,Sb,Tb,At,Bp,Yp,Zp,U,D,Att,B, &Qs,&Y,&Z,&Us,&As,&Bs); Step3: /* Regroup the factor list. */ As = NORMRL(Ap,As); Return: /* Prepare for return. */ *Qs_ = Qs; *Y_ = Y; *Z_ = Z; *Us_ = Us; *As_ = As; *Bs_ = Bs; return; } saclib2.2.8/src/IDLCOMB.c0000664002275300236100000000446614017255270013766 0ustar wcbrownscs/*=========================================================================== IDLCOMB(A,m,B,n,u1,v1,u2,v2,s,t; mp,np) Integer double linear combination. Inputs A, B : arrays containing integers A' and B', |A'| >= |B'|, with A and B having lengths of at least m + 2. m, n : the lengths in BETA-digits of A' and B', respectively. u1, v1, u2, v2: BETA-digits. s, t : the signs of the integers A'' and B'', respectively (see below). Outputs mp, np : The lengths in BETA-digits of A'' = u1 * A' + v1 * B' and B'' = u2 * A' + v2 * B', respectively. Side effects A'' replaces A' in A and B'' replaces B' in B. ===========================================================================*/ #include "saclib.h" void IDLCOMB(A,m,B,n,u1,v1,u2,v2,s,t, mp_,np_) Word *A,m,*B,n,u1,v1,u2,v2,s,t, *mp_,*np_; { Word a,a0,a1,b,b0,b1,c0,c1,d0,d1,i,mp,np; Step1: /* Multiply and add. */ c1 = 0; d1 = 0; for (i = 0; i < m; i++) { a = A[i]; if (i < n) b = B[i]; else b = 0; DPR(a,u1,&a1,&a0); DPR(b,v1,&b1,&b0); c0 = a0 + b0 + c1; c1 = a1 + b1; if (s > 0) { while (c0 <= 0) { c0 += BETA; c1--; } while (c0 >= BETA) { c0 -= BETA; c1++; } } else { while (c0 > 0) { c0 -= BETA; c1++; } while (c0 <= -BETA) { c0 += BETA; c1--; } } A[i] = c0; DPR(a,u2,&a1,&a0); DPR(b,v2,&b1,&b0); d0 = a0 + b0 + d1; d1 = a1 + b1; if (t > 0) { while (d0 <= 0) { d0 += BETA; d1--; } while (d0 >= BETA) { d0 -= BETA; d1++; } } else { while (d0 > 0) { d0 -= BETA; d1++; } while (d0 <= -BETA) { d0 += BETA; d1--; } } B[i] = d0; } if (absm(c1) >= BETA) { if (s > 0) { A[m] = c1 - BETA; A[m+1] = 1; } else { A[m] = c1 + BETA; A[m+1] = -1; } mp = m + 2; } else { A[m] = c1; mp = m + 1; } if (absm(d1) >= BETA) { if (t > 0) { B[m] = d1 - BETA; B[m+1] = 1; } else { B[m] = d1 + BETA; B[m+1] = -1; } np = m + 2; } else { B[m] = d1; np = m + 1; } Step2: /* Determine lengths. */ while (mp > 0 && A[mp-1] == 0) mp--; while (np > 0 && B[np-1] == 0) np--; Return: /* Prepare for return. */ *mp_ = mp; *np_ = np; return; } saclib2.2.8/src/AFCOMP.c0000664002275300236100000000121114017255270013643 0ustar wcbrownscs/*====================================================================== t <- AFCOMP(M,I,a,b) Algebraic number field comparison. Inputs M : in Z[X], the minimal polynomial of a real algebraic number alpha. I : an acceptable isolating interval for alpha. a, b : in Q(alpha). Outputs t : sign(a-b). ======================================================================*/ #include "saclib.h" Word AFCOMP(M,I,a,b) Word M,I,a,b; { Word c,t; /* hide t; */ Step1: /* Determine the sign. */ c = AFDIF(a,b); t = AFSIGN(M,I,c); Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/IUPQS.c0000664002275300236100000000140514017255270013604 0ustar wcbrownscs/*=========================================================================== B <- IUPQS(A) Integral univariate polynomial quotient substitution. Inputs A : a univariate integral polynomial. Outputs B : a bivariate integral polynomial. B(X,Y) = (Y^n)*A(X/Y) where n is the degree of A. ===========================================================================*/ #include "saclib.h" Word IUPQS(A) Word A; { Word Ap,a,B,e,n; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A/=0. */ n = PDEG(A); Ap = A; B = NIL; do { ADV2(Ap,&e,&a,&Ap); B = COMP2(n - e,LIST2(e,a),B); } while (Ap != NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MIPMON.c0000664002275300236100000000153514017255270013706 0ustar wcbrownscs/*=========================================================================== Ap <- MIPMON(r,M,A) Modular integral polynomial monic. Inputs r : a BETA-digit, r >= 1, the number of variables; M : in Z, M > 1. A : in Z/(M)[X1,...,Xr]. A = 0 or lbcf(A) is a unit in Z/(M). Outputs Ap : in Z/(M)[X1,...,Xr]. If A is non-zero then Ap is the polynomial similar to A with lbcf(Ap) = 1. If A = 0 then Ap = 0. ===========================================================================*/ #include "saclib.h" Word MIPMON(r,M,A) Word r,M,A; { Word Ap,a,ap; Step1: /* A = 0. */ if (A == 0) { Ap = 0; goto Return; } Step2: /* A non-zero. */ a = PLBCF(r,A); ap = MIINV(M,a); Ap = MIPMIP(r,M,ap,A); Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/LBRNREAD.c0000664002275300236100000000450614017255270014101 0ustar wcbrownscs/*====================================================================== B <- LBRNREAD() Logarithmic binary rational number read. Inputs (from the input stream) An element A of the ring Z[1/2] in external representation. The external representation of 0 is 0. Non-zero elements are represented in the form <*|/> Here, or may be omitted, but not both. If one of or is omitted, <*|/> is also omitted; otherwise, <*|/> has to be written. is a possibly signed integer, <*|/> is * or /, is either an unsigned integer which is a power of 2 or it is an explicit power of 2, i.e. of the form 2^. Outputs B : The internal representation of A: If A = 0, B = 0. If A /= 0, there is a unique pair (a,k) of integers with a odd and A = a/2^k. In this case, B is the list (a,k), where a is an integer and k is a BETA-digit. Side effects A logarithmic binary rational number is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word LBRNREAD() { BDigit k,n,s; Word A,a,B,P; char C; Step1: /* Read integer. */ A = IREAD(); Step2: /* Integer 0. */ if (A == 0) { B = 0; goto Return; } Step3: /* Explicit power of 2? */ if (A == 2 || A == -2) { C = CREAD(); if (C == '^') { a = ISIGNF(A); k = -IREAD(); goto Step8; } else BKSP(); } Step4: /* Extract power of 2. */ k = IORD2(A); a = IDP2(A,k); k = -k; Step5: /* Read * or /. */ C = CREAD(); if (C == '*') s = 1; else if (C == '/') s = -1; else { BKSP(); goto Step8; } Step6: /* Read power of 2. */ P = IREAD(); if (P == 2) { C = CREAD(); if (C == '^') n = IREAD(); else { n = 1; BKSP(); } } else n = IORD2(P); Step7: /* Adjust exponent. */ if (s == 1) n = -n; k = k + n; Step8: /* Compose. */ B = LIST2(a,k); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/PDPV.c0000664002275300236100000000211614017255270013454 0ustar wcbrownscs/*====================================================================== B <- PDPV(r,A,i,n) Polynomial division by power of variable. Inputs A : in R[X1,...,Xr], R a ring. r : a BETA-digit, r >= 1. i : a BETA-digit, 1 <= i <= r. n : a BETA-digit such that Xi^n divides A. Outputs B : in R[X1,...,Xr], B = A / Xi^n. ======================================================================*/ #include "saclib.h" Word PDPV(r,A,i,n) Word r,A,i,n; { Word Ap,B,a,b,e,f,rp; /* hide rp; */ Step1: /* A = 0 or n = 0. */ if (A == 0 || n == 0) { B = A; goto Return; } Step2: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (i == r) { b = a; f = e - n; } else { b = PDPV(rp,a,i,n); f = e; } B = COMP2(b,f,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IUPCHT.c0000664002275300236100000000107714017255270013704 0ustar wcbrownscs/*====================================================================== B <- IUPCHT(A) Integral univariate polynomial circle to half-plane transformation. Inputs A : in Z[X], non-zero. Outputs B : in Z[X], B(x) = (x+1)^n * A(1/(x+1)), where n = deg(A). ======================================================================*/ #include "saclib.h" Word IUPCHT(A) Word A; { Word Ap,B; /* hide B; */ Step1: /* Compute. */ Ap = PRT(A); B = IUPTR1(Ap); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFPWRITE.c0000664002275300236100000000241514017255270014126 0ustar wcbrownscs/*=========================================================================== AFPWRITE(r,A,V,v) Algebraic number field polynomial write. Inputs A : in Q(alpha)[X1,...,Xr], where the coefficients of A are represented as (ai,Ai) where ai is in Q and Ai is in Z[x]; r : a BETA-digit, r >= 0, the number of variables. V : a variable list for A. v : a variable for writing the base coefficients of A. Side effects : A is written in the output stream in recursive format using the variable list V. ===========================================================================*/ #include "saclib.h" void AFPWRITE(r,A,V,v) Word r,A,V,v; { Word rp,Ap,Vp,V1,e,a; Step1: /* r = 0 */ if (r == 0) { AFWRITE(A,v); goto Return; } Step2: /* r = 1 */ if (r == 1) { V1 = FIRST(V); AFUPWRITE(A,V1,v); goto Return; } Step3: /* r > 1 */ rp = r - 1; Ap = A; Vp = CINV(V); ADV(Vp,&V1,&Vp); Vp = INV(Vp); CWRITE('('); do { ADV2(Ap,&e,&a,&Ap); AFPWRITE(rp,a,Vp,v); if (e > 0) VWRITE(V1); if (e > 1) { CWRITE('^'); AWRITE(e); } if (Ap != NIL) CWRITE('+'); } while (Ap != NIL); CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IIEEE.c0000664002275300236100000000704314017255270013527 0ustar wcbrownscs/*====================================================================== IIEEE(A,d; F,u) Integer to IEEE double. Inputs: A : integer. d : rounding mode: d = -1 : round down. d = 0 : round to nearest. d = 1 : round up. Outputs: F : IEEE double. If d = -1, F is the greatest IEEE-double that is <= A; If d = 1, F is the smallest IEEE-double that is >= A. If d = 0, F is the IEEE-double that is nearest to A, and is even if two are equally near. u : If u = 0, exponent overflow occurred and F is undefined. Otherwise u = 1. ======================================================================*/ #include "saclib.h" void IIEEE(A,d, F_,u_) Word A; BDigit d; ieee *F_; BDigit *u_; { BDigit a,a0,a1,a2,ap,app,b,e,eb,k,kp,m0,m1,mt,n,r,s,t,u; Word Ap,App; ieee F; Step1: /* A = 0. */ if (A == 0) { s = 0; eb = 0; m1 = 0; m0 = 0; t = 0; goto Step8; } Step2: /* A single precision. */ if (A < BETA) { if (A < 0) { s = 1; A = -A; } else s = 0; e = PDLOG2(A); k = ZETA - e; a2 = (A << k); a2 = a2 - BETA/2; m1 = (a2 >> 8); mt = (a2 & 255); m0 = (mt << 24); t = 0; eb = e+BIAS-1; goto Step8; } Step3: /* Approximate A by 0.[a2,a1,a0] * 2^e. */ Ap = RED(A); App = RED(Ap); if (App == NIL) { a0 = 0; a1 = FIRST(A); a2 = FIRST(Ap); e = 2 * ZETA; r = 0; } else if (RED(App) == NIL) { a0 = FIRST(A); a1 = FIRST(Ap); a2 = FIRST(App); e = 3 * ZETA; r = 0; } else { n = 3; r = 0; Ap = A; do { App = RED(App); n = n + 1; ADV(Ap,&a,&Ap); if (a != 0) r = 1; } while (RED(App) != NIL); a0 = FIRST(Ap); a1 = FIRST(RED(Ap)); a2 = FIRST(App); e = n * ZETA; } Step4: /* Normalize [a2,a1,a0]. */ if (a2 < 0) { s = 1; a2 = -a2; a1 = -a1; a0 = -a0; } else s = 0; kp = PDLOG2(a2); k = ZETA - kp; ap = a0 >> kp; a0 = (a0 << k) & BETA1; r = r | a0; app = a1 >> kp; a1 = ((a1 << k) & BETA1) | ap; a2 = (a2 << k) | app; e = e - k; Step5: /* Extract mantissa. */ a2 = a2 - BETA/2; m1 = (a2 >> 8); mt = (a2 & 255); m0 = (mt << 24) | (a1 >> 5); b = a1 & 31; Step6: /* Determine rounding flag. */ if (s == 1) r = -signm(r); else r = signm(r); if (b == 0) t = r; else if (b < 16) { if (s == 0) t = 1; else t = -1; } else if (b == 16) { if (s == 0) t = 2; else t = -2; t = t + r; } else if (b > 16) { if (s == 0) t = 3; else t = -3; } Step7: /* Overflow? Convert exponent. */ if (e > MAXEXP) { u = 0; goto Return; } else { u = 1; eb = e+BIAS-1; } Step8: /* Construct IEEE double. */ F.rep.sign = s; F.rep.exp = eb; F.rep.mant_h = m1; F.rep.mant_l = m0; Step9: /* Round. */ if (t != 0) IEEEROUND(F,t,d,&F,&u); else u = 1; Return: /* Return F and u. */ *F_ = F; *u_ = u; return; } saclib2.2.8/src/IHEAS.c0000664002275300236100000000254314017255270013540 0ustar wcbrownscs/*=========================================================================== IHEAS(A1,m1,A2,m2,V1,n1,V2,n2; mp,np) Integer half-extended Euclidean algorithm step. Inputs A1, A2, V1, V2: in Z, in array representation, A1 >= A2 > 0. m1, m2, n1, n2: BETA digits, the lengths of A1, A2, V1, V2, respectively. Outputs mp, np: BETA-digits. Let Q = floor(A1/A2). Then mp is the length in BETA-digits of A1 - Q A2, and np is the length in BETA-digits of V1 - Q V2. Side effects A1 is replaced by A1 - Q A2, and V1 is replaced by V1 - Q V2. ===========================================================================*/ #include "saclib.h" void IHEAS(A1,m1,A2,m2,V1,n1,V2,n2, mp_,np_) Word *A1,m1,*A2,m2,*V1,n1,*V2,n2, *mp_,*np_; { Word *P,*Q,mp,np,p,q,s; Step1: /* Compute quotient and remainder. */ Q = GETARRAY(m1 - m2 + 1); IQRA(A1,m1,A2,m2,Q,&mp,&q); Step2: /* Compute new V. */ if (ISIGNA(V2,n2) < 0) { s = -1; INEGA(V2,n2); } else s = 1; p = n2 + q; P = GETARRAY(p); IPRODA(V2,n2,Q,q,P); while (P[p-1] == 0 && p > 1) p--; if (s == -1) { INEGA(V2,n2); INEGA(P,p); } IDIFA(V1,n1,P,p,&np); Step3: /* Free arrays. */ FREEARRAY(Q); FREEARRAY(P); Return: /* Prepare for return. */ *mp_ = mp; *np_ = np; return; } saclib2.2.8/src/SISIGN.c0000664002275300236100000000210014017255270013670 0ustar wcbrownscs/*====================================================================== SISIGN(I) Software interval sign. Inputs I : a software floating point interval. Outputs s : I is interpreted as either an open interval or a one-point interval. If all elements of I have the same sign, then s is that sign. Otherwise I contains elements of every sign and s = NIL. ======================================================================*/ #include "saclib.h" BDigit SISIGN(I) Word *I; { BDigit p,s,s1,s2; Step1: /* Left endpoint greater than 0. */ s1 = I[1]; if (s1 > 0) { s = 1; goto Return; } Step2: /* Right endpoint. */ p = I[2]; s2 = I[p+4]; Step3: /* Right endpoint less than 0. */ if (s2 < 0) { s = -1; goto Return; } Step4: /* Left endpoint 0. */ if (s1 == 0) { if (s2 == 0) s = 0; else s = 1; goto Return; } Step5: /* Right endpoint 0. */ if (s2 == 0) s = -1; else s = NIL; Return: /* return. */ return(s); } saclib2.2.8/src/ISATOM.c0000664002275300236100000000070514017255270013701 0ustar wcbrownscs/*====================================================================== t <- ISATOM(a) Test for atom. Inputs a : a Word. Outputs t : a BETA-digit. t = 1 if a is an atom, t = 0 otherwise. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word ISATOM(a) Word a; { return(-BETA < a && a < BETA); } saclib2.2.8/src/RNROUND.c0000664002275300236100000000161214017255270014032 0ustar wcbrownscs/*=========================================================================== C <- RNROUND(R) Rational number rounding. Input R : a rational number. Output C : an integer obtained by rounding r to the nearest integer, using round-to-even to break ties. ===========================================================================*/ #include "saclib.h" Word RNROUND(R) Word R; { Word A,B,C,R1,R2,s,t; Step1: /* R = 0. */ if (R == 0) { C = 0; goto Return; } Step2: /* R /= 0. */ R1 = RNNUM(R); R2 = RNDEN(R); IQR(R1,R2,&A,&B); s = ISIGNF(R1); if (s > 0) B = IPROD(2,B); else B = IPROD(2,INEG(B)); t = ICOMP(B,R2); if (t < 0) C = A; else if (t > 0) C = ISUM(A,s); else if (EVEN(A)) C = A; else C = ISUM(A,s); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/LPERM.c0000664002275300236100000000127314017255270013565 0ustar wcbrownscs/*====================================================================== Lp <- LPERM(L,P) List permute. Inputs L : a list (a1,...,an). P : a list (p1,...,pn) of integers in the range 1,...,n. Outputs Lp : the list (a_{p1},...,a_{pn}). ======================================================================*/ #include "saclib.h" Word LPERM(L,P) Word L,P; { Word Lp,Pp,a,p; /* hide Pp,a,p; */ Step1: /* Compute. */ Lp = NIL; Pp = P; while (Pp != NIL) { ADV(Pp,&p,&Pp); a = LELTI(L,p); Lp = COMP(a,Lp); } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/LLGIE.c0000664002275300236100000000152614017255270013543 0ustar wcbrownscs/*=========================================================================== Lp <- LLGIE(L,I) List of lists, get indexed elements. Inputs L : a list ((d_1,F_1),...,(d_s,F_s)) of pairs. I : a list (I_1,...,I_s) of indexed lists. Output Lp : a list ((d_1,G_1),...,(d_s,G_s)) where G_i is obtained from F_i by taking the elements indexed by I_i. ===========================================================================*/ #include "saclib.h" Word LLGIE(L,I) Word L,I; { Word It,I1,Lp,Lt,L1,d1; Step1: /* Initialize. */ Lt = L; It = I; Lp = NIL; Step2: /* Loop. */ while (It != NIL) { ADV(It,&I1,&It); ADV(Lt,&L1,&Lt); FIRST2(L1,&d1,&L1); L1 = LGIE(L1,I1); L1 = LIST2(d1,L1); Lp = COMP(L1,Lp); } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/IUPTR.c0000664002275300236100000000223614017255270013611 0ustar wcbrownscs/*====================================================================== B <- IUPTR(A,h) Integral univariate polynomial translation. Inputs A : in Z[X]. h : in Z. Outputs B : in Z[X], B(x) = A(x+h). ======================================================================*/ #include "saclib.h" Word IUPTR(A,h) Word A,h; { Word B,L,Lp,a,b,i,j,n; /* hide Lp,b,i,j,n; */ Step1: /* Degree zero. */ n = PDEG(A); if (n == 0) { B = A; goto Return; } Step2: /* Compute coefficient list. */ L = PCL(A); Step3: /* Apply synthetic division. */ for (i = n; i >= 1; i--) { ADV(L,&a,&Lp); for (j = 1; j <= i; j++) { b = FIRST(Lp); a = IPROD(a,h); a = ISUM(a,b); SFIRST(Lp,a); Lp = RED(Lp); } } Step4: /* Convert coefficient list to polynomial. */ B = NIL; L = INV(L); for (i = 0; i <= n; i++) { ADV(L,&a,&L); if (a != 0) B = COMP2(i,a,B); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/DPGEN.c0000664002275300236100000000405014017255270013537 0ustar wcbrownscs/*====================================================================== L <- DPGEN(m,k) Digit prime generator. Inputs k, m : positive BETA-digits, Outputs L : the ordered list (p1,...,pr) of all prime numbers pi such that m <= pi < m+2*k. ======================================================================*/ #include "saclib.h" Word DPGEN(m,k) Word m,k; { Word *A,L,d,h,i,m1,m2,p,q,r,s; /* hide A,d,h,i,m1,m2,p,q,r,s; */ Step1: /* Initialize. */ A = (Word *)malloc((unsigned) (sizeof(Word) * (k + 1))); if (A == ((Word *)0)) FAIL("DPGEN","No more memory",k); m1 = m + EVEN(m); h = 2 * k - 2; m2 = m1 + h; for (i = 1; i <= k; i++) A[i] = 0; Step2: /* Mark proper odd multiples of dl for dl=3 and dl=6*nl+1 or dl=6*nl-1 with dl**2 <= ml2. */ d = 3; s = 0; do { q = m2 / d; if (q < d) goto Step3; r = REM(m1,d); if (r + h >= d || r == 0) { if (r == 0) i = 1; else if (EVEN(r) == 1) i = d - r / 2 + 1; else i = (d - r) / 2 + 1; if (m1 <= d) i = i + d; while (i <= k) { A[i] = 1; i = i + d; } } if (s == 1) { d = d + 4; s = 2; } else if (s == 2) { d = d + 2; s = 1; } else { d = 5; s = 2; } } while (1); Step3: /* Construct prime list. */ L = NIL; p = m2; i = k; do { if (A[i] == 0) L = COMP(p,L); p = p - 2; i = i - 1; } while (!(i == 0)); if (m == 1) SFIRST(L,2); if (m == 2) L = COMP(2,L); Return: /* Prepare for return. */ free(A); return(L); } saclib2.2.8/src/IUPHLEFD.c0000664002275300236100000001232214017255270014103 0ustar wcbrownscs/*=========================================================================== Ft <- IUPHLEFD(p,F,C,E,G) Integral univariate polynomial Hensel lifting with early factor detection. Inputs p : an odd medium prime. F : a list (A_1,...,A_r), of monic, irreducible elements of Z_p[x], r >= 2. gcd(Ai,Aj) = 1 for 1 <= i < j <= r. C : in Z[x], with C congruent to c * A_1 * ... * A_r, where p does not divide ldcf(C) and c = H_p(ldcf(C)). E : a characteristic set, a set of possible degrees of factors of C. G : a list ((p_1,G_1),...,(p_t,G_t)) such that p_i is an element of SPRIME, and G_i is the distinct-degree factorization of C, i.e., G_i is a list ((n_1,H_1),...,(n_k,H_k)) of pairs, where H_i is the product of all monic irreducible factors of C (mod p_i) of degree n_i. Outputs Ft : a list of elements of Z[x]. Ft is the list of distinct positive irreducible factors of C. Notes Quadratic lifting is used to lift the mod p factorization of C to a mod q factorization, where q is the full single-precision power of p. Linear lifting is used to lift from mod q^j to mod q^{j+1}, for j >= 1. Early factor detection on the lifted modular factors is performed. See Collins & Encarnacion, "Improved Techniques for Factoring Univariate Polynomials", JSC Vol. 21, No. 3 (March 1996) for algorithm details. ===========================================================================*/ #include "saclib.h" #define TIME_RATIO 4 Word IUPHLEFD(p,F,C,E,G) Word p,F,C,E,G; { Word A,Ab,Ap,As,B,Bb,Bp,Bs,Cb,Cs,Ct,D,Eb,Fb,Fs,Ft,Gb, Ib,Ip,M,Q,Qp,Qpp,Qs,Sb,Tb,Th,Tt,U,Us,Y,Yp,Z,Zp, b,c,cb,cq,d,e,ep,f,k,n,q,qp,t,th,tt; Step0: /* Initialize the lifting and testing times. */ Th = Tt = 0; Step1: /* Compute the two-factor lifting bound and the highest single-precision power of p not exceeding the bound. */ M = IUPLB(C,2); q = p; while (ICOMP(q,M) < 0 && q < BETA/q) q = q * q; while (ICOMP(q,M) < 0 && q < BETA/p) q = q * p; Step2: /* Lift quadratically to single-precision. */ IUPSQHLL(p,q,F,C,&Ab,&Bb,&Sb,&Tb); e = 1; Step3: /* Compute the maximum degree d of trial factors. */ c = ILOG2(IPMAXN(1,C)); c = c + c; cq = ILOG2(q); k = RNCEIL(RNRED(c,cq)); n = PDEG(C); d = RNFLOR(RNRED(n,k)); Step4: /* Factor testing. */ tt = ACLOCK(); IUPEFD(p,q,C,M,Ab,G,E,d,&Fs,&Cb,&Gb,&M,&Ib,&Eb); tt = ACLOCK()-tt; if (Fs == NIL) Tt += tt; if (Ib == NIL) goto Return; /* All factors have been found. */ Step5: /* Perform the initial linear lifting step. */ th = ACLOCK(); Q = IPROD(q,q); Ct = MIPHOM(1,Q,C); IUPILHS(q,Q,Ab,Bb,Sb,Tb,Ct,&Y,&Z,&Us,&As,&Bs); th = ACLOCK()-th; Th += th; e = 2; Step6: /* Recompute the maximum degree d of trial factors. */ if (Fs != NIL) { c = ILOG2(IPMAXN(1,Cb)); c = c + c; k = RNCEIL(RNRED(c,cq)); n = PDEG(Cb); } d = RNFLOR(RNRED(2*n,k)); Step7: /* Compute f, an estimate of the number of true factors and ep, the level at which to test regardless of time. */ f = IUPENF(Cb); cb = IPMAXN(1,Cb); IROOT(cb,f,&cb,&t); cb = ISUM(cb,t); cb = IPROD(cb,cb); cb = IPROD(2,cb); ep = 1; qp = q; while (ICOMP(qp,cb) < 0) { qp = IPROD(qp,q); ep++; } Step8: /* Factor testing. */ if (Tt == 0 || e == ep || (Th / Tt >= TIME_RATIO) || ICOMP(Q,M) >= 0) { tt = ACLOCK(); Ft = LGIE(As,Ib); Ip = Ib; IUPEFD(p,Q,Cb,M,Ft,Gb,Eb,d,&Fb,&Cb,&Gb,&M,&Ib,&Eb); Fs = CONC(Fs,Fb); Ib = LGIE(Ip,Ib); tt = ACLOCK()-tt; if (Fb == NIL) Tt += tt; if (Ib == NIL) goto Return; /* All factors have been found. */ } Step9: /* Prepare for linear lifting. */ Cs = C; IPDQNR(1,Cs,q,&Cs,&D); IPDQNR(1,Cs,q,&Cs,&D); IPDQNR(1,Cs,q,&Cs,&D); Qpp = 1; Qp = q; Ap = Ab; Bp = Bb; Yp = Y; Zp = Z; U = Us; A = As; B = Bs; Step10: /* Do one linear Hensel step. */ th = ACLOCK(); IUPLHSL(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B, &Qs,&Y,&Z,&Us,&As,&Bs); th = ACLOCK()-th; Th += th; e++; Step11: /* Compute the maximum degree d of trial factors. */ b = ICOMP(Qs,M); if (b >= 0) d = PDEG(Cb)-1; else { if (Fb != NIL) { c = ILOG2(IPMAXN(1,Cb)); c = c + c; k = RNCEIL(RNRED(c,cq)); n = PDEG(Cb); } d = RNFLOR(RNRED(e*n,k)); } Step12: /* Factor testing. */ if (Tt == 0 || ep == e || (Th / Tt >= TIME_RATIO) || b >= 0) { tt = ACLOCK(); Ft = LGIE(As,Ib); Ip = Ib; IUPEFD(p,Qs,Cb,M,Ft,Gb,Eb,d,&Fb,&Cb,&Gb,&M,&Ib,&Eb); Fs = CONC(Fs,Fb); Ib = LGIE(Ip,Ib); tt = ACLOCK()-tt; if (Fb == NIL) Tt += tt; if (Ib == NIL) goto Return; /* All factors have been found. */ } Step13: /* Advance. */ Qpp = Qp; Qp = Q; Q = Qs; Ap = A; Bp = B; Yp = Y; Zp = Z; U = Us; IPDQNR(1,Cs,q,&Cs,&D); A = As; B = Bs; goto Step10; Return: /* Prepare for return. */ return(Fs); } saclib2.2.8/src/RPEV.c0000664002275300236100000000172014017255270013457 0ustar wcbrownscs/*=========================================================================== B <- RPEV(r,A,i,a) Rational polynomial evaluation. Inputs r : a positive BETA-digit. A : in Q[x_1,...,x_r]. i : a BETA-digit, 1 <= i <= r. a : in Q. Output B : in Q[x_1,...,x_{i-1},x_{i+1},...,x_r], the result of evaluating A at x_i = a. ===========================================================================*/ #include "saclib.h" Word RPEV(r,A,i,a) Word r,A,i,a; { Word A1,Ap,B,B1,e1,rp; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i = r. */ if (i == r) { B = RPEMV(r,A,a); goto Return; } Step3: /* i < r. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e1,&A1,&Ap); B1 = RPEV(rp,A1,i,a); if (B1 != 0) B = COMP2(B1,e1,B); } while (Ap != NIL); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/CLOCK.c0000664002275300236100000000106714017255270013542 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in millisecconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; struct rusage r; struct timeval v; Step1: /* Get the system time. */ getrusage(RUSAGE_SELF, &r); v = r.ru_utime; t = v.tv_sec * 1000 + v.tv_usec / 1000; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/AMPDMV.c0000664002275300236100000000112414017255270013665 0ustar wcbrownscs/*====================================================================== B <- AMPDMV(r,A) Algebraic module polynomial derivative, main variable. Inputs r : a BETA-digit, r >= 1. A : in Z[alpha,X1,...,Xr]. Outputs B : in Z[alpha,X1,...,Xr]. B is the derivative of A with respect to its main variable. ======================================================================*/ #include "saclib.h" Word AMPDMV(r,A) Word r,A; { Word B; Step1: /* Compute derivative. */ B = IPDMV(r+1,A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPDQR.c0000664002275300236100000000240314017255270013561 0ustar wcbrownscs/*=========================================================================== IPDQR(r,A,m; Q,R) Integral polynomial digit quotient and remainder. Inputs r : a BETA-digit, r >= 0. A : in Z[x_1,...,x_r]. All base coefficients of A are non-negative. m : a BETA-digit, m >= 2. Outputs Q : in Z[x_1,...,x_r]. All base coefficients of Q are non-negative. R : in Z/(m)[x_1,...,x_r]. Q and R satisfy A = m Q + R. ===========================================================================*/ #include "saclib.h" void IPDQR(r,A,m,Q_,R_) Word r,A,m,*Q_,*R_; { Word Ap,A1,e,Q,Q1,R,R1,rp; Step1: /* A = 0. */ if (A == 0) { Q = 0; R = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { IQR(A,m,&Q,&R); goto Return; } Step3: /* Loop though the coefficients. */ Ap = A; Q = R = NIL; rp = r - 1; do { A1 = PLDCF(Ap); e = PDEG(Ap); IPDQR(rp,A1,m,&Q1,&R1); if (Q1 != 0) Q = COMP2(Q1,e,Q); if (R1 != 0) R = COMP2(R1,e,R); Ap = PRED(Ap); } while (Ap != 0); Step4: /* Clean up. */ if (Q == NIL) Q = 0; else Q = INV(Q); if (R == NIL) R = 0; else R = INV(R); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; } saclib2.2.8/src/IPTRUN.c0000664002275300236100000000205314017255270013724 0ustar wcbrownscs/*=========================================================================== B <- IPTRUN(r,D,A) Integral polynomial truncation. Inputs D : a list (d_1,...,d_r) of non-negative BETA-digits. r : a BETA-digit, r >= 0, the number of variables. A : in Z[x_1,...,x_r]. Outputs B : in Z[x_1,...,x_r]/(x_1^d_1,...,x_r^d_r), B = A mod (x_1^d_1,...,x_r^d_r). ===========================================================================*/ #include "saclib.h" Word IPTRUN(r,D,A) Word r,D,A; { Word As,B,Dp,a,b,d,e,rp; Step1: /* r=0 or A=0. */ if (r == 0 || A == 0) { B = A; goto Return; } Step2: /* Initialize. */ rp = r - 1; As = CINV(A); B = NIL; Dp = CINV(D); ADV(Dp,&d,&Dp); Dp = INV(Dp); Step3: /* Generate terms. */ while (As != NIL && SECOND(As) < d) { ADV2(As,&a,&e,&As); if (rp == 0) b = a; else b = IPTRUN(rp,Dp,a); if (b != 0) B = COMP2(e,b,B); } if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LEXNEXT.c0000664002275300236100000000162114017255270014032 0ustar wcbrownscs/*======================================================================= t <- LEXNEXT(n,m,A) Lexicographically next. Inputs n, m : positive beta digits. A : an array of n integers from the interval [0,m]. Output t : 0 or 1. Effect The content of A represents an element (A[n-1],...,A[1],A[0]) from the set [0,m]^n. If this element is lexicographically last, then t = 0 and A is changed to represent the element that is lexicographically first. Otherwise t = 1 and A is element that is lexicographically next. ========================================================================*/ #include "saclib.h" BDigit LEXNEXT(n,m,A) BDigit n,m,*A; { BDigit i,t; Step1: /* Search. */ t = 0; for (i = 0; i < n; i++) { if (A[i] < m) { A[i] = A[i] + 1; t = 1; goto Return; } A[i] = 0; } Return: /* Return t. */ return(t); } saclib2.2.8/src/LINSRT.c0000664002275300236100000000231414017255270013716 0ustar wcbrownscs/*====================================================================== B <- LINSRT(a,A) List insertion. Inputs A : sorted list of BETA-integers ( a1,...an ), n>=0 a : BETA-integer. Outputs B : sorted list of BETA-integers obtained from A by inserting a at the proper place. If A is a null list then B = (a). If a < a1 then B = ( a,a1,...,an ). If a >= an then B = ( a1,...,an,a ). If ai <= a < a{i+1} then B = ( a1,...,ai,a,a{i+1},...an). The list A is modified. ======================================================================*/ #include "saclib.h" Word LINSRT(a,A) Word a,A; { Word Ap,App,As,B; /* hide Ap,App; */ Step1: /* Nl=0. */ if (A == NIL) { B = LIST1(a); goto Return; } Step2: /* a < al1. */ if (a < FIRST(A)) { B = COMP(a,A); goto Return; } Step3: /* General case. */ Ap = A; App = RED(Ap); while (App != NIL && a >= FIRST(App)) { Ap = App; App = RED(Ap); } As = COMP(a,App); SRED(Ap,As); B = A; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPBREI.c0000664002275300236100000000231214017255270013653 0ustar wcbrownscs/*====================================================================== B <- IPBREI(r,A,i,c) Integral polynomial binary rational evaluation, integral polynomial result. Inputs r : A BETA-digit. r >= 0. A : an element of Z[X1,...,Xr]. i : 1 <= i <= r. c : a binary rational number. c = c0/2^k. Outputs B : an element of Z[X1,...,X{i-1},X{i+1},...,Xr]. B(X1,...,X{i-1},X{i+1},...,Xr) = 2^{k * mi}A(X1,...,X{i-1},c,X{i+1},...,Xr), where mi = deg_{Xi}(A(X)). ======================================================================*/ #include "saclib.h" Word IPBREI(r,A,i,c) Word r,A,i,c; { Word B; Word At,c0,c1,k,m; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Initialize. */ m = PDEGSV(r,A,i); if (c == 0) { c0 = 0; k = 0; } else { FIRST2(c,&c0,&c1); k = IORD2(c1); } Step3: /* i=1. */ if (i == 1) { B = IPBEILV(r,A,c0,k,m); goto Return; } Step4: /* i>1. */ At = PCPV(r,A,1,i); B = IPBEILV(r,At,c0,k,m); Return: return(B); } saclib2.2.8/src/PTV.c0000664002275300236100000000150414017255270013354 0ustar wcbrownscs/*====================================================================== B <- PTV(r,A,i) Polynomial transpose variables. Inputs r : an element of Z. r >= 2. A : an element of R[X1,...,Xr] i : 1 <= i <= r. Outputs B : an element of R[X1,...,Xr]. B(X1,...,X{i-1},Xi,...,Xr) = A(X1,...,Xi,X{i-1},...,Xr). ======================================================================*/ #include "saclib.h" Word PTV(r,A,i) Word r,A,i; { Word B; Word Ap,a,b,e; Step1: /*[i=r.]*/ if (i == r) { B = PTMV(r,A); goto Return; } Step2: /* i= PDEG(A). Output Ap: the same polynomial converted to array representation where the array will be large enough to hold a polynomial of degree k. ===========================================================================*/ #include "saclib.h" Word *MAPFMUPS(A,k) Word A,k; { Word n,*Ap,As,i; Step1: /* Get array. */ Ap = MAPGET(k); Step2: /* A = 0. */ if (A == 0) { MAPDEG(Ap) = 0; MAPCF(Ap,0) = 0; goto Return; } Step3: /* A != 0. */ n = PDEG(A); MAPDEG(Ap) = n; As = A; for (i = n; i >= 0; i--) if (As == 0 || PDEG(As) != i) MAPCF(Ap,i) = 0; else { MAPCF(Ap,i) = PLDCF(As); As = PRED(As); } Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/CPLEXN.c0000664002275300236100000000325014017255270013674 0ustar wcbrownscs/*====================================================================== CPLEXN(L; I,M) Cartesian product, lexicographically next. Inputs L = (L1,L2,...,L_{2n}), n >= 1, is a list such that L_{2i} is a non-null list, and L_{2i-1} is a non-null reductum of L_{2i}, for 1 <= i <= n. Outputs I : is the element (first(L1),first(L3),...,first(L_{2n-1})) of the cartesian product of L2,L4,...,L_{2n}. M : If I is not the last element (in the inverse lexicographic ordering) of this cartesian product, then M is a list (M1,M2,...,M_{2n}), with M_{2i} = L_{2i}, M_{2i-1} a non-null reductum of M_{2i}, for 1 <= i <= n, and (first(M1),first(M3),...,first(M_{2n-1})) the lexicographically next element. If I is the last element, then M = (). Side effects The list L is modified. ======================================================================*/ #include "saclib.h" void CPLEXN(L, I_,M_) Word L, *I_,*M_; { Word A,I,L1,L2,Lp,M,t; /* hide A,L1,L2,Lp,t; */ Step1: /* Compute. */ t = 1; I = NIL; Lp = L; do { FIRST2(Lp,&L1,&L2); if (t == 1) { ADV(L1,&A,&L1); if (L1 != NIL) { SFIRST(Lp,L1); t = 0; } else SFIRST(Lp,L2); } else A = FIRST(L1); I = COMP(A,I); Lp = RED2(Lp); } while (!(Lp == NIL)); I = INV(I); if (t == 0) M = L; else M = NIL; Return: /* Prepare for return. */ *I_ = I; *M_ = M; return; } saclib2.2.8/src/RNLBRN.c0000664002275300236100000000126114017255270013700 0ustar wcbrownscs/*====================================================================== B <- RNLBRN(A) Rational number to logarithmic binary rational number. Input A : a binary rational number. Output B : A in logarithmic representation. ======================================================================*/ #include "saclib.h" Word RNLBRN(A) Word A; { Word a,b,k,B; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ FIRST2(A,&a,&b); if (b == 1) { k = IORD2(a); a = ITRUNC(a,k); k = -k; } else k = IORD2(b); B = LIST2(a,k); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPEXP.c0000664002275300236100000000153714017255270013576 0ustar wcbrownscs/*====================================================================== B <- IPEXP(r,A,n) Integral polynomial exponentiation. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Z[X1,...,Zr]. n : a BETA-digit, n >= 0. Outputs B : in Z[X1,...,Zr], B = A^n. ======================================================================*/ #include "saclib.h" Word IPEXP(r,A,n) Word r,A,n; { Word B,i; /* hide i; */ Step1: /* n=0. */ if (n == 0) { B = PINV(0,1,r); goto Return; } Step2: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step3: /* General case. */ B = A; for (i = 1; i <= n - 1; i++) { B = IPPROD(r,B,A); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/PSDSV.c0000664002275300236100000000225114017255270013602 0ustar wcbrownscs/*====================================================================== B <- PSDSV(r,A,i,n) Polynomial special decomposition, specified variable. Inputs A : in R[X1,...,Xr], R ring. r : a BETA-digit, r >=1. i : a BETA-digit, 1 <= i <= r. n : a BETA-digit such that each exponent of Xi occurring in A is divisible by n. Outputs B : in R[X1,...,Xr],B is A with each exponent e of Xi replaced by e/n. ======================================================================*/ #include "saclib.h" Word PSDSV(r,A,i,n) Word r,A,i,n; { Word Ap,B,a,b,e,f,rp; /* hide rp; */ Step1: /* A = 0 or n = 0. */ if (A == 0 || n == 0) { B = A; goto Return; } Step2: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (i == r) { b = a; f = e / n; } else { b = PDPV(rp,a,i,n); f = e; } B = COMP2(b,f,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MISUM.c0000664002275300236100000000103714017255270013576 0ustar wcbrownscs/*====================================================================== C <- MISUM(M,A,B) Modular integer sum. Inputs M : a positive integer. A,B : elements of Z_M. Outputs C : A + B. ======================================================================*/ #include "saclib.h" Word MISUM(M,A,B) Word M,A,B; { Word C,Cp; Step1: /* Compute. */ C = ISUM(A,B); Cp = IDIF(C,M); if (ISIGNF(Cp) >= 0) C = Cp; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SIPVCHT.c0000664002275300236100000000323614017255270014027 0ustar wcbrownscs/*====================================================================== v <- SIPVCHT(A) Software interval polynomial, variations after circle to half-plane transformation. Input A : a software interval polynomial of positive degree. Output v : A BETA-digit, either 0, 1, 2 or -1. Let B(x) = x^n A(1/x), C(x) = B(x + 1). If the sign sequence implies that var = 0, v = 0; If the sign sequence implies that var = 1, v = 1; If the sign sequence implies that var >= 2, v = 2; If the sign sequence implies none of the above, v = NIL. ======================================================================*/ #include "saclib.h" BDigit SIPVCHT(A) BDigit *A; { BDigit *b,*B,*Bp,i,j,m,M,n,p,q2,S,s,t,T,v; Step1: /* Get arrays. */ n = A[0]; p = A[3]; q2 = p + p + 6; b = GETARRAY(q2); S = (n + 1) * q2 + 1; B = GETARRAY(S); Step2: /* Compute B(x). */ SIPR(A,B); Step3: /* Initialize count variables. */ t = 0; T = 0; m = 0; M = 0; i = 0; Step4: /* Compute next coefficient of C and its sign. */ Bp = B + S - q2; for (j = n - i; j >= 1; j--) { SISUM(Bp,Bp - q2,b); SICOPY(b,Bp - q2); Bp = Bp - q2; } s = SISIGN(Bp); Step5: /* Update count variables. */ if (s == NIL) { M = M + 1; T = -T; } else if (s != 0) { if (s == - t) m = m + 1; if (s == - T) M = M + 1; t = s; T = s; } Step6: /* Finished? */ if (m >= 2) { v = 2; goto Step8; } i = i + 1; if (i <= n) goto Step4; Step7: /* Determine value of v. */ if (m == M) v = m; else v = NIL; Step8: /* Free arrays. */ FREEARRAY(B); FREEARRAY(b); Return: /* Return v. */ return(v); } saclib2.2.8/src/IRAND.c0000664002275300236100000000224514017255270013543 0ustar wcbrownscs/*====================================================================== A <- IRAND(n) Integer, random. Inputs n : a positive BETA-integer. Outputs A : an integer with random sign and random absolute value less than 2^n. ======================================================================*/ #include "saclib.h" Word IRAND(n) Word n; { Word A,a,i,q,r,s; /* hide a,i,q,r,s; */ Step1: /* Compute sign and high-order BETA-digit. */ QREM(n,ZETA,&q,&r); if (r == 0) { q = q - 1; r = ZETA; } a = DRAN(); s = SIGN(a); a = a / TABP2[ZETA - r + 1]; if (q == 0) { A = a; goto Return; } A = NIL; if (a != 0) A = COMP(a,A); Step2: /* Compute remaining digits. */ for (i = 1; i <= q; i++) { a = ABS(DRAN()); if (s < 0) a = -a; if (a != 0 || A != NIL) A = COMP(a,A); } if (A == NIL) A = 0; else if (RED(A) == NIL) A = FIRST(A); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/HIPROD.c0000664002275300236100000000434414017255270013675 0ustar wcbrownscs/*====================================================================== K <- HIPROD(I,J) Hardware interval product. Inputs I, J : hardware intervals. Output K : the smallest hardware interval containing I * J. Warning HIPROD is not floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" interval HIPROD(I,J) interval I,J; { double a1,a2,b1,b2,c1,c2,d1,d2; interval K; Step1: /* Extract endpoints. */ a1 = I.left; a2 = I.right; b1 = J.left; b2 = J.right; Step2: /* a1 >= 0. */ if (a1 >= 0) { if (b1 >= 0) { rounddown(); K.left = a1 * b1; roundup(); K.right = a2 * b2; } else if (b2 < 0) { rounddown(); K.left = a2 * b1; roundup(); K.right = a1 * b2; } else { rounddown(); K.left = a2 * b1; roundup(); K.right = a2 * b2; } goto Return; } Step3: /* a2 < 0. */ if (a2 < 0) { if (b1 >= 0) { rounddown(); K.left = a1 * b2; roundup(); K.right = a2 * b1; } else if (b2 < 0) { rounddown(); K.left = a2 * b2; roundup(); K.right = a1 * b1; } else { rounddown(); K.left = a1 * b2; roundup(); K.right = a1 * b1; } goto Return; } Step4: /* a1 < 0 <= a2. */ if (b1 >= 0) { rounddown(); K.left = a1 * b2; roundup(); K.right = a2 * b2; } else if (b2 < 0) { rounddown(); K.left = a2 * b1; roundup(); K.right = a1 * b1; } else { rounddown(); c1 = a1 * b2; c2 = a2 * b1; roundup(); d1 = a1 * b1; d2 = a2 * b2; if (c1 < c2) K.left = c1; else K.left = c2; if (d1 > d2) K.right = d1; else K.right = d2; } Return: /* Return K. */ return K; } saclib2.2.8/src/RNABS.c0000664002275300236100000000103714017255270013551 0ustar wcbrownscs/*====================================================================== S <- RNABS(R) Rational number absolute value. Inputs R : a rational number. Outputs S : the absolute value of R. ======================================================================*/ #include "saclib.h" Word RNABS(R) Word R; { Word S; /* hide algorithm */ Step1: /* Compute. */ if (RNSIGN(R) >= 0) S = R; else S = RNNEG(R); Return: /* Prepare for return. */ return(S); } saclib2.2.8/src/AFPFRP.c0000664002275300236100000000170614017255270013665 0ustar wcbrownscs/*====================================================================== B <- AFPFRP(r,A) Algebraic number field polynomial from rational polynomial. Inputs r : a BETA-digit, r >= 1. A : in Q[X1,...,Xr]. Outputs B : in Q(alpha)[X1,...,Xr], B = A. ======================================================================*/ #include "saclib.h" Word AFPFRP(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { B = AFFRN(A); goto Return; } Step3: /* Recursion on r. */ B = NIL; Ap = A; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); b = AFPFRP(rp,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/TANGENTNUM.c0000664002275300236100000000223214017255270014362 0ustar wcbrownscs/*====================================================================== L <- TANGENTNUM(n) Tangent numbers. Inputs n : a non-negative BETA-digit. Outputs T : a list of integers, L = (T_0,...,T_n) where T_i is the i-th tangent number. ======================================================================*/ #include "saclib.h" Word TANGENTNUM(n) BDigit n; { Word T,U,u,V,W,w; BDigit a,b,c,e,f,i; Step1: /* n = 0. */ if (n == 0) { T = LIST1(0); goto Return; } Step2: /* n = 1. */ if (n == 1) { T = LIST2(0,1); goto Return; } Step3: /* Initialize. */ T = LIST2(1,0); U = LIST1(0); a = 0; V = LIST2(1,1); b = 1; Step4: /* Loop. */ for (i = 2; i <= n; i++) { e = a; ADV(U,&u,&U); w = IDPR(u,e); W = LIST1(w); c = a + 1; f = c; while (U != NIL) { e--; ADV(U,&u,&U); w = ISUM(IDPR(u,e),IDPR(w,f)); W = COMP(w,W); f--; } w = IDPR(w,f); W = COMP(w,W); T = COMP(w,T); U = V; a = b; V = INV(W); b = c; } Step5: /* Invert. */ T = INV(T); Return: /* Prepare for return. */ return(T); } saclib2.2.8/src/MPDIF.c0000664002275300236100000000326714017255270013552 0ustar wcbrownscs/*====================================================================== C <- MPDIF(r,m,A,B) Modular polynomial difference. Inputs A,B : in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. m : a BETA-digit. Outputs C : in Z/(m)[X1,...,Xr], C = A - B. ======================================================================*/ #include "saclib.h" Word MPDIF(r,m,A,B) Word r,m,A,B; { Word Ap,Bp,C,Cp,Cpp,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0) { C = MPNEG(r,m,B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* General case. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = MDNEG(m,b); else c = MPNEG(rp,m,b); Cp = COMP2(c,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = MDDIF(m,a,b); else c = MPDIF(rp,m,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step3: /* Finish. */ if (Ap == NIL && Bp == NIL) Cpp = NIL; else if (Ap == NIL) Cpp = MPNEG(r,m,Bp); else Cpp = Ap; C = INV(Cp); if (C == NIL) C = Cpp; else SRED(Cp,Cpp); if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IFACTL.c0000664002275300236100000000132314017255270013644 0ustar wcbrownscs/*====================================================================== A <- IFACTL(n) Integer factorial. Inputs n : a non-negative BETA-digit. Outputs A : n!. ======================================================================*/ #include "saclib.h" Word IFACTL(n) Word n; { Word A,D,k; /* hide D,k; */ Step1: /* Compute. */ A = 1; D = 1; for (k = 2; k <= n; k++) { if (k <= BETA / D) D = D * k; else { A = IDPR(A,D); D = k; } } if (A == 1) A = D; else A = IDPR(A,D); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/LCONC.c0000664002275300236100000000172414017255270013545 0ustar wcbrownscs/*====================================================================== M <- LCONC(L) List concatenation. Inputs L : a list of lists L = ( L1, ... , Ln ) , n>=0. Outputs M : the list obtained by concatenating L1,...,Ln. The lists L1,...,Ln are modified. ======================================================================*/ #include "saclib.h" Word LCONC(L) Word L; { Word L1,L2,Lp,Lp1,M; /* hide algorithm */ Step1: /* If L is empty. */ if (L == NIL) { M = NIL; goto Return; } Step2: /* General case. */ Lp = L; do ADV(Lp,&M,&Lp); while (!(M != NIL || Lp == NIL)); L1 = M; while (Lp != NIL) { ADV(Lp,&L2,&Lp); if (L2 != NIL) { Lp1 = LASTCELL(L1); SRED(Lp1,L2); L1 = L2; } } Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/FRAPGET.c0000664002275300236100000000150514017255270013774 0ustar wcbrownscs/*=========================================================================== A <- FRAPGET(d,n) Finite ring array polynomial get memory. Inputs d, n: positive BETA-digits. Outputs A : a pointer to an array large enough to hold an element of (Z/(m)[x])/(M)[y] having degree d, where M has degree n. ===========================================================================*/ #include #include "saclib.h" Word **FRAPGET(d,n) Word d,n; { Word **A,i; Step1: /* Allocate memory for polynomial. */ A = (Word **)malloc((d+2)*sizeof(Word *)); if (A == NULL) FAIL("FRAPGET","Out of memory."); A = A + 1; A[-1] = GETARRAY(2); FRAPSIZE(A) = d; for (i = 0; i <= d; i++) FRAPCF(A,i) = MAPGET(n); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/RPEXPREAD.c0000664002275300236100000000153214017255270014236 0ustar wcbrownscs/*====================================================================== RPEXPREAD(r,V; A,t) Rational polynomial expression read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : in Q[X1,...,Xr], with variables in V. t : 1 if successful, 0 otherwise. ======================================================================*/ #include "saclib.h" void RPEXPREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,t; /* hide C,t; */ Step1: /* Setup. */ t = 1; A = 0; Step2: /* Read in terms. */ do { RPTERMREAD(r,V,&A1,&t); if (t == 0) goto Return; A = RPSUM(r,A,A1); C = CREADB(); BKSP(); } while (!(C != '+' && C != '-')); Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/IPSPRS.c0000664002275300236100000000313714017255270013727 0ustar wcbrownscs/*=========================================================================== S <- IPSPRS(r,A,B) Integral polynomial subresultant polynomial remainder sequence. Inputs r : a BETA-digit, r > 0. A,B : in Z[x_1,...,x_r], A and B non-zero, deg(A) >= deg(B). Outputs S : a list of polynomials in Z[x_1,...,x_r], the subresultant P.R.S. of the first kind of A and B. ===========================================================================*/ #include "saclib.h" Word IPSPRS(r,A,B) Word r,A,B; { Word G1,G2,G3,Gh3,S,d0,d1,g1,h0,h1,hs0,hs1,i,n1,n2,n3,rp; Step1: /* Initialize. */ G1 = A; G2 = B; S = LIST2(G2,G1); n1 = PDEG(G1); n2 = PDEG(G2); d0 = 0; d1 = n1 - n2; rp = r - 1; i = 1; Step2: /* Compute Gh_{i+2}. */ Gh3 = IPPSR(r,G1,G2); if (Gh3 == 0) { S = INV(S); goto Return; } if (EVEN(d1) == 1) Gh3 = IPNEG(r,Gh3); n3 = PDEG(Gh3); Step3: /* Compute hi. */ if (i > 1) { g1 = PLDCF(G1); h1 = IPEXP(rp,g1,d0); if (i > 2) { hs0 = IPEXP(rp,h0,d0 - 1); h1 = IPEQ(rp,h1,hs0); hs0 = 0; } } Step4: /* Compute G_{i+2}. */ if (i == 1) G3 = Gh3; else { hs1 = IPEXP(rp,h1,d1); hs1 = IPPROD(rp,g1,hs1); hs1 = PMON(hs1,0); G3 = IPEQ(r,Gh3,hs1); hs1 = 0; Gh3 = 0; } Step5: /* Update. */ S = COMP(G3,S); n1 = n2; n2 = n3; d0 = d1; d1 = n1 - n2; G1 = G2; G2 = G3; if (i > 1) h0 = h1; i = i + 1; goto Step2; Return: /* Prepare for return. */ return(S); } saclib2.2.8/src/RPDMV.c0000664002275300236100000000204214017255270013571 0ustar wcbrownscs/*====================================================================== B <- RPDMV(r,A) Rational polynomial derivative, main variable. Inputs A : in Q[X1,...,Xr]. r : a BETA-digit, r >= 1. Outputs B : in Q[X1,...,Xr], the derivative of A with respect to its main variable. ======================================================================*/ #include "saclib.h" Word RPDMV(r,A) Word r,A; { Word Ap,B,a,b,e,ep,rp; /* hide a,ep,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* General case. */ Ap = A; rp = r - 1; B = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = RNPROD(RNINT(e),a); else b = RPRNP(rp,RNINT(e),a); ep = e - 1; if (e != 0) B = COMP2(b,ep,B); } while (!(Ap == NIL)); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/VIERED.c0000664002275300236100000000137214017255270013664 0ustar wcbrownscs/*====================================================================== W <- VIERED(U,V,i) Vector of integers, element reduction. Inputs U,V : n-vectors over Z. i : a BETA-digit, 1 <= i <= n, Vi not zero. Outputs W : an n-vector over Z, W = U-qV, where q = [Ui/Vi]. ======================================================================*/ #include "saclib.h" Word VIERED(U,V,i) Word U,V,i; { Word W,q,u,v; /* hide u,v; */ Step1: /* Compute. */ u = LELTI(U,i); v = LELTI(V,i); q = IQ(u,v); if (q == 0) W = U; else { q = INEG(q); W = VISPR(q,V); W = VISUM(U,W); } Return: /* Prepare for return. */ return(W); } saclib2.2.8/src/IUPBRE.c0000664002275300236100000000215214017255270013671 0ustar wcbrownscs/*====================================================================== b <- IUPBRE(A,a) Integral univariate polynomial binary rational evaluation. Inputs A : in Z[X]. a : binary rational number. Outputs b : in Q, the binary rational number A(a). ======================================================================*/ #include "saclib.h" Word IUPBRE(A,a) Word A,a; { Word b,b1,b2,c,d,h,k,m,n; /* hide b,c,d,h,k,m,n; */ Step1: /* A=0. */ b = 0; if (A == 0) goto Return; Step2: /* A /= 0. */ if (a == 0) { c = 0; m = 0; } else { FIRST2(a,&c,&d); m = IORD2(d); } b1 = IUPBEI(A,c,m); if (b1 == 0) goto Return; k = IORD2(b1); n = FIRST(A); h = m * n; if (k >= h) { b1 = ITRUNC(b1,h); b2 = 1; } else { b1 = ITRUNC(b1,k); h = h - k; b2 = IMP2(1,h); } b = LIST2(b1,b2); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/HIPRRID.c0000664002275300236100000000370514017255270014011 0ustar wcbrownscs/*====================================================================== HIPRRID(n,A; L,t) Hardware interval polynomial real root isolation, Descartes method. Inputs n : a positive beta-digit. A : a hardware interval polynomial of degree n. A(x) contains a squarefree polynomial and A[n] does not contain 0. Outputs L : If t = 0, L is a a list (I_1,...,I_r), r >= 0, of standard and one-point binary rational intervals, with I_1 < ... , I_r, that isolates the real roots of A. If t /= 0, L is undefined. t : 0, 1 or 2. If t = 1, isolation failed due to exponent limitation. If t = 2, failure was due to mantissa limitation. ======================================================================*/ #include "saclib.h" void HIPRRID(n,A, L_,t_) BDigit n; interval *A; Word *L_; BDigit *t_; { BDigit k,s,t; interval *B,*C; Word I,L,L1,L2; Step1: /* Compute a bound for the positive roots. */ L = NIL; k = HIPPRB(n,A); Step2: /* Isolate the positive roots. */ if (k == NIL) { L1 = NIL; goto Step3; } HIPBHT(n,A,k, &B,&t); if (t == 0) { FREEARRAY(B); t = 1; goto Return; } HIPRRISD(n,B,0,LIST2(1,-k), &L1,&t); FREEARRAY(B); if (t != 0) goto Return; Step3: /* Compute a bound for the negative roots. */ B = HIPNEGT(n,A); k = HIPPRB(n,B); Step4: /* Isolate the negative roots. */ if (k == NIL) { L2 = NIL; FREEARRAY(B); goto Step5; } HIPBHT(n,B,k, &C,&t); FREEARRAY(B); if (t == 0) { FREEARRAY(C); t = 1; goto Return; } HIPRRISD(n,C,LIST2(-1,-k),0, &L2,&t); FREEARRAY(C); if (t != 0) goto Return; Step5: /* Include 0 if a root. */ s = HISIGN(A[0]); if (s == NIL) { t = 2; goto Return; } if (s == 0) { I = LIST2(0,0); L1 = COMP(I,L1); } Step6: /* Concatenaate L_2 and L_1. */ L = CONC(L2,L1); t = 0; Return: /* Return L and t. */ *L_ = L; *t_ = t; return; } saclib2.2.8/src/AFINV.c0000664002275300236100000000220314017255270013543 0ustar wcbrownscs/*====================================================================== b <- AFINV(M,a) Algebraic number field element inverse. Inputs M : in Z[X], the minimal polynomial of an algebraic number alpha. a : in Q(alpha), not zero Outputs b : in Q(alpha), the multiplicative inverse of a. ======================================================================*/ #include "saclib.h" Word AFINV(M,a) Word M,a; { Word A,B,R,b,r,s,s1,s2; Step1: /* Decompose a. */ FIRST2(a,&r,&A); Step2: /* Trivial case. */ if (PDEG(A) == 0) { r = RNINV(r); b = LIST2(r,A); goto Return; } Step3: /* Compute resultant and cofactor. */ IUPRC(M,A,&B,&R); if (R == 0) FAIL("AFINV","Resultant is 0",M,A,B); Step4: /* Compute content and primitive part of cofactor. */ IPSCPP(1,B,&s,&b,&B); if (s < 0) b = INEG(b); Step5: /* Compute rational part of b. */ s1 = RNINV(r); s2 = RNRED(b,R); s = RNPROD(s1,s2); Step6: /* Compose b. */ b = LIST2(s,B); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/VISPR.c0000664002275300236100000000205714017255270013612 0ustar wcbrownscs/*====================================================================== C <- VISPR(a,A) Vector of integers scalar product. Inputs a : in Z. A : a vector over Z. Outputs C : a vector over Z, C = aA. ======================================================================*/ #include "saclib.h" Word VISPR(a,A) Word a,A; { Word Ap,C,ap,c,i,n; /* hide Ap,ap,i,n; */ Step1: /* a=0. */ if (a == 0) { n = LENGTH(A); C = NIL; for (i = 1; i <= n; i++) C = COMP(0,C); goto Return; } Step2: /* a=1. */ if (a == 1) { C = A; goto Return; } Step3: /* a=-1. */ if (a == -1) { C = VINEG(A); goto Return; } Step4: /* General case. */ C = NIL; Ap = A; do { ADV(Ap,&ap,&Ap); c = IPROD(a,ap); C = COMP(c,C); } while (Ap != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPRRIRSB.c0000664002275300236100000000203114017255270014133 0ustar wcbrownscs/*==================================================================== L <- IPRRIRSB(A,k) Integral polynomial real root isolation and refinement, Sturm, bisection. Inputs A: in Z[x], squarefree. k: a BETA-integer. Output L: a list (I_1,...,I_r) of open and one-point logarithmic standard isolating intervals for the real roots of A having widths of 2^{k} or less, I_1 < I-2 < ... < I_r. =====================================================================*/ #include "saclib.h" Word IPRRIRSB(A,k) Word A,k; { Word I,J,L,M,n,t,u; Step1: /* Compute a list, M, of isolating intervals. */ M = IPRRIS(A); Step2: /* Compute the trend, t, of the first interval. */ n = PDEG(A); t = ISIGNF(PLDCF(A)); if (EVEN(n) == 1) t = -t; Step3: /* Compute a list, L, of refined intervals. */ L = NIL; u = t; while (M != NIL) { ADV(M,&I,&M); J = IPIIRB(A,I,u,k); L = COMP(J,L); u = - u; } L = INV(L); Return: /* Return L. */ return(L); } saclib2.2.8/src/external.c0000664002275300236100000000223114017255270014523 0ustar wcbrownscs/*=========================================================================== external variables ===========================================================================*/ #include "sacsys.h" #include "sactypes.h" /*------------------------------------------- External Variables -------------------------------------------*/ /* Version. */ char SACLIBVERSION[] = "SACLIB 2.2.7"; /* List processing */ Word AVAIL; char *BACSTACK; Word GCC = 0; Word GCCC = 0; Word GCGLOBALS = BETA; Word GCAC = 0; Word GCM = 0; Word NU = NU_; Word RHO = RHO_; Word *SPACE; Word *SPACEB; Word *SPACEB1; Word GCAAVAIL; GCArray *GCASPACE; GCArray *GCASPACEBp; Word NUp = NUp_; Word BETAp; Word BETApp; /* Timing */ Word TAU = 0; Word TAU0; Word TAU1; /* Integer arithmetic */ Word DELTA; Word EPSIL; Word ETA; Word RINC; Word RMULT; Word RTERM; Word TABP2[65]; Word THETA; Word TMI[128]; Word ZETA; /* Miscellaneous */ Word NPFDS = NPFDS_; Word NSPRIME = NSPRIME_; Word SPRIME; Word NMPRIME = NMPRIME_; Word MPRIME; Word NLPRIME = NLPRIME_; Word LPRIME; Word UZ210; Word NPTR1 = NPTR1_; Word GCAPTR1; BDigit *FFPLUS1; BDigit FFSIZE; /* Input/Output */ Word LASTCHAR; saclib2.2.8/src/FREINV.c0000664002275300236100000000212214017255270013671 0ustar wcbrownscs/*========================================================================== B <- FREINV(p,M,A) Finite ring element inverse. Input p : a medium prime. M : in Z/(p)[x], deg(M) > 0. M is in array representation. A : in Z/(p)[x]/(M). A is in array representation. Output B : in Z/(p)[x]. If A is invertible in Z/(p)[x]/(M), then B = A^(-1). Otherwise, deg(B) = -1. ==========================================================================*/ #include "saclib.h" Word *FREINV(p,M,A) Word p,*M,*A; { Word *B,r,rp; Step1: /* Get array for B. */ B = MAPGET(MAPDEG(M)-1); Step2: /* deg(A) == 0. */ if (MAPDEG(A) == 0) { if (MAPZERO(A)) MAPDEG(B) = -1; else { MAPDEG(B) = 0; MAPLDCF(B) = MDINV(p,MAPLDCF(A)); } goto Return; } Step3: /* Compute resultant and cofactor. */ MMAPRC(p,M,A,B,&r); Step4: /* r = 0 ? */ if (r == 0) { MAPDEG(B) = -1; goto Return; } Step5: /* Divide cofactor by resultant. */ rp = MDINV(p,r); MMAPMDP(p,rp,B,B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MAPMADD.c0000664002275300236100000000161714017255270013753 0ustar wcbrownscs/*=========================================================================== MAPMADD(m,A,b,j,C) Modular array polynomial multiply and add. Input m : a BETA-digit. A : in Z/(m)[x] in array representation. b : in Z/(m). j : an exponent such that j + deg(A) <= deg(C). C : in Z/(m)[x] in array representation. Side effect C is modified such that C <- C + A(x) * b * x^j. ===========================================================================*/ #include "saclib.h" void MAPMADD(m,A,b,j,C) Word m,*A,b,j,*C; { Word n,i,a,c,k; Step1: /* A = 0 or b = 0. */ if (MAPZERO(A) || b == 0) goto Return; Step2: /* Otherwise. */ n = MAPDEG(A); for (i = 0; i <= n; i++) { a = MAPCF(A,i); k = i + j; if (a != 0) { c = MDSUM(m,MDPROD(m,a,b),MAPCF(C,k)); MAPCF(C,k) = c; } } Return: /* Prepare for return. */ return; } saclib2.2.8/src/FPCATCH.c0000664002275300236100000000110114017255270013744 0ustar wcbrownscs/*====================================================================== FPCATCH() Floating-point catch. Side Effects This function clears the current record of floating-point exceptions, so that subsequent calls to FPCHECK will check for floating-point underflow, overflow, and divide-by-zero that occurred after this call. ======================================================================*/ #include "saclib.h" #include void FPCATCH(void) { feclearexcept(FE_ALL_EXCEPT); Return: /* Prepare to return. */ return; } saclib2.2.8/src/ISMC.c0000664002275300236100000000711214017255270013437 0ustar wcbrownscs/*=========================================================================== R <- ISMC(M,Mp,m,U) Integer solution of modular congruence. Inputs M : in Z, M > 1, M odd (that M is odd is used in inequality tests). Mp: in Z, Mp = floor((M/2)^(1/2)). m : in Z, m = ILOG2(Mp). U : in Z, 0 <= U < M. Outputs R ; if U = 0 then R = 0. Otherwise, if there exist integers A > 0 and B /= 0 such that |A|, B < (M/2)^(1/2) and A = B U (mod M) then R = (A,B), but if not then R = NIL. ===========================================================================*/ #include "saclib.h" Word ISMC(M,Mp,m,U) Word M,Mp,m,U; { Word *A1,*A2,*V1,*V2,*W,*T; Word A,B,R,a0,a1,b0,b1,c,cp,d,g1,g2,m1,m2,n1,n2,s,t,u1,u2,v1,v2,w; Step1: /* U = 0. */ if (U == 0) { R = 0; goto Return; } Step2: /* Single-precision input. */ if (M < BETA) { R = DSMC(M,Mp,U); goto Return; } Step3: /* Initialize and convert to array representation. */ R = 0; m1 = ILENGTH(M) + 2; m2 = ILENGTH(U) + 2; A1 = GETARRAY(m1); A2 = GETARRAY(m2); IFLTA(M,A1,m1,&A1,&m1,&d,&d); IFLTA(U,A2,m2,&A2,&m2,&d,&d); w = ILENGTH(Mp); W = GETARRAY(w); IFLTA(Mp,W,w,&W,&w,&d,&d); n1 = n2 = w + 2; V1 = GETARRAY(n1); V2 = GETARRAY(n2); IFLTA(0,V1,n1,&V1,&n1,&d,&d); IFLTA(1,V2,n2,&V2,&n2,&d,&d); Step4: /* Check for completion. */ if (IACOMPA(V2,n2,W,w) > 0) { R = NIL; goto Step7; } if (IACOMPA(A2,m2,W,w) <= 0) goto Step7; Step5: /* Compute remainder and cosequence. */ c = m - ILOG2A(V2,n2) - 1; g1 = ILOG2A(A1,m1); g2 = ILOG2A(A2,m2); v1 = 0; if (g1 - g2 < ZETA) { cp = 1 << MAX(c-1,0); if (g1 >= 2 * ZETA && c > ZETA / 2) { ILWORDS(A1,m1,A2,m2,&a1,&a0,&b1,&b0); if (c > ZETA) DDPCC(a1,a0,b1,b0,&u1,&u2,&v1,&v2); else DDRPCC(cp,a1,a0,b1,b0,&u1,&u2,&v1,&v2); } else if (g1 >= ZETA && g1 - g2 < ZETA / 2) { ILWORD(A1,m1,A2,m2,&a1,&b1); if (c > ZETA / 2) DPCC(a1,b1,&u1,&u2,&v1,&v2); else DRPCC(cp,a1,b1,&u1,&u2,&v1,&v2); } } if (v1 != 0) { if (ISIGNA(V2,n2) == SIGN(v2)) s = 1; else s = -1; if (u1 == 0) { ISLCOMB(A1,m1,A2,m2,v2,1,&m1); T = A1; A1 = A2; A2 = T; t = m1; m1 = m2; m2 = t; ISLCOMB(V1,n1,V2,n2,v2,s,&n1); T = V1; V1 = V2; V2 = T; t = n1; n1 = n2; n2 = t; } else { IDLCOMB(A1,m1,A2,m2,u1,v1,u2,v2,1,1,&m1,&m2); IDLCOMB(V2,n2,V1,n1,v2,u2,v1,u1,s,-s,&n2,&n1); } } else { IHEAS(A1,m1,A2,m2,V1,n1,V2,n2,&m1,&n1); T = A1; A1 = A2; A2 = T; t = m1; m1 = m2; m2 = t; T = V1; V1 = V2; V2 = T; t = n1; n1 = n2; n2 = t; } goto Step4; Step7: /* Form output. */ if (R != NIL) { if (ISIGNA(A2,m2) == 0) R = NIL; else { if (ISIGNA(V2,n2) < 0) { A = IFATL(A2,m2,-1); B = IFATL(V2,n2,-1); } else { A = IFATL(A2,m2,1); B = IFATL(V2,n2,1); } R = LIST2(A,B); } } Step8: /* Free arrays. */ FREEARRAY(A1); FREEARRAY(A2); FREEARRAY(W); FREEARRAY(V1); FREEARRAY(V2); Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/MAIPDE.c0000664002275300236100000000315114017255270013642 0ustar wcbrownscs/*=========================================================================== D <- MAIPDE(r,M) Matrix of integral polynomials determinant, exact division algorithm. Inputs r : a BETA-digit, r >= 0. M : a square matrix over Z[x_1,...,x_r]. M is represented as a list of rows. Outputs D : in Z[x_1,...,x_r], the determinant of M. ======================================================================*/ #include "saclib.h" Word MAIPDE(r,M) Word r,M; { Word D,M1,M2,Mp1,P,R,R1,R2,Rp,S,S1,S2,Ss,Ss2,i,j,t; Step1: /* Initialize. */ M1 = M; P = 0; t = 1; Step2: /* Order 1 matrix. */ if (RED(M1) == NIL) { D = FIRST(FIRST(M1)); if (t < 0) D = IPNEG(r,D); goto Return; } Step3: /* Find pivot row, if possible. */ Mp1 = M1; i = 0; do { i = i + 1; ADV(Mp1,&R,&Mp1); } while (FIRST(R) == 0 && Mp1 != NIL); Step4: /* No pivot row. */ if (FIRST(R) == 0) { D = 0; goto Return; } Step5: /* Update sign. */ if (EVEN(i) == 1) t = -t; Step6: /* Compute m2. */ ADV(R,&R1,&R); M2 = NIL; j = 0; do { j = j + 1; ADV(M1,&S,&M1); if (j != i) { ADV(S,&S1,&S); Ss = NIL; Rp = R; do { ADV(Rp,&R2,&Rp); ADV(S,&S2,&S); Ss2 = IPDIF(r,IPPROD(r,R1,S2),IPPROD(r,S1,R2)); if (P != 0) Ss2 = IPEQ(r,Ss2,P); Ss = COMP(Ss2,Ss); } while (Rp != NIL); M2 = COMP(Ss,M2); } } while (M1 != NIL); Step7: /* Prepare for next pivot step. */ P = R1; M1 = M2; goto Step2; Return: /* Prepare for return. */ return(D); } saclib2.2.8/src/IPRRISI.c0000664002275300236100000000254514017255270014032 0ustar wcbrownscs/*====================================================================== L <- IPRRISI(A,I) Integral polynomial real root isolation in standard interval. Inputs A : in Z[X]. I : an open or one-point standard interval in logarithmic representation. All roots of A in I are simple. Outputs L : a list (I1,...,Ir) of isolating intervals for the real roots of A in I. Each interval is an open or one-point standard interval in logarithmic representation. Let (a_j,b_j) denote the endpoints of I_j. Then a_1 <= b_1 <= ... <= a_r <= b_r. ======================================================================*/ #include "saclib.h" Word IPRRISI(A,I) Word A,I; { BDigit e,k; Word a,B,b,c,d,L; Step1: /* Degree zero. */ if (PDEG(A) == 0) { L = NIL; goto Return; } Step2: /* One-point interval. */ FIRST2(I,&a,&b); if (LBRNCOMP(a,b) == 0) { if (IUPBRES(A,a) == 0) L = LIST1(I); else L = NIL; goto Return; } Step3: /* Transform A. */ k = LSILW(I); if (a == 0) c = 0; else { FIRST2(a,&d,&e); c = IMP2(d,-k-e); } B = IUPBHT(A,k); B = IUPTR(B,c); Step4: /* Compute roots. */ L = IPRRISD(B,a,b); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MDEXP.c0000664002275300236100000000147314017255270013565 0ustar wcbrownscs/*====================================================================== b <- MDEXP(m,a,n) Modular digit exponentiation. Inputs m : a positive BETA-integer. a : an element of Z/(m). n : a non-negative BETA-integer. Outputs b : a^n. ======================================================================*/ #include "saclib.h" Word MDEXP(m,a,n) Word m,a,n; { Word b,c,np; /* hide algorithm */ Step1: /* b = 0. */ if (a == 0 && n > 0) { b = 0; goto Return; } Step2: /* b /= 0. */ b = 1; c = a; np = n; while (np != 0) { if (ODD(np)) b = MDPROD(m,b,c); c = MDPROD(m,c,c); np = np / 2; } Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/MPRAN.c0000664002275300236100000000272114017255270013562 0ustar wcbrownscs/*====================================================================== A <- MPRAN(r,m,q,N) Modular polynomial, random. Inputs m : a BETA-digit, m > 0. q : in Q, q = q1/q2 with 0 < q1 <= q2 < BETA. N : a list (nr,...,n1) of non-negative BETA-digits. r : a BETA-digit, r >= 0, the number of variables. Outputs A : in Z/(m)[X1,...,Xr], a random polynomial with deg_i(A) <= ni for 1 <= i <= r. q is the probability that any particular term of A has a non-zero coefficient. ======================================================================*/ #include "saclib.h" Word MPRAN(r,m,q,N) Word r,m,q,N; { Word A,Np,a,d,e,n,q1,q2,qs,rp,t; /* hide d,e,q1,q2,qs,rp,t; */ Step1: /* Compute qls=int(q*BETA). */ FIRST2(q,&q1,&q2); DQR(q1,0,q2,&qs,&t); Step2: /* r=0. */ if (r == 0) { d = DRANN(); if (d < qs) A = MDRAN(m); else A = 0; goto Return; } Step3: /* r > 0. */ rp = r - 1; ADV(N,&n,&Np); A = NIL; for (e = 0; e <= n; e++) { if (rp == 0) { d = DRANN(); if (d < qs) a = MDRAN(m); else a = 0; } else a = MPRAN(rp,m,q,Np); if (a != 0) A = COMP2(e,a,A); } if (A == NIL) A = 0; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/ILENGTH.c0000664002275300236100000000051114017255270013772 0ustar wcbrownscs/*=========================================================================== n <- ILENGTH(A) Integer length. Input A : in Z. Output n : the word length of A. #define ILENGTH(A) (((A) < BETA) ? 1 : LENGTH(A)) ===========================================================================*/ saclib2.2.8/src/AFDIF.c0000664002275300236100000000103714017255270013515 0ustar wcbrownscs/*====================================================================== c <- AFDIF(a,b) Algebraic number field element difference. Inputs a, b : in Q(alpha) for some algebraic number alpha. Outputs c : in Q(alpha). C = a - b. ======================================================================*/ #include "saclib.h" Word AFDIF(a,b) Word a,b; { Word bp,c; Step1: /* Compute the difference. */ bp = AFNEG(b); c = AFSUM(a,bp); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/ILOG2A.c0000664002275300236100000000077414017255270013630 0ustar wcbrownscs/*=========================================================================== b <- ILOG2A(A,n) Integer logarithm, base 2, array version. Inputs A : in Z, in array representation. n : a BETA-digit, the word length of A. Outputs b : a BETA-integer. If A = 0 then b = 0. Otherwise, b = floor(log_2(|A|)) + 1. #define ILOG2A(A,n) (((n)==0) ? 0 : ((n)-1)*ZETA + DLOG2((A)[(n)-1])) ===========================================================================*/ saclib2.2.8/src/AWCOPY.c0000664002275300236100000000105514017255270013706 0ustar wcbrownscs/*====================================================================== AWCOPY(A,n,B) Array of words copy. Inputs A : an array of words of size n. n : a positive BETA-digit. B : an array of words large enough for a copy of A. Effect The array A is copied into B. ======================================================================*/ #include "saclib.h" void AWCOPY(A,n,B) Word *A; BDigit n; Word *B; { BDigit i; Step1: /* Copy A. */ for (i = 0; i < n; i++) B[i] = A[i]; Return: /* Return. */ return; } saclib2.2.8/src/IUPBREV.c0000664002275300236100000000206214017255270014017 0ustar wcbrownscs/*====================================================================== b <- IUPBREV(A,a) Integral univariate polynomial binary rational evaluation. Inputs A : in Z[x]. a : a logarithmic binary rational number. Outputs b : b = A(a), a logarithmic binary rational number. ======================================================================*/ #include "saclib.h" Word IUPBREV(A,a) Word A,a; { Word b,c,d,h,k,n; Step1: /* A = 0. */ if (A == 0) { b = 0; goto Return; } Step2: /* Let a = c / 2^k. */ if (a == 0) { c = 0; k = 0; } else FIRST2(a,&c,&k); Step3: /* If k <= 0 apply IUPEVAL, otherwise IUPBEI. */ if (k <= 0) { if (k < 0) c = IMP2(c,-k); d = IUPEVAL(A,c); } else d = IUPBEI(A,c,k); Step4: /* Put result in logarithmic representation. */ if (d == 0) b = 0; else { h = IORD2(d); d = IDP2(d,h); if (k <= 0) b = LIST2(d,-h); else { n = PDEG(A); b = LIST2(d,n * k - h); } } Return: /* Return s. */ return(b); } saclib2.2.8/src/IPWRITE.c0000664002275300236100000000213514017255270014027 0ustar wcbrownscs/*=========================================================================== IPWRITE(r,A,V) Integral polynomial write. Inputs A : in Z[x_1,...,x_r]. r : a BETA-digit, r >= 0, the number of variables. V : a variable list for A. Side effects : A is written in the output stream in recursive format using the variable list V. ===========================================================================*/ #include "saclib.h" void IPWRITE(r,A,V) Word r,A,V; { Word rp,Ap,Vp,v,e,a; Step1: /* r = 0 or A = 0 */ if (r == 0 || A == 0) { IWRITE(A); goto Return; } Step2: /* r = 1 */ if (r == 1) { v = FIRST(V); IUPWRITE(A,v); goto Return; } Step3: /* r > 1 */ rp = r - 1; Ap = A; Vp = CINV(V); ADV(Vp,&v,&Vp); Vp = INV(Vp); CWRITE('('); do { ADV2(Ap,&e,&a,&Ap); IPWRITE(rp,a,Vp); if (e > 0) VWRITE(v); if (e > 1) { CWRITE('^'); AWRITE(e); } if (Ap != NIL) CWRITE('+'); } while (Ap != NIL); CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/HILBRI.c0000664002275300236100000000105314017255270013653 0ustar wcbrownscs/*======================================================================== J <- HILBRI(I) Hardware interval to logarithmic binary rational interval. Input I : a hardware interval. Output J : the interval I in logarithmic binary rational representation. =========================================================================*/ #include "saclib.h" Word HILBRI(I) interval I; { Word a,b,J; Step1: /* Convert endpoints and make list. */ a = IEEELBRN(I.left); b = IEEELBRN(I.right); J = LIST2(a,b); Return: /* Return J. */ return(J); } saclib2.2.8/src/ISPT.c0000664002275300236100000000276614017255270013475 0ustar wcbrownscs/*=========================================================================== s <- ISPT(m,mp,F) Integer selfridge primality test. Inputs m : in Z. m >=3. mp : m - 1. F : a list (q_1,q_2,...,q_k), q_1 <= q_2 <= ... <= q_k, of the prime factors of mp, with mp equal to the product of the q_i. Outputs s : An attempt is made to find a root of unity modulo m of order m-1. If the existence of such a root is discovered then m is prime and s = 1. If it is discovered that no such root exists then m is not a prime and s = -1. Otherwise the primality of m remains uncertain and s = 0. ===========================================================================*/ #include "saclib.h" Word ISPT(m,mp,F) Word m,mp,F; { Word Fp,Pp,a,b,mpp,p,p1,q,q1,s; Step1: /* Initialize outer loop. */ Fp = F; q1 = 1; p1 = 1; Step2: /* Get next divisor of m', if any. */ do { if (Fp == NIL) { s = 1; goto Return; } ADV(Fp,&q,&Fp); } while (ICOMP(q,q1) <= 0); q1 = q; Step3: /* Try successive small primes. */ Pp = SPRIME; do { if (Pp == NIL) { s = 0; goto Return; } ADV(Pp,&p,&Pp); if (p > p1) { p1 = p; a = MIEXP(m,p,mp); if (a != 1) { s = -1; goto Return; } } mpp = IEQ(mp,q); b = MIEXP(m,p,mpp); } while (b == 1); Step4: /* Return for next divisor. */ goto Step2; Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/PARTSS.c0000664002275300236100000000114214017255270013715 0ustar wcbrownscs/*====================================================================== A <- PARTSS(p) Partition sumset. Inputs p : a partition. Outputs A : the sum set of p, a characteristic set. ======================================================================*/ #include "saclib.h" Word PARTSS(p) Word p; { Word A,B,a,pp; /* hide a,pp; */ Step1: /* Compute. */ A = 1; pp = p; while (pp != NIL) { ADV(pp,&a,&pp); B = IMP2(A,a); A = CSUN(A,B); } Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/AMUPRRS.c0000664002275300236100000000564714017255270014050 0ustar wcbrownscs/*====================================================================== AMUPRRS(M,I,A1,A2,I1,I2; Is1,Is2,s) Algebraic module univariate polynomial real root separation. Inputs M : in Z[X], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. A1,A2 : in Z[alpha,X], deg(A1) > 0, deg(A2) > 0. I1,I2 : Binary rational intervals, each of which is either left-open and right-closed, or a one-point interval. I1 contains a unique root alpha1 of A1 of odd multiplicity, and I2 contains a unique root alpha2 not equal alpha1 of A2 of odd multiplicity. Outputs Is1,Is2 : Binary rational intervals. Is1 is a subinterval of I1 containing alpha1 and Is2 is a subinterval of I2 containing alpha2. Is1 and Is2 are strongly disjoint. If I1 is left-open and right-closed then so is Is1, and similarly for I2 and Is2. s : a BETA-digit, s = -1 if Is1 < Is2, and s = 1 if Is1 > Is2. ======================================================================*/ #include "saclib.h" void AMUPRRS(M,I,A1,A2,I1,I2, Is1_,Is2_,s_) Word M,I,A1,A2,I1,I2, *Is1_,*Is2_,*s_; { Word Is1,Is2,a1,a2,b1,b2,c,d1,d2,s,s1,s2,t,u,v; /* hide s,s1,s2,t,u,v; */ Step1: /* I1 and I2 disjoint. */ FIRST2(I1,&a1,&b1); FIRST2(I2,&a2,&b2); if (RNCOMP(b1,a2) < 0) { Is1 = I1; Is2 = I2; s = -1; goto Return; } if (RNCOMP(b2,a1) < 0) { Is1 = I1; Is2 = I2; s = 1; goto Return; } Step2: /* Initialize. */ d1 = RNDIF(b1,a1); d2 = RNDIF(b2,a2); s1 = 2; s2 = 2; Step3: /* Bisect I1. */ t = RNCOMP(d1,d2); if (t >= 0) { if (s1 > 1) s1 = AMUPSR(M,I,A1,b1); c = RIB(a1,b1); u = AMUPSR(M,I,A1,c); if (s1 == 0 || s1 * u < 0) { a1 = c; v = 1; } else { b1 = c; s1 = u; v = -1; } d1 = RNDIF(b1,a1); } Step4: /* Bisect I2. */ if (t < 0) { if (s2 > 1) s2 = AMUPSR(M,I,A2,b2); c = RIB(a2,b2); u = AMUPSR(M,I,A2,c); if (s2 == 0 || s2 * u < 0) { a2 = c; v = -1; } else { b2 = c; s2 = u; v = 1; } d2 = RNDIF(b2,a2); } Step5: /* I1 and I2 disjoint. */ if (v < 0 && RNCOMP(b1,a2) < 0) s = -1; else if (v > 0 && RNCOMP(b2,a1) < 0) s = 1; else goto Step3; Is1 = LIST2(a1,b1); Is2 = LIST2(a2,b2); Return: /* Prepare for return. */ *Is1_ = Is1; *Is2_ = Is2; *s_ = s; return; } saclib2.2.8/src/IPTRMV.c0000664002275300236100000000216414017255270013727 0ustar wcbrownscs/*====================================================================== B <- IPTRMV(r,A,h) Integral polynomial translation, main variable. Inputs A : in Z[x_1,...,x_r]. r : a BETA-digit, r >= 1, the number of variables. h : in Z. Output B : in Z[X1,...,Xr], B = A(x_1,...,x_{r-1},x_r + h). ======================================================================*/ #include "saclib.h" Word IPTRMV(r,A,h) Word r,A,h; { Word Ap,B,B1,B2,a,ab,e,ep,i; Step1: /* A = 0 or h = 0. */ if (A == 0 || h == 0) { B = A; goto Return; } Step2: /* General case. */ ADV2(A,&e,&a,&Ap); B = LIST2(0,a); do { if (Ap == NIL) ep = 0; else ep = FIRST(Ap); for (i = 1; i <= e - ep; i++) { B1 = PMPMV(B,1); B2 = IPIP(r,h,B); B = IPSUM(r,B1,B2); } if (Ap == NIL) goto Return; ADV2(Ap,&e,&a,&Ap); ab = LIST2(0,a); B = IPSUM(r,B,ab); } while (1); Return: /* Return B. */ return(B); } saclib2.2.8/src/DPCC.c0000664002275300236100000000371014017255270013415 0ustar wcbrownscs/*=========================================================================== DPCC(a,b; u1,u2,v1,v2) Digit partial cosequence calculation. Inputs a, b : BETA-digits, a >= b > 0. Outputs u1, u2, v1, v2: BETA-digits. Let A and B be positive integers such that, for some k >= 0, we have a = [A / 2^k] and b = [B / 2^k]. Then, for some i, nearly as large as possible, A_i = u1 A + v1 B and A_{i+1} = u2 A + v2 B, where A_j is the j-th term of the remainder sequence of A and B. ===========================================================================*/ #include "saclib.h" void DPCC(a,b, u1_,u2_,v1_,v2_) Word a,b, *u1_,*u2_,*v1_,*v2_; { Word a1,a2,a3,b2,d1,d2,d3,i,k,p,q,t1,t2,u1,u2,u3,v1,v2,v3; Step1: /* Initialize. */ a1 = a; a2 = b; u1 = 1; u2 = 0; v1 = 0; v2 = 1; Step2: /* Is the quotient 1 or 2 ? */ d1 = a1 - a2; d2 = d1 - a2; if (d2 < 0) { a3 = d1; u3 = u1 - u2; v3 = v1 - v2; goto Step4; } d3 = d2 - a2; if (d3 < 0) { a3 = d2; u3 = u1 - u2 - u2; v3 = v1 - v2 - v2; goto Step4; } Step3: /* Quotient is at least 3, divide by shifting and subtraction. */ k = 1; b2 = a2 << 2; while (b2 <= a1) { b2 <<= 1; k++; } b2 >>= 1; p = 1 << k; a3 = a1; q = 0; for (i = 0; i <= k; i++) { if (b2 < a3) { a3 -= b2; q += p; } p >>= 1; b2 >>= 1; } u3 = u1 - q * u2; v3 = v1 - q * v2; Step4: /* Check for completion. */ if (v3 > 0) { t1 = v3; t2 = v3 - v2; } else { t1 = -v3; t2 = v2 - v3; } if (a3 < t1 || a2 - a3 < t2) goto Return; Step5: /* Update sequence values, and loop. */ a1 = a2; a2 = a3; u1 = u2; u2 = u3; v1 = v2; v2 = v3; goto Step2; Return: /* Prepare for return. */ *u1_ = u1; *u2_ = u2; *v1_ = v1; *v2_ = v2; return; } saclib2.2.8/src/BEGINSACLIB.c0000664002275300236100000001027314017255270014410 0ustar wcbrownscs/*=========================================================================== BEGINSACLIB(p) Begin SACLIB. Inputs p : a C pointer, the address of the first element on the system stack. Side effects Various data structures are initialized. ===========================================================================*/ #include "saclib.h" void BEGINSACLIB(p) Word *p; { Word L,i,m,n,t; Step1: /* Remember the startup time. */ TAU0 = CLOCK(); Step2: /* Allocate memory for the SPACE and GCASPACE arrays. */ NU = NU + (NU % 2); SPACE = (Word *)malloc((unsigned) (sizeof(Word) * (NU + 1))); if (SPACE == ((Word *)0)) FAIL("BEGINSACLIB Step2a","Not enough memory to allocate SPACE."); GCASPACE = (GCArray *)malloc((unsigned) (sizeof(GCArray) * (NUp + 1))); if (GCASPACE == ((GCArray *)0)) FAIL("BEGINSACLIB Step2b","Not enough memory to allocate GCASPACE."); Step3: /* Set up for fast access to the SPACE and GCASPACE arrays. */ SPACEB = SPACE - BETA; SPACEB1 = SPACE - BETA1; BETAp = BETA + NU + 1; BETApp = BETAp + NUp + 1; GCASPACEBp = &(GCASPACE[-BETAp]); Step4: /* Create available cell list and available GCA list. */ AVAIL = NIL; for (L = BETA+NU-1; L > BETA; L -= 2) { SFIRST(L,0); SRED(L,AVAIL); AVAIL = L; } GCAAVAIL = NIL; for (L = BETAp+NUp; L > BETAp; L--) { GCASPACEBp[L].next = GCAAVAIL; GCASPACEBp[L].flag = GC_NO_CHECK; GCASPACEBp[L].len = 0; GCASPACEBp[L].array = (Word *)0; GCAAVAIL = L; } Step5: /* Store the beginning of stack. */ BACSTACK = (char *)p; Step6: /* Declare global variables. */ GCGLOBAL(&UZ210); GCGLOBAL(&SPRIME); GCGLOBAL(&MPRIME); GCGLOBAL(&LPRIME); GCGLOBAL(&GCAPTR1); Step7: /* Compute ZETA, ETA, THETA, DELTA, EPSIL and TABP2 elements. */ i = 1; t = 1; while (t < BETA) { TABP2[i] = t; i = i + 1; t = t + t; } ZETA = i - 1; ETA = 0; t = BETA; do { t = t / 10; ETA = ETA + 1; } while (!(t < 10)); THETA = 1; for (i = 1; i <= ETA; i++) THETA = 10 * THETA; DELTA = TABP2[ZETA / 2 + 1]; EPSIL = BETA / DELTA; Step8: /* Initialize the table of inverses modulo BETA = 2^29. */ CTMI(TMI); Step9: /* Compute RMULT, RINC and RTERM. */ L = CONC(LIST10(3,1,4,1,5,9,2,6,5,3), LIST10(5,8,9,7,9,3,2,3,8,4)); m = 0; while (m < BETA / 10) { ADV(L,&t,&L); m = 10 * m + t; } m = m / 8; RMULT = 8 * m + 5; L = CONC(LIST10(2,1,1,3,2,4,8,6,5,4), LIST10(0,5,1,8,7,1,0,0,0,0)); m = 0; for (i = 1; i <= ETA; i++) { ADV(L,&t,&L); m = 10 * m + t; } DQR(m,0,THETA,&RINC,&t); if (EVEN(RINC) == 1) RINC = RINC + 1; L = CONC(LIST10(5,7,7,2,1,5,6,6,4,9), LIST10(0,1,5,3,2,8,6,0,6,0)); m = 0; for (i = 1; i <= ETA; i++) { ADV(L,&t,&L); m = 10 * m + t; } RTERM = m; Step10: /* Compute small prime list. */ SPRIME = DPGEN(1,NSPRIME); Step11: /* Compute units of Z sub 210. */ UZ210 = NIL; for (i = 209; i >= 1; i-=2) if (DGCD(210,i) == 1) UZ210 = COMP(i,UZ210); Step12: /* Compute medium prime list. */ if (NMPRIME >= 2 * (EPSIL / ZETA)) FAIL("BEGINSACLIB","NMPRIME is too large",NMPRIME); n = RNCEIL(RNRED(ZETA,2)); n = 7 * ((NMPRIME * n) / 10); MPRIME = INV(DPGEN(EPSIL - n,n/2)); /* n is an approximation to ln EPSIL, so that MPRIME will contain approximately NMPRIME primes. MPRIME contains successively smaller primes beginning with the largest prime that is ceiling(ZETA/2) bits long. */ Step13: /* Compute large prime list. */ if (NLPRIME >= BETA / ZETA) FAIL("BEGINSACLIB","NLPRIME is too big",NLPRIME); n = 7 * ((NLPRIME * ZETA) / 10); LPRIME = DPGEN(BETA - n,n/2); /* n is an approximation to ln BETA, so that LPRIME will contain approximately NLPRIME primes. */ Step14: /* Allocate GCAPTR1. */ GCAPTR1 = GCAMALLOC(NPTR1,GC_NO_CHECK); Step15: /* Remember the current time. */ TAU1 = CLOCK(); Return: /* Prepare for return. */ return; } saclib2.2.8/src/MAIPDME.c0000664002275300236100000000356214017255270013765 0ustar wcbrownscs/*=========================================================================== D <- MAIPDME(r,M) Matrix of integral polynomials determinant, minors expansion method. Inputs r : a non-negative beta digit. M : a square matrix over Z[x_1,...,x_r]. M is row-wise represented as a list of lists of polynomials. Output D : the determinant of M. ======================================================================*/ #include "saclib.h" Word MAIPDME(r,M) BDigit r; Word M; { BDigit c,cp,i,j,k,n,*C,t; Word **A,B,B1,B2,B3,D,L,Lp,Mp,M1,M11; Step1: /* n = 1. */ n = LENGTH(M); if (n == 1) { D = FIRST(FIRST(M)); goto Return; } Step2: /* Copy M into an array. */ A = GETMATRIX(n,n); Mp = M; for (i = 0; i < n; i++) { ADV(Mp,&M1,&Mp); for (j = 0; j < n; j++) { ADV(M1,&M11,&M1); A[i][j] = M11; } } Step3: /* Compute a list of the order 2 minors. */ C = GETARRAY(2); C[0] = 0; C[1] = 1; L = NIL; while (C[0] >= 0) { i = C[0]; j = C[1]; B1 = IPPROD(r,A[n-2][i],A[n-1][j]); B2 = IPPROD(r,A[n-2][j],A[n-1][i]); B = IPDIF(r,B1,B2); c = CSFAM(2,C); L = COMP2(B,c,L); LEXNEXTC(n,2,C,&t); } L = INV(L); Step4: /* For k = 3,...,n, compute a list of the order k minors. */ for (k = 3; k <= n; k++) { C = GETARRAY(k); for (i = 0; i < k; i++) C[i] = i; Lp = NIL; while (C[0] >= 0) { c = CSFAM(k,C); B = 0; for (i = 0; i < k; i++) { j = C[i]; B1 = A[n-k][j]; cp = c - (1 << j); B2 = TLIL(cp,L); B3 = IPPROD(r,B1,B2); if (EVEN(i)) B = IPSUM(r,B,B3); else B = IPDIF(r,B,B3); } Lp = COMP2(B,c,Lp); LEXNEXTC(n,k,C,&t); } L = INV(Lp); } D = SECOND(L); Step5: /* Free the matrix A. */ FREEMATRIX(A,n); Return: /* Return D. */ return(D); } saclib2.2.8/src/RIDWRITE.c0000664002275300236100000000210714017255270014134 0ustar wcbrownscs/*====================================================================== RIDWRITE(I,n) Rational interval decimal write. Inputs I : an open or one-point interval with rational number endpoints. n : a non-negative integer. Side effects if I is an open interval, the endpoints of I are approximated by n-decimal-digit fractions and printed, using RNDDWRITE. The left endpoint is rounded down, the right endpoint up. If I is a one-point interval, its one point is printed using RNDWRITE, which rounds it to the nearest n-digit decimal fraction. ======================================================================*/ #include "saclib.h" void RIDWRITE(I,n) Word I,n; { Word a,b; Step1: /* I a one-point interval. */ FIRST2(I,&a,&b); if (EQUAL(a,b)) { CWRITE('['); RNDWRITE(a,n); CWRITE(']'); goto Return; } Step2: /* I an open interval. */ CWRITE('('); RNDDWRITE(a,n,-1); CWRITE(','); RNDDWRITE(b,n,1); CWRITE(')'); Return: /* Return. */ return; } saclib2.2.8/src/RNDEN.c0000664002275300236100000000104614017255270013552 0ustar wcbrownscs/*====================================================================== b <- RNDEN(R) Rational number denominator. Inputs R : a rational number. Outputs b : the denominator of R, a positive integer. ======================================================================*/ #include "saclib.h" Word RNDEN(R) Word R; { Word b; /* hide algorithm */ Step1: /* Compute. */ if (R == 0) b = 1; else b = SECOND(R); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/NORMEFD.c0000664002275300236100000001061014017255270013773 0ustar wcbrownscs/*=========================================================================== NORMEFD(N,n,p,Q,B,L,G,C,d,N1; F,Nb,Bb,Lb,Gb,Cb,Nb1) Norm polynomial early factor detection. Inputs N : in Z[x], the norm of some A[alpha,x] in Z[alpha][x], where alpha is an algebraic number. N is squarefree. n : the degree of alpha. p : an odd medium prime. Q : a positive power of p. B : in Z, the two-factor lifting bound for N. L : a list of pairs ((d_1,L_1),...,,(d_s,L_s)). Let M be the minimal polynomial of alpha, and let M_1 * ... * M_s be a complete factorization of M (mod p). Then d_i = deg(M_i) and L_i is a list of distinct monic factors of N_i = res_t(M_i(t),A(t,x)) (mod Q). G : a list of lists (p_i,(e_1,G_1),(e_2,G_2),...,(e_t,G_t)). Let M = C_1 * ... * C_s (mod p_i) be a complete factorization of M (mod p_i). Then e_i = deg(C_i) and G_i is the distinct-degree factorization of K_i(x) = res_t(C_i(t),A(t,x)) (mod p_i). That is, G_i is a list ((n_1,H_1),...,(n_r,H_r)), where H_j is the product of all the monic ireducible factors of K_i of degree n_j. C : a characteristic set, a superset of the possible degrees of factors of A(alpha,x). d : the maximum degree of trial factors of A[alpha,x]. N1: in Z. N1 = N(1). Outputs F : a (possibly empty) list of all the irreducible factors of N that are obtained by performing early factor detection on combinations of modular factors whose product has degree at most d. Nb : N divided by the product of the elements of F. Bb : in Z, the two-factor lifting bound for Nb. If Nb = 1, then Bb = 0. Ib : a (possible empty) list of lists I_i of indices j_i such that if f_{j_i} is the j_ith element of L_i, then f_{j_i} could not be combined to produce a true factor of N. Gb : a list obtained from G, having a structure similar to G, but with the modular factors that were combined to produce a true factor removed. Cb : a characteristic set, a superset of the possible degrees of integral factors of Ab, where Ab is the polynomial corresponding to the norm Nb. If Nb = 1, then Cb = 0. Nb1: in Z. Nb1 = Nb(1). ===========================================================================*/ #include "saclib.h" void NORMEFD(N,n,p,Q,B,L,G,C,d,N1, F_,Nb_,Gb_,Bb_,Ib_,Cb_,Nb1_) Word N,n,p,Q,B,L,G,C,d,N1, *F_,*Nb_,*Gb_,*Bb_,*Ib_,*Cb_,*Nb1_; { Word A,A1,Bb,Cb,F,Fb,F1,Gb,Ib,Ib1,Lb,Lp,Lb1,Lp1,L1,Nb,Nb1, Qp,Tb,T1,c,dp,d1,e,i,k,n1,q,s; Step1: /* Initialize. */ Qp = IQ(Q,2); ISQRT(Qp,&Qp,&s); q = ILOG2(Qp); Nb = N; Bb = B; Lb = L; Gb = G; Cb = C; Ib = NIL; F = NIL; k = LENGTH(SECOND(FIRST(L)))-1; e = 1; dp = d; c = 1; Step2: /* Convert list of factors to an arrays with tags, and evaluate the factors at 1. */ Lp = L; Lb = NIL; Tb = NIL; while (Lp != NIL) { ADV(Lp,&L1,&Lp); FIRST2(L1,&d1,&F1); LLTGCA(F1,&Lp1,&n1); T1 = GCAMALLOC(n1,GC_CHECK); for (i = 0; i < n1; i++) { A = GCAGET(Lp1,i); A1 = MIPEMV(1,Q,A,1); GCASET(T1,i,A1); A = LIST2(i,A); GCASET(Lp1,i,A); } Tb = COMP(T1,Tb); Lb1 = LIST2(d1,LIST2(n1,Lp1)); Lb = COMP(Lb1,Lb); } Lb = INV(Lb); Tb = INV(Tb); Step3: /* Perform factor combination tests. */ NORMFCT(Nb,n,p,Q,Qp,q,Bb,Lb,Tb,Gb,Cb,e,dp,c,N1, &Fb,&Nb,&Bb,&Lb,&Tb,&Gb,&Cb,&Nb1); F = CONC(F,Fb); if (Fb != NIL && Lb != NIL) k = FIRST(SECOND(FIRST(Lb))) - 1; Step4: /* Check for completion. */ if (PDEG(Nb) == 0) goto Return; if (c < k) { c++; goto Step3; } if (F != NIL && ICOMP(Q,Bb) >= 0) { /* all out search for factors, but we have already tested products having degree <= dp. */ e = dp + 1; dp = PDEG(Nb)/n - 1; c = 1; goto Step3; } Step5: /* Prepare the list Ib. */ Ib = NIL; while (Lb != NIL) { ADV(Lb,&L1,&Lb); FIRST2(L1,&d1,&Lp1); FIRST2(Lp1,&n1,&Lp1); Ib1 = NIL; for (i = 0; i < n1; i++) { A = GCAGET(Lp1,i); Ib1 = COMP(FIRST(A),Ib1); } Ib1 = INV(Ib1); Ib = COMP(Ib1,Ib); } Ib = INV(Ib); Return: /* Prepare for return. */ *F_ = F; *Nb_ = Nb; *Gb_ = Gb; *Bb_ = Bb; *Ib_ = Ib; *Cb_ = Cb; *Nb1_ = Nb1; return; } saclib2.2.8/src/IUPQH.c0000664002275300236100000000403314017255270013571 0ustar wcbrownscs/*=========================================================================== IUPQH(p,Ab,Bb,Sb,Tb,M,C; A,B) Integral univariate polynomial quadratic hensel lemma. Inputs p : a BETA-digit, p prime. Ab,Bb,Sb,Tb : in Z/(p)[X], with Ab*Sb + Bb*Tb = 1, deg(Tb) < deg(Ab). M : in Z, M = p^j for some j in Z, j > 0. C : in Z[x], C congruent to Ab*Bb. Outputs A,B : in Z/(M)[x], with ldcf(A) = ldcf(Ab), deg(A) = deg(Ab), A congruent to Ab, B congruent to Bb, and C congruent to A*B. ===========================================================================*/ #include "saclib.h" void IUPQH(p,Ab,Bb,Sb,Tb,M,C, A_,B_) Word p,Ab,Bb,Sb,Tb,M,C, *A_,*B_; { Word A,As,At,B,Bs,Bt,I,R,Rp,S,Ss,St,T,Ts,Tt,U,U1,Y,Y1,Z,Z1,c,q,qs,qt; Step1: /* Initialize. */ q = p; A = Ab; B = Bb; S = Sb; T = Tb; I = PMON(1,0); if (q == M) goto Return; Step2: /* Compute Y,Z. */ R = IPPROD(1,A,B); R = IPDIF(1,C,R); U = IPIQ(1,R,q); qs = IPROD(q,q); c = ICOMP(qs,M); if (c > 0) { qt = IEQ(M,q); At = MIPHOM(1,qt,A); Bt = MIPHOM(1,qt,B); St = MIPHOM(1,qt,S); Tt = MIPHOM(1,qt,T); } else { qt = q; At = A; Bt = B; St = S; Tt = T; } MIUPSE(qt,At,Bt,St,Tt,U,&Y,&Z); Step3: /* Compute As,Bs and check for end. */ R = IPIP(1,q,Z); As = IPSUM(1,A,R); R = IPIP(1,q,Y); Bs = IPSUM(1,B,R); if (c >= 0) { A = As; B = Bs; goto Return; } Step4: /* Compute Y1,Z1. */ R = IPPROD(1,As,S); Rp = IPPROD(1,Bs,T); R = IPSUM(1,R,Rp); R = IPDIF(1,R,I); U1 = IPIQ(1,R,q); MIUPSE(q,A,B,S,T,U1,&Y1,&Z1); Step5: /* Compute Ss,Ts. */ R = IPIP(1,q,Y1); Ss = MIPDIF(1,qs,S,R); R = IPIP(1,q,Z1); Ts = MIPDIF(1,qs,T,R); Step6: /* Advance. */ q = qs; A = As; B = Bs; S = Ss; T = Ts; goto Step2; Return: /* Prepare for return. */ *A_ = A; *B_ = B; return; } saclib2.2.8/src/SIGN.c0000664002275300236100000000074214017255270013446 0ustar wcbrownscs/*====================================================================== s <- SIGN(a) Sign. Inputs a : a C integer. Outputs s : the sign of a. ======================================================================*/ #include "saclib.h" Word SIGN(a) Word a; { Word s; Step1: /* Compute. */ if (a > 0) s = 1; else if (a < 0) s = -1; else s = 0; Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/MMAPSE.c0000664002275300236100000000262414017255270013671 0ustar wcbrownscs/*=========================================================================== MMAPSE(m,A,B,S,T,C; U,V) Medium modulus array polynomial, solution of equation. Inputs m : a medium BETA-digit. A,B,S,T : in Z/(m)[x] such that ldcf(A) is a unit, deg(T) < deg(A), and A*S + B*T = 1. A,B,S,T are in array representation. C : in Z/(m)[x]. C is in array representation. U,V : arrays large enough to hold polynomials of degrees max(PDEG(B)-1,PDEG(C)-PDEG(A)) and PDEG(A)-1, respectively. Side effects Polynomials U' and V' in Z/(m)[x] are computed such that A*U + B*V = C, and deg(V) < deg(A). U' and V' are put in U and V, respectively. ===========================================================================*/ #include "saclib.h" void MMAPSE(m,A,B,S,T,C, U,V) Word m,*A,*B,*S,*T,*C, *U,*V; { Word *J,*K,*P,*Q,d; Step1: /* Initialize. */ d = MAPDEG(T) + MAPDEG(C); P = MAPGET(d); d = MAX(d - MAPDEG(A),0); Q = MAPGET(d); Step2: /* Compute. */ MMAPPROD(m,T,C,P); MMAPQR(m,P,A,Q); MAPASSIGN(P,V); d = MAX(MAPDEG(C) - MAPDEG(A) + 1,MAPDEG(B)); J = MAPGET(d-1); MMAPTPR(m,d,S,C,J); K = MAPGET(d-1); MMAPTPR(m,d,B,Q,K); MAPSUM(m,J,K,U); Step3: /* Free arrays. */ MAPFREE(J); MAPFREE(K); MAPFREE(P); MAPFREE(Q); Return: /* Prepare for return. */ return; } saclib2.2.8/src/ACLOCK.c0000664002275300236100000000073514017255270013644 0ustar wcbrownscs/*=========================================================================== T <- ACLOCK() Clock minus garbage collection time. Outputs T : a C integer, the system clock time minus garbage collection time in milliseconds. ===========================================================================*/ #include "saclib.h" Word ACLOCK() { Word T; Step1: /* Compute. */ T = CLOCK() - TAU; Return: /* Prepare for return. */ return(T); } saclib2.2.8/src/NORMRL.c0000664002275300236100000000204314017255270013713 0ustar wcbrownscs/*=========================================================================== Lp <- NORMRL(F,L) Norm polynomial regroup list. Inputs F : a list ((d_1,F_1),...,(d_s,F_s)) of pairs, where the F_i are lists. L : a list with as many elements as the total number of elements in the lists F_i. Output Lp : a list ((d_1,L_1),...,(d_s,L_s)), where L_1 contains the first card(F_1) elements in L, and so on. ===========================================================================*/ #include "saclib.h" Word NORMRL(F,L) Word F,L; { Word Ft,F1,Lp,Lt,L1,d1,f,i,k; Step1: /* Regroup the elements of L. */ Ft = F; Lt = L; Lp = NIL; while (Ft != NIL) { ADV(Ft,&F1,&Ft); FIRST2(F1,&d1,&F1); L1 = NIL; k = LENGTH(F1); for (i = 1; i <= k; i++) { ADV(Lt,&f,&Lt); L1 = COMP(f,L1); } L1 = LIST2(d1,INV(L1)); Lp = COMP(L1,Lp); } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/IDQR.c0000664002275300236100000000343414017255270013446 0ustar wcbrownscs/*================================================================= IDQR(A,b; Q,r) Integer-digit quotient and remainder. Inputs A : in Z. b : a non-zero BETA-digit. Outputs Q : the integral part of A / b r : a BETA-digit, r = A - b * Q. =================================================================*/ #include "saclib.h" #define IDQR_SIZE 100 void IDQR(A,b, Q_,r_) Word A,b, *Q_,*r_; { Word A2,*Ah,Ap[IDQR_SIZE],Q,i,k,kp,m,o,q,r,s; Word a0,a1,bp,q0,q1; Step1: /* A single-precision. */ if (A < BETA) { Q = A / b; r = A - b * Q; goto Return; } Step2: /* |b| = 1. */ r = 0; if (b == 1) { Q = A; goto Return; } if (b == -1) { Q = INEG(A); goto Return; } Step3: /* Length of A equal to 2. */ A2 = RED2(A); if (A2 == NIL) { FIRST2(A,&a0,&a1); DQR(0,a1,b,&q1,&r); DQR(r,a0,b,&q0,&r); if (q1 == 0) Q = q0; else Q = LIST2(q0,q1); goto Return; } Step4: /* Put dividend in array. */ IFLTA(A,Ap,IDQR_SIZE,&Ah,&m,&s,&o); bp = absm(b); if (bp >= (01 << 15)) goto Step6; Step5: /* |b| < 2^15. */ for (i = m - 1; i >= 0; i--) { PHDQR(r,Ah[i],bp,&q,&r); Ah[i] = q; } goto Step7; Step6: /* |b| >= 2^15. */ k = PDLOG2(bp); kp = ZETA - k; bp = bp << kp; a1 = Ah[m - 1]; r = a1 >> k; for (i = m - 1; i > 0; i--) { a0 = ((Ah[i] << kp) & BETA1) | (Ah[i - 1] >> k); PNDQR(r,a0,bp,&q,&r); Ah[i] = q; } a0 = (Ah[0] << kp) & BETA1; PNDQR(r,a0,bp,&q,&r); Ah[0] = q; r = r >> kp; Step7: /* Adjust signs and put quotient in a list. */ if (s < 0) r = - r; if (b < 0) s = - s; Q = IFATL(Ah,m,s); Step8: /* Free dynamic array*/ if (m > IDQR_SIZE) FREEARRAY(Ah); Return: /* Prepare for return. */ *Q_ = Q; *r_ = r; return; } saclib2.2.8/src/MIINV.c0000664002275300236100000000505614017255270013573 0ustar wcbrownscs/*=========================================================================== B <- MIINV(M,A) Modular integer inverse. Inputs M : a positive integer. A : a unit of Z_M. Output B : A^-1. ===========================================================================*/ #include "saclib.h" Word MIINV(M,A) Word M,A; { Word *A1,*A2,*T,*V1,*V2; Word B,a0,a1,b0,b1,g1,g2,m1,m2,n1,n2,o,s,t,u1,u2,v1,v2; Word Vp1,Vp2,m; Step1: /* Single-precision input. */ if (M < BETA) { DEGCD(M,A,&t,&u1,&B); if (B < 0) B = B + M; goto Return; } Step2: /* Initialize and convert inputs to array representation. */ m = ILENGTH(M) + 2; A1 = GETARRAY(m); A2 = GETARRAY(m); IFLTA(M,A1,m,&A1,&m1,&s,&o); IFLTA(A,A2,m,&A2,&m2,&s,&o); V1 = GETARRAY(m); V2 = GETARRAY(m); IFLTA(0,V1,m,&V1,&n1,&s,&o); IFLTA(1,V2,m,&V2,&n2,&s,&o); Step3: /* Check for completion. */ if (m2 == 0) goto Step5; Step4: /* Compute remainders and cosequence elements. */ g1 = ILOG2A(A1,m1); g2 = ILOG2A(A2,m2); v1 = 0; if (g1 - g2 < ZETA) { if (g1 >= 2 * ZETA) { ILWORDS(A1,m1,A2,m2,&a1,&a0,&b1,&b0); DDPCC(a1,a0,b1,b0,&u1,&u2,&v1,&v2); } else if (g1 >= ZETA && g1 - g2 < ZETA / 2) { ILWORD(A1,m1,A2,m2,&a1,&b1); DPCC(a1,b1,&u1,&u2,&v1,&v2); } else if (g1 < ZETA) { a0 = A1[0]; b0 = A2[0]; DEGCD(a0,b0,&t,&u1,&v1); Vp1 = IFATL(V1,n1,1); Vp2 = IFATL(V2,n2,1); B = IDIPR2(Vp1,Vp2,u1,v1); if (ISIGNF(B) < 0) B = ISUM(M,B); goto Step6; } else v1 = 0; } if (v1 != 0) { if (ISIGNA(V2,n2) == SIGN(v2)) s = 1; else s = -1; if (u1 == 0) { ISLCOMB(A1,m1,A2,m2,v2,1,&m1); T = A1; A1 = A2; A2 = T; t = m1; m1 = m2; m2 = t; ISLCOMB(V1,n1,V2,n2,v2,s,&n1); T = V1; V1 = V2; V2 = T; t = n1; n1 = n2; n2 = t; } else { IDLCOMB(A1,m1,A2,m2,u1,v1,u2,v2,1,1,&m1,&m2); IDLCOMB(V2,n2,V1,n1,v2,u2,v1,u1,s,-s,&n2,&n1); } } else { IHEAS(A1,m1,A2,m2,V1,n1,V2,n2,&m1,&n1); T = A1; A1 = A2; A2 = T; t = m1; m1 = m2; m2 = t; T = V1; V1 = V2; V2 = T; t = n1; n1 = n2; n2 = t; } goto Step3; Step5: /* Convert output to a list. */ s = ISIGNA(V1,n1); B = IFATL(V1,n1,1); if (s < 0) B = ISUM(M,B); Step6: /* Free arrays. */ FREEARRAY(A1); FREEARRAY(A2); FREEARRAY(V1); FREEARRAY(V2); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/PFFAP1.c0000664002275300236100000000171414017255270013623 0ustar wcbrownscs/*======================================================================= C <- PFFAP1(p,A,B) Medium prime finite field array for plus 1. Inputs p : a prime beta digit. A : an array of p beta digits such that A[0] = 0 and, for 0 < i < q, A[i] = g^i, where g is a generator of the field. B : an array of p beta digits such that B[i] = j if and only if A[j] = i. Output C : an array of p beta-integers. For 0 <= i < p, i is the discrete logarithm of some a in Z_p and C[i] is the discrete logarithm of a +1 in Z_p. =======================================================================*/ #include "saclib.h" BDigit *PFFAP1(p,A,B) BDigit p,*A,*B; { BDigit a,b,i; BDigit *C; Step1: /* Use arrays A and B. */ C = GETARRAY(p); C[0] = p - 1; for (i = 1; i < p; i++) { a = A[i]; if (a == p - 1) b = 0; else b = a + 1; C[i] = B[b]; } Return: /* Return C. */ return (C); } saclib2.2.8/src/LIST1.c0000664002275300236100000000112214017255270013533 0ustar wcbrownscs/*====================================================================== L <- LIST1(a) List, 1 element. Inputs a : an object. Outputs L : the list (a). ======================================================================*/ #include "saclib.h" Word LIST1(a) Word a; { Word L; Step1: /* Store a. */ L = AVAIL; if (L == NIL) { GC(); goto Step1; } SFIRST(L,a); Step2: /* Set AVAIL to reductum of L. */ AVAIL = RED(L); Step3: /* Set reductum of L to NIL. */ SRED(L,NIL); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MIUPQR.c0000664002275300236100000000220214017255270013714 0ustar wcbrownscs/*=========================================================================== MIUPQR(M,A,B; Q,R) Modular integral univariate polynomial quotient and remainder. Inputs M : in Z, M > 0. A,B : in Z/(M)[X] with ldcf(B) a unit. Outputs Q,R : in Z/(M)[X], the unique elements such that A = B Q + R with either R=0 or deg(R) < deg(B). ===========================================================================*/ #include "saclib.h" void MIUPQR(M,A,B, Q_,R_) Word M,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,b,bp,d,m,n,q; Step1: /* Initialize. */ n = PDEG(B); b = PLDCF(B); Bp = PRED(B); Q = NIL; R = A; bp = MIINV(M,b); Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); q = MIPROD(M,a,bp); Q = COMP2(q,d,Q); Q1 = LIST2(d,q); Rp = PRED(R); Qp = MIPPR(1,M,Bp,Q1); R = MIPDIF(1,M,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/MMAPEVAL.c0000664002275300236100000000125114017255270014104 0ustar wcbrownscs/*=========================================================================== e <- MMAPEVAL(m,A,s) Medium modulus array polynomial evaluation. Inputs m : a medium BETA-digit. A : in Z/(m), deg(A) > 0, A is in array representation. s : an element of Z/(m). Output e : an element of Z/(m), e = A(s). ===========================================================================*/ #include "saclib.h" Word MMAPEVAL(m,A,s) Word m,*A,s; { Word n,e,i; Step1: /* Apply Horner's rule. */ n = MAPDEG(A); e = MAPLDCF(A); for (i = n-1; i >= 0; i--) e = (e * s + MAPCF(A,i)) % m; Return: /* Prepare for return. */ return(e); } saclib2.2.8/src/EXTENT.c0000664002275300236100000000142214017255270013711 0ustar wcbrownscs/*====================================================================== n <- EXTENT(a) Extent. Inputs a : object. Outputs n : an integer, the extent of a. The extent of an atom is 0. The extent of a list is equal to the number of elements in the list plus the extents of the elements. ======================================================================*/ #include "saclib.h" Word EXTENT(a) Word a; { Word a1,ap,n; /* hide a1,n; */ Step1: /* a an atom. */ n = 0; if (a < BETA) goto Return; Step2: /* a a list. */ ap = a; while (ap != NIL) { ADV(ap,&a1,&ap); n = n + EXTENT(a1) + 1; } Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/MMAPMON.c0000664002275300236100000000165014017255270014011 0ustar wcbrownscs/*=========================================================================== B <- MMAPMON(m,A) Medium modulus array polynomial monic. Input m : a medium BETA-digit. A : in Z/(m), in array representation, and ldcf(A) is a unit. Output B : in Z/(p) in array representation. If A = 0 then B = 0. Otherwise, B is the monic associate of A. ===========================================================================*/ #include "saclib.h" Word *MMAPMON(m,A) Word m,*A; { Word n,*B,a,b,i; Step1: /* Get array for B. */ n = MAPDEG(A); B = MAPGET(n); Step2: /* A = 0. */ if (MAPZERO(A)) { MAPDEG(B) = 0; MAPCF(B,0) = 0; goto Return; } Step3: /* A != 0. */ MAPDEG(B) = n; a = MDINV(m,MAPLDCF(A)); for (i = 0; i < n; i++) { b = (a * MAPCF(A,i)) % m; MAPCF(B,i) = b; } MAPCF(B,n) = 1; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MAPIDIF.c0000664002275300236100000000162514017255270013760 0ustar wcbrownscs/*=========================================================================== MAPIDIF(m,A,B) Modular array polynomial in-place difference. Inputs m : a positive BETA-digit. A,B : in Z/(m)[x], A and B are in array representation. The array A should be at least as large as the array B. Side effects A - B is computed and put in A. ===========================================================================*/ #include "saclib.h" void MAPIDIF(m,A,B) Word m,*A,*B; { Word d,e,i; Step1: /* Initialize. */ d = MAPDEG(A); e = MAPDEG(B); for (i = d + 1; i <= e; i++) MAPCF(A,i) = 0; Step2: /* Compute. */ for (i = 0; i <= e; i++) MAPCF(A,i) = MDDIF(m,MAPCF(A,i),MAPCF(B,i)); Step3: /* Determine degree. */ i = maxm(d,e); while (MAPCF(A,i) == 0 && i > 0) i--; MAPDEG(A) = i; Return: /* Prepare for return. */ return; } saclib2.2.8/src/SIPBHT.c0000664002275300236100000000141314017255270013673 0ustar wcbrownscs/*========================================================================== SIPBHT(A,k) Soft-float interval polynomial binary homothetic transformation. Inputs A : a software interval polynomial. k : a BETA-digit. Effect A(x) is replaced by B(x) = A(2^k * x). ==========================================================================*/ #include "saclib.h" void SIPBHT(A,k) BDigit *A,k; { BDigit c,e,i,j,n,p; Step1: /* Degree, precision. */ n = A[0]; p = A[3]; Step2: /* Compute new exponents. */ c = p + 3; e = 0; i = 1; for (j = 0; j <= n; j++) { A[i] = A[i] + e; i = i + c; A[i] = A[i] + e; i = i + c; e = e + k; } Return: /* Return. */ return; } saclib2.2.8/src/GDPGEN.c0000664002275300236100000000403614017255270013652 0ustar wcbrownscs/*====================================================================== L <- GDPGEN(m,k) Gaussian digit prime generator. Inputs m, k : positive BETA-digits. Outputs L : the orded list (p1,...,pr) of all prime numbers p such that m <= p < m+4*k and p is congruent to 3 mod 4. ======================================================================*/ #include "saclib.h" Word GDPGEN(m,k) Word m,k; { Word *A,L,d,i,j,m1,m2,mb,ms,p,q,qb,r,r4,r6; /* hide A,d,i,j,m1,m2,mb,ms,p,q,qb,r,r4,r6; */ Step1: /* Initialize. */ A = (Word *)malloc(sizeof(Word) * (k + 1)); if (A == ((Word *)0)) FAIL("GDPGEN","No more memory",k); m1 = m + EVEN(m); r = REM(m,4); m1 = m + 3 - r; m2 = m1 + 4 * k - 4; for (i = 1; i <= k; i++) A[i] = 0; Step2: /* Mark proper multiples of dl=3, dl=6*nl+1 and dl=6*nl-1 with dl**2 <= ml2. */ d = 3; r4 = 3; r6 = 3; do { qb = m2 / d; if (d > qb) goto Step3; mb = qb * d; r = REM(mb,4); if (r == 3) j = 0; else if (r4 == 1) j = r + 1; else j = 3 - r; ms = mb - j * d; i = (ms - m1) / 4 + 1; q = qb - j; while (i > 0 && q > 1) { A[i] = 1; i = i - d; q = q - 4; } if (r6 == 1) { d = d + 4; r6 = 5; } else { d = d + 2; if (r4 == 3) r4 = 1; else r4 = 3; if (r6 == 5) r6 = 1; else r6 = r6 + 2; } } while (1); Step3: /* Construct prime list. */ L = NIL; p = m2; for (i = k; i >= 1; i--) { if (A[i] == 0) L = COMP(p,L); p = p - 4; } Return: /* Prepare for return. */ free(A); return(L); } saclib2.2.8/src/STATSACLIB.c0000664002275300236100000000233714017255270014341 0ustar wcbrownscs/*====================================================================== STATSACLIB() Statistics of saclib. Side effects Various statistics are written to the output stream. ======================================================================*/ #include "saclib.h" void STATSACLIB() { Step1: /* Report the GC statistics. */ SWRITE("\n------------------------------------------------------"); SWRITE("-----------------------\n"); GWRITE(GCC); SWRITE(" Garbage collections, "); GWRITE(GCCC); SWRITE(" Cells and "); GWRITE(GCAC); SWRITE(" Arrays reclaimed, in "); GWRITE(TAU); SWRITE(" milliseconds.\n"); GWRITE(LENGTH(AVAIL)); SWRITE(" Cells in AVAIL, "); GWRITE(NU / 2); SWRITE(" Cells in SPACE.\n"); Step2: /* Report the system times. */ SWRITE("\n"); SWRITE("System time: "); GWRITE(CLOCK() - TAU0); SWRITE(" milliseconds.\n"); SWRITE("System time after the initialization: "); GWRITE(CLOCK() - TAU1); SWRITE(" milliseconds.\n"); SWRITE("------------------------------------------------------"); SWRITE("-----------------------\n"); Return: /* Prepare for return. */ return; } saclib2.2.8/src/RNREAD.c0000664002275300236100000000220614017255270013656 0ustar wcbrownscs/*====================================================================== R <- RNREAD() Rational number read. Inputs (from the input stream) A rational number in external form. Let and be external forms of relatively prime integers N and D, such that D > 0. Then the input is of the following form or / Note that no blanks are permitted immediately before and after the /. Outputs R : The internal representation of the input rational number. R = 0 if N = 0, R = (N,D) if N /= 0. Side effects A rational number is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word RNREAD() { Word C,R,R1,R2; /* hide C,R; */ Step1: /* Read. */ R1 = IREAD(); C = CREAD(); if (C == '/') R2 = IREAD(); else { R2 = 1; BKSP(); } if (R1 == 0) R = 0; else R = LIST2(R1,R2); Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/AGIGCDW.c0000664002275300236100000000443214017255270013753 0ustar wcbrownscs/*======================================================================= C <- AGIGCDW(A,B) Array Gaussian integer greatest common divisor, Weilert's method. Inputs A, B : array Gaussian intgegers. C : an array for a greatest common divisor of A and B. Effect A greatest common divisor of A and B (0 if A = B = 0) is placed in C. =======================================================================*/ #include "saclib.h" BDigit **AGIGCDW(A,B) BDigit **A,**B; { BDigit **C,**D,**E,**F,**T1,**T2,**T3,**T4; BDigit h,k,k1,k2,m,n,p; BDigit N; BDigit i,*W; Step1: /* Get auxilliary arrays. */ m = MAX(A[0][1],A[1][1]); n = MAX(B[0][1],B[1][1]); p = MAX(m,n) + 3; C = GETMATRIX(2,p); D = GETMATRIX(2,p); E = GETMATRIX(2,p); F = GETMATRIX(2,p); T1 = GETMATRIX(2,p); T2 = GETMATRIX(2,p); T3 = GETMATRIX(2,p); T4 = GETMATRIX(2,p); W = GETARRAY(10); for (i = 0; i <= 9; i++) W[i] = 0; Step2: /* A = 0 or B = 0. */ if (AGIZERO(A)) { AGICOPY(B,C); N = 0; goto Step9; } if (AGIZERO(B)) { AGICOPY(A,C); N = 0; goto Step9; } Step3: /* Reduce the inputs. */ AGIRP(A,D,T1, &k1); AGIRP(B,E,T1, &k2); k = MIN(k1,k2); N = 1; Step4: /* Interchange D and E if required. */ if (AGINC(D,E) == 1) { T4 = D; D = E; E = T4; } Step5: /* Compute T1 = D - u * E for suitable unit u. */ AGIMD(D,E,T1); Step6: /* Reduce T1 to F and update. */ if (!AGIZERO(T1)) { AGIRP(T1,F,T3, &h); if (h <= 8) W[h] = W[h] + 1; else W[9] = W[9] + 1; } else AGICOPY(T1,F); T4 = D; D = E; E = F; F = T4; Step7: /* If E /= 0, return to Step4. */ if (!AGIZERO(E)) { N = N + 1; goto Step4; } Step8: /* Compute C = D * (1 + i)^k. */ h = k >> 1; AGIMP2(D,h,C); if ((k & 1) == 1) { AGICOPY(C,D); AISUM(D[0],D[1],C[1]); D[1][0] = - D[1][0]; AISUM(D[0],D[1],C[0]); } Step9: /* Free arrays. */ FREEMATRIX(D,2); FREEMATRIX(E,2); FREEMATRIX(F,2); FREEMATRIX(T1,2); FREEMATRIX(T2,2); FREEMATRIX(T3,2); FREEMATRIX(T4,2); SWRITE("N = "); IWRITE(N); SWRITE("\n"); /* for (i = 0; i <= 9; i++) { if (W[i] != 0) { SWRITE("W["); IWRITE(i); SWRITE("] = "); IWRITE(W[i]); SWRITE("\n"); } } */ Return: /* Return C. */ return(C); } saclib2.2.8/src/IQRA.c0000664002275300236100000000735214017255270013446 0ustar wcbrownscs/*=========================================================================== IQRA(A,m,B,n,Q; m,k) Integer quotient and remainder, array version. Inputs A, B : Arrays containing positive integers A' and B', with A' >= B' > 0. m, n : The lengths in BETA-digits of A and B. Q : an array of length 1 + length(floor(A/B)). Outputs mp : the length in BETA-digits of the remainder A - floor(A/B). k : the length in BETA-digits of the quotient floor(A/B). Side effects: The remainder replaces A' in A, and the quotient is put in Q. ===========================================================================*/ #include "saclib.h" void IQRA(A,m,B,n,Q, mp_,k_) Word *A,m,*B,n,*Q, *mp_,*k_; { Word *Bt,N,a,a0,a1,a2,ap,b,b0,b1,bp,c,c0,c1,c2,h,hp,i,j,k,mp,q,r; Step1: /* B single-precision. */ if (n == 1) { IDQRA(A,m,B[0],Q, &k,&r); A[0] = r; if (r == 0) mp = 0; else mp = 1; goto Return; } Step2: /* m <= n. */ if ( (m < n) || (m == n && A[m-1] < B[n-1]) ) { Q[0] = 0; mp = m; k = 0; goto Return; } Step3: /* Normalize. */ Bt = GETARRAY(n); b = B[n-1]; hp = PDLOG2(b); h = ZETA - hp; ap = 0; if (h > 0) { for (i = 0; i < m; i++) { a = A[i]; A[i] = ((a << h) & BETA1) | ap; ap = a >> hp; } bp = 0; for (i = 0; i < n; i++) { b = B[i]; Bt[i] = ((b << h) & BETA1) | bp; bp = b >> hp; } } else for (i = 0; i < n; i++) Bt[i] = B[i]; Step4: /* Obtain leading digits of divisor. */ b1 = Bt[n-1]; b0 = Bt[n-2]; Step5: /* Initialize loop. */ j = m; k = m - n; Step6: /* Obtain high-order digits of dividend. */ if (j == m) a2 = ap; else a2 = A[j]; a1 = A[j-1]; a0 = A[j-2]; Step7: /* Compute quotient digit approximation q. */ if (a2 == b1) { q = BETA - 1; a1 += a2; if (a1 >= BETA) { a1 -= BETA; a2--; } } else { PNDQR(a2,a1,b1,&q,&a1); a2 = 0; } DPR(b0,q,&c1,&c0); a0 -= c0; if (a0 < 0) { a0 += BETA; a1--; } a1 -= c1; if (a1 < 0) { a1 += BETA; a2--; } if (a2 < 0) { q--; a0 += b0; if (a0 >= BETA) { a0 -= BETA; a1++; } a1 += b1; if (a1 >= BETA) { a1 -= BETA; a2++; } } Step8: /* Subtract q times the remaining digits of the divisor. */ if (q != 0) { c = 0; for (i = 0; i <= n - 3; i++) { DPR(Bt[i],q,&c2,&c1); a = A[j - n + i]; a -= c; if (a < 0) { a += BETA; c2++; } a -= c1; if (a < 0) { a += BETA; c2++; } c = c2; A[j - n + i] = a; } a0 -= c; if (a0 < 0) { a0 += BETA; a1--; if (a1 < 0) { a1 += BETA; a2--; } } A[j - 2] = a0; A[j - 1] = a1; if (j < m) A[j] = a2; } Step9: /* If the remainder is negative, decrease q by 1 and add the divisor to the remainder. */ if (a2 < 0) { q--; c = 0; for (i = 0; i <= n - 1; i++) { a = A[j - n + i] + Bt[i] + c; if (a >= BETA) { a -= BETA; c = 1; } else c = 0; A[j - n + i] = a; } if (j < m) A[j] = 0; } Step10: /* Store q and return for next quotient digit, if any. */ Q[k] = q; if (j > n) { j--; k--; goto Step6; } Step11: /* De-normalize quotient and remainder. */ if (h > 0) { ap = 0; N = (01 << h) - 1; for (i = n - 1; i >= 0; i--) { a = A[i]; A[i] = (a >> h) | ap; ap = (a & N) << hp; } } mp = n; while (mp >= 1 && A[mp - 1] == 0) mp--; k = m - n + 1; while (Q[k - 1] == 0) k--; FREEARRAY(Bt); Return: /* Prepare for return. */ *mp_ = mp; *k_ = k; return; } saclib2.2.8/src/LENGTH.c0000664002275300236100000000103514017255270013663 0ustar wcbrownscs/*====================================================================== n <- LENGTH(L) Length. Inputs L : list Outputs n : the length of L. ======================================================================*/ #include "saclib.h" Word LENGTH(L) Word L; { Word Lp,n; /* hide algorithm */ Step1: /* Compute. */ n = 0; Lp = L; while (Lp != NIL) { Lp = RED(Lp); n = n + 1; } Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/MMAPTPR.c0000664002275300236100000000271014017255270014023 0ustar wcbrownscs/*=========================================================================== MMAPTPR(m,n,A,B,C) Medium modulus array polynomial truncated product. Inputs m : a BETA-digit. n : in Z, n >= 0. A,B : in Z/(m)[x]. A and B are in array representation. C : an array large enough to hold a polynomial of degree n-1. Side effects. C(x) = A(x)*B(x) (modulo x^n) is computed and put in C. C(x) = 0 or deg(C(x)) < n. ===========================================================================*/ #include "saclib.h" void MMAPTPR(m,n,A,B,C) Word m,n,*A,*B,*C; { Word *Ct,*Cs,*Cp,*T,ap,bp,i,j,k,d,c,np; Step1: /* n = 0 or A = 0 or B = 0. */ if (n == 0 || MAPZERO(A) || MAPZERO(B)) { MAPDEG(C) = 0; MAPCF(C,0) = 0; goto Return; } Step2: /* General case. */ ap = MAPDEG(A); bp = MAPDEG(B); Cp = MAPGET(n-1); Cs = MAPGET(n-1); Ct = MAPGET(n-1); MAPDEG(Cs) = 0; for (i = 0; i < n; i++) MAPCF(Cs,i) = 0; np = MIN(n,bp+1); for (i = 0; i < np; i++) { for (j = 0; j < i; j++) MAPCF(Cp,j) = 0; d = 0; for (j = 0; j < n-i && j <= ap; j++) { k = i+j; c = (MAPCF(A,j) * MAPCF(B,i)) % m; MAPCF(Cp,k) = c; if (c != 0) d = k; } MAPDEG(Cp) = d; MAPSUM(m,Cs,Cp,Ct); T = Cs; Cs = Ct; Ct = T; } MAPFREE(Ct); MAPFREE(Cp); MAPASSIGN(Cs,C); MAPFREE(Cs); Return: /* Prepare for return. */ return; } saclib2.2.8/src/MINNCT.c0000664002275300236100000000164614017255270013702 0ustar wcbrownscs/*====================================================================== B <- MINNCT(A) Matrix of integers, non-negative column transformation. Inputs A : an m by n matrix over Z. A is represented as a list of columns. Outputs B : an m by n matrix over Z. The elements of B are obtained by taking the absolute value of the corresponding element of A. Remarks: A is modified. ======================================================================*/ #include "saclib.h" Word MINNCT(A) Word A; { Word A1,Ap,B,a; /* hide algorithm */ Step1: /* Compute. */ B = A; Ap = A; do { A1 = FIRST(Ap); a = FIRST(A1); if (ISIGNF(a) < 0) { A1 = VINEG(A1); SFIRST(Ap,A1); } Ap = RED(Ap); } while (Ap != NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LSIIT.c0000664002275300236100000000151414017255270013570 0ustar wcbrownscs/*===================================================================== t <- LSIIT(I,J) Logarithmic standard interval inclusion test. Inputs I,J : logarithmic standard intervals. Output t : an integer. t = -1 if I is not contained in J, t = 0 if I = J, and t = +1 if I is properly contained in J. =====================================================================*/ #include "saclib.h" Word LSIIT(I,J) Word I,J; { Word a1,a2,b1,b2,t,t1,t2; Step1: /* Obtain endpoints. */ FIRST2(I,&a1,&a2); FIRST2(J,&b1,&b2); Step2: /* Compare endpoints. */ t1 = LBRNCOMP(a1,b1); t2 = LBRNCOMP(a2,b2); Step3: /* Case analysis. */ if (t1 == 0 && t2 == 0) t = 0; else if (t1 >= 0 && t2 <= 0) t = 1; else t = -1; Return: /* Return t. */ return(t); } saclib2.2.8/src/IWRITE.c0000664002275300236100000000347414017255270013716 0ustar wcbrownscs/*====================================================================== IWRITE(A) Integer write. Inputs A : an integer in internal representation. A is either a BETA-digit or a list of more than one BETA-digit which are either all non-negative or all non-positive and such that the last list element (= the leading BETA-digit) is not 0. Outputs (to the output stream) Canonical external representation of A. Let designate any non-empty word over the alphabet {0,1,...,9} whose leftmost letter is not 0. Then the output is of the following form 0 if A = 0, if A is a positive BETA-digit or a list of non-negative BETA-digits, - if A is a negative BETA-digit or a list of non-positive BETA-digits. Side effects The output is written in the output stream. ======================================================================*/ #include "saclib.h" void IWRITE(A) Word A; { Word Ap,B[21],H,h,i,q; /* hide h,i,q; */ Step1: /* A single-precision. */ if (A < BETA) { AWRITE(A); goto Return; } Step2: /* Compute list of THETA-digits. */ Ap = A; H = NIL; do { IDQR(Ap,THETA,&Ap,&h); H = COMP(h,H); } while (!(Ap == 0)); Step3: /* Write first THETA-digit. */ ADV(H,&h,&H); AWRITE(h); Step4: /* Write remaining digits. */ while (H != NIL) { ADV(H,&h,&H); h = ABS(h); for (i = 1; i <= ETA; i++) { q = h / 10; B[i] = h - 10 * q; h = q; } for (i = ETA; i >= 1; i--) CWRITE(B[i] + '0'); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/SLELTI.c0000664002275300236100000000116714017255270013704 0ustar wcbrownscs/*====================================================================== SLELTI(A,i,a) Set list element. Inputs A : non empty list. i : integer, 1 <= i <= LENGTH(A). a : object. Side effects The list A is modified by changing the i-th element to a. ======================================================================*/ #include "saclib.h" void SLELTI(A,i,a) Word A,i,a; { Word Ap,j; /* hide algorithm */ Step1: /* Set. */ Ap = A; for (j = 1; j <= i - 1; j++) Ap = RED(Ap); SFIRST(Ap,a); Return: /* Prepare for return. */ return; } saclib2.2.8/src/AFPINT.c0000664002275300236100000000215214017255270013664 0ustar wcbrownscs/*====================================================================== B <- AFPINT(r,M,A,b) Algebraic number field polynomial integration. Inputs r : a BETA-digit, r >= 1. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[X1,...,Xr], A not zero. b : in Q(alpha)[X1,...,X_{r-1}]. Outputs B : in Q(alpha)[X1,...,Xr]. B(X1,...,Xr) is the integral of A with respect to its main variable, such that B(X1,...,X_{r-1},0) = b. ======================================================================*/ #include "saclib.h" Word AFPINT(r,M,A,b) Word r,M,A,b; { Word Ap,B,a,c,e,rp; /* hide Ap,a,e,rp; */ Step1: Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); e = e + 1; if (r == 1) c = AFQ(M,a,AFFINT(e)); else c = AFPAFQ(rp,M,a,AFFINT(e)); B = COMP2(c,e,B); } while (!(Ap == NIL)); if (b != 0) B = COMP2(b,0,B); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LLTGCA.c0000664002275300236100000000157714017255270013663 0ustar wcbrownscs/*=========================================================================== LLTGCA(L; A,n) List of lists to garbage-collected array. Inputs L : a list, some of whose elements are lists. Outputs n : the length of L. A : GCA handle for an array of size n containing the elements of L in the same order as in L. ===========================================================================*/ #include "saclib.h" void LLTGCA(L,A_,n_) Word L,*A_,*n_; { Word A,n,*Ab,Lp,i,A1; Step1: /* Compute the length of L. */ n = LENGTH(L); Step2: /* Get an array handle. */ A = GCAMALLOC(n,GC_CHECK); Step3: /* Copy the elements into the array. */ Ab = GCA2PTR(A); Lp = L; for (i = 0; i < n; i++) { A1 = FIRST(Lp); Ab[i] = A1; Lp = RED(Lp); } Return: /* Prepare for return. */ *n_ = n; *A_ = A; return; } saclib2.2.8/src/DIPINS.c0000664002275300236100000000343214017255270013673 0ustar wcbrownscs/*====================================================================== DIPINS(a,d,A; t,B) Distributive polynomial, insert term. Inputs A : in Z[X1,...,Xr], distributive representation r >= 0, or the null list. a : in Z, the coefficient of the term in r variables to be inserted. d : the degree vector of the term in r variables to be inserted. Outputs t : an integer, t = 1 if d does not already occur in A, t = 0 if d already occurs in A. B : in Z[X1,...,Xr] the distributive polynomial resulting from inserting the term. If d does already occur in A, then B = A. ======================================================================*/ #include "saclib.h" void DIPINS(a,d,A, t_,B_) Word a,d,A, *t_,*B_; { Word Ap,B,ap,b,dp,t; /* hide Ap,ap,b,dp,t; */ Step1: /* A empty. */ t = 1; if (A == NIL) { B = LIST2(a,d); goto Return; } B = A; Step2: /* A nonempty. */ Ap = A; ADV2(Ap,&ap,&dp,&Ap); b = DVCMP(d,dp); if (b == 0) { t = 0; goto Return; } if (b > 0) { B = COMP2(a,d,A); goto Return; } B = LIST2(dp,ap); while (Ap != NIL) { ADV2(Ap,&ap,&dp,&Ap); b = DVCMP(d,dp); if (b == 0) { B = A; t = 0; goto Return; } if (b > 0) { B = COMP4(dp,ap,d,a,B); B = INV(B); B = CONC(B,Ap); goto Return; } B = COMP2(dp,ap,B); } B = COMP2(d,a,B); B = INV(B); Return: /* Prepare for return. */ *t_ = t; *B_ = B; return; } saclib2.2.8/src/AICOPY.c0000664002275300236100000000112314017255270013664 0ustar wcbrownscs/*======================================================================== AICOPY(A,B) Array integer copy. Inputs A : an integer in array representation. B : an array large enough to hold the integer A. Effect A is copied into array B. ========================================================================*/ #include "saclib.h" void AICOPY(A,B) BDigit *A,*B; { BDigit i,n; Step1: /* Get the length of A. */ n = A[1]; Step2: /* Copy. */ for (i = 0; i < n + 2; i++) B[i] = A[i]; if (n == 0) B[2] = A[2]; Return: /* Return. */ return; } saclib2.2.8/src/RNMAX.c0000664002275300236100000000073114017255270013571 0ustar wcbrownscs/*====================================================================== c <- RNMAX(a,b) Rational number max. Inputs a, b : rational numbers. Outputs c : a rational number. c = max(a,b). ======================================================================*/ #include "saclib.h" Word RNMAX(a,b) Word a,b; { Word c; Step1: if (RNCOMP(a,b) >= 0) c = a; else c = b; Return: return(c); } saclib2.2.8/src/LCOPY.c0000664002275300236100000000113514017255270013571 0ustar wcbrownscs/*=========================================================================== Lp <- LCOPY(L) List copy. Input L : a list of objects. Output Lp : a list of objects. Lp is a copy of L. The objects are not copied. ===========================================================================*/ #include "saclib.h" Word LCOPY(L) Word L; { Word L_i,Lp,Ls; Step1: /* Copy. */ Lp = NIL; Ls = L; while (Ls != NIL) { ADV(Ls,&L_i,&Ls); Lp = COMP(L_i,Lp); } Lp = INV(Lp); goto Return; Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/COPYTO.c0000664002275300236100000000102214017255270013713 0ustar wcbrownscs/*=========================================================================== COPYTO(A,B,n) Copy array to array. Inputs A, B : arrays of length >= n. n : positive BETA-digit. Effect : B[0],...,B[n-1] is copied into A[0],...,A[n-1]. ===========================================================================*/ #include "saclib.h" void COPYTO(A,B,n) Word *A,*B,n; { Word i; Step1: /* Do it. */ for (i = 0; i < n; i++) A[i] = B[i]; Return: /* Prepare for return. */ return; } saclib2.2.8/src/HISUM.c0000664002275300236100000000117714017255270013576 0ustar wcbrownscs/*====================================================================== K <- HISUM(I,J) Hardware interval sum. Inputs I, J : Hardware intervals. Output K : the smallest hardware interval containing I + J. Warning HISUM is not floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" interval HISUM(I,J) interval I,J; { interval K; Step1: /* Add corresponding endpoints. */ rounddown(); K.left = I.left + J.left; roundup(); K.right = I.right + J.right; Return: /* Return K. */ return(K); } saclib2.2.8/src/PDVAR.c0000664002275300236100000000161214017255270013557 0ustar wcbrownscs/*======================================================================= t <- PDVAR(r,A,i) Polynomial divisibility by a variable. Inputs r : a positive beta digit. A : a nonzero polynomial in r variables. i : 1 <= i <= r. Output t : 1 if A is divisible by x_i, 0 otherwise. =======================================================================*/ #include "saclib.h" BDigit PDVAR(r,A,i) BDigit r,i; Word A; { BDigit n,t; Word B,B1,C; Step1: /* Case i = r. */ if (i == r) { B = A; C = RED2(B); while (C != NIL) { B = C; C = RED2(B); } n = PDEG(B); if (n == 0) t = 0; else t = 1; goto Return; } Step2: /* Case i < r. */ B = A; while (B != NIL) { B1 = PLDCF(B); t = PDVAR(r - 1,B1,i); if (t == 0) goto Return; B = RED2(B); } goto Return; Return: /* Return t. */ return(t); } saclib2.2.8/src/FREPROD.c0000664002275300236100000000166214017255270014011 0ustar wcbrownscs/*========================================================================= FREPROD(p,M,A,B,C) Finite ring element product. Inputs p : a medium prime. M : in Z/(p)[x], M is in array representation. A,B : in Z/(p)[x]/(M), A and B are in array representation. C : a pointer to an array large enough to hold an element of Z/(p)[x]/(M). Output C : in Z/(p)[x]/(M), C = A*B, C is in array representation. =========================================================================*/ #include "saclib.h" void FREPROD(p,M,A,B,C) Word p,*M,*A,*B,*C; { Word *T; Step1: /* Get temporary array for product. */ T = MAPGET(MAPDEG(A)+MAPDEG(B)); Step2: /* Compute product. */ MMAPPROD(p,A,B,T); MMAPREM(p,T,M); Step3: /* Assign result to C. */ MAPASSIGN(T,C); Step4: /* Free temporary array. */ MAPFREE(T); Return: /* Prepare for return. */ return; } saclib2.2.8/src/FSUMDESS.c0000664002275300236100000001160114017255270014133 0ustar wcbrownscs/*====================================================================== FSUMDESS(A,B,d,C) Floating-point sum, different exponents, same signs. Inputs A, B : two floating-point numbers having the same precisions, different exponents, and the same signs. d : a sign (rounding direction). C : an array large enough for the sum. Output C : a floating-point number approximating the sum of A and B, rounded according to IEEE standards. ======================================================================*/ #include "saclib.h" void FSUMDESS(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit a,ap,c,cb,f,i,j,p,q,r,rp,t,u; Word *Ap,*Bp; Step1: /* Let A' be the input with the larger exponent, B' the other. */ if (A[0] >= B[0]) { Ap = A; Bp = B; } else { Ap = B; Bp = A; } Step2: /* Store the exponent, sign and precision of C. */ C[0] = Ap[0]; C[1] = Ap[1]; C[2] = Ap[2]; p = Ap[2]; Step3: /* Determine the denormalizing shift amount. */ q = 0; r = Ap[0] - Bp[0]; while (r >= ZETA) { q = q + 1; r = r - ZETA; } rp = ZETA - r; Step4: /* Add mantissas, case q = 0. */ t = 0; ap = 0; if (q > 0) goto Step5; cb = Ap[p+2] + (Bp[p+2] >> r); if (cb >= BETA) { C[0] = C[0] + 1; t = 1; if (p == 1) { C[3] = cb >> 1; ap = cb & 1; } else { a = Ap[3] + ((Bp[3] >> r) | ((Bp[4] << rp) & BETA1)); ap = a & 1; for (i = 4; i <= p+1; i++) { c = a >> ZETA; f = a & BETA1; a = Ap[i] + ((Bp[i] >> r) | ((Bp[i+1] << rp) & BETA1)) + c; C[i-1] = (f>>1) | ((a & 1) << (ZETA-1)); } c = a >> ZETA; f = a & BETA1; a = cb + c; C[p+1] = (f>>1) | ((a & 1) << (ZETA-1)); C[p+2] = a >> 1; } } else { /* (cb < BETA) */ t = 0; ap = 0; c = 0; for (i = 3; i <= p + 1; i++) { a = (Bp[i] >> r) | ((Bp[i+1] << rp) & BETA1); a = Ap[i] + a + c; C[i] = a & BETA1; c = a >> ZETA; } a = cb + c; C[p+2] = a & BETA1; if (a >= BETA) goto Step7; } goto Step8; Step5: /* Add mantissas, case 0 < q < p. */ if (q >= p) goto Step6; c = 0; for (i = q + 3; i <= p + 1; i++) { a = (Bp[i] >> r) | ((Bp[i+1] << rp) & BETA1); a = Ap[i-q] + a + c; C[i-q] = a & BETA1; c = a >> ZETA; } a = (Bp[p+2] >> r) + Ap[p-q+2] + c; C[p-q+2] = a & BETA1; c = a >> ZETA; for (i = p - q + 3; i <= p + 2; i++) { a = Ap[i] + c; C[i] = a & BETA1; c = a >> ZETA; } if (c == 1) goto Step7; goto Step8; Step6: /* Add mantissas, case q >= p. */ for (i = 3; i <= p + 2; i++) C[i] = Ap[i]; t = 0; ap = 0; goto Step8; Step7: /* Denormalizing right shift. */ t = 1; ap = 1; for (i = p + 2; i >= 3; i--) { a = C[i]; C[i] = (a >> 1) | (ap << (ZETA - 1)); ap = a & 1; } C[0] = C[0] + 1; Step8: /* Rounding decision, case d /= 0 . */ /* Now t = 1 if a normalizing right shift occurred and otherwise t = 0. If t = 1 then a' is the bit that was right-shifted out of the low-order position of the sum. */ if (d == 0) goto Step9; if (d != C[1]) return; if (q >= p) goto Step12; if (t == 1 && ap == 1) goto Step12; if (r != 0) { u = (Bp[q+3] << rp) & BETA1; j = q + 2; } else { u = Bp[q + 2]; j = q + 1; } if (u != 0) goto Step12; for (i = j; i >= 3; i--) if (Bp[i] != 0) goto Step12; return; Step9: /* Rounding decision, case d = 0, t = 0 and q >= p. */ if (t == 1) goto Step11; if (q < p) goto Step10; if (q > p || r > 0) return; if (Bp[p+2] != BETA2) goto Step12; if ((C[3] & 1) == 0) return; goto Step12; Step10: /* Rounding decision, case d = 0, t = 0 and q < p. */ if (r != 0) { u = (Bp[q+3] << rp) & BETA1; j = q + 2; } else { u = Bp[q + 2]; j = q + 1; } if (u < BETA2) return; if (u > BETA2) goto Step12; for (i = j; i >= 3; i--) if (Bp[i] != 0) goto Step12; if ((C[3] & 1) == 0) return; goto Step12; Step11: /* Rounding decision, case d = 0 and t = 1. */ if (ap == 0) return; if (r != 0) { u = (Bp[q+3] << rp) & BETA1; j = q + 2; } else { u = Bp[q + 2]; j = q + 1; } if (u != 0) goto Step12; for (i = j; i >= 3; i--) if (Bp[i] != 0) goto Step12; if ((C[3] & 1) == 0) return; Step12: /* Round by adding 1. */ for (i = 3; i <= p + 2; i++) { C[i] = C[i] + 1; if (C[i] != BETA) return; C[i] = 0; } C[p+2] = BETA2; C[0] = C[0] + 1; return; } saclib2.2.8/src/MMAPGCD.c0000664002275300236100000000210114017255270013745 0ustar wcbrownscs/*=========================================================================== C <- MMAPGCD(p,A,B) Medium modulus array polynomial greatest common divisor. Inputs p : a medium prime. A,B : in Z/(p)[x] in array representation. Outputs C : in Z/(p)[x], C = gcd(A,B), C is in array representation. ===========================================================================*/ #include "saclib.h" Word *MMAPGCD(p,A,B) Word p,*A,*B; { Word *A1,*A2,*t,*C,m,n; Step1: /* A = 0 or B = 0. */ if (MAPZERO(A)) { C = MMAPMON(p,B); goto Return; } if (MAPZERO(B)) { C = MMAPMON(p,A); goto Return; } Step2: /* General case. */ m = MAPDEG(A); n = MAPDEG(B); if (m >= n) { A1 = MMAPMON(p,A); A2 = MMAPMON(p,B); } else { A1 = MMAPMON(p,B); A2 = MMAPMON(p,A); } do { MMAPREM(p,A1,A2); t = A1; A1 = A2; A2 = t; } while (!MAPZERO(A2)); C = MMAPMON(p,A1); Step3: /* Free arrays. */ MAPFREE(A1); MAPFREE(A2); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/RNSUM.c0000664002275300236100000000255414017255270013615 0ustar wcbrownscs/*=========================================================================== T <- RNSUM(R,S) Rational number sum. Inputs R,S : rational numbers. Outputs T : R + S. ===========================================================================*/ #include "saclib.h" Word RNSUM(R,S) Word R,S; { Word D,E,R1,R2,Rb2,S1,S2,Sb2,T,T1,T2; Step1: /* R=0 or S=0. */ if (R == 0) { T = S; goto Return; } if (S == 0) { T = R; goto Return; } Step2: /* Obtain numerators and denominators. */ FIRST2(R,&R1,&R2); FIRST2(S,&S1,&S2); Step3: /* R and S integers. */ if (R2 == 1 && S2 == 1) { T1 = ISUM(R1,S1); if (T1 == 0) T = 0; else T = LIST2(T1,1); goto Return; } Step4: /* R or S an integer. */ if (R2 == 1) { T1 = IPROD(R1,S2); T1 = ISUM(T1,S1); T = LIST2(T1,S2); goto Return; } if (S2 == 1) { T1 = IPROD(R2,S1); T1 = ISUM(T1,R1); T = LIST2(T1,R2); goto Return; } Step5: /* General case. */ IGCDCF(R2,S2,&D,&Rb2,&Sb2); T1 = ISUM(IPROD(R1,Sb2),IPROD(Rb2,S1)); if (T1 == 0) { T = 0; goto Return; } if (D != 1) { E = IGCD(T1,D); if (E != 1) { T1 = IEQ(T1,E); R2 = IEQ(R2,E); } } T2 = IPROD(R2,Sb2); T = LIST2(T1,T2); Return: /* Prepare for return. */ return(T); } saclib2.2.8/src/GIDIF.c0000664002275300236100000000155514017255270013533 0ustar wcbrownscs/*=========================================================================== C <- GIDIF(A,B) Gaussian integer difference. Inputs A,B : Gaussian integers. Output C : A - B, a Gaussian integer. ===========================================================================*/ #include "saclib.h" Word GIDIF(A,B) Word A,B; { Word A1,A2,B1,B2,C,C1,C2; Step1: /* A or B zero. */ if (A == 0) { C = GINEG(B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* Subtract the parts. */ FIRST2(A,&A1,&A2); FIRST2(B,&B1,&B2); C1 = IDIF(A1,B1); C2 = IDIF(A2,B2); Step3: /* Compose the result. */ if (C1 == 0 && C2 == 0) C = 0; else C = LIST2(C1,C2); Return: /* Return C. */ return(C); } saclib2.2.8/src/NORMFT.c0000664002275300236100000000511114017255270013706 0ustar wcbrownscs/*=========================================================================== NORMFT(N,p,Q,Qp,q,K,T; F,Nb) Norm polynomial factor test. Inputs N : in Z[x], the norm of a polynomial A[alpha,x] in Z[alpha][x], where alpha is an algebraic number. N is squarefree. p : an odd medium prime. Q : a positive power of p. Qp : the floor function of the square root of Q/2. q : a BETA-digit, q = ILOG2(Qp). K : a list of lists of elements of Z/(Q)[x]. T : the product of the elements of K evaluated at 1. N1 : in Z. N1 = N(1). Outputs F : a factor of N (may be = 1). If the product of polynomials in the lists in K is congruent to an irreducible monic factor Fs of N with rational coefficients such that the numerators and denominators of the coefficients are less than Qp in absolute value, then F is the positive and primitive polynomial similar to Fs. Nb : N divided by F. ===========================================================================*/ #include "saclib.h" void NORMFT(N,p,Q,Qp,q,K,T,N1, F_,Nb_) Word N,p,Q,Qp,q,K,T,N1, *F_,*Nb_; { Word B,F,F1,Fp,Fs,Ft,K1,Kp,Nb,Nt,R,a,b,c,e,r,u; Step1: /* Initialize. */ F = PMON(1,0); Nb = N; Step2: /* Convert T to a rational, if possible. */ r = RNFMRPP(Q,Qp,q,p,T); if (r == NIL) goto Return; Step4: /* Test whether the numerator of r divides N(1), and whether the denominator of r divides the leading coefficient of N. */ a = RNNUM(r); if (IREM(N1,a) != 0) goto Return; b = RNDEN(r); c = PLDCF(N); if (IREM(c,b) != 0) goto Return; Step5: /* Compute modular polynomial product. */ Fp = PMON(1,0); Kp = K; while (Kp != NIL) { ADV(Kp,&K1,&Kp); while (K1 != NIL) { ADV(K1,&F1,&K1); Fp = MIPPR(1,Q,Fp,F1); } } Step7: /* Convert Fp to a rational polynomial Fs if possible. */ Fs = NIL; while (Fp != 0) { PADV(Fp,&e,&u,&Fp); r = RNFMRPP(Q,Qp,q,p,u); if (r == NIL) goto Return; b = RNDEN(r); if (IREM(c,b) != 0) goto Return; Fs = COMP2(r,e,Fs); } Fs = INV(Fs); Step8: /* Convert Fs to a primitive integral polynomial Ft. */ IPSRP(1,Fs,&c,&Ft); Step9: /* Check if Ft is guaranteed to be irreducible. */ if (PDEG(Ft) != 1) { B = IUPLB(Ft,2); if (ICOMP(Q,B) < 0) goto Return; } Step10: /* Is Ft a factor? */ IPQR(1,N,Ft,&Nt,&R); if (R == 0) { F = Ft; Nb = Nt; } Return: /* Prepare for return. */ *F_ = F; *Nb_ = Nb; return; } saclib2.2.8/src/RPRAN.c0000664002275300236100000000262114017255270013566 0ustar wcbrownscs/*=========================================================================== A <- RPRAN(r,k,q,N) Rational polynomial, random. Inputs r : BETA-digit r >= 0. k : a positive BETA-digit. q : in Q, q = q1/q2 with 0 < q1 <= q2 < BETA. N : a list (n_r,...,n_1) of non-negative BETA-digits. Outputs A : in Q[x_1,...,x_r], a random rational polynomial with deg_i(A) <= n_i for 1 <= i <= r. Each rational number coefficient of A is a / (|b| + 1) where a and b are random k-bit integers. q is the expected density of A, that is, the probability that any particular rational number coefficient of A is non-zero. ===========================================================================*/ #include "saclib.h" Word RPRAN(r,k,q,N) Word r,k,q,N; { Word A,Np,a,d,e,n,q1,q2,qs,rp,t; Step1: /* Compute qls=int(q*BETA). */ FIRST2(q,&q1,&q2); DQR(q1,0,q2,&qs,&t); Step2: /* r=0. */ if (r == 0) { d = DRANN(); if (d < qs) A = RNRAND(k); else A = 0; goto Return; } Step3: /* r > 0. */ rp = r - 1; ADV(N,&n,&Np); A = NIL; for (e = 0; e <= n; e++) { if (rp == 0) { d = DRANN(); if (d < qs) a = RNRAND(k); else a = 0; } else a = RPRAN(rp,k,q,Np); if (a != 0) A = COMP2(e,a,A); } if (A == NIL) A = 0; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IEEELBRN.c0000664002275300236100000000253014017255270014070 0ustar wcbrownscs/*====================================================================== A <- IEEELBRN(F) IEEE to logarithmic binary rational number conversion. Inputs F : a double. Outputs A : a logarithmic binary rational number, A = F. ======================================================================*/ #include "saclib.h" Word IEEELBRN(F) double F; { unsigned m1,m0; int s,e; BDigit a0,a1,k,n; Word A,a; ieee G; Step1: /* F = 0. */ if (F == 0.0) { A = 0; goto Return; } Step2: /* Decompose F. */ G.num = F; s = G.rep.sign; m1 = G.rep.mant_h; m0 = G.rep.mant_l; e = G.rep.exp - BIAS; Step3: /* F infinity or NaN. */ if (e == MAXEXP1) FAIL("IEEELBRN","Infinity or NaN"); Step4: /* Convert mantissa to integer. */ a0 = (m0 & BETA1); a1 = (m1 << 3) | (m0 >> 29); a = (a1 != 0 ? LIST2(a0,a1) : a0); Step5: /* F denormalized. */ if (e == MINEXP1) { k = MINEXP - PREC1; goto Step7; } Step6: /* F normalized. */ a = ISUM(a,IMP2(1,52)); k = e - 52; Step7: /* Compose A. */ n = IORD2(a); a = IDP2(a,n); k = k + n; if (s == 1) a = INEG(a); A = LBRN(a,-k); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/MIPEMV.c0000664002275300236100000000207314017255270013702 0ustar wcbrownscs/*=========================================================================== B <- MIPEMV(r,M,A,a) Modular integral polynomial evaluation of main variable. Inputs A : in Z/(M)[x_1,...,x_r]. r : a BETA-digit, r >= 1, the number of variables. M : in Z. a : in Z/(M). Outputs B : in Z/(M)[x_1,...,x_{r-1}]. B(x_1,...,x_{r-1}) = A(x_1,...,x_{r-1},a). ===========================================================================*/ #include "saclib.h" Word MIPEMV(r,M,A,a) Word r,M,A,a; { Word Ap,B,a1,e1,e2,i,rp; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Apply Horners method. */ ADV(A,&e1,&Ap); B = 0; rp = r - 1; do { ADV(Ap,&a1,&Ap); if (rp == 0) B = MISUM(M,B,a1); else B = MIPSUM(rp,M,B,a1); if (Ap != NIL) ADV(Ap,&e2,&Ap); else e2 = 0; for (i = 1; i <= e1 - e2; i++) if (rp == 0) B = MIPROD(M,a,B); else B = MIPMIP(rp,M,a,B); e1 = e2; } while (Ap != NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPSMV.c0000664002275300236100000000213214017255270013577 0ustar wcbrownscs/*====================================================================== C <- IPSMV(r,A,B) Integral polynomial substitution for main variable. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Z[x_1,...,x_r]. B : in Z[x_1,...x_{r-1}]. Outputs C : in Z[x_1,...x_{r-1}], C(x_1,...,x_{r-1}) = A(x_1,...,x_{r-1},B(x_1,...,x_{r-1})). ======================================================================*/ #include "saclib.h" Word IPSMV(r,A,B) Word r,A,B; { Word A2,Ap,C,e1,e2,i,rp; Step1: /* A = 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* r = 1. */ if (r == 1) { C = IPEMV(r,A,B); goto Return; } Step3: /* Apply Horners method. */ rp = r - 1; ADV2(A,&e1,&C,&Ap); while (Ap != NIL) { ADV2(Ap,&e2,&A2,&Ap); for (i = 1; i <= e1 - e2; i++) C = IPPROD(rp,C,B); C = IPSUM(rp,C,A2); e1 = e2; } for (i = 1; i <= e1; i++) C = IPPROD(rp,C,B); Return: /* Return C. */ return(C); } saclib2.2.8/src/IPINT.c0000664002275300236100000000176714017255270013601 0ustar wcbrownscs/*=========================================================================== B <- IPINT(r,A,b) Integral polynomial integration. Inputs A : in Z[x_1,...,x_r], such that the integral of A with respect to its main variable is an integral polynomial. r : a BETA-digit, r >= 1, the number of variables. b : in Z[x_1,...,x_{r-1}]. Outputs B : in Z[x_1,...,x_r],the integral of A with respect to its main variable, such that B(x_1,...,x_{r-1},0) = b. ===========================================================================*/ #include "saclib.h" Word IPINT(r,A,b) Word r,A,b; { Word Ap,B,a,c,e,rp; Step1: /* Compute. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); e = e + 1; if (r == 1) c = IEQ(a,e); else c = IPIQ(rp,a,e); B = COMP2(c,e,B); } while (Ap != NIL); if (b != 0) B = COMP2(b,0,B); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPRIMS.c0000664002275300236100000000324314017255270013710 0ustar wcbrownscs/*====================================================================== L <- IPRIMS(A,Ap,I) Integral polynomial real root isolation, modified Uspensky method, standard interval. Inputs A : in Z[X], without multiple roots. Ap : is the derivative of A. I : a standard interval. Outputs L : a list (I1,...,Ir) of isolating intervals for the real roots of A in I. Each interval Ij is a left open right closed interval (aj,bj) with binary rational endpoints and I1 < I2 < ... < Ir. ======================================================================*/ #include "saclib.h" Word IPRIMS(A,Ap,I) Word A,Ap,I; { Word A1,I1,Ip1,L,L1,Lp,a,a1,ap1,b,b1,bp1,c,hp,hs,k,kp; /* hide L,a,a1,b,b1,hs,k,kp; */ Step1: /* Degree zero. */ if (PDEG(A) == 0) { L = NIL; goto Return; } Step2: /* Transform A. */ FIRST2(I,&a,&b); c = RNDIF(b,a); RNFCL2(c,&k,&kp); if (b == 0) hp = 0; else { hs = RNQ(b,c); hp = FIRST(hs); } A1 = IUPBHT(A,k); A1 = IUPTR(A1,hp); A1 = IUPNT(A1); Step3: /* Compute roots. */ L1 = IPRIMU(A1); Step4: /* Transform isolation intervals. */ Lp = NIL; while (L1 != NIL) { ADV(L1,&I1,&L1); FIRST2(I1,&a1,&b1); ap1 = RNPROD(a1,c); ap1 = RNDIF(b,ap1); bp1 = RNPROD(b1,c); bp1 = RNDIF(b,bp1); Ip1 = LIST2(bp1,ap1); Lp = COMP(Ip1,Lp); } Step5: /* Convert isolating intervals. */ L = IIC(A,Ap,I,Lp); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/DSMC.c0000664002275300236100000000302314017255270013427 0ustar wcbrownscs/*=========================================================================== r <- DSMC(m,mp,u) Digit solution of modular congruence. Inputs m,u : BETA-digits, m > 1, m odd, m > u >= 0. mp : a BETA-digit, mp = floor((m/2)^(1/2)). Outputs r : if u = 0 then r = 0. Otherwise, if there exist integers a > 0 and b /= 0 such that |a|, b < (m/2)^(1/2) and a = b u (mod m) then r = (a,b), but if not then r = NIL. ===========================================================================*/ #include "saclib.h" Word DSMC(m,mp,u) Word m,mp,u; { Word u0,u1,b0,b1,r,q,s; Step1: /* u = 0. */ if (u == 0) { r = 0; goto Return; } Step2: /* Initialize. */ if (2*u > m) { u1 = m - u; s = -1; } else { u1 = u; s = 1; } u0 = m; b0 = 0; b1 = 1; Step3: /* Compute remainders and cosequence. */ do { if (ABS(b1) > mp) { r = NIL; goto Return; } if (u1 <= mp) { if (u1 == 0) r = NIL; else { if (b1 < 0) { u1 = -u1; b1 = -b1; } if (s == -1) u1 = -u1; r = LIST2(u1,b1); } goto Return; } QREM(u0,u1,&q,&r); u0 = u1; u1 = r; r = b1; b1 = b0 - q * b1; b0 = r; } while(1); Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/IPRRLS.c0000664002275300236100000000461014017255270013717 0ustar wcbrownscs/*====================================================================== IPRRLS(A1,A2,L1,L2; Ls1,Ls2) Integral polynomial real root list separation. Inputs A1,A2 : in Z[X], with no multiple real roots and with no common real roots. L1,L2 : lists of isolating intervals for some or all of the real roots of A1 and A2, respectively. The intervals in L1 and L2 have binary rational endpoints, and are either left-open and right-closed or one-point intervals. Let L1 = (I_{1,1},...,I_{1,r_1}), L2=(I_{2,1},...,I_{2,r_2}). Then I_{1,1} < I_{1,2} < ... < I_{1,r_1} and I_{2,1} < I_{2,2} < ... < I_{2,r_2}. Outputs Ls1,Ls2 : Ls1 = (Is_{1,1},...,Is_{1,r_1}) and Ls2 = (Is_{2,1},...,Is_{2,r_2}), where Is_{i,j} is a binary rational subinterval of I_{i,j} containing the root of Ai in I_{i,j}. Each Is_{1,j} is strongly disjoint from each Is_{2,j}. ======================================================================*/ #include "saclib.h" void IPRRLS(A1,A2,L1,L2, Ls1_,Ls2_) Word A1,A2,L1,L2, *Ls1_,*Ls2_; { Word I1,I2,Lp1,Lp2,Ls1,Ls2,s; /* hide Lp1,Lp2,s; */ Step1: /* Initialize. */ if (L1 == NIL || L2 == NIL) { Ls1 = L1; Ls2 = L2; goto Return; } ADV(L1,&I1,&Lp1); Ls1 = NIL; ADV(L2,&I2,&Lp2); Ls2 = NIL; Step2: /* Refine and merge. */ do { IPRRS(A1,A2,I1,I2,&I1,&I2,&s); if (s < 0) { Ls1 = COMP(I1,Ls1); if (Lp1 != NIL) ADV(Lp1,&I1,&Lp1); else I1 = 0; } else { Ls2 = COMP(I2,Ls2); if (Lp2 != NIL) ADV(Lp2,&I2,&Lp2); else I2 = 0; } } while (!(I1 == 0 || I2 == 0)); Step3: /* Finish. */ if (I1 == 0) { Ls2 = COMP(I2,Ls2); while (Lp2 != NIL) { ADV(Lp2,&I2,&Lp2); Ls2 = COMP(I2,Ls2); } } else { Ls1 = COMP(I1,Ls1); while (Lp1 != NIL) { ADV(Lp1,&I1,&Lp1); Ls1 = COMP(I1,Ls1); } } Ls1 = INV(Ls1); Ls2 = INV(Ls2); Return: /* Prepare for return. */ *Ls1_ = Ls1; *Ls2_ = Ls2; return; } saclib2.2.8/src/IUPRB.c0000664002275300236100000000251614017255270013570 0ustar wcbrownscs/*====================================================================== b <- IUPRB(A) Integral univariate polynomial root bound. Input A : in Z[X], deg(A) > 0. Output b : a binary rational number that is a root bound for A. Let A(x) = a_n x^n + ... + a_0, a_n /= 0. If a_{n-k} = 0 for 1 <= k <= n then b = 1. Otherwise, b is the least power of 2 satisfying 2 ( |a_{n-k}| / |a_n| )^{1/k} <= b for every k such that 1 <= k <= n. ======================================================================*/ #include "saclib.h" Word IUPRB(A) Word A; { Word Ap,a,a1,ab,ab1,abp,b,d,h,h1,k,m,m1,n,n1,q,r,s,t; Step1: /* Initialize. */ ADV2(A,&n,&a,&Ap); h = -1; if (Ap == NIL) goto Step3; ab = IABSF(a); m = ILOG2(ab); t = 0; Step2: /* Process terms. */ do { ADV2(Ap,&n1,&a1,&Ap); k = n - n1; m1 = ILOG2(a1); d = m1 - m - 1; QREM(d,k,&q,&r); if (r < 0) { r = r + k; q = q - 1; } h1 = q + 1; if (r == k - 1) { ab1 = IABSF(a1); abp = ITRUNC(ab,-h1 * k); s = ICOMP(ab1,abp); if (s > 0) h1 = h1 + 1; } if (t == 0 || h1 > h) h = h1; t = 1; } while (Ap != NIL); Step3: /* Compute b. */ b = RNP2(h + 1); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/SIPR.c0000664002275300236100000000143714017255270013465 0ustar wcbrownscs/*====================================================================== SIPR(A,B) Software-float interval polynomial reciprocal transformation. Inputs A : a polynomial in SI[X]. B : an array large enough for a copy of A. Effect B contains the software-float interval polynomial B(x) = x^n A(1/x). ======================================================================*/ #include "saclib.h" void SIPR(A,B) Word *A, *B; { BDigit c,i,j,k,n,p; Step1: /* Degree, precision, interval length. */ n = A[0]; p = A[3]; c = 2 * p + 6; Step2: /* Degree. */ B[0] = n; Step3: /* b_k <- a_(n-k) for k = 0,...,n. */ i = c * n + 1; j = 1; for (k=0;k<=n;k++) { SICOPY(A + i,B + j); i = i - c; j = j + c; } } saclib2.2.8/src/MDPROD.c0000664002275300236100000000101114017255270013661 0ustar wcbrownscs/*====================================================================== c <- MDPROD(m,a,b) Modular digit product. Inputs m : a positive BETA-integer. a,b : elements of Z_m. Otuputs c : a * b. ======================================================================*/ #include "saclib.h" Word MDPROD(m,a,b) Word m,a,b; { Word c,c0,c1,q; Step1: /* Compute. */ DPR(a,b,&c1,&c0); DQR(c1,c0,m,&q,&c); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/AIFAN.c0000664002275300236100000000176014017255270013525 0ustar wcbrownscs/*====================================================================== AIFAN(M; mh,Mh) Algebraic integer from algebraic number. Input: M : in Z[x], the minimal polynomial for an algebraic number alpha. Output: mh : in Z. mh = ldcf(M). Mh : in Z[x]. Mh = mh^{deg(Mh)-1} M(x/mh). ======================================================================*/ #include "saclib.h" void AIFAN(M, mh_,Mh_) Word M, *mh_,*Mh_; { Word D,Mh,Mp,c,e,f,m,mh; Step1: /* Compute Mh, mh. */ Mp = M; ADV2(Mp,&f,&mh,&Mp); if (mh == 1) { Mh = M; goto Return; } D = 1; Mh = LIST2(1,f); f = f - 1; do { ADV2(Mp,&e,&m,&Mp); D = IPROD(D,IEXP(mh,f - e)); f = e; c = IPROD(m,D); Mh = COMP2(c,e,Mh); } while (!(Mp == NIL)); Mh = INV(Mh); Return: /* Prepare for return. */ *mh_ = mh; *Mh_ = Mh; return; } saclib2.2.8/src/IPC.c0000664002275300236100000000161314017255270013317 0ustar wcbrownscs/*====================================================================== C <- IPC(r,A) Integral polynomial content. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr] Outputs C : in Z[X1,...,X_{r-1}], the content of A. ======================================================================*/ #include "saclib.h" Word IPC(r,A) Word r,A; { Word Ap,C,C1,Cp,Cp1,rp; /* hide Ap,C1,Cp,Cp1,rp; */ Step1: /* A equal 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* A not equal 0. */ Ap = RED(A); ADV(Ap,&C,&Ap); rp = r - 1; while (Ap != NIL) { Ap = RED(Ap); ADV(Ap,&C1,&Ap); IPGCDC(rp,C,C1,&C,&Cp,&Cp1); if (IPONE(rp,C) == 1) goto Return; } C = IPABS(rp,C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/PME.c0000664002275300236100000000166314017255270013332 0ustar wcbrownscs/*=========================================================================== B <- PME(r,A,i,k) Polynomial multiplication of exponents. Inputs r : a positive beta digit. A : a nonzero polynomial in r variables over any domain. i : a beta digit, 1 <= i <= r. k : a positive beta digit. Output B : the polynomial obtained from A by multiplying every exponent of x^i in A by k. ======================================================================*/ #include "saclib.h" Word PME(r,A,i,k) BDigit i,k,r; Word A; { BDigit e; Word a,Ap,B; Step1: /* i = r. */ if (i == r) { Ap = A; B = NIL; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); B = COMP2(a,e*k,B); } B = INV(B); goto Return; } Step2: /* i < r. */ Ap = A; B = NIL; while (Ap!= NIL) { ADV2(Ap,&e,&a,&Ap); B = COMP2(PME(r-1,a,i,k),e,B); } B = INV(B); Return: /* Return B. */ return(B); } saclib2.2.8/src/VISUM.c0000664002275300236100000000126714017255270013614 0ustar wcbrownscs/*====================================================================== C <- VISUM(A,B) Vector of integers sum. Inputs A,B : vectors over Z. Outputs C : a vector over Z, C = A+B. ======================================================================*/ #include "saclib.h" Word VISUM(A,B) Word A,B; { Word Ap,Bp,C,a,b,c; /* hide Ap,Bp,a,b; */ Step1: /* Compute. */ C = NIL; Ap = A; Bp = B; do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); c = ISUM(a,b); C = COMP(c,C); } while (Ap != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/GCAFREE.c0000664002275300236100000000155414017255270013744 0ustar wcbrownscs/*====================================================================== GCAFREE(A) Garbage collected array memory deallocation. Inputs A : a GCA handle. Side effects The array represented by A is deallocated, the cell is linked to GCAAVAIL. ======================================================================*/ #include "saclib.h" #include void GCAFREE(A) Word A; { /* hide algorithm */ Step1: /* Test for illegal GCA handle. */ if (A <= BETAp || BETApp <= A) goto Return; Step2: /* Free memory. */ if (GCASPACEBp[A].array != 0) free(GCASPACEBp[A].array); GCASPACEBp[A].array = (Word *)0; GCASPACEBp[A].len = 0; Step3: /* Link free cell to avail list. */ GCASPACEBp[A].next = GCAAVAIL; GCAAVAIL = A; Return: /* Prepare for return. */ return; } saclib2.2.8/src/IUPLB.c0000664002275300236100000000171214017255270013557 0ustar wcbrownscs/*=========================================================================== b <- IUPLB(A,k) Integral univariate polynomial lifting bound. Input A : in Z[x], deg(A) >= 3. k : a BETA-digit, k >= 2. Output b : in Z. If A = A_1 A_2 ... A_k is a non-trivial factorization of A, then at least one of the A_i's will have max norm less than sqrt(b/2). The Beauzamy-Trevisan-Wang bound is used. ===========================================================================*/ #include "saclib.h" Word IUPLB(A,k) Word A,k; { Word N,Ns,b,c,n,np,nt,t; Step1: /* Compute twice the square of the B-T-W bound. */ N = IUPSWN(A); IROOT(N,k,&Ns,&t); Ns = ISUM(Ns,t); n = PDEG(A); b = IMP2(Ns,n+1); nt = IPROD(IPROD(n,n),n); IROOT(nt,4,&np,&t); b = RNRED(b,np); c = RNRED(6,5); b = RNPROD(c,b); b = RNCEIL(b); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/IUPHIP.c0000664002275300236100000000241114017255270013677 0ustar wcbrownscs/*====================================================================== IUPHIP(A; B,t) Integral univariate polynomial to hardware interval polynomial. Input A : a non-zero univariate integral polynomial. Outputs B : the hardware interval polynomial that results from replacing each coefficient of A with the smallest hardware interval containing it. t : if t = 0, the program failed because of exponent overflow and B is undefined. Otherwise t = 1. ======================================================================*/ #include "saclib.h" void IUPHIP(A, B_,t_) Word A; interval **B_; BDigit *t_; { BDigit i,n,t; interval *B; Word Ap,a; Step1: /* Get array for B. */ n = PDEG(A); B = GETHIPARRAY(n); Step2: /* Convert coefficients. */ Ap = A; for (i = n; i >= 0; i--) { if (Ap == NIL || FIRST(Ap) < i) B[i].left = B[i].right = 0.0; else { Ap = RED(Ap); ADV(Ap,&a,&Ap); IHI(a,&B[i],&t); if (t == 0) { FREEARRAY(B); goto Return; } } } Return: /* Return B and t.*/ *B_ = B; *t_ = t; return; } saclib2.2.8/src/RISIGN.c0000664002275300236100000000150314017255270013675 0ustar wcbrownscs/*====================================================================== s <- RISIGN(I) Rational interval sign. Inputs I : a rational interval. I = (a1,a2). Outputs s : integer. If 0 not in I or I is a one-point interval then s = sign(a1) else s = NIL. ======================================================================*/ #include "saclib.h" Word RISIGN(I) Word I; { Word s; Word a1,a2; Step1: /* Get endpoints of I and J. */ FIRST2(I,&a1,&a2); Step2: /* I = 0. */ if (a1 == 0 && a2 == 0) { s = 0; goto Return; } STEP3: /* Check if 0 in I. */ if (RNSIGN(a1) > 0) s = 1; else if (RNSIGN(a2) < 0) s = -1; else s = NIL; Return: return(s); } saclib2.2.8/src/PFDP.c0000664002275300236100000000171714017255270013442 0ustar wcbrownscs/*====================================================================== B <- PFDP(r,A) Polynomial from dense polynomial. Inputs A : in R[X1,...,Xr], dense representation. r : a BETA-digit, r >= 0. Outputs B : in R[X1,...,Xr], the result of converting A to recursive representation. ======================================================================*/ #include "saclib.h" Word PFDP(r,A) Word r,A; { Word Ap,B,b,n,rp; /* hide rp; */ Step1: /* Convert. */ if (A == 0 || r == 0) { B = A; goto Return; } ADV(A,&n,&Ap); B = NIL; rp = r - 1; do { ADV(Ap,&b,&Ap); if (b != 0) { if (rp != 0) b = PFDP(rp,b); B = COMP2(b,n,B); } n = n - 1; } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/CSINT.c0000664002275300236100000000231614017255270013565 0ustar wcbrownscs/*====================================================================== C <- CSINT(A,B) Characteristic set intersection. Inputs A,B : are characteristic sets. Outputs C : the intersection of A and B. ======================================================================*/ #include "saclib.h" Word CSINT(A,B) Word A,B; { Word Ap,Bp,C,Cp,a,b; /* hide Ap,Bp,C,a,b; */ Step1: /* A and B single-precision. */ if (A < BETA && B < BETA) { C = DAND(A,B); goto Return; } Step2: /* A single-precision. */ if (A < BETA) { C = DAND(A,FIRST(B)); goto Return; } Step3: /* B single-precision. */ if (B < BETA) { C = DAND(FIRST(A),B); goto Return; } Step4: /* General case. */ Cp = NIL; Ap = A; Bp = B; do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); Cp = COMP(DAND(a,b),Cp); } while (!(Ap == NIL || Bp == NIL)); while (Cp != NIL && FIRST(Cp) == 0) Cp = RED(Cp); C = INV(Cp); if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MAPMPV.c0000664002275300236100000000155414017255270013710 0ustar wcbrownscs/*=========================================================================== MAPMPV(p,A,n,k) Modular array polynomial multiplication by a power of variable. Inputs A : a univariate polynomial in array representation. k : a positive integer such that m + k + 2 <= n where m = deg(A) and n is the size of the array representing A. Side effect The array is modified so that it represents x^k A(x). ===========================================================================*/ #include "saclib.h" void MAPMPV(A,k) Word *A,k; { Word m,i; Step1: /* Shift the coefficients. */ m = MAPDEG(A); for (i = m; i >= 0; i--) MAPCF(A,i+k) = MAPCF(A,i); Step2: /* Append zeros. */ for (i = 0; i < k; i++) MAPCF(A,i) = 0; Step3: /* Change the degree. */ MAPDEG(A) = m+k; Return: /* Prepare for return. */ return; } saclib2.2.8/src/AMUPRBH.c0000664002275300236100000000276714017255270014015 0ustar wcbrownscs/*====================================================================== AMUPRBH(M,I,A;b,B) Algebraic module univariate polynomial root bound and homothetic transformation. Inputs M : an element of Z[X]. M is the minimal polynomial for a real algebraic number alpha. I : an acceptable isolating interval for alpha. A : an element of Z[alpha][X]. Outputs b : a binary rational number. b = 2^k is a root bound for A. B : an element of Z(alpha)[X]. B = A(2^kX). ======================================================================*/ #include "saclib.h" void AMUPRBH(M,I,A, b_,B_) Word M,I,A; Word *b_,*B_; { Word b,B; Word Is,B1,B2,v1,v2; Step1: /* Initialize. */ b = LIST2(1,1); B = A; v1 = 1; v2 = 1; Is = I; Step2: /* Check for positive roots outside the unit circle. */ if (v1 != 0) { B1 = AMUPTR1(B); AMUPVARIR(M,Is,B1,&v1,&Is); v1 = v1 + PORD(B1); } Step3: /* Check for negative roots outside the unit circle. */ if (v1 == 0 && v2 != 0) { B2 = AMUPTR1(AMUPNT(B)); AMUPVARIR(M,Is,B2,&v2,&Is); v2 = v2 + PORD(B2); } Step4: /* Root bound test and homothetic transformation. */ if (v1 == 0 && v2 == 0) goto Return; else { b = RNPROD(b,RNINT(2)); B = AMUPBHT(B,1); goto Step2; } Return: *b_ = b; *B_ = B; return; } saclib2.2.8/src/IIEEET.c0000664002275300236100000000577214017255270013662 0ustar wcbrownscs/*====================================================================== IIEEET(A; F,t,u) Integer to IEEE double - truncation. Inputs: A : integer. Outputs: F : IEEE double. If A > 0, F is the greatest IEEE-double that is <= A. If A < 0, F is the smallest IEEE-double that is >= A. t : exactness flag. t = 0 if A = F, t = 1 if A /= F. u : If u = 0, the conversion failed because of exponent overflow, and F is undefined. Otherwise u = 1. ======================================================================*/ #include "saclib.h" void IIEEET(A, F_,t_,u_) Word A; ieee *F_; BDigit *t_,*u_; { BDigit a,a0,a1,a2,ap,app,b,e,eb,k,kp,m0,m1,mt,n,r,s,t,u; Word Ap,App; ieee F; Step1: /* A = 0. */ if (A == 0) { s = 0; eb = 0; m1 = 0; m0 = 0; t = 0; goto Step8; } Step2: /* A single precision. */ if (A < BETA) { if (A < 0) { s = 1; A = -A; } else s = 0; e = PDLOG2(A); k = ZETA - e; a2 = (A << k); a2 = a2 - BETA/2; m1 = (a2 >> 8); mt = (a2 & 255); m0 = (mt << 24); t = 0; eb = e+BIAS-1; goto Step8; } Step3: /* Approximate A by 0.[a2,a1,a0] * 2^e. */ Ap = RED(A); App = RED(Ap); if (App == NIL) { a0 = 0; a1 = FIRST(A); a2 = FIRST(Ap); e = 2 * ZETA; r = 0; } else if (RED(App) == NIL) { a0 = FIRST(A); a1 = FIRST(Ap); a2 = FIRST(App); e = 3 * ZETA; r = 0; } else { n = 3; r = 0; Ap = A; do { App = RED(App); n = n + 1; ADV(Ap,&a,&Ap); if (a != 0) r = 1; } while (RED(App) != NIL); a0 = FIRST(Ap); a1 = FIRST(RED(Ap)); a2 = FIRST(App); e = n * ZETA; } Step4: /* Normalize [a2,a1,a0]. */ if (a2 < 0) { s = 1; a2 = -a2; a1 = -a1; a0 = -a0; } else s = 0; kp = PDLOG2(a2); k = ZETA - kp; ap = a0 >> kp; a0 = (a0 << k) & BETA1; r = r | a0; app = a1 >> kp; a1 = ((a1 << k) & BETA1) | ap; a2 = (a2 << k) | app; e = e - k; Step5: /* Extract mantissa. */ a2 = a2 - BETA/2; m1 = (a2 >> 8); mt = (a2 & 255); m0 = (mt << 24) | (a1 >> 5); b = a1 & 31; Step6: /* Determine exactness flag. */ if (r == 0 && b == 0) t = 0; else t = 1; Step7: /* Overflow? Convert exponent. */ if (e > MAXEXP) { u = 0; goto Return; } else { u = 1; eb = e+BIAS-1; } Step8: /* Construct IEEE double. */ u = 1; F.rep.sign = s; F.rep.exp = eb; F.rep.mant_h = m1; F.rep.mant_l = m0; Return: /* Return F, t and u. */ *F_ = F; *t_ = t; *u_ = u; return; } saclib2.2.8/src/AFDWRITE.c0000664002275300236100000000153314017255270014112 0ustar wcbrownscs/*=========================================================================== AFDWRITE(M,I,b,n) Algebraic number field, decimal write. Inputs M : integral minimal polynomial for a real algebraic number alpha. I : an acceptable isolating interval for alpha. b : an element of Q(alpha). n : non-negative integer. Side effects A decimal approximation to b is written to the output stream. |b - R| < 1/2 10^{-n}. The decimal approximation is followed by '+' if |R| < |b| and '-' if |R| < |b|. ===========================================================================*/ #include "saclib.h" void AFDWRITE(M,I,b,n) Word M,I,b,n; { Word J,N; Step1: /* Convert to algebraic number and write. */ ANFAF(M,I,b,&N,&J); ANDWRITE(N,J,n); Return: /* Prepare for return. */ return; } saclib2.2.8/src/CCONC.c0000664002275300236100000000141514017255270013531 0ustar wcbrownscs/*====================================================================== L <- CCONC(L1,L2) Constructive concatenation. Inputs L1, L2 : lists. Outputs L : the concatenation of L1 and L2 ( L is constructed, L1 and L2 are not destroyed ). ======================================================================*/ #include "saclib.h" Word CCONC(L1,L2) Word L1,L2; { Word L,Lp1; /* hide algorithm */ Step1: /* Is L1 or L2 null. */ L = L2; if (L1 == NIL) goto Return; L = L1; if (L2 == NIL) goto Return; Step2: /* Concatenate copy of L1. */ Lp1 = CINV(L1); L = INV(Lp1); SRED(Lp1,L2); goto Return; Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/RED2.c0000664002275300236100000000102714017255270013377 0ustar wcbrownscs/*====================================================================== Lp <- RED2(L) Reductum 2. Inputs L : list of length 2 or more. Outputs Lp : the second reductum of L. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word RED2(L) Word L; { Word Lp; /* hide algorithm */ Step1: /* Compute. */ Lp = RED(RED(L)); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/AFPEV.c0000664002275300236100000000235714017255270013553 0ustar wcbrownscs/*====================================================================== B <- AFPEV(r,M,A,i,a) Algebraic number field polynomial evaluation. Inputs r : a BETA-digit, r >= 1. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[X1,...,Xr]. i : a BETA-digit, 1 <= i <= r. a : in Q(alpha). Outputs B : in Q(alpha)[X1,...,X_{i-1},X_{i+1},...,Xr]. B(X1,...,X_{i-1},X_{i+1},...,Xr) = A(X1,...,X_{i-1},a,X_{i+1},...,Xr). ======================================================================*/ #include "saclib.h" Word AFPEV(r,M,A,i,a) Word r,M,A,i,a; { Word A1,Ap,B,B1,e1,rp; /* hide A1,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i = r. */ if (i == r) { B = AFPEMV(r,M,A,a); goto Return; } Step3: /* i < r. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e1,&A1,&Ap); B1 = AFPEV(rp,M,A1,i,a); if (B1 != 0) B = COMP2(B1,e1,B); } while (!(Ap == NIL)); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/PDBORD.c0000664002275300236100000000143614017255270013661 0ustar wcbrownscs/*====================================================================== B <- PDBORD(A) Polynomial divided by order. Inputs A : a non-zero polynomial. Outputs B : polynomial B(X) = A(X)/X^k where k is the order of A. ======================================================================*/ #include "saclib.h" Word PDBORD(A) Word A; { Word Ap,B,a,e,k; /* hide Ap,a,e,k; */ Step1: /* Compute. */ k = PORD(A); if (k == 0) B = A; else { B = NIL; Ap = A; do { ADV2(Ap,&e,&a,&Ap); e = e - k; B = COMP2(a,e,B); } while (!(Ap == NIL)); B = INV(B); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/INV.c0000664002275300236100000000117214017255270013340 0ustar wcbrownscs/*====================================================================== M <- INV(L) Inverse. Inputs L : a list. Outputs M : the inverse of L. Side effects The list L is transformed into M. ======================================================================*/ #include "saclib.h" Word INV(L) Word L; { Word M,Mp,Mpp; /* hide algorithm */ Step1: /* Construct. */ M = NIL; Mp = L; while (Mp != NIL) { Mpp = RED(Mp); SRED(Mp,M); M = Mp; Mp = Mpp; } Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/AFPICR.c0000664002275300236100000000203514017255270013647 0ustar wcbrownscs/*=========================================================================== B <- AFPICR(r,A) Algebraic number field polynomial inverse convert representation. Inputs r : a non-negative BETA-integer. A : an element of Q(alpha)[x_1,...,x_r], where the coefficients of A are represented as (a_i,Ai), where a_i is an element of Q and Ai is an element of Z[x]. Outputs B : an element of Q(alpha)[x_1,...,x_r] represented as an element of Q[x,x_1,...,x_r]. ===========================================================================*/ #include "saclib.h" Word AFPICR(r,A) Word r,A; { Word B; Word Ap,a,b,e,rp; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { B = AFICR(A); goto Return; } Step3: /* r > 0. */ rp = r - 1; Ap = A; B = NIL; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = AFPICR(rp,a); B = COMP2(b,e,B); } B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/DMPPRD.c0000664002275300236100000000312414017255270013671 0ustar wcbrownscs/*====================================================================== C <- DMPPRD(r,m,A,B) Dense modular polynomial product. Inputs r : a BETA-digit, r >= 0, the number of variables. A , B : in Z/(m)[X1,...,Xr]. m : BETA-digit. Outputs C : in Z/(m)[X1,...,Xr], the product of A and B. ======================================================================*/ #include "saclib.h" Word DMPPRD(r,m,A,B) Word r,m,A,B; { Word Ap,As,Bp,Bs,C,C1,a,b,c,e,f,i,j,n,rp; /* hide a,i,j,n,rp; */ Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { C = MDPROD(m,A,B); goto Return; } Step3: /* General case. */ ADV(A,&e,&Ap); ADV(B,&f,&Bp); As = CINV(Ap); Bs = CINV(Bp); C = 0; rp = r - 1; for (i = 0; i <= f; i++) { C1 = NIL; for (j = 1; j <= i; j++) C1 = COMP(0,C1); Ap = As; ADV(Bs,&b,&Bs); for (j = 0; j <= e; j++) { ADV(Ap,&a,&Ap); if (rp == 0) c = MDPROD(m,a,b); else c = DMPPRD(rp,m,a,b); C1 = COMP(c,C1); } n = e + i; while (C1 != NIL && FIRST(C1) == 0) { n = n - 1; C1 = RED(C1); } if (C1 != NIL) { C1 = COMP(n,C1); C = DMPSUM(r,m,C1,C); } } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/LBIBMS.c0000664002275300236100000000330514017255270013654 0ustar wcbrownscs/*====================================================================== M <- LBIBMS(L) List of BETA-integers bubble-merge sort. Inputs L : an arbitrary list of BETA-integers, possibly with repetitions. Outputs M : the result of sorting L into non-decreasing order. A combination of bubble-sort and merge-sort is used. The list L is modified to produce M. ======================================================================*/ #include "saclib.h" Word LBIBMS(L) Word L; { Word B,Bp,C,L1,L2,Lp,Lpp,Lppp,M,i,j,k,m,n,q,qp,r,t; /* hide Bp,L1,L2,Lp,Lpp,i,j,k,m,n,q,qp,r,t; */ Step1: /* Short list. */ t = 10; n = LENGTH(L); if (n < t) { LBIBS(L); M = L; goto Return; } Step2: /* Prepare for merge. */ k = 0; m = 1; q = n; do { k = k + 1; m = m + m; q = q / 2; } while (!(q < t)); r = n - m * q; B = NIL; Lp = L; for (i = 1; i <= m; i++) { if (i <= r) qp = q; else qp = q - 1; Lpp = Lp; for (j = 1; j <= qp; j++) Lpp = RED(Lpp); Lppp = RED(Lpp); SRED(Lpp,NIL); LBIBS(Lp); B = COMP(Lp,B); Lp = Lppp; } Step3: /* Merge. */ for (i = 1; i <= k; i++) { C = NIL; Bp = B; do { ADV2(Bp,&L1,&L2,&Bp); L1 = LBIM(L1,L2); C = COMP(L1,C); } while (!(Bp == NIL)); B = C; } M = FIRST(B); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/FRAPREM.c0000664002275300236100000000325114017255270014000 0ustar wcbrownscs/*========================================================================== FRAPREM(p,M,A,B) Finite ring array polynomial remainder. Inputs p : a BETA-digit, p a prime. M : in Z/(p)[x], M in array representation. A, B : in (Z/(p)[x])/(M)[y], A, B non-zero. A and B are in array representation. Side effects A is modified. If the leading coefficient is invertible or deg(A) < deg(B), then A will contain the remainder of A modulo B. Otherwise, deg(A) = -1. ==========================================================================*/ #include "saclib.h" void FRAPREM(p,M,A,B) Word p,*M,**A,**B; { Word n,m,*bp,k,*a,*q,*r,j; Step1: /* deg(B) = 0. */ n = FRAPDEG(B); if (n == 0) { FRAPDEG(A) = 0; a = FRAPLDCF(A); MAPDEG(a) = 0; MAPLDCF(a) = 0; goto Return; } Step2: /* deg(A) < deg(B). */ m = FRAPDEG(A); if (m < n) goto Return; Step3: /* Get temporary arrays. */ q = MAPGET(MAPDEG(M)-1); r = MAPGET(MAPDEG(M)-1); Step4: /* Invert leading coefficient, if possible. */ bp = FREINV(p,M,FRAPLDCF(B)); if (MAPDEG(bp) < 0) { FRAPDEG(A) = -1; goto Step7; } Step5: /* Compute remainder. */ for (k = m-n; k >= 0; k--) { a = FRAPCF(A,n+k); FREPROD(p,M,a,bp,q); if (!MAPZERO(q)) for (j = n+k-1; j >= k; j--) { FREPROD(p,M,q,FRAPCF(B,j-k),r); MAPIDIF(p,FRAPCF(A,j),r); } } Step6: /* Determine degree of remainder. */ j = n - 1; while (MAPZERO(FRAPCF(A,j)) && j > 0) j--; FRAPDEG(A) = j; Step7: /* Free arrays. */ MAPFREE(bp); MAPFREE(q); MAPFREE(r); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IHDREM.c0000664002275300236100000000152414017255270013655 0ustar wcbrownscs/*=========================================================================== r <- IHDREM(A,n,b) Integer half-digit remainder. Inputs A : in Z, positive, and in array representation. n : a BETA-digit, the length of A. b : a BETA-digit, 0 < b < 2^15. Output r : a BETA-digit, the remainder of A modulo b, 0 <= r < b. ===========================================================================*/ #include "saclib.h" Word IHDREM(A,n,b) Word *A,n,b; { Word a0,a1,np,r; Step1: /* Initialize. */ if (n <= 1) { r = A[0] % b; goto Return; } Step2: /* Divide. */ np = n - 1; a1 = A[np]; r = a1 = a1 % b; while (np >= 1) { np--; a0 = A[np]; r = PHDREM(a1,a0,b); a1 = r; } Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/GIAGI.c0000664002275300236100000000121614017255270013523 0ustar wcbrownscs/*======================================================================== B = GIAGI(A) Gaussian integer to array Gaussian integer. Input A : a Gaussian integer. Output B : The array representation of A. ========================================================================*/ #include "saclib.h" BDigit **GIAGI(A) Word A; { BDigit **B; Word A1,A2; Step1: /* Get the parts. */ if (A == 0) { A1 = 0; A2 = 0; } else FIRST2(A, &A1,&A2); Step2: /* Convert the parts. */ B = GETMATRIX(2,1); FREEARRAY(B[0]); FREEARRAY(B[1]); B[0] = IAI(A1); B[1] = IAI(A2); Return: /* Return B. */ return(B); } saclib2.2.8/src/IUPPRB.c0000664002275300236100000000300514017255270013702 0ustar wcbrownscs/*====================================================================== b <- IUPPRB(A) Integral univariate polynomial positive root bound. Inputs A : in Z[x], deg(A) > 0, A(0) /= 0. Outputs b : a logarithmic binary rational number that is an upper bound for the positive roots of A. Let A(x) = a_n x^n +...+ a_0 with n = deg(A). If a_{n-k} / a_n >= 0 for all k, then b = 0. Otherwise, b is the least power of 2 such that, for every k with 1 <= k <= n, 2 (-a_{n-k} / a_n )^{1/k} <= b. ======================================================================*/ #include "saclib.h" Word IUPPRB(A) Word A; { Word d,h,h1,k,m,m1,n,n1,q,r,s,s1,t; Word Ap,a,a1,ap,b; Step1: /* Initialize. */ t = 0; h = 0; ADV2(A,&n,&a,&Ap); if (Ap == NIL) { h = -1; goto Step3; } s = ISIGNF(a); if (s < 0) a = INEG(a); m = ILOG2(a); Step2: /* Process terms. */ do { ADV2(Ap,&n1,&a1,&Ap); s1 = ISIGNF(a1); if (s != s1) { k = n - n1; m1 = ILOG2(a1); d = m1 - m - 1; QREM(d,k,&q,&r); if (r < 0) { r = r + k; q = q - 1; } h1 = q + 1; if (r == k - 1) { if (s1 < 0) a1 = INEG(a1); ap = ITRUNC(a,-h1 * k); if (ICOMP(a1,ap) > 0) h1 = h1 + 1; } if (t == 0 || h1 > h) h = h1; t = 1; } } while (Ap != NIL); Step3: /* Compute b. */ if (t == 0) b = 0; else b = LIST2(1,-h -1); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/IEEEDWRITE.c0000664002275300236100000000111314017255270014325 0ustar wcbrownscs/*====================================================================== IEEEDWRITE(F,k) IEEE decimal write. Inputs F : an ieee double. k : a positive beta-digit. Effect F is printed as a rounded k-decimal digit fraction, with a trailing '+' or '-' indicating whether the exact value is larger or smaller. ======================================================================*/ #include "saclib.h" void IEEEDWRITE(F,k) ieee F; BDigit k; { Word G; Step1: /* Convert and write. */ G = IEEELBRN(F.num); LBRNDWRITE(G,k); Return: /* Return. */ return; } saclib2.2.8/src/SPOWER.c0000664002275300236100000000105414017255270013722 0ustar wcbrownscs/*=========================================================================== t <- SPOWER(s,a) Sign power. Input s : a sign. a : a non-negative BETA-digit. Ouput t : t = s^a. ===========================================================================*/ #include "saclib.h" Word SPOWER(s,a) Word s,a; { Word c; Step1: /* Compute. */ if (a == 0) c = 1; else if (s == 0) c = 0; else if (ODD(a) && s == -1) c = -1; else c = 1; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MAPASSIGN.c0000664002275300236100000000116414017255270014227 0ustar wcbrownscs/*=========================================================================== MAPASSIGN(A,B) Modular array polynomial assignment. Inputs A : a modular array polynomial. B : an array at least as large as deg(A)+2. Side effects B is modified so that it contains the polynomial A. ===========================================================================*/ #include "saclib.h" void MAPASSIGN(A,B) Word *A,*B; { Word i,n; Step1: /* Modify B. */ n = MAPDEG(A); MAPDEG(B) = n; for (i = 0; i <= n; i++) MAPCF(B,i) = MAPCF(A,i); Return: /* Prepare for return. */ return; } saclib2.2.8/src/EXPF.c0000664002275300236100000000076014017255270013450 0ustar wcbrownscs/*====================================================================== c <- EXPF(a,b) Exponential function. Inputs a, b : C integers, b non-negative. Outputs c : a^b, with 0^0=1. ======================================================================*/ #include "saclib.h" Word EXPF(a,b) Word a,b; { Word c,i; Step1: /* Compute. */ c = 1; for (i = 1; i <= b; i++) c = a * c; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/RNRAND.c0000664002275300236100000000117114017255270013667 0ustar wcbrownscs/*====================================================================== R <- RNRAND(n) Rational number, random. Inputs n : a positive BETA-integer. Outputs R : Random integers a and b are generated using IRAND(n). Then R=a/(abs(b)+1), reduced to lowest terms. ======================================================================*/ #include "saclib.h" Word RNRAND(n) Word n; { Word A,B,R; Step1: /* Compute. */ A = IRAND(n); B = IRAND(n); B = IABSF(B); B = ISUM(B,1); R = RNRED(A,B); Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/MMAPHEG.c0000664002275300236100000000402714017255270013764 0ustar wcbrownscs/*=========================================================================== MMAPHEG(p,A,B, C,V) Medium modulus array polynomial half-extended greatest common divisor. Inputs p : a medium prime. A,B : in Z/(p)[x], A and B are in array representation. C : an array large enough to hold gcd(A,B). V : an array of size at least deg(A/gcd(A,B))+2. Side effects gcd(A,B) is computed and put in C. Let Vp be the polynomial in Z/(p)[x] such there exists Up in Z/(p)[x] such that A U + B V = C. If deg(A/C) > 0, then deg(Vp) < deg(A/C). If deg(A/C) = 0, then deg(Vp) = 0. If B = 0, then Vp = 0. Vp is computed and put in V. ===========================================================================*/ #include "saclib.h" void MMAPHEG(p,A,B, C,V) Word p,*A,*B, *C,*V; { Word *V1,*V2,*V3,*t,*A1,*A2,*Q,*P,k,a,ap,c,i; Step1: /* Initialize. */ k = MAPDEG(A); V1 = MAPGET(k); MAPDEG(V1) = 0; MAPCF(V1,0) = 0; V2 = MAPGET(k); MAPDEG(V2) = 0; MAPCF(V2,0) = 1; V3 = MAPGET(k); A1 = MAPCOPY(A); A2 = MAPCOPY(B); k = maxm(MAPDEG(A),MAPDEG(B)); Q = MAPGET(k); P = MAPGET(k); Step2: /* Compute remainder sequence. */ while (!MAPZERO(A2)) { MMAPQR(p,A1,A2,Q); MMAPPROD(p,Q,V2,P); MAPDIF(p,V1,P,V3); t = V1; V1 = V2; V2 = V3; V3 = t; t = A1; A1 = A2; A2 = t; } Step3: /* Adjust ldcf. */ if (MAPZERO(A1)) { MAPDEG(C) = 0; MAPCF(C,0) = 0; MAPDEG(V) = 0; MAPCF(V,0) = 0; } else { a = MAPLDCF(A1); ap = MDINV(p,a); k = MAPDEG(A1); MAPDEG(C) = k; for (i = 0; i <= k; i++) { c = (ap * MAPCF(A1,i)) % p; MAPCF(C,i) = c; } k = MAPDEG(V1); MAPDEG(V) = k; for (i = 0; i <= k; i++) { c = (ap * MAPCF(V1,i)) % p; MAPCF(V,i) = c; } } Step4: /* Free arrays. */ MAPFREE(V1); MAPFREE(V2); MAPFREE(V3); MAPFREE(A1); MAPFREE(A2); MAPFREE(Q); MAPFREE(P); Return: /* Prepare for return. */ return; } saclib2.2.8/src/DNOT.c0000664002275300236100000000100414017255270013442 0ustar wcbrownscs/*====================================================================== b <- DNOT(a) Digit not. Inputs a : a non-negative BETA-digit. Outputs b : the bit-wise not of a. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word DNOT(a) Word a; { Word b; /* hide b; */ Step1: /* Compute. */ b = BETA1 - a; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/SIPPRB.c0000664002275300236100000000346214017255270013707 0ustar wcbrownscs/*====================================================================== k <- SIPPRB(A) Software interval polynomial positive root bound. Inputs A : a software integral polynomial of positive degree such that A[n] does not contain zero. Output k : If all nonzero coefficients of A have the same sign, then A has no positive roots and k = NIL. Otherwise k is a positive integer such that for all i, 1 <= i <= n, if -a_{n-i} / a_n < 0, then 2 |-a_{n-i} / a_n|^{1/i} <= k, a BETA-digit such that all positive roots are less than 2^k. ======================================================================*/ #include "saclib.h" Word SIPPRB(A) BDigit *A; { BDigit d,e,f,i,j,n,p,q,q1,q2,r,S,s,t; Word k; Step1: /* Compute sizes. */ n = A[0]; p = A[3]; q1 = p + 3; q2 = q1 + q1; S = n * q2 + 1; Step2: /* Branch on sign of leading coefficient. */ k = NIL; s = A[S+1]; if (s < 0) goto Step4; Step3: /* A[n] > 0, process terms. */ e = A[S]; for (i = n - 1; i >= 0; i--) { S = S - q2; t = A[S+1]; if (t < 0) { f = A[S]; j = n - i; d = f - e + 1; QREM(d,j,&q,&r); if (r > 0) q = q + 1; if (k == NIL || q > k) k = q; } } if (k != NIL) k = k + 1; goto Return; Step4: /* A[n] < 0, process terms. */ S = S + q1; e = A[S]; for (i = n - 1; i >= 0; i--) { S = S - q2; t = A[S+1]; if (t > 0) { f = A[S]; j = n - i; d = f - e + 1; QREM(d,j,&q,&r); if (r > 0) q = q + 1; if (k == NIL || q > k) k = q; } } if (k != NIL) k = k + 1; Return: /* Return k. */ return(k); } saclib2.2.8/src/PMON.c0000664002275300236100000000104614017255270013455 0ustar wcbrownscs/*====================================================================== A <- PMON(a,e) Polynomial monomial. Inputs a : in R, R ring. e : a BETA-integer, e >=0. Outputs A : in R[X], A(X) = a X^e. ======================================================================*/ #include "saclib.h" Word PMON(a,e) Word a,e; { Word A; /* hide algorithm */ Step1: /* Compute. */ if (a == 0) A = 0; else A = LIST2(e,a); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IUPBRES.c0000664002275300236100000000256114017255270014020 0ustar wcbrownscs/*====================================================================== s <- IUPBRES(A,a) Integral univariate polynomial binary rational evaluation of sign. Inputs A : in Z[x]. a : a logarithmic binary rational number. Outputs s : a BETA-digit, s = sign(A(a)). ======================================================================*/ #include "saclib.h" BDigit IUPBRES(A,a) Word A,a; { BDigit d,e,f,k,M,M2,m,n,o,p,s,t; Word Bh[LARGE],*Bp,*C,Ch[SMALL],c; Step1: /* Let a = c / 2^k with k non-negative. */ if (a == 0) { c = 0; k = 0; } else { FIRST2(a,&c,&k); if (k < 0) { c = IMP2(c,-k); k = 0; } } Step2: /* Copy c into array. */ IFLTA(c,Ch,SMALL,&C,&m,&t,&o); Step3: /* Upper bound for length of result. */ n = PDEG(A); d = ILOGB(IPSUMN(1,A)); e = (k + 1) / ZETA + 1; f = maxm(e,m); M = n * f + d + 1; Step4: /* Get an array of twice the length. */ M2 = 2 * M; if (M2 > LARGE) Bp = GETARRAY(M2); else Bp = Bh; Step5: /* Accumulate result in array. */ IUPBREA(A,C,m,t,k,Bp,M,&p,&s); Step6: /* Free up memory. */ if (M2 > LARGE) FREEARRAY(Bp); if (m > SMALL) FREEARRAY(C); Return: /* Return s. */ return(s); } saclib2.2.8/src/MAPDIF.c0000664002275300236100000000231614017255270013645 0ustar wcbrownscs/*=========================================================================== MAPDIF(m,A,B, C) Modular array polynomial difference. Inputs m : a BETA-digit. A,B : in Z/(m)[x], A and B are in array representation. C : an array at least as large as the larger of A nd B. Side effects A - B is computed and put in C. ===========================================================================*/ #include "saclib.h" void MAPDIF(m,A,B, C) Word m,*A,*B, *C; { Word i,ap,bp,cp,dp,a,b,c; Step1: /* Initialize. */ ap = MAPDEG(A); bp = MAPDEG(B); MAPDEG(C) = 0; cp = maxm(ap,bp); for (i = 0; i <= cp; i++) MAPCF(C,i) = 0; dp = minm(ap,bp); Step2: /* Compute. */ for (i = 0; i <= dp; i++) { a = MAPCF(A,i); b = MAPCF(B,i); c = MDDIF(m,a,b); MAPCF(C,i) = c; } if (ap > bp) for (i = dp + 1; i <= ap; i++) { a = MAPCF(A,i); MAPCF(C,i) = a; } else for (i = dp + 1; i <= bp; i++) { b = MAPCF(B,i); b = MDNEG(m,b); MAPCF(C,i) = b; } Step3: /* Determine degree. */ i = cp; while (MAPCF(C,i) == 0 && i > 0) i--; MAPDEG(C) = i; Return: /* Prepare for return. */ return; } saclib2.2.8/src/RIWRITE.c0000664002275300236100000000155214017255270014033 0ustar wcbrownscs/*===================================================================== RIWRITE(I) Rational interval write. Input I : an interval with rational number endpoints. Side effect The interval I is written in the output stream. Let a and b be the left and right endpoints of I, respectively. If a = b, the form of the output is [a]. If a < b, the form of the output is (a,b). a and b are written as rational numbers using RNWRITE. ======================================================================*/ #include "saclib.h" void RIWRITE(I) Word I; { Word a,b; Step1: /* One point or open interval? */ FIRST2(I,&a,&b); if (EQUAL(a,b)) { CWRITE('['); RNWRITE(a); CWRITE(']'); } else { CWRITE('('); RNWRITE(a); CWRITE(','); RNWRITE(b); CWRITE(')'); } Return: /* Return */ return; } saclib2.2.8/src/ISFPF.c0000664002275300236100000000624514017255270013561 0ustar wcbrownscs/*=========================================================================== L <- ISFPF(r,A) Integral squarefree polynomial factorization. Inputs r : a BETA-digit, r >= 1. A : in Z[X1,...,Xr], A positive, of positive degree, primitive, and squarefree with respect to its main variable Xr. Outputs L : a list (A1,...,Ak), with Ai in Z[X1,...,Xr], the distinct positive irreducible factors of A. ===========================================================================*/ #include "saclib.h" Word ISFPF(r,A) Word r,A; { Word Abp,Ap,Ap1,As,As1,B,Bp,B1,C,D,F,L,Lp,Ls,M,N,P,T,Tp,V, ap,b,d,f,k,m,n,p,t,v; Step1: /* r = 1. */ if (r == 1) { L = IUSFPF(A); goto Return; } Step2: /* Degree 1. */ n = PDEG(A); if (n == 1) { L = LIST1(A); goto Return; } Step3: /* Degree 2. */ if (n == 2) { L = ISPFAC2(r,A); goto Return; } Step4: /* Look for variable of degree 1 or 2. */ IPVDEG12(r,A,&k,&B); if (k > 0) { IPFAC(r,B,&t,&d,&N); L = NIL; while (N != NIL) { ADV(N,&F,&N); FIRST2(F,&f,&B1); B1 = PCPV(r,B1,k,r); B1 = IPABS(r,B1); L = COMP(B1,L); } goto Return; } Step5: /* Evaluate to univariate polynomial, As, and factor As. */ IPCEVP(r,A,&As,&T); As = IPABS(1,As); As = IPPP(1,As); Ls = IUSFPF(As); Step6: /* As irreducible. */ if (RED(Ls) == NIL) { L = LIST1(A); goto Return; } Step7: /* Translate A to Ap and find prime p not dividing discr(As). */ T = COMP(0,INV(T)); Ap = IPTRAN(r,A,T); P = LPRIME; n = PDEG(As); do { if (P == NIL) FAIL("ISFPF","Prime list exhausted",r,A); ADV(P,&p,&P); B = MPHOM(1,p,As); m = PDEG(B); if (m == n) { Bp = MUPDER(p,B); C = MUPGCD(p,B,Bp); k = PDEG(C); } } while (m != n || k != 0); Step8: /* Convert As factors to monic factors modulo p. */ Lp = NIL; do { ADV(Ls,&As1,&Ls); Ap1 = MPHOM(1,p,As1); Ap1 = MPMON(1,p,Ap1); Lp = COMP(Ap1,Lp); } while (Ls != NIL); Step9: /* Compute a factor coefficient bound for Abp = Ap*ldcf(Ap). */ ap = PLDCF(Ap); Abp = IPPROD(r,Ap,LIST2(0,ap)); b = IPGFCB(r,Abp); b = IMP2(b,1); M = p; while (ICOMP(M,b) <= 0) M = IDPR(M,p); Step10: /* Compute factor degree bounds. */ V = PDEGV(r,Abp); D = NIL; V = RED(V); do { ADV(V,&v,&V); d = v + 1; D = COMP(d,D); } while (V != NIL); Step11: /* Lift modular factors. */ L = MPIQHL(r,p,Lp,M,D,Ap); Step12: /* Combine lifted factors. */ Lp = IPFLC(r,M,D,Ap,L,0); Step13: /* Translate Ap factors to A factors. */ Tp = NIL; do { ADV(T,&t,&T); Tp = COMP(INEG(t),Tp); } while (T != NIL); Tp = INV(Tp); L = NIL; do { ADV(Lp,&Ap1,&Lp); L = COMP(IPTRAN(r,Ap1,Tp),L); } while (Lp != NIL); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/RPQR.c0000664002275300236100000000242014017255270013465 0ustar wcbrownscs/*=========================================================================== RPQR(r,A,B; Q,R) Rational polynomial quotient and remainder. Inputs A, B : in Q[x_1,...,x_r], B non-zero. r : a BETA-digit, r >= 1. Outputs Q,R : in Q[x_1,...,x_r], the unique rational polynomials such that either B divides A, Q = A / B and R = 0 or else B does not divide A and A = B Q + R with deg(R) minimal. ===========================================================================*/ #include "saclib.h" void RPQR(r,A,B, Q_,R_) Word r,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,b,d,m,n,q,rp,s; Step1: /* Initialize. */ n = PDEG(B); b = PLDCF(B); Bp = PRED(B); Q = NIL; R = A; rp = r - 1; Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); if (rp == 0) { q = RNQ(a,b); s = 0; } else RPQR(rp,a,b,&q,&s); if (s != 0) goto Step3; Q = COMP2(q,d,Q); Q1 = LIST2(d,q); Rp = PRED(R); Qp = RPPROD(r,Bp,Q1); R = RPDIF(r,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/IQ.c0000664002275300236100000000074214017255270013217 0ustar wcbrownscs/*====================================================================== C <- IQ(A,B) Integer quotient. Inputs A,B : in Z. B /= 0. Outputs C : the integral part of A/B. ======================================================================*/ #include "saclib.h" Word IQ(A,B) Word A,B; { Word C,R; /* hide algorithm */ Step1: IQR(A,B,&C,&R); goto Return; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MPIQHL.c0000664002275300236100000000335614017255270013704 0ustar wcbrownscs/*====================================================================== Fp <- MPIQHL(r,p,F,M,D,C) Modular polynomial mod ideal quadratic hensel lemma, list. Inputs r : a BETA-digit, r >= 1. p : a BETA-digit, p prime. F : a list (f1,...,fm), with fi in Z/(p)[X], fi monic, deg(fi) > 0, gcd(fi,fj) = 1 for 1 <= i < j <= m. M : in Z, M = p^j for some j in Z, j > 0. D : a list (d1,...,d_{r-1}), with di BETA-integers, di >= 0. C : in Z[X1,...,Xr], with C(0,...,0,Xr) congruent to f1 * ... * fm, and p does not divide ldcf(C). Outputs Fp : a list (fp1,...,fpm), with fpi in Z/(M)[X1,...,X_{r-1},x]/(X1^d1,...,X_{r-1}^d_{r-1}), fpi monic, deg(fpi) = deg(fi), fpi congruent to fi, C congruent to fp1 * ... * fpm. ======================================================================*/ #include "saclib.h" Word MPIQHL(r,p,F,M,D,C) Word r,p,F,M,D,C; { Word A,Ab,B,Bb,Cb,Cp,Dp,Fp,Fs,R,Sb,Tb,i,rp; /* hide i,rp; */ Step1: /* Initialize. */ Fp = NIL; Fs = F; Cp = IPIHOM(r,D,C); Cp = MIPHOM(r,M,Cp); B = Cp; rp = r - 1; Dp = NIL; for (i = 1; i <= rp; i++) Dp = COMP(1,Dp); Step2: /* Lift factors. */ while (Fs != NIL) { ADV(Fs,&Ab,&Fs); Cb = PUFP(r,Cp); Cb = MIPHOM(1,p,Cb); Bb = MPQ(1,p,Cb,Ab); MUPEGC(p,Ab,Bb,&R,&Sb,&Tb); Ab = PINV(1,Ab,rp); Bb = PINV(1,Bb,rp); Sb = PINV(1,Sb,rp); Tb = PINV(1,Tb,rp); MPIQH(r,p,Dp,Ab,Bb,Sb,Tb,M,D,Cp,&A,&B); Fp = COMP(A,Fp); if (Fs != NIL) MMPIQR(r,M,D,Cp,A,&Cp,&R); } Fp = INV(Fp); Return: /* Prepare for return. */ return(Fp); } saclib2.2.8/src/PLDCF.c0000664002275300236100000000102414017255270013530 0ustar wcbrownscs/*====================================================================== a <- PLDCF(A) Polynomial leading coefficient. Inputs A : a polynomial. Outputs a : the leading coefficient of A. ======================================================================*/ #include "saclib.h" Word PLDCF(A) Word A; { Word a; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) a = 0; else a = SECOND(A); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/AFUPRICS.c0000664002275300236100000000162314017255270014121 0ustar wcbrownscs/*====================================================================== L <- AFUPRICS(M,I,A) Algebraic univariate polynomial real root isolation, coefficient sign variation method. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Q(alpha)[x]. Outputs L : a list (I1,...,Ir) of strongly disjoint isolating intervals for all of the real roots of A. Ij is a standard open or a one-point binary rational interval. I1 < I2 < ... < Ir. ======================================================================*/ #include "saclib.h" Word AFUPRICS(M,I,A) Word M,I,A; { Word Ab,L; Step1: /* Compute similar polynomial in Z[alpha,x]. */ Ab = AMPSAFP(1,A); Step2: /* Isolate real roots. */ L = AMUPRICS(M,I,Ab); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/PARTR.c0000664002275300236100000000224614017255270013577 0ustar wcbrownscs/*====================================================================== P <- PARTR(n) Partition, random. Inputs n : a BETA-digit, 0 < n <= 100. Outputs P : a partition of n whose elements are the cycle lengths of a random n-permutation. ======================================================================*/ #include "saclib.h" Word PARTR(n) Word n; { Word A[101],P,h,i,j,k; /* hide h,i,j,k; */ Step1: /* Generate random permutation. */ for (i = 1; i <= n; i++) A[i] = i; for (j = n; j >= 2; j--) { i = MDRAN(j) + 1; k = A[i]; A[i] = A[j]; A[j] = k; } Step2: /* Obtain cycle lengths. */ P = NIL; i = 1; do { h = 0; j = i; do { k = A[j]; A[j] = -j; j = k; h = h + 1; } while (!(A[j] < 0)); P = COMP(h,P); do i = i + 1; while (!(i > n || A[i] > 0)); } while (!(i > n)); Step3: /* Sort. */ P = LBIBMS(P); Return: /* Prepare for return. */ return(P); } saclib2.2.8/src/AFQ.c0000664002275300236100000000120014017255270013303 0ustar wcbrownscs/*====================================================================== c <- AFQ(M,a,b) Algebraic number field quotient. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. a,b : in Q(alpha), b not zero. Outputs c : in Q(alpha), c = a/b. ======================================================================*/ #include "saclib.h" Word AFQ(M,a,b) Word M,a,b; { Word c; /* hide c; */ Step1: /* Compute the quotient. */ if (a == 0) c = 0; else c = AFPROD(M,a,AFINV(M,b)); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MPUCPP.c0000664002275300236100000000153114017255270013707 0ustar wcbrownscs/*====================================================================== MPUCPP(r,p,A; a,Ab) Modular polynomial univariate content and primitive part. Inputs r : a BETA-digit, r >= 2. p : a BETA-digit, prime. A : in Z/(p)[X1,...,Xr]. Outputs a : in Z/(p)[X], the univariate content of A. Ab : in Z/(p)[X1,...,Xr], Ab = A/a if A non-zero and Ab = 0 otherwise. ======================================================================*/ #include "saclib.h" void MPUCPP(r,p,A, a_,Ab_) Word r,p,A, *a_,*Ab_; { Word Ab,a; /* hide Ab; */ Step1: /* Compute. */ if (A == 0) { a = 0; Ab = 0; } else { a = MPUC(r,p,A); Ab = MPUQ(r,p,A,a); } Return: /* Prepare for return. */ *a_ = a; *Ab_ = Ab; return; } saclib2.2.8/src/PNDQR.c0000664002275300236100000000410114017255270013563 0ustar wcbrownscs/*====================================================================== PNDQR(a1,a0,b;q,r) Positive normalized digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 and a0 non-negative, b >= BETA / 2 and a = a1 * BETA + a0 < b * BETA. Outputs q : a BETA-integer, the integral part of a / b. r : a BETA-integer, a - b * q. Restriction: This program is valid only if the word length is 32 bits and ZETA = 29. ======================================================================*/ #include "saclib.h" void PNDQR(a1,a0,b,q_,r_) Word a1,a0,b,*q_,*r_; { Word ap1,b1,c1,c0,q,q1,q0,qp1,qp0,r; Step1: /* a1 = 0. */ if (a1 == 0) { q = a0 / b; r = a0 - b * q; goto Return; } Step2: /* Set b1 = [b / 2^14], q1 = [a1 / b1], qp1 = q1 * 2^15. */ b1 = b >> 14; q1 = a1 / b1; qp1 = q1 << 15; Step3: /* Subtract b * qp1 from a. */ DPR(b,qp1,&c1,&c0); a0 = a0 - c0; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; } a1 = a1 - c1; Step4: /* Decrease q1 if the difference is negative. */ if (a1 < 0) { q1 = q1 - 1; c1 = b >> 14; c0 = (b << 15) & BETA1; a0 = a0 + c0; if (a0 >= BETA) { a0 = a0 - BETA; a1 = a1 + 1; } a1 = a1 + c1; } Step5: /* Set ap1 = [a / 2^15], q0 = [ap1 /b1], qp0 = q0 * 2. */ ap1 = (a1 << 14) | (a0 >> 15); q0 = ap1 / b1; qp0 = q0 << 1; Step6: /* Subtract b * qp0 from a. */ DPR(b,qp0,&c1,&c0); a0 = a0 - c0; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; } a1 = a1 - c1; Step7: /* Decrease q0 if the difference is negative. */ if (a1 < 0) { q0 = q0 - 1; c1 = 1; c0 = (b << 1) & BETA1; a0 = a0 + c0; if (a0 >= BETA) { a0 = a0 - BETA; a1 = a1 + 1; } a1 = a1 + c1; } Step8: /* Set q = q1 * 2^15 + q0 * 2 and add 1 to q if necessary. */ q = ((q1 << 14) | q0) << 1; if (a1 > 0) { q = q + 1; r = a0 - b + BETA; } else if (a0 >= b) { q = q + 1; r = a0 - b; } else r = a0; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/src/MAPCOPY.c0000664002275300236100000000117614017255270014020 0ustar wcbrownscs/*=========================================================================== Ap <- MAPCOPY(A) Modular array polynomial copy. Input A : a modular array polynomial. Output Ap: an array of size MAPDEG(A)+2 containing a copy of the polynomial A. ===========================================================================*/ #include "saclib.h" Word *MAPCOPY(A) Word *A; { Word *Ap,n,i; Step1: /* Get array. */ n = MAPDEG(A); Ap = MAPGET(n); Step2: /* Copy. */ MAPDEG(Ap) = n; for (i = 0; i <= n; i++) MAPCF(Ap,i) = MAPCF(A,i); Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/LBRIBRI.c0000664002275300236100000000117514017255270013774 0ustar wcbrownscs/*====================================================================== J <- LBRIBRI(I) Logarithmic binary rational interval to binary rational interval. Input I : an interval with logarithmic binary rational endpoints. Output J : the same interval represented with binary rational endpoints. ======================================================================*/ #include "saclib.h" Word LBRIBRI(I) Word I; { Word a,b,J; Step1: /* Convert the endpoints. */ FIRST2(I,&a,&b); a = LBRNRN(a); b = LBRNRN(b); J = LIST2(a,b); Return: /* Return J. */ return(J); } saclib2.2.8/src/RIL.c0000664002275300236100000000102614017255270013330 0ustar wcbrownscs/*====================================================================== d <- RIL(I) Rational interval length. Inputs I : a rational interval. I = (a,b). Outputs d : a rational number. d = Length(I) = b-a. ======================================================================*/ #include "saclib.h" Word RIL(I) Word I; { Word d; Word a1,a2; Step1: /* Subract left endpoint from right endpoint. */ FIRST2(I,&a1,&a2); d = RNDIF(a2,a1); Return: return(d); } saclib2.2.8/src/HIPLWRITE.c0000664002275300236100000000125314017255270014253 0ustar wcbrownscs/*====================================================================== HIPLWRITE(n,A) Hardware interval polynomial logarithmic write. Inputs n : a positive BETA-digit. A : in HI[x], deg(A) = n. Effect The coefficients of A are written as logarithmic binary rational intervals, one per line, beginning with the leading coefficient. ======================================================================*/ #include "saclib.h" void HIPLWRITE(n,A) BDigit n; interval *A; { BDigit i; Word I; Step1: /* Convert and write coefficients. */ for (i = n; i >= 0; i--) { I = HILBRI(A[i]); LBRIWRITE(I); SWRITE("\n"); } Return: /* Return. */ return; } saclib2.2.8/src/AFSUM.c0000664002275300236100000000266014017255270013562 0ustar wcbrownscs/*=========================================================================== c <- AFSUM(a,b) Algebraic number field element sum. Inputs a,b : in Q(alpha). Outputs c : in Q(alpha), c = a + b. ===========================================================================*/ #include "saclib.h" Word AFSUM(a,b) Word a,b; { Word A,As,B,Bs,C,Cs,c,d,r,r1,r2,rb2,rs,s,s1,s2,sb2,ss,t,t1,t2; Step1: /* a or b zero. */ if (a == 0) { c = b; goto Return; } if (b == 0) { c = a; goto Return; } Step2: /* Extract rational number and polynomial parts. */ FIRST2(a,&r,&A); FIRST2(b,&s,&B); Step3: /* Compute g.c.d., cofactors and least common multiple of denominators of rational number parts. */ FIRST2(r,&r1,&r2); FIRST2(s,&s1,&s2); IGCDCF(r2,s2,&d,&rb2,&sb2); t2 = IPROD(r2,sb2); Step4: /* Compute linear combination of polynomial parts. */ rs = IPROD(r1,sb2); ss = IPROD(s1,rb2); As = IPIP(1,rs,A); Bs = IPIP(1,ss,B); Cs = IPSUM(1,As,Bs); Step5: /* Compute content and primitive part of result. */ IPSCPP(1,Cs,&s,&t1,&C); Step6: /* Compute rational number part of c. */ if (s < 0) t1 = INEG(t1); t = RNRED(t1,t2); Step7: /* Combine rational number and polynomial parts of c. */ if (t == 0) c = 0; else c = LIST2(t,C); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/IUPRLP.c0000664002275300236100000000123314017255270013715 0ustar wcbrownscs/*====================================================================== r <- IUPRLP(A) Integral univariate polynomial, root of a linear polynomial. Inputs A : in Z[X], deg(A) = 1. Outputs R : the unique rational number such that A(r)=0. ======================================================================*/ #include "saclib.h" Word IUPRLP(A) Word A; { Word L,a,b,r; Step1: /* Compute. */ if (PRED(A) == 0) r = 0; else { L = PCL(A); FIRST2(L,&a,&b); r = RNRED(INEG(b),a); goto Return; } Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/AFUPBRI.c0000664002275300236100000000636314017255270014003 0ustar wcbrownscs/*====================================================================== N <- AFUPBRI(M,I,L) Algebraic number field univariate polynomial basis real root isolation. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. L : a list of elements (A1,...,An) of elements of Q(alpha)[x]. L is a nonempty squarefree basis. Outputs N : a list (I1,B1,...,Im,Bm), m >= 0, where I1 < I2 < ... < Im are strongly disjoint isolating intervals for all the real roots of A = A1 * ... * An. Each Ii has binary rational endpoints and is left open and right closed. Bi is the unique Aj which has a root in Ii. ======================================================================*/ #include "saclib.h" Word AFUPBRI(M,I,L) Word M,I,L; { Word A1,A2,B1,I1,I11,I21,Lp,Lpp,N,S,S1,S2,Sp,Spp,Ss1,Ss2,T,T1, T2,s; Word At1,Lt; /* hide A1,A2,B1,Lp,Lpp,Sp,Spp,s; */ Step1: /* Compute Ati, an element of Z[alpha,x], similar to Ai. */ Lp = L; Lt = NIL; do { ADV(Lp,&A1,&Lp); At1 = AMPSAFP(1,A1); Lt = COMP(At1,Lt); } while (!(Lp == NIL)); Lt = INV(Lt); Step2: /* Isolate roots of each Ati. */ Lp = Lt; S = NIL; do { ADV(Lp,&At1,&Lp); S1 = AMUPRICS(M,I,At1); S = COMP(S1,S); } while (!(Lp == NIL)); S = INV(S); Step3: /* Refine to disjoint isolating intervals. */ Lp = Lt; Sp = S; while (RED(Lp) != NIL) { A1 = FIRST(Lp); S1 = FIRST(Sp); Lpp = RED(Lp); Spp = RED(Sp); do { A2 = FIRST(Lpp); S2 = FIRST(Spp); AMUPRLS(M,I,A1,A2,S1,S2,&Ss1,&Ss2); S1 = Ss1; SFIRST(Spp,Ss2); Lpp = RED(Lpp); Spp = RED(Spp); } while (!(Lpp == NIL)); SFIRST(Sp,S1); Lp = RED(Lp); Sp = RED(Sp); } Step4: /* Prepare to merge intervals. */ Lp = L; Sp = S; T = NIL; do { ADV(Lp,&A1,&Lp); ADV(Sp,&S1,&Sp); T1 = NIL; while (S1 != NIL) { ADV(S1,&I11,&S1); T1 = COMP2(A1,I11,T1); } T = COMP(INV(T1),T); } while (!(Lp == NIL)); T = INV(T); Step5: /* Merge-sort isolating intervals. */ while (RED(T) != NIL) { S = NIL; while (T != NIL && RED(T) != NIL) { ADV2(T,&T1,&T2,&T); S1 = NIL; while (T1 != NIL && T2 != NIL) { I11 = FIRST(T1); I21 = FIRST(T2); s = RNCOMP(FIRST(I11),FIRST(I21)); if (s < 0) ADV2(T1,&I1,&B1,&T1); else ADV2(T2,&I1,&B1,&T2); S1 = COMP2(B1,I1,S1); } if (T1 == NIL) T1 = T2; S1 = CONC(INV(S1),T1); S = COMP(S1,S); } if (T != NIL) S = COMP(FIRST(T),S); T = INV(S); } N = FIRST(T); Return: /* Prepare for return. */ return(N); } saclib2.2.8/src/FRAPMON.c0000664002275300236100000000263414017255270014012 0ustar wcbrownscs/*========================================================================== B <- FRAPMON(p,M,A) Finite ring array polynomial monic. Input p : a BETA-digit, p a prime. M : in Z/(p)[x], M is in array representation. A : in (Z/(p)[x])/(M)[y], A is in array representation. Output B : in (Z/(p)[x])/(M)[y]. If A = 0, then B = 0. If A is non-zero and ldcf(A) is a unit in (Z/(p)[x])/(M), then B is the monic polynomial similar to A. Otherwise deg(B) = -1. B is in array representation. ==========================================================================*/ #include "saclib.h" Word **FRAPMON(p,M,A) Word p,*M,**A; { Word **B,d,*a,*ap,i; Step1: /* A = 0 */ if (FRAPZERO(A)) { B = FRAPFMD(0,MAPDEG(M)); goto Return; } Step2: /* Compute inverse of leading coefficient. */ a = FRAPLDCF(A); ap = FREINV(p,M,a); Step3: /* Leading coefficient is not a unit. */ if (MAPDEG(ap) < 0) { B = FRAPFMD(0,MAPDEG(M)); FRAPDEG(B) = -1; goto Step6; } Step4: /* Initialize result. */ d = FRAPDEG(A); B = FRAPGET(d,MAPDEG(M)); FRAPDEG(B) = d; a = FRAPLDCF(B); MAPDEG(a) = 0; MAPLDCF(a) = 1; Step5: /* Multiply. */ for (i = 0; i < d; i++) FREPROD(p,M,FRAPCF(A,i),ap,FRAPCF(B,i)); Step6: /* Free array. */ MAPFREE(ap); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MDSUM.c0000664002275300236100000000114714017255270013573 0ustar wcbrownscs/*====================================================================== c <- MDSUM(m,a,b) Modular digit sum. Inputs m : a positive BETA-integer. a,b : elements of Z_m. Outputs c : a + b. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word MDSUM(m,a,b) Word m,a,b; { Word c,cp; /* hide algorithm */ Step1: /* Compute. */ c = a + b; cp = c - m; if (cp >= 0) c = cp; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MMAPREM.c0000664002275300236100000000205714017255270014005 0ustar wcbrownscs/*=========================================================================== MMAPREM(m,A,B) Medium modulus array polynomial remainder. Inputs m : a medium prime. A,B : in Z/(p)[x], A and B are in array representation. Side effect A is replaced by the remainder of A with respect to B. ===========================================================================*/ #include "saclib.h" void MMAPREM(m,A,B) Word m,*A,*B; { Word a,ap,d,e,k,*Bp; Step1: /* Get degrees. */ d = MAPDEG(A); e = MAPDEG(B); Step2: /* deg(B) = 0. */ if (e == 0) { MAPDEG(A) = 0; MAPCF(A,0) = 0; goto Return; } Step3: /* Is B monic? */ if (MAPLDCF(B) == 1) Bp = B; else Bp = MMAPMON(m,B); Step4: /* Subtraction loop. */ while (d >= e) { a = MAPLDCF(A); k = d - e; ap = MDNEG(m,a); MMAPMADD(m,Bp,ap,k,A); while (MAPCF(A,d) == 0 && d > 0) d--; MAPDEG(A) = d; } Step5: /* Free array. */ if (B != Bp) MAPFREE(Bp); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPCEVP.c0000664002275300236100000000307114017255270013672 0ustar wcbrownscs/*=========================================================================== IPCEVP(r,A; B,L) Integral polynomial, choice of evaluation points. Inputs r : a BETA-digit, r >= 1. A : in Z[x_1,...,x_r], non-zero and square-free in its main variable x_r. Outputs L : a list (b_1,...,b_{r-1}) of BETA-digits, with L as small as possible, in the reverse lexicographic order in which 0 < 1 < -1 < 2 < -2 < ... , such that deg_{x_r}(A(x_1,...,x_{r-1},x_r)) = deg_x(A(b_1,...,b_{r-1},x)) and A(b_1,...,b_{r-1},x) is squarefree. B : in Z[x], B(x) = A(b_1,...,b_{r-1},x). ===========================================================================*/ #include "saclib.h" void IPCEVP(r,A, B_,L_) Word r,A, *B_,*L_; { Word Ab,At,B,C,Cp,D,E,F,L,a,at,b,e,rp; Step1: /* Initialize. */ rp = r - 1; At = A; L = NIL; Step2: /* Univariate. */ if (rp == 0) { B = At; goto Return; } Step3: /* Prepare to choose b_{rp}. */ b = 0; PADV(At,&e,&at,&Ab); Step4: /* Evaluate at and Ab for x_{rp} = b_{rp}. */ a = IPEMV(rp,at,b); if (a == 0) goto Step6; C = IPEVAL(rp + 1,Ab,rp,b); C = PPLT(e,a,C); Cp = IPDMV(rp,C); IPGCDC(rp,C,Cp,&D,&E,&F); if (PDEG(D) > 0) goto Step6; Step5: /* Success. */ L = COMP(b,L); rp = rp - 1; At = C; goto Step2; Step6: /* Try again. */ if (b > 0) b = -b; else b = 1 - b; goto Step4; Return: /* Prepare for return. */ *B_ = B; *L_ = L; return; } saclib2.2.8/src/AMLM.c0000664002275300236100000000131414017255270013430 0ustar wcbrownscs/*====================================================================== L <- AMLM(M,m,n) Array matrix to list matrix. Inputs M : a matrix of beta digits in array representation. m, n : positive beta digits, the numbers of rows and columns respectively in M. Output L : the matrix M in list representation. ======================================================================*/ #include "saclib.h" Word AMLM(M,m,n) BDigit **M,m,n; { BDigit i,j; Word L,L1; Step1: /* Construct L. */ L = NIL; for (i = m-1; i >= 0; i--) { L1 = NIL; for (j = n-1; j >= 0; j--) L1 = COMP(M[i][j],L1); L = COMP(L1,L); } Return: /* Return L. */ return(L); } saclib2.2.8/src/FPROD21.c0000664002275300236100000000452614017255270013727 0ustar wcbrownscs/*====================================================================== FPROD21(A,B,d,C) Floating-point product, precision 2 by precision 1. Inputs A : a double-precision floating-point number. B : a single-precision number. d : a sign (rounding direction). C : an array of size at least 5. Output C : a double-precision floating-point number approximating the product of A and B. If d = -1, C is the greatest double-precision floating-point number less than or equal to the product. If d = +1, C is the least double-precision floating-point number greater than or equal to the product. If d = 0, C is the nearest double-precision floating-point number to the product (if two are equally near, the one with even mantissa is chosen). ======================================================================*/ #include "saclib.h" void FPROD21(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit c3,c31,c32,c41,c42; Step1: /* A or B zero. */ if (A[1] == 0 || B[1] == 0) { C[1] = 0; C[2] = 2; goto Return; } Step2: /* Compute exponent and sign. */ C[0] = A[0] + B[0]; if (A[1] == B[1]) C[1] = 1; else C[1] = -1; Step3: /* Compute mantissa. */ DPRNN(A[3],B[3],&c31,&C[2]); DPRNN(A[4],B[3],&c41,&c32); c3 = c31 + c32; C[3] = c3 & BETA1; c42 = c3 >> ZETA; C[4] = c41 + c42; Step4: /* Normalize. */ if (C[4] < BETA2) { LSHIFT1(C+2,3); C[0] = C[0] - 1; } Step5: /* Rounding decision. */ if (d != 0) { if (d == C[1]) { if (C[2] != 0) goto Step6; else goto Step7; } else goto Step7; } else { if (C[2] > BETA2) goto Step6; else if (C[2] < BETA2) goto Step7; else { if (ODD(C[3])) goto Step6; else goto Step7; } } Step6: /* Round up. */ C[3] = C[3] + 1; if (C[3] == BETA) { C[3] = 0; C[4] = C[4] + 1; if (C[4] == BETA) { C[4] = BETA2; C[0] = C[0] + 1; } } Step7: /* Store precision. */ C[2] = 2; Return: /* Return. */ return; } saclib2.2.8/src/PTRFIRST.c0000664002275300236100000000155514017255270014166 0ustar wcbrownscs/*====================================================================== a <- PTRFIRST(L) First. (assuming the "first" element of L is a pointer) Inputs L : list of length 2 or more. Outputs a : the first element of L (assuming "first" element is a pointer). ======================================================================*/ #include "saclib.h" Word* PTRFIRST(L) Word L; { #if __WORDSIZE == 64 Word Lp, t; unsigned long long res = 0; ADV(L,&t,&Lp); res = t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; return (Word*)res; #else /* Assumes 32-bit pointers. */ Word Lp, t; unsigned int res = 0; ADV(L,&t,&Lp); res = t; ADV(Lp,&t,&Lp); res = (res << BETALENGTH) | t; return (Word*)res; #endif } saclib2.2.8/src/DSQRTF.c0000664002275300236100000000177614017255270013721 0ustar wcbrownscs/*====================================================================== DSQRTF(a; b,t) Digit square root function. Inputs a : non-negative BETA-digit. Outputs b : the floor function of the square root of a. t : the sign of a-b*b. ======================================================================*/ #include "saclib.h" void DSQRTF(a, b_,t_) Word a, *b_,*t_; { Word b,c,h,k,r,t; /* hide algorithm */ Step1: /* a=0. */ if (a == 0) { b = 0; t = 0; goto Return; } Step2: /* Compute first approximation. */ k = DLOG2(a); h = (k + 1) / 2; b = TABP2[h + 1]; Step3: /* Iterate modified Newton method. */ do { QREM(a,b,&c,&r); if (b <= c) { t = SIGN(a - b * b); goto Return; } b = (b + c) / 2; } while (1); Return: /* Prepare for return. */ *b_ = b; *t_ = t; return; } saclib2.2.8/src/RNMIN.c0000664002275300236100000000072714017255270013574 0ustar wcbrownscs/*====================================================================== c <- RNMIN(a,b) Rational number min. Inputs a, b : rational numbers. Outputs c : a rational number. c = min(a,b). ======================================================================*/ #include "saclib.h" Word RNMIN(a,b) Word a,b; { Word c; Step1: if (RNCOMP(a,b) <= 0) c = a; else c = b; Return: return(c); } saclib2.2.8/src/BRILBRI.c0000664002275300236100000000114114017255270013765 0ustar wcbrownscs/*====================================================================== J <- BRILBRI(I) Binary rational interval to logarithmic binary rational interval. Input I : an interval with binary rational endpoints. Output J : the same interval represented with logarithmic binary rational endpoints. ======================================================================*/ #include "saclib.h" Word BRILBRI(I) Word I; { Word a,b,J; Step1: /* Convert the endpoints. */ FIRST2(I,&a,&b); a = RNLBRN(a); b = RNLBRN(b); J = LIST2(a,b); Return: /* Return J. */ return(J); } saclib2.2.8/src/RPSUM.c0000664002275300236100000000303614017255270013613 0ustar wcbrownscs/*====================================================================== C <- RPSUM(r,A,B) Rational polynomial sum. Inputs A, B : in Q[X1,...,Xr]. r : a BETA-digit, r >= 0. Outputs C : in Q[X1,...,Xr], C = A + B. ======================================================================*/ #include "saclib.h" Word RPSUM(r,A,B) Word r,A,B; { Word Ap,Bp,C,Cp,a,b,c,e,f,rp; /* hide C,a,b,f,rp; */ Step1: /* A=0 or B=0. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r=0. */ if (r == 0) { C = RNSUM(A,B); goto Return; } Step3: /* Match coefficients. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); Cp = COMP2(b,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = RNSUM(a,b); else c = RPSUM(rp,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step4: /* Finish. */ if (Ap == NIL) Ap = Bp; if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/RPFACTREAD.c0000664002275300236100000000337614017255270014327 0ustar wcbrownscs/*====================================================================== RPFACTREAD(r,V; A,t) Rational polynomial factor read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : a rational polynomial with variables in V. t : 1 if successful, 0 otherwise. ======================================================================*/ #include "saclib.h" void RPFACTREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,C,D,N,k,t,v; /* hide C,k,t; */ Step1: /* Setup and Classify. */ t = 1; C = CREADB(); if (LETTER(C)) { BKSP(); goto Step2; } if (DIGIT(C)) { BKSP(); goto Step3; } if (C == '(') goto Step4; SWRITE("Error RPFACTREAD: Unexpected character.\n"); goto Step5; Step2: /* Variable. */ v = VREAD(); k = VLSRCH(v,V); if (k == 0) { SWRITE("Error RPFACTREAD: Unknown variable.\n"); goto Step5; } A = RNRED(1,1); A = PFBRE(k-1,A); A = LIST2(1,A); A = PFBRE(r-k,A); goto Return; Step3: /* Number. */ N = IREAD(); C = CREAD(); if (C != '/') { BKSP(); D = 1; } else { C = CREAD(); if (!DIGIT(C)) { SWRITE("Error RPFACTREAD: Digit was expected.\n"); goto Step5; } BKSP(); D = IREAD(); } A = RNRED(N,D); A = PFBRE(r,A); goto Return; Step4: /* Parenthesized expression. */ RPEXPREAD(r,V,&A,&t); if (t == 0) goto Return; C = CREADB(); if (C != ')') { SWRITE("Error RPFACTREAD: ')' was expected.\n"); goto Step5; } goto Return; Step5: /* Error exit. */ DIELOC(); t = 0; Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/CTMI.c0000664002275300236100000000076014017255270013442 0ustar wcbrownscs/*=========================================================================== CTMI(A) Create table of modular inverses. Input: A: Array of length 128. Effect: A[i] is set to the inverse of 2*i + 1 modulo 2^8. ===========================================================================*/ #include "saclib.h" void CTMI(A) Word *A; { Word i; Step1: /* Use MDINV. */ for (i = 0; i < 128; i++) A[i] = MDINV(256,2*i + 1); Return: /* Return. */ return; } saclib2.2.8/src/IACOMPA.c0000664002275300236100000000146714017255270013764 0ustar wcbrownscs/*=========================================================================== s <- IACOMPA(A,m,B,n) Integer absolute value comparison, array version. Inputs A, B : in Z, in array representation. m, n : BETA-digits, m = length(A), n = length(B). Outputs s = sign(|A|-|B|). ===========================================================================*/ #include "saclib.h" Word IACOMPA(A,m,B,n) Word *A,m,*B,n; { Word a,b,i,s; Step1: /* Different lengths. */ if (m > n) { s = 1; goto Return; } if (m < n) { s = -1; goto Return; } Step2: /* Compare corresponding digits. */ i = m; do { i--; a = A[i]; b = B[i]; a = absm(a); b = absm(b); s = a - b; } while (s == 0 && i > 0); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/IMPBAA.c0000664002275300236100000001012714017255270013635 0ustar wcbrownscs/*====================================================================== IMPBAA(A,B,m,n,s,t,h; p,u) Integer multiply by power of BETA and add to array. Inputs A, B : Arrays containing integers A' and B' respectively. m, n : The lengths of A' and B' respectively. s,t : Nonzero signs associated with A' and B' respectively. h : A non-negative BETA-digit. Outputs p : The length of C, where C = s (BETA^h) A' + t B'. u : The sign of C. Effect |C| replaces B' in array B, the size of which must be at least max(m + h, n) + 1. ======================================================================*/ #include "saclib.h" void IMPBAA(A,B,m,n,s,t,h, p_,u_) Word *A,*B,m,n,s,t,h,*p_,*u_; { Word b,c,i,p,q,r,u; Step1: /* A' = 0. */ if (m == 0) { p = n; u = t; goto Return; } Step2: /* B' = 0. */ if (n == 0) { p = m + h; u = s; for (i = 0; i < h; i++) B[i] = 0; for (i = 0; i < m; i++) B[i+h] = A[i]; goto Return; } Step3: /* Branch on signs */ if (s != t) goto Step9; Step4: /* Same signs. Estimate length of result, determine its sign. */ p = maxm(n,m + h); u = s; Step5: /* n <= h. */ if (n <= h) { for (i = n; i< h; i++) B[i] = 0; for (i = h; i < p; i++) B[i] = A[i-h]; goto Return; } Step6: /* Add with carry. */ q = minm(n,m + h); c = 0; for (i = h; i < q; i++) { b = A[i-h] + B[i] + c; if (b >= BETA) { b = b - BETA; c = 1; } else c = 0; B[i] = b; } Step7: /* Continue with longer summand. */ if (q < n) { i = q; while (c != 0 && i < p) { b = B[i] + 1; if (b == BETA) b = 0; else c = 0; B[i] = b; i = i + 1; } } else if (n < p) { i = q; while (c != 0 && i < p) { b = A[i-h] + 1; if (b == BETA) b = 0; else c = 0; B[i] = b; i = i + 1; } while (i < p) { B[i] = A[i-h]; i = i + 1; } } Step8: /* Determine length of result. Return.*/ if (c != 0) { B[p] = 1; p = p + 1; } goto Return; Step9: /* Opposite signs. Estimate length of result, determine its sign. */ p = maxm(n,m + h); q = minm(n,m + h); if (m + h > n) u = s; else if (m + h < n) u = t; else { i = p - 1; do { b = A[i-h] - B[i]; i = i - 1; } while (b == 0 && i >= h); while (b == 0 && i >= 0) { b = -B[i]; i = i - 1; } u = signm(b); if (u == 0) { p = 0; goto Return; } if (s < 0) u = -u; p = i + 2; q = p; } Step10: /* Subtract with borrow. */ c = 0; if (s == u) { r = minm(n,h); for (i = 0; i < r; i++) { b = -B[i] + c; if (b != 0) { b = b + BETA; c = -1; B[i] = b; } } if (n < h) { q = h; for (i = n; i < h; i++) B[i] = BETA1; } for (i = h; i < q; i++) { b = A[i-h] - B[i] + c; if (b < 0) { b = b + BETA; c = -1; } else c = 0; B[i] = b; } } else { for (i = h; i < q; i++) { b = B[i] - A[i-h] + c; if (b < 0) { b = b + BETA; c = -1; } else c = 0; B[i] = b; } } Step11: /* Continue with longer summand. */ if (m + h > n) { i = q; while (c != 0) { b = A[i-h] - 1; if (b < 0) b = BETA1; else c = 0; B[i] = b; i = i + 1; } while (i < p) { B[i] = A[i - h]; i = i + 1; } } else if (m + h < n) { i = q; while (c != 0) { b = B[i] - 1; if (b < 0) b = BETA1; else c = 0; B[i] = b; i = i + 1; } } Step12: /* Determine length of result. */ while (B[p-1] == 0) p = p - 1; Return: /* Return p and u. */ *p_ = p; *u_ = u; return; } saclib2.2.8/src/HIPDWRITE.c0000664002275300236100000000155014017255270014243 0ustar wcbrownscs/*====================================================================== HIPDWRITE(n,A,k) Hardware interval polynomial decimal write. Inputs n : a positive BETA-digit. A : in HI[x], deg(A) = n. k : a positive beta-digit. Effect A is written as a polynomial in x with the coefficients written as intervals, whose endpoints have k decimal digits after the decomal point. An end-of-line character follows the polynomial. ======================================================================*/ #include "saclib.h" void HIPDWRITE(n,A,k) BDigit n; interval *A; BDigit k; { BDigit i; Step1: /* Convert and write coefficients. */ for (i = n; i >= 0; i--) { HIDWRITE(A[i],k); SWRITE(" x^"); IWRITE(i); if (i != 0) SWRITE(" + "); } SWRITE("\n"); Return: /* Return. */ return; } saclib2.2.8/src/GINORM.c0000664002275300236100000000123314017255270013675 0ustar wcbrownscs/*=========================================================================== N <- GINORM(A) Gaussian integer norm. Input A : a Gaussian integer. Output N : the norm of A, an integer. ===========================================================================*/ #include "saclib.h" Word GINORM(A) Word A; { Word A1,A2,N1,N2,N; Step1: /* A = 0. */ if (A == 0) { N = 0; goto Return; } Step2: /* Square the parts and add. */ FIRST2(A,&A1,&A2); N1 = IPROD(A1,A1); N2 = IPROD(A2,A2); N = ISUM(N1,N2); Return: /* Return N. */ return(N); } saclib2.2.8/src/AFWRITE.c0000664002275300236100000000140114017255270014000 0ustar wcbrownscs/*====================================================================== AFWRITE(A,v) Algebraic field element write. Inputs A : in Q(alpha). A is represented as (a,Ab) where a is in Q and Ab is in Z[x]. v : a variable. Side effects A is written to the output stream. ======================================================================*/ #include "saclib.h" void AFWRITE(A,v) Word A,v; { Word Ab,a; Step1: /* A equal 0. */ if (A == 0) { IWRITE(0); goto Return; } Step2: /* A not equal 0. */ FIRST2(A,&a,&Ab); CWRITE('('); RNWRITE(a); CWRITE(','); IUPWRITE(Ab,v); CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/VIUT.c0000664002275300236100000000157714017255270013504 0ustar wcbrownscs/*====================================================================== VIUT(U,V,i; Up,Vp) Vector of integers, unimodular transformation. Inputs U : an n-vector over Z, Ui not zero. V : an n-vector over Z. i : a BETA-digit, 1 <= i <= n. Outputs Up,Vp: n-vectors over Z, [Up,Vp] = [U,V]K, where K is a unimodular matrix (depending on Ui and Vi) whose elements are obtained from IDEGCD. ======================================================================*/ #include "saclib.h" void VIUT(U,V,i, Up_,Vp_) Word U,V,i, *Up_,*Vp_; { Word Up,Vp,c,p,q,r,s,u,v; /* hide c,u,v; */ Step1: /* Compute. */ u = LELTI(U,i); v = LELTI(V,i); IDEGCD(u,v,&c,&p,&q,&r,&s); Up = VILCOM(p,q,U,V); Vp = VILCOM(r,s,U,V); Return: /* Prepare for return. */ *Up_ = Up; *Vp_ = Vp; return; } saclib2.2.8/src/AINQ.c0000664002275300236100000000232314017255270013433 0ustar wcbrownscs/*======================================================================= AINQ(A,B,Q,R,S,T) Array integer nearest quotient. Inputs A, B : array integers, with B /= 0. Q, R, S,T : arrays. Let m = L(A), n = L(B). The size of Q must be at least m - n + 3 and at least 3. The sizes of R and S must be at least m + 3. The size of T must be at least n + 2. Effect {A / B}, the nearest integer to A / B, is placed in the arraay Q. ========================================================================*/ #include "saclib.h" void AINQ(A,B,Q,R,S,T) BDigit *A,*B,*Q,*R,*S,*T; { BDigit c,i,k,s,t; Step1: /* Apply AIQR. */ AIQR(A,B,Q,R,T); Step2: /* If |R| > |B / 2|, add 1 to |Q|. */ if (R[0] == 0) goto Return; R[0] = 1; AIMP2(R,1,S); s = B[0]; B[0] = 1; t = AICOMP(S,B); B[0] = s; if (t < 0) goto Return; if (Q[0] == 0) { if (A[0] == B[0]) Q[0] = 1; else Q[0] = -1; Q[1] = 1; Q[2] = 1; goto Return; } k = Q[1]; i = 2; do { c = Q[i] + 1; Q[i] = c & BETA1; c = c >> ZETA; i = i + 1; } while (c == 1 && i <= k + 1); if (c == 1 && i > k + 1) { Q[i] = 1; Q[1] = k + 1; } Return: /* Return. */ return; } saclib2.2.8/src/AGIZERO.c0000664002275300236100000000103414017255270014001 0ustar wcbrownscs/*======================================================================== t = AGIZERO(A) Array Gaussian integer zero. Input A : a Gaussian integer in array representation. Output t : a BETA digit. t = 1 if A = 0; t = 0 otherwise. ========================================================================*/ #include "saclib.h" BDigit AGIZERO(A) BDigit **A; { BDigit t; Step1: /* Test the parts. */ if (AIZERO(A[0]) && AIZERO(A[1])) t = 1; else t = 0; Return: /* Return t. */ return(t); } saclib2.2.8/src/FRAPFMD.c0000664002275300236100000000126214017255270013763 0ustar wcbrownscs/*========================================================================== A <- FRAPFMD(c,n) Finite ring array polynomial from modular digit. Inputs c : in Z/(m), for some positive BETA-digit m. n : a BETA-digit, n >= 2. Outputs A : in (Z/(m)[x])/(M)[y]. A = c in array representation. deg(M) = n. ==========================================================================*/ #include "saclib.h" Word **FRAPFMD(c,n) Word c,n; { Word **A,*a; Step1: /* Construct A. */ A = FRAPGET(0,n); FRAPDEG(A) = 0; a = FRAPCF(A,0); MAPDEG(a) = 0; MAPCF(a,0) = c; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/DLNEG.c0000664002275300236100000000117114017255270013534 0ustar wcbrownscs/*======================================================================= b <- DLNEG(a) Discrete logarithm negative. Inputs a : an element of a field, represented as a discrete logarithm. Output b : -a, represented as a discrete logarithm. =======================================================================*/ #include "saclib.h" BDigit DLNEG(a) BDigit a; { BDigit b,q2; Step1: /* Three cases. */ if (a == 0) b = 0; else if ((FFSIZE & 1) == 1) b = a; else { q2 = FFSIZE >> 1; b = a + q2; if (b > FFSIZE) b = b - FFSIZE; } Return: /* Return b. */ return(b); } saclib2.2.8/src/FRUPGCD.c0000664002275300236100000000245514017255270014003 0ustar wcbrownscs/*========================================================================== C <- FRUPGCD(p,M,A,B); Finite ring univariate polynomial gcd. Input p : a medium prime. M : in Z/(p)[x]. A,B : in (Z/(p)[x])/(M)[y], A, B are non-zero. Output C : in (Z/(p)[x])/(M)[y]. If the leading coefficient of the last non-zero element S in the natural prs of A and B is invertible in (Z/(p)[x])/(M), then C is the monic associate of S. Otherwise C = NIL. ==========================================================================*/ #include "saclib.h" Word FRUPGCD(p,M,A,B) Word p,M,A,B; { Word C,**Cp,**A1,**A2,*Mp,**t; Step1: /* Initialize. */ if (PDEG(A) > PDEG(B)) { A1 = FRUPCR(A,PDEG(M)); A2 = FRUPCR(B,PDEG(M)); } else { A1 = FRUPCR(B,PDEG(M)); A2 = FRUPCR(A,PDEG(M)); } Mp = MAPFMUP(M); Step2: /* Compute natural prs. */ do { FRAPREM(p,Mp,A1,A2); t = A1; A1 = A2; A2 = t; } while (!FRAPZERO(A2) && (FRAPDEG(A2) >= 0)); Step3: /* Make gcd monic. */ if (FRAPDEG(A2) >= 0) { Cp = FRAPMON(p,Mp,A1); C = FRAPCR(Cp); FRAPFREE(Cp); } else C = NIL; Step4: /* Free arrays. */ FRAPFREE(A1); FRAPFREE(A2); MAPFREE(Mp); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFUPIIR.c0000664002275300236100000000237314017255270014007 0ustar wcbrownscs/*====================================================================== Js <- AFUPIIR(M,I,B,J) Algebraic number field polynomial isolating interval refinement. Inputs M : in Z[x]. M is the minimal polynomial for a real algebraic number alpha. I : an acceptable isolating interval for alpha. B : in Q(alpha)[y]. B(alpha,y) is squarefree. J : a binary rational isolating interval for a real root of B. Outputs Js : a binary rational subinterval of J, obtained by a single application of RIB, containing the same root. ======================================================================*/ #include "saclib.h" Word AFUPIIR(M,I,B,J) Word M,I,B,J; { Word Js; Word a,b,c,s,t; Step1: /* Get the endpoints of J, and bisect. */ FIRST2(J,&a,&b); if (RNCOMP(a,b) == 0) { Js = J; goto Return; } c = RIB(a,b); Step2: /* If A(b) = 0 then Js = (b,b). */ t = AFUPSR(M,I,B,b); if (t == 0) { Js = LIST2(b,b); goto Return; } Step3: /* Otherwise, compare the signs of B at c and b. */ s = AFUPSR(M,I,B,c); if (s == t) Js = LIST2(a,c); else Js = LIST2(c,b); Return: return(Js); } saclib2.2.8/src/GCA2PTR.c0000664002275300236100000000137714017255270013755 0ustar wcbrownscs/*====================================================================== p <- GCA2PTR(A) Convert garbage collected array handle to C pointer. Inputs A : a GCA handle. Outputs p : a C pointer to the array represented by A. Remarks It is not recommended to use this function. Use GCASET() and GCAGET() instead. ======================================================================*/ #include "saclib.h" Word *GCA2PTR(A) Word A; { Word *p; /* hide algorithm */ Step1: /* Test for illegal GCA handle. */ if (A <= BETAp || BETApp <= A) { FAIL("GCA2PTR","Illegal GCA handle!"); } Step2: /* Get pointer. */ p = GCASPACEBp[A].array; Return: /* Prepare for return. */ return(p); } saclib2.2.8/src/LKAHEAD.c0000664002275300236100000000113314017255270013732 0ustar wcbrownscs/*=========================================================================== C <- LKAHEAD() Character lookahead. Outputs C : the next non-white-space character from the input stream. Side effects The next non-whitespace character is read and then put back onto the input stream. ===========================================================================*/ #include "saclib.h" #include Word LKAHEAD() { Word C; Step1: /* Get the next character. */ C = CREADB(); Step2: /* backspace */ BKSP(); Return: /* Prepare for return */ return(C); } saclib2.2.8/src/IPLRRI.c0000664002275300236100000000557514017255270013720 0ustar wcbrownscs/*====================================================================== M <- IPLRRI(L) Integral polynomial list real root isolation. Inputs L : a non-empty list (A1,...,An) of polynomials in Z[X] which are positive, of positive degree, squarefree, and pairwise relatively prime. Outputs M : a list (I1,B1,...,Im,Bm), where I1 < I2 < ... < Im are strongly disjoint isolating intervals for all of the real roots of A = A1...An. Each Ii has binary rational number endpoints, and is either left-open and right-closed or is a one-point interval. Bi is the unique Aj which has a root in Ii. ======================================================================*/ #include "saclib.h" Word IPLRRI(L) Word L; { Word A1,A2,B1,I1,I11,I21,Lp,Lpp,M,S,S1,S2,Sp,Spp,Ss1,Ss2,T,T1, T2,s; /* hide A1,A2,B1,Lp,Lpp,M,Sp,Spp,s; */ Step1: /* Isolate roots of each A_i. */ Lp = L; S = NIL; do { ADV(Lp,&A1,&Lp); S1 = IPRIM(A1); S = COMP(S1,S); } while (!(Lp == NIL)); S = INV(S); Step2: /* Refine to disjoint isolating intervals. */ Lp = L; Sp = S; while (RED(Lp) != NIL) { A1 = FIRST(Lp); S1 = FIRST(Sp); Lpp = RED(Lp); Spp = RED(Sp); do { A2 = FIRST(Lpp); S2 = FIRST(Spp); IPRRLS(A1,A2,S1,S2,&Ss1,&Ss2); S1 = Ss1; SFIRST(Spp,Ss2); Lpp = RED(Lpp); Spp = RED(Spp); } while (!(Lpp == NIL)); SFIRST(Sp,S1); Lp = RED(Lp); Sp = RED(Sp); } Step3: /* Prepare to merge intervals. */ Lp = L; Sp = S; T = NIL; do { ADV(Lp,&A1,&Lp); ADV(Sp,&S1,&Sp); T1 = NIL; while (S1 != NIL) { ADV(S1,&I11,&S1); T1 = COMP2(A1,I11,T1); } T = COMP(INV(T1),T); } while (!(Lp == NIL)); T = INV(T); Step4: /* Merge-sort isolating intervals. */ while (RED(T) != NIL) { S = NIL; while (T != NIL && RED(T) != NIL) { ADV2(T,&T1,&T2,&T); S1 = NIL; while (T1 != NIL && T2 != NIL) { I11 = FIRST(T1); I21 = FIRST(T2); s = RNCOMP(FIRST(I11),FIRST(I21)); if (s < 0) ADV2(T1,&I1,&B1,&T1); else ADV2(T2,&I1,&B1,&T2); S1 = COMP2(B1,I1,S1); } if (T1 == NIL) T1 = T2; S1 = CONC(INV(S1),T1); S = COMP(S1,S); } if (T != NIL) S = COMP(FIRST(T),S); T = INV(S); } M = FIRST(T); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/LSHIFT1.c0000664002275300236100000000127314017255270013760 0ustar wcbrownscs/*=========================================================================== LSHIFT1(A,n) Left shift one bit. Inputs A : an array containing the n BETA digits of an integer a, with 0 <= a < BETA^n / 2. n : a positive BETA digit. Effect a is replaced by 2 a, i. e. a is shifted left one bit. ===========================================================================*/ #include "saclib.h" void LSHIFT1(A,n) Word *A; BDigit n; { BDigit a,ap,i; Step1: /* */ ap = 0; for (i = 0; i < n - 1; i++) { a = A[i]; A[i] = ((a << 1) & BETA1) | ap; ap = a >> (ZETA - 1); } Step2: /* Shift last digit. */ A[n-1] = (A[n-1] << 1) | ap; Return: /* Return. */ return; } saclib2.2.8/src/VIAZ.c0000664002275300236100000000117314017255270013456 0ustar wcbrownscs/*====================================================================== B <- VIAZ(A,n) Vector of integers, adjoin zeros. Inputs A : an m-vector over Z. n : a BETA-digit, n > 0. Outputs B : an (m+n)-vector over Z, B = (a1,...,am,0,...,0). Remarks: A is modified. ======================================================================*/ #include "saclib.h" Word VIAZ(A,n) Word A,n; { Word B,k; /* hide k; */ Step1: /* Compute. */ B = NIL; for (k = 1; k <= n; k++) B = COMP(0,B); B = CONC(A,B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LIST4.c0000664002275300236100000000077114017255270013547 0ustar wcbrownscs/*====================================================================== L <- LIST4(a1,a2,a3,a4) List, 4 elements. Inputs a1, a2, a3, a4 : objects. Outputs L : the list (a1,a2,a3,a4). ======================================================================*/ #include "saclib.h" Word LIST4(a1,a2,a3,a4) Word a1,a2,a3,a4; { Word L; Step1: /* Compute. */ L = COMP(a1,COMP(a2,COMP(a3,COMP(a4,NIL)))); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/AGISUM.c0000664002275300236100000000121414017255270013666 0ustar wcbrownscs/*======================================================================== AGISUM(A,B,C) Array Gaussian integer sum. Inputs A, B: array Gaussian integers. C : an array for a Gaussian integer. The sizes of C[0] and C[1] must be at least as long as the maximum of the lengths of A and B plus 3. Effect The sum of A and B is placed in C. ========================================================================*/ #include "saclib.h" void AGISUM(A,B,C) BDigit **A,**B,**C; { Step1: /* Add the parts. */ AISUM(A[0],B[0],C[0]); AISUM(A[1],B[1],C[1]); Return: /* Return. */ return; } saclib2.2.8/src/IDIPR2.c0000664002275300236100000000076614017255270013645 0ustar wcbrownscs/*====================================================================== C <- IDIPR2(A,B,a,b) Integer digit inner product, length 2. Inputs A, B : in Z. a, b : BETA-digits. Outputs C : A * a + B * b. ======================================================================*/ #include "saclib.h" Word IDIPR2(A,B,a,b) Word A,B,a,b; { Word C; Step1: /* Compute. */ C = ISUM(IDPR(A,a),IDPR(B,b)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/RNCOMP.c0000664002275300236100000000163414017255270013705 0ustar wcbrownscs/*====================================================================== t <- RNCOMP(R,S) Rational number comparison. Inputs R, S : rational numbers. Outpus t : sign(R-S). ======================================================================*/ #include "saclib.h" Word RNCOMP(R,S) Word R,S; { Word R1,R2,S1,S2,r,s,t; /* hide R1,R2,S1,S2,r,s,t; */ Step1: /* R or S zero. */ if (R == 0) { t = -RNSIGN(S); goto Return; } if (S == 0) { t = RNSIGN(R); goto Return; } Step2: /* Opposite signs. */ FIRST2(R,&R1,&R2); FIRST2(S,&S1,&S2); r = ISIGNF(R1); s = ISIGNF(S1); t = (r - s) / 2; if (t != 0) goto Return; Step3: /* Same sign. */ t = ICOMP(IPROD(R1,S2),IPROD(R2,S1)); Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/RED3.c0000664002275300236100000000073114017255270013401 0ustar wcbrownscs/*====================================================================== M <- RED3(L) Reductum 3. Inputs L : list of length 3 or more. Outputs M : the third reductum of L. ======================================================================*/ #include "saclib.h" Word RED3(L) Word L; { Word M; /* hide algorithm */ Step1: /* Compute. */ M = RED(RED2(L)); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/IPSBLSIL.c0000664002275300236100000000133714017255270014130 0ustar wcbrownscs/*===================================================================== L <- IPSBLSIL(A) Integral polynomial squarefree basis labeled standard isolation list. Input A : A squarefree basis of integral polynomials, A = (A_1,...,A_m). Output L : A labeled standard isolation list for the real roots of A. =====================================================================*/ #include "saclib.h" Word IPSBLSIL(A) Word A; { Word A1,Ap,L1,L2,L; Step1: /* For each A_i, isolate, label and merge. */ L = NIL; Ap = A; while (Ap != NIL) { ADV(Ap,&A1,&Ap); L1 = IPRRID(A1); L2 = ALSIL(A1,L1); L = IPLSILM(L2,L); } Return: /* Return L. */ return(L); } saclib2.2.8/src/MPQ.c0000664002275300236100000000124514017255270013342 0ustar wcbrownscs/*====================================================================== C <- MPQ(r,p,A,B) Modular polynomial quotient. Inputs A,B : in Z/(p)[X1,...,Xr], B a non-zero divisor of A. r : a BETA-digit, r >= 0, the number of variables. p : a prime BETA-digit. Outputs C : in Z/(p)[X1,...,Xr], C = A / B. ======================================================================*/ #include "saclib.h" Word MPQ(r,p,A,B) Word r,p,A,B; { Word C,R; /* hide algorithm */ Step1: /* Compute. */ if (r == 0) C = MDQ(p,A,B); else MPQR(r,p,A,B,&C,&R); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MUPFS.c0000664002275300236100000000324314017255270013577 0ustar wcbrownscs/*=========================================================================== L <- MUPFS(p,A,B,d) Modular univariate polynomial factorization, special. Inputs p : a BETA-digit, p prime. A : in Z/(p)[X], deg(A) >= 2, A monic, squarefree. B : a list (B1,...,Br), with Bi in Z/(p)[X], Bi monic. The Bi constitute a basis for the space of all polynomials c of degree less than deg(A) such that A is a divisor of c^p - c. Furthermore, B(1) = 1. d : a BETA-digit, d > 0, such that A has no irreducible factor of degree less than d. Outputs L : a list consisting of all the monic irreducible factors of A of positive degree. ===========================================================================*/ #include "saclib.h" Word MUPFS(p,A,B,d) Word p,A,B,d; { Word A1,B1,Bp,C,L,Lp,c,e,f,i,k,r,s; Step1: /* A irreducible. */ L = LIST1(A); r = LENGTH(B); if (r == 1) goto Return; Step2: /* Factorize. */ Bp = RED(B); k = 1; c = LIST2(0,1); do { Lp = NIL; ADV(Bp,&B1,&Bp); do { ADV(L,&A1,&L); e = FIRST(A1); if (e > d) { s = 0; i = 0; do { C = MUPGCD(p,A1,B1); f = FIRST(C); if (f > 0) { if (f == e) s = 1; else { Lp = COMP(C,Lp); A1 = MPQ(1,p,A1,C); k = k + 1; if (k == r) { Lp = COMP(A1,Lp); L = CONC(Lp,L); goto Return; } e = FIRST(A1); if (e == d) s = 1; } } B1 = MPSUM(1,p,c,B1); i = i + 1; } while (i != p && s != 1); } Lp = COMP(A1,Lp); } while (L != NIL); L = Lp; } while (1); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/SFCS.c0000664002275300236100000000210114017255270013433 0ustar wcbrownscs/*====================================================================== B <- SFCS(A) Set from characteristic set. Inputs A : a characteristic set. Outputs B : the same set represented as an increasing list of BETA-digits. ======================================================================*/ #include "saclib.h" Word SFCS(A) Word A; { Word Ap,B,a,b,n,r; /* hide Ap,a,b,n,r; */ Step1: /* A empty. */ if (A == 0) { B = NIL; goto Return; } Step2: /* A single-precision. */ if (A < BETA) Ap = LIST1(A); else Ap = A; Step3: /* General case. */ n = 0; B = NIL; do { ADV(Ap,&a,&Ap); b = 1; do { r = REM(a,2); a = a / 2; if (r != 0) B = COMP(n,B); n = n + 1; b = b + b; } while (!(b == BETA)); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IUPSQHL0000664002275300236100000000000014017255270013575 0ustar wcbrownscssaclib2.2.8/src/IPPROD.c0000664002275300236100000000214414017255270013701 0ustar wcbrownscs/*====================================================================== C <- IPPROD(r,A,B) Integral polynomial product. Inputs A,B : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs C : in Z[X1,...,Xr], C = A * B. ======================================================================*/ #include "saclib.h" Word IPPROD(r,A,B) Word r,A,B; { Word Ap,As,Bs,C,C1,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { C = IPROD(A,B); goto Return; } Step3: /* General case. */ As = CINV(A); Bs = CINV(B); C = 0; rp = r - 1; do { ADV2(Bs,&b,&f,&Bs); Ap = As; C1 = NIL; do { ADV2(Ap,&a,&e,&Ap); if (rp == 0) c = IPROD(a,b); else c = IPPROD(rp,a,b); C1 = COMP2(e + f,c,C1); } while (Ap != NIL); C = IPSUM(r,C,C1); } while (Bs != NIL); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/PUFP.c0000664002275300236100000000162414017255270013460 0ustar wcbrownscs/*====================================================================== B <- PUFP(r,A) Polynomial, univariate, from polynomial. Inputs A : in R[X1,...,Xr], r ring. r : a BETA-digit, r >= 0. Outputs B : in R[X], B(X) = A(0,...,0,X). ======================================================================*/ #include "saclib.h" Word PUFP(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide a,e,rp; */ Step1: /* r=0 or A=0. */ if (r == 0 || A == 0) { B = A; goto Return; } Step2: /* General case. */ rp = r - 1; B = NIL; Ap = A; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = PTBCF(rp,a); if (b != 0) B = COMP2(b,e,B); } if (B == NIL) B = 0; else B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/FSUMDEOS1.c0000664002275300236100000000656714017255270014227 0ustar wcbrownscs/*====================================================================== FSUMDEOS1(A,B,d,C) Floating-point sum, different exponents, opposite signs, exponent difference of 1. Inputs A, B : two nonzero floating-point numbers having the same precisions and opposite signs. The exponent of A is one greater than the exponent of B. d : a sign (rounding direction). C : an array large enough for the sum. Output C : a floating-point number approximating the sum of A and B, rounded according to IEEE standards. Note: The probability that no normalizing shift is needed is 1/4. The probability of a normalizing shift of 1 is 1/2. The probability of a normalizing shift of n, for n >= 2, is 3 / 4^n. ======================================================================*/ #include "saclib.h" void FSUMDEOS1(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit a,b,c,cb,cp,e,f,h,i,j,n,np,p,s,w,z; Step1: /* Initialize the exponent, determine sign and precision. */ e = A[0]; s = A[1]; p = A[2]; Step2_0: /* Try 1-pass subtraction. */ /* Guess leading result digit. */ cb = A[p+2] - (B[p+2] >> 1); /* Guess amount np of normalizing left shift. */ w = cb; n = ZETA; while (w < BETA2) { n--; w = w << 1; } np = ZETA - n; /* a and f are consecutive unshifted result digits. */ /* C contains the shifted result digits. */ if (EVEN(B[3])) { f = 0; cp = 0; } else { f = BETA2; cp = -1; } if (np > 0) C[2] = 0; else C[2] = f; z = ZETA - 1; for (i = 3; i < p + 2; i++) { a = A[i] - (((B[i+1] & 1) << z) | ((B[i] >> 1))) + cp; if (a < 0) { a = a + BETA; cp = -1; } else cp = 0; C[i] = ((a << np) & BETA1) | (f >> n); f = a; } C[p+2] = (((cb + cp) << np) & BETA1) | (f >> n); /* Check whether result is normalized. */ if (C[p+2] >= BETA2) { e = e - np; goto Step6; } Step2: /* One-pass subtraction was unsuccessful. Now perform a two-pass subtraction. Shift B mantissa right by 1 and subtract from A mantissa. */ if (EVEN(B[3])) { C[2] = 0; cp = 0; } else { C[2] = BETA2; cp = -1; } z = ZETA - 1; for (i = 3; i < p + 2; i++) { b = (B[i+1] & 1) << z; c = (B[i] >> 1) | b; C[i] = A[i] - c + cp; if (C[i] < 0) { C[i] = C[i] + BETA; cp = -1; } else cp = 0; } C[p+2] = A[p+2] - (B[p+2] >> 1) + cp; Step3: /* C mantissa already normal? */ if (C[p+2] >= BETA2) goto Step6; Step4: /* Determine left shift amount. */ j = p + 2; while (C[j] == 0) j = j - 1; w = C[j]; n = ZETA; while (w < BETA2) { n = n - 1; w = w << 1; } np = ZETA - n; h = p + 2 - j; Step5: /* Shift left to normalize. */ cp = C[j] << np; for (i = j; i > 2; i--) { C[i+h] = cp | (C[i-1] >> n); cp = (C[i-1] << np) & BETA1; } C[2 + h] = cp; for (i = 1 + h; i >= 2; i--) C[i] = 0; e = e - h * ZETA - np; Step6: /* Round. */ if (C[2] != 0 && (d==s || (d==0 && ODD(C[3])))) { i = 3; while (i <= p + 2 && C[i] == BETA1) { C[i] = 0; i = i + 1; } if (i <= p + 2) C[i] = C[i] + 1; else { C[p+2] = BETA2; e = e + 1; } } Step7: /* Store exponent, sign, precision. */ C[0] = e; C[1] = s; C[2] = p; Return: /* Return. */ return; } saclib2.2.8/src/FCOMP.c0000664002275300236100000000164214017255270013552 0ustar wcbrownscs/*====================================================================== s <- FCOMP(I,J) Floating point comparison. Inputs I, J : floating point numbers of the same precision. Output s : The sign of I - J; ======================================================================*/ #include "saclib.h" BDigit FCOMP(I,J) BDigit *I,*J; { BDigit i,p,s; Step1: /* Different signs?. */ s = SIGN(I[1] - J[1]); if (s != 0) goto Return; if (I[1] == 0) goto Return; Step2: /* Different exponents. */ if (I[0] != J[0]) { s = SIGN(I[0] - J[0]); if (s != 0) { if (I[1] < 0) s = -s; goto Return; } } Step3: /* Compare mantissas. */ p = I[2]; i = p + 2; while (i >= 3 && I[i] == J[i]) i = 1 - 1; if (i == 2) { s = 0; goto Return; } else { s = SIGN(I[i] - J[i]); if (I[1] < 0) s = -s; } Return: /* Return s. */ return(s); } saclib2.2.8/src/LBRIWRITE.c0000664002275300236100000000241514017255270014250 0ustar wcbrownscs/*===================================================================== LBRIWRITE(I) Logarithmic binary rational interval write. Input I : a logarithmic binary rational interval in internal representation. I is the list (,) consisting of the logarithmic representations of the binary rational endpoints a and b of the interval. If a = b, I represents the one-point interval [a]. Otherwise, a < b and I represents the open interval (a,b). Outputs (to the output stream) Canonical external representation of I. If I is the one-point interval [a], the output is [] where is the canonical external representation of a. If I is the open interval (a,b), the output is (,) where and are the canonical external representations of a and b. Side effect The interval I is written in the output stream. ======================================================================*/ #include "saclib.h" void LBRIWRITE(I) Word I; { Word a,b; Step1: /* Two cases. */ FIRST2(I,&a,&b); if (EQUAL(a,b)) { CWRITE('['); LBRNWRITE(a); CWRITE(']'); } else { CWRITE('('); LBRNWRITE(a); CWRITE(','); LBRNWRITE(b); CWRITE(')'); } Return: /* Return */ return; } saclib2.2.8/src/IPSIGN.c0000664002275300236100000000103214017255270013670 0ustar wcbrownscs/*====================================================================== s <- IPSIGN(r,A) Integral polynomial sign. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs s : the sign of A. ======================================================================*/ #include "saclib.h" Word IPSIGN(r,A) Word r,A; { Word s; /* hide algorithm */ Step1: /* Compute. */ s = ISIGNF(PLBCF(r,A)); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/FIRST2.c0000664002275300236100000000104714017255270013656 0ustar wcbrownscs/*====================================================================== FIRST2(L; a,b) First 2. Inputs L : list of length 2 or more. Outputs a, b : the first two elements of L. ======================================================================*/ #include "saclib.h" void FIRST2(L, a_,b_) Word L, *a_,*b_; { Word Lp,a,b; /* hide algorithm */ Step1: /* Get them. */ ADV(L,&a,&Lp); b = FIRST(Lp); Return: /* Prepare for return. */ *a_ = a; *b_ = b; return; } saclib2.2.8/src/MIPHOM.c0000664002275300236100000000172214017255270013676 0ustar wcbrownscs/*=========================================================================== B <- MIPHOM(r,M,A) Modular integral polynomial homomorphism. Inputs A : in Z[X1,...,Xr]. M : in Z, M > 0. r : a BETA-digit, r >= 0, the number of variables. Outputs B : in Z/(M)[X1,...,Xr], B = A (mod M). ===========================================================================*/ #include "saclib.h" Word MIPHOM(r,M,A) Word r,M,A; { Word Ap,B,a,b,e,rp; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = MIHOM(M,A); goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = MIHOM(M,a); else b = MIPHOM(rp,M,a); if (b != 0) B = COMP2(b,e,B); } while (Ap != NIL); if (B == NIL) B = 0; else B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPROD3X2.c0000664002275300236100000000337114017255270014061 0ustar wcbrownscs/*=========================================================================== C <- IPROD3X2(A,B) Integer product - 3x2-multiplication. Inputs A : an integer of length 3. B : an integer of length 2. Outputs C : an integer. C = A * B. ===========================================================================*/ #include "saclib.h" Word IPROD3X2(A,B) Word A,B; { Word a0,a1,a2; Word b0,b1; Word s; Word c001,c010,c011; Word c100,c101,c110,c111; Word c200,c201,c210,c211; Word c1,c2,c3,c4; Word Ch[5]; Word C; Step1: /* Read digits. */ FIRST3(A,&a0,&a1,&a2); FIRST2(B,&b0,&b1); if (a2 < 0) { s = -1; a0 = -a0; a1 = -a1; a2 = -a2; } else s = 1; if (b1 < 0) { s = -s; b0 = -b0; b1 = -b1; } Step2: /* Compute digit products. */ DPR(a0,b0,&c001,&Ch[0]); DPR(a0,b1,&c011,&c010); DPR(a1,b0,&c101,&c100); DPR(a1,b1,&c111,&c110); DPR(a2,b0,&c201,&c200); DPR(a2,b1,&c211,&c210); Step3: /* Add digit products. */ c1 = c001 + c100 + c010; Ch[1] = c1 & BETA1; c2 = c1 >> ZETA; /* Note that c2 <= 2. */ c2 = c2 + c101 + c011 + c200; c3 = c2 >> ZETA; c2 = c2 & BETA1; c2 = c2 + c110; Ch[2] = c2 & BETA1; c2 = c2 >> ZETA; c3 = c3 + c2; /* Note that c3 <= 3. */ c3 = c3 + c201 + c111 + c210; Ch[3] = c3 & BETA1; c4 = c3 >> ZETA; Ch[4] = c4 + c211; /* Note that Ch[4] <= BETA - 1. */ Step4: /* Construct list. */ C = IFATL(Ch,5,s); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/GIPROD.c0000664002275300236100000000142714017255270013673 0ustar wcbrownscs/*=========================================================================== C <- GIPROD(A,B) Gaussian integer product. Inputs A,B : Gaussian integers. Output C : A * B, a Gaussian integer. ===========================================================================*/ #include "saclib.h" Word GIPROD(A,B) Word A,B; { Word A1,A2,B1,B2,C,C1,C2; Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* Compute the parts. */ FIRST2(A,&A1,&A2); FIRST2(B,&B1,&B2); C1 = IDIF(IPROD(A1,B1),IPROD(A2,B2)); C2 = ISUM(IPROD(A1,B2),IPROD(B1,A2)); Step3: /* Compose the result. */ C = LIST2(C1,C2); Return: /* Return C. */ return(C); } saclib2.2.8/src/RILC.c0000664002275300236100000000133514017255270013436 0ustar wcbrownscs/*====================================================================== t <- RILC(I,k) Rational interval length comparison. Inputs I : an interval (a,b) with rational endpoints, a <= b. k : a Gammma-integer. Outputs t : a BETA-digit, t = 1 if b-a <= 2^k and t = 0 otherwise. ======================================================================*/ #include "saclib.h" Word RILC(I,k) Word I,k; { Word a,b,d,m,n,t; /* hide a,b,m,n,t; */ Step1: /* Compare. */ FIRST2(I,&a,&b); d = RNDIF(b,a); t = 1; if (d != 0) { RNFCL2(d,&m,&n); if (n > k) t = 0; } Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/RPRNP.c0000664002275300236100000000171714017255270013612 0ustar wcbrownscs/*====================================================================== C <- RPRNP(r,a,B) Rational polynomial rational number product. Inputs B : in Q[X1,...,Xr]. r : a BETA-digit, r >= 0. a : in Q. Outputs C : in Q[X1,...,Xr], C = a B. ======================================================================*/ #include "saclib.h" Word RPRNP(r,a,B) Word r,a,B; { Word Bp,C,b,c,e,rp; /* hide b,rp; */ Step1: /* a=0 or B=0. */ if (a == 0 || B == 0) { C = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { C = RNPROD(a,B); goto Return; } Step3: /* General case. */ C = NIL; Bp = B; rp = r - 1; do { ADV2(Bp,&e,&b,&Bp); c = RPRNP(rp,a,b); C = COMP2(c,e,C); } while (!(Bp == NIL)); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFUPVAR.c0000664002275300236100000000165314017255270014014 0ustar wcbrownscs/*====================================================================== n <- AFUPVAR(M,I,A) Algebraic number field univariate polynomial variations. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : a binary rational interval. I is an acceptable isolating interval for alpha. A : in Q(alpha)[x], A not zero. Outputs n : a BETA-digit, n = var(A). ======================================================================*/ #include "saclib.h" Word AFUPVAR(M,I,A) Word M,I,A; { Word Ap,a,e,n,s,t; /* hide n,s,t; */ Step1: n = 0; Ap = A; ADV2(Ap,&e,&a,&Ap); s = AFSIGN(M,I,a); while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); t = AFSIGN(M,I,a); if (s != t) { n = n + 1; s = t; } } Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/MMAPFS.c0000664002275300236100000000370314017255270013671 0ustar wcbrownscs/*=========================================================================== L <- MMAPFS(p,A,B,d) Medium modulus array polynomial factorization, special. Inputs p : a medium prime. A : in Z/(p)[x], deg(A) >= 2, monic and squarefree. A is in array representation. B : a list (B_1,...,B_r) of monic elements of Z/(p)[x] in array representation. The B_i's constitute a basis for the space of all polynomials C of degree less than deg(Ap) such that Ap is a divisor of C^p - C. Furthermore, B_1 = 1. d : a BETA-digit, d > 0, such that Ap has no irreducible factor of degree less than d. Outputs L : a list consisting of all the monic irreducible factors of Ap of positive degree in array representation. ===========================================================================*/ #include "saclib.h" Word MMAPFS(p,A,B,d) Word p,*A,B,d; { Word *Ap,*A1,*B1,Bp,*C,*Q,*T,L,Lp,e,f,i,k,r,s; Step1: /* A irreducible. */ Ap = MAPCOPY(A); L = NIL; L = PTRCOMP(Ap,L); r = PTRLENGTH(B); if (r == 1) goto Return; Step2: /* Factorize. */ Bp = PTRRED(B); k = 1; do { Lp = NIL; PTRADV(Bp,&B1,&Bp); do { PTRADV(L,&A1,&L); e = MAPDEG(A1); if (e > d) { s = 0; i = 0; do { C = MMAPGCD(p,A1,B1); f = MAPDEG(C); if (f == 0) MAPFREE(C); else { if (f == e) { s = 1; MAPFREE(C); } else { Lp = PTRCOMP(C,Lp); Q = MAPGET(MAPDEG(A1)-MAPDEG(C)); MMAPQR(p,A1,C,Q); T = A1; A1 = Q; MAPFREE(T); k++; if (k == r) { Lp = PTRCOMP(A1,Lp); L = CONC(Lp,L); goto Return; } e = MAPDEG(A1); if (e == d) s = 1; } } MAPCF(B1,0) = (MAPCF(B1,0) + 1) % p; i++; } while (i != p && s != 1); } Lp = PTRCOMP(A1,Lp); } while (L != NIL); L = Lp; } while (1); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IPSUM.c0000664002275300236100000000254514017255270013606 0ustar wcbrownscs/*=========================================================================== C <- IPSUM(r,A,B) Integral polynomial sum. Inputs A,B : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs C : in Z[X1,...,Xr], C = A + B. ===========================================================================*/ #include "saclib.h" Word IPSUM(r,A,B) Word r,A,B; { Word Ap,Bp,C,Cp,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r = 0. */ if (r == 0) { C = ISUM(A,B); goto Return; } Step3: /* Match coefficients. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); Cp = COMP2(b,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = ISUM(a,b); else c = IPSUM(rp,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step4: /* Finish. */ if (Ap == NIL) Ap = Bp; if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/PDEGSV.c0000664002275300236100000000172014017255270013673 0ustar wcbrownscs/*====================================================================== n <- PDEGSV(r,A,i) Polynomial degree, specified variable. Inputs A : in R[X1,...,Xr], R a ring. r : a BETA-digit, r >= 1. i : a BETA-digit, 1 <= i <= r. Outputs n : the degree of A in the i-th variable. ======================================================================*/ #include "saclib.h" Word PDEGSV(r,A,i) Word r,A,i; { Word Ap,a,e,n,n1,rp; /* hide a,e,n,n1,rp; */ Step1: /* A=0. */ if (A == 0) { n = 0; goto Return; } Step2: /* i=r. */ if (i == r) { n = PDEG(A); goto Return; } Step3: /* General case. */ n = 0; Ap = A; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); n1 = PDEGSV(rp,a,i); n = MAX(n,n1); } while (Ap != NIL); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/MMPGCD.c0000664002275300236100000000165014017255270013654 0ustar wcbrownscs/*=========================================================================== C <- MMPGCD(p,A,B) Medium modulus polynomial greatest common divisor. Inputs p : a medium prime. A,B : in Z/(p)[x] in list representation. Output C : in Z/(p)[x] in list representation. C = gcd(A,B). ===========================================================================*/ #include "saclib.h" Word MMPGCD(p,A,B) Word p,A,B; { Word *Ap,*Bp,*Cp,C; Step1: /* A = 0 or B = 0. */ if (A == 0) { C = MPMON(1,p,B); goto Return; } if (B == 0) { C = MPMON(1,p,A); goto Return; } Step2: /* Convert to arrays. */ Ap = MAPFMUP(A); Bp = MAPFMUP(B); Step3: /* Compute gcd. */ Cp = MMAPGCD(p,Ap,Bp); Step4: /* Convert to list and free arrays. */ C = MUPFMAP(Cp); MAPFREE(Ap); MAPFREE(Bp); MAPFREE(Cp); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/HIDWRITE.c0000664002275300236100000000105314017255270014121 0ustar wcbrownscs/*====================================================================== HIDWRITE(I,k) Hardware interval decimal write. Inputs I : a hardware interval. k : a positive beta-digit. Effect The endpoints of I are written as decimal fractions with k digits following the decimal point. ======================================================================*/ #include "saclib.h" void HIDWRITE(I,k) interval I; BDigit k; { Word J; Step1: /* Convert and write. */ J = HILBRI(I); LBRIDWRITE(J,k); Return: /* Return. */ return; } saclib2.2.8/src/MARK.c0000664002275300236100000000256614017255270013446 0ustar wcbrownscs/*====================================================================== MARK(L) Mark. Inputs L : a non-null list or GCA handle such that every cell of L which is accessible from an already marked cell of L is itself already marked. Side effects MARK marks every unmarked cell of L. ======================================================================*/ #include "saclib.h" void MARK(L) Word L; { Word I,Lp,o,*a,i,l; /* hide I,Lp,o,a,l; */ Step1: /* Check for list/GCA handle. */ if (L > BETAp) goto Step3; Step2: /* Recursively mark a list. */ Lp = L; while (Lp != NIL) { I = Lp; Lp = SPACEB[Lp]; if (Lp < 0) goto Return; SPACEB[I] = -Lp; o = SPACEB1[I]; if ((ISLIST(o) || ISGCA(o)) && !ISNIL(o)) MARK(o); } goto Return; Step3: /* Recursively mark a GCA handle. */ Lp = L; while (Lp != NIL) { I = Lp; Lp = GCASPACEBp[Lp].next; if (Lp < 0) goto Return; GCASPACEBp[I].next = -Lp; if (GCASPACEBp[I].flag == GC_NO_CHECK) goto Return; a = GCASPACEBp[I].array; l = GCASPACEBp[I].len; for (i=0;i= 0; i--) { b = Ap[i]; if (s < 0) b = - b; B = COMP(b,B); } Return: /* Return B. */ return(B); } saclib2.2.8/src/AWRITE.c0000664002275300236100000000165114017255270013701 0ustar wcbrownscs/*====================================================================== AWRITE(A) Atom write. Inputs A : atom. Outputs none Side effects The atom A is written in the output stream. ======================================================================*/ #include "saclib.h" void AWRITE(A) Word A; { Word Ap,D[21],N,Q; /* hide algorithm */ Step1: /* Write minus sign. */ if (A < 0) { Ap = -A; CWRITE('-'); } else Ap = A; Step2: /* Convert to decimal. */ N = 0; do { Q = Ap / 10; N = N + 1; D[N] = Ap - 10 * Q; Ap = Q; } while (!(Ap == 0)); Step3: /* Write digits. */ do { CWRITE(D[N] + '0'); N = N - 1; } while (!(N == 0)); goto Return; Return: /* Prepare for return. */ return; } saclib2.2.8/src/LBRN.c0000664002275300236100000000101314017255270013433 0ustar wcbrownscs/*===================================================================== A <- LBRN(a,k) Logarithmic binary rational number. Input a : an odd integer. k : a BETA-digit. Output A : the binary rational number a/2^k in logarithmic representation. =====================================================================*/ #include "saclib.h" Word LBRN(a,k) BDigit k; Word a; { Word A; Step1: /* Make a list. */ A = LIST2(a,k); Return: /* Return A. */ return(A); } saclib2.2.8/src/PMPSV.c0000664002275300236100000000202714017255270013611 0ustar wcbrownscs/*====================================================================== B <- PMPSV(A,r,i,k) Polynomial multiplication by power of specified variable. Inputs A : a polynomial A(x_1,...,x_r) over a ring. r : r > 0, a beta-digit. i : 1 <= i <= r, a beta-digit. k : a beta-digit. Either k >= 0 or else A is divisible by (x_i)^k. Output B : B(x_1,...,x_r) = (x_i)^k * A(x_1,...,x_r). ======================================================================*/ #include "saclib.h" Word PMPSV(A,r,i,k) Word A,r,i,k; { Word a,Ap,b,B,j; Step1: /* Case A = 0 or k = 0. */ if (A == 0 || k == 0) { B = A; goto Return; } Step2: /* Case i = r. */ if (i == r) { B = PMPMV(A,k); goto Return; } Step3: /* Case i < r. */ Ap = A; B = NIL; while (Ap != NIL) { ADV2(Ap, &j,&a,&Ap); b = PMPSV(a,r - 1,i,k); B = COMP2(b,j,B); } B = INV(B); Return: /* Return B. */ return(B); } saclib2.2.8/src/MIDIF.c0000664002275300236100000000102114017255270013525 0ustar wcbrownscs/*====================================================================== C <- MIDIF(M,A,B) Modular integer difference. Inputs M : a positive integer. A,B : elements of Z_M. Outputs C : A - B. ======================================================================*/ #include "saclib.h" Word MIDIF(M,A,B) Word M,A,B; { Word C; Step1: /* Compute. */ C = IDIF(A,B); if (ISIGNF(C) < 0) C = ISUM(M,C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFFINT.c0000664002275300236100000000111014017255270013643 0ustar wcbrownscs/*====================================================================== a <- AFFINT(M) Algebraic number field element from integer. Inputs M : in Z. Outputs a : in Q(alpha). a = M represented as an element of Q(alpha). ======================================================================*/ #include "saclib.h" Word AFFINT(M) Word M; { Word R,a; Step1: if (M == 0) a = 0; else { R = RNINT(M); a = LIST2(R,PMON(1,0)); } Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/MPUC.c0000664002275300236100000000116414017255270013451 0ustar wcbrownscs/*====================================================================== c <- MPUC(r,p,A) Modular polynomial univariate content. Inputs r : a BETA-digit, r >= 2. p : a BETA-digit, prime. A : in Z/(p)[X1,...,Xr]. Outputs c : in Z/(p)[X], the univariate content of A. ======================================================================*/ #include "saclib.h" Word MPUC(r,p,A) Word r,p,A; { Word c; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) c = 0; else c = MPUCS(r,p,A,0); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/LELTI.c0000664002275300236100000000110714017255270013553 0ustar wcbrownscs/*====================================================================== a <- LELTI(A,i) List element. Inputs A : non empty list i : integer, 1 <= i <= LENGTH(L) Outputs a : the i-th element of A. ======================================================================*/ #include "saclib.h" Word LELTI(A,i) Word A,i; { Word Ap,a,j; /* hide algorithm */ Step1: /* Compute. */ Ap = A; for (j = 1; j <= i - 1; j++) Ap = RED(Ap); a = FIRST(Ap); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/FIRST4.c0000664002275300236100000000126114017255270013656 0ustar wcbrownscs/*====================================================================== FIRST4(L; a1,a2,a3,a4) First 4. Inputs L : list of length 4 or more. Outputs a1, a2, a3, a4 : the first four elements of L. ======================================================================*/ #include "saclib.h" void FIRST4(L, a1_,a2_,a3_,a4_) Word L, *a1_,*a2_,*a3_,*a4_; { Word Lp,a1,a2,a3,a4; /* hide algorithm */ Step1: /* Get them. */ ADV(L,&a1,&Lp); ADV(Lp,&a2,&Lp); ADV(Lp,&a3,&Lp); a4 = FIRST(Lp); Return: /* Prepare for return. */ *a1_ = a1; *a2_ = a2; *a3_ = a3; *a4_ = a4; return; } saclib2.2.8/src/ISIGNF.c0000664002275300236100000000122314017255270013660 0ustar wcbrownscs/*====================================================================== s <- ISIGNF(A) Integer sign function. Inputs A : in Z. Outputs s : sign(A). ======================================================================*/ #include "saclib.h" Word ISIGNF(A) Word A; { Word Ap,a,s; /* hide algorithm */ Step1: /* A single-precision. */ if (A < BETA) { s = SIGN(A); goto Return; } Step2: /* A multiple-precision. */ Ap = A; do ADV(Ap,&a,&Ap); while (a == 0); s = SIGN(a); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/PORD.c0000664002275300236100000000123714017255270013452 0ustar wcbrownscs/*====================================================================== k <- PORD(A) Polynomial order. Inputs A : a non-zero polynomial. Outputs k : integer, the order of A. That is, if A(x)=an x^n +...+ a0, then k is the smallest integer such that ak /= 0. ======================================================================*/ #include "saclib.h" Word PORD(A) Word A; { Word Ap,k; /* hide algorithm */ Step1: /* Compute. */ Ap = A; do { ADV(Ap,&k,&Ap); Ap = RED(Ap); } while (Ap != NIL); Return: /* Prepare for return. */ return(k); } saclib2.2.8/src/AITR.c0000664002275300236100000000270214017255270013443 0ustar wcbrownscs/*======================================================================= AITR(A,n,k,B) Array integer truncate and round. Inputs A : a nonzero integer in array representation. n, k : nonnegative BETA digits, with k < ZETA. B : an array whose size is at least min(3,m - n + 3), where m = L(A). Effect Let N = n * ZETA + k. {A / 2^N}, the nearest integer to A / 2^N, is placed in the array B. ========================================================================*/ #include "saclib.h" void AITR(A,n,k,B) BDigit *A,n,k,*B; { BDigit a,a1,a2,i,m,kp; Step1: /* B = 0. */ m = A[1]; if (m < n) { B[0] = 0; B[1] = 0; B[3] = 0; goto Return;} Step2: /* Shift right. */ kp = ZETA - k; for (i = n + 2; i <= m; i++) { a1 = A[i] >> k; a2 = (A[i + 1] << kp) & BETA1; B[i - n] = a1 | a2; } B[m - n + 1] = A[m + 1] >> k; B[m - n + 2] = 0; Step3: /* Round. */ if (k > 0) a = A[n +2] >> (k - 1); else { if (n > 0) a = A[n + 1] >> (ZETA - 1); else a = 0; } a = a & 1; i = 2; while (a > 0) { a = B[i] + a; B[i] = a & BETA1; a = a >> ZETA; i = i + 1; } Step4: /* Store sign and length. */ B[0] = A[0]; if (B[m - n + 2] != 0) B[1] = m - n + 1; else if (m > n && B[m - n + 1] != 0) B[1] = m - n; else if (m - n >= 2 && B[m - n] != 0) B[1] = m - n - 1; else { B[1] = 0; B[0] = 0; } Return: /* Return. */ return; } saclib2.2.8/src/IUPWRITE.c0000664002275300236100000000216114017255270014153 0ustar wcbrownscs/*=========================================================================== IUPWRITE(A,v) Integral univariate polynomial write. Inputs A : in Z[x]. v : a variable. Side effects The polynomial A is written in the output stream in recursive format using the variable v. ===========================================================================*/ #include "saclib.h" void IUPWRITE(A,v) Word A,v; { Word Ap,e,a; Step1: /* A = 0 */ if (A == 0) { CWRITE('0'); goto Return; } Step2: /* Initialize. */ Ap = A; CWRITE('('); Step3: /* Write coefficient */ FIRST2(Ap,&e,&a); if (a == -1 && e > 0) { CWRITE('-'); goto Step4; } if (a == 1 && e > 0) { if (A != Ap) CWRITE('+'); goto Step4; } if (ISIGNF(a) > 0 && A != Ap) CWRITE('+'); IWRITE(a); Step4: /* Write variable and exponent */ if (e > 0) VWRITE(v); if (e > 1) { CWRITE('^'); AWRITE(e); } Ap = RED2(Ap); if (Ap != NIL) goto Step3; Step5: /* Close. */ CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/RPAFME.c0000664002275300236100000000145014017255270013655 0ustar wcbrownscs/*=========================================================================== B <- RPAFME(r,M,A,b) Rational polynomial, algebraic number field multiple evaluation. Input: r : a BETA-digit, r >= 1. M : in Z[x], the minimal polynomial for an algebraic number alpha. A : in Q[x_1,...,x_r]. b : a list (b_1,...,b_k) of elements of Q(alpha), 1 <= k <= r. Output: B : in Q(alpha)[x_{k+1},...,x_r], B = A(b_1,...,b_k,x_{k+1},...,x_r). ===========================================================================*/ #include "saclib.h" Word RPAFME(r,M,A,b) Word r,M,A,b; { Word Ap,B; Step1: /* Convert A to a polynomial over Q(alpha). */ Ap = AFPFRP(r,A); Step2: /* Evaluate at b. */ B = AFPME(r,M,Ap,b); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/DRPCC.c0000664002275300236100000000416614017255270013545 0ustar wcbrownscs/*=========================================================================== DRPCC(m,a,b; u1,u2,v1,v2) Digit restricted partial cosequence calculation. Inputs a, b : BETA-digits, a >= b > 0. Outputs u1, u2, v1, v2: BETA-digits. Let A and B be positive integers such that, for some k >= 0, we have a = [A / 2^k] and b = [B / 2^k]. Then, for some i, nearly as large as possible, A_i = u1 A + v1 B and A_{i+1} = u2 A + v2 B, where A_j is the j-th term of the remainder sequence of A and B. Furthermore, |v2| < m or v1 <= 1. ===========================================================================*/ #include "saclib.h" void DRPCC(m,a,b, u1_,u2_,v1_,v2_) Word m,a,b, *u1_,*u2_,*v1_,*v2_; { Word a1,a2,a3,b2,d1,d2,d3,i,k,p,q,t1,t2,u1,u2,u3,v1,v2,v3; Step1: /* Initialize. */ a1 = a; a2 = b; u1 = 1; u2 = 0; v1 = 0; v2 = 1; Step2: /* Is the quotient 1 or 2 ? */ d1 = a1 - a2; d2 = d1 - a2; if (d2 < 0) { a3 = d1; u3 = u1 - u2; v3 = v1 - v2; goto Step4; } d3 = d2 - a2; if (d3 < 0) { a3 = d2; u3 = u1 - u2 - u2; v3 = v1 - v2 - v2; goto Step4; } Step3: /* Quotient is at least 3, divide by shifting and subtraction. */ k = 1; b2 = a2 << 2; while (b2 <= a1) { b2 <<= 1; k++; } b2 >>= 1; p = 1 << k; a3 = a1; q = 0; for (i = 0; i <= k; i++) { if (b2 < a3) { a3 -= b2; q += p; } p >>= 1; b2 >>= 1; } u3 = u1 - q * u2; v3 = v1 - q * v2; Step4: /* Check for completion. */ if (v3 > 0) { t1 = v3; t2 = v3 - v2; } else { t1 = -v3; t2 = v2 - v3; } if (a3 < t1 || a2 - a3 < t2) goto Return; if (t1 >= m) { if (v1 == 0) { u1 = u2; u2 = u3; v1 = v2; v2 = v3; } goto Return; } Step5: /* Update sequence values, and loop. */ a1 = a2; a2 = a3; u1 = u2; u2 = u3; v1 = v2; v2 = v3; goto Step2; Return: /* Prepare for return. */ *u1_ = u1; *u2_ = u2; *v1_ = v1; *v2_ = v2; return; } saclib2.2.8/src/IPABS.c0000664002275300236100000000114414017255270013541 0ustar wcbrownscs/*=========================================================================== B <- IPABS(r,A) Integral polynomial absolute value. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Z[X1,...Xr]. Outputs B : in Z[X1,...Xr], the absolute value of A. ===========================================================================*/ #include "saclib.h" Word IPABS(r,A) Word r,A; { Word B,s; Step1: /* Compute. */ s = IPSIGN(r,A); if (s >= 0) B = A; else B = IPNEG(r,A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPFCB.c0000664002275300236100000000174714017255270013537 0ustar wcbrownscs/*====================================================================== b <- IPFCB(V) Integral polynomial factor coefficient bound. Inputs V : the degree vector of a non-zero integral polynomial A. Outputs b : in Z, b >= 0, such that if B1*...*Bk | A then the product of the infinity norms of the Bi is less than or equal to 2^b times the infinity norm of A. Gelfonds bound is used. ======================================================================*/ #include "saclib.h" Word IPFCB(V) Word V; { Word Vp,b,n,n1,p; /* hide Vp,b,n,n1; */ Step1: /* Compute. */ n = 0; p = 1; Vp = V; do { ADV(Vp,&n1,&Vp); if (n1 > 0) { n = n + n1 + n1 - 1; p = IPROD(p,n1 + 1); } } while (!(Vp == NIL)); n = n + ILOG2(p); b = (n + 1) / 2; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/ANFAF.c0000664002275300236100000000275214017255270013524 0ustar wcbrownscs/*=========================================================================== ANFAF(M,I,a; N,J) Algebraic number from algebraic number field element. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. a : in Q(alpha). Outputs N : in Z[x]. N is the minimal polynomial of a. J : an acceptable isolating interval for a. ===========================================================================*/ #include "saclib.h" void ANFAF(M,I,a, N_,J_) Word M,I,a, *N_,*J_; { Word A,B,C,J,L,N,as,b1,b2,d,s1,s2,u1,u2,v1,v2; Step1: /* a rational. */ if (a == 0) { N = PMON(1,1); J = LIST2(0,0); goto Return; } as = AFICR(a); if (PDEG(as) == 0) { N = PBIN(RNINT(-1),1,SECOND(as),0); IPSRP(1,N,&d,&N); L = IPRIM(N); J = FIRST(L); goto Return; } Step2: /* Find minimal polynomial. */ A = PBIN(PMON(RNINT(-1),0),1,as,0); IPSRP(2,A,&d,&A); A = PPERMV(2,A,LIST2(2,1)); B = PINV(1,M,1); C = IPRES(2,A,B); N = IPPGSD(1,C); Step3: /* Find acceptable isolating interval. */ L = IPRIM(N); do { ADV(L,&J,&L); FIRST2(J,&u1,&u2); v1 = AFFRN(u1); v2 = AFFRN(u2); b1 = AFDIF(a,v1); b2 = AFDIF(a,v2); s1 = AFSIGN(M,I,b1); s2 = AFSIGN(M,I,b2); if (s1 * s2 == -1) goto Return; } while (1); Return: /* Prepare for return. */ *N_ = N; *J_ = J; return; } saclib2.2.8/src/DIPFP.c0000664002275300236100000000250414017255270013546 0ustar wcbrownscs/*====================================================================== B <- DIPFP(r,A) Distributive polynomial from polynomial. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in R[X1,...Xr], where R is any ring. Outputs B : in R[X1,...Xr], the result of converting A from recursive to distributive representation. ======================================================================*/ #include "saclib.h" Word DIPFP(r,A) Word r,A; { Word A1,Ap,B,B1,E1,a1,b1,e1,rp; /* hide rp; */ Step1: /* r=0 or A=0. */ if (r == 0 || A == 0) { B = A; goto Return; } Step2: /* r=1. */ B = NIL; Ap = A; rp = r - 1; if (rp > 0) goto Step3; do { ADV2(Ap,&e1,&a1,&Ap); E1 = LIST1(e1); B = COMP2(E1,a1,B); } while (!(Ap == NIL)); B = INV(B); goto Return; Step3: /* Recursion. */ do { ADV2(Ap,&e1,&A1,&Ap); B1 = DIPFP(rp,A1); do { ADV2(B1,&b1,&E1,&B1); E1 = COMP(e1,E1); B = COMP2(E1,b1,B); } while (!(B1 == NIL)); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IUPBES.c0000664002275300236100000000147314017255270013677 0ustar wcbrownscs/*====================================================================== s <- IUPBES(A,a) Integral univariate polynomial binary rational evaluation of sign. Inputs A : in Z[X]. a : binary rational number. Outputs s : in Z, s = sign(A(a)). ======================================================================*/ #include "saclib.h" Word IUPBES(A,a) Word A,a; { Word b,c,d,m,s; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) s = 0; else { if (a == 0) { c = 0; m = 0; } else { FIRST2(a,&c,&d); m = IORD2(d); } b = IUPBEI(A,c,m); s = ISIGNF(b); } Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/AREAD.c0000664002275300236100000000212714017255270013521 0ustar wcbrownscs/*====================================================================== A <- AREAD() Atom read. Outputs A : an atom read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word AREAD() { Word A,C,S; /* hide algorithm */ Step1: /* Skip blanks and read sign, if any. */ S = 1; C = CREADB(); if (C == '+') C = CREAD(); else if (C == '-') { C = CREAD(); S = -1; } else if (DIGIT(C) == 0) goto Step3; Step2: /* Read digits and convert. */ A = 0; do { if (A > BETA / 10) goto Step3; A = 10 * A + C - '0'; if (A >= BETA) goto Step3; C = CREAD(); } while (DIGIT(C) != 0); A = S * A; BKSP(); goto Return; Step3: /* Error. */ FAIL("AREAD","Unexpected character",C); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IBCPS.c0000664002275300236100000000120114017255270013535 0ustar wcbrownscs/*====================================================================== A <- IBCPS(n,k) Integer binomial coefficient partial sum. Inputs n,k : BETA-digits, 0 <= k <= n. Outputs A : the sum (n choose 0) + . . . + (n choose k). ======================================================================*/ #include "saclib.h" Word IBCPS(n,k) Word n,k; { Word A,B,j; /* hide j; */ Step1: /* Compute. */ A = 1; B = 1; for (j = 0; j <= k - 1; j++) { B = IBCIND(B,n,j); A = ISUM(A,B); } Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IPDSCRBEZ.c0000664002275300236100000000140214017255270014225 0ustar wcbrownscs/*=========================================================================== B <- IPDSCRBEZ(r,A) Integral polynomial discriminant, Bezout method. Inputs r : a BETA-digit, r > 0. A : in Z[x_1,...,x_r], of degree greater than or equal to two in its main variable. Outputs B : in Z[x_1,...,x_{r-1}], the discriminant of A. ===========================================================================*/ #include "saclib.h" Word IPDSCRBEZ(r,A) Word r,A; { Word Ap,B,a,n,rp; Step1: /* Compute. */ Ap = IPDMV(r,A); B = IPRESBEZ(r,A,Ap); a = PLDCF(A); rp = r - 1; B = IPEQ(rp,B,a); n = PDEG(A); if (REM(n,4) >= 2) B = IPNEG(rp,B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MEMBER.c0000664002275300236100000000126714017255270013660 0ustar wcbrownscs/*====================================================================== t <- MEMBER(a,L) Membership test. Inputs a : object L : list. Outputs t : an integer. t has the value 1 if a is a member of L, otherwise has the value 0. ======================================================================*/ #include "saclib.h" Word MEMBER(a,L) Word a,L; { Word Lp,a1,t; /* hide algorithm */ Step1: /* Test. */ t = 0; Lp = L; while (Lp != NIL) { ADV(Lp,&a1,&Lp); t = EQUAL(a,a1); if (t == 1) goto Return; } Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/LBRNFIE.c0000664002275300236100000000107214017255270013764 0ustar wcbrownscs/*====================================================================== Ib <- LBRNFIE(I,e) Logarithmic binary rational number from integer and exponent. Inputs I : an integer. e : a BETA-digit. Outputs R : logarithmic binary rational representation of I*2^e. ======================================================================*/ #include "saclib.h" Word LBRNFIE(I,e) Word I,e; { Word R; Step1: /* Compute I*2^e. */ R = LBRNP2PROD( ILBRN(I) , e ); Return: /* Prepare to return. */ return (R); } saclib2.2.8/src/AMUPRINCS.c0000664002275300236100000000341414017255270014246 0ustar wcbrownscs/*=========================================================================== AMUPRINCS(M,I,A,a,b;L,Is) Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. Inputs M : an element of Z[X]. M(alpha) = 0. I : an isolating interval for alpha. A : an element of Z[alpha,X]. A /= 0 is squarefree. a,b : binary rational numbers. Outputs L : a list (I_1,...,I_k) of isolating intervals for the real roots of A(T(X)) in the interval (a,b) where T(X) is the linear transformation which maps (a,b) onto (-1,1). I_j is either open or a one-point interval, and is a subinterval of (a,b). I_1 < ... < I_k. Is : Refined acceptable isolating interval for alpha. ===========================================================================*/ #include "saclib.h" void AMUPRINCS(M,I,A,a,b,L_,Is_) Word M,I,A,a,b; Word *L_,*Is_; { Word L,Is; Word As,A_1,A_2,Ab,L_0,L_1,L_2,c,m,v; Step1: /* Check if A(a) = 0 and Initialize. */ m = PDEG(A); Ab = PDBORD(A); Is = I; if (PDEG(Ab) < m) L_0 = LIST1(LIST2(a,a)); else L_0 = NIL; Step2: /* Base case. */ As = AMUPTR1(PRT(Ab)); AMUPVARIR(M,Is,As,&v,&Is); if (v == 0) { L = L_0; goto Return; } else if (v == 1) { L = CONC(L_0,LIST1(LIST2(a,b))); goto Return; } else { c = RNQ(RNSUM(a,b),RNINT(2)); A_1 = AMUPBHT(Ab,-1); A_2 = AMUPTR1(A_1); } Step3: /* Left recursive call. */ AMUPRINCS(M,Is,A_1,a,c,&L_1,&Is); Step4: /* Right recursive call. */ AMUPRINCS(M,Is,A_2,c,b,&L_2,&Is); Step5: /* Combine intervals. */ L = CONC(L_0,CONC(L_1,L_2)); Return: /* Prepare for return. */ *L_ = L; *Is_ = Is; return; } saclib2.2.8/src/DIIPREAD.c0000664002275300236100000000414414017255270014067 0ustar wcbrownscs/*====================================================================== A <- DIIPREAD(V) Distributive integral polynomial read. Inputs V : a variable list. Outputs A : in Z[X1,...Xr], distributive representation, where r=length(V), r >= 0. Any preceding blanks and blanks separating coefficients, variables, exponents and the symbols *,+,- and ^ are skipped. ======================================================================*/ #include "saclib.h" Word DIIPREAD(V) Word V; { Word A,C,Cp,E,a,e,i,j,k,r,v; /* hide C,e,i,j,k,r; */ Step1: /* Rl=0. */ if (V == NIL) { A = IREAD(); goto Return; } Step2: /* Initialize. */ C = CREADB(); if (C != '(') goto Step7; A = NIL; r = LENGTH(V); Step3: /* Read first coefficient */ C = LKAHEAD(); if (LETTER(C) || DIGIT(C)) { if (LETTER(C)) a = 1; else a = IREAD(); A = COMP(a,A); goto Step5; } Step4: /* Read coefficient. */ C = CREADB(); if (C != '+' && C != '-') goto Step7; Cp = LKAHEAD(); if (DIGIT(Cp)) a = IREAD(); else a = 1; if (C == '-') a = INEG(a); A = COMP(a,A); Step5: /* Read monic monomial. */ E = NIL; i = 1; do { C = LKAHEAD(); if (!LETTER(C)) goto Step6; v = VREAD(); j = VLSRCH(v,V); if (j < i) goto Step7; for (k = i; k <= j - 1; k++) E = COMP(0,E); C = LKAHEAD(); if (C == '^') { C = CREAD(); e = AREAD(); } else e = 1; E = COMP(e,E); i = j + 1; } while (!(i > r)); Step6: /* Complete exponent vector. */ for (k = i; k <= r; k++) E = COMP(0,E); A = COMP(E,A); C = CREADB(); if (C == '+' || C == '-') { BKSP(); goto Step4; } if (C == ')') { A = INV(A); goto Return; } Step7: /* Error. */ FAIL("DIIPREAD","Unexpected character",C); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/LSICOMP.c0000664002275300236100000000200214017255270014003 0ustar wcbrownscs/*===================================================================== t <- LSICOMP(I,J) Logarithmic standard interval comparison test. Inputs I,J : logarithmic standard intervals. Output t : an integer. t = -2 if I < J, t = -1 if J < I, t = 0 if I = J, t = +1 if I is properly contained in J, and t = +2 if J is properly contained in I. =====================================================================*/ #include "saclib.h" Word LSICOMP(I,J) Word I,J; { Word a1,a2,b1,b2,t,t1,t2; Step1: /* Obtain endpoints. */ FIRST2(I,&a1,&a2); FIRST2(J,&b1,&b2); Step2: /* Compare corresponding endpoints. */ t1 = LBRNCOMP(a1,b1); t2 = LBRNCOMP(a2,b2); Step3: /* Case analysis. */ if (t1 == 0 && t2 == 0) t = 0; else if (t1 >= 0 && t2 <= 0) t = 1; else if (t1 <= 0 && t2 >= 0) t = 2; else if (LBRNCOMP(b2,a1) <= 0) t = -1; else t = -2; Return: /* Return t. */ return(t); } saclib2.2.8/src/MPEXP.c0000664002275300236100000000145114017255270013575 0ustar wcbrownscs/*====================================================================== B <- MPEXP(r,m,A,n) Modular polynomial exponentiation. Inputs A : in Z/(m)[x_1,...,x_r]. r : a BETA-digit, r >= 0, the number of variables. m : a BETA-digit, m > 1. n : a non-negative BETA-digit. Outputs B : in Z/(m)[x_1,...,x_r], B = A^n. ======================================================================*/ #include "saclib.h" Word MPEXP(r,m,A,n) Word r,m,A,n; { Word B,i; Step1: /* n = 0. */ if (n == 0) { B = PINV(0,1,r); goto Return; } Step2: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step3: /* General case. */ B = A; for (i = 1; i <= n - 1; i++) B = MPPROD(r,m,B,A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AGIDP2.c0000664002275300236100000000115514017255270013613 0ustar wcbrownscs/*======================================================================= AGIDP2(A,k,B) Array Gaussian integer division by a power of 2. Inputs A : an array Gaussian integer. k : a BETA integer, 0 <= k < ZETA. B : a Gaussian integer array. Effect The integral part of A / 2^k os placed in B. Note that B may be the same array as A. ========================================================================*/ #include "saclib.h" void AGIDP2(A,k,B) BDigit **A,k,**B; { Step1: /* Apply AIDP2. */ AIDP2(A[0],k,B[0]); AIDP2(A[1],k,B[1]); Return: /* Return. */ return; } saclib2.2.8/src/PFDIP.c0000664002275300236100000000272114017255270013547 0ustar wcbrownscs/*====================================================================== B <- PFDIP(r,A) Polynomial from distributive polynomial. Inputs A : in R[X1,...,Xr], distributive representation. R a BETA-digit, r >= 0. Outputs B : in R[X1,...,Xr], the result of converting A to recursive representation. ======================================================================*/ #include "saclib.h" Word PFDIP(r,A) Word r,A; { Word A1,Ap,B,B1,E1,a1,e,e1,rp; /* hide E1,a1,e,e1,rp; */ Step1: /* r=0 or A=0. */ if (r == 0 || A == 0) { B = A; goto Return; } Step2: /* r=1. */ B = NIL; Ap = A; rp = r - 1; if (rp > 0) goto Step3; do { ADV2(Ap,&a1,&E1,&Ap); e1 = FIRST(E1); B = COMP2(a1,e1,B); } while (!(Ap == NIL)); B = INV(B); goto Return; Step3: /* Recursion. */ do { e = DIPDEG(r,Ap); A1 = NIL; do { e1 = DIPDEG(r,Ap); if (e1 == e) { ADV2(Ap,&a1,&E1,&Ap); E1 = RED(E1); A1 = COMP2(E1,a1,A1); } } while (!(e1 != e || Ap == NIL)); A1 = INV(A1); B1 = PFDIP(rp,A1); B = COMP2(B1,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MPSPRS.c0000664002275300236100000000353314017255270013733 0ustar wcbrownscs/*====================================================================== S <- MPSPRS(r,p,A,B) Modular polynomial subresultant polynomial remainder sequence. Inputs r : a BETA-digit, r > 0. p : a BETA-digit, prime. A,B : in Z/(p)[X1,...,Xr], deg(A) >= deg(B). Outputs S : a list of polynomials in Z/(p)[X1,...,Xr], the subresultant P.R.S. of the first kind of A and B. ======================================================================*/ #include "saclib.h" Word MPSPRS(r,p,A,B) Word r,p,A,B; { Word G1,G2,G3,Gh3,S,d0,d1,g1,h0,h1,hs0,hs1,i,n1,n2,n3,rp; /* hide d0,d1,i,n1,n2,n3,rp; */ Step1: /* Initialize. */ G1 = A; G2 = B; S = LIST2(G2,G1); n1 = PDEG(G1); n2 = PDEG(G2); d0 = 0; d1 = n1 - n2; rp = r - 1; i = 1; Step2: /* Compute Gh_{i+2}. */ Gh3 = MPPSR(r,p,G1,G2); if (Gh3 == 0) { S = INV(S); goto Return; } if (EVEN(d1) == 1) Gh3 = MPNEG(r,p,Gh3); n3 = PDEG(Gh3); Step3: /* Compute hi. */ if (i > 1) { g1 = PLDCF(G1); h1 = MPEXP(rp,p,g1,d0); if (i > 2) { hs0 = MPEXP(rp,p,h0,d0 - 1); h1 = MPQ(rp,p,h1,hs0); hs0 = 0; } } Step4: /* Compute G_{i+2}. */ if (i == 1) G3 = Gh3; else { hs1 = MPEXP(rp,p,h1,d1); hs1 = MPPROD(rp,p,g1,hs1); hs1 = LIST2(0,hs1); G3 = MPQ(r,p,Gh3,hs1); hs1 = 0; Gh3 = 0; } Step5: /* Update. */ S = COMP(G3,S); n1 = n2; n2 = n3; d0 = d1; d1 = n1 - n2; G1 = G2; G2 = G3; if (i > 1) h0 = h1; i = i + 1; goto Step2; Return: /* Prepare for return. */ return(S); } saclib2.2.8/src/VAR.c0000664002275300236100000000150314017255270013332 0ustar wcbrownscs/*=========================================================================== v <- VAR(L) Variations. Inputs L : a list (s_1,...,s_t) of signs, where s_i is -1, 0, or 1. Outputs v : in Z. v is equal to the number of variations in L. ===========================================================================*/ #include "saclib.h" Word VAR(L) Word L; { Word v,Lp,s_1,s_2; Step1: /* Skip leading zeros. */ Lp = L; v = 0; s_1 = 0; while (Lp != NIL && s_1 == 0) { s_1 = FIRST(Lp); Lp = RED(Lp); } Step2: /* Count variations. */ while (Lp != NIL) { s_2 = FIRST(Lp); Lp = RED(Lp); if (s_2 == -s_1) { v = v + 1; s_1 = s_2; } } Return: /* Return v. */ return(v); } saclib2.2.8/src/AFUPGC.c0000664002275300236100000000660314017255270013655 0ustar wcbrownscs/*=========================================================================== AFUPGC(M,A,B; C,Ab,Bb) Algebraic number field univariate polynomial greatest common divisor and cofactors. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. A,B : in Q(alpha)[x]. Outputs C : in Q(alpha)[x], C is the monic gcd of A and B. Ab,Bb : in Q(alpha)[x], the cofactors Ab = A / C and Bb = B / C. ===========================================================================*/ #include "saclib.h" void AFUPGC(M,A,B,C_,Ab_,Bb_) Word M,A,B,*C_,*Ab_,*Bb_; { Word A1,A1p,A2,A2p,Ab,Bb,C,Cp,Ct,D,G,L,Lt,Mp,Mpp,P,Q,Qp,Qt,Qtp,R,T, c,d,p,q,qp,qt,t; Word *Dp,*Sp,*Spp; Step1: /* A = B = 0. */ if (A == 0 && B == 0) { C = 0; Ab = 0; Bb = 0; goto Return; } Step2: /* A = 0 or B = 0. */ if (A == 0) { C = AFPMON(1,M,B); Ab = 0; Bb = PINV(0,PLDCF(B),1); goto Return; } if (B == 0) { C = AFPMON(1,M,A); Bb = 0; Ab = PINV(0,PLDCF(A),1); goto Return; } Step3: /* deg A = 1 or deg B = 1. */ if (PDEG(A) == 1 || PDEG(B) == 1) { AFUPGC1(M,A,B,&C,&Ab,&Bb); goto Return; } /* General case. */ Step4: /* Initialize. */ P = MPRIME; A1 = AFPICR(1,A); A2 = AFPICR(1,B); IPSRP(2,A1,&R,&A1); IPSRP(2,A2,&R,&A2); Q = 1; C = 0; Ct = 0; Qt = 1; q = 1; L = NIL; d = PDEG(B) + 1; Step5: /* Reduce polynomials modulo a prime. */ if (P == NIL) FAIL("AFUPGCD","Prime list exhausted"); ADV(P,&p,&P); Mp = MPHOM(1,p,M); if (PDEG(Mp) < PDEG(M)) goto Step5; A1p = MPHOM(2,p,A1); if (PDEG(A1p) < PDEG(A1)) goto Step5; A2p = MPHOM(2,p,A2); if (PDEG(A2p) < PDEG(A2)) goto Step5; Step6: /* Check if p divides disc(M). */ Mpp = MUPDER(p,Mp); Sp = MAPFMUP(Mp); Spp = MAPFMUP(Mpp); Dp = MMAPGCD(p,Sp,Spp); D = MUPFMAP(Dp); MAPFREE(Sp); MAPFREE(Spp); MAPFREE(Dp); if (PDEG(D) > 0) goto Step5; Step7: /* Compute monic gcd modulo p. */ Mp = MPMON(1,p,Mp); Cp = FRUPGCD(p,Mp,A1p,A2p); if (Cp == NIL) goto Step5; Step8: /* Check degree. */ c = PDEG(Cp); if (c == 0) /* gcd is 1. */ goto Step12; if (c > d) /* degree too large, throw prime away */ goto Step5; if (c < d) { /* all previous primes were unlucky */ C = Cp; d = c; Q = p; Qp = IQ(Q,2); ISQRT(Qp,&Qp,&t); q = ILOG2(Qp); L = NIL; goto Step5; } Step9: /* Apply Chinese remaindering. */ if (Q != p) { qp = MDINV(p,MDHOM(p,Q)); Qt = IDPR(Q,p); Ct = IPCRA(Q,p,qp,2,C,Cp); } Step10: /* Recover rational coefficients, if possible. */ Qtp = IQ(Qt,2); ISQRT(Qtp,&Qtp,&t); qt = ILOG2(Qtp); AFUPFMRC(Q,Qp,q,C,L,Qt,Qtp,qt,Ct, &Lt,&G); Q = Qt; Qp = Qtp; q = qt; C = Ct; L = Lt; if (G == NIL) goto Step5; Step11: /* Trial division. */ AFUPQR(M,A,G,&Ab,&T); if (T != 0) goto Step5; else { AFUPQR(M,B,G,&Bb,&T); if (T != 0) goto Step5; } C = G; goto Return; Step12: /* Relatively prime. */ C = PMON(AFFINT(1),0); Ab = A; Bb = B; Return: /* Prepare for return. */ *C_ = C; *Ab_ = Ab; *Bb_ = Bb; } saclib2.2.8/src/LBIM.c0000664002275300236100000000345214017255270013432 0ustar wcbrownscs/*====================================================================== L <- LBIM(L1,L2) List of BETA-integers merge. Inputs L1, L2 : lists of BETA-integers in non-decreasing order. Outputs L : a list obtained by merging L1 and L2. L1 and L2 are modified to produce L. ======================================================================*/ #include "saclib.h" Word LBIM(L1,L2) Word L1,L2; { Word L,Lp,Lp1,Lp2,a1,a2; /* hide algorithm */ Step1: /* L1 or L2 null. */ if (L1 == NIL) { L = L2; goto Return; } if (L2 == NIL) { L = L1; goto Return; } Step2: /* Initialize. */ Lp1 = L1; Lp2 = L2; a1 = FIRST(L1); a2 = FIRST(L2); if (a1 > a2) { L = L2; Lp = L2; Lp2 = RED(L2); goto Step4; } else { L = L1; Lp = L1; Lp1 = RED(L1); } Step3: /* LAST element from L1. */ if (Lp1 == NIL) goto Step5; a1 = FIRST(Lp1); if (a1 <= a2) { Lp = Lp1; Lp1 = RED(Lp1); goto Step3; } else { SRED(Lp,Lp2); Lp = Lp2; Lp2 = RED(Lp2); } Step4: /* LAST element from L2. */ if (Lp2 == NIL) goto Step5; a2 = FIRST(Lp2); if (a1 <= a2) { SRED(Lp,Lp1); Lp = Lp1; Lp1 = RED(Lp1); goto Step3; } else { Lp = Lp2; Lp2 = RED(Lp2); goto Step4; } Step5: /* Left over. */ if (Lp1 == NIL) SRED(Lp,Lp2); else SRED(Lp,Lp1); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MIN.c0000664002275300236100000000072114017255270013326 0ustar wcbrownscs/*====================================================================== c <- MIN(a,b) Minimum. Inputs a, b : C integers. Outputs c : the minimum of a and b. ======================================================================*/ #include "saclib.h" Word MIN(a,b) Word a,b; { Word c; Step1: /* Compute. */ if (a <= b) c = a; else c = b; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/IPRCHS.c0000664002275300236100000000257214017255270013701 0ustar wcbrownscs/*=========================================================================== L <- IPRCHS(A,I,k) Integral polynomial real root calculation, high-precision special. Inputs A : in Z[x], positive, primitive, squarefree, deg(A) > 0, gcd(A,A'')=1. I : either the null list () or a standard interval or an interval whose positive and non-positive parts are standard. k : a BETA-digit. Outputs L : a list (I_1,...,I_r) of binary rational isolating intervals I_j=(a_j,b_j) for the r distinct real roots of A if I=(), for the r distinct real roots of A in I if I /= (), with b_j - a_j <= 2^k. I_j is a left-open and right-closed interval if a_j /= b_j, a one-point interval if a_j=b_j. ===========================================================================*/ #include "saclib.h" Word IPRCHS(A,I,k) Word A,I,k; { Word J,L,L1,b,s,sp,spp,t; Step1: /* Find strong isolation list for A. */ L = NIL; L1 = IPSRM(A,I); if (L1 == NIL) goto Return; Step2: /* Refine isolation list. */ do { ADV(L1,&J,&L1); b = SECOND(J); if (IUPBRE(A,b) == 0) J = LIST2(b,b); else { IPRCNP(A,J,&sp,&spp,&J); t = RILC(J,k); if (t == 0) { s = sp * spp; J = IPRCN1(A,J,s,k); } } L = COMP(J,L); } while (L1 != NIL); L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/FPROD.c0000664002275300236100000001015514017255270013557 0ustar wcbrownscs/*====================================================================== FPROD(A,B,d,C) Floating-point product. Inputs A, B : floating-point numbers. d : a sign (rounding direction). C : an array large enough for the product. Output C : a floating-point number approximating the product of A and B. Let p_1 and p_2 be the respective precisions of A and B, P the maximum of p_1 and p_2. If d = -1, C is the greatest P-precision floating-point number less than or equal to the product. If d = +1, C is the least P-precision floating-point number greater than or equal to the product. If d = 0, C is the nearest P-precision floating-point number to the product (if two are equally near, the one with even mantissa is chosen). ======================================================================*/ #include "saclib.h" void FPROD(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit c2,e,f,i,j,p,P,s,sp,t; Word *D; Step1: /* Product zero. */ P = maxm(A[2],B[2]); if (A[1] == 0 || B[1] == 0) { C[1] = 0; C[2] = P; goto Return; } Step2: /* Small precisions. */ if (A[2] == 1) { if (B[2] == 1) { FPROD1(A,B,d,C); goto Return; } else if (B[2] == 2) { FPROD21(B,A,d,C); goto Return; } else goto Step3; } if (A[2] == 2) { if (B[2] == 2) { FPROD2(A,B,d,C); goto Return; } else if (B[2] == 1) { FPROD21(A,B,d,C); goto Return; } } Step3: /* Compute minimum precision, exponent and sign of product. */ f = 0; /* No array allocated. */ p = minm(A[2],B[2]); e = A[0] + B[0]; if (A[1] == B[1]) s = 1; else s = -1; Step4: /* Single precision multiplier. */ if (A[2] == 1 || B[2] == 1) { if (A[2] == 1) IPRODA(B+3,B[2],A+3,A[2],C+2); else IPRODA(A+3,A[2],B+3,B[2],C+2); C[1] = 0; goto Step8; } Step5: /* Compute short product. */ if (A[2] >= B[2]) { ISPROD(A+3,A[2],B+3,B[2],C+1); } else ISPROD(B+3,B[2],A+3,A[2],C+1); Step6: /* Full product needed? */ c2 = C[2]; if (C[P+2] >= BETA2) /* c is normalized. */ { if (d == 0) { if ( BETA2 - (p - 2) <= c2 && c2 < BETA2) goto Step7; } else if ( BETA - (p - 2) <= c2) goto Step7; } else /* c is not normalized. */ { if (c2 >= BETA2) /* Mask out high order bit of c2. */ c2 = c2 - BETA2; if (d == 0) { if ( BETA/4 - (p - 2) <= c2 && c2 < BETA/4) goto Step7; } else if ( BETA2 - (p - 2) <= c2) goto Step7; } goto Step8; Step7: /* Full product. */ f = 1; /* Array allocated. */ D = GETARRAY(p+P); IPRODA(A+3,A[2],B+3,B[2],D); for (i = 1; i <= P + 2; i++) C[i] = D[p+i-3]; Step8: /* Normalize result. */ if (C[P+2] < BETA2) { LSHIFT1(C+1,P+2); e = e - 1; } Step9: /* Read guard digits. */ if (C[2] > BETA2) sp = 3; else { if (C[2] == 0) sp = 0; else if (C[2] == BETA2) sp = 2; else sp = 1; if (sp != 1 && C[1] != 0) sp = sp + 1; } Step10: /* Determine sticky bit if needed. */ if ((d == s && sp == 0) || (d == 0 && sp == 2)) { i = 1; j = 1; while ((A[2+i] == 0 || B[2+j] == 0) && i + j < p) { if (A[2+i] == 0) i++; if (B[2+j] == 0) j++; } if (i + j >= p) t = 0; else t = 1; } else t = 0; Step11: /* Round up if needed. */ if ((d == s && (sp != 0 || t != 0)) || (d == 0 && (sp == 3 || (sp == 2 && (t != 0 || ODD(C[3])))))) { i = 3; while (i <= P + 2 && C[i] == BETA1) { C[i] = 0; i = i + 1; } if (i <= P + 2) C[i] = C[i] + 1; else { C[P+2] = BETA2; e = e + 1; } } Step12: /* Store exponent, sign and precision. */ C[0] = e; C[1] = s; C[2] = P; if (f != 0) FREEARRAY(D); Return: /* Return. */ return; } saclib2.2.8/src/AIPROD.c0000664002275300236100000000447114017255270013667 0ustar wcbrownscs/*======================================================================= AIPROD(A,B,C) Array integer product. Inputs A, B : integers in array representation. C : an array at least as long as the sum of the lengths of A and B plus 2. Effect The product of A and B is placed in C. ========================================================================*/ #include "saclib.h" void AIPROD(A,B,C) BDigit *A,*B,*C; { BDigit b,c,c0,c1,cp,i,j,k,m,n; BDigit *Ap,*Bp,*Cp; Step1: /* A or B zero. */ if (A[0] == 0 || B[0] == 0) { C[0] = 0; C[1] = 0; C[2] = 0; goto Return; } Step2: /* Let A' be the longer, B' the shorter. */ if (A[1] >= B[1]) { m = A[1]; n = B[1]; Ap = A + 2; Bp = B + 2; } else { m = B[1]; n = A[1]; Ap = B + 2; Bp = A + 2; } Step3: /* Multiply A' by the low order digit of B'. */ Cp = C + 2; b = Bp[0]; if (b == 1) { for (i = 0; i < m; i++) Cp[i] = Ap[i]; cp = 0; goto Step4; } else if (b == 2) { cp = 0; for (i = 0; i < m; i++) { c = (Ap[i] << 1) | cp; cp = c >> ZETA; Cp[i] = c & BETA1; } Cp[m] = cp; goto Step4; } else if (b == 3) { cp = 0; for (i = 0; i < m; i++) { c = (Ap[i] << 1) + Ap[i] + cp; cp = c >> ZETA; Cp[i] = c & BETA1; } Cp[m] = cp; goto Step4; } else if (b == 4) { cp = 0; for (i = 0; i < m; i++) { c = (Ap[i] << 2) | cp; cp = c >> ZETA; Cp[i] = c & BETA1; } Cp[m] = cp; goto Step4; } cp = 0; for (i = 0; i < m; i++) { DPR(Ap[i],b,&c1,&c0); c = c0 + cp; cp = c >> ZETA; Cp[i] = c & BETA1; cp = cp + c1; } Cp[m] = cp; Step4: /* Complete the product. */ for (j = 1; j < n; j++) { b = Bp[j]; k = j; cp = 0; for (i = 0; i < m; i++) { DPR(Ap[i],b,&c1,&c0); c = Cp[k] + c0 + cp; cp = c >> ZETA; Cp[k] = c & BETA1; cp = cp + c1; k++; } Cp[k] = cp; } Step5: /* Store the length and sign. */ if (cp != 0) C[1] = m + n; else C[1] = m + n - 1; if (A[0] == B[0]) C[0] = 1; else C[0] = -1; Return: /* Return. */ return; } saclib2.2.8/src/MDLCRA.c0000664002275300236100000000215414017255270013647 0ustar wcbrownscs/*====================================================================== L <- MDLCRA(m1,m2,L1,L2) Modular digit list chinese remainder algorithm. Inputs m1, m2 : positive BETA-integers, with gcd(m1,m2)=1 and ml=m1*m2 less than BETA. L1, L2 : lists of elements of z(m1) and z(m2) respectively. Outputs L : a list of all al in z(ml) such that al is congruent to al1 modulo m1 and al is congruent to al2 modulo m2 with al1 in L1 and al2 in L2. ======================================================================*/ #include "saclib.h" Word MDLCRA(m1,m2,L1,L2) Word m1,m2,L1,L2; { Word L,Lp1,Lp2,a,a1,a2,mp1; /* hide Lp1,Lp2,a,a1,a2,mp1; */ Step1: /* Compute. */ mp1 = MDINV(m2,m1); L = NIL; Lp1 = L1; while (Lp1 != NIL) { ADV(Lp1,&a1,&Lp1); Lp2 = L2; while (Lp2 != NIL) { ADV(Lp2,&a2,&Lp2); a = MDCRA(m1,m2,mp1,a1,a2); L = COMP(a,L); } } Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MAIPHM.c0000664002275300236100000000167014017255270013662 0ustar wcbrownscs/*====================================================================== B <- MAIPHM(r,m,A) Matrix of integral polynomials homomorphism. Inputs r : a BETA-digit, r >= 0. m : a BETA-digit, m > 0. A : a matrix over Z[X1,...,Xr]. Outputs B : a matrixover Z/(m)[X1,...,Xr], B = A (mod (m)). ======================================================================*/ #include "saclib.h" Word MAIPHM(r,m,A) Word r,m,A; { Word A1,A11,Ap,B,B1,B11; /* hide A1,A11,Ap; */ Step1: /* Compute. */ Ap = A; B = NIL; do { ADV(Ap,&A1,&Ap); B1 = NIL; do { ADV(A1,&A11,&A1); B11 = MPHOM(r,m,A11); B1 = COMP(B11,B1); } while (A1 != NIL); B1 = INV(B1); B = COMP(B1,B); } while (Ap != NIL); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPIISS.c0000664002275300236100000000243114017255270013703 0ustar wcbrownscs/*=========================================================================== L <- IPIISS(M,a,b,v1,v2) Integral polynomial isolating interval search using a Sturm sequence. Inputs M : a list (A_1,A_2,...,A_t) of integral univariate polynomials. M is a Sturm sequence for A_1. a, b : binary rational numbers. v1,v2 : integers. v1 = var(M,a). v2 = var(M,b) Outputs L : a list (I_1,...,I_r) of isolating intervals for the real roots of A1 in the interval (a,b]. I_1 < I_2 < ... < I_r. Each I_j is a left-open right-closed binary rational interval. ===========================================================================*/ #include "saclib.h" Word IPIISS(M,a,b,v1,v2) Word M,a,b,v1,v2; { Word L,L1,L2,m,v; Step1: /* Base case. */ if (v1 - v2 == 0) { L = NIL; goto Return; } else if (v1 - v2 == 1) { L = LIST1(LIST2(a,b)); goto Return; } Step2: /* Evaluate Sturm Sequence at midpoint. */ m = RNPROD(RNSUM(a,b),LIST2(1,2)); v = VAR(IPLEV(M,m)); Step3: /* Check left subinterval (a,m]. */ L1 = IPIISS(M,a,m,v1,v); Step4: /* Check right subinterval (m,b]. */ L2 = IPIISS(M,m,b,v,v2); Step5: /* Combine. */ L = CONC(L1,L2); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MAPRS.c0000664002275300236100000000213714017255270013570 0ustar wcbrownscs/*=========================================================================== MAPRS(p,A,B) Modular array polynomial remainder step. Inputs p : a prime BETA-digit. A,B : nonzero univariate polynomials over Z_p in array representation, with deg(A) >= deg(B). Effect: Let m = deg(A), n = deg(B), a = ldcf(A), b = ldcf(B). A is replaced by A - (a/b) x^{m-n} B. ===========================================================================*/ #include "saclib.h" void MAPRS(p,A,B) BDigit p; Word *A,*B; { BDigit a,b,c,i,k,m,n; Step1: /* If deg(B) = 0, set A to zero. */ if (MAPDEG(B) == 0) { A[-1] = 0; A[0] = 0; } Step2: /* Get degrees and leading coefficients. */ m = MAPDEG(A); n = MAPDEG(B); a = MAPLDCF(A); b = MAPLDCF(B); Step3: /* Compute c = a/b. */ c = MDQ(p,a,b); Step4: /* Subtract c x^{m-n} B from A. */ k = m - n; for (i = 0; i < n; i++) A[i+k] = MDDIF(p,A[i+k],MDPROD(p,c,B[i])); Step5: /* Update degree of A. */ m = m - 1; while (m >= 0 && A[m] == 0) m = m - 1; if (m < 0) m = 0; A[-1] = m; Return: /* Return. */ return; } saclib2.2.8/src/AFPQR.c0000664002275300236100000000303114017255270013551 0ustar wcbrownscs/*========================================================================== AFPQR(r,M,A,B; Q,R) Algebraic number field polynomial quotient and remainder. Inputs r : a BETA-digit, r >= 1. M : in Z[x], the minimal polynomial for an algebraic number alpha. A,B : in Q(alpha)[X1,...,Xr], B not zero. Outputs Q,R : in Q(alpha)[X1,...,Xr]. Q and R are the unique algebraic number field polynomials such that either B divides A, Q = A / B, and R = 0 or else B does not divide A and A = BQ+R with degree(R) minimal. ==========================================================================*/ #include "saclib.h" void AFPQR(r,M,A,B, Q_,R_) Word r,M,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,b,d,m,n,q,rp,s; Step1: /* Initialize. */ n = PDEG(B); b = PLDCF(B); Bp = PRED(B); Q = NIL; R = A; rp = r - 1; Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); if (rp == 0) { q = AFQ(M,a,b); s = 0; } else AFPQR(rp,M,a,b,&q,&s); if (s != 0) goto Step3; Q = COMP2(q,d,Q); Q1 = LIST2(d,q); Rp = PRED(R); Qp = AFPPR(r,M,Bp,Q1); R = AFPDIF(r,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/ILPDS.c0000664002275300236100000000402514017255270013557 0ustar wcbrownscs/*====================================================================== ILPDS(n,a,b; p,np) Integer large prime divisor search. Inputs n : in Z, n > 0, with no prime divisors less than 17. a, b : 1 <= a <= b <= n. Outputs p,np : A search is made for a divisor p of the integer n, with a <= p <= b. If such a p is found then n'=n/p, otherwise p=1 and n'=n. Remarks A modular version of fermats method is used, and the search goes from a to b. ======================================================================*/ #include "saclib.h" void ILPDS(n,a,b, p_,np_) Word n,a,b, *p_,*np_; { Word L,Lp,m,np,p,q,r,r1,r2,s,t,x,x1,x2,y,yp; /* hide Lp,m,r1,r2,s,t; */ Step1: /* Compute boundary values of xl. */ IQR(n,b,&q,&r); x1 = ISUM(b,q); IDQR(x1,2,&x1,&s); if (r != 0 || s != 0) x1 = ISUM(x1,1); q = IQ(n,a); x2 = ISUM(a,q); x2 = IDQ(x2,2); Step2: /* Compute and sort residue list. */ FRESL(n,&m,&L); L = LBIBMS(L); L = INV(L); Step3: /* Find starting residue. */ r = IDREM(x2,m); Lp = L; while (Lp != NIL && r < FIRST(Lp)) Lp = RED(Lp); if (Lp == NIL) { Lp = L; s = m; } else s = 0; ADV(Lp,&r1,&Lp); s = s + r - r1; x = IDIF(x2,s); Step4: /* Test successive values of xl. */ while (ICOMP(x,x1) >= 0) { yp = IDIF(IPROD(x,x),n); ISQRT(yp,&y,&t); if (t == 0) { p = IDIF(x,y); np = ISUM(x,y); goto Return; } if (Lp != NIL) { ADV(Lp,&r2,&Lp); s = r1 - r2; } else { ADV(L,&r2,&Lp); s = m + r1 - r2; } r1 = r2; x = IDIF(x,s); } Step5: /* No divisor found. */ p = 1; np = n; Return: /* Prepare for return. */ *p_ = p; *np_ = np; return; } saclib2.2.8/src/NORMSQHL.c0000664002275300236100000000336114017255270014151 0ustar wcbrownscs/*=========================================================================== NORMSQHL(N,p,q,F,&A,&B,&S,&T) Norm polynomial single-precision quadratic Hensel lifting. Inputs N : in Z[x], the norm of a polynomial A[alpha,x] in Z[alpha][x], where alpha is an algebraic number. N is squarefree. p : an odd medium prime. q : a single-precision power of p. F : a list of pairs ((d_1,F_1),...,,(d_s,F_s)). Let M be the minimal polynomial of alpha, and let M_1 * ... * M_s be a complete factorization of M (mod p). Then d_i = deg(M_i) and F_i is a list of the distinct monic irreducible factors N_i = res_t(M_i(t),A(t,x)) (mod p). Outputs A : a list of pairs ((d_1,A_1),...,(d_s,A_s)). Let F_i = (f_1,...,f_k). Then A_i = (g_1,...,g_k), where g_i is an element of Z/(q)[x] and f_j = H_p(g_k). Let a_1,...,a_r be all the elements of the lists A_1,...,A_s. Then the monic associate of N is congruent to a_1*...*a_r. B : a list (b_1,...b_{r-1}) of elements of Z/(q)[x] such that N is congruent to a_1 * ... * a_i * b_i. S : a list (s_1,...,s_{r-1}) of elements of Z/(q)[x]; T : a list (t_1,...,t_{r-1}) of elements of Z/(q)[x]; such that a_i*s_i + b_i*t_i = 1, deg(t_i) < deg(a_i). ===========================================================================*/ #include "saclib.h" void NORMSQHL(N,p,q,F,A_,B_,S_,T_) Word N,p,q,F, *A_,*B_,*S_,*T_; { Word A,Ap,B,G,S,T; Step1: /* Form a single list from the elements of the F_i. */ G = NORMFL(F); Step2: /* Lift. */ IUPSQHLL(p,q,G,N,&Ap,&B,&S,&T); Step3: /* Regroup the elements of Ap. */ A = NORMRL(F,Ap); Return: /* Prepare for return. */ *A_ = A; *B_ = B; *S_ = S; *T_ = T; } saclib2.2.8/src/AFUPSR.c0000664002275300236100000000134414017255270013705 0ustar wcbrownscs/*====================================================================== s <- AFUPSR(M,I,A,c) Algebraic number field univariate polynomial, sign at a rational point. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Q(alpha)[x]. c : in Q. Outputs s : a BETA-digit, s = sign(A(c)). ======================================================================*/ #include "saclib.h" Word AFUPSR(M,I,A,c) Word M,I,A,c; { Word a,b,s; /* hide s; */ Step1: /* Compute the sign. */ a = AFFRN(c); b = AFPEMV(1,M,A,a); s = AFSIGN(M,I,b); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/AFUSPSFB.c0000664002275300236100000000135114017255270014114 0ustar wcbrownscs/*====================================================================== B <- AFUSPSFB(M,A) Algebraic number field univariate squarefree polynomial squarefree basis. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A : a list (A1,...,An), n >= 0, Ai is monic, squarefree, of positive degree. Outputs B : a list of polynomials in Q(alpha)[x], a coarsest squarefree basis for A. ======================================================================*/ #include "saclib.h" Word AFUSPSFB(M,A) Word M,A; { Word B; Word Ap,A1; Step1: B = NIL; Ap = A; while (Ap != NIL) { ADV(Ap,&A1,&Ap); B = AFUPSFBA(M,A1,B); } goto Return; Return: return(B); } saclib2.2.8/src/RNDWRITE.c0000664002275300236100000000320414017255270014140 0ustar wcbrownscs/*====================================================================== RNDWRITE(R,n) Rational number decimal write. Inputs R : a rational number. n : a non-negative BETA-digit. Side effects R is approximated by a decimal fraction d with n decimal digits following the decimal point and d is written in the output stream. The inaccuracy of the approximation is at most (1/2)*10^-n. If abs(d) is greater than abs(R) then the last digit is followed by a minus sign, if abs(d) is less than abs(R) then by a plus sign. ======================================================================*/ #include "saclib.h" void RNDWRITE(R,n) Word R,n; { Word A,B,D,F,M,d,i,s,t; /* hide B,d,i,s,t; */ Step1: /* Compute approximation. */ if (R == 0) { A = 0; B = 1; } else FIRST2(R,&A,&B); s = ISIGNF(A); if (s < 0) A = INEG(A); M = IEXP(10,n); A = IPROD(A,M); IQR(A,B,&D,&F); F = IDPR(F,2); if (F == 0) t = 0; else { t = ICOMP(B,F); if (t == 0) t = 1; else if (t < 0) D = ISUM(D,1); } Step2: /* Convert and write. */ if (s < 0) CWRITE('-'); IQR(D,M,&D,&F); IWRITE(D); CWRITE('.'); for (i = 1; i <= n; i++) { F = IDPR(F,10); IQR(F,M,&d,&F); CWRITE(d + '0'); } if (t > 0) CWRITE('+'); else if (t < 0) CWRITE('-'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPFSFB.c0000664002275300236100000000156014017255270013656 0ustar wcbrownscs/*====================================================================== B <- IPFSFB(r,A) Integral polynomial finest squarefree basis. Inputs r : a BETA-digit, r >= 1. A : a list (A1,...,An), n >= 0, Ai in Z[X1,...,Xr], Ai positive, primitive, and of positive degree in its main variable. Outputs B : a list of polynomials in Z[X1,...,Xr], a finest squarefree basis for A. ======================================================================*/ #include "saclib.h" Word IPFSFB(r,A) Word r,A; { Word B,B1,Bs,L; Step1: /* Get coarsest squarefree basis for A. */ Bs = IPCSFB(r,A); Step2: /* Factor each basis element. */ B = NIL; while (Bs != NIL) { ADV(Bs,&B1,&Bs); L = ISFPF(r,B1); B = CONC(L,B); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MMAPQR.c0000664002275300236100000000312514017255270013701 0ustar wcbrownscs/*=========================================================================== MMAPQR(p,A,B,Q) Medium modulus array polynomial quotient and remainder. Inputs m : a medium BETA-digit. A,B : in Z/(m)[x], A and B are in array representation. A, B non-zero, and ldcf(B) is a unit. Q : an array large enough to contain the quotient of A modulo B. Side effects The quotient of A modulo B is computed and put in Q. The remainder of A modulo B is put into the array A. ===========================================================================*/ #include "saclib.h" void MMAPQR(m,A,B,Q) Word m,*A,*B,*Q; { Word a,b,bp,c,d,e,i,k,q; Step1: /* deg(B) = 0. */ d = MAPDEG(A); e = MAPDEG(B); b = MAPLDCF(B); if (e == 0) { bp = MDINV(m,b); for (i = 0; i <= d; i++) { q = (MAPCF(A,i) * bp) % m; MAPCF(Q,i) = q; } MAPDEG(Q) = d; MAPDEG(A) = 0; MAPCF(A,0) = 0; goto Return; } Step2: /* deg(A) < deg(B) */ if (d < e) { MAPDEG(Q) = 0; MAPCF(Q,0) = 0; goto Return; } Step3: /* deg(A) >= deg(B) > 0, compute quotient and remainder. */ k = d - e + 2; bp = MDINV(m,b); for (k = d - e; k >= 0; k--) { q = (bp * MAPCF(A,e+k)) % m; MAPCF(Q,k) = q; if (q != 0) for (i = e + k - 1; i >= k; i--) { c = (q * MAPCF(B,i-k)) % m; a = MAPCF(A,i); a = MDDIF(m,a,c); MAPCF(A,i) = a; } } MAPDEG(Q) = d - e; Step4: /* Determine degree of remainder. */ i = e - 1; while (MAPCF(A,i) == 0 && i > 0) i--; MAPDEG(A) = i; Return: /* Prepare for return. */ return; } saclib2.2.8/src/PCPV.c0000664002275300236100000000153314017255270013455 0ustar wcbrownscs/*=========================================================================== B <- PCPV(r,A,i,j) Polynomial cyclic permutation of variables. Inputs r : an element of Z. r >= 2. A : an element of R[x_1,...,x_r] i : 1 <= i <= r. j : i < j <= r. Outputs B : an element of R[x_1,...,x_r]. B(x_1,...,x_r) = A(x_1,...,x_{i-1},x_j,x_i,...,x_{j-1},x_{j+1},...,x_r) = A(x_p(1),...,x_p(r)), where p = (i,i+1,...,j)^{-1} ===========================================================================*/ #include "saclib.h" Word PCPV(r,A,i,j) Word r,A,i,j; { Word B; Word B1; Step1: /* (i,...,j)^{-1} = (i,...,j-1)^{-1}(j,j-1). */ B1 = PTV(r,A,j); if (j == i + 1) { B = B1; goto Return; } else B = PCPV(r,B1,i,j - 1); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/GCAGET.c0000664002275300236100000000100514017255270013631 0ustar wcbrownscs/*====================================================================== a <- GCAGET(A,i) Garbage collected array get element. Inputs A : a GCA handle. i : a BETA-digit. Outputs a : a Word, the i-th element of the array referenced by A (with 0 being the index of the first element). ======================================================================*/ #include "sactypes.h" extern GCArray *GCASPACEBp; Word GCAGET(A,i) Word A,i; { return(GCASPACEBp[(A)].array[(i)]); } saclib2.2.8/src/RNBCR.c0000664002275300236100000000402214017255270013547 0ustar wcbrownscs/*====================================================================== RNBCR(A,B; M,N,k) Rational number binary common representation. Inputs A,B : binary rational numbers. Outputs M,N,k : If A = 0 and B = 0, then M = N = k = 0. If A = 0 and B /= 0, then M = 0 and N and k are the unique integers such that B = N * 2^k with N odd. If B = 0 and A /= 0, then N = 0 and M and k are the unique integers such that A = M * 2^k with M odd. If A /= 0 and B /= 0, then M,N, and k are the unique integers such that A = M * 2^k and B = N * 2^k with at least one of M and N odd. ======================================================================*/ #include "saclib.h" void RNBCR(A,B, M_,N_,k_) Word A,B, *M_,*N_,*k_; { Word A2,B2,M,N,e1,e2,k; /* hide A2,B2,e1,e2,k; */ Step1: /* Express both A and B as odd integer times power of 2. */ if (A == 0) M = 0; else { FIRST2(A,&M,&A2); if (A2 == 1) { e1 = IORD2(M); M = IDP2(M,e1); } else e1 = -IORD2(A2); } if (B == 0) { N = 0; e2 = 0; } else { FIRST2(B,&N,&B2); if (B2 == 1) { e2 = IORD2(N); N = IDP2(N,e2); } else e2 = -IORD2(B2); } Step2: /* Obtain common power of 2. */ if (A == 0) { k = e2; goto Return; } else if (B == 0) { k = e1; goto Return; } if (e1 <= e2) { N = IMP2(N,e2 - e1); k = e1; } else { M = IMP2(M,e1 - e2); k = e2; } Return: /* Prepare for return. */ *M_ = M; *N_ = N; *k_ = k; return; } saclib2.2.8/src/RED.c0000664002275300236100000000056514017255270013323 0ustar wcbrownscs/*====================================================================== Lp <- RED(L) Reductum 1. Inputs L : list of length 1 or more. Outputs Lp : the first reductum of L. ======================================================================*/ #include "sactypes.h" extern Word *SPACEB; Word RED(L) Word L; { return(SPACEB[L]); } saclib2.2.8/src/AMSIGNIR.c0000664002275300236100000000402514017255270014115 0ustar wcbrownscs/*====================================================================== AMSIGNIR(M,I,b; s,J) Algebraic module sign, interval refinement. Inputs M : the minimal integral polynomial of a real algebraic number alpha. I : an acceptable isolating interval for alpha. b : an element of Z[alpha]. Outputs s : sign(b). J : an acceptable isolating interval for alpha that is a subinterval of I. ======================================================================*/ #include "saclib.h" void AMSIGNIR(M,I,b, s_,J_) Word M,I,b; Word *s_,*J_; { Word s,J; Word bs,bsp,h,k,kp,t,tp,u,v,w; Step1: /* b rational. */ if (b == 0) { s = 0; J = I; goto Return; } if (PDEG(b) == 0) { s = ISIGNF(PLDCF(b)); J = I; goto Return; } Step2: /* alpha rational. */ FIRST2(I,&u,&v); w = RNDIF(v,u); if (w == 0) { s = IUPBES(b,u); J = I; goto Return; } Step3: /* Compute the transformed polynomial, bs, such that the roots of bs in (0,1) correspond to the roots of b in I. */ RNFCL2(w,&k,&kp); if (k == 0) bs = b; else bs = IUPBHT(b,k); if (u != 0) { h = RNQ(u,w); bs = IUPTR(bs,RNNUM(h)); } Step4: /* Obtain an isolating interval, J, for alpha containing no roots of b and evaluate the sign of b at its bisection point. */ t = IUPBES(M,v); J = I; do { FIRST2(J,&u,&v); w = RIB(u,v); bsp = IUPTR1(PRT(bs)); if (IUPVAR(bsp) == 0 && PORD(bsp) == 0) { s = IUPBES(b,w); goto Return; } bs = IUPBHT(bs,-1); tp = IUPBES(M,w); if (t * tp < 0 || t == 0) { u = w; bs = IUPTR1(bs); } else { v = w; t = tp; } J = LIST2(u,v); } while (1); Return: *s_ = s; *J_ = J; return; } saclib2.2.8/src/HIPIR.c0000664002275300236100000000404714017255270013563 0ustar wcbrownscs/*====================================================================== HIPIR(n,A,I,t,h,k; J,j) Hardware interval polynomial interval refinement. Inputs n : a positive beta-digit. A : a hardware interval polynomial of degree n containing a real polyunomial a(x) of degree n. I : an open hardware isolating interval for a simple root \alpha of a(x). I is of the form (a/2^h,(a+1)/2^h) for some integer h <= k. t : the trend of \alpha. h : the beta-integer described above. k : a beta-integer, k <= 52, such that 1/2^k is the width of a desired refined isolating interval for \alpha, h < k. Outputs J : a hardware sub-interval of I that is an isolating interval for \alpha. Either J is an open interval [b/2^j,(b+1)/2^j] for some integer j, h <= j <= k, the largest j that can be achieved using bisections and interval arithmetic evaluations of A(x), or else J is a one-point interval [b/2^j,b/2^j]. j : the beta-integer described above. Remark HIPIR is floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" void HIPIR(n,A,I,t,h,k,J_,j_) BDigit n; interval A[],I; BDigit t,h,k; interval *J_; BDigit *j_; { interval J; BDigit j,s; double a,b,c,w; Step1: /* Set FPCATCH. */ FPCATCH(); Step2: /* Initialize width, w. */ a = I.left; b = I.right; w = b - a; j = h; Step3: /* Evaluate at midpoint. */ c = a + w / 2; s = HIPFES(n,A,c); Step4: /* Indeterminate sign. */ if (s == NIL || FPCHECK() == 1) { b = a + w; goto Step8; } Step5: /* Root found. */ if (s == 0) { a = c; b = c; j = j + 1; goto Step8; } Step6: /* Bisect interval. */ if (s != t) a = c; w = w / 2; j = j + 1; Step7: /* Test for completion. */ if (j < k) goto Step3; b = a + w; Step8: /* Compose J. */ J.left = a; J.right = b; Step9: /* Reset FPCATCH. */ if (FPCHECK() == 1) { j = h; FPCATCH(); } Return: /* Return J and j. */ *J_ = J; *j_ = j; return; } saclib2.2.8/src/RNINV.c0000664002275300236100000000123614017255270013601 0ustar wcbrownscs/*====================================================================== S <- RNINV(R) Rational number inverse. Inputs R : a non-zero rational number. Outputs S : 1/R. ======================================================================*/ #include "saclib.h" Word RNINV(R) Word R; { Word R1,R2,S,S1,S2; /* hide S; */ Step1: /* Compute. */ FIRST2(R,&R1,&R2); if (ISIGNF(R1) > 0) { S1 = R2; S2 = R1; } else { S1 = INEG(R2); S2 = INEG(R1); } S = LIST2(S1,S2); Return: /* Prepare for return. */ return(S); } saclib2.2.8/src/CSFPAR.c0000664002275300236100000000143014017255270013657 0ustar wcbrownscs/*====================================================================== C <- CSFPAR(L) Characteristic set from partition. Inputs L : a list of non-negative BETA-digits (l1,...,ln). Outputs C : a characteristic set, with j belonging to C if and only if there is a subset I of the integers from 1 to n such that the sum of all li with i in I equals j. ======================================================================*/ #include "saclib.h" Word CSFPAR(L) Word L; { Word C,D,Lp,l; /* hide Lp,l; */ Step1: /* Compute. */ C = 1; Lp = L; while (Lp != NIL) { ADV(Lp,&l,&Lp); D = IMP2(C,l); C = CSUN(C,D); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/ISCSELT.c0000664002275300236100000000151414017255270014012 0ustar wcbrownscs/*=========================================================================== t <- ISCSELT(i,C) Test for characteristic set membership. Inputs i : a BETA-digit. C : a characteristic set. Output t : 0 or 1. If i is an element of C, then t = 1. Otherwise t = 0. ===========================================================================*/ #include "saclib.h" Word ISCSELT(i,C) Word i,C; { Word D,d,j,t; Step1: /* Single precision. */ if (C < BETA) { if (i >= ZETA) t = 0; else t = (C >> i) & 1; goto Return; } Step2: /* Multiprecision. */ D = C; j = i; while (j >= ZETA && D != NIL) { j = j - ZETA; D = RED(D); } if (D == NIL) t = 0; else { d = FIRST(D); t = (d >> j) & 1; } Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/RNPROD.c0000664002275300236100000000254714017255270013717 0ustar wcbrownscs/*====================================================================== T <- RNPROD(R,S) Rational number product. Inputs R,S : rational numbers. Outputs T : R * S. ======================================================================*/ #include "saclib.h" Word RNPROD(R,S) Word R,S; { Word D1,D2,R1,R2,Rb1,Rb2,S1,S2,Sb1,Sb2,T,T1,T2; /* hide R1,R2,S1,S2,T; */ Step1: /* R=0 or S=0. */ if (R == 0 || S == 0) { T = 0; goto Return; } Step2: /* Obtain numerators and denominators. */ FIRST2(R,&R1,&R2); FIRST2(S,&S1,&S2); Step3: /* R and S integers. */ if (R2 == 1 && S2 == 1) { T1 = IPROD(R1,S1); T = LIST2(T1,1); goto Return; } Step4: /* R or S an integer. */ if (R2 == 1) { IGCDCF(R1,S2,&D1,&Rb1,&Sb2); T1 = IPROD(Rb1,S1); T = LIST2(T1,Sb2); goto Return; } if (S2 == 1) { IGCDCF(S1,R2,&D2,&Sb1,&Rb2); T1 = IPROD(Sb1,R1); T = LIST2(T1,Rb2); goto Return; } Step5: /* General case. */ IGCDCF(R1,S2,&D1,&Rb1,&Sb2); IGCDCF(S1,R2,&D2,&Sb1,&Rb2); T1 = IPROD(Rb1,Sb1); T2 = IPROD(Rb2,Sb2); T = LIST2(T1,T2); Return: /* Prepare for return. */ return(T); } saclib2.2.8/src/PTRCF.c0000664002275300236100000000112714017255270013562 0ustar wcbrownscs/*=========================================================================== C <- PTRCF(A) Polynomial trailing coefficient. Input A : in R[x], where R is a ring. Output C : in R, the trailing coefficient of A. ===========================================================================*/ #include "saclib.h" Word PTRCF(A) Word A; { Word Ap,C,k; Step1: /* A = 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* A != 0. */ Ap = A; do PADV(Ap,&k,&C,&Ap); while (Ap != 0); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/DLINIT.c0000664002275300236100000000334314017255270013671 0ustar wcbrownscs/*===================================================================== DLINIT(p,n; F,G,A,B,C) Discrete logarithm initialization of tables. Inputs p : a prime beta digit. n : a beta digit, n >= 1, such that p^n is a beta digit. Outputs F : A monic irreducible polynomial of degree n over Z_p in array representation defining a field GF(p^n). G : A polynomial over Z_p in array representation that is a generator of GF(p^n). A : an array of q = p^n beta digits. A[0] = 0 and for 0 < i < q, A[i] = (G^i)(p), where G is a generator of GF(p^n). B : an array of q beta digits such that B[i] = j if and only if A[j] = i. C : an array of q beta digits. For 0 <= i < q, i is the discrete logarithm of some a in GF(p^n) and C[i] is the discrete logarithm of a + 1 in GF(p^n). Additional effect p^n - 1 is assigned to the global variable FFSIZE and C is assigned to the global variable FFPLUS1. =======================================================================*/ #include "saclib.h" void DLINIT(p,n,Fp,Gp,A,B,C) BDigit p,n; BDigit **Fp,**Gp,**A,**B,**C; { BDigit a,q; Word F; Step1: /* n = 1. */ if (n == 1) { F = LIST2(1,1); *Fp = MAPFMUP(F); a = PFFGEN(p); *Gp = MAPFMUP(LIST2(0,a)); *A = PFFAP(p,a); *B = INVPERM(p,*A); *C = PFFAP1(p,*A,*B); goto Step3; } Step2: /* n > 1. */ F = MPFFDP(p,n); *Fp = MAPFMUP(F); *Gp = MPFFGEN(p,*Fp); q = IEXP(p,n); *A = MPFFAP(p,*Fp,*Gp); *B = INVPERM(q,*A); *C = MPFFAP1(p,q,*A,*B); Step3: /* Initialize global variables. */ FFSIZE = IEXP(p,n) - 1; FFPLUS1 = *C; Return: /* Return F, G, A, B and C. */ return; } saclib2.2.8/src/SIPIR.c0000664002275300236100000000331714017255270013575 0ustar wcbrownscs/*====================================================================== J <- SIPIR(A,I,t,k) Software interval polynomial interval refinement. Inputs A : a software interval polynomial of positive degree n containing a real polynomial a(x) of degree n. I : an open or one-point standard logarithmic binary rational isolating interval for a simple root alpha of a(x). t : the trend of alpha. k : a BETA-integer. Output J : a standard logarithmic binary rational sub-interval of I that is an isolating interval for alpha. If the width of I is less than or equal to 2^k, then J = I. Otherwise J is either a one-point interval or else the width of J is either 2^k or else wider but as small as could be achieved. ======================================================================*/ #include "saclib.h" Word SIPIR(A,I,t,k) Word *A,I; BDigit t,k; { Word a,b,*C,c,J,s; BDigit h,m,p,q; Step1: /* Decompose. */ FIRST2(I,&a,&b); Step2: /* Width of interval. */ if (EQUAL(a,b) == 1) goto Step6; else h = LSILW(I); Step3: /* Allocate midpoint. */ p = 1; C = GETARRAY(p+3); Step4: /* Bisect as needed. */ while (h > k) { c = LSIM(a,b); m = ILOG2(FIRST(c)) + ZETA - 1; q = m / ZETA; if (q > p) { FREEARRAY(C); C = GETARRAY(q+3); p = q; } LBRNFEC(c,q,C); s = SIPES(A,C); if (s == NIL) goto Step5; if (s == 0) { a = c; b = c; goto Step5; } if (s == t) b = c; else a = c; h--; } Step5: /* Free midpoint. */ FREEARRAY(C); Step6: /* Compose. */ J = LIST2(a,b); Return: /* Return. */ return(J); } saclib2.2.8/src/RNRED.c0000664002275300236100000000126214017255270013556 0ustar wcbrownscs/*=========================================================================== R <- RNRED(A,B) Rational number reduction to lowest terms. Inputs A,B : integers, B non-zero. Outputs R : the rational number A/B in canonical form. ===========================================================================*/ #include "saclib.h" Word RNRED(A,B) Word A,B; { Word Ab,Bb,C,R; Step1: /* Compute. */ if (A == 0) { R = 0; goto Return; } C = IGCD(A,B); Ab = IEQ(A,C); Bb = IEQ(B,C); if (ISIGNF(B) < 0) { Ab = INEG(Ab); Bb = INEG(Bb); } R = LIST2(Ab,Bb); Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/ANREPE.c0000664002275300236100000000231114017255270013652 0ustar wcbrownscs/*====================================================================== b <- ANREPE(M,A,B,t) Algebraic number represent element of a primitive extension. Inputs M : in Z[x]. The minimal polynomial for an algebraic number gamma. gamma = alpha + t*beta is a primitive element for the multiple extension Q(alpha,beta). A : in Z[x]. A(x) is the minimal polynomial for an algebraic number alpha. B : in Z[x]. B(x) is the minimal polynomial for an algebraic number beta. t : in Z. gamma = alpha + t*beta is a primitive element. Outputs b : an element of Q(gamma). b = beta. ======================================================================*/ #include "saclib.h" Word ANREPE(M,A,B,t) Word M,A,B,t; { Word b; Word Ap,Ab,Bp,Bb,P,C; Step1: /* Construct A(gamma - ty). */ P = PBIN(PMON(-t,0),1,PMON(1,1),0); Ap = IPGSUB(1,A,2,LIST1(P)); Ap = RPFIP(2,Ap); Ap = AFPCR(1,Ap); Bp = PINV(1,B,1); Bp = RPFIP(2,Bp); Bp = AFPCR(1,Bp); Step2: /* Compute gcd. */ AFUPGC(M,Ap,Bp,&C,&Ab,&Bb); Step3: /* Set b to - trailing coef. of C. */ b = FOURTH(C); b = AFNEG(b); Return: return(b); } saclib2.2.8/src/LBRNIEEEE.c0000664002275300236100000000363314017255270014202 0ustar wcbrownscs/*====================================================================== LBRNIEEEE(A; t,F,n) Logarithmic binary rational number to IEEE exact conversion. Input A : a logarithmic binary rational number. Outputs t : a BETA-digit, 0, 1 or 2. t = 0 indicates successful conversion. t = 1 indicates failure due to exponent limitation. t = 2 indicates failure due to manti8ssa limitation. F : if t = 0, F is the result of the conversion. n : If t = 0, n is the number of trailing zero bits in the mantissa of F. ======================================================================*/ #include "saclib.h" void LBRNIEEEE(A, t_,F_,n_) Word A; BDigit *t_; ieee *F_; BDigit *n_; { BDigit a1,a2,ap,e,eb,h,k,kp,m0,m1,mt,n,s,t; Word a; ieee F; Step1: /* A = 0. */ if (A == 0) { t = 0; F.num = 0.0; n = 52; goto Return; } Step2: /* Extract numerator and exponent of denominator. */ FIRST2(A, &a,&h); Step3: /* a single-precision. */ if (a >= BETA) goto Step4; if (a < 0) { s = 1; a = - a; } else s = 0; k = PDLOG2(a); kp = ZETA - k; a2 = (a << kp) - BETA2; m1 = a2 >> 8; mt = a2 & 255; m0 = mt << 24; n = 53 - k; e = k - h; goto Step5; Step4: /* a double-precision. */ a1 = FIRST(a); a2 = SECOND(a); if (a2 < 0) { a2 = - a2; a1 = - a1; s = 1; } else s = 0; k = PDLOG2(a2); if (k > 24) { n = 0; t = 2; goto Return; } kp = ZETA - k; ap = a1 >> k; a1 = (a1 << kp) & BETA1; a2 = (a2 << kp) | ap; m1 = (a2 - BETA2) >> 8; mt = a2 & 255; m0 = (mt << 24) | (a1 >> 5); n = 24 - k; e = ZETA + k - h; Step5: /* Construct IEEE double. */ eb = e + BIAS - 1; if (eb < 1) { t = 1; goto Return; } F.rep.sign = s; F.rep.exp = eb; F.rep.mant_h = m1; F.rep.mant_l = m0; t = 0; Return: /* Return t, F and n. */ *t_ = t; *F_ = F; *n_ = n; return; } saclib2.2.8/src/PTRLENGTH.c0000664002275300236100000000077014017255270014256 0ustar wcbrownscs/*====================================================================== n <- PTRLENGTH(L) Length. (Assumes elements of L are pointers) Inputs L : list (of pointers) Outputs n : the length of L, i.e. # of pointers represented in L. ======================================================================*/ #include "saclib.h" Word PTRLENGTH(L) Word L; { #if __WORDSIZE == 64 return LENGTH(L)/4; #else /* Assumes 32-bit pointers. */ return LENGTH(L)/2; #endif } saclib2.2.8/src/PLBCF.c0000664002275300236100000000127014017255270013531 0ustar wcbrownscs/*====================================================================== a <- PLBCF(r,A) Polynomial leading base coefficient. Inputs A : in R[X1,...,Xr], R a ring. r : a BETA-digit, r >= 0. Outputs a : in R, the leading base coefficient of A. ======================================================================*/ #include "saclib.h" Word PLBCF(r,A) Word r,A; { Word a,i; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) a = 0; else { a = A; for (i = 1; i <= r; i++) { a = PLDCF(a); } } Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/AGIMU.c0000664002275300236100000000150314017255270013544 0ustar wcbrownscs/*======================================================================= AGIMU(A,k,B) Array Gaussian integer multiplication by a unit. Inputs A : a non-zero array Gaussian integer. k : a BETA digit, 0 <= k <= 3. B : an array large enough for i^k * A. Effect i^k * A is placed in B. ========================================================================*/ #include "saclib.h" void AGIMU(A,k,B) BDigit **A,k,**B; { BDigit *B1,*B2,*B3; Step1: /* Copy, then fix signs and pointers. */ AGICOPY(A,B); B1 = B[0]; B2 = B[1]; if (k == 2) { B1[0] = - B1[0]; B2[0] = - B2[0]; } else if (k != 0) { B3 = B1; B1 = B2; B2 = B3; if (k == 1) B1[0] = - B1[0]; else B2[0] = - B2[0]; } B[0] = B1; B[1] = B2; Return: /* Return. */ return; } saclib2.2.8/src/RNDDWRITE.c0000664002275300236100000000264314017255270014252 0ustar wcbrownscs/*====================================================================== RNDDWRITE(R,n,t) Rational number directed decimal write. Inputs R : a rational number. n : a non-negative BETA-digit. t : +1 or -1, an BETA-digit. Side effects R is approximated by a decimal fraction d with n decimal digits following the decimal point and d is written in the output stream. The inaccuracy of the approximation is less than 10^{-n}. If t = -1 then d <= R; if t = +1 then d >= R. If |d| > |R| the last digit is followed by a '-'; and if |d| < |R| it is followed by a '+'. ======================================================================*/ #include "saclib.h" void RNDDWRITE(R,n,t) Word R,n,t; { Word A,B,D,F,G,M,d,i,s; Step1: /* Compute decimal approximation. */ if (R == 0) { A = 0; B = 1; } else FIRST2(R,&A,&B); s = ISIGNF(A); if (s < 0) A = INEG(A); M = IEXP(10,n); A = IPROD(A,M); IQR(A,B,&D,&F); if (F != 0 && s == t) D = ISUM(D,1); Step2: /* Convert and write. */ if (s < 0) CWRITE('-'); IQR(D,M,&D,&G); IWRITE(D); CWRITE('.'); for (i = 1; i <= n; i++) { G = IDPR(G,10); IQR(G,M,&d,&G); CWRITE(d + '0'); } if (F != 0) { if (s != t) CWRITE('+'); else CWRITE('-'); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPBHT.c0000664002275300236100000000175214017255270013556 0ustar wcbrownscs/*=========================================================================== B <- IPBHT(r,A,i,k) Integral polynomial binary homothetic transformation. Inputs r : A BETA-digit. r >= 0. A : an element of Z[x_1,...,x_r]. i : 1 <= i <= r. k : a BETA-digit. Outputs B : an element of Z[x_1,...,x_r]. B(x_1,...,x_i,...,x_r) = 2^{-h}A(x_1,...,x_{i-1},2^kx_i,x_{i+1},...,x_r), where h is uniquely determined so that B is an integral polynomial not divisible by 2. ===========================================================================*/ #include "saclib.h" Word IPBHT(r,A,i,k) Word r,A,i,k; { Word B; Word At,Bt; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i = 1. */ if (i == 1) { B = IPBHTLV(r,A,k); goto Return; } Step3: /* i > 1. */ At = PCPV(r,A,1,i); Bt = IPBHTLV(r,At,k); B = PICPV(r,Bt,1,i); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFUPRRI.c0000664002275300236100000000307314017255270014016 0ustar wcbrownscs/*====================================================================== Js <- AFUPRRI(M,I,A,B,J,s1,t1) Algebraic number field univariate polynomial relative real root isolation. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. A,B : in Q(alpha)[x]. J : a left open, right closed interval (a1,a2) where a1 and a2 are binary rational numbers with a1 < a2. A and B have unique roots, r1 and r2 respectively, in J, each of odd multiplicity and with r1 not equal r2. s1,t1 : BETA-digits, s1 = sign(A(a1+)) and t1 = sign(B(a1+)). Outputs Js : a left-open, right closed interval. Js = (as1,as2) is a subinterval of J with as1 and as2 binary rational numbers and as1 < as2, such that Js contains r1 but not r2. ======================================================================*/ #include "saclib.h" Word AFUPRRI(M,I,A,B,J,s1,t1) Word M,I,A,B,J,s1,t1; { Word Js,a,as1,as2,s,t,u,v; /* hide s,t,u,v; */ Step1: /* Initialize. */ FIRST2(J,&as1,&as2); Step2: /* Bisect. */ a = RIB(as1,as2); s = AFUPSR(M,I,A,a); if (s == 0) s = -s1; t = AFUPSR(M,I,B,a); if (t == 0) t = -t1; u = s1 * s; v = t1 * t; if (u > 0) as1 = a; else as2 = a; if (u == v) goto Step2; Step3: /* Construct Js. */ Js = LIST2(as1,as2); Return: /* Prepare for return. */ return(Js); } saclib2.2.8/src/MIPPR.c0000664002275300236100000000111314017255270013566 0ustar wcbrownscs/*====================================================================== C <- MIPPR(r,M,A,B) Modular integral polynomial product. Inputs M : in Z, M > 0. A, B : in Z/(M)[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs C : in Z/(M)[X1,...,Xr], C = A * B. ======================================================================*/ #include "saclib.h" Word MIPPR(r,M,A,B) Word r,M,A,B; { Word C; Step1: /* Compute. */ C = MIPHOM(r,M,IPPROD(r,A,B)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPVDEG12.c0000664002275300236100000000216214017255270014025 0ustar wcbrownscs/*=========================================================================== IPVDEG12(r,A; k,B) Integral polynomial variable of degree 1 or 2. Inputs r : a BETA-digit, the number of variables, r >= 1. A : in Z[x_1,...,x_r], A non-zero. Outputs k : a BETA-digit. If there is an i, 1 <= i < r, such that the degree of A in x_i is 1 or 2, then k = the largest such i. Otherwise, k = 0. B : in Z[x_1,...,x_r]. If k > 0 then B(x_1,...,x_r) = A(x_1,...,x_{k-1},x_{k+1},...,x_r,x_k), otherwise B = 0. ===========================================================================*/ #include "saclib.h" void IPVDEG12(r,A, k_,B_) Word r,A, *k_,*B_; { Word k,B,V,d; Step1: /* Initialize. */ k = B = 0; Step2: /* Get degree vector. */ V = PDEGV(r,A); Step3: /* Search for minor variable of degree 1 or 2. */ k = r; V = RED(V); while (V != NIL) { ADV(V,&d,&V); k--; if (d == 1 || d == 2) { B = PICPV(r,A,k,r); goto Return; } } k = 0; Return: /* Prepare for return. */ *k_ = k; *B_ = B; return; } saclib2.2.8/src/ANIIPE.c0000664002275300236100000000754514017255270013663 0ustar wcbrownscs/*====================================================================== ANIIPE(M,I,N,J,t,L; S,k,K) Algebraic number isolating interval for a primitive element. Input: M : in Z[x], the minimal polynomial for an algebraic number alpha. I : a binary rational isolating interval for alpha which is either left-open and right-closed or a one-point interval. N : in Z[x], the minimal polynomial of a real algebraic number beta. J : a binary rational isolating interval for beta which is either left-open and right-closed or a one-point interval. t : in Z, Q(alpha + t * beta) = Q(alpha,beta). L : a list of elements of Z[x]. If degree(M) = 1 and degree(N) = 1, then L = (P), where P is primitive, positive, and of degree 1. If degree(M) = 1, degree(N) > 1, then L = (N). If degree(M) > 1, degree(N) = 1, then L = (M),. If degree(M) > 1, degree(N) > 1, then L = a nonempty list of positive irreducible univariate integral polynomials exactly one of which has alpha + t * beta as a root. Output: S : in Z[x]. k : a BETA-digit. K : a binary rational interval. If degree(M) = 1 and degree(N) = 1, then S = P, k = 1, K = a binary rational isolating interval for the real root of P which is either left-open and right-closed or a one-point interval. If degree(M) = 1, degree(N) > 1, then S = N, k = 1, K = J. If degree(M) > 1, degree(N) = 1, then S = M, k = 1, K = I. If degree(M) > 1, degree(N) > 1, then S = the element of L having alpha + t * beta as a root, k = the index of S in L, K = a left-open, right-closed binary rational isolating interval for alpha + t * beta as a root of S. ======================================================================*/ #include "saclib.h" void ANIIPE(M,I,N,J,t,L, S_,k_,K_) Word M,I,N,J,t,L, *S_,*k_,*K_; { Word Jp,Js,K,L1,Lp,S,a,b,c,cs,d,ds,e,k,kp,m,n,s1,s2,sp,tp,v, vp; /* hide L1,Lp,cs,ds,k,kp,m,n,s1,s2,sp,v,vp; */ Step1: /* M or N has degree 1. */ k = 1; m = PDEG(M); n = PDEG(N); if (m == 1 && n == 1) { S = FIRST(L); K = IPRIM(S); K = FIRST(K); goto Return; } if (m == 1) { S = N; K = J; goto Return; } if (n == 1) { S = M; K = I; goto Return; } Step2: /* Initialization. */ FIRST2(I,&a,&b); s1 = IUPBES(M,b); Jp = J; FIRST2(J,&c,&d); s2 = IUPBES(N,d); tp = RNINT(t); Step3: /* Make new interval. */ Js = RIRNP(Jp,tp); FIRST2(Js,&cs,&ds); K = LIST2(RNSUM(a,cs),RNSUM(b,ds)); Step4: /* Test for real roots of each Li in current interval. */ v = 0; kp = 0; Lp = L; S = 0; do { ADV(Lp,&L1,&Lp); kp = kp + 1; vp = IUPVOI(L1,K); if (vp > 1) goto Step5; if (vp == 1) if (v == 1) goto Step5; else { v = 1; S = L1; k = kp; } } while (!(Lp == NIL)); goto Return; Step5: /* Bisect isolating intervals for alpha and beta. */ e = RIB(a,b); sp = IUPBES(M,e); if (sp * s1 < 0) a = e; else { b = e; s1 = sp; } e = RIB(c,d); sp = IUPBES(N,e); if (sp * s2 < 0) c = e; else { d = e; s2 = sp; } Jp = LIST2(c,d); goto Step3; Return: /* Prepare for return. */ *S_ = S; *k_ = k; *K_ = K; return; } saclib2.2.8/src/IFLTA.c0000664002275300236100000000417714017255270013553 0ustar wcbrownscs/*=========================================================================== IFLTA(A,B,b; Bp,n,s,o) Integer from list to array. Input A : integer. B : array of b words. b : positive BETA-digit. Output Bp : (pointer to an) array representation of |A|. If n <= b B is used for Bp; otherwise a new array is allocated. n : the BETA-length of A, i.e. n = floor(log_BETA(|A|)) + 1 (if A /= 0); n = 0 if A = 0. s : s = sign(A), o : the BETA-order of A, i.e. the largest integer k such that BETA^k divides A (if A /= 0); o = 0 if A = 0. ===========================================================================*/ #include "saclib.h" void IFLTA(A,B,b,Bp_,n_,s_,o_) Word A,*B,b,**Bp_,*n_,*s_,*o_; { Word a,bp,i,n,o,s; Word Ap,*Bp,*Bpp; Step1: /* Initialize Bp. */ Bp = B; Step2: /* A = 0. */ if (A == 0) { n = 0; Bp[0] = 0; s = 0; o = 0; goto Return; } Step3: /* A non-zero BETA-digit. */ if (A < BETA) { n = 1; if (A < 0) { Bp[0] = -A; s = -1; } else { Bp[0] = A; s = 1; } o = 0; goto Return; } Step4: /* Initialize for copying. */ s = 0; n = 0; bp = b; Ap = A; Step5: /* Copy trailing zeros, determine sign and BETA-order. */ do { a = FIRST(Ap); if (a < 0) { s = -1; a = -a; } else if (a > 0) s = 1; Bp[n] = a; n = n + 1; Ap = RED(Ap); } while (s == 0 && n < bp); o = n - 1; Step6: /* Copy remaining digits. */ if (s == 1) while (Ap != NIL && n < bp) { a = FIRST(Ap); Bp[n] = a; n = n + 1; Ap = RED(Ap); } else while (Ap != NIL && n < bp) { a = -FIRST(Ap); Bp[n] = a; n = n + 1; Ap = RED(Ap); } Step7: /* Allocate sufficiently large array. Resume copying. */ if (Ap != NIL) { bp = n + LENGTH(Ap); Bpp = GETARRAY(bp); for (i = 0; i < n; i++) Bpp[i] = Bp[i]; Bp = Bpp; if (s == 0) goto Step5; else goto Step6; } Return: /* Prepare for return. */ *Bp_ = Bp; *n_ = n; *o_ = o; *s_ = s; return; } saclib2.2.8/src/AFPSUM.c0000664002275300236100000000254214017255270013701 0ustar wcbrownscs/*=========================================================================== C <- AFPSUM(r,A,B) Algebraic number field polynomial sum. Inputs r : a non-negative BETA-digit. A,B : in Q(alpha)[x_1,...,x_r]. Outputs C : in Q(alpha)[x_1,...,x_r], C = A + B. ===========================================================================*/ #include "saclib.h" Word AFPSUM(r,A,B) Word r,A,B; { Word Ap,Bp,C,Cp,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r = 0. */ if (r == 0) { C = AFSUM(A,B); goto Return; } Step3: /* Match coefficients. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); Cp = COMP2(b,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = AFSUM(a,b); else c = AFPSUM(rp,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step4: /* Finish. */ if (Ap == NIL) Ap = Bp; if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SMFMI.c0000664002275300236100000000106614017255270013561 0ustar wcbrownscs/*====================================================================== B <- SMFMI(M,A) Symmetric modular from modular integer. Inputs M : a positive integer. A : an element of Z_M. Outputs B : an element of Z'_M with B = A (modulo M). ======================================================================*/ #include "saclib.h" Word SMFMI(M,A) Word M,A; { Word B; Step1: /* Compute. */ B = IDIF(A,M); if (ICOMP(A,INEG(B)) <= 0) B = A; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MPFFAP.c0000664002275300236100000000201014017255270013645 0ustar wcbrownscs/*======================================================================= A <- MPFFAP(p,F,G) Medium prime finite field array of powers. Inputs p : a medium prime. F : an irreducible monic polynomial over Z_p in array representation defining a finite field GF(p^n), p^n < beta. G : a generator for GF(p^n) in array representation. Output A : Let n = deg(F). A is an array of q = p^n beta-integers. A[0] = 0 and for 0 < i < q, A[i] = G^i(p). G^i is evaluated in Z, not in Z_p. =======================================================================*/ #include "saclib.h" BDigit *MPFFAP(p,F,G) BDigit p,*F,*G; { BDigit *A,*H,*K,i,n,q; Step1: /* Compute q and get array. */ n = MAPDEG(F); q = IEXP(p,n); A = GETARRAY(q); Step2: /* Compute array elements. */ A[0] = 0; H = MAPCOPY(G); A[1] = MAPSEV(H,p); for (i = 2; i < q; i++) { K = MPFFPROD(p,F,H,G); MAPFREE(H); H = K; A[i] = MAPSEV(H,p); } MAPFREE(H); Return: /* Return A. */ return(A); } saclib2.2.8/src/AFUPQR.c0000664002275300236100000000245714017255270013711 0ustar wcbrownscs/*=========================================================================== AFUPQR(M,A,B; Q,R) Algebraic number field univariate polynomial quotient and remainder. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. A,B : in Q(alpha)[y], B != 0. Outputs Q,R : in Q(alpha)[y]. If B divides A, then Q = B / A and R = 0. Otherwise, Q and R are the unique algebraic number field univariate polynomials such that A = B*Q+R, with deg(R) minimal. ===========================================================================*/ #include "saclib.h" void AFUPQR(M,A,B, Q_,R_) Word M,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,b,bp,d,m,n,q,s; Step1: /* Initialize. */ n = PDEG(B); b = PLDCF(B); Bp = PRED(B); Q = NIL; R = A; bp = AFINV(M,b); Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); q = AFPROD(M,a,bp); s = 0; if (s != 0) goto Step3; Q = COMP2(q,d,Q); Q1 = LIST2(d,q); Rp = PRED(R); Qp = AFPPR(1,M,Bp,Q1); R = AFPDIF(1,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/MIPISE.c0000664002275300236100000000205114017255270013667 0ustar wcbrownscs/*====================================================================== MIPISE(r,M,D,A,B,S,T,C; U,V) Modular integral polynomial mod ideal, solution of equation. Inputs r : a BETA-digit, r >= 1. M : in Z, M > 0. D : a list (d1,...,d_{r-1}), with di BETA-digits, di >= 0. A,B,S,T : in Z/(M)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}), with A monic, deg_Y(A) > 0, and A*S + B*T = 1. C : in Z/(M)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}), Outputs U,V : in Z/(M)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}),such that A*U+B*V = C, and deg_Y(V) < deg_Y(A). ======================================================================*/ #include "saclib.h" void MIPISE(r,M,D,A,B,S,T,C, U_,V_) Word r,M,D,A,B,S,T,C, *U_,*V_; { Word Q,U,V,W,Y,Z; Step1: /* Compute. */ W = MIPIPR(r,M,D,T,C); MMPIQR(r,M,D,W,A,&Q,&V); Y = MIPIPR(r,M,D,S,C); Z = MIPIPR(r,M,D,B,Q); U = MIPSUM(r,M,Y,Z); Return: /* Prepare for return. */ *U_ = U; *V_ = V; return; } saclib2.2.8/src/IPPOWREAD.c0000664002275300236100000000244414017255270014241 0ustar wcbrownscs/*====================================================================== IPPOWREAD(r,V; A,t) Integral polynomial power read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : in Z[X1,...,Xr], with variables in V. t : 1 if successful, 0 otherwise. ======================================================================*/ #include "saclib.h" void IPPOWREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,e,i,t; /* hide C,i,t; */ Step1: /* Setup. */ t = 1; A = PFBRE(r,1); Step2: /* Read in a factor. */ IPFACTREAD(r,V,&A1,&t); if (t == 0) goto Return; Step3: /* Read in an optional exponent. */ C = CREADB(); if (C != '^') { BKSP(); e = 1; } else { C = CREADB(); if (!DIGIT(C)) { SWRITE("Error IPPOWREAD: Digit was expected.\n"); goto Step5; } BKSP(); e = IREAD(); if (e >= BETA) { SWRITE("Error IPPOWREAD: Exponent is too big.\n"); goto Step5; } } Step4: /* Carry out the exponentiation. */ for (i = 1; i <= e; i++) A = IPPROD(r,A,A1); goto Return; Step5: /* Error exit. */ DIELOC(); t = 0; Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/FSUMDEOS2.c0000664002275300236100000001111014017255270014204 0ustar wcbrownscs/*====================================================================== FSUMDEOS2(A,B,d,C) Floating-point sum, different exponents, opposite signs, exponent difference of 2 or more. Inputs A, B : two nonzero floating-point numbers having the same precisions and opposite signs. The exponent of A is two or more greater than the exponent of B. d : a sign (rounding direction). C : an array large enough for the sum. Output C : a floating-point number approximating the sum of A and B, rounded according to IEEE standards. Note: If d is the difference of the exponents, the probability that a normalizing shift is required is 3 / 2^{d + 1}. ======================================================================*/ #include "saclib.h" void FSUMDEOS2(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit a,b,c,cb,e,ep,f,g,i,p,q,r,rp,s,t,z; Step1: /* Get exponent, sign and precision. */ e = A[0]; s = A[1]; p = A[2]; Step1_1: /* Initialize carry. */ c = 0; Step2: /* Determine input shift amount. */ ep = A[0] - B[0]; if (ep < ZETA) { q = 0; r = ep; } else { q = ep / ZETA; r = ep - q * ZETA; } rp = ZETA - r; Step2_1: /* No subtracting? */ if (q >= p) { for (i = 3; i <= p + 2; i++) C[i] = A[i]; goto Step5; } Step2_2: /* Subtract B from A. */ if (q == 0) { cb = A[p+2] - (B[p+2] >> r); if (cb < BETA2) { e = e - 1; z = ZETA - 1; f = 0; for (i = 3; i <= p + 1; i++) { a = A[i] - ((B[i] >> r) | ((B[i+1] << rp) & BETA1)) + c; if (a < 0) { a = a + BETA; c = -1; } else c = 0; C[i] = ((a << 1) & BETA1) | f; f = a >> z; } a = cb + c; C[p+2] = ((a << 1) & BETA1) | f; goto Step4; } else { for (i = 3; i <= p + 1; i++) { a = A[i] - ((B[i] >> r) | ((B[i+1] << rp) & BETA1)) + c; if (a < 0) { a = a + BETA; c = -1; } else c = 0; C[i] = a; } a = cb + c; C[p+2] = a; goto Step3; } } else { for (i = q + 3; i <= p + 1; i++) { a = (B[i] >> r) | ((B[i+1] << rp) & BETA1); a = A[i-q] - a + c; if (a < 0) { a = a + BETA; c = -1; } else c = 0; C[i-q] = a; } a = A[p-q+2] - (B[p+2] >> r) + c; if (a < 0) { a = a + BETA; c = -1; } else c = 0; C[p-q+2] = a; } Step2_3: /* Propagate carry and copy. */ for (i = p - q + 3; i <= p + 2; i++) { a = A[i] + c; if (a < 0) { a = a + BETA; c = -1; } else c = 0; C[i] = a; } Step3: /* Normalize. */ if (C[p+2] >= BETA2) goto Step5; z = ZETA - 1; for (i = p + 2; i >= 4; i--) C[i] = ((C[i] << 1) & BETA1) | (C[i-1] >> z); C[3] = ((C[3] << 1) & BETA1); e = e - 1; Step4: /* Subtract high-order bit of remainder from C. */ if (r == 0) { r = ZETA - 1; q = q - 1; } else r = r - 1; rp = ZETA - r; b = (B[q+3] >> r) & 1; if (b == 0) goto Step5; C[3] = C[3] - 1; for (i = 3; C[i] < 0; i++) { C[i] = BETA1; C[i+1] = C[i+1] - 1; } Step5: /* Compute high-order BETA-digit of remainder. */ if (d == s) goto Step8; if (q == 0) g = (B[3] << rp) & BETA1; else if (q < p) g = ((B[q+3] << rp) & BETA1) | (B[q+2] >> r); else if (q == p) g = B[p+2] >> r; else g = 0; Step6: /* Rounding decision. */ if (d == s) goto Step8; if (d == -s && g != 0) goto Step7; if (d == 0) { if (g < BETA2) goto Step8; if (g > BETA2) goto Step7; } t = 0; if (q > p) t = 1; else if (q > 0 && (((B[q+2] << rp) & BETA1) != 0)) t = 1; else for (i = q + 1; i >= 3; i--) { if (B[i] != 0) t = 1; } if (d == -s) { if (t != 0) goto Step7; else goto Step8; } if (d == 0 ) { if (t != 0) goto Step7; else { if ((C[3] & 1) == 0) goto Step8; else goto Step7; } } Step7: /* Round down. */ i = 3; C[i] = C[i] - 1; while (C[i] < 0) { C[i] = BETA1; i++; C[i] = C[i] - 1; } if (C[p+2] < BETA2) { C[p+2] = BETA1; e = e - 1; } Step8: /* Store exponent, sign and precision. */ C[0] = e; C[1] = s; C[2] = p; Return: ;/* Return. */ } saclib2.2.8/src/IPRRIRDB.c0000664002275300236100000000203514017255270014120 0ustar wcbrownscs/*==================================================================== L <- IPRRIRDB(A,k) Integral polynomial real root isolation and refinement, Descartes, bisection. Inputs A: in Z[x], squarefree. k: a BETA-integer. Output L: a list (I_1,...,I_r) of open and one-point logarithmic standard isolating intervals for the real roots of A having widths of 2^{k} or less, I_1 < I-2 < ... < I_r. =====================================================================*/ #include "saclib.h" Word IPRRIRDB(A,k) Word A,k; { Word I,J,L,M,n,t,u; Step1: /* Compute a list, M, of isolating intervals. */ M = IPRRID(A); Step2: /* Compute the trend, t, of the first interval. */ n = PDEG(A); t = ISIGNF(PLDCF(A)); if (EVEN(n) == 1) t = -t; Step3: /* Compute a list, L, of refined intervals. */ L = NIL; u = t; while (M != NIL) { ADV(M,&I,&M); J = IPIIRB(A,I,u,k); L = COMP(J,L); u = - u; } L = INV(L); Return: /* Return L. */ return(L); } saclib2.2.8/src/HIPFES.c0000664002275300236100000000433114017255270013662 0ustar wcbrownscs/*====================================================================== s <- HIPFES(n,A,a) Hardware interval polynomial floating point evaluation of sign. Inputs n : a BETA-digit. A : in HI[X]. A is of degree n. a : a double. Output s : s = sign(A(a)) if this can be determined using floating- point arithmetic with directed rounding. Otherwise s = NIL. Warning HIPFES does not test for exponent overflow or underflow. Remark Step 1 computes a lower bound for A(a); Step 3 computes an upper bound for A(a) if the lower bound is <= 0. In each of these steps A(a) is evaluated as B(-a), where B(x) = A(-x), in case a < 0. ======================================================================*/ #include "saclib.h" Word HIPFES(n,A,a) BDigit n; interval A[]; double a; { Word s; BDigit i,t; double c,d,e; Step1: /* Compute lower bound for A(a). */ rounddown(); c = a; if (c > 0) { d = A[n].left; for (i=n-1;i>=0;i--) { d = d * c; d = d + A[i].left; } } else { c = -c; if (EVEN(n)) { d = A[n].left; t = 1; } else { d = -A[n].right; t = -1; } for (i=n-1;i>=0;i--) { d = d * c; t = -t; if (t == 1) d = d + A[i].left; else d = d - A[i].right; } } Step2: /* Lower bound positive? */ if (d > 0) { s = 1; goto Return; } Step3: /* Compute upper bound for A(a). */ roundup(); c = a; if (c > 0) { e = A[n].right; for (i=n-1;i>=0;i--) { e = e * c; e = e + A[i].right; } } else { c = -c; if (EVEN(n)) { e = A[n].right; t = 1; } else { e = -A[n].left; t = -1; } for (i=n-1;i>=0;i--) { e = e * c; t = -t; if (t == 1) e = e + A[i].right; else e = e - A[i].left; } } Step4: /* Upper bound negative? */ if (e < 0) { s = -1; goto Return; } Step5: /* Both bounds zero? */ if (d == 0 && e == 0) s = 0; else s = NIL; Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/RUPWRITE.c0000664002275300236100000000227114017255270014166 0ustar wcbrownscs/*=========================================================================== RUPWRITE(A,v) Rational univariate polynomial write. Inputs A : in Q[x]. v : a variable. Side effects The rational polynomial A is written in the output stream in recursive format using the variable v. ===========================================================================*/ #include "saclib.h" void RUPWRITE(A,v) Word A,v; { Word Ap,e,a,n1,p1; Step1: /* A = 0 */ if (A == 0) { CWRITE('0'); goto Return; } Step2: /* Initialize. */ Ap = A; n1 = RNINT(-1); p1 = RNINT(1); CWRITE('('); Step3: /* Write coefficient */ FIRST2(Ap,&e,&a); if (EQUAL(a,n1) && e > 0) { CWRITE('-'); goto Step4; } if (EQUAL(a,p1) && e > 0) { if (A != Ap) CWRITE('+'); goto Step4; } if (RNSIGN(a) > 0 && A != Ap) CWRITE('+'); RNWRITE(a); Step4: /* Write variable and exponent */ if (e > 0) VWRITE(v); if (e > 1) { CWRITE('^'); AWRITE(e); } Ap = RED2(Ap); if (Ap != NIL) goto Step3; Step5: /* Close. */ CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPRIST.c0000664002275300236100000000171314017255270013717 0ustar wcbrownscs/*=========================================================================== L <- IPRIST(A) Integral polynomial real root isolation using a Sturm sequence. Inputs A : in Z[X], non-zero, squarefree. Outputs L : a list (I_1,...,I_r) of isolating intervals for all of the real roots of A with I_1 < I_2 < ... < I_r. Each I_j is a left-open right-closed binary rational interval. ===========================================================================*/ #include "saclib.h" Word IPRIST(A) Word A; { Word L,Ap,Ab,S,b,v_1,v_2; Step1: /* Compute primitive Sturm sequence. */ Ab = IPIPP(1,A); Ap = IPIPP(1,IPDMV(1,Ab)); S = IPPNPRS(Ab,Ap); Step2: /* Compute root bound. */ b = IUPRB(Ab); Step3: /* Search for isolating intervals. */ v_1 = VAR(IPLEV(S,RNNEG(b))); v_2 = VAR(IPLEV(S,b)); L = IPIISS(S,RNNEG(b),b,v_1,v_2); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/GINQ.c0000664002275300236100000000121114017255270013434 0ustar wcbrownscs/*====================================================================== q = GINQ(a,b) Gaussian integer nearest quotient. Inputs a, b : Gaussian integers, b /= 0. Output q : the nearest quotient to a / b, a Gaussian integer. ======================================================================*/ #include "saclib.h" Word GINQ(a,b) Word a,b; { Word ap,ap1,ap2,bp,c,q1,q2,q; Step1: /* Compute. */ bp = GICONJ(b); ap = GIPROD(a,bp); c = GINORM(b); FIRST2(ap, &ap1,&ap2); q1 = INQ(ap1,c); q2 = INQ(ap2,c); if (q1 == 0 && q2 == 0) q = 0; else q = LIST2(q1,q2); Return: /* return q. */ return(q); } saclib2.2.8/src/AFPSIP.c0000664002275300236100000000267314017255270013675 0ustar wcbrownscs/*====================================================================== AFPSIP(I,A,p,B) Algebraic field polynomial to software interval polynomial. Inputs I : a standard logarithmic binary rational interval containing an algebraic number \alpha. A : a univariate polynomial of positive degree over the algebraic number field Q(\alpha). Each nonzero coefficient of A is represented by a pair (r,a) where r is a rational number and a is an integral polynomial of degree less than the degree of \alpha. Let n be the degree of A. p : a positive BETA-digit. B : an array of size at least 2(n + 1)(p + 3) + 1. Effect A software interval polynomial of precision p containing A(x) is placed in B. ======================================================================*/ #include "saclib.h" void AFPSIP(I,A,p,B) Word I,A; BDigit p,*B; { BDigit *Ip,i,m,q1,q2,s; Word a,Ap; Step1: /* Compute parameters. */ m = PDEG(A); q1 = p + 3; q2 = q1 + q1; s = (m + 1) * q2 + 1; B[0] = m; Step2: /* Convert isolating interval to floating point. */ Ip = GETARRAY(q2); LBRISI(I,p,Ip); Step3: /* Convert and evaluate coefficients. */ Ap = A; for (i = m; i >= 0; i--) { s = s - q2; if (Ap == NIL || PDEG(Ap) < i) ISI(0,p,B + s); else { Ap = RED(Ap); ADV(Ap,&a,&Ap); ANSI(Ip,a,B + s); } } Return: /* Return. */ FREEARRAY(Ip); return; } saclib2.2.8/src/FIRST5.c0000664002275300236100000000122014017255270013652 0ustar wcbrownscs/*=========================================================================== FIRST5(L; a1,a2,a3,a4,a5) First 5. Inputs L : list of length 5 or more. Outputs a1, a2, a3, a4, a5 : the first five elements of L. ===========================================================================*/ #include "saclib.h" void FIRST5(L, a1_,a2_,a3_,a4_,a5_) Word L, *a1_,*a2_,*a3_,*a4_,*a5_; { Word Lp,a1,a2,a3,a4,a5; Step1: /* Compute. */ ADV3(L,&a1,&a2,&a3,&Lp); ADV2(Lp,&a4,&a5,&Lp); Return: /* Prepare for return. */ *a1_ = a1; *a2_ = a2; *a3_ = a3; *a4_ = a4; *a5_ = a5; return; } saclib2.2.8/src/NORMFAC.c0000664002275300236100000000151314017255270013770 0ustar wcbrownscs/*=========================================================================== L <- NORMFAC(M,A,N) Norm polynomial factorization. Inputs M : in Z[t], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[x]. The norm of A is squarefree, and deg(A) >= 2. N : in Z[x], the norm of A. Outputs L : a list (N_1,...,N_r) of the positive irreducible factors of N. ===========================================================================*/ #include "saclib.h" Word NORMFAC(M,A,N) Word M,A,N; { Word C,F,G,L,p; Step1: /* Compute modular factorization. */ NORMMF(M,A,N,&p,&F,&C,&G); if (p == 0) { L = LIST1(N); goto Return; } Step2: /* Hensel lifting with early factor detection. */ L = NORMHLEFD(N,PDEG(M),p,F,C,G); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MDINV.c0000664002275300236100000000137714017255270013570 0ustar wcbrownscs/*=========================================================================== b <- MDINV(m,a) Modular digit inverse. Inputs m : a positive BETA-digit, m > 1. a : a unit of Z_m, a BETA-digit. Output b : a^{-1}, the inverse of a in Z_m, a BETA-digit. ===========================================================================*/ #include "saclib.h" Word MDINV(m,a) Word m,a; { Word a1,a2,a3,b,q,v1,v2,v3; Step1: /* Compute. */ a1 = m; a2 = a; v1 = 0; v2 = 1; while (a2 != 1) { q = a1 / a2; a3 = a1 - q * a2; v3 = v1 - q * v2; a1 = a2; a2 = a3; v1 = v2; v2 = v3; } if (v2 >= 0) b = v2; else b = v2 + m; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/IPRAN.c0000664002275300236100000000241214017255270013553 0ustar wcbrownscs/*=========================================================================== A <- IPRAN(r,k,q,N) Integral polynomial, random. Inputs r : BETA-digit r >= 0. k : a positive BETA-digit. q : in Q, q = q1/q2 with 0 < q1 <= q2 < BETA. N : a list (n_r,...,n_1) of non-negative BETA-digits. Outputs A : in Z[X1,...,Xr], a random integral polynomial with deg_i(A) <= n_i for 1 <= i <= r. Max norm of A < 2^k and q is the probability that any particular term of A has a non-zero coefficient. ===========================================================================*/ #include "saclib.h" Word IPRAN(r,k,q,N) Word r,k,q,N; { Word A,Np,a,d,e,n,q1,q2,qs,rp,t; Step1: /* Compute qs=int(q*BETA). */ FIRST2(q,&q1,&q2); DQR(q1,0,q2,&qs,&t); Step2: /* r=0. */ if (r == 0) { d = DRANN(); if (d < qs) A = IRAND(k); else A = 0; goto Return; } Step3: /* r > 0. */ rp = r - 1; ADV(N,&n,&Np); A = NIL; for (e = 0; e <= n; e++) { if (rp == 0) { d = DRANN(); if (d < qs) a = IRAND(k); else a = 0; } else a = IPRAN(rp,k,q,Np); if (a != 0) A = COMP2(e,a,A); } if (A == NIL) A = 0; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/MPINT.c0000664002275300236100000000362614017255270013601 0ustar wcbrownscs/*=========================================================================== As <- MPINT(p,B,b,bp,r,A,A1) Modular polynomial interpolation. Inputs p : a prime BETA-digit. B : in Z/(p)[x_1]. b : in Z/(p), such that B(b) /= 0. bp : in Z/(p), such that bp = B(b)^(-1). r : a BETA-digit, r >= 1. A : in Z/(p)[x_1,...,x_r] with A = 0 or the degree of A in x_1 less than the degree of B. A1 : in Z/(p)[x_2,...,x_r]. Outputs As : in Z/(p)[x_1,...,x_r], the unique polynomial such that As(x_1,...,x_r) is congruent to A(x_1,...,x_r) modulo B(x_1), As(b,x_2,...,x_r) = A1(x_2,...,x_r) and the degree of As in x_1 is less than or equal to the degree of B. ===========================================================================*/ #include "saclib.h" Word MPINT(p,B,b,bp,r,A,A1) Word p,B,b,bp,r,A,A1; { Word Ap,Ap1,As,a,a1,as,c,d,e,e1,es,n,rp; Step1: /* Deg(B) = 0. */ n = PDEG(B); if (n == 0) { As = PINV(r - 1,A1,1); goto Return; } Step2: /* r = 1. */ if (r == 1) { a = MPEMV(1,p,A,b); d = MDDIF(p,A1,a); if (d == 0) As = A; else { c = MDPROD(p,d,bp); As = MPSUM(1,p,MPMDP(1,p,c,B),A); } goto Return; } Step3: /* r > 1. */ As = NIL; rp = r - 1; if (A == 0) Ap = NIL; else Ap = A; if (A1 == 0) Ap1 = NIL; else Ap1 = A1; while (Ap != NIL || Ap1 != NIL) { if (Ap == NIL) { a = 0; ADV2(Ap1,&es,&a1,&Ap1); } else if (Ap1 == NIL) { a1 = 0; ADV2(Ap,&es,&a,&Ap); } else { e = PDEG(Ap); e1 = PDEG(Ap1); es = MAX(e,e1); a = 0; a1 = 0; if (e == es) ADV2(Ap,&e,&a,&Ap); if (e1 == es) ADV2(Ap1,&e1,&a1,&Ap1); } as = MPINT(p,B,b,bp,rp,a,a1); As = COMP2(as,es,As); } if (As == NIL) As = 0; else As = INV(As); Return: /* Prepare for return. */ return(As); } saclib2.2.8/src/IPDWRITE.c0000664002275300236100000000264014017255270014134 0ustar wcbrownscs/*=========================================================================== IPDWRITE(r,A,V) Integral polynomial distributive write. Input r : a non-negative BETA-integer. A : in Z[x_1,...,x_r]. V : a list of at least r distinct variables. Side effects A is written out to the output stream using the first r variables in V. ===========================================================================*/ #include "saclib.h" void IPDWRITE(r,A,V) Word r,A,V; { Word Ap,E,Ep,Vp,a,e,l,s,t,v; Step1: /* r=0 or A=0. */ Ap = DIPFP(r,A); if (r == 0 || Ap == 0) { IWRITE(Ap); goto Return; } l = 1; Step2: /* General case. */ do { ADV2(Ap,&a,&E,&Ap); s = ISIGNF(a); a = IABSF(a); if (s > 0 && l == 0) CWRITE('+'); if (s < 0) CWRITE('-'); if (a != 1) { if (l == 0) CWRITE(' '); IWRITE(a); t = 1; } else t = 0; Ep = CINV(E); Vp = V; do { ADV(Ep,&e,&Ep); ADV(Vp,&v,&Vp); if (e > 0) { if (l == 0 || t == 1) CWRITE(' '); VWRITE(v); t = 1; } if (e > 1) { CWRITE('^'); AWRITE(e); } } while (Ep != NIL); if (t == 0) { if (l == 0) CWRITE(' '); CWRITE('1'); } if (Ap == NIL) goto Return; CWRITE(' '); l = 0; } while (1); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPICPP.c0000664002275300236100000000144214017255270013670 0ustar wcbrownscs/*====================================================================== IPICPP(r,A; a,Ab) Integral polynomial integer content and primitive part. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr]. Outputs a : in Z, the integer content of A. Ab : in Z[X1,...,Xr], Ab = A/a if A is non-zero and Ab = 0 otherwise. ======================================================================*/ #include "saclib.h" void IPICPP(r,A, a_,Ab_) Word r,A, *a_,*Ab_; { Word Ab,a; /* hide Ab; */ Step1: /* Compute. */ if (A == 0) { a = 0; Ab = 0; } else { a = IPIC(r,A); Ab = IPIQ(r,A,a); } Return: /* Prepare for return. */ *a_ = a; *Ab_ = Ab; return; } saclib2.2.8/src/IUPBREA.c0000664002275300236100000000451114017255270013773 0ustar wcbrownscs/*============================================================================= IUPBREA(A,C,m,t,k,B,M; p,s) Integral univariate polynomial binary rational evaluation - array version. Inputs A : a univariate integral polynomial. C : an array. C,m,t together specify an integer c. If c is non-zero, C contains |c|. m : the BETA-length of c. t : the sign of c. k : a non-negative BETA-digit. B : an array of length >= 2*M. M : a positive BETA-digit, M > the BETA-length of any intermediate result in Horner's scheme. The inequality is strict because subprograms IPRODAP and IMPBAA require an array that might be 1 BETA-digit longer than the result. One may choose M = deg(A) * max(m,ILOGB(2^k)) + ILOGB(IPSUMN(A)) + 1. Effect The program computes b = 2^(k*deg(A)) * A(c/2^k). If b is non-zero, B contains the integer |b|. Output p : the BETA-length of b. s : the sign of b. ==============================================================================*/ #include "saclib.h" void IUPBREA(A,C,m,t,k,B,M, p_,s_) Word A,*C,m,t,k,*B,M,*p_,*s_; { BDigit d,e1,e2,i,j,n,o,p,q,r,s,u; Word a1,a2,Ap,*Bp; Step1: /* A = 0. */ if (A == 0) { p = 0; s = 0; goto Return; } Step2: /* c = 0. */ if (t == 0) { if (PORD(A) != 0) { p = 0; s = 0; } else IFLTA(PTRCF(A),B,M,&B,&p,&s,&o); goto Return; } Step3: /* Put leading coefficient into result array. */ ADV2(A,&e1,&a1,&Ap); IFLTA(a1,B,M,&B,&p,&s,&o); if (ODD(e1) && t < 0) s = -s; Step4: /* Coefficient array. */ Bp = B + M; Step5: /* Horner steps. */ n = e1; while (Ap != NIL) { ADV2(Ap,&e2,&a2,&Ap); for (i = 1; i <= e1 - e2; i++) IPRODAP(B,p,C,m,&p); d = k * (n - e2); q = d / ZETA; r = d - q * ZETA; IFLTA(a2,Bp,M,&Bp,&j,&u,&o); IRLSA(Bp,j,r,&j); if (ODD(e2) && t < 0) u = -u; IMPBAA(Bp,B,j,p,u,s,q,&p,&s); e1 = e2; } Step6: /* Last term not constant. */ for (i = 1; i <= e1; i++) IPRODAP(B,p,C,m,&p); Return: /* Return p,s. */ *p_ = p; *s_ = s; return; } saclib2.2.8/src/ISGCA.c0000664002275300236100000000072414017255270013534 0ustar wcbrownscs/*====================================================================== t <- ISGCA(a) Test for GCA handle. Inputs a : a Word. Outputs t : a BETA-digit. t = 1 if a is a GCA handle, t = 0 otherwise. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word ISGCA(a) Word a; { return(BETAp < (a) && (a) < BETApp); } saclib2.2.8/src/IEQ.c0000664002275300236100000001030314017255270013316 0ustar wcbrownscs/*=========================================================================== C <- IEQ(A,B) Integer exact quotient. Inputs A,B : in Z, B /= 0, B a divisor of A. Output C : the quotient A/B. ===========================================================================*/ #include "saclib.h" #define IEQ_SIZE 100 Word IEQ(A,B) Word A,B; { Word C; Word Ab[IEQ_SIZE],Bb[IEQ_SIZE],Cb[IEQ_SIZE]; Word *Ah,*Bh,*Ch; Word Ap,App,Bp,Bpp; Word J,K,L,M,N,u,v,w; Word a,a1,a2,ah,ap1,ap2,b,b1,b2,bh,bp,bp1,bp2,c,cp,d,e,f,g; Word i,j,k,m,n; Step1: /* A single-precision. */ if (A < BETA) { C = A / B; goto Return; } Step2: /* B single-precision. */ if (B < BETA) { C = IDEQ(A,B); goto Return; } Step3: /* Skip common trailing zero BETA-digits. */ Ap = A; Bp = B; while (Bp != NIL && FIRST(Bp) == 0) { Ap = RED(Ap); Bp = RED(Bp); } Step4: /* Bp single-precision. */ if (RED(Bp) == NIL) { b = FIRST(Bp); C = IDEQ(Ap,b); goto Return; } Step5: /* Compute lengths and signs. */ J = 0; App = Ap; Bpp = Bp; ah = 0; bh = 0; while (Bpp != NIL) { ah = FIRST(App); App = RED(App); bh = FIRST(Bpp); Bpp = RED(Bpp); J = J + 1; } K = 1; while (App != NIL) { ah = FIRST(App); App = RED(App); K = K + 1; } ah = absm(ah); bh = absm(bh); if (ah + 1 < bh) K = K - 1; b = FIRST(Bp); v = signm(b); a = 0; App = Ap; while (a == 0) { a = FIRST(App); App = RED(App); } u = SIGN(a); if (v > 0) w = u; else w = - u; Step6: /* Get arrays for A, B and C. */ L = minm(J,K); if (K < IEQ_SIZE) { Ah = Ab; Ch = Cb; } else { Ah = GETARRAY(K + 1); Ch = GETARRAY(K + 1); } if (L < IEQ_SIZE) Bh = Bb; else Bh = GETARRAY(L + 1); Step7: /* Copy digits of A and B, made positive, into arrays. */ if (u > 0) for (i = 0; i <= K; i++) { Ah[i] = FIRST(Ap); Ap = RED(Ap); } else for (i = 0; i <= K; i++) { Ah[i] = - FIRST(Ap); Ap = RED(Ap); } if (v > 0) { for (i = 0; i < L; i++) { Bh[i] = FIRST(Bp); Bp = RED(Bp); } if (Bp != NIL) Bh[L] = FIRST(Bp); else Bh[L] = 0; } else { for (i = 0; i < L; i++) { Bh[i] = - FIRST(Bp); Bp = RED(Bp); } if (Bp != NIL) Bh[L] = - FIRST(Bp); else Bh[L] = 0; } Step8: /* Count trailing zero bits. */ b = Bh[0]; n = 0; while ((b & 01) == 0) { b = b >> 1; n = n + 1; } Step9: /* If n > 0 divide both numbers by 2^n (by shifting). */ if (n == 0) goto Step10; m = ZETA - n; N = (01 << n) - 1; for (i = 0; i < K; i++) { a1 = Ah[i]; ap1 = a1 >> n; a2 = Ah[i + 1]; ap2 = (a2 & N) << m; ap1 = ap1 | ap2; Ah[i] = ap1; } for (i = 0; i < L; i++) { b1 = Bh[i]; bp1 = b1 >> n; b2 = Bh[i + 1]; bp2 = (b2 & N) << m; bp1 = bp1 | bp2; Bh[i] = bp1; } Step10: /* Compute inverse of b modulo BETA.*/ b = Bh[0]; bp = MDINVB(b); Step11: /* K = 1? */ if (K == 1) { DPR(Ah[0],bp,&cp,&C); if (w < 0) C = -C; goto Return; } Step12: /* Divide by Jebelean's method. */ d = 0; for (k = 0; k < K; k++) { DPR(Ah[k],bp,&cp,&c); Ch[k] = c; if (k == K - 1) goto Step13; g = 0; M = minm(L,K - k); for (i = 0; i < M; i++) { j = i + k; DPR(c,Bh[i],&e,&f); a = Ah[j]; a = a - g; if (a < 0) { a = a + BETA; e = e + 1; } a = a - f; if (a < 0) { a = a + BETA; e = e + 1; } Ah[j] = a; g = e; } j = i + k; if (j < K) { a = Ah[j]; a = a - g - d; if (a < 0) { a = a + BETA; d = 1; } else d = 0; Ah[j] = a; } } Step13: /* Copy result to a list. */ C = IFATL(Ch,K,w); Step14: /* Free dynamic arrays. */ if (K >= IEQ_SIZE) { FREEARRAY(Ah); FREEARRAY(Ch); } if (L >= IEQ_SIZE) FREEARRAY(Bh); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AGIPROD.c0000664002275300236100000000160714017255270013774 0ustar wcbrownscs/*======================================================================= AGIPROD(A,B,C,T1,T2) Array Gaussian integer product. Inputs A,B : Gaussian integers in array representation. C : an array for a Gaussian integer. Let m = L(A), n = L(B). The sizes of C[0] and C[1] must be at least m + n + 3. T1,T2 : arrays for integers. Their sizes must be at least m + n + 3. Effect The product of A and B is placed in C. ========================================================================*/ #include "saclib.h" void AGIPROD(A,B,C,T1,T2) BDigit **A,**B,**C,*T1,*T2; { Step1: /* Compute the real part of C. */ AIPROD(A[0],B[0],T1); AIPROD(A[1],B[1],T2); T2[0] = - T2[0]; AISUM(T1,T2,C[0]); Step2: /* Compute the imaginary part of C. */ AIPROD(A[0],B[1],T1); AIPROD(A[1],B[0],T2); AISUM(T1,T2,C[1]); Return: /* Return. */ return; } saclib2.2.8/src/MMDAH.c0000664002275300236100000000327114017255270013534 0ustar wcbrownscs/*=========================================================================== MMDAH(p,A,n) Matrix of modular digits array representation - convert to Hessenberg form. Input p : a BETA-digit, prime. A : an (n x n)-matrix over GF(p) in array representation, n : a positive BETA-digit. Side effect A is transformed into a similar matrix of Hessenberg form (one that is zero everywhere below the first diagonal). ===========================================================================*/ #include "saclib.h" void MMDAH(p,A,n) BDigit p; Word **A; BDigit n; { BDigit a,ap,as,i,j,k,T; Step1: /* Matrix order < 3. */ if (n < 3) goto Return; Step2: /* First pivot step. */ k = 1; Step3: /* Find pivot row, if possible. */ i = k; while (i < n && A[i][k-1] == 0) i++; Step4: /* No pivot row. */ if (i == n) goto Step7; Step5: /* Row i is pivot row. */ if (i > k) { for (j = k-1; j < n; j++) { /* swap rows k and i. */ T = A[k][j]; A[k][j] = A[i][j]; A[i][j] = T; } for (j = 0; j < n; j++) { /* swap columns k and i. */ T = A[j][k]; A[j][k] = A[j][i]; A[j][i] = T; } } Step6: /* Row k is pivot row. */ a = A[k][k-1]; ap = MDINV(p,a); for (i = k+1; i < n; i++) { as = MDPROD(p,A[i][k-1],ap); for (j = k-1; j < n; j++) /* transform row i by row k. */ A[i][j] = MDDIF(p,A[i][j],MDPROD(p,as,A[k][j])); for (j = 0; j < n; j++) /* transform column k by column i. */ A[j][k] = MDSUM(p,A[j][k],MDPROD(p,as,A[j][i])); } Step7: /* Next pivot step. */ k++; if (k < n-1) goto Step3; Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPNEG.c0000664002275300236100000000175514017255270013555 0ustar wcbrownscs/*====================================================================== B <- IPNEG(r,A) Integral polynomial negative. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs B : in Z[X1,...,Xr], B = -A. ======================================================================*/ #include "saclib.h" Word IPNEG(r,A) Word r,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = INEG(A); goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = INEG(a); else b = IPNEG(rp,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MPRES.c0000664002275300236100000000262214017255270013573 0ustar wcbrownscs/*====================================================================== C <- MPRES(r,p,A,B) Modular polynomial resultant. Inputs r : a BETA-digit, r > 0. p : a BETA-digit, prime. A,B : in Z/(p)[X1,...,Xr], A and B are of positive degree. Outputs C : in Z/(p)[X1,...,X_{r-1}], the resultant of A and B. ======================================================================*/ #include "saclib.h" Word MPRES(r,p,A,B) Word r,p,A,B; { Word As,Bs,C,Cs,D,Dp,b,i,k,m,m1,n,n1,rp; Step1: /* r=1. */ if (r == 1) { C = MUPRES(p,A,B); goto Return; } Step2: /* Initialize. */ m = PDEG(A); m1 = PDEGSV(r,A,1); n = PDEG(B); n1 = PDEGSV(r,B,1); k = m * n1 + m1 * n; rp = r - 1; C = 0; D = LIST2(0,1); i = 0; Step3: /* Recursion. */ while (i < p) { As = MPEVAL(r,p,A,1,i); if (PDEG(As) == m) { Bs = MPEVAL(r,p,B,1,i); if (PDEG(Bs) == n) { Cs = MPRES(rp,p,As,Bs); b = MPEMV(1,p,D,i); b = MDINV(p,b); C = MPINT(p,D,i,b,rp,C,Cs); Dp = LIST4(1,1,0,p - i); D = MPPROD(1,p,D,Dp); if (PDEG(D) > k) goto Return; } } i++; } Step4: /* Algorithm fails. */ FAIL("MPRES","Fails",r,p,A,B); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SIPIIRMS.c0000664002275300236100000000444614017255270014152 0ustar wcbrownscs/*====================================================================== M = SIPIIRMS(L,C) Software interval polynomial isolating interval refinement and merge sort. Inputs L : a list of triples T = (i,I,t) where i is the index in the array C of a software interval polynomial A, I is a logarithmic standard open or one-point isolating interval for a root of A, and t is the trend of the isolated root. All the isolated roots are distinct. C : an array of pointers to software interval polynomials all of which are of the same precision. Output M : 0 in case of failure. Otherwise a list of the same type as L for the same roots and polynomials. But in M the intervals are mutually disjoint and ordered so that I < J if I precedes J in the list. Moreover, two intervals share an endpoint only if both intervals are open. ======================================================================*/ #include "saclib.h" Word SIPIIRMS(L,C) Word L; BDigit **C; { BDigit *A1,*A2,i,i1,i2,k,n,s,t1,t2; Word I1,I2,J1,J2,L1,L2,M,M1,M2,T,T1,T2; Step1: /* Trivial case. */ n = LENGTH(L); if (n <= 1) { M = L; goto Return; } Step2: /* Divide L into two lists, L1 and L2. */ k = n / 2; L1 = NIL; L2 = L; for (i = 1; i <= k; i++) { T = FIRST(L2); L2 = RED(L2); L1 = COMP(T,L1); } L1 = INV(L1); Step3: /* Refine and merge sort L1 and L2. */ M1 = SIPIIRMS(L1,C); if (M1 == 0) { M = 0; goto Return; } M2 = SIPIIRMS(L2,C); if (M2 == 0) { M = 0; goto Return; } Step4: /* Refine and merge M1 and M2. */ M = NIL; while (M1 != NIL && M2 != NIL) { T1 = FIRST(M1); T2 = FIRST(M2); FIRST3(T1, &i1,&I1,&t1); A1 = C[i1]; FIRST3(T2, &i2,&I2,&t2); A2 = C[i2]; SIPIIS(A1,I1,t1,A2,I2,t2, &J1,&J2,&s); if (s == 0) { M = 0; goto Return; } T1 = LIST3(i1,J1,t1); T2 = LIST3(i2,J2,t2); if (s < 0) { M1 = RED(M1); M = COMP(T1,M); SFIRST(M2,T2); } else { M2 = RED(M2); M = COMP(T2,M); SFIRST(M1,T1); } } while (M1 != NIL) { ADV(M1, &T1,&M1); M = COMP(T1,M); } while (M2 != NIL) { ADV(M2, &T2,&M2); M = COMP(T2,M); } M = INV(M); Return: /* Return M. */ return(M); } saclib2.2.8/src/IPLEV.c0000664002275300236100000000132714017255270013565 0ustar wcbrownscs/*=========================================================================== L <- IPLEV(S,a) Integral polynomial list evaluation of signs. Inputs S : a list (A_1,A_2,...,A_t) of univariate integral polynomials. a : a binary rational number. Outputs L : a list (s_1,...,s_t). s_i = sign(A_i(a)). ===========================================================================*/ #include "saclib.h" Word IPLEV(S,a) Word S,a; { Word L,A,Sp,s; Step1: /* Initialize. */ Sp = S; L = NIL; Step2: /* Evaluate polynomials. */ while (Sp != NIL) { ADV(Sp,&A,&Sp); s = IUPBES(A,a); L = COMP(s,L); } L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IPRIP.c0000664002275300236100000000276314017255270013576 0ustar wcbrownscs/*====================================================================== IPRIP(A; A_1,A_2) Integral polynomial real and imaginary parts. Input A : a univariate integral polynomial. Outputs A_1, A_2 : bivariate integral polynomials. A(x + i y) = A_1(x,y) + i A_2(x,y). ======================================================================*/ #include "saclib.h" void IPRIP(A, A1_,A2_) Word A, *A1_,*A2_; { Word a,A0,A1,A2,Ap,B1,B2,C1,C2,i,n; Step1: /* Case A = 0. */ if (A == 0) { A1 = 0; A2 = 0; goto Return; } Step2: /* Initialize. */ Ap = A; n = PDEG(A); a = PLDCF(A); A1 = PMON(a,0); A1 = PMON(A1,0); A2 = 0; Ap = PRED(A); Step3: /* Alternately multiply A_1 + i A_2 by x + i y and then add the next coefficient of A. */ for (i = n - 1; i >= 0; i--) { B1 = PMPSV(A1,2,1,1); /* B_1 = x A_1 */ C1 = PMPMV(A2,1); /* C_1 = y A_2 */ B2 = PMPSV(A2,2,1,1); /* B_2 = x A_2 */ C2 = PMPMV(A1,1); /* C_2 = y A_1 */ A1 = IPDIF(2,B1,C1); A2 = IPSUM(2,B2,C2); if (PDEG(Ap) == i) { a = PLDCF(Ap); if (Ap != NIL) Ap = PRED(Ap); A0 = PMON(PMON(a,0),0); A1 = IPSUM(2,A1,A0); } } Return: /* Return A_1 and A_2. */ *A1_ = A1; *A2_ = A2; return; } saclib2.2.8/src/AMUPRICSW.c0000664002275300236100000000367214017255270014265 0ustar wcbrownscs/*====================================================================== AMUPRICSW(M,I,A;L,Is) Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. Inputs M : an element of Z[X]. M(alpha) = 0, is the defining polynomial for Q(alpha). I : an isolating interval for alpha. A : an element of Z[alpha,X]. A /= 0 and is squarefree in Q(alpha)[X]. Outputs L : a list (I_1,...,I_r) of isolating intervals for the real roots of A. I_j = (a_j,b_j) is standard open or one-point binary rational interval. a_1 <= b_1 <= ... <= a_r <= b_r. Is : an acceptable isolating interval for alpha contained in I. ======================================================================*/ #include "saclib.h" void AMUPRICSW(M,I,A,L_,Is_) Word M,I,A; Word *L_,*Is_; { Word L,Is; Word As_1,As_2,Ab,I_1,I_2,Ls_1,Ls_2,L_0,L_1, L_2,b_1,b_2,m; Step1: /*[Initialize and check if A(0) = 0.]*/ m = PDEG(A); if (m == 0) { L = NIL; goto Return; } Ab = PDBORD(A); if (PDEG(Ab) < m) L_0 = LIST1(LIST2(0,0)); else L_0 = NIL; L_1 = NIL; L_2 = NIL; Step2: /*[Isolate positive roots.]*/ AMUPRBH(M,I,Ab,&b_1,&As_1); AMUPRINCS(M,I,As_1,0,RNINT(1),&Ls_1,&Is); while (Ls_1 != NIL) { ADV(Ls_1,&I_1,&Ls_1); I_1 = RIRNP(I_1,b_1); L_1 = COMP(I_1,L_1); } L_1 = INV(L_1); Step3: /* Isolate negative roots. */ As_2 = AMUPNT(As_1); b_2 = RNNEG(b_1); AMUPRINCS(M,Is,As_2,0,RNINT(1),&Ls_2,&Is); while (Ls_2 != NIL) { ADV(Ls_2,&I_2,&Ls_2); I_2 = RIRNP(I_2,b_2); L_2 = COMP(I_2,L_2); } Step4: /* Combine intervals. */ L = CONC(L_2,CONC(L_0,L_1)); Return: *L_ = L; *Is_ = Is; return; } saclib2.2.8/src/LBRIREAD.c0000664002275300236100000000362614017255270014076 0ustar wcbrownscs/*===================================================================== J <- LBRIREAD() Logarithmic binary rational interval read. Inputs (from the input stream) An open or one-point logarithmic binary rational interval I. The external representation of an open interval is (,) Both endpoints are external representations of logarithmic binary rational numbers, the left endpoint being strictly smaller than the right endpoint. The external representation of a one-point interval is [] where is an external representation of a logarithmic binary rational number. Outputs J : The internal representation of I: If I is open, J is the list (,) of the internal representations of the endpoints. If I is a one-point interval, J is the list (,) where is the internal representation of the point. Side effect The interval J is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word LBRIREAD() { Word a,b,J; char C; Step1: /* Read parenthesis or bracket. */ C = CREADB(); if (C != '(' && C != '[') goto Step4; Step2: /* Read open interval. */ if (C == '(') { a = LBRNREAD(); C = CREAD(); if (C != ',') goto Step4; b = LBRNREAD(); C = CREAD(); if (C != ')') goto Step4; J = LIST2(a,b); goto Return; } Step3: /* Read one-point interval. */ if (C == '[') { a = LBRNREAD(); C = CREAD(); if (C != ']') goto Step4; J = LIST2(a,a); goto Return; } Step4: /* Error. */ FAIL("LBRNREAD","Unexpected character",C); Return: /* Return */ return(J); } saclib2.2.8/src/DMUPNR.c0000664002275300236100000000265014017255270013713 0ustar wcbrownscs/*=========================================================================== C <- DMUPNR(p,A,B) Dense modular univariate polynomial natural remainder. Inputs A, B : in Z/(p)[X] dense representation, A,B different from 0, deg(A) >= deg(B). p : a prime BETA-digit. Outputs C : in Z/(p)[X], the natural remainder of B. Side effects The list for A is modified. ===========================================================================*/ #include "saclib.h" Word DMUPNR(p,A,B) Word p,A,B; { Word Ap,App,As,Bp,Bpp,Bs,C,a,b,bp,c,k,m,n; Step1: /* Deg(B)=0. */ n = FIRST(B); if (n == 0) { C = 0; goto Return; } Step2: /* Deg(B) positive. */ Bp = RED(B); ADV(Bp,&b,&Bs); bp = MDINV(p,b); As = A; do { ADV(As,&k,&Ap); m = -1; ADV(Ap,&a,&App); c = MDPROD(p,a,bp); Bpp = Bs; do { ADV(Bpp,&b,&Bpp); b = MDPROD(p,b,c); a = FIRST(App); a = MDDIF(p,a,b); k = k - 1; if (m < 0 && a != 0) { m = k; As = Ap; } SFIRST(App,a); Ap = App; App = RED(Ap); } while (Bpp != NIL); while (m < 0 && App != NIL) { k = k - 1; if (FIRST(App) != 0) { m = k; As = Ap; } Ap = App; App = RED(Ap); } if (m >= 0) SFIRST(As,m); } while (m >= n); if (m >= 0) C = As; else C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SIPROD.c0000664002275300236100000000330214017255270013701 0ustar wcbrownscs/*====================================================================== SIPROD(I,J,K) Software interval product. Inputs I, J : software intervals of the same precision, p. K : an array of size (at least) p + 3. Effect The smallest p-precision software interval containing I * J is computed and placed in K. ======================================================================*/ #include "saclib.h" void SIPROD(I,J,K) BDigit *I,*J,*K; { BDigit p,q,s,*T; Step1: /* Get the precision. */ p = I[2]; q = p + 3; Step2: /* I >= 0. */ if (I[1] >= 0) { if (J[1] >= 0) { FPROD(I,J,-1,K); FPROD(I + q,J + q,+1,K + q); } else if (J[q + 1] < 0) { FPROD(I + q,J,-1,K); FPROD(I,J + q,+1,K + q); } else { FPROD(I + q,J,-1,K); FPROD(I + q,J + q,+1,K + q); } goto Return; } Step3: /* I < 0. */ if (I[q + 1] < 0) { if (J[1] >= 0) { FPROD(I,J + q,-1,K); FPROD(I + q,J,+1,K + q); } else if (J[q + 1] < 0) { FPROD(I + q,J + q,-1,K); FPROD(I,J,+1,K + q); } else { FPROD(I,J + q,-1,K); FPROD(I,J,+1,K + q); } goto Return; } Step4: /* I contains 0. */ if (J[1] >= 0) { FPROD(I,J + q,-1,K); FPROD(I + q,J + q,+1,K + q); } else if (J[q + 1] < 0) { FPROD(I + q,J,-1,K); FPROD(I,J,+1,K + q); } else { T = GETARRAY(q); FPROD(I,J + q,-1,K); FPROD(I + q,J,-1,T); s = FCOMP(K,T); if (s > 0) FCOPY(T,K); FPROD(I,J,+1,K + q); FPROD(I + q,J + q, +1,T); s = FCOMP(K + q,T); if (s < 0) FCOPY(T,K + q); FREEARRAY(T); } Return: /* Return. */ return; } saclib2.2.8/src/HIPNEGT.c0000664002275300236100000000140514017255270014001 0ustar wcbrownscs/*====================================================================== B <- HIPNEGT(n,A) Hardware interval polynomial negative transformation. Inputs n : a BETA-digit. A : in HI[X], deg(A) = n. Output B : in HI[X], B(X) = A(-x). ======================================================================*/ #include "saclib.h" interval *HIPNEGT(n,A) BDigit n; interval A[]; { BDigit i; interval *B; Step1: /* Get array for B. */ B = GETHIPARRAY(n); Step2: /* Put negated coefficients in B. */ for (i = 0; i <= n; i++) { if ((i & 1) == 0) { B[i].left = A[i].left; B[i].right = A[i].right; } else { B[i].left = - A[i].right; B[i].right = - A[i].left; } } Return: /* Return B. */ return(B); } saclib2.2.8/src/IPGFCB.c0000664002275300236100000000162314017255270013637 0ustar wcbrownscs/*====================================================================== a <- IPGFCB(r,A) Integral polynomial Gelfond factor coefficient bound. Inputs r : a BETA-digit, r >= 1. A : in Z[x_1,...,x_r]. Outputs a : in Z. Let d be the sum norm of A and let n_i be the degree of A in x_i. Let h_i = 2 n_i - 1 if n_i > 0, 0 otherwise. Let h be the sum of the h_i. Let h' = floor((h + 1)/2). Then a = 2^h' * d. ======================================================================*/ #include "saclib.h" Word IPGFCB(r,A) Word r,A; { Word V,a,h,n; Step1: /* Compute. */ a = IPSUMN(r,A); V = PDEGV(r,A); h = 0; do { ADV(V,&n,&V); h = h + MAX(0,2 * n - 1); } while (V != NIL); h = (h + 1) / 2; a = IMP2(a,h); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/INEG.c0000664002275300236100000000147714017255270013436 0ustar wcbrownscs/*=========================================================================== B <- INEG(A) Integer negation. Inputs A : in Z. Outputs B : -A. ===========================================================================*/ #include "saclib.h" Word INEG(A) Word A; { Word Ap,B,Bp,Bpp,b; Step1: /* A single-precision. */ if (A < BETA) { B = -A; goto Return; } Step2: /* A multiple-precision. */ Ap = A; if (AVAIL == NIL) GC(); B = AVAIL; Bpp = B; do { Bp = Bpp; b = - FIRST(Ap); Ap = RED(Ap); SFIRST(Bp,b); Bpp = RED(Bp); if (Bpp == NIL) { AVAIL = NIL; GC(); Bpp = AVAIL; SRED(Bp,Bpp); } } while (Ap != NIL); AVAIL = Bpp; SRED(Bp,NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IDIFA.c0000664002275300236100000000673514017255270013532 0ustar wcbrownscs/*=========================================================================== IDIFA(A,m,B,n; k) Integer difference, array version. Inputs A, B: in Z, in array representation. The array for A should be large enough to hold A - B. m, n: BETA digits, the lengths of A and B, respectively. Output k : the length of A - B. Side effects A - B is computed and put in A. ===========================================================================*/ #include "saclib.h" void IDIFA(A,m,B,n, k_) Word *A,m,*B,n, *k_; { Word c,d,i,k,r,s,t; Step1: /* A or B zero. */ if (ISIGNA(A,m) == 0) { for (i = 0; i < n; i++) A[i] = -B[i]; k = n; goto Return; } if (ISIGNA(B,n) == 0) { k = m; goto Return; } Step2: /* Determine signs of inputs. */ s = ISIGNA(A,m); t = ISIGNA(B,n); Step3: /* Initialize and branch on signs. */ if (s == t) goto Step6; else if (s < 0) goto Step5; Step4: /* A positive and B negative. */ k = minm(m,n); c = 0; for (i = 0; i < k; i++) { d = A[i] - B[i] + c; if (d >= BETA) { d -= BETA; c = 1; } else c = 0; A[i] = d; } if (m == n) { if (c == 1) { A[m] = 1; k = m + 1; } } else if (m > n) { while (i < m && c == 1) { d = A[i] + c; if (d == BETA) { d = 0; c = 1; } else c = 0; A[i] = d; i++; } if (c == 1) { A[m] = 1; k = m + 1; } else k = m; } else if (m < n) { while (i < n) { d = c - B[i]; if (d == BETA) { d = 0; c = 1; } else c = 0; A[i] = d; i++; } if (c == 1) { A[n] = 1; k = n + 1; } else k = n; } goto Return; Step5: /* A negative and B positive. */ k = minm(m,n); c = 0; for (i = 0; i < k; i++) { d = A[i] - B[i] + c; if (d <= -BETA) { d += BETA; c = -1; } else c = 0; A[i] = d; } if (m == n) { if (c == -1) { A[m] = -1; k = m + 1; } } else if (m > n) { while (i < m && c == -1) { d = A[i] + c; if (d == -BETA) { A[i] = 0; c = -1; } else c = 0; A[i] = d; i++; } if (c == -1) { A[m] = -1; k = m + 1; } else k = m; } else if (m < n) { while (i < n) { d = c - B[i]; if (d == -BETA) { d = 0; c = -1; } else c = 0; A[i] = d; i++; } if (c == -1) { A[n] = -1; k = n + 1; } else k = n; } goto Return; Step6: /* Same signs. */ /* Determine sign r of A - B. */ if (m == n) { i = m; do { i--; d = A[i] - B[i]; } while (d == 0 && i > 0); if (d == 0) { A[0] = 0; k = 0; goto Return; } else r = SIGN(d); } else if (m < n) r = -t; else r = s; /* Compute difference. */ k = minm(m,n); c = 0; if (r > 0) for (i = 0; i < k; i++) { d = A[i] - B[i] + c; if (d < 0) { d += BETA; c = -1; } else c = 0; A[i] = d; } else for (i = 0; i < k; i++) { d = A[i] - B[i] + c; if (d > 0) { d -= BETA; c = 1; } else c = 0; A[i] = d; } if (m > n) { A[i] += c; i++; } else if (m < n) { A[i] = -B[i] + c; i++; while (i < n) { A[i] = -B[i]; i++; } } i--; while (A[i] == 0) i--; k = i + 1; Return: /* Prepare for return. */ *k_ = k; return; } saclib2.2.8/src/PRED.c0000664002275300236100000000107114017255270013434 0ustar wcbrownscs/*====================================================================== B <- PRED(A) Polynomial reductum. Inputs A : a polynomial. Outputs B : the reductum of A. ======================================================================*/ #include "saclib.h" Word PRED(A) Word A; { Word B; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) B = 0; else { B = RED2(A); if (B == NIL) B = 0; } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFPPR.c0000664002275300236100000000214514017255270013555 0ustar wcbrownscs/*=========================================================================== C <- AFPPR(r,M,A,B) Algebraic number field polynomial product. Inputs r : a BETA-digit, r >= 0. M : in Z[x], the minimal polynomial for an algebraic number alpha. A,B : in Q(alpha)[X1,...,Xr]. Outputs C : in Q(alpha)[X1,...,Xr], C = A * B. ===========================================================================*/ #include "saclib.h" Word AFPPR(r,M,A,B) Word r,M,A,B; { Word Ap,As,Bs,C,C1,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { C = AFPROD(M,A,B); goto Return; } Step3: /* General case. */ As = CINV(A); Bs = CINV(B); C = 0; rp = r - 1; do { ADV2(Bs,&b,&f,&Bs); Ap = As; C1 = NIL; do { ADV2(Ap,&a,&e,&Ap); if (rp == 0) c = AFPROD(M,a,b); else c = AFPPR(rp,M,a,b); C1 = COMP2(e + f,c,C1); } while (Ap != NIL); C = AFPSUM(r,C,C1); } while (Bs != NIL); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/ALSIL.c0000664002275300236100000000167014017255270013553 0ustar wcbrownscs/*===================================================================== M <- ALSIL(A,L) Attach labels to standard isolation list. Inputs A : an integral polynomial all of whose real roots are simple. L : a standard isolation list for all of the real roots of A. Outputs M : a labeled standard isolation list for all of the real roots of A. =====================================================================*/ #include "saclib.h" Word ALSIL(A,L) Word A,L; { Word a,I,Lp,n,M,t,T; Step1: /* Determine trend of first interval. */ n = PDEG(A); a = PLDCF(A); if (EVEN(n)) t = -1; else t = +1; if (ISIGNF(a) < 0) t = -t; Step2: /* Label each interval. */ M = NIL; Lp = L; while (Lp != NIL) { I = FIRST(Lp); Lp = RED(Lp); T = LIST3(I,A,t); t = -t; M = COMP(T,M); } M = INV(M); Return: /* Return M. */ return(M); } saclib2.2.8/src/HIPIEVAL.c0000664002275300236100000000136414017255270014110 0ustar wcbrownscs/*====================================================================== J <- HIPIEVAL(n,A,I) Hardware interval polynomial interval evaluation. Inputs n : a BETA-digit. A : a hardware interval polynomial of degree n. I : a hardware interval. Output J : a hardware interval containing A(I). Warning HIPIEVAL is not floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" interval HIPIEVAL(n,A,I) BDigit n; interval A[],I; { BDigit i; interval J; Step1: /* Apply Horner's method. */ J = A[n]; for (i = n - 1; i >= 0; i--) { J = HIPROD(J,I); J = HISUM(J,A[i]); } Return: /* Return J. */ return(J); } saclib2.2.8/src/IPIC.c0000664002275300236100000000106714017255270013433 0ustar wcbrownscs/*====================================================================== c <- IPIC(r,A) Integral polynomial integer content. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr] Outputs c : in Z, the content of A. ======================================================================*/ #include "saclib.h" Word IPIC(r,A) Word r,A; { Word c; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) c = 0; else c = IPICS(r,A,0); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/IPSRP.c0000664002275300236100000000152114017255270013577 0ustar wcbrownscs/*=========================================================================== IPSRP(r,A; a,Ab) Integral polynomial similar to rational polynomial. Inputs r : a BETA-digit, r >= 0. A : in Q[x_1,...,x_r]. Outputs a : in Q, a = 0 if A = 0. Ab : in Z[x_1,...,x_r], Ab primitive and positive such that Ab = a * A. Ab = 0 if A = 0. ===========================================================================*/ #include "saclib.h" void IPSRP(r,A, a_,Ab_) Word r,A, *a_,*Ab_; { Word Ab,As,a,s,u,up,v; Step1: /* A = 0. */ if (A == 0) { a = 0; Ab = 0; goto Return; } Step2: /* A /= 0. */ RPBLGS(r,A,&u,&v,&s); up = IDPR(u,s); a = LIST2(up,v); As = RPRNP(r,a,A); Ab = IPFRP(r,As); Return: /* Prepare for return. */ *a_ = a; *Ab_ = Ab; return; } saclib2.2.8/src/ISOBJECT.c0000664002275300236100000000071614017255270014111 0ustar wcbrownscs/*====================================================================== t <- ISOBJECT(a) Test for object. Inputs a : a Word. Outputs t : a BETA-digit. t = 1 if a is an object, t = 0 otherwise. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word ISOBJECT(a) Word a; { return(ISATOM(a) || ISLIST(a)); } saclib2.2.8/src/IPIQ.c0000664002275300236100000000152114017255270013444 0ustar wcbrownscs/*=========================================================================== C <- IPIQ(r,A,b) Integral polynomial integer quotient. Inputs A : in Z[x_1,...,x_r]. r : a BETA-digit, r >= 1, the number of variables. b : a non-zero integer which divides A. Outputs C : in Z[x_1,...,x_r], C = A / b. ===========================================================================*/ #include "saclib.h" Word IPIQ(r,A,b) Word r,A,b; { Word Ap,C,a,c,e,rp; Step1: /* A = 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* A /= 0. */ Ap = A; rp = r - 1; C = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) c = IEQ(a,b); else c = IPIQ(rp,a,b); C = COMP2(c,e,C); } while (Ap != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MPIQHS.c0000664002275300236100000000571114017255270013710 0ustar wcbrownscs/*====================================================================== MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C; A,B,S,T,Dp) Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. Inputs r : a BETA-digit, r >= 2. M : in Z, M > 0. D : a list (d1,...,d_{r-1}), with di BETA-digits, di > 0. Ab,Bb,Sb,Tb: in Z/(p)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}), with Ab monic, deg_Y(Ab) > 0, and Ab*Sb + Bb*Tb = 1. s : a BETA-digit, s < r. n : a BETA-digit, n >= 0. C : Z/(M)[X1,...,X_{r-1},Y], with C congruent to Ab*Bb. Outputs A,B,S,T : in Z/(M)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{s-1}^d_{s-1},Xs^n, X_{s+1}^d_{s+1},...,X_{r-1}^d_{r-1}), with A*S + B*T = 1, deg_Y(A) = deg_Y(Ab), A monic, A*B congruent to C, A congruent to Ab, B congruent Bb, S congruent fo Sb, and T congruent to Tb. Dp : a list (d1,...,d_{s-1},n,d_{s+1},...,d_{r-1}), with di BETA-digits, di >= 0. ======================================================================*/ #include "saclib.h" void MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C, A_,B_,S_,T_,Dp_) Word r,M,D,Ab,Bb,Sb,Tb,s,n,C, *A_,*B_,*S_,*T_,*Dp_; { Word A,As,B,Bs,Db,Dh,Dp,Ds,Dt,I,S,Ss,T,Ts,U,U1,V,Vp,Vpp,Y,Y1, Yb,Z,Z1,Zb,d,i; /* hide Ds,d,i; */ Step1: /* Initialize. */ A = Ab; B = Bb; S = Sb; T = Tb; I = LIST2(0,1); I = PINV(1,I,r - 1); Db = D; Ds = D; Dh = NIL; for (i = 1; i <= s - 1; i++) { ADV(Ds,&d,&Ds); Dh = COMP(d,Dh); } ADV(Ds,&d,&Ds); Dt = COMP(n,Ds); Dp = CINV(Dh); Dp = CONC(Dp,Dt); Step2: /* Done? */ if (d > n) { A = IPIHOM(r,Dp,A); B = IPIHOM(r,Dp,B); S = IPIHOM(r,Dp,S); T = IPIHOM(r,Dp,T); } if (d >= n) goto Return; Step3: /* Compute Y,Z. */ V = MIPIPR(r,M,Dp,A,B); Vp = MIPDIF(r,M,C,V); U = PDPV(r,Vp,s,d); MIPISE(r,M,Db,A,B,S,T,U,&Y,&Z); Step4: /* Compute As,Bs the liftings of A and B. */ Yb = PDPV(r,Y,s,-d); Zb = PDPV(r,Z,s,-d); As = MIPSUM(r,M,A,Zb); Bs = MIPSUM(r,M,B,Yb); Step5: /* Compute Y1,Z1. */ V = MIPIPR(r,M,Dp,As,S); Vp = MIPIPR(r,M,Dp,Bs,T); Vpp = MIPSUM(r,M,V,Vp); V = MIPDIF(r,M,Vpp,I); U1 = PDPV(r,V,s,d); MIPISE(r,M,Db,A,B,S,T,U1,&Y1,&Z1); Step6: /* Compute Ss,Ts. */ Yb = PDPV(r,Y1,s,-d); Zb = PDPV(r,Z1,s,-d); Ss = MIPDIF(r,M,S,Yb); Ts = MIPDIF(r,M,T,Zb); Step7: /* Update. */ d = d + d; Dt = COMP(d,Ds); Db = CINV(Dh); Db = CONC(Db,Dt); A = As; B = Bs; S = Ss; T = Ts; goto Step2; Return: /* Prepare for return. */ *A_ = A; *B_ = B; *S_ = S; *T_ = T; *Dp_ = Dp; return; } saclib2.2.8/src/IDEGCD.c0000664002275300236100000000207614017255270013627 0ustar wcbrownscs/*=========================================================================== IDEGCD(a,b; c,u1,v1,u2,v2) Integer doubly extended greatest common divisor algorithm. Inputs a, b : in Z. Outputs c : gcd(a,b). u1,v1 : in Z such that a * u1 + b * v1 = c. u2, v2 : in Z such that a * u2 + b * v2 = 0. If a /= 0 and b /= 0 then abs(u1) <= abs(b)/(2*c), abs(v1) <= abs(a)/(2*c), u2 = -b/c and v2=a/c. Otherwise u1 = v2 = sign(a), v1 = sign(b), u2 = -sign(b). ===========================================================================*/ #include "saclib.h" void IDEGCD(a,b, c_,u1_,v1_,u2_,v2_) Word a,b, *c_,*u1_,*v1_,*u2_,*v2_; { Word c,u1,u2,v1,v2; Step1: /* Compute. */ IEGCD(a,b,&c,&u1,&v1); if (c == 0) { u2 = 0; v2 = 0; } else { u2 = INEG(IEQ(b,c)); v2 = IEQ(a,c); } Return: /* Prepare for return. */ *c_ = c; *u1_ = u1; *v1_ = v1; *u2_ = u2; *v2_ = v2; return; } saclib2.2.8/src/ANPROD.c0000664002275300236100000000335514017255270013674 0ustar wcbrownscs/*====================================================================== ANPROD(A,I,B,J; C,K) Algebraic number product. Inputs A : minimal polynomial for a real algebraic number alpha. I : an acceptable isolating interval for alpha. B : minimal polynomial for a real algebraic number beta. J : an acceptable isolating interval for beta. Outputs C : minimal polynomial for alpha * beta. K : an acceptable isolating interval for beta. ======================================================================*/ #include "saclib.h" void ANPROD(A,I,B,J, C_,K_) Word A,I,B,J, *C_,*K_; { Word C,K; Word As,Bs,Ip,Jp,R,s,c,L,M,P,F,Ms,v; Step1: /*[a=0 or b=0.]*/ if (A == 0 || B == 0) { C = 0; K = LIST2(0,0); goto Return; } Ip = I; Jp = J; Step2: /*[Compute R(x)=res((y^n)*A(x/y),B(y)).]*/ As = IUPQS(A); Bs = PINV(1,B,1); R = IPRES(2,As,Bs); Step3: /*[Compute the list M of all irreducible factors of R.]*/ IPFAC(1,R,&s,&c,&L); M = NIL; do { ADV(L,&P,&L); F = SECOND(P); M = COMP(F,M); } while (!(L == NIL)); Step4: /*[Remove from the list M all factors with no coefficient sign variations in K=Ip+Jp.]*/ K = RIPROD(Ip,Jp); Ms = NIL; do { ADV(M,&F,&M); v = IUPVOI(F,K); if (v != 0) Ms = COMP(F,Ms); } while (!(M == NIL)); M = INV(Ms); Step5: /*[If M contains only one factor, F, and its variation is one then set c=(F,K).]*/ if (RED(M) == NIL && v == 1) { C = F; goto Return; } Step6: /*[Otherwise refine I or J and go back to step (5).]*/ s = RNCOMP(RIL(Ip),RIL(Jp)); if (s > 0) Ip = IUPIIR(A,Ip); else Jp = IUPIIR(B,Jp); goto Step4; Return: *C_ = C; *K_ = K; return; } saclib2.2.8/src/FREEARRAY.c0000664002275300236100000000051414017255270014223 0ustar wcbrownscs/*========================================================================== FREEARRAY(A) Free array. Input A : a pointer to an array. Side effect The memory allocated to A is freed. #define FREEARRAY(A) free((A)) ===========================================================================*/ saclib2.2.8/src/RPDWRITE.c0000664002275300236100000000260214017255270014143 0ustar wcbrownscs/*=========================================================================== RPDWRITE(r,A,V) Rational Polynomial Distributive Write. Inputs r : a non-negative BETA--integer. A : an element of Q[x_1,...,x_r], V : a list of at least r distinct variables. First r variables in V are used. Side effects A is written out to the output stream. ======================================================================*/ #include "saclib.h" void RPDWRITE(r,A,V) Word r,A,V; { Word Ap,E,Ep,Vp,a,e,l,s,t,v; Step1: /* r = 0 or A = 0. */ Ap = DIPFP(r,A); if (r == 0 || Ap == 0) { RNWRITE(Ap); goto Return; } l = 1; Step2: /* General case. */ do { ADV2(Ap,&a,&E,&Ap); s = RNSIGN(a); a = RNABS(a); if (s > 0 && l == 0) CWRITE('+'); if (s < 0) CWRITE('-'); if (!EQUAL(a,RNRED(1,1))) { if (l == 0) CWRITE(' '); RNWRITE(a); t = 1; } else t = 0; Ep = CINV(E); Vp = V; do { ADV(Ep,&e,&Ep); ADV(Vp,&v,&Vp); if (e > 0) { if (l == 0 || t == 1) CWRITE(' '); VWRITE(v); t = 1; } if (e > 1) { CWRITE('^'); AWRITE(e); } } while (Ep != NIL); if (t == 0) { if (l == 0) CWRITE(' '); CWRITE('1'); } if (Ap == NIL) goto Return; CWRITE(' '); l = 0; } while (1); Return: /* Prepare for return. */ return; } saclib2.2.8/src/NORMILHS.c0000664002275300236100000000423414017255270014141 0ustar wcbrownscs/*=========================================================================== NORMILHS(N,q,Q,Ap,B,S,T; Y,Z,Us,As,Bs) Norm polynomial initial linear Hensel step. Inputs N : in Z[x], the norm of a polynomial A[alpha,x] in Z[alpha][x], where alpha is an algebraic number. N is squarefree. q : a single-precision power of an odd prime p. Q : in Z, Q = q^2. Ap : a list of pairs ((d_1,F_1),...,,(d_s,F_s)). Let M be the minimal polynomial of alpha, and let M_1 * ... * M_s be a complete factorization of M (mod p). Then d_i = deg(M_i) and F_i is a list of distinct monic factors of N_i = res_t(M_i(t),A(t,x)) (mod q). Let (a_1,...,a_r) be the list of all the elements of the lists F_1,...,F_s. B,S,T : lists (b_1,...,b_{r-1}), (s_1,...,s_{r-1}), (t_1,...,t_{r-1}) of elements of Z/(q)[x] such that b_{i-1} = a_i b_i, for i = 2,...,r-1, and a_i s_i + b_i t_i = 1, deg(s_i) < deg(b_i), deg(t_i) < deg(a_i) for i = 1,...,r-1. Outputs Y,Z : lists (y_1,...,y_{r-1}),(z_1,...,z_{r-1}) of elements of Z/(q)[x]. Us : a list (u_1,...,u_{r-1}) of elements of Z[x]. y_i, y_i, u_i satisfy a_i y_i + b_i z_i = u_i (mod q). As : a list of pairs ((d_1,As_1),...,(d_s,As_s)). Let F_i = (f_1,...,f_k). Then As_i = (g_1,...,g_k), where g_i is an element of Z/(Q)[x] and f_j = H_q(g_k). Let as_1,...,as_r be all the elements of the lists As_1,...,As_s. Then the monic associate of N is congruent to as_1*...*as_r. Bs : a list (bs_1,...,bs_{r-1}) of elements of Z/(Q)[x]. b_i = H_q(bs_i). ===========================================================================*/ #include "saclib.h" void NORMILHS(N,q,Q,Ap,B,S,T, Y_,Z_,Us_,As_,Bs_) Word N,q,Q,Ap,B,S,T, *Y_,*Z_,*Us_,*As_,*Bs_; { Word A,Ab,As,Bs,Us,Y,Z; Step1: /* Form a single list from the elements of the F_i. */ A = NORMFL(Ap); Step2: /* Lift. */ IUPILHS(q,Q,A,B,S,T,N, &Y,&Z,&Us,&Ab,&Bs); Step3: /* Regroup the elements of At. */ As = NORMRL(Ap,Ab); Return: /* Prepare for return. */ *Y_ = Y; *Z_ = Z; *Us_ = Us; *As_ = As; *Bs_ = Bs; return; } saclib2.2.8/src/MAIPDM.c0000664002275300236100000000317514017255270013660 0ustar wcbrownscs/*====================================================================== D <- MAIPDM(r,M) Matrix of integral polynomials determinant, modular algorithm. Inputs r : a non-negative BETA-digit. M : a square matrix over Z[x_1,...,x_r], represented as a list of rows. Output D : the determinant of M, an element of Z[x_1,...,x_r], ======================================================================*/ #include "saclib.h" Word MAIPDM(r,M) Word r,M; { Word b,b1,b11,bp,D,Ds,M1,M11,Mp,Ms,P,Q,p,pp; Step1: /* Matrix of order 1. */ if (RED(M) == NIL) { D = FIRST(FIRST(M)); goto Return; } Step2: /* Compute a coefficient bound. */ Mp = M; b = 1; do { ADV(Mp,&M1,&Mp); b1 = 0; do { ADV(M1,&M11,&M1); if (M11 != 0) { b11 = IPSUMN(r,M11); b1 = ISUM(b1,b11); } } while (M1 != NIL); if (b1 == 0) { D = 0; goto Return; } b = IPROD(b,b1); } while (Mp != NIL); b = ILOG2(b); Step3: /* Apply chinese remainder theorem. */ P = LPRIME; Q = 1; bp = 0; D = 0; do { if (P == NIL) FAIL("MAIPDM","Prime list exhausted",r,M,b,bp); ADV(P,&p,&P); Ms = MAIPHM(r,p,M); Ds = MMPDMA(r,p,Ms); pp = MDINV(p,MDHOM(p,Q)); D = IPCRA(Q,p,pp,r,D,Ds); Q = IDPR(Q,p); bp = bp + DLOG2(p); } while (bp < b); Return: /* Prepare for return. */ return(D); } saclib2.2.8/src/IPRESPRS.c0000664002275300236100000000432614017255270014157 0ustar wcbrownscs/*=========================================================================== R <- IPRESPRS(r,A,B) Integral polynomial resultant, polynomial remainder sequence method. Inputs r : a BETA-digit, r > 0. A, B : integral polynomials having positive degrees. Output R : the resultant of A and B. ===========================================================================*/ #include "saclib.h" Word IPRESPRS(r,A,B) BDigit r; Word A,B; { Word G1,G2,G3,Gh3,R,g1,g2,gs1,gs2,h0,h1,h2,hs0,hs1; BDigit d0,d1,i,m,n,n1,n2,n3,rp,s; Step1: /* Initialize. */ m = PDEG(A); n = PDEG(B); s = 1; if (m >= n) { G1 = A; G2 = B; n1 = m; n2 = n; } else { G1 = B; G2 = A; n1 = n; n2 = m; if (ODD(m) && ODD(n)) s = -1; } d0 = 0; d1 = n1 - n2; rp = r - 1; i = 1; h0 = 0; Step2: /* Compute Gh_{i+2} and n_{i+2}. */ Gh3 = IPPSR(r,G1,G2); if (Gh3 == 0) { R = 0; goto Return; } if (EVEN(d1)) Gh3 = IPNEG(r,Gh3); n3 = PDEG(Gh3); Step3: /* Compute h_i. */ if (i > 1) { g1 = PLDCF(G1); h1 = IPEXP(rp,g1,d0); if (i > 2) { hs0 = IPEXP(rp,h0,d0 - 1); h1 = IPEQ(rp,h1,hs0); } } Step4: /* Compute G_{i+2}. */ if (i == 1) G3 = Gh3; else { hs1 = IPEXP(rp,h1,d1); hs1 = IPPROD(rp,g1,hs1); hs1 = PMON(hs1,0); G3 = IPEQ(r,Gh3,hs1); } Step5: /* Update. */ n1 = n2; n2 = n3; d0 = d1; d1 = n1 - n2; G1 = G2; G2 = G3; if (i > 1) h0 = h1; i = i + 1; if (n2 > 0) goto Step2; Step6: /* Finish. */ g1 = PLDCF(G1); g2 = PLDCF(G2); if (d1 == 1) R = g2; else { if (i == 2) { R = IPEXP(rp,g2,d1); if (d0 != 1) { gs1 = IPEXP(rp,g1,d0 * d1 - d0); R = IPEQ(rp,R,gs1); } } else { if (d0 == 1) h1 = g1; else { hs0 = IPEXP(rp,h0,d0-1); gs1 = IPEXP(rp,g1,d0); h1 = IPEQ(rp,gs1,hs0); } hs1 = IPEXP(rp,h1,d1-1); gs2 = IPEXP(rp,g2,d1); h2 = IPEQ(rp,gs2,hs1); R = IPPROD(rp,g2,h2); R = IPEQ(rp,R,g2); } } if (s < 0) R = IPNEG(rp,R); Return: /* Return R. */ return(R); } saclib2.2.8/src/DIELOC.c0000664002275300236100000000052714017255270013646 0ustar wcbrownscs/*====================================================================== DIELOC() Display Input Error Location. Remarks This dummy does not do anything, yet. ======================================================================*/ #include "saclib.h" void DIELOC() { Step1: /* Don't do anything. */ return; } saclib2.2.8/src/FSUMSEOS.c0000664002275300236100000000501614017255270014151 0ustar wcbrownscs/*====================================================================== FSUMSEOS(A,B,d,C) Floating-point sum, same exponents, opposite signs. Inputs A, B : two nonzero floating-point numbers having the same precisions, the same exponents and opposite signs. d : a sign (rounding direction). C : an array large enough for the sum. Output C : a floating-point number approximating the sum of A and B, rounded according to IEEE standards. ======================================================================*/ #include "saclib.h" void FSUMSEOS(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit c,cp,e,h,i,j,k,n,np,p,r,s,w; Step1: /* Compute the sign, exponent and left shift amount. */ p = A[2]; e = A[0]; h = 0; j = p + 2; w = A[j] - B[j]; if (p > 1) { j = j - 1; h = h + 1; e = e - ZETA; while (w == 0 && j >= 3) { w = A[j] - B[j]; e = e - ZETA; h = h + 1; j = j - 1; } j = j + 1; h = h - 1; e = e + ZETA; } if (w == 0) { C[0] = 0; C[1] = 0; C[2] = p; goto Return; } if (w > 0) s = 1; else { s = -1; w = - w; } np = 0; while (w < BETA2) { np = np + 1; w = w << 1; } n = ZETA - np; e = e - np; Step2: /* Add and tentatively normalize. */ for (k = 3; k < 3 + h; k++) C[k] = 0; cp = 0; r = 0; if (s > 0) { for (k = 3; k <= j; k++) { c = A[k] - B[k] - cp; if (c < 0) { c = c + BETA; cp = 1; } else cp = 0; C[k + h] = ((c << np) & BETA1) | r; r = c >> n; } } else { for (k = 3; k <= j; k++) { c = B[k] - A[k] - cp; if (c < 0) { c = c + BETA; cp = 1; } else cp = 0; C[k + h] = ((c << np) & BETA1) | r; r = c >> n; } } Step3: /* Renormalize if needed. */ if (C[p + 2] >= BETA2) goto Step4; k = p + 2; h = 0; while (C[k] == 0) { e = e - ZETA; h = h + 1; k = k - 1; } w = C[k]; np = 0; while (w < BETA2) { np = np + 1; w = w << 1; e = e - 1; } n = ZETA - np; cp = (C[p + 2 - h] << np) & BETA1; for (i = p + 2; i >= 3 + h; i--) { r = C[i - h- 1]; C[i] = cp | (r >> n); cp = (r << np) & BETA1; } C[i] = cp; for (i = 2 + h; i >= 3; i--) C[i] = 0; Step4: /* Store exponent, sign and precision. */ C[0] = e; if (s > 0) C[1] = A[1]; else C[1] = B[1]; C[2] = p; Return: /* Return. */ return; } saclib2.2.8/src/RPTERMREAD.c0000664002275300236100000000214314017255270014350 0ustar wcbrownscs/*====================================================================== RPTERMREAD(r,V; A,t) Rational polynomial term read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : in Q[X1,...Xr], with variables in V. t : 1 if successful, 0 otherwise. ======================================================================*/ #include "saclib.h" void RPTERMREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,s,t; /* hide C,s,t; */ Step1: /* Setup. */ t = 1; A = RNRED(1,1); A = PFBRE(r,A); Step2: /* Read in the optional sign. */ C = CREADB(); if (C == '+') s = 1; else if (C == '-') s = -1; else { s = 1; BKSP(); } if (s == -1) A = RPNEG(r,A); Step3: /* Read in powers. */ do { RPPOWREAD(r,V,&A1,&t); if (t == 0) goto Return; A = RPPROD(r,A,A1); C = CREADB(); BKSP(); } while (!(!DIGIT(C) && !LETTER(C) && C != '(')); Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/IPSTDRAN.c0000664002275300236100000000205514017255270014131 0ustar wcbrownscs/*==================================================================== A <- IPSTDRAN(r,k,q,n) Integral polynomial, specified total degree, random. Inputs r : BETA-digit r >= 0. k : a positive BETA-digit. q : in Q, q = q1 / q2 with 0 < q1 <= q2 < BETA. n : a non-negative BETA-digit. Output A : in Z[x_1,...,x_r], a random integral polynomial in r variables of total degree <= n and target density of q, with random k-bit coefficients. =====================================================================*/ #include "saclib.h" Word IPSTDRAN(r,k,q,n) Word r,k,q,n; { Word A,A1,d,i,q1,q2,qs,t; Step1: /* Approximate q * BETA. */ FIRST2(q,&q1,&q2); DQR(q1,0,q2,&qs,&t); Step2: /* r = 0. */ if (r > 0) goto Step3; d = DRANN(); if (d < qs) A = IRAND(k); else A = 0; goto Return; Step3: /* r >= 1. */ A = NIL; for (i = 0; i <= n; i++) { A1 = IPSTDRAN(r - 1,k,q,n - i); if (A1 != 0) A = COMP2(i,A1,A); } if (A == NIL) A = 0; Return: /* Return A. */ return(A); } saclib2.2.8/src/MPEVAL.c0000664002275300236100000000231314017255270013666 0ustar wcbrownscs/*====================================================================== B <- MPEVAL(r,m,A,i,a) Modular polynomial evaluation. Inputs A : in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. m : a BETA-digit. a : in Z/(m). i : a BETA-digit, 1 <= i <= r. Outputs B : in Z/(m)[X1,...,X_{i-1},X_{i+1},...,Xr], B(X1,...,X_{i-1},X_{i+1},...,Xr) = A(X1,...,X_{i-1},a,X_{i+1},...,Xr) ======================================================================*/ #include "saclib.h" Word MPEVAL(r,m,A,i,a) Word r,m,A,i,a; { Word A1,Ap,B,B1,e1,rp; /* hide A1,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i=r. */ if (i == r) { B = MPEMV(r,m,A,a); goto Return; } Step3: /* i < r. */ rp = r - 1; Ap = A; B = NIL; do { ADV2(Ap,&e1,&A1,&Ap); B1 = MPEVAL(rp,m,A1,i,a); if (B1 != 0) B = COMP2(B1,e1,B); } while (!(Ap == NIL)); if (B == NIL) B = 0; else B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AIQR.c0000664002275300236100000000776014017255270013451 0ustar wcbrownscs/*======================================================================= AIQR(A,B,Q,R,T) Array integer quotient and remainder. Inputs A, B : integers in array representation, B /= 0. Q, R, T : arrays. Let m = L(A), n = L(B). The size of Q must be at least m - n + 3 and at least 3. The size of R must be at least m + 3. The size of T must be at least n + 2. Effect The quotient [A / B], the integral part of A / B, is placed in the array Q. The remainder, A - B * [A / B], is placed in the array R. ========================================================================*/ #include "saclib.h" void AIQR(A,B,Q,R,T) BDigit *A,*B,*Q,*R,*T; { BDigit a,a0,a1,a2,b,b0,b1,c,c0,c1,c2,h,hp,i,j,k,m,n,q,r; Step1: /* A = 0 or L(A) < L(B). */ m = A[1]; n = B[1]; if (A[0] == 0 || m < n) { Q[0] = 0; Q[1] = 0; Q[2] = 0; AICOPY(A,R); goto Return; } Step2: /* L(B) = 1. */ if (n == 1) { a1 = 0; b = B[2]; for (j = m + 1; j >= 2; j--) { a0 = A[j]; DQR(a1,a0,b, &q,&r); Q[j] = q; a1 = r; } R[2] = r; goto Step12; } Step3: /* Normalize. */ b = B[n +1]; h = PDLOG2(b); hp = ZETA - h; AIMP2(A,hp,R); AIMP2(B,hp,T); Step4: /* Obtain the two leading digits of the divisor. */ b1 = T[n + 1]; b0 = T[n]; Step5: /* Initialize the division loop. */ m = R[1]; R[1] = m + 1; R[m + 2] = 0; j = m; Step6: /* Get the three leading digits of the dividend. */ a2 = R[j + 2]; a1 = R[j + 1]; a0 = R[j]; Step7: /* Compute a quotient digit approximation, q. */ if (a2 == b1) { q = BETA - 1; a1 = a1 + a2; a2 = 0; if (a1 >= BETA) { a1 = a1 - BETA; a2 = 1; } } else { PNDQR(a2,a1,b1,&q,&a1); a2 = 0; } DPR(b0,q,&c1,&c0); a0 = a0 - c0; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; } a1 = a1 - c1; if ( a1 < 0) { a1 = a1 + BETA; a2 = a2 - 1; } if (a2 < 0) { q = q - 1; a0 = a0 + b0; if (a0 >= BETA) { a0 = a0 - BETA; a1 = a1 + 1; } a1 = a1 + b1; if (a1 >= BETA) { a1 = a1 - BETA; a2 = a2 + 1; } } Step8: /* If q /= 0, subtract q times the remaining digits of the divisor. */ if (q == 0) goto Step9; c = 0; for (i = 2; i <= n - 1; i++) { DPR(T[i],q,&c2,&c1); a = R[j - n + i]; a = a - c; if (a < 0) { a = a + BETA; c2 = c2 + 1; } a = a - c1; if (a < 0) { a = a + BETA; c2 = c2 + 1; } c = c2; R[j - n + i] = a; } a0 = a0 - c; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; if (a1 < 0) { a1 = a1 + BETA; a2 = a2 - 1; } } R[j] = a0; R[j + 1] = a1; R[j + 2] = a2; Step9: /* If the remainder is negative, decrease q by 1 and add the divisor to the remainder. */ if (a2 < 0) { q = q - 1; c = 0; for (i = 2; i <= n + 1; i++) { a = R[j - n + i] + T[i] + c; if (a >= BETA) { a = a - BETA; c = 1; } else c = 0; R[j - n + i] = a; } R[j + 2] = 0; } Step10: /* Store q and return for the next quotient digit, if any. */ Q[j - n + 2] = q; if (j > n) { j = j - 1; goto Step6; } Step11: /* De-normalize the remainder. */ if (hp > 0) AIDP2(R,hp,R); Step12: /* Store the lengths of Q and R, */ j = m - n + 1; if (Q[j + 1] == 0) j = j - 1; Q[1] = j; k = n; while (k >= 1 && R[k + 1] == 0) k = k - 1; R[1] = k; Step13: /* Store the signs of Q and R. */ Q[0] = A[0]; if (B[0] < 0) Q[0] = - Q[0]; if (j == 0 && Q[2] == 0) Q[0] = 0; if (k == 0 && R[2] == 0) R[0] = 0; else R[0] = A[0]; Return: /* Return. */ return; } saclib2.2.8/src/AFUPSFN.c0000664002275300236100000000322714017255270014011 0ustar wcbrownscs/*=========================================================================== AFUPSFN(M,B; s,Bt,F) Algebraic number field univariate polynomial squarefree norm. Inputs M : in Z[t], the minimal polynomial of an algebraic number alpha. B : in Q(alpha)[x]. B is squarefree and deg(B) >= 2. Outputs s : a nonnegative BETA-digit. Bt : in Q(alpha)[x]. Bt(alpha,x) = B(alpha,x-t*alpha), and the norm of Bt(alpha,x) is squarefree. F : a list (F_1,...,F_t) of the positive irreducible factors of the norm of Bt(alpha,x). ===========================================================================*/ #include "saclib.h" void AFUPSFN(M,B,s_,Bt_,F_) Word M,B,*s_,*Bt_,*F_; { Word Bp,Bs,Bt,F,Mp,P,R,Rp,S,b,d,n,p,s; Step1: /* Compute norm and check if it is squarefree. */ S = PBIN(PMON(1,0),1,PMON(-1,1),0); S = RPFIP(2,S); S = AFPCR(1,S); if (PDEGSV(2,AFPICR(1,B),1) == 0) { Bt = AFPCMV(1,M,B,S); s = 1; } else { Bt = B; s = 0; } P = MPRIME; n = LENGTH(P); d = MDRAN(n) + 1; p = LELTI(P,d); Mp = PINV(1,M,1); while (1) { Bp = AFPICR(1,Bt); IPSRP(2,Bp,&b,&Bp); Bp = PCPV(2,Bp,1,2); if (PDEG(Bp) > 0) { R = MPRES(2,p,MPHOM(2,p,Mp),MPHOM(2,p,Bp)); Rp = MUPDER(p,R); if (PDEG(MUPGCD(p,R,Rp)) == 0) { Bs = IPRES(2,Mp,Bp); Bs = IPABS(1,IPIPP(1,Bs)); break; } } Bt = AFPCMV(1,M,Bt,S); d = MDRAN(n) + 1; p = LELTI(P,d); s++; } Step2: /* Factor the norm. */ F = NORMFAC(M,Bt,Bs); Return: /* Prepare for return. */ *s_ = s; *Bt_ = Bt; *F_ = F; return; } saclib2.2.8/src/RPEMV.c0000664002275300236100000000176014017255270013600 0ustar wcbrownscs/*====================================================================== C <- RPEMV(r,A,b) Rational polynomial evaluation, main variable. Inputs A : in Q[X1,...,Xr]. r : a BETA-digit, r >= 1. b : in Q. Outputs C : in Q[X1,...,X_{r-1}], C(X1,...,X_{r-1}) = A(X1,...,X_{r-1},b). ======================================================================*/ #include "saclib.h" Word RPEMV(r,A,b) Word r,A,b; { Word Ap,C,a,e,ep,i,rp; /* hide Ap,a,e,ep,i,rp; */ Step1: /* A=0. */ if (A == 0) { C = 0; goto Return; } Step2: /* Horner method. */ Ap = A; C = 0; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (Ap == NIL) ep = 0; else ep = FIRST(Ap); C = RPSUM(rp,C,a); for (i = 1; i <= e - ep; i++) C = RPRNP(rp,b,C); } while (!(Ap == NIL)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/ILOG2.c0000664002275300236100000000131214017255270013514 0ustar wcbrownscs/*=========================================================================== n <- ILOG2(A) Integer logarithm, base 2. Inputs A : in Z. Outputs n : a BETA-integer. If A = 0 then n = 0. Otherwise, n = floor(log2(|A|))+1. ===========================================================================*/ #include "saclib.h" Word ILOG2(A) Word A; { Word Ap,n; Step1: /* A single-precision. */ if (A < BETA) { n = DLOG2(A); goto Return; } Step2: /* A multiple-precision. */ Ap = A; n = 0; while (RED(Ap) != NIL) { Ap = RED(Ap); n = n + ZETA; } n = n + DLOG2(FIRST(Ap)); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/ADV4.c0000664002275300236100000000151214017255270013400 0ustar wcbrownscs/*====================================================================== ADV4(L; a1,a2,a3,a4,Lp) Advance 4. Inputs L : a list of length 4 or more. Outputs a1 : the first element of L. a2 : the second element of L. a3 : the third element of L. a4 : the fourth element of L. Lp : the fourth reductum of L. ======================================================================*/ #include "saclib.h" void ADV4(L, a1_,a2_,a3_,a4_,Lp_) Word L, *a1_,*a2_,*a3_,*a4_,*Lp_; { Word Lp,a1,a2,a3,a4; /* hide algorithm */ Step1: /* Advance four times. */ ADV(L,&a1,&Lp); ADV(Lp,&a2,&Lp); ADV(Lp,&a3,&Lp); ADV(Lp,&a4,&Lp); Return: /* Prepare for return. */ *a1_ = a1; *a2_ = a2; *a3_ = a3; *a4_ = a4; *Lp_ = Lp; return; } saclib2.2.8/src/IUPSR.c0000664002275300236100000000211314017255270013602 0ustar wcbrownscs/*=========================================================================== IUPSR(A,B; ab,bb,C) Integral univariate polynomial semi-remainder. Inputs A,B : in Z[x], deg(A) >= deg (B) > 0. Outputs ab,bb : in Z. C : in Z[x]. Let m = deg(A), n = deg(B), k = m - n, a = ldcf(A), b = ldcf(B), d = gcd(a,b). Then ab = a/d, bb = b/d and C = bb * A - ab * x^k * B. ===========================================================================*/ #include "saclib.h" void IUPSR(A,B, ab_,bb_,C_) Word A,B, *ab_,*bb_,*C_; { Word Ab,Bb,C,C1,C2,a,ab,b,bb,d,k,m,n; Step1: /* Get degrees and leading coefficients. */ m = PDEG(A); n = PDEG(B); a = PLDCF(A); b = PLDCF(B); Step2: /* Compute cofactors. */ IGCDCF(a,b,&d,&ab,&bb); Step3: /* Compute C(x). */ k = m - n; Ab = PRED(A); Bb = PRED(B); C1 = IPIP(1,bb,Ab); C2 = IPPROD(1,LIST2(k,ab),Bb); C = IPDIF(1,C1,C2); Return: /* Prepare for return. */ *ab_ = ab; *bb_ = bb; *C_ = C; return; } saclib2.2.8/src/GETMATRIX.c0000664002275300236100000000155014017255270014250 0ustar wcbrownscs/*=========================================================================== A <- GETMATRIX(m,n) Get matrix. Input m : a positive integer. n : a positive integer. Output A : a pointer to a two-dimensional array of m*n Words, i.e., A points to an m-dimensional array of n-dimensional arrays. The array is not subject to garbage collection. ===========================================================================*/ #include #include "saclib.h" Word **GETMATRIX(m,n) Word m,n; { Word **p,i; Step1: /* Allocate memory for array. */ p = (Word **)malloc(m*sizeof(Word *)); if (p == NULL) FAIL("GETMATRIX","Out of memory."); for (i = 0; i < m; i++) { p[i] = GETARRAY(n); if (p[i] == NULL) FAIL("GETMATRIX","Out of memory."); } Return: /* Prepare for return. */ return(p); } saclib2.2.8/src/PGCDE.c0000664002275300236100000000202714017255270013526 0ustar wcbrownscs/*=========================================================================== d <- PGCDE(r,A,i) Polynomial greatest common divisor of exponents. Inputs r : a positive beta digit. A : a nonzero polynomial in r variables over any domain. i : a beta digit, 1 <= i <= r. Output d : the greatest common divisor of all exponents of x^i in A. ======================================================================*/ #include "saclib.h" Word PGCDE(r,A,i) BDigit i,r; Word A; { BDigit d,e; Word a,Ap; Step1: /* i = r. */ if (i == r) { Ap = A; d = 0; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); if (e > d) d = DGCD(e,d); else d = DGCD(d,e); if (d == 1) goto Return; } goto Return; } Step2: /* i < r. */ Ap = A; d = 0; while (Ap!= NIL) { ADV2(Ap,&e,&a,&Ap); e = PGCDE(r-1,a,i); if (e > d) d = DGCD(e,d); else d = DGCD(d,e); if (d == 1) goto Return; } Return: /* Return d. */ return(d); } saclib2.2.8/src/RNSIGN.c0000664002275300236100000000100714017255270013701 0ustar wcbrownscs/*====================================================================== s <- RNSIGN(R) Rational number sign. Inputs R : a rational number. Outputs s : sign(R). ======================================================================*/ #include "saclib.h" Word RNSIGN(R) Word R; { Word s; /* hide algorithm */ Step1: /* Compute. */ if (R == 0) s = 0; else s = ISIGNF(FIRST(R)); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/IUSFPF2.c0000664002275300236100000000217414017255270013765 0ustar wcbrownscs/*========================================================================= L <- IUSFPF2(A) Integral univariate squarefree polynomial factorization, degree 2. Inputs A : in Z[X], positive, primitive and of degree 2. Output L : a list of all the irreducible factors of A. ==========================================================================*/ #include "saclib.h" Word IUSFPF2(A) Word A; { Word a,b,c,D1,D2,D,ap,F1,F2,f1,f2,L,d,t; Step1: /* Compute the discriminant D. */ a = PCOEFF(A,2); b = PCOEFF(A,1); c = PCOEFF(A,0); D1 = IPROD(b,b); D2 = IPROD(IDPR(a,-4),c); D = ISUM(D1,D2); Step2: /* Is D a square? */ if (ISIGNF(D) < 0) t = 1; else ISQRT(D,&d,&t); if (t != 0) { L = LIST1(A); goto Return; } Step3: /* D a square. */ f1 = ISUM(b,d); ap = IDPR(a,2); F1 = IPSUM(1,PMON(ap,1),PMON(f1,0)); F1 = IPPP(1,F1); f2 = IDIF(b,d); F2 = IPSUM(1,PMON(ap,1),PMON(f2,0)); F2 = IPPP(1,F2); L = LIST2(F1,F2); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/PDEG.c0000664002275300236100000000076714017255270013434 0ustar wcbrownscs/*====================================================================== n <- PDEG(A) Polynomial degree. Inputs A : a polynomial. Outputs n : the degree of A. ======================================================================*/ #include "saclib.h" Word PDEG(A) Word A; { Word n; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) n = 0; else n = FIRST(A); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/MPIQH.c0000664002275300236100000000314414017255270013563 0ustar wcbrownscs/*====================================================================== MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C; A,B) Modular polynomial mod ideal, quadratic Hensel lemma. Inputs r : a BETA-digit, r >= 1. p : a BETA-digit, p prime. D : a list (d1,...,d_{r-1}), with di BETA-digits, di > 0. Ab,Bb,Sb,Tb : in Z/(p)[X1,...,X_{r-1},Y]/(X1^d1,...,X_{r-1}^d_{r-1}), with Ab monic, deg_Y(Ab) > 0, and Ab*Sb + Bb*Tb = 1. M : in Z, M = p^j for some j in Z, j > 0. Dp : a list (dp1,...,dp_{r-1}, with dpi BETA-digits, dpi > 0. C : in Z[X1,...,Xr], with C congruent to Ab*Bb. Outputs A,B : in Z/(p)[X1,...,X_{r-1},Y]/(X1^dp1,...,X_{r-1}^dp_{r-1}), with A monic, deg_Y(A) = deg_Y(Ab), A congruent to Ab, B congruent to Bb, and A*B congruent to C. ======================================================================*/ #include "saclib.h" void MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C, A_,B_) Word r,p,D,Ab,Bb,Sb,Tb,M,Dp,C, *A_,*B_; { Word A,As,B,Bs,Cb,Dh,Dpp,Ds,S,Ss,T,Ts,d,i; /* hide d,i; */ Step1: /* Initialize. */ Dh = D; A = Ab; B = Bb; S = Sb; T = Tb; Dpp = CINV(Dp); i = r - 1; Cb = MPHOM(r,p,C); Step2: /* Lift in Xi. */ while (i > 0) { ADV(Dpp,&d,&Dpp); MPIQHS(r,p,Dh,A,B,S,T,i,d,Cb,&As,&Bs,&Ss,&Ts,&Ds); A = As; B = Bs; S = Ss; T = Ts; Dh = Ds; i = i - 1; } Step3: /* Lift to M. */ IPIQH(r,p,Dp,As,Bs,S,T,M,C,&A,&B); Return: /* Prepare for return. */ *A_ = A; *B_ = B; return; } saclib2.2.8/src/IUPBEI.c0000664002275300236100000000241614017255270013663 0ustar wcbrownscs/*============================================================================= B <- IUPBEI(A,c,k) Integral univariate polynomial binary rational evaluation. Using arrays. Inputs A : a univariate integral polynomial. c : an integer. k : a nonnegative BETA-digit. Output B : an integer. B = 2^(k*n) * A(c/2^k), where n = deg(A). ==============================================================================*/ #include "saclib.h" Word IUPBEI(A,c,k) Word A,c,k; { BDigit d,e,f,M,M2,m,n,o,p,s,t; Word B,Bh[LARGE],*Bp,*C,Ch[SMALL]; Step1: /* Copy c into array. */ IFLTA(c,Ch,SMALL,&C,&m,&t,&o); Step2: /* Upper bound for length of result. */ n = PDEG(A); d = ILOGB(IPSUMN(1,A)); e = (k + 1) / ZETA + 1; f = maxm(e,m); M = n * f + d + 1; Step3: /* Get an array of twice the length. */ M2 = 2 * M; if (M2 > LARGE) Bp = GETARRAY(M2); else Bp = Bh; Step4: /* Accumulate result in array. */ IUPBREA(A,C,m,t,k,Bp,M,&p,&s); Step5: /* Copy result to list. */ B = IFATL(Bp,p,s); Step6: /* Free up memory. */ if (M2 > LARGE) FREEARRAY(Bp); if (m > SMALL) FREEARRAY(C); Return: /* Return B. */ return(B); } saclib2.2.8/src/ANDWRITE.c0000664002275300236100000000407214017255270014123 0ustar wcbrownscs/*=========================================================================== ANDWRITE(M,I,n) Algebraic number decimal write. Inputs M : an integral minimal polynomial for a real algebraic number alpha. I : an acceptable isolating interval for alpha. n : a nonnegative integer. Side effects A decimal approximation R to alpha is written to the output stream. |alpha - R| <= 1/2 10^{-n}. The decimal approximation is followed by "+" if |R| < |alpha| and "-" if |R| > |alpha|. ===========================================================================*/ #include "saclib.h" void ANDWRITE(M,I,n) Word M,I,n; { Word J,R,K; Word a,a1,a2,b,b1,b2,d,d1,d2,e,f,m; Word N; Step1: /* Rational number. */ if (PDEG(M) == 1) { R = IUPRLP(M); RNDWRITE(R,n); return; }; Step2: /* Interval approximation. */ J = ISFPIR(M,I,n + 1); Step3: /* 0 in J? */ while (RISIGN(J) == NIL) J = IUPIIR(M,J); Step4: /* Decimal approximation of interval endpoint. */ FIRST2(J,&a,&b); N = IEXP(10,n); if (RISIGN(J) > 0) { FIRST2(a,&a1,&a2); IQR(IPROD(a1,N),a2,&d1,&d2); d = RNRED(d1,N); e = RNSUM(d,LIST2(1,N)); f = RNSUM(e,LIST2(1,N)); } else { FIRST2(b,&b1,&b2); IQR(IPROD(b1,N),b2,&d1,&d2); f = RNRED(d1,N); e = RNDIF(f,LIST2(1,N)); d = RNDIF(e,LIST2(1,N)); } Step5: /* Refine interval until e not in J */ while ( RNCOMP(e,a) >= 0 && RNCOMP(e,b) <= 0) { J = IUPIIR(M,J); FIRST2(J,&a,&b); } if (RNCOMP(b,e) < 0) K = LIST2(d,e); else K = LIST2(e,f); Step6: /* determine which half alpha belongs to. */ FIRST2(K,&d,&e); m = RNQ(RNSUM(d,e),RNINT(2)); while (RNCOMP(m,a) >= 0 && RNCOMP(m,b) <= 0) { J = IUPIIR(M,J); FIRST2(J,&a,&b); } if (RNCOMP(b,m) < 0) { RNDWRITE(d,n); if (RISIGN(J) > 0) CWRITE('+'); else CWRITE('-'); } else { RNDWRITE(e,n); if (RISIGN(J) > 0) CWRITE('-'); else CWRITE('+'); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/SIPRRISD.c0000664002275300236100000000426414017255270014150 0ustar wcbrownscs/*====================================================================== L <- SIPRRISD(A,a,b) Software interval polynomial real root isolation, standard interval, Descartes' method. Inputs A : a software interval polynomial of positive degree. A[n] does not contain 0. a,b: logarithmic binary rational numbers such that (a,b) is an open logarithmic standard interval. Output L : either 0 or a list (I_1,...,I_r), r >= 0, of standard and one-point binary rational intervals, with I_1 < ... < I_r. Let T(x) = (b - a) x + a, the linear transformation that maps the interval (0,1) onto the interval (b - a). Let A*(x) = U(A(x)), where U is the inverse of T. If L /= 0, L is a list of isolating intervals for the roots of A*(x) in (a,b). If L = 0, the program was not able to produce such a list using software interval arithmetic of precision p, where p is the precision of A. ======================================================================*/ #include "saclib.h" Word SIPRRISD(A,a,b) BDigit *A; Word a,b; { BDigit *B,*C,s,S,t,v; Word c,L,L1,L2; Step1: /* Case that A has at most one variation, */ v = SIPVCHT(A); if (v == 0) { L = NIL; goto Return; } if (v == 1) { L = LIST1(LIST2(a,b)); goto Return; } if (v == NIL) { L = 0; goto Return; } Step2: /* Copy A into an array B. */ S = SIPSIZE(A); B = GETARRAY(S); SIPCOPY(A,B); Step3: /* Isolate roots of A in (0,1/2). */ SIPBHT(B,-1); c = LBRIMID(LIST2(a,b)); t = LBRNSIGN(c); if (t > 0) L1 = SIPRRISD(B,a,c); else L1 = SIPRRISD(B,c,b); if (L1 == 0 ) { FREEARRAY(B); L = 0; goto Return; } Step4: /* Isolate roots of A in (1/2,1). */ C = GETARRAY(SIPSIZE(B)); SIPTR1(B,C); FREEARRAY(B); s = SISIGN(C + 1); if (t > 0) L2 = SIPRRISD(C,c,b); else L2 = SIPRRISD(C,a,c); if (L2 == 0) { L = 0; goto Step6; } Step5: /* Include midpoint if a root. */ if (t > 0) { if (s == 0) L2 = COMP(LIST2(c,c),L2); L = CONC(L1,L2); } else { if (s == 0) L1 = COMP(LIST2(c,c),L1); L = CONC(L2,L1); } Step6: /* Free array C. */ FREEARRAY(C); Return: /* Return L. */ return(L); } saclib2.2.8/src/LBRNF.c0000664002275300236100000000150214017255270013544 0ustar wcbrownscs/*====================================================================== LBRNF(B,p,d,A) Logarithmic binary rational to floating. Inputs B : a logarithmic binary rational number. p : a BETA-digit, the desired precision. d : -1, 0 or +1, the rounding direction. -1 : down 0 : nearest (mantissa even in case of a tie) +1 : up A : an array of size at least p + 3. Effect The specified p-precision software floating point number is placed in A. ========================================================================*/ #include "saclib.h" void LBRNF(B,p,d,A) Word B; BDigit p,d,*A; { Word b; BDigit e; Step1: /* Apply IF. */ if (B == 0) IF(0,p,d,A); else { FIRST2(B,&b,&e); IF(b,p,d,A); A[0] = A[0] - e; } Return: /* Return. */ return; } saclib2.2.8/src/FLBRN.c0000664002275300236100000000213114017255270013543 0ustar wcbrownscs/*====================================================================== B <- FLBRN(F) Floating point to logarithmic binary rational number conversion. Inputs F : a software floating point number. Outputs B : a logarithmic binary rational number, B = F. ======================================================================*/ #include "saclib.h" Word FLBRN(F) BDigit *F; { BDigit e,f,i,n,s,p; Word A,B; Step1: /* F = 0. */ if (F[1] == 0) { B = 0; goto Return; } Step2: /* Get exponent, sign and precision. */ e = F[0]; s = F[1]; p = F[2]; Step3: /* Convert mantissa to an integer A. */ if (p == 1) A = F[3]; else { A = NIL; for (i = p + 2; i >= 3; i--) A = COMP(F[i],A); } Step4: /* Divide A by the largest possible power of 2. */ n = IORD2(A); A = IDP2(A,n); Step5: /* Make A negative? */ if (s < 0) A = INEG(A); Step6: /* Compute the base 2 logarithm of the denominator. */ f = p * ZETA - n - e; Step7: /* Compose B. */ B = LIST2(A,f); Return: /* Return B. */ return(B); } saclib2.2.8/src/ILCOMB.c0000664002275300236100000000240014017255270013644 0ustar wcbrownscs/*=========================================================================== C <- ILCOMB(A,B,u,v) Integer linear combination. Inputs A, B : in Z. A,B >= 0. u, v : BETA-integers such that A*u+B*v >= 0. Outputs C : in Z such that C=A*u+B*v. ===========================================================================*/ #include "saclib.h" Word ILCOMB(A,B,u,v) Word A,B,u,v; { Word Ab,Bb,C,a,a0,a1,b,b0,b1,c0,c1; Step1: /* Convert to lists. */ if (A > BETA) Ab = A; else Ab = LIST1(A); if (B > BETA) Bb = B; else Bb = LIST1(B); Step2: /* Multiply and add. */ C = NIL; c1 = 0; do { AADV(Ab,&a,&Ab); AADV(Bb,&b,&Bb); DPR(a,u,&a1,&a0); DPR(b,v,&b1,&b0); c0 = a0 + b0; c0 = c0 + c1; c1 = a1 + b1; while (c0 < 0) { c0 = c0 + BETA; c1 = c1 - 1; } if (c0 >= BETA) { c0 = c0 - BETA; c1 = c1 + 1; } C = COMP(c0,C); } while (Ab != NIL || Bb != NIL); if (c1 != 0) C = COMP(c1,C); Step3: /* Normalize. */ while (C != NIL && FIRST(C) == 0) C = RED(C); if (C == NIL) C = 0; else if (RED(C) == NIL) C = FIRST(C); else C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SECOND.c0000664002275300236100000000102214017255270013651 0ustar wcbrownscs/*====================================================================== a <- SECOND(L) Second. Inputs L : list of length 2 or more. Outputs a : the second element of L. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word SECOND(L) Word L; { Word a; /* hide algorithm */ Step1: /* Get it. */ a = FIRST(RED(L)); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/GIRP.c0000664002275300236100000000144614017255270013451 0ustar wcbrownscs/*====================================================================== b <- GIRP(a) Gaussian integer reduced part. Input a : a nonzero Gaussian integer. Output b : a greatest divisor of a that is not divisible by 1 + i. ======================================================================*/ #include "saclib.h" Word GIRP(a) Word a; { Word a1,a2,b1,b2,b; BDigit s1,s2; Step1: /* Division loop. */ FIRST2(a, &a1,&a2); do { s1 = IEVEN(a1); s2 = IEVEN(a2); if (s1 != s2) goto Step2; if (s1 == 1) { a1 = IQ(a1,2); a2 = IQ(a2,2); } else { b1 = ISUM(a1,a2); b2 = IDIF(a2,a1); a1 = IQ(b1,2); a2 = IQ(b2,2); } } while (1); Step2: /* Compose. */ b = LIST2(a1,a2); Return: /* Return b. */ return(b); } saclib2.2.8/src/IUPSQHL.c0000664002275300236100000001067514017255270014041 0ustar wcbrownscs/*=========================================================================== IUPSQHL(p,Ab,Bb,Sb,Tb,Q,C; A,B,S,T) Integral univariate polynomial single-precion quadratic Hensel lifting. Inputs p : a BETA-digit, p prime. Ab,Bb,Sb,Tb : in Z/(p)[X], with Ab*Sb + Bb*Tb = 1, and deg(Tb) < deg(Ab). Q : a single-precision power of p. C : in Z/(Q)[X], C = Ab*Bb (mod p). Outputs A,B : in Z/(Q)[X], with ldcf(A) = ldcf(Ab), deg(A) = deg(Ab), A congruent to Ab, B congruent to Bb, and C congruent to A*B. S,T : in Z/(Q)[X], with A*S + B*T = 1 and deg(T) < deg(A). ===========================================================================*/ #include "saclib.h" void IUPSQHL(p,Ab,Bb,Sb,Tb,Q,C, A_,B_,S_,T_) Word p,Ab,Bb,Sb,Tb,Q,C, *A_,*B_,*S_,*T_; { Word A,B,S,T,Qp,c,n,i,u,q,qp,qs,qt; Word *Ah,*As,*At,*Bh,*Bs,*Bt,*Sh,*Ss,*St,*Th,*Ts,*Tt; Word *R,*Rp,*Ch,*Cs,*U,*Y,*Z; Word d_a,d_b,qss,cs; Step1: /* Nothing to do. */ if (p == Q) { A = Ab; B = Bb; S = Sb; T = Tb; goto Return; } Step2: /* Initialize. */ q = p; d_a = PDEG(Ab); d_b = PDEG(Bb); As = MAPFMUP(Ab); Bs = MAPFMUP(Bb); Ss = MAPFMUPS(Sb,d_b - 1); Ts = MAPFMUPS(Tb,d_a - 1); Cs = MAPFMUP(C); Ah = MAPCOPY(As); Bh = MAPCOPY(Bs); Sh = MAPGET(d_b - 1); MAPASSIGN(Ss,Sh); Th = MAPGET(d_a - 1); MAPASSIGN(Ts,Th); At = MAPGET(d_a); Bt = MAPGET(d_b); St = MAPGET(d_b - 1); Tt = MAPGET(d_a - 1); R = MAPGET(d_a + d_b); Rp = MAPGET(d_b + d_a - 1); Ch = MAPGET(PDEG(C)); U = MAPGET(d_a + d_b); Y = MAPGET(d_b); Z = MAPGET(d_a - 1); qs = IPROD(q,q); c = ICOMP(qs,Q); Step3: /* Prepare for the next lifting step. */ if (c > 0) { qp = 1; qt = q; Qp = Q/p; do { qp *= p; qt *= p; } while (qt <= Qp); qt = qp; qs = q * qp; MAPHOM(qt,Ah,At); MAPHOM(qt,Bh,Bt); MAPHOM(qt,Sh,St); MAPHOM(qt,Th,Tt); } else { qt = q; MAPASSIGN(Ah,At); MAPASSIGN(Bh,Bt); MAPASSIGN(Sh,St); MAPASSIGN(Th,Tt); } MAPHOM(qs,Cs,Ch); qss = IPROD(qs,qs); cs = ICOMP(qss,Q); Step4: /* Compute the residue for lifting the factors. */ if (cs > 0) MAPPROD(qs,Ah,Bh,R); else MMAPPROD(qs,Ah,Bh,R); MAPDIF(qs,Ch,R,U); n = MAPDEG(U); for (i = 0; i <= n; i++) MAPCF(U,i) /= q; /* exact division. */ Step5: /* Lift the factors. */ MMAPSE(qt,At,Bt,St,Tt,U, Y,Z); n = MAPDEG(Z); for (i = 0; i <= n; i++) MAPCF(As,i) += q * MAPCF(Z,i); n = MAPDEG(Y); for (i = 0; i <= n; i++) MAPCF(Bs,i) += q * MAPCF(Y,i); Step6: /* Compute the residue for lifting the lift basis. */ if (cs > 0) { MAPPROD(qs,As,Sh,R); MAPPROD(qs,Bs,Th,Rp); } else { MMAPPROD(qs,As,Sh,R); MMAPPROD(qs,Bs,Th,Rp); } MAPSUM(qs,R,Rp,U); u = MDDIF(qs,MAPCF(U,0),1); MAPCF(U,0) = u; n = MAPDEG(U); for (i = 0; i <= n; i++) MAPCF(U,i) = MDNEG(qs,MAPCF(U,i)) / q; /* exact division. */ Step7: /* Lift the lift basis. */ MMAPSE(qt,At,Bt,St,Tt,U, Y,Z); n = minm(MAPDEG(Y),MAPDEG(Ss)); for (i = 0; i <= n; i++) MAPCF(Ss,i) += q * MAPCF(Y,i); while (i <= MAPDEG(Y)) { MAPCF(Ss,i) = q * MAPCF(Y,i); i++; } MAPDEG(Ss) = maxm(MAPDEG(Ss),i-1); n = minm(MAPDEG(Z),MAPDEG(Ts)); for (i = 0; i <= n; i++) MAPCF(Ts,i) += q * MAPCF(Z,i); while (i <= MAPDEG(Z)) { MAPCF(Ts,i) = q * MAPCF(Z,i); i++; } MAPDEG(Ts) = maxm(MAPDEG(Ts),i-1); Step8: /* Advance and check for end. */ q = qs; qs = qss; MAPASSIGN(As,Ah); MAPASSIGN(Bs,Bh); MAPASSIGN(Ss,Sh); MAPASSIGN(Ts,Th); if (c < 0) { c = cs; goto Step3; } Step9: /* Convert to lists and free arrays. */ A = MUPFMAP(Ah); B = MUPFMAP(Bh); S = MUPFMAP(Sh); T = MUPFMAP(Th); MAPFREE(Ah); MAPFREE(Bh); MAPFREE(Sh); MAPFREE(Th); MAPFREE(As); MAPFREE(Bs); MAPFREE(Ss); MAPFREE(Ts); MAPFREE(At); MAPFREE(Bt); MAPFREE(St); MAPFREE(Tt); MAPFREE(R); MAPFREE(Rp); MAPFREE(Ch); MAPFREE(Cs); MAPFREE(U); MAPFREE(Y); MAPFREE(Z); Return: /* Prepare for return. */ *A_ = A; *B_ = B; *S_ = S; *T_ = T; return; } saclib2.2.8/src/DIRPREAD.c0000664002275300236100000000423414017255270014100 0ustar wcbrownscs/*====================================================================== A <- DIRPREAD(V) Distributive rational polynomial read. Inputs V : a variable list. Outputs A : in Q[X1,...Xr], distributive representation, where r=length(V), r >= 0. A is read from the input stream. Any preceding blanks and blanks separating integers, variables, exponents and the symbols *,+,-,/ and ^ are skipped. ======================================================================*/ #include "saclib.h" Word DIRPREAD(V) Word V; { Word A,C,Cp,E,a,e,i,j,k,r,v; /* hide C,e,i,j,k,r; */ Step1: /* Rl=0. */ if (V == NIL) { A = RNREAD(); goto Return; } Step2: /* Initialize. */ C = CREADB(); if (C != '(') goto Step7; A = NIL; r = LENGTH(V); Step3: /* Read first coefficient */ C = LKAHEAD(); if (LETTER(C) || DIGIT(C)) { if (LETTER(C)) a = RNINT(1); else a = RNREAD(); A = COMP(a,A); goto Step5; } Step4: /* Read coefficient. */ C = CREADB(); if (C != '+' && C != '-') goto Step7; Cp = LKAHEAD(); if (DIGIT(Cp)) a = RNREAD(); else a = RNINT(1); if (C == '-') a = RNNEG(a); A = COMP(a,A); Step5: /* Read monic monomial. */ E = NIL; i = 1; do { C = LKAHEAD(); if (!LETTER(C)) goto Step6; v = VREAD(); j = VLSRCH(v,V); if (j < i) goto Step7; for (k = i; k <= j - 1; k++) E = COMP(0,E); C = LKAHEAD(); if (C == '^') { C = CREAD(); e = AREAD(); } else e = 1; E = COMP(e,E); i = j + 1; } while (!(i > r)); Step6: /* Complete exponent vector. */ for (k = i; k <= r; k++) E = COMP(0,E); A = COMP(E,A); C = CREADB(); if (C == '+' || C == '-') { BKSP(); goto Step4; } if (C == ')') { A = INV(A); goto Return; } Step7: /* Error. */ FAIL("DIRPREAD","Unexpected character",C); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/IEVEN.c0000664002275300236100000000104014017255270013544 0ustar wcbrownscs/*====================================================================== t <- IEVEN(A) Integer even. Inputs A : in Z. Outputs t : a BETA-digit, t = 1 if A is even, t = 0 otherwise. ======================================================================*/ #include "saclib.h" Word IEVEN(A) Word A; { Word t; /* hide algorithm */ Step1: /* Determine. */ if (A < BETA) t = EVEN(A); else t = EVEN(FIRST(A)); Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/ICRAND.c0000664002275300236100000000171114017255270013643 0ustar wcbrownscs/*====================================================================== A <- ICRAND(n,s) Integer, controlled random. Inputs n : a positive BETA-integer. s : 1 or -1, a BETA-integer. Outputs A : a random integer whose bit length is exactly n and whose sign is s. ======================================================================*/ #include "saclib.h" Word ICRAND(n,s) Word n,s; { Word A,a,i,q,r; Step1: /* Compute high-order BETA-digit. */ QREM(n,ZETA,&q,&r); if (r == 0) { q = q - 1; r = ZETA; } a = ABS(DRAN()); a = a >> (ZETA - r); a = a | (01 << (r - 1)); if (s < 0) a = - a; if (q == 0) { A = a; goto Return; } A = LIST1(a); Step2: /* Compute remaining digits. */ for (i = 1; i <= q; i++) { a = ABS(DRAN()); if (s < 0) a = -a; A = COMP(a,A); } Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/AIDP2.c0000664002275300236100000000172614017255270013510 0ustar wcbrownscs/*======================================================================= AIDP2(A,k,B) Array integer division by a power of 2. Inputs A : an array integer. k : a BETA integer, 0 <= k < ZETA. B : an array large enough for the result. Effect The integral part of A / 2^k is placed in B. Note that B may be the same array as A. ========================================================================*/ #include "saclib.h" void AIDP2(A,k,B) BDigit *A,k,*B; { BDigit *Ap,*Bp,i,kp,n; Step1: /* Either A = 0 or k = 0. */ if (A[0] == 0 || k == 0) { if (A != B) AICOPY(A,B); goto Return; } Step2: /* Shift. */ n = A[1]; Ap = A + 2; Bp = B + 2; kp = ZETA - k; for (i = 0; i <= n - 2; i++) Bp[i] = (Ap[i] >> k) | ((Ap[i + 1] << kp) & BETA1); Bp[n - 1] = Ap[n - 1] >> k; B[0] = A[0]; B[1] = A[1]; if (Bp[n - 1] == 0) B[1] = B[1] - 1; if (B[1] == 0 && Bp[0] == 0) B[0] = 0; Return: /* Return. */ return; } saclib2.2.8/src/IDQRA.c0000664002275300236100000000321314017255270013542 0ustar wcbrownscs/*=========================================================================== IDQRA(A,m,b,Q; k,r) Integer-digit quotient and remainder, array version. Inputs A : an array containing a positive integer A. m : the length of A in BETA-digits. b : a positive BETA-digit. Q : an array at least m elements long. Outputs k : the length of Q' in BETA-digits. r : a BETA-digit, r = A - b * Q' and r >= 0. Side effects Q' is put in Q. ===========================================================================*/ #include "saclib.h" void IDQRA(A,m,b,Q, k_,r_) Word *A,m,b,*Q, *k_,*r_; { Word Qp,a,a0,a1,h,hp,i,k,q,r; Step1: /* A single-precision. */ if (m == 1) { a = A[0]; Qp = a / b; Q[0] = Qp; if (Qp == 0) k = 0; else k = 1; r = a - b * Qp; goto Return; } Step2: /* Copy A to Q. */ for (i = 0; i < m; i++) Q[i] = A[i]; Step3: /* b = 1. */ r = 0; if (b == 1) { k = m; goto Return; } Step4: /* b < 2^15. */ if (b < (01 << 15)) { for (i = m - 1; i >= 0; i--) { PHDQR(r,Q[i],b,&q,&r); Q[i] = q; } goto Step6; } Step5: /* b >= 2^15. */ h = PDLOG2(b); hp = ZETA - h; b <<= hp; a1 = Q[m - 1]; r = a1 >> h; for (i = m - 1; i > 0; i--) { a0 = ((Q[i] << hp) & BETA1) | (Q[i - 1] >> h); PNDQR(r,a0,b,&q,&r); Q[i] = q; } a0 = (Q[0] << hp) & BETA1; PNDQR(r,a0,b,&q,&r); Q[0] = q; r >>= hp; Step6: /* Determine length of quotient. */ k = m; while (Q[k - 1] == 0) k--; Return: /* Prepare for return. */ *k_ = k; *r_ = r; return; } saclib2.2.8/src/HIPPRB.c0000664002275300236100000000340314017255270013667 0ustar wcbrownscs/*====================================================================== k <- HIPPRB(n,A) Hardware interval polynomial positive root bound. Inputs n : a positive beta-digit. A : a hardware integral polynomial of degree n such that A[n] does not contain zero. Output k : If all nonzero coefficients of A have the same sign, then A has no positive roots and k = NIL. Otherwise k is the least positive integer such that for all i, 1 <= i < n, 2 (-a_{n-1} / a_n)^{1/i} <= k, a beta-digit such that all positive roots are less than 2^k. ======================================================================*/ #include "saclib.h" BDigit HIPPRB(n,A) BDigit n; interval *A; { BDigit d,e,f,i,j,q,r,s,t; Word k; Step1: /* Branch on sign of leading coefficient. */ k = NIL; s = HSIGN(A[n].right); if (s < 0) goto Step3; Step2: /* A[n] > 0, process terms. */ e = HEXP(A[n].left); for (i = n - 1; i >= 0; i--) { t = HSIGN(A[i].left); if (t < 0) { f = HEXP(A[i].left); j = n - i; d = f - e + 1; QREM(d,j,&q,&r); if (r > 0) { r = r - j; q = q + 1; } if (k == NIL || q > k) k = q; } } if (k != NIL) k = k + 1; goto Return; Step3: /* A[n] < 0, process terms. */ e = HEXP(A[n].right); for (i = n - 1; i >= 0; i--) { t = HSIGN(A[i].right); if (t > 0) { f = HEXP(A[i].right); j = n - i; d = f - e + 1; QREM(d,j,&q,&r); if (r > 0) { r = r - j; q = q + 1; } if (k == NIL || q > k) k = q; } } if (k != NIL) k = k + 1; Return: /* Return k. */ return(k); } saclib2.2.8/src/FPCHECK.c0000664002275300236100000000101414017255270013742 0ustar wcbrownscs/*====================================================================== FPCHECK() Floating-point check. Outputs t : 1 if a floating-point underflow, overflow, or divide by zero has occurred since the last call to FPCATCH(); 0 otherwise. ======================================================================*/ #include "saclib.h" #include Word FPCHECK() { Word t; t = 0; if (fetestexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)) { t = 1; } return t; } saclib2.2.8/src/IPEXPREADR.c0000664002275300236100000000161414017255270014350 0ustar wcbrownscs/*=========================================================================== IPEXPREADR(r,V; A,t) Integral polynomial expression read, remove terminating character. Inputs r : a positive BETA-digit. V : a non-NIL list (x_1,...,x_r) of r distinct variables. Outputs A : in Z[x_1,...,x_r]. A is read from the input stream. t : 1 if A is successfully read in, 0 otherwise. ===========================================================================*/ #include "saclib.h" void IPEXPREADR(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,t; Step1: /* Setup. */ t = 1; A = 0; Step2: /* Read in terms. */ do { IPTERMREAD(r,V,&A1,&t); if (t == 0) goto Return; A = IPSUM(r,A,A1); C = CREADB(); BKSP(); } while (C == '+' || C == '-'); CREADB(); Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/HIACC.c0000664002275300236100000000212214017255270013507 0ustar wcbrownscs/*====================================================================== n <- HIACC(I) Hardware interval accuracy. Input I : a hardware interval. Output n : a beta digit. If I contains zero then n = 0. If I < 0 then n is the same as for -I. Assume I = [a,b], a > 0. If b = a, then n = 53. Otherwise, Let d = b - a, q = d / a. Then n is is the least integer such that 2^{-n-1} <= q. ======================================================================*/ #include "saclib.h" BDigit HIACC(I) interval I; { BDigit n; double a,b,d,q,t; ieee Q; ieee_rep qb; unsigned e; int eb; Step1: /* Reduce to the case I = [a,b], a > 0. */ a = I.left; b = I.right; if (a > 0) goto Step2; else if (b < 0) { t = a; a = -b; b = -t; goto Step2; } else { n = 0; goto Return; } Step2: /* Compute n. */ rounddown(); if (a == b) { n = 53; goto Return; } d = b - a; if (d > a) { n = 0; goto Return; } q = d / a; Q.num = q; qb = Q.rep; e = qb.exp; eb = (int)e; n = 1023 - eb; Return: /* Return n. */ return(n); } saclib2.2.8/src/LWRITE.c0000664002275300236100000000135314017255270013713 0ustar wcbrownscs/*====================================================================== LWRITE(L) List write. Inputs L : a list. Side effects The input list L is written in the output stream. ======================================================================*/ #include "saclib.h" void LWRITE(L) Word L; { Word L1,Lp; Step1: /* Initialize. */ CWRITE('('); Lp = L; Step2: /* Write list elements. */ while (Lp != NIL) { ADV(Lp,&L1,&Lp); if (L1 < BETA) AWRITE(L1); else LWRITE(L1); if (Lp != BETA) CWRITE(','); } Step3: /* Finish. */ CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/NEXTSS.c0000664002275300236100000000214714017255270013733 0ustar wcbrownscs/*======================================================================= t <- NEXTSS(n,m,A) Next subset. Inputs n, m : positive beta digits, m <= n. A : An array of m integers representing an ascending m-tuple of integers from {1,2,...,n}. Ascending means that A[i] < A[i+1] for 1 <= i < m. Output t : 0 or 1. Effect If the content of A is lexicographically last among all ascending m-tuples from {1,2,...,n}, then t = 0. Otherwise t = 1 and the content of A is changed to represent the lexicographically next ascending m-tuple from {1,2,...,n}. ========================================================================*/ #include "saclib.h" BDigit NEXTSS(n,m,A) BDigit n,m,*A; { BDigit i,j,t; Step1: /* Find rightmost increasable element, if any. */ for (i = 1; i <= m; i++) { if (A[m-i] < n - i + 1) goto Step3; } Step2: /* Lexicographically last. */ t = 0; goto Return; Step3: /* Produce next m-tuple. */ A[m-i] = A[m-i] + 1; for (j = m-i+1; j < m; j++) A[j] = A[j-1] + 1; t = 1; Return: /* Return t. */ return(t); } saclib2.2.8/src/IPSF.c0000664002275300236100000000216014017255270013443 0ustar wcbrownscs/*====================================================================== L <- IPSF(r,A) Integral polynomial squarefree factorization. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr], A primitive and of positive degree. Outputs L : a list ((e1,A1),...,(ek,Ak)) where A = A1^e1 * A2^e2 * ... * Ak^ek is the squarefree factorization of A in which 1 <= e1 < ... < ek and each Ai is a positive squarefree polynomial of positive degree. ======================================================================*/ #include "saclib.h" Word IPSF(r,A) Word r,A; { Word Ap,B,Bp,C,Cp,D,L,j; /* hide j; */ Step1: /* Initialize. */ L = NIL; Ap = IPDMV(r,A); IPGCDC(r,A,Ap,&B,&C,&Cp); j = 1; Step2: /* Compute factors. */ while (PDEG(B) > 0) { IPGCDC(r,B,C,&D,&Bp,&Cp); if (PDEG(Cp) > 0) L = COMP(LIST2(j,Cp),L); B = Bp; C = D; j = j + 1; } Step3: /* Finish. */ L = COMP(LIST2(j,C),L); L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/AFUPGS.c0000664002275300236100000000147314017255270013675 0ustar wcbrownscs/*=========================================================================== B <- AFUPGS(M,A) Algebraic number field univariate polynomial greatest squarefree divisor. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A : in Q(alpha)[x]. Outputs B : in Q(alpha)[x]. If A = 0 then B = 0 else B is the monic associate of the greatest squarefree divisor of A. ===========================================================================*/ #include "saclib.h" Word AFUPGS(M,A) Word M,A; { Word B,Bp,C,D; Step1: /* A equal 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A not equal 0. */ B = AFPMON(1,M,A); if (PDEG(B) > 0) { Bp = AFPDMV(1,M,B); AFUPGC(M,B,Bp,&C,&B,&D); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/ILWORD.c0000664002275300236100000000203214017255270013700 0ustar wcbrownscs/*=========================================================================== ILWORD(A,m,B,n; a,b) Integer leading word. Inputs A, B: in Z, in array representation, A, B > 0. If u and v are the bit-lengths of A and B, respectively, then u >= ZETA and 0 <= u - v < ZETA. m, n: BETA digits, the word lengths of A and B, respectively. Output a : a BETA digit, the leading ZETA bits of A. b : a BETA digit, the leading (ZETA - u + v) bits of B. ===========================================================================*/ #include "saclib.h" void ILWORD(A,m,B,n, a_,b_) Word *A,m,*B,n, *a_,*b_; { Word a,b,d,e; Step1: /* Get leading word of A. */ a = A[m-1]; d = PDLOG2(a); e = ZETA - d; if (e > 0) a = (a << e) | (A[m-2] >> d); Step2: /* Get leading word of B. */ b = B[n-1]; if (m == n) { if (n > 1) b = (b << e) | (B[n-2] >> d); } else b = b >> d; Return: /* Prepare for return. */ *a_ = a; *b_ = b; return; } saclib2.2.8/src/PCL.c0000664002275300236100000000153514017255270013325 0ustar wcbrownscs/*====================================================================== L <- PCL(A) Polynomial coefficient list. Inputs A : a non-zero polynomial. Outputs L : the list (an,a_{n-1},...,a0) where n = deg(A) and A(x) = an X^n + a_{n-1} X^{n-1} +...+ a0. ======================================================================*/ #include "saclib.h" Word PCL(A) Word A; { Word Ap,L,a,e,m,n; /* hide Ap,a,e,m,n; */ Step1: /* Compute. */ Ap = A; n = FIRST(Ap); L = NIL; for (m = n; m >= 0; m--) { if (Ap == NIL) e = -1; else e = FIRST(Ap); if (e == m) ADV2(Ap,&e,&a,&Ap); else a = 0; L = COMP(a,L); } L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/ISI.c0000664002275300236100000000415414017255270013333 0ustar wcbrownscs/*====================================================================== ISI(I,p,A) Integer to software interval. Inputs I : an integer. p : a beta digit, the desired precision. A : an array of size at least 2 p + 6. Effect The smallest p-precision software floating point interval containing I is placed in A. ======================================================================*/ #include "saclib.h" void ISI(I,p,A) Word I; BDigit p,*A; { BDigit a,*B,*C,e,i,k,m,n,s,t; Word J; Step1: /* I = 0. */ if (I == 0) { A[0] = 0; A[1] = 0; A[2] = p; A[p + 3] = 0; A[p + 4] = 0; A[p + 5] = p; goto Return; } Step2: /* Invert the list for I. */ if (I < BETA) J = LIST1(I); else J = CINV(I); Step3: /* Put the leading p + 1 digits in an array B. */ s = SIGN(FIRST(J)); B = GETARRAY(p + 1); k = p; while (J != NIL && k >= 0) { ADV(J, &a,&J); B[k] = ABS(a); k = k - 1; } if (k >= 0) { for (i = k; i >= 0; i--) B[i] = 0; } Step4: /* Normalize. */ n = ZETA - PDLOG2(B[p]); if (n > 0) ILSA(B,p + 1,n); e = (p - k) * ZETA - n; Step5:/* Exact conversion. */ m = LENGTH(J); if (m > 0) e = e + m * ZETA; A[0] = e; A[1] = s; A[2] = p; A[p + 3] = e; A[p + 4] = s; A[p + 5] = p; t = 0; while (t == 0 && J != NIL) { t = FIRST(J); if (t == 0) J = RED(J); } if (t == 0 && B[0] == 0) { AWCOPY(B + 1,p,A + 3); AWCOPY(B + 1,p,A + p + 6); goto Step7; } Step6: /* Round. */ C = GETARRAY(p); AWCOPY(B + 1,p,C); t = 1; i = 1; while (t > 0 && i <= p) { B[i] = B[i] + 1; if (B[i] == BETA) B[i] = 0; else t = 0; i = i + 1; } if (B[p] == 0) { B[p] = BETA2; e = e + 1; } if (s > 0) { AWCOPY(B + 1,p,A + p + 6); AWCOPY(C,p,A + 3); A[p + 3] = e; } else { AWCOPY(B + 1,p,A + 3); AWCOPY(C,p,A + p + 6); A[0] = e; } FREEARRAY(C); Step7: /* Free array B. */ FREEARRAY(B); Return: /* return. */ return; } saclib2.2.8/src/SIPIIS.c0000664002275300236100000000550614017255270013711 0ustar wcbrownscs/*====================================================================== SIPIIS(A1,I1,t1,A2,I2,t2; J1,J2,s) Software interval polynomial isolating interval separation. Inputs A1, A2 : software interval polynomials of positive degrees and the same precision. I1, I2 : isolating logarithmic binary rational intervals for real roots alpha1 and alpha2 of A1 and A2 respectively. Each is either open and standard or one-point. t1, t2 : the trends of alpha1 and alpha2 respectively. Outputs J1, J2 : J_i is an isolating logarithmic binary rational interval for alpha_i that is either open and standard or one-point and is a subinterval of I_i. s : if s = -1, J1 < J2; if s = +1, J1 > J2. In either of these cases, J1 and J2 share an endpoint only if both are open. Otherwise s = 0, in which case these conditions do not hold, but neither J1 nor J2 could be further refined using p-precision arithmetic, where p is the common precision of A1 and A2. ======================================================================*/ #include "saclib.h" void SIPIIS(A1,I1,t1,A2,I2,t2, J1_,J2_,s_) BDigit *A1; Word I1; BDigit t1,*A2; Word I2; BDigit t2,*J1_,*J2_,*s_; { BDigit *F,p,s,t,u,w1,w2; Word f,J1,J2; Step1: /* Initialize. */ p = A1[3]; J1 = I1; J2 = I2; if (LBRIW(J1) == 0) w1 = BETA1; else w1 = - LSILW(J1); if (LBRIW(J2) == 0) w2 = BETA1; else w2 = - LSILW(J2); F = GETARRAY(p + 3); Step2: /* Refinement step. */ u = LBRNCOMP(SECOND(J1),FIRST(J2)); if (u < 0 || (u == 0 && LBRNCOMP(FIRST(J1),FIRST(J2)) < 0 && w1 != BETA1 && w2 != BETA1)) { s = -1; goto Step3; } u = LBRNCOMP(SECOND(J2),FIRST(J1)); if (u < 0 || (u == 0 && LBRNCOMP(FIRST(J2),FIRST(J1)) < 0 && w1 != BETA1 && w2 != BETA1)) { s = +1; goto Step3; } if (w1 <= w2) { if (w1 == BETA1) { s = 0; goto Step3; } f = LSIM(FIRST(J1),SECOND(J1)); t = LBRNFEC(f,p,F); if (t == 0) { s = 0; goto Step3; } t = SIPES(A1,F); if (t == NIL) { s = 0; goto Step3; } if (t == 0) { J1 = LIST2(f,f); w1 = BETA1; } else if (t == t1) J1 = LIST2(FIRST(J1),f); else J1 = LIST2(f,SECOND(J1)); w1 = w1 + 1; } else { f = LSIM(FIRST(J2),SECOND(J2)); t = LBRNFEC(f,p,F); if (t == 0) { s = 0; goto Step3; } t = SIPES(A2,F); if (t == NIL) { s = 0; goto Step3; } if (t == t2) J2 = LIST2(FIRST(J2),f); else J2 = LIST2(f,SECOND(J2)); w2 = w2 + 1; } goto Step2; Step3: /* Free array F. */ FREEARRAY(F); Return: /* Return J1, J2 and s. */ *J1_ = J1; *J2_ = J2; *s_ = s; return; } saclib2.2.8/src/IF.c0000664002275300236100000000456414017255270013212 0ustar wcbrownscs/*====================================================================== IF(I,p,d,A) Integer to floating. Inputs I : an integer. p : a beta digit, the desired precision. d : -1, 0 or +1, the rounding direction. -1 : down 0 : nearest (mantissa even in case of a tie) +1 : up A : an array of size at least p + 3. Effect The specified p-precision software floating point number is placed in A. ========================================================================*/ #include "saclib.h" void IF(I,p,d,A) Word I; BDigit p,d,*A; { BDigit a,b,e,i,k,m,M,n,s,t; Word J; Step1: /* I = 0. */ if (I == 0) { A[0] = 0; A[1] = 0; A[2] = p; goto Return; } Step2: /* Invert the list for I. */ if (I < BETA) J = LIST1(I); else J = CINV(I); Step3: /* Put the leading p + 1 digits in array A. */ s = SIGN(FIRST(J)); k = p + 2; while (J != NIL && k >= 2) { ADV(J, &a,&J); A[k] = ABS(a); k = k - 1; } for (i = k; i >= 2; i--) A[i] = 0; Step4: /* Normalize. */ n = ZETA - PDLOG2(A[p + 2]); if (n > 0) ILSA(A + 2,p + 1,n); e = (p + 2 - k) * ZETA - n; Step5:/* Exact conversion. */ m = LENGTH(J); if (m > 0) e = e + m * ZETA; A[0] = e; A[1] = s; t = 0; while (t == 0 && J != NIL) { t = FIRST(J); if (t == 0) J = RED(J); } if (t == 0 && A[2] == 0) goto Step8; Step6: /* Decide whether to round up absolute value. */ if (d == s) goto Step7; else if (d == -s) goto Step8; else { M = BETA1 >> n; b = A[2] & M; b = b << (ZETA - n); if (b > BETA2) goto Step7; else if (b < BETA2) goto Step8; else if (t != 0) goto Step7; else { b = A[3] & 1; if (b == 1) goto Step7; else goto Step8; } } Step7: /* Round up absolute value. */ t = 1; i = 3; while (t > 0 && i < p + 3) { A[i] = A[i] + 1; if (A[i] == BETA) A[1] = 0; else t = 0; i = i + 1; } if (A[p + 2] == 0) { A[p + 2] = BETA2; A[0] = e + 1; } Step8: /* Store precision. */ A[2] = p; Return: /* return. */ return; } saclib2.2.8/src/IPMAXN.c0000664002275300236100000000153214017255270013700 0ustar wcbrownscs/*====================================================================== b <- IPMAXN(r,A) Integral polynomial maximum norm. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. Outputs b : in Z, the maximum norm of A. ======================================================================*/ #include "saclib.h" Word IPMAXN(r,A) Word r,A; { Word Ap,a1,b,b1,e1,rp; /* hide a1,e1,rp; */ Step1: /* Compute. */ b = 0; if (A == 0) goto Return; Ap = A; rp = r - 1; do { ADV2(Ap,&e1,&a1,&Ap); if (rp == 0) b1 = IABSF(a1); else b1 = IPMAXN(rp,a1); b = IMAX(b,b1); } while (Ap != NIL); goto Return; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/IPQR.c0000664002275300236100000000265414017255270013465 0ustar wcbrownscs/*====================================================================== IPQR(r,A,B; Q,R) Integral polynomial quotient and remainder. Inputs r : a BETA-digit, r >= 1, the number of variables. A , B : in Z[X1,...,Xr], B non-zero. Outputs Q, R : in Z[X1,...,Xr]. If B divides A then Q=A/B and R=0 else A=BQ+R with deg(R) minimal. Q and R are uniquely determined if R=0 or deg(R) < deg(B). ======================================================================*/ #include "saclib.h" void IPQR(r,A,B, Q_,R_) Word r,A,B, *Q_,*R_; { Word Bp,Q,Q1,Qp,R,Rp,a,b,d,m,n,q,rp,s; /* hide Rp,a,d,m,n,rp; */ Step1: /* Initialize. */ n = PDEG(B); b = PLDCF(B); Bp = PRED(B); Q = NIL; R = A; rp = r - 1; Step2: /* Compute quotient terms. */ while (R != 0) { m = PDEG(R); d = m - n; if (d < 0) goto Step3; a = PLDCF(R); if (rp == 0) IQR(a,b,&q,&s); else IPQR(rp,a,b,&q,&s); if (s != 0) goto Step3; Q = COMP2(q,d,Q); Q1 = LIST2(d,q); Rp = PRED(R); Qp = IPPROD(r,Bp,Q1); R = IPDIF(r,Rp,Qp); } Step3: /* Finish. */ if (Q == NIL) Q = 0; else Q = INV(Q); goto Return; Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/HIPBHT.c0000664002275300236100000000240714017255270013664 0ustar wcbrownscs/*====================================================================== HIPBHT(n,A,k; B,t) Hardware interval polynomial binary homothetic transformation. Inputs n : a BETA-digit. A : in HI[X], deg(A) = n. k : a BETA-digit. Outputs B : in HI[x]. If t = 1, B(x) = A(2^k * x); otherwise B is undefined. t : t = 1 if no exponent overflow occurs; otherwise t = 0. ======================================================================*/ #include "saclib.h" void HIPBHT(n,A,k,B_,t_) BDigit n; interval A[]; BDigit k; interval **B_; BDigit *t_; { interval *B; BDigit i,t; ieee F; double f,g; Step1: /* k = 0. */ if (k == 0) { B = HIPCOPY(n,A); t = 1; goto Return; } Step2: /* Get array. */ B = GETHIPARRAY(n); Step3: /* Construct floating-point numbers 1 and 2^k. */ F.rep.sign = 0; F.rep.exp = k + BIAS; F.rep.mant_h = (1 << 20) & 0xFFFFF; /* I think this should just be 0! */ F.rep.mant_l = 0; f = F.num; g = 1.0; Step4: /* Compute the homothetic transform. */ FPCATCH(); for (i = 0; i <= n; i++) { B[i].left = A[i].left * g; B[i].right = A[i].right * g; g = g * f; } if (FPCHECK() == 1) { t = 0; FPCATCH(); } else t = 1; Return: /* Return B and t. */ *B_ = B; *t_ = t; return; } saclib2.2.8/src/MPFFDP.c0000664002275300236100000000254614017255270013666 0ustar wcbrownscs/*===================================================================== F <- MPFFDP(p,n) Medium prime finite field defining polynomial. Inputs p : a prime, p^2 < beta. n : a beta-digit, n >= 2. Output F : a monic irreducible polynomial of degree n over Z_p having a minimal number of nonzero terms. =======================================================================*/ #include "saclib.h" Word MPFFDP(p,n) BDigit p,n; { BDigit a,i,j,k,t,u; BDigit *A,*B; Word F; Step1: /* Search for an irreducible binomial. */ for (a = 1; a = 2. Qpp : Q / q^2. Ab,Bb,Sb,Tb : lists (Ab_1,...,Ab_r), (Bb_1,...,Bb_{r-1}), (Sb_1,...,Sb_{r-1}), (Tb_1,...,Tb_{r-1}) of elements of Z_q[x] such that Ab_i Sb_i + Bb_i Tb_i = 1, deg(Sb_i) < deg(Bb_i), deg(Tb_i) < deg(Ab_i), for i = 1, ..., r-1, and ldcf(Ab_i) = 1, for i = 1, ..., r. Ap,Bp : lists (Ap_1,...,Ap_r), (Bp_1,...,Bp_{r-1}) of elements of Z_{Q/q}[x] such that Ab_i = H_q(Ap_i) and Bp_i = H_q(Bp_i). Yp,Zp : lists (Yp_1,...,Yp_{r-1}), (Zp_1,...,Zp_{r-1} of elements of Z_q[x] such that A_i = Ap_i + (Q/q)Zp_i and B_i = Bp_i + (Q/q)Yp_i. U : a list (U_1,...,U_{r-1}) of elements of Z[x] such that Yp_i, Zp_i, U_i satisy Ab_i*Yp_i + Bb_i*Zp_i = U_i (mod q). D : in Z_q[x]. A,B : lists (A_1,...,A_r), (B_1,...,B_{r-1}) of elements of Z_Q[x] such that A_i = Ap_i + (Q/q)Zp_i and B_i = Bp_i + (Q/q)Yp_i, for i = 1, ..., r-1, and A_r is the monic associate of B_{r-1}. Outputs Qs : Q * q. Y,Z : lists (Y_1,...,Y_{r-1}), (Z_1,...,Z_{r-1}) of elements of Z_q[x]. Us : a list (U_1,...,U_{r-1}) of elements of Z[x] such that Y_i, Z_i, U_i satisfy Ab_i*Y_i + Bb_i*Z_i = U_i (mod q). As,Bs : lists (As_1,...,As_r), (Bs_1,...,Bs_{r-1}) of elements of Z_{qQ}[x] such that A_i = H_Q(As_i), B_i = H_Q(Bs_i). As_1*Bs_1 = A_1*B_1 + Q*D (mod qQ). ===========================================================================*/ #include "saclib.h" void IUPLHSL(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B, Qs_,Y_,Z_,Us_,As_,Bs_) Word q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B,*Qs_,*Y_,*Z_,*Us_,*As_,*Bs_; { Word A1,Ab1,Abt,Ap1,Apt,As,As1,At,B1,Bb1,Bbt,Bp1,Bpt,Bs,Bs1,Bt,D1, Qs,Sb1,Sbt,Tb1,Tbt,U1,Us,Us1,Ut,Y,Y1,Yp1,Ypt,Z,Z1,Zp1,Zpt; Word i; Step1: /* Initialize. */ Abt = Ab; Bbt = Bb; Sbt = Sb; Tbt = Tb; Apt = Ap; Bpt = Bp; Ypt = Yp; Zpt = Zp; Ut = U; D1 = D; At = A; Bt = B; Y = NIL; Z = NIL; Us = NIL; As = NIL; Bs = NIL; Step2: /* Loop through the lists. */ i = 0; while (RED(Abt) != NIL) { i++; ADV(Abt,&Ab1,&Abt); ADV(Bbt,&Bb1,&Bbt); ADV(Sbt,&Sb1,&Sbt); ADV(Tbt,&Tb1,&Tbt); ADV(Apt,&Ap1,&Apt); ADV(Bpt,&Bp1,&Bpt); ADV(Ypt,&Yp1,&Ypt); ADV(Zpt,&Zp1,&Zpt); ADV(Ut,&U1,&Ut); ADV(At,&A1,&At); ADV(Bt,&B1,&Bt); IUPLHS(q,Q,Qpp,Ab1,Bb1,Sb1,Tb1,Ap1,Bp1,Yp1,Zp1,U1,D1,A1,B1, &Y1,&Z1,&Us1,&As1,&Bs1); D1 = Y1; Y = COMP(Y1,Y); Z = COMP(Z1,Z); Us = COMP(Us1,Us); As = COMP(As1,As); Bs = COMP(Bs1,Bs); } Step3: /* Clean up. */ Qs = IDPR(Q,q); As1 = MIPMON(1,Qs,Bs1); As = COMP(As1,As); Y = INV(Y); Z = INV(Z); Us = INV(Us); As = INV(As); Bs = INV(Bs); Return: /* Prepare for return. */ *Qs_ = Qs; *Y_ = Y; *Z_ = Z; *Us_ = Us; *As_ = As; *Bs_ = Bs; return; } saclib2.2.8/src/AGIQHQ.c0000664002275300236100000000322614017255270013660 0ustar wcbrownscs/*======================================================================= AGIQHQ(A; q,h) Array Gaussian integer quadrant and half quadrant. Input A : a nonzero first quadrant Gaussian integer in array representation. Outputs q : 1,2,3 or 4, the quadrant of A. (Each quadrant includes the half-axis that is clockwise adjacent to it.) h : 1 or 2, the half-quadrant of A. (In each quadrant, half-quadrant 1 is clockwise to the right of half-quadrant 2.) =======================================================================*/ #include "saclib.h" void AGIQHQ(A, q_,h_) BDigit **A,*q_,*h_; { BDigit *A1,*A2; BDigit h,i,m,n,q,s,t,u; Step1: /* A is on a coordinate axis. */ A1 = A[0]; A2 = A[1]; s = A1[0]; t = A2[0]; if (s == 0) { h = 1; if (t > 0) q = 2; else q = 4; goto Return; } if (t == 0) { h = 1; if (s > 0) q = 1; else q = 3; goto Return; } Step2: /* Determine quadrant. */ if (s > 0) { if (t > 0) q = 1; else q = 4; } else { if (t > 0) q = 2; else q = 3; } Step3: /* Determine half-quadrant. */ m = A1[1]; n = A2[1]; if (m > n) u = 1; else if (m < n) u = 2; else { i = m + 1; while (i >= 2 && A1[i] == A2[i]) i = i - 1; if (i == 1) { h = 2; goto Return; } else { if (A1[i] > A2[i]) u = 1; else u = 2; } } if (u == 1) { if (q == 1 || q == 3) h = 1; else h = 2; } else { if (q == 2 || q == 4) h = 1; else h = 2; } Return: /* Return q and h. */ *q_ = q; *h_ = h; return; } saclib2.2.8/src/IPCONST.c0000664002275300236100000000141214017255270014020 0ustar wcbrownscs/*====================================================================== t <- IPCONST(r,A) Integral polynomial constant. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs t : in Z,if A is a constant then t=1, otherwise t=0. ======================================================================*/ #include "saclib.h" Word IPCONST(r,A) Word r,A; { Word a,i,t; /* hide algorithm */ Step1: /* Determine. */ t = 0; if (A == 0) { t = 1; goto Return; } a = A; for (i = 1; i <= r; i++) { if (PDEG(a) != 0) goto Return; a = PLDCF(a); } t = 1; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/LBRNSIGN.c0000664002275300236100000000101714017255270014120 0ustar wcbrownscs/*===================================================================== s <- LBRNSIGN(A) Logarithmic binary rational number sign. Input A : a logarithmic binary rational number. Output s : sign(A), an integer. =====================================================================*/ #include "saclib.h" Word LBRNSIGN(A) Word A; { Word s; Step1: /* Use sign of numerator. */ if (A == 0) s = 0; else s = ISIGNF(FIRST(A)); Return: /* Return s. */ return(s); } saclib2.2.8/src/IDEQ.c0000664002275300236100000000333514017255270013431 0ustar wcbrownscs/*=========================================================================== C <- IDEQ(A,b) Integer-digit exact quotient. Inputs A : in Z. b : a non-zero BETA-digit which is a divisor of A. Output C : the quotient A/b. ===========================================================================*/ #include "saclib.h" #define IDEQ_SIZE 100 Word IDEQ(A,b) Word A,b; { Word *Ah,Ap[IDEQ_SIZE],C; Word a,ap,bp,bpp,c,cp,g,i,l,m,N,n,s,s1,s2,o,r; Step1: /* A single-precision. */ if (A < BETA) { C = A / b; goto Return; } Step2: /* Copy |A| into arrays, determine lengths and signs. */ IFLTA(A,Ap,IDEQ_SIZE,&Ah,&n,&s1,&o); s2 = signm(b); if (s2 > 0) s = s1; else s = -s1; bp = absm(b); Step3: /* Divide b by a power of 2. */ l = 0; while ((bp & 01) == 0) { l = l + 1; bp = bp >> 1; } Step4: /* Divide B by the same power of t. */ if (l == 0) goto Step5; r = 00; m = ZETA - l; N = (01 << l) - 1; for (i = n - 1; i >= 0; i--) { a = Ah[i]; ap = (a >> l) | r; r = (a & N) << m; Ah[i] = ap; } Step5: /* Compute modular inverse */ bpp = MDINVB(bp); Step6: /* Divide by Jebelean's method. */ g = 0; for (i = 0; i < n - 1; i++) { if (Ah[i] == 0) continue; DPR(Ah[i],bpp,&cp,&Ah[i]); DPR(Ah[i],bp,&c,&cp); a = Ah[i + 1]; a = a - g - c; if (a < 0) { a = a + BETA; g = 1; } else g = 0; Ah[i + 1] = a; } DPR(Ah[i],bpp,&c,&Ah[i]); Step7: /* Copy result to a list. */ C = IFATL(Ah,n,s); Step8: /* Free dynamic array */ if (n > IDEQ_SIZE) FREEARRAY(Ah); Return: /* Prepare for return */ return(C); } saclib2.2.8/src/ANSUM.c0000664002275300236100000000355514017255270013576 0ustar wcbrownscs/*====================================================================== ANSUM(A,I,B,J;C,K) Algebraic number sum. Inputs A : Integral minimal polynomial for a real algebraic number alpha. I : An acceptable isolating interval for alpha. B : Integral minimal polynomial for a real algebraic number beta. J : An acceptable isolating interval for beta. Outputs C : Integral minimal polynomial for alpha + beta. K : An acceptable isolating interval for alpha + beta. ======================================================================*/ #include "saclib.h" void ANSUM(A,I,B,J, C_,K_) Word A,I,B,J, *C_,*K_; { Word C,K; Word As,D,Ah,Bs,Ip,Jp,R,s,c,L,M,P,F,Ms,v; Step1: /* A=0 or B=0. */ if (A == 0) { C = B; K = J; goto Return; } else if (B == 0) { C = A; K = I; goto Return; } Ip = I; Jp = J; Step2: /* Compute R(x)=res(A(x-y),B(y)). */ As = PINV(1,A,2); D = LIST4(1,LIST2(0,-1),0,LIST2(1,1)); Ah = IPSMV(3,As,D); Bs = PINV(1,B,1); R = IPRES(2,Ah,Bs); Step3: /* Compute the list M of all irreducible factors of R. */ IPFAC(1,R,&s,&c,&L); M = NIL; do { ADV(L,&P,&L); F = SECOND(P); M = COMP(F,M); } while (!(L == NIL)); Step4: /* Remove from the list M all factors with no coefficient sign variations in K=Ip+Jp. */ K = RISUM(Ip,Jp); Ms = NIL; do { ADV(M,&F,&M); v = IUPVOI(F,K); if (v != 0) Ms = COMP(F,Ms); } while (!(M == NIL)); M = INV(Ms); Step5: /* If M contains only one factor, F, and F has one variation, set c=(F,K). */ if (RED(M) == NIL && v == 1) { C = F; goto Return; } Step6: /* Otherwise refine Ip or Jp. */ s = RNCOMP(RIL(I),RIL(J)); if (s > 0) Ip = IUPIIR(A,Ip); else Jp = IUPIIR(B,Jp); goto Step4; Return: *C_ = C; *K_ = K; return; } saclib2.2.8/src/RNP2.c0000664002275300236100000000103314017255270013421 0ustar wcbrownscs/*====================================================================== r <- RNP2(k) Rational number power of 2. Inputs k : a BETA-digit. Outputs r : 2^k, a rational number. ======================================================================*/ #include "saclib.h" Word RNP2(k) Word k; { Word a,h,r; Step1: /* Compute. */ h = ABS(k); a = IMP2(1,h); if (k >= 0) r = LIST2(a,1); else r = LIST2(1,a); Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/ILOGB.c0000664002275300236100000000123714017255270013542 0ustar wcbrownscs/*====================================================================== n <- ILOGB(A) Integer logarithm, base BETA. Inputs A : in Z. Outputs n : a BETA-integer. If A = 0 then n = 0. Otherwise n = floor(log_BETA(|A|)) + 1, ======================================================================*/ #include "saclib.h" Word ILOGB(A) Word A; { Word n; Step1: /* A single-precision. */ if (A < BETA) { if (A == 0) n = 0; else n = 1; goto Return; } Step2: /* A multiple-precision. */ n = LENGTH(A); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/LBRNPROD.c0000664002275300236100000000124714017255270014131 0ustar wcbrownscs/*====================================================================== t <- LBRNPROD(r,s) Logarithmic binary rational number product. Inputs r,s : logarithmic binary rational numbers. Outputs t: logarithmic binary rational representation of r*s; ======================================================================*/ #include "saclib.h" Word LBRNPROD(r,s) Word r,s; { Word t,r1,r2,s1,s2; Step1: /* Multiply numerators & add denominator exponents. */ if (r == 0 || s == 0) t = 0; else { FIRST2(r,&r1,&r2); FIRST2(s,&s1,&s2); t = LIST2(IPROD(r1,s1),r2 + s2); } Return: /* Prepare to return. */ return t; } saclib2.2.8/src/MIHOM.c0000664002275300236100000000102214017255270013547 0ustar wcbrownscs/*====================================================================== As <- MIHOM(M,A) Modular integer homomorphism. Inputs M : a positive integer. A : an integer. Outpus As : h sub M(A). ======================================================================*/ #include "saclib.h" Word MIHOM(M,A) Word M,A; { Word As; Step1: /* Compute. */ As = IREM(A,M); if (ISIGNF(As) < 0) As = ISUM(M,As); Return: /* Prepare for return. */ return(As); } saclib2.2.8/src/MCPMV.c0000664002275300236100000000245714017255270013575 0ustar wcbrownscs/*====================================================================== M <- MCPMV(n,L) Matrix of coefficients of polynomials, with respect to main variable. Inputs n : a BETA-digit, n > 0. L : a list (L1,...,Lk), k >= 1, with Li in D[X] (D an arbitrary domain), Li non-zero, deg(Li) < n. Outputs M : an n by k matrix over D, with m_{1,i}+m_{2,i}*X + ... + m_{n,i}*X^(n-1) = Li for 1 <= i <= k. ======================================================================*/ #include "saclib.h" Word MCPMV(n,L) Word n,L; { Word Lp,Lp1,Ls,M,Mp,Ms,i,k; /* hide Ls,Ms,i,k; */ Step1: /* Compute. */ Lp = L; Mp = NIL; do { ADV(Lp,&Ls,&Lp); Lp1 = DPFP(1,Ls); ADV(Lp1,&k,&Lp1); for (i = 1; i <= n - k - 1; i++) Lp1 = COMP(0,Lp1); Mp = COMP(Lp1,Mp); } while (!(Lp == NIL)); M = NIL; do { Ms = Mp; Lp = NIL; do { Ls = FIRST(Ms); SFIRST(Ms,RED(Ls)); SRED(Ls,Lp); Lp = Ls; Ms = RED(Ms); } while (!(Ms == NIL)); M = COMP(Lp,M); } while (!(FIRST(Mp) == NIL)); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/IPTERMREAD.c0000664002275300236100000000202514017255270014336 0ustar wcbrownscs/*=========================================================================== IPTERMREAD(r,V; A,t) Integral polynomial term read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : in Z[x_1,...,x_r], with variables in V. t : 1 if successful, 0 otherwise. ===========================================================================*/ #include "saclib.h" void IPTERMREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,s,t; Step1: /* Setup. */ t = 1; A = PFBRE(r,1); Step2: /* Read in the optional sign. */ C = CREADB(); if (C == '+') s = 1; else if (C == '-') s = -1; else { s = 1; BKSP(); } if (s == -1) A = IPNEG(r,A); Step3: /* Read in powers. */ do { IPPOWREAD(r,V,&A1,&t); if (t == 0) goto Return; A = IPPROD(r,A,A1); C = CREADB(); BKSP(); } while (DIGIT(C) || LETTER(C) || C == '('); Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/AICOMP.c0000664002275300236100000000170414017255270013655 0ustar wcbrownscs/*======================================================================= s <- AICOMP(A,B) Array integer comparison. Inputs A, B : array integers. Output s : 0, -1 or 1, the sign of A - B. ========================================================================*/ #include "saclib.h" BDigit AICOMP(A,B) BDigit *A,*B; { BDigit d,i,m,n,s,t,u; Step1: /* Different signs or both zero. */ t = A[0]; u = B[0]; if (t > u) { s = 1; goto Return; } if (t < u) { s = -1; goto Return; } if (t == 0) { s = 0; goto Return; } Step2: /* Different lengths. */ m = A[1]; n = B[1]; if (m > n) { s = t; goto Return; } if (m < n) { s = -t; goto Return; } Step3: /* Compare magnitudes. */ for (i = n + 1; i >= 2; i--) { d = A[i] - B[i]; if (d > 0) { s = t; goto Return; } if (d < 0) { s = -t; goto Return; } } s = 0; Return: /* Return s. */ return(s); } saclib2.2.8/src/AFUPSIBRI.c0000664002275300236100000000707614017255270014241 0ustar wcbrownscs/*====================================================================== AFUPSIBRI(A,I,B,p; J,L) Algebraic number field univariate polynomial software interval basis real root isolation. Inputs A : the minimal integral polynomial of an algebraic number \alpha. I : a logarithmic open standard isolating interval for \alpha. B : a non-empty list of univariate polynomials over Q(\alpha). B is a squarefree basis. Each element of B has its nonzero coefficients represented by a pair (r,a) where r is a rational number and a is a univariate integral polynomial of degree less than n. p : a positive beta integer, the precision of the software arithmetic to be employed. Outputs J : a logarithmic open standard isolating interval for \alpha that is a subinterval of I, the smallest that could be obtained with precision p arithmetic. L : either 0 or a list (I_1,B_1,...,I_m,B_m). (I_1,...,I_m) is a list of disjoint intervals, each of which is either open and standard or one-point. Each I_j is an isolating interval for a root of B_j and each B_j is an element of B. Each root of each element of B is isolated by some I_j. The intervals have binary rational endpoints in rational representation and I_1 < I_2 < ... , I_m. Furthermore, two intervals share an endpoint only if both are open. If L = 0, the program failed to produce such a list for the given inputs using p-precision arithmetic. ======================================================================*/ #include "saclib.h" void AFUPSIBRI(A,I,B,p, J_,L_) Word A,I,B; BDigit p; Word *J_,*L_; { BDigit *Ap,*bp,**C,*c,i,k,m,n,q1,q2,S,s,t; Word b,Bp,I1,I2,J,K,L,L1,Lp,M,T; Step1: /* Convert the minimal polynomial to a software interval polynomial. */ n = PDEG(A); q1 = p + 3; q2 = q1 + q1; S = (n + 1) * q2 + 1; Ap = GETARRAY(S); IPSIP(A,p,Ap); Step2: /* Compute the trend of \alpha. */ b = SECOND(I); bp = GETARRAY(q1); t = LBRNFEC(b,p,bp); J = I; L = 0; if (t == 0) { FREEARRAY(bp); goto Return; } t = SIPES(Ap,bp); FREEARRAY(bp); if (t == NIL) goto Return; Step3: /* Refine the isolating interval for \alpha. */ J = SIPIR(Ap,I,t,- (p * ZETA)); FREEARRAY(Ap); Step4: /* Isolate the real roots of each basis polynomial. */ k = LENGTH(B); C = GETMATRIX(k,1); L = NIL; Bp = B; for (i = 0; i < k; i++) { ADV(Bp, &b,&Bp); m = PDEG(b); s = (m + 1) * q2 + 1; c = GETARRAY(s); AFPSIP(J,b,p,c); FREEARRAY(C[i]); C[i] = c; L1 = SIPRRID(c); if (L1 == 0) { L = 0; goto Step8; } t = c[s - q2 + 1]; if (EVEN(m)) t = -t; while (L1 != NIL) { ADV(L1, &K,&L1); T = LIST3(i,K,t); t = - t; L = COMP(T,L); } } L = INV(L); Step5: /* Refine and merge sort the intervals. */ M = SIPIIRMS(L,C); if (M == 0) { L = 0; goto Step8; } Step6: /* Extract the polynomials and intervals. */ L = NIL; while (M != NIL) { ADV(M, &T,&M); i = FIRST(T); b = LELTI(B,i + 1); K = SECOND(T); L = COMP2(b,K,L); } L = INV(L); Step7: /* Convert the interval endpoints to rational number representation. */ Lp = L; while (Lp != NIL) { I1 = FIRST(Lp); I2 = LIST2(LBRNRN(FIRST(I1)),LBRNRN(SECOND(I1))); SFIRST(Lp,I2); Lp = RED2(Lp); } Step8: /* Free arrays. */ for (i = 0; i < k; i++) FREEARRAY(C[i]); FREEARRAY(C); Return: /* Return J and L. */ *J_ = J; *L_ = L; return; } saclib2.2.8/src/IEXP.c0000664002275300236100000000137414017255270013455 0ustar wcbrownscs/*====================================================================== B <- IEXP(A,n) Integer exponentiation. Inputs A : in Z. n : non-negative BETA-digit. Outputs B : A^n. ======================================================================*/ #include "saclib.h" Word IEXP(A,n) Word A,n; { Word B,k; /* hide k; */ Step1: /* n less than or equal to 1. */ if (n == 0) { B = 1; goto Return; } if (n == 1) { B = A; goto Return; } Step2: /* Recursion. */ k = n / 2; B = IEXP(A,k); B = IPROD(B,B); if (n > 2 * k) B = IPROD(B,A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MAX.c0000664002275300236100000000071614017255270013334 0ustar wcbrownscs/*=========================================================================== c <- MAX(a,b) Maximum. Inputs a, b : C integers. Output c : the maximum of a and b. ===========================================================================*/ #include "saclib.h" Word MAX(a,b) Word a,b; { Word c; Step1: /* Compute. */ if (a >= b) c = a; else c = b; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MUPSFF.c0000664002275300236100000000407314017255270013707 0ustar wcbrownscs/*====================================================================== L <- MUPSFF(p,A) Modular univariate polynomial squarefree factorization. Inputs p : a BETA-digit, prime. A : in Z/(p)[X], A is monic and of positive degree. Outputs L : a list ((i1,A1),...,(ir,Ar)) with i1 < i2 < ... < ir, Aj a monic squarefree factor of A of positive degree for 1 <= j <= r, gcd(Ai,Aj) = 1 if i not equal j, and A = A1^i1 * A2^i2 * ... * Ar^ir. ======================================================================*/ #include "saclib.h" Word MUPSFF(p,A) Word p,A; { Word A1,Ap,B,Bp,C,D,L,L1,Lp,M,M1,Mp,e,j; /* hide Bp,L1,M1,Mp,e,j; */ Step1: /* Initialize. */ Lp = NIL; Ap = MUPDER(p,A); if (Ap == 0) { B = A; goto Step3; } B = MUPGCD(p,A,Ap); C = MPQ(1,p,A,B); j = 1; Step2: /* Compute Aj with j not divisible by p. */ D = MUPGCD(p,B,C); A1 = MPQ(1,p,C,D); if (FIRST(A1) > 0) Lp = COMP(LIST2(j,A1),Lp); if (FIRST(D) > 0) { C = D; B = MPQ(1,p,B,C); j = j + 1; goto Step2; } Step3: /* Compute Aj with j divisible by p. */ if (FIRST(B) == 0) { L = INV(Lp); goto Return; } Bp = NIL; do { ADV2(B,&e,&A1,&B); e = e / p; Bp = COMP2(A1,e,Bp); } while (!(B == NIL)); B = INV(Bp); M = MUPSFF(p,B); Mp = M; do { ADV(Mp,&M1,&Mp); e = p * FIRST(M1); SFIRST(M1,e); } while (!(Mp == NIL)); M = INV(M); Step4: /* Merge. */ L = NIL; while (Lp != NIL && M != NIL) { if (FIRST(FIRST(Lp)) > FIRST(FIRST(M))) ADV(Lp,&L1,&Lp); else ADV(M,&L1,&M); L = COMP(L1,L); } if (M == NIL) Lp = INV(Lp); else Lp = INV(M); L = CONC(Lp,L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/LIST5.c0000664002275300236100000000101714017255270013542 0ustar wcbrownscs/*====================================================================== L <- LIST5(a1,a2,a3,a4,a5) List, 5 elements. Inputs a1,a2,a3,a4, a5 : objects. Outputs L : the list (a1,a2,a3,a4,a5). ======================================================================*/ #include "saclib.h" Word LIST5(a1,a2,a3,a4,a5) Word a1,a2,a3,a4,a5; { Word L; Step1: /* Compute. */ L = COMP(a1,COMP(a2,COMP(a3,COMP(a4,COMP(a5,NIL))))); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/LMERGE.c0000664002275300236100000000132114017255270013653 0ustar wcbrownscs/*=========================================================================== C <- LMERGE(A,B) List merge. Inputs A, B : lists of objects. Outputs C : the list obtained by merging A and B. ===========================================================================*/ #include "saclib.h" Word LMERGE(A,B) Word A,B; { Word Ap,Bp,C,a,b,s; Step1: /* Compute. */ C = A; Bp = B; while (Bp != NIL) { ADV(Bp,&b,&Bp); Ap = A; s = 0; while (Ap != NIL && s == 0) { ADV(Ap,&a,&Ap); s = EQUAL(a,b); } if (s == 0) C = COMP(b,C); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFUPFMRC.c0000664002275300236100000000616514017255270014116 0ustar wcbrownscs/*=========================================================================== AFUPFMRC(Q1,Q1p,q1,C1,L1,Q2,Q2p,q2,C2; L2,C) Algebraic number field univariate polynomial from modular residues, with comparison. Inputs Q1 : in Z, Q1p: in Z, Q1p = floor((Q1/2)^(1/2)). q1 : a BETA-digit, q1 = ILOG2(Q1p). C1 : in Z/(Q1)[a,y], monic, a is an algebraic number. L1 : a (possibly empty) list of lists of rational numbers. Let C1 = x^n + sum_{i=0}^{n-1}C1_i*x^i, and let (D_1,...,D_m) be the sublist of (C1_{n-1},...,C1_0) consisting of the nonzero C1_i. Then L1 = (R_1,...,R_k), k <= m, where R_i is a (possible empty) list of rational numbers; if R_i in non-NIL, then the last element of R_i may be NIL. Let D_i = sum_{j=0}^{l}d_j*a^j, and let E_i = (e_1,...,e_s), s <= l+1, be the sublist of (d_l,...,d_0) consisting of the nonzero d_j. Then R_i = (r_1,...,r_t), 0 <= t <= s, where (if it exists) r_j is the rational number that is congruent to e_j modulo Q1 whose numerator and denominator are both less than sqrt(Q1/2) in absolute value. Possibly, r_t = NIL, in which case, there is no rational number that is congruent to e_t modulo Q1, whose numerator and denominator are both less than sqrt(Q1/2) in absolute value. Q2 : in Z. Q2p: in Z, Q2p = floor((Q2/2)^(1/2)). q2 : a BETA-digit, q2 = ILOG2(Q2p). C2 : in Z/(Q2)[a,y], monic. Outputs C : in Q(a)[y] or NIL. If it exists, C is the unique element of Q(a)[y] such that H_Q1(C) = C1, H_Q2(C) = C2, and the absolute values of the numerators and denominators appearing in the rational coefficients of C are less than min(sqrt(Q1/2),sqrt(Q2/2)). Otherwise, C = NIL. L2: a (possibly empty) list of lists of rational numbers satisfying properties similar to those satisfied by the input L1, but with Q1, Q1p, q1, and C1 replaced by Q2, Q2p, q2, and C2, respectively. If C /= NIL, then L2 = NIL. ===========================================================================*/ #include "saclib.h" void AFUPFMRC(Q1,Q1p,q1,C1,L1,Q2,Q2p,q2,C2, L2_,C_) Word Q1,Q1p,q1,C1,L1,Q2,Q2p,q2,C2, *L2_,*C_; { Word C,C1p,C2p,L1p,L2,R1,R2,d1,d2,c1,c2,c; Step1: /* deg(C1) /= deg(C2) */ if (PDEG(C1) != PDEG(C2)) { L2 = NIL; C = NIL; goto Return; } Step2: /* Initialize. */ L2 = NIL; C = NIL; L1p = L1; C1p = PRED(C1); C2p = PRED(C2); Step3: /* Recover the coefficients. */ while (C1p != 0 && C2p != 0) { PADV(C1p,&d1,&c1,&C1p); PADV(C2p,&d2,&c2,&C2p); if (d1 != d2) { L2 = INV(L2); C = NIL; goto Return; } if (L1p == NIL) R1 = NIL; else ADV(L1p,&R1,&L1p); RUPFMRC(Q1,Q1p,q1,c1,R1,Q2,Q2p,q2,c2, &R2,&c); L2 = COMP(R2,L2); if (c != NIL) C = COMP2(c,d1,C); else { L2 = INV(L2); C = NIL; goto Return; } } C = INV(C); c = PMON(RNINT(1),0); C = PPLT(PDEG(C1),c,C); Step5: /* Convert representation. */ C = AFPCR(1,C); Return: /* Prepare for return. */ *L2_ = L2; *C_ = C; return; } saclib2.2.8/src/AFPROD.c0000664002275300236100000000232014017255270013653 0ustar wcbrownscs/*=========================================================================== c <- AFPROD(P,a,b) Algebraic number field element product. Inputs P : in Z[x], the minimal polynomial of an algebraic number alpha. a,b : in Q(alpha). Outputs c : in Q(alpha), c = a * b. ===========================================================================*/ #include "saclib.h" Word AFPROD(P,a,b) Word P,a,b; { Word A,B,C,Cp,c,cp,n,p,r,s,t,tp,tpp,u,v; Step1: /* a or b zero. */ if (a == 0 || b == 0) { c = 0; goto Return; } Step2: /* Decompose a and b. */ FIRST2(a,&r,&A); FIRST2(b,&s,&B); Step3: /* Multiply rational and polynomial parts. */ tp = RNPROD(r,s); Cp = IPPROD(1,A,B); Step4: /* Remainder product polynomial. */ n = PDEG(P); v = 1; while (PDEG(Cp) >= n) { IUPSR(Cp,P,&cp,&p,&Cp); v = IPROD(v,p); } Step5: /* Compute content and primitive part of remainder. */ IPSCPP(1,Cp,&s,&u,&C); if (s < 0) u = INEG(u); Step6: /* Compute rational part. */ tpp = RNRED(u,v); t = RNPROD(tp,tpp); Step7: /* Compose output list. */ c = LIST2(t,C); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/LBRNCOMP.c0000664002275300236100000000176014017255270014123 0ustar wcbrownscs/*===================================================================== u <- LBRNCOMP(A,B) Logarithmic binary rational number comparison. Inputs A, B : logarithmic binary rational numbers. Outputs u : sign(A - B), an integer. ======================================================================*/ #include "saclib.h" Word LBRNCOMP(A,B) Word A,B; { Word a,b,e,f,s,t,u; Step1: /* A = 0 or B = 0. */ if (A == 0) { u = -LBRNSIGN(B); goto Return; } if (B == 0) { u = LBRNSIGN(A); goto Return; } Step2: /* Disassemble A and B. */ FIRST2(A,&a,&e); FIRST2(B,&b,&f); Step3: /* A and B have opposite signs. */ s = ISIGNF(a); t = ISIGNF(b); if (s != t) { u = s; goto Return; } Step4: /* A and B have the same sign. */ if (e < f) u = ICOMP(IMP2(a,f - e),b); else if (e > f) u = ICOMP(a,IMP2(b,e - f)); else u = ICOMP(a,b); Return: /* Return u. */ return(u); } saclib2.2.8/src/LEROT.c0000664002275300236100000000201014017255270013561 0ustar wcbrownscs/*====================================================================== M <- LEROT(L,i,j) List element rotation. Inputs L : a list ( a1,...,an ) of objects, n > 0. i,j : integers, 1 <= i <= j <= n. Outputs M : the list obtained from L by rotating the elements ai,...aj. M = ( a1,...,a{i-1},aj,ai,...,a{j-1},a{j+1},...an ) The list L is modified . ( If i=j then M=L ). ======================================================================*/ #include "saclib.h" Word LEROT(L,i,j) Word L,i,j; { Word Lp,Lpp,M,a,b,k; /* hide algorithm */ Step1: /* i=j. */ M = L; if (i == j) goto Return; Step2: /* i < j. */ Lp = L; for (k = 1; k <= i - 1; k++) Lp = RED(Lp); ADV(Lp,&a,&Lpp); for (k = i; k <= j - 1; k++) { b = FIRST(Lpp); SFIRST(Lpp,a); a = b; Lpp = RED(Lpp); } SFIRST(Lp,a); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/IUPFT2.c0000664002275300236100000000373314017255270013662 0ustar wcbrownscs/*=========================================================================== IUPFT2(p,Q,Qp,q,A,B; Ab,B1,B2) Integral univariate polynomial factor test, degree at most 2. Inputs p : a single-precision prime. Q : a positive power of p. Qp: the floor of the square root of Q/2. q : a BETA-digit, q = ILOG2(Qp). A : in Z[x], primitive, squarefree and of degree at least 2. B : in Z/(Q)[x], monic, PDEG(B) <= 2. Outputs Ab : in Z[x]. B1,B2 : in Z[x]. If there is a monic factor F of A in Q[x] which is congruent to B modulo Q then let Bb be the positive, primitive integral polynomial similar to F. If Bb is irreducible then B1 = Bb and B2 = 0. If Bb splits into two factors then B1, B2 are these two factors. In either case, Ab = A / Bb. If no such Bb exists then Ab = A and B1 = B2 = 0. ===========================================================================*/ #include "saclib.h" void IUPFT2(p,Q,Qp,q,A,B,Ab_,B1_,B2_) Word p,Q,Qp,q,A,B,*Ab_,*B1_,*B2_; { Word Ab,At,B1,B2,Bb,Bp,Bs,L,R,a,b,c,n,r,u; Step1: /* Convert B to a rational polynomial Bs if possible. */ B1 = 0; B2 = 0; Ab = A; Bp = B; Bs = NIL; a = PLDCF(A); do { PADV(Bp,&n,&u,&Bp); r = RNFMRPP(Q,Qp,q,p,u); if (r == NIL) goto Return; b = RNDEN(r); if (IREM(a,b) != 0) goto Return; Bs = COMP2(r,n,Bs); } while (Bp != 0); Bs = INV(Bs); Step2: /* Convert Bs to a primitive integral polynomial Bb. */ IPSRP(1,Bs,&c,&Bb); Step3: /* Is Bb a factor? */ IPQR(1,A,Bb,&At,&R); if (R != 0) { Bb = 0; goto Return; }; Ab = At; Step4: /* Check if Bb factors. */ if (PDEG(Bb) == 1) { B1 = Bb; B2 = 0; } else { L = IUSFPF2(Bb); ADV(L,&B1,&L); if (L == NIL) B2 = 0; else B2 = FIRST(L); } Return: /* Prepare for return. */ *Ab_ = Ab; *B1_ = B1; *B2_ = B2; return; } saclib2.2.8/src/FPROD2.c0000664002275300236100000000457314017255270013650 0ustar wcbrownscs/*====================================================================== FPROD2(A,B,d,C) Floating-point product, precision 2. Inputs A, B : double-precision floating-point numbers. d : a sign (rounding direction). C : an array of size at least 5. Output C : a double-precision floating-point number approximating the product of A and B. If d = -1, C is the gretest double- precision floating-point number less than or equal to the product. If d = +1, C is the least double -precision floating- point number greater than or equal to the product. If d = 0, C is the nearest double-precision floating-point number to the product (if two are equally near, the one with even mantissa is chosen). ======================================================================*/ #include "saclib.h" void FPROD2(A,B,d,C) Word *A,*B; BDigit d; Word *C; { BDigit c2,c21,c22,c23,c3,c31,c32,c33,c34,c41,c42,s; Step1: /* A or B zero. */ if (A[1] == 0 || B[1] == 0) { C[0] = 0; C[1] = 0; C[2] = 0; goto Return; } Step2: /* Compute exponent and sign. */ C[0] = A[0] + B[0]; if (A[1] == B[1]) s = 1; else s = -1; Step3: /* Compute mantissa. */ DPRNN(A[3],B[3],&c21,&C[1]); DPRNN(A[4],B[3],&c31,&c22); DPRNN(A[3],B[4],&c32,&c23); DPRNN(A[4],B[4],&c41,&c33); c2 = c21 + c22 + c23; C[2] = c2 & BETA1; c34 = c2 >> ZETA; c3 = c31 + c32 + c33 + c34; C[3] = c3 & BETA1; c42 = c3 >> ZETA; C[4] = c41 + c42; Step4: /* Normalize. */ if (C[4] < BETA2) { LSHIFT1(C+1,4); C[0] = C[0] - 1; } Step5: /* Rounding decision. */ if (d != 0) { if (d == s) { if (C[2] != 0 || C[1] != 0) goto Step6; else goto Step7; } else goto Step7; } else { if (C[2] > BETA2) goto Step6; else if (C[2] < BETA2) goto Step7; else { if (C[1] != 0) goto Step6; else if (ODD(C[3])) goto Step6; else goto Step7; } } Step6: /* Round up. */ C[3] = C[3] + 1; if (C[3] == BETA) { C[3] = 0; C[4] = C[4] + 1; if (C[4] == BETA) { C[4] = BETA2; C[0] = C[0] + 1; } } Step7: /* Store sign and precision. */ C[1] = s; C[2] = 2; Return: /* Return. */ return; } saclib2.2.8/src/AGIBL.c0000664002275300236100000000224414017255270013523 0ustar wcbrownscs/*======================================================================= AGIBL(A; n,k) Array Gaussian integer bit length. Input A : a Gaussian integer in array representation. Outputs n, k : nonnegative BETA digits. The bit length of A, that is, the maximum of the bit lengths of the real and imaginary parts of A, is equal to n * ZETA + k, 0 <= k < ZETA. (The bit length of the integer 0 is defined to be 0.) ========================================================================*/ #include "saclib.h" void AGIBL(A, n_,k_) BDigit **A,*n_,*k_; { BDigit *A1,*A2,a,k,n,n1,n2; Step1: /* Determine which part is longer, then how long it is. */ A1 = A[0]; A2 = A[1]; n1 = A1[1]; n2 = A2[1]; if (n1 > n2) { n = n1 - 1; a = A1[n1 + 1]; } else if (n2 > n1) { n = n2 - 1; a = A2[n2 + 1]; } else { if (n1 == 0) { n = 0; k = 0; goto Return; } n = n1 - 1; if (A1[n1 + 1] > A2[n2 + 1]) a = A1[n1 + 1]; else a = A2[n2 + 1]; } k = DLOG2(a); if (k == ZETA) { n = n + 1; k = 0; } Return: /* Return n and k. */ *n_ = n; *k_ = k; return; } saclib2.2.8/src/RNINT.c0000664002275300236100000000102014017255270013566 0ustar wcbrownscs/*====================================================================== R <- RNINT(A) Rational number from integer. Inputs A : an integer. Outputs R : the rational number A/1. ======================================================================*/ #include "saclib.h" Word RNINT(A) Word A; { Word R; /* hide algorithm */ Step1: /* Compute. */ if (A == 0) R = 0; else R = LIST2(A,1); Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/ANSI.c0000664002275300236100000000275514017255270013446 0ustar wcbrownscs/*====================================================================== ANSI(I,a,J) Algebraic number to software interval. Inputs I : a software interval containing an algebraic number \alpha. Let p be the precision of I. a : a nonzero element of Q[\alpha]. a is represented by a list (r,A), where r is a rational number and A is a nonzero univariate integral polynomial A(x) of degree less than deg(\alpha) such that r * A(\alpha) = a. J : an array of (at least) 2(p + 3) words. Effect A software interval of precision p containing a is placed in J. ======================================================================*/ #include "saclib.h" void ANSI(I,a,J) BDigit *I; Word a; BDigit *J; { BDigit *B,*Bp,i,m,p,q1,q2,s; Word b,c,d,e,A,Ap,r; Step1: /* Get an array B for a software interval polynomial. */ p = I[2]; q1 = p + 3; q2 = q1 + q1; FIRST2(a,&r,&A); m = PDEG(A); s = (m + 1) * q2 + 1; B = GETARRAY(s); B[0] = m; Step2: /* Let r = c / d. */ FIRST2(r,&c,&d); Step3: /* Convert rational coefficients to software intervals. */ Ap = A; Bp = B + s - q2; for (i = m; i >= 0; i--) { if (Ap == NIL || FIRST(Ap) < i) ISI(0,p,Bp); else { Ap = RED(Ap); ADV(Ap,&e,&Ap); b = IPROD(c,e); RSI(p,b,d,Bp); } Bp = Bp - q2; } Step4: /* Evaluate the software interval polynonmial at I. */ SIPEVAL(B,I,J); Step5: /* Free array B. */ FREEARRAY(B); Return: /* Return. */ return; } saclib2.2.8/src/GCATL.c0000664002275300236100000000126714017255270013543 0ustar wcbrownscs/*=========================================================================== L <- GCATL(A,n) GCA to list. Inputs A : is an array handle for a garbage collected array of size n. n : the size of the array. Outputs L : a list containing the elements of in the same order. ===========================================================================*/ #include "saclib.h" Word GCATL(A,n) Word A,n; { Word L,i; Step1: /* Initialize. */ L = NIL; if (n == 0) goto Return; Step2: /* Put the elements into the list. */ for (i = 0; i < n; i++) L = COMP(GCAGET(A,i),L); L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/CLEAR.c0000664002275300236100000000074614017255270013540 0ustar wcbrownscs/*=========================================================================== CLEAR(A,n) Clear array. Inputs A : array of length >= n. n : positive BETA-digit. Effect : A[0],...,A[n-1] are set to 0. ===========================================================================*/ #include "saclib.h" void CLEAR(A,n) Word *A,n; { Word i; Step1: /* Do it. */ for (i = 0; i < n; i++) A[i] = 0; Return: /* Prepare for return. */ return; } saclib2.2.8/src/MDRAN.c0000664002275300236100000000124714017255270013550 0ustar wcbrownscs/*====================================================================== a <- MDRAN(m) Modular digit, random. Inputs m : a positive BETA-digit. Outpus a : a random element of Z_m. ======================================================================*/ #include "saclib.h" Word MDRAN(m) Word m; { Word a,a1,a2,d1,d2,t; /* hide algorithm */ Step1: /* Compute. */ d1 = ABS(DRAN()); DPR(d1,m,&a,&t); if (m <= DELTA) goto Return; a1 = a; d2 = ABS(DRAN()); DPR(d2,m,&a,&a2); if (a1 + a2 >= BETA) a = a + 1; Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/AFPHIIR.c0000664002275300236100000000434614017255270013774 0ustar wcbrownscs/*====================================================================== L <- AFPHIIR(n,I,A,k) Algebraic field polynomial hardware interval isolation and refinement. Inputs n : a positive beta-digit. I : a hardware interval containing an algebraic number \alpha of degree n. A : a univariate polynomial of positive degree over the algebraic number field Q(\alpha). Each nonzero coefficient of A is represented by a pair (r,a) where r is a rational number and a is an integral polynomial of degree less than n, k : a beta-digit. Output L : either 0 or a list of isolating intervals for the real roots of A. A(x) is converted to a hardware interval polynomial B(x) using I. If the real roots of B(x) cannot be isolated L = 0, a failure condition. Otherwise L is a list of logarithmic binary rational intervals for A(x). Each interval is either a one-point interval, an interval of width 1 / 2^k, or wider in case width 1 / 2^k can not be achieved using hardware interval airthmetic. Remark AFPHIIR is floating-point overflow-underflow protected. ======================================================================*/ #include "saclib.h" Word AFPHIIR(n,I,A,k) BDigit n; interval I; Word A; BDigit k; { interval *B,Jp,K; BDigit h,j,m,t,T,u,s; Word J,Kp,L,Lp,w; Step1: /* Convert A to an interval polynomial B. */ AFPHIP(I,A,&B,&T); if (T == 0) { L = 0; goto Return; } Step2: /* Isolate the roots of B. */ m = PDEG(A); HIPRRID(m,B,&L,&s); if (L == 0) goto Return; Step3: /* Determine the trend of the first interval. */ if (B[m].left > 0) { if (EVEN(m)) t = -1; else t = +1; } else { if (EVEN(m)) t = +1; else t = -1; } Step4: /* Refine the isolating intervals. */ Lp = L; while (Lp != NIL) { J = FIRST(Lp); w = LBRIW(J); if (w != 0) { h = SECOND(w); if (h < k) { LBRIHI(J,&Jp,&u); if (u == 0) { L = 0; goto Return; } HIPIR(m,B,Jp,t,h,k,&K,&j); Kp = HILBRI(K); SFIRST(Lp,Kp); } } Lp = RED(Lp); t = - t; } Return: /* Return L. */ return(L); } saclib2.2.8/src/IPRCNP.c0000664002275300236100000000377614017255270013713 0ustar wcbrownscs/*====================================================================== IPRCNP(A,I; sp,spp,J) Integral polynomial real root calculation, Newton method preparation. Inputs A : in Z[X], positive, primitive, squarefree, deg(A) > 0. I : an open interval (a1,a2) with binary rational endpoints containing no roots of A' and A'', but a unique root, alpha, of A. Outputs sp, spp : BETA-digits, are the signs of A' and A'' on I. J : a subinterval (b1,b2) of I with binary rational endpoints, containing alpha and such that min(A'(b1),A'(b2)) >= (3/4) max(A'(b1),A'(b2)). J is a left-open and right-closed interval if b1 < b2, the one-point interval if b1 = b2. ======================================================================*/ #include "saclib.h" void IPRCNP(A,I, sp_,spp_,J_) Word A,I, *sp_,*spp_,*J_; { Word Ap,J,b,b1,b2,d,d1,d2,f,h,s,sp,spp,t; /* hide J,s,sp,spp,t; */ Step1: /* Initialize. */ FIRST2(I,&b1,&b2); h = LIST2(1,2); Step2: /* Compute s'. */ sp = IUPBES(A,b2); Step3: /* Compute s''. */ Ap = IPDMV(1,A); d1 = IUPBRE(Ap,b1); d2 = IUPBRE(Ap,b2); d = RNDIF(d2,d1); spp = RNSIGN(d); Step4: /* Compute fl. */ if (sp * spp > 0) f = LIST2(-3,4); else f = LIST2(-4,3); Step5: /* Test for completion. */ d = RNPROD(f,d2); d = RNSUM(d1,d); t = RNSIGN(d); if (spp * t >= 0) goto Step7; Step6: /* Bisect interval. */ b = RNSUM(b1,b2); b = RNPROD(b,h); s = IUPBES(A,b); if (s == 0) { b1 = b; b2 = b; goto Step7; } d = IUPBRE(Ap,b); if (s == sp) { b2 = b; d2 = d; } else { b1 = b; d1 = d; } goto Step5; Step7: /* Finish. */ J = LIST2(b1,b2); Return: /* Prepare for return. */ *sp_ = sp; *spp_ = spp; *J_ = J; return; } saclib2.2.8/src/GIFP.c0000664002275300236100000000104614017255270013431 0ustar wcbrownscs/*=========================================================================== A <- GIFP(A1,A2) Gaussian integer from parts. Inputs A1,A2 : Integers. Output A : The Gaussian integer A1 + A2 i. ===========================================================================*/ #include "saclib.h" Word GIFP(A1,A2) Word A1,A2; { Word A; Step1: /* A = 0? */ if (A1 == 0 && A2 == 0) A = 0; else A = LIST2(A1,A2); Return: /* Return A. */ return(A); } saclib2.2.8/src/IPTR1.c0000664002275300236100000000157214017255270013547 0ustar wcbrownscs/*====================================================================== B <- IPTR1(r,A,i) Integral polynomial translation by one, specified variable. Inputs: r : A BETA-digit. r >= 0. A : an element of Z[X1,...,Xr]. i : 1 <= i <= r. Outputs B : an element of Z[X1,...,Xr]. B(X1,...,Xi,...,Xr) = A(X1,...,X{i-1},Xi + 1,X{i+1},...,Xr). ======================================================================*/ #include "saclib.h" Word IPTR1(r,A,i) Word r,A,i; { Word B; Word At,Bt; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i=1. */ if (i == 1) { B = IPTR1LV(r,A); goto Return; } Step3: /* i>1. */ At = PCPV(r,A,1,i); Bt = IPTR1LV(r,At); B = PICPV(r,Bt,1,i); Return: return(B); } saclib2.2.8/src/INQ.c0000664002275300236100000000135514017255270013336 0ustar wcbrownscs/*======================================================================= q = INQ(a,b) Integer nearest quotient. Inputs a, b: integers, b > 0. Output q : the nearest integer to a / b. =======================================================================*/ #include "saclib.h" Word INQ(a,b) Word a,b; { Word ap,q,r; BDigit s,t; Step1: /* a = 0? */ if (a == 0) { q = 0; goto Return; } Step2: /* Division with remainder. */ s = ISIGNF(a); ap = IABSF(a); IQR(ap,b, &q,&r); Step3: /* Adjust q if needed. */ r = IMP2(r,1); t = ICOMP(b,r); if (t < 0 || (t == 0 && IODD(q))) q = ISUM(q,1); Step4: /* Restore sign. */ if (s < 0) q = INEG(q); Return: /* Return q. */ return(q); } saclib2.2.8/src/SMFMIP.c0000664002275300236100000000204314017255270013675 0ustar wcbrownscs/*====================================================================== B <- SMFMIP(r,M,A) Symmetric modular from modular integral polynomial. Inputs M : in Z, M > 0. A : in Z/(M)[X1,...,Xr]. r : a BETA-digit, r >= 0. Outputs B : in Z'/(M)[X1,...,Xr] with B=A (modulo M). ======================================================================*/ #include "saclib.h" Word SMFMIP(r,M,A) Word r,M,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=0. */ if (r == 0) { B = SMFMI(M,A); goto Return; } Step3: /* General case. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = SMFMI(M,a); else b = SMFMIP(rp,M,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MMAMNSB.c0000664002275300236100000000401214017255270013772 0ustar wcbrownscs/*=========================================================================== L <- MMAMNSB(p,n,M) Medium modulus array matrix null space basis. Inputs p : a medium prime. n : a positive BETA-digit. M : an n by n matrix of elements of Z/(p), represented by an array of arrays. Output L : a list of vectors, represented by arrays, constituting a basis for the space of all vectors A such that A * M = 0. ============================================================================*/ #include "saclib.h" Word MMAMNSB(p,n,M) Word p,n,**M; { Word *P,i,L,k,j,h,*B,a,b,c,d; Step1: /* Initialize P, the pivot record, L, the basis list and k, the row looping index. */ P = GETARRAY(n); for (i = 0; i < n; i++) P[i] = -1; L = NIL; k = 0; Step2: /* Search for pivot column. */ j = 0; while (j != n && (P[j] >= 0 || MATELT(M,k,j) == 0)) j++; Step3: /* Produce basis vector. */ if (j == n) { B = GETARRAY(n); for (j = 0; j < n; j++) { if (j == k) B[j] = 1; else { h = 0; while (h != n && P[h] != j) h++; if (h < n) B[j] = MATELT(M,k,h); else B[j] = 0; } } L = PTRCOMP(B,L); goto Step7; } Step4: /* Update pivot record. */ P[j] = k; Step5: /* Multiply pivot column by the negative inverse of the pivot. */ a = MATELT(M,k,j); b = p - MDINV(p,a); MATELT(M,k,j) = p - 1; for (i = k + 1; i < n; i++) { c = MATELT(M,i,j); if (c != 0) { d = b * c; MATELT(M,i,j) = d % p; } } Step6: /* Add multiples of pivot column to all other columns. */ for (i = 0; i < n; i++) if (i != j) { a = MATELT(M,k,i); if (a != 0) { MATELT(M,k,i) = 0; for (h = 0; h < n; h++) { b = a * MATELT(M,h,j) + MATELT(M,h,i); MATELT(M,h,i) = b % p; } } } Step7: /* Increment row index and test for end. */ k++; if (k < n) goto Step2; FREEARRAY(P); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MPSUM.c0000664002275300236100000000273214017255270013610 0ustar wcbrownscs/*====================================================================== C <- MPSUM(r,m,A,B) Modular polynomial sum. Inputs A,B : in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. m : a BETA-digit. Outputs C : in Z/(m)[X1,...,Xr], C = A + B. ======================================================================*/ #include "saclib.h" Word MPSUM(r,m,A,B) Word r,m,A,B; { Word Ap,Bp,C,Cp,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* General case. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); Cp = COMP2(b,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = MDSUM(m,a,b); else c = MPSUM(rp,m,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step3: /* Finish. */ if (Ap == NIL) Ap = Bp; if (Cp == NIL) C = Ap; else { C = INV(Cp); SRED(Cp,Ap); } if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/INQR.c0000664002275300236100000000327514017255270013463 0ustar wcbrownscs/*=========================================================================== INQR(A,B; Q,R) Integer nearest quotient and remainder. Inputs A, B : Integers, B /= 0. Outputs Q : the nearest integer to A/B; if two integers are equally near to A/B, Q is the one nearest to 0. R : the corresponding remainder, A - B * Q. ===========================================================================*/ #include "saclib.h" void INQR(A,B, Q_,R_) Word A,B, *Q_,*R_; { Word Q,R,s,t,u; Step1: /* Compute the usual quotient and remainder. */ IQR(A,B,&Q,&R); Step2: /* Remainder zero. */ if (R == 0) goto Return; Step3: /* Compute signs of A and B. */ s = ISIGNF(A); t = ISIGNF(B); Step4: /* A and positive. */ if (s > 0 && t > 0) { u = ICOMP(B,IDPR(R,2)); if (u < 0) { Q = ISUM(Q,1); R = IDIF(R,B); } goto Return; } Step5: /* A and B negative. */ if (s < 0 && t < 0) { u = ICOMP(B,IDPR(R,2)); if (u > 0) { Q = ISUM(Q,1); R = IDIF(R,B); } goto Return; } Step6: /* A positive and B negative. */ if (s > 0 && t < 0) { u = ICOMP(B,IDPR(R,-2)); if (u > 0) { Q = ISUM(Q,-1); R = ISUM(R,B); } goto Return; } Step7: /* A negative and B positive. */ if (s < 0 && t > 0) { u = ICOMP(B,IDPR(R,-2)); if (u < 0) { Q = ISUM(Q,-1); R = ISUM(R,B); } goto Return; } Return: /* Return Q and R. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/SIPNT.c0000664002275300236100000000202214017255270013574 0ustar wcbrownscs/*====================================================================== SIPNT(A,B) Software interval polynomial negative transformation. Inputs A : a software interval polynomial. B : an array large enough for an interval polynomial having the same degree and precision as A. Effect The interval polynomial A(-x) is placed in B. ======================================================================*/ #include "saclib.h" void SIPNT(A,B) BDigit *A,*B; { BDigit i,j,n,p,q1,q2,S; Step1: /* Compute sizes. */ n = A[0]; p = A[3]; q1 = p + 3; q2 = q1 + q1; Step2: /* Copy degree. */ B[0] = A[0]; Step3: /* Copy coefficients, some negated. */ S = 1; for (i = 0; i <= n; i++) { if (EVEN(i)) { for (j = 0; j < q2; j++) B[S+j] = A[S+j]; } else { for (j = 0; j < q1; j++) B[S+j] = A[S+q1+j]; for (j = 0; j < q1; j++) B[S+q1+j] = A[S+j]; B[S+1] = - B[S+1]; B[S+q1+1] = - B[S+q1+1]; } S = S + q2; } Return: /* Return. */ return; } saclib2.2.8/src/MMPEGC.c0000664002275300236100000000276614017255270013666 0ustar wcbrownscs/*=========================================================================== MMPEGC(p,A,B; C,U,V) Medium modulus polynomial extended greatest common divisor. Inputs p : a medium prime. A,B : in Z/(p)[x]. A and B are in list representation. Outputs C : in Z/(p)[x], C = gcd(A,B). U,V : in Z/(p)[x], A U + B V = C. If deg(A/C) > 0, then deg(V) < deg(A/C), else deg(V) = 0. If deg(B/C) > 0, then deg(U) < deg(B/C), else deg(U) = 0. If A = 0, U = 0. If B = 0, V = 0. ===========================================================================*/ #include "saclib.h" void MMPEGC(p,A,B, C_,U_,V_) Word p,A,B, *C_,*U_,*V_; { Word *Ap,*Bp,*Cp,*Dp,*Ep,*Up,*Vp,C,U,V,m,n; Step1: /* Convert to array representation. */ Ap = MAPFMUP(A); Bp = MAPFMUP(B); Step2: /* Compute. */ m = MAPDEG(Ap); n = MAPDEG(Bp); Cp = MAPGET(minm(m,n)); Vp = MAPGET(m); MMAPHEG(p,Ap,Bp,Cp,Vp); if (A == 0) { C = MUPFMAP(Cp); U = 0; V = MUPFMAP(Vp); } else { Dp = MAPGET(n+MAPDEG(Vp)); MAPPROD(p,Bp,Vp,Dp); Ep = MAPGET(maxm(MAPDEG(Cp),MAPDEG(Dp))); MAPDIF(p,Cp,Dp,Ep); Up = MAPGET(MAPDEG(Ep)-MAPDEG(Ap)); MMAPQR(p,Ep,Ap,Up); C = MUPFMAP(Cp); U = MUPFMAP(Up); V = MUPFMAP(Vp); MAPFREE(Up); MAPFREE(Dp); MAPFREE(Ep); } MAPFREE(Ap); MAPFREE(Bp); MAPFREE(Cp); MAPFREE(Vp); Return: /* Prepare for return. */ *C_ = C; *U_ = U; *V_ = V; return; } saclib2.2.8/src/ARIE.c0000664002275300236100000000170714017255270013430 0ustar wcbrownscs/*=========================================================================== ARIE(A,n,I) Array remove indexed elements. Inputs A : a garbage collected array containing n elements A_0, A_1, ..., A_{n-1}. n : a positive BETA-digit. I : a list (i_1,...,i_k) of BETA-digits, 0 <= i_1 < ... < i_k < n. Side effects The array A is modified by removing the elements indexed by I. This is done by reindexing the elements of A so that the elements indexed by I are overwritten. ===========================================================================*/ #include "saclib.h" void ARIE(A,n,I) Word A,n,I; { Word A1,Ip,c,i,j,k; Step1: /* Initialize. */ Ip = I; c = 0; k = n; Step2: /* Remove elements. */ while (Ip != NIL) { ADV(Ip,&i,&Ip); i -= c; c++; k--; for (j = i; j < k; j++) { A1 = GCAGET(A,j+1); GCASET(A,j,A1); } } Return: /* Prepare for return. */ return; } saclib2.2.8/src/DDRPCC.c0000664002275300236100000000674014017255270013651 0ustar wcbrownscs/*=========================================================================== DDRPCC(m,a1,a0,b1,b0; u1,u2,v1,v2) Double-digit restricted partial cosequence calculation. Inputs: m : a positive BETA digit. a1, a0, b1, b0: non-negative BETA-digits, with a1 >= BETA/2, b1 > 0 and a = a1 * BETA + a0 >= b = b1 * BETA + b0. Outputs: u1, u2, v1, v2: BETA-digits. Let A and B be positive integers such that, for some k >= 0, we have a = [A / 2^k] and b = [B / 2^k]. Then, for some i, nearly as large as possible, A_i = u1 A + v1 B and A_{i+1} = u2 A + v2 B, where A_j is the j-th term of the remainder sequence of A and B. Furthermore, |v2| < m or v1 <= 1. ===========================================================================*/ #include "saclib.h" void DDRPCC(m,a1,a0,b1,b0,u1_,u2_,v1_,v2_) Word m,a1,a0,b1,b0,*u1_,*u2_,*v1_,*v2_; { Word a10,a11,a20,a21,a30,a31,b20,b21,c0,c1,d,i,k,q, u1,u2,u3,v1,v2,v3,w; Step1: /* Initialize. */ a11 = a1; a10 = a0; a21 = b1; a20 = b0; u1 = 1; v1 = 0; u2 = 0; v2 = 1; Step2: /* Set b2 = b21 * BETA + b20 = a2 * 2^k, where k is such that a1 / a2 < 2^{k+1}, and k is minimal. */ k = 0; b21 = a21 << 1; while (b21 <= a11) { b21 = b21 << 1; k = k + 1; } b21 = b21 >> 1; if (k > 0) { b21 = b21 | (a20 >> (ZETA - k)); b20 = (a20 << k) & BETA1; } else b20 = a20; Step3: /* Divide by shifting and subtraction. */ d = 01 << k; a31 = a11; a30 = a10; q = 0; for (i = 0; i <= k; i++) { if ((b21 < a31) || (b21 == a31 && b20 <= a30)) { a31 = a31 - b21; a30 = a30 - b20; if (a30 < 0) { a30 = a30 + BETA; a31 = a31 - 1; } q = q + d; } d = d >> 1; b20 = (b20 >> 1) | ((b21 & 01) << (ZETA - 1)); b21 = b21 >> 1; } u3 = u1; v3 = v1; switch (q) { case 2: u3 -= u2; v3 -= v2; case 1: u3 -= u2; v3 -= v2; break; default: u3 -= q * u2; v3 -= q * v2; } Step4: /* Test for completion. */ if (a31 == 0) { if (a30 >= absm(v3) && (absm(v3) < m || v1 == 0)) { c0 = a20 - a30; if (c0 < 0) { c1 = a21 - 1; c0 += BETA; } else c1 = a21; w = v2 - v3; w = absm(w); if (w >= BETA) { w -= BETA; c1--; } c0 -= w; if (c1 > 0 || (c1 == 0 && c0 >= 0)) { u1 = u2; v1 = v2; u2 = u3; v2 = v3; } } goto Return; } c1 = a21 - a31; if (c1 <= 1) { c0 = a20 - a30; if (c1 == 1) c0 = c0 + BETA; w = v3 - v2; if (c0 < absm(w)) goto Return; } if (absm(v3) >= m) { if (v1 == 0) { u1 = u2; u2 = u3; v1 = v2; v2 = v3; } goto Return; } Step5: /* Update sequence values and return to Step 2. */ a11 = a21; a10 = a20; a21 = a31; a20 = a30; u1 = u2; v1 = v2; u2 = u3; v2 = v3; goto Step2; Return: /* Return. */ *u1_ = u1; *u2_ = u2; *v1_ = v1; *v2_ = v2; return; } saclib2.2.8/src/PDLOG2.c0000664002275300236100000000213114017255270013627 0ustar wcbrownscs/*====================================================================== n <- PDLOG2(a) Positive digit logarithm, base 2. Inputs a : a positive BETA-digit. Outputs n : a BETA-digit. n = floor(log2(a)) + 1, the bit-length of a. Restriction This program requires that ZETA = 29. ======================================================================*/ #include "saclib.h" Word PDLOG2(a) Word a; { Word c,n; Step1: /* Begin with binary search. */ if (a >= TABP2[15]) if (a >= TABP2[22]) { if (a >= TABP2[26]) n = 29; else n = 25; } else if (a >= TABP2[18]) n = 21; else n = 17; else if (a >= TABP2[8]) if (a >= TABP2[11]) n = 14; else n = 10; else if (a >= TABP2[4]) n = 7; else n = 3; Step2: /* Finish by shifting. */ c = TABP2[n]; while (a < c) { n = n - 1; c = c >> 1; } Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/IUPRRAFE.c0000664002275300236100000000573514017255270014132 0ustar wcbrownscs/*======================================================================== L <- IUPRRAFE(A,E,k) Integral univariate polynomial real root approximation from estimates. Inputs A: a squarefree integral univariate polynomial of positive degree. E: a list (a_1,a_2,...,a_r) of logarithmic binary rational numbers such that r > 0 is knon to be the number of real roots of A and a_i is an estimate of the i-th real root of A. k: an integer. Output L: a list (b_1,b_2,...,b_r) of logarithmic binary rational numbers such that the i-th real root of A is either b_i or is in the open interval (b_i,b_i + 2^{-k}). ========================================================================*/ #include "saclib.h" Word IUPRRAFE(A,E,k) Word A,E,k; { Word a,b,bp,i,I,L,L1,n,s,t,u; Step1: /* Initialize s to the sign of A at minus infinity. */ s = ISIGNF(PLDCF(A)); n = PDEG(A); if (IODD(n)) s = -s; Step2: /* Form the logarithmic binary rational number I = 2^{-k}. */ I = LIST2(1,k); Step3: /* Initialize output list L. */ L = NIL; Step4: /* Evaluate the sign of A at an approximation a; if zero, set b = a and go to Step7. */ ADV(E,&a,&E); t = IUPBRES(A,a); if (t == 0) { b = a; goto Step7; } Step5: /* Add or subtract 2^{-k} to approximation until the opposite sign, or zero, is obtained for A, but no more than 3 times. If 3 times does not suffice, go to Step 10. */ i = 0; while (i < 3) { i = i + 1; if (t == s) a = LBRNSUM(a,I); else a = LBRNDIF(a,I); u = IUPBRES(A,a); if (u != t || u == 0) goto Step6; } goto Step10; Step6: /* Choose the left endpoint of an isolating interval (or the root itself) as the aproximation b. */ if (u == 0) b = a; else if (t == s) b = LBRNDIF(a,I); else b = a; Step7: /* Check whether b is greater then the approximation for the preceding root, if any. If not, then go to Step 10. */ if (L != NIL) { bp = FIRST(L); if (LBRNCOMP(b,bp) <= 0) goto Step10; } Step8: /* Prefix b to the list L, change the sign of s, and return for the next root, if any. (s will always be the sign of A just to the left of the next root of A.) */ L = COMP(b,L); s = -s; if (E != NIL) goto Step4; Step9: /* Invert the list L and return. */ L = INV(L); goto Return; Step10: /* Disjoint isolating intervals were not found; use root isolation and refinement. Then extract the left endpoints of the isolating intervals. */ L = IPRRIRDB(A,-k); L1 = NIL; while (L != NIL) { ADV(L,&I,&L); a = FIRST(I); L1 = COMP(a,L1); } L = INV(L1); Return: /* Return the list L. */ return(L); } saclib2.2.8/src/COMP4.c0000664002275300236100000000106014017255270013522 0ustar wcbrownscs/*====================================================================== M <- COMP4(a1,a2,a3,a4,L) Composition 4. Inputs a1, a2, a3, a4 : objects. L : list. Outputs M : COMP(a1,COMP(a2,COMP(a3,COMP(a4,L)))). ======================================================================*/ #include "saclib.h" Word COMP4(a1,a2,a3,a4,L) Word a1,a2,a3,a4,L; { Word M; Step1: /* Compose. */ M = COMP(a1,COMP(a2,COMP(a3,COMP(a4,L)))); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/RNQ.c0000664002275300236100000000102114017255270013335 0ustar wcbrownscs/*====================================================================== T <- RNQ(R,S) Rational number quotient. Inputs R,S : rational numbers, S non-zero. Outputs T : R/S. ======================================================================*/ #include "saclib.h" Word RNQ(R,S) Word R,S; { Word T; /* hide T; */ Step1: /* Compute. */ if (R == 0) T = 0; else T = RNPROD(R,RNINV(S)); Return: /* Prepare for return. */ return(T); } saclib2.2.8/src/TLIL.c0000664002275300236100000000136014017255270013447 0ustar wcbrownscs/*======================================================================= v = TLIL(a,L) Table lookup in list. Inputs a : a beta digit. L : a nonempty list of the form (a_1,v_1,a_2,v_2,...,a_n,v_n), where the a_i's are distinct beta digits and the v_i's are arbitrary objects. Output v : if, for some i, a = a_i, then v = v_i. Otherwise v = NIL. =======================================================================*/ #include "saclib.h" Word TLIL(a,L) BDigit a; Word L; { Word Lp,v; Step1: /* Search for a. */ Lp = L; v = NIL; while (Lp != NIL) { if (FIRST(Lp) == a) { v = SECOND(Lp); goto Return; } else Lp = RED2(Lp); } Return: /* Return v. */ return(v); } saclib2.2.8/src/MPUCS.c0000664002275300236100000000156014017255270013574 0ustar wcbrownscs/*====================================================================== d <- MPUCS(r,p,A,c) Modular polynomial univariate content subroutine. Inputs r : a BETA-digit, r >= 2. p : a BETA-digit, prime. A : in Z/(p)[X1,...,Xr], non-zero. c : in Z/(p)[X]. Outputs d : in Z/(p)[X], the g.c.d. of c and the univariate content of A. ======================================================================*/ #include "saclib.h" Word MPUCS(r,p,A,c) Word r,p,A,c; { Word Ap,a,d,e,rp; /* hide a,e,rp; */ Step1: /* Compute. */ Ap = A; rp = r - 1; d = c; do { ADV2(Ap,&e,&a,&Ap); if (rp == 1) d = MUPGCD(p,a,d); else d = MPUCS(rp,p,a,d); } while (!(Ap == NIL || PDEG(d) == 0)); Return: /* Prepare for return. */ return(d); } saclib2.2.8/src/IPIQH.c0000664002275300236100000000467214017255270013566 0ustar wcbrownscs/*=========================================================================== IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C; A,B) Integral polynomial mod ideal quadratic hensel lemma. Inputs r : a BETA-digit, r >= 1. p : a BETA-digit, p prime. D : a list (d1,...,d_{r-1}), with di BETA-digits, di >= 0. Ab : in Z/(p)[x_1,...,x_{r-1},y]/(x_1^d1,...,x_{r-1}^d_{r-1}), Ab monic, deg_y(Ab) > 0. Bb,Sb,Tb : in Z/(p)[x_1,...,x_{r-1},y]/(x_1^d1,...,x_{r-1}^d_{r-1}), such that Ab*Sb + Bb*Tb = 1. M : in Z, M = p^j for some j in Z, j > 0. C : in Z[x_1,...,x_{r-1}], C congruent to Ab*Bb. Outputs A,B : Z/(M)[x_1,...,x_{r-1},y]/(x_1^d1,...,x_{r-1}^d_{r-1}), with A monic, deg_y(A) = deg_y(Ab), A congruent to Ab, B congruent to Bb, and A*B congruent to C. ===========================================================================*/ #include "saclib.h" void IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C, A_,B_) Word r,p,D,Ab,Bb,Sb,Tb,M,C, *A_,*B_; { Word A,As,At,B,Bs,Bt,I,R,Rp,S,Ss,St,T,Ts,Tt,U,U1,Ut,Y,Y1,Z,Z1, c,q,qs,qt; Step1: /* Initialize. */ q = p; A = Ab; B = Bb; S = Sb; T = Tb; I = PINV(0,1,r); if (q == M) goto Return; Step2: /* Compute Y,Z. */ R = MIPIPR(r,M,D,A,B); R = IPDIF(r,C,R); U = IPIQ(r,R,q); qs = IPROD(q,q); c = ICOMP(qs,M); if (c > 0) { qt = IEQ(M,q); At = MIPHOM(r,qt,A); Bt = MIPHOM(r,qt,B); St = MIPHOM(r,qt,S); Tt = MIPHOM(r,qt,T); } else { qt = q; At = A; Bt = B; St = S; Tt = T; } Ut = MIPHOM(r,qt,U); MIPISE(r,qt,D,At,Bt,St,Tt,Ut,&Y,&Z); Step3: /* Compute As,Bs and check for end. */ R = IPIP(r,q,Z); As = IPSUM(r,A,R); R = IPIP(r,q,Y); Bs = IPSUM(r,B,R); if (c >= 0) { A = As; B = Bs; goto Return; } Step4: /* Compute Y1,Z1. */ R = MIPIPR(r,qs,D,As,S); Rp = MIPIPR(r,qs,D,Bs,T); R = MIPSUM(r,qs,R,Rp); R = MIPDIF(r,qs,R,I); U1 = IPIQ(r,R,q); MIPISE(r,q,D,A,B,S,T,U1,&Y1,&Z1); Step5: /* Compute Ss,Ts. */ R = IPIP(r,q,Y1); Ss = MIPDIF(r,qs,S,R); R = IPIP(r,q,Z1); Ts = MIPDIF(r,qs,T,R); Step6: /* Advance. */ q = qs; A = As; B = Bs; S = Ss; T = Ts; goto Step2; Return: /* Prepare for return. */ *A_ = A; *B_ = B; return; } saclib2.2.8/src/IEAS.c0000664002275300236100000000147714017255270013435 0ustar wcbrownscs/*=========================================================================== IEAS(A1,m1,A2,m2; m1p) Integer Euclidean algorithm step. Inputs A1, A2: in Z, in array representation, with A1 >= A2 > 0. m1, m2: BETA digits, the lengths of A1 and A2, respectively. Output m1p: the length in BETA-digits of A1 - floor(A1/A2) * A2. Side effects A1 is replaced by A1 - floor(A1/A2) * A2. ===========================================================================*/ #include "saclib.h" void IEAS(A1,m1,A2,m2, m1p_) Word *A1,m1,*A2,m2, *m1p_; { Word *Q,m1p,q; Step1: /* Compute quotient and remainder. */ Q = GETARRAY(m1 - m2 + 1); IQRA(A1,m1,A2,m2,Q,&m1p,&q); Step2: /* Free quotient array. */ FREEARRAY(Q); Return: /* Prepare for return. */ *m1p_ = m1p; return; } saclib2.2.8/src/RNDIF.c0000664002275300236100000000073014017255270013545 0ustar wcbrownscs/*====================================================================== T <- RNDIF(R,S) Rational number difference. Inputs R,S : rational numbers. Outpus T : R-S. ======================================================================*/ #include "saclib.h" Word RNDIF(R,S) Word R,S; { Word T; /* hide T; */ Step1: /* Compute. */ T = RNSUM(R,RNNEG(S)); Return: /* Prepare for return. */ return(T); } saclib2.2.8/src/PTRADV2.c0000664002275300236100000000120714017255270013765 0ustar wcbrownscs/*====================================================================== PTRADV2(L; a,b,Lp) Advance 2. (assuming first two elts of L are pointers) Inputs L : a list of length 2 or more. (first two elts are pointers) Outputs a : the first element of L. b : the second element of L. Lp : the second reductum of L;(assuming a & b are pointers) ======================================================================*/ #include "saclib.h" void PTRADV2(L,a_,b_,Lp_) Word L, **a_, **b_, *Lp_; { Word Lp, *a, *b; Lp = NIL; PTRADV(Lp,&a,&Lp); PTRADV(Lp,&b,&Lp); *Lp_ = Lp; *a_ = a; *b_ = b; } saclib2.2.8/src/MPFFGEN.c0000664002275300236100000000257114017255270013772 0ustar wcbrownscs/*======================================================================= A <- MPFFGEN(p,F) Medium prime finite field generator. Inputs p : a medium prime. F: a monic irreducible polynomial over Z_p in aray representation of degree n, n >= 2 and p^n < beta. Output A: a monic primitive element of Z_p/(F) of minimum degree in array representation. ========================================================================*/ #include "saclib.h" BDigit *MPFFGEN(p,F) BDigit p,*F; { BDigit *A,*B,d,e,i,k,n,q,qp,t,u; Word L,Lp,M; Step1: /* Let q' = q^n - 1. Make a list L of all q'/d such that d is a prime divisor of q'. */ n = MAPDEG(F); q = IEXP(p,n); qp = q - 1; L = IFACT(qp); M = LFML(L); L = NIL; do { ADV(M,&d,&M); L = COMP(qp/d,L); } while (M != NIL); Step2: /* Search for a primitive element. */ for (k = 1; k < n; k++) { A = MAPGET(k); MAPDEG(A) = k; MAPCF(A,k) = 1; for (i = 0; i < k; i++) MAPCF(A,i) = 0; do { Lp = L; do { ADV(Lp,&e,&Lp); B = MPFFEXP(p,F,A,e); u = 0; if (MAPDEG(B) == 0 && MAPCF(B,0) == 1) u = 1; MAPFREE(B); } while (Lp != NIL && u == 0); if (Lp == NIL && u == 0) goto Return; t = LEXNEXT(k,p-1,A); } while (t == 1); MAPFREE(A); } Return: /* Return A. */ return(A); } saclib2.2.8/src/IPCA.c0000664002275300236100000000261414017255270013422 0ustar wcbrownscs/*======================================================================= IPCA(r,A; n,h,k,t) Integral polynomial coefficient analysis. Inputs r : a positive beta digit. A : an integral polynomial in r variables. Outputs n : the number of monomials in A. h : the minimum number of bits in any nonzero integer coefficient of A. k : the maximum number of bits in any nonzero integer coefficient of A. t : the total number of bits in all of the integer coefficients of A. ===========================================================================*/ #include "saclib.h" void IPCA(r,A, n_,h_,k_,t_) BDigit r; Word A; BDigit *n_,*h_,*k_,*t_; { BDigit h,h1,j,k,k1,n,n1,rp,t,t1; Word a,Ap; Step1: /* A = 0. */ n = 0; h = 0; k = 0; t = 0; if (A == 0) goto Return; Step2: /* r = 1. */ if (r == 1) { Ap = A; h = BETA1; while (Ap != NIL) { a = SECOND(Ap); n = n + 1; j = ILOG2(a); if (j < h) h = j; if (j > k) k = j; t = t + j; Ap = RED2(Ap); } goto Return; } Step3: /* r > 1. */ Ap = A; rp = r - 1; h = BETA1; while (Ap != NIL) { a = SECOND(Ap); IPCA(rp,a,&n1,&h1,&k1,&t1); n = n + n1; if (h1 < h) h = h1; if (k1 > k) k = k1; t = t + t1; Ap = RED2(Ap); } Return: /* Return n, h, k and t. */ *n_ = n; *h_ = h; *k_ = k; *t_ = t; } saclib2.2.8/src/AFPAFP.c0000664002275300236100000000205714017255270013644 0ustar wcbrownscs/*====================================================================== C <- AFPAFP(r,M,a,B) Algebraic number field polynomial algebraic number field element product. Inputs r : a BETA-digit, r >= 1, the number of variables. M : in Z[X], M is the minimal polynomial for alpha. a : in Q(alpha). B : in Q(alpha)[X1,...,Xr]. Outputs C : in Q(alpha)[X1,...,Xr], C = a * B. ======================================================================*/ #include "saclib.h" Word AFPAFP(r,M,a,B) Word r,M,a,B; { Word Bp,C,b,c,e,rp; /* hide b,rp; */ Step1: /* C = 0. */ if (a == 0 || B == 0) { C = 0; goto Return; } Step2: /* General case. */ Bp = B; C = NIL; rp = r - 1; do { ADV2(Bp,&e,&b,&Bp); if (rp == 0) c = AFPROD(M,a,b); else c = AFPAFP(rp,M,a,b); C = COMP2(c,e,C); } while (Bp != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/RISUM.c0000664002275300236100000000123714017255270013605 0ustar wcbrownscs/*====================================================================== d <- RISUM(I,J) Rational interval sum. Inputs I, J : rational intervals. Outputs K : a rational interval. K=I+J. ======================================================================*/ #include "saclib.h" Word RISUM(I,J) Word I,J; { Word K; Word a1,a2,b1,b2,c1,c2; Step1: /* Get endpoints of I and J. */ FIRST2(I,&a1,&a2); FIRST2(J,&b1,&b2); Step2: /* Add corresponding endpoints. */ c1 = RNSUM(a1,b1); c2 = RNSUM(a2,b2); Step3: /* Construct list for K. */ K = LIST2(c1,c2); Return: return(K); } saclib2.2.8/src/IREM.c0000664002275300236100000000102014017255270013430 0ustar wcbrownscs/*========================================================================== C <- IREM(A,B) Integer remainder. Inputs A, B : in Z. B non-zero. Outputs C : in Z. Z = A - B * Q, where Q is the integral part of A / B. ==========================================================================*/ #include "saclib.h" Word IREM(A,B) Word A,B; { Word C,Q; /* hide algorithm */ Step1: /* Compute. */ IQR(A,B,&Q,&C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/PHDREM.c0000664002275300236100000000227714017255270013672 0ustar wcbrownscs/*=========================================================================== r <- PHDREM(a1,a0,b) Positive half-digit remainder. Inputs a1, a0, b : BETA-integers with a1 and a0 non-negative, 0 < b < 2^15 and a = a1 * BETA + a0 < b * BETA. Outputs r : a BETA-integer, the remainder of (a1 * BETA + a0) modulo b, 0 <= r < b. Restriction: This program is valid only if the word length is 32 bits and ZETA = 29. ===========================================================================*/ #include "saclib.h" Word PHDREM(a1,a0,b) Word a1,a0,b; { Word a,ap,c,c1,c0,q1,q0,r; Step1: /* Compute q1 = [[a / 2^15] / b]. */ ap = (a1<<14) | (a0 >> 15); q1 = ap / b; Step2: /* Subtract 2^15 * b * q1 from a. */ c = b * q1; c1 = c >> 14; c0 = (c << 15) & BETA1; a0 = a0 - c0; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; } a1 = a1 - c1; Step3: /* Compute q0 = [a / b]. */ a = a0; if (a1 > 0) a = a + BETA; q0 = a / b; Step4: /* Compute r = a - b * q0. */ c = b * q0; r = a0 - c; if (r < 0) r = r + BETA; Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/CONC.c0000664002275300236100000000131214017255270013422 0ustar wcbrownscs/*====================================================================== L <- CONC(L1,L2) Concatenation. Inputs L1, L2 : lists Outputs L : the concatenation of L1 and L2 ( The list L1 is modified ). ======================================================================*/ #include "saclib.h" Word CONC(L1,L2) Word L1,L2; { Word L,Lp; /* hide algorithm */ Step1: /* L1 null. */ L = L2; if (L1 == NIL) goto Return; Step2: /* L2 null. */ L = L1; if (L2 == NIL) goto Return; Step3: /* L1 and L2 non-null. */ Lp = LASTCELL(L1); SRED(Lp,L2); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/HIPRT.c0000664002275300236100000000116614017255270013575 0ustar wcbrownscs/*====================================================================== B <- HIPRT(n,A) Hardware interval polynomial reciprocal transformation. Inputs n : a positive BETA-digit. A : in HI[x], deg(A) = n. Output B : in HI[x], B(x) = X^n A(1/x). ======================================================================*/ #include "saclib.h" interval *HIPRT(n,A) BDigit n; interval *A; { BDigit i; interval *B; Step1: /* Get array for B. */ B = GETHIPARRAY(n); Step2: /* Copy elements in reverse order. */ for (i=0; i <= n; i++) B[i] = A[n-i]; Return: /* Return B. */ return(B); } saclib2.2.8/src/ADDTO.c0000664002275300236100000000200214017255270013530 0ustar wcbrownscs/*=========================================================================== ADDTO(A,B,n) Add array to array. Inputs A, B : arrays of length >= n containing non-negative BETA-digits. n : positive BETA-digit. Effect : B[0],...,B[n-1] is added to A[0],...,A[n-1],... (result in A). ===========================================================================*/ #include "saclib.h" void ADDTO(A,B,n) Word *A,*B,n; { Word c,cp,i; Step1: /* Add. */ cp = 0; for (i = 0; i < n; i++) { c = A[i] + B[i] + cp; if (c >= BETA) { c = c - BETA; cp = 1; } else cp = 0; A[i] = c; } Step2: /* Propagate carry. */ while (cp != 0) { c = A[i] + cp; if (c >= BETA) { c = c - BETA; cp = 1; } else cp =0; A[i] = c; i++; } Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPREAD.c0000664002275300236100000000370414017255270013653 0ustar wcbrownscs/*====================================================================== IPREAD(; r,A) Integral polynomial read. Outputs A : in Z[X1,...Xr]. A is read from the input stream. Blanks are skipped. r : a BETA-digit, r >= 0, the number of variables. ======================================================================*/ #include "saclib.h" void IPREAD(r_,A_) Word *r_,*A_; { Word A,C,Cp,a,e,r,rp,v; /* hide A,C,Cpa,e,r,rp,v; */ Step1: /* r = 0. */ C = CREADB(); if (C != '(') { BKSP(); A = IREAD(); r = 0; goto Return; } Step2: /* Initialize. */ A = NIL; rp = 0; Step3: /* Read first coefficient. */ C = LKAHEAD(); if (LETTER(C) || DIGIT(C) || (C == '(')) { if (LETTER(C)) a = 1; else if (DIGIT(C)) a = IREAD(); else if (C == '(') IPREAD(&rp,&a); goto Step5; } Step4: /* Read coefficient. */ C = CREADB(); if (C != '+' && C != '-') goto Step7; Cp = LKAHEAD(); if (LETTER(Cp) || DIGIT(Cp)) { if (LETTER(Cp)) a = 1; else a = IREAD(); if (C == '-') a = INEG(a); } if (Cp == '(') { IPREAD(&rp,&a); if (C == '-') a = IPNEG(rp,a); } Step5: /* Read variable and exponent. */ C = LKAHEAD(); if (LETTER(C)) { v = VREAD(); C = CREADB(); if (C != '^') { e = 1; BKSP(); } else { C = LKAHEAD(); if (DIGIT(C)) e = AREAD(); else goto Step7; } } else e = 0; Step6: /* Check for end. */ A = COMP2(a,e,A); C = CREADB(); if (C != ')') { BKSP(); goto Step4; } else r = rp + 1; A = INV(A); goto Return; Step7: /* Error. */ FAIL("IPREAD","Unexpected character",C); Return: /* Prepare for return. */ *r_ = r; *A_ = A; return; } saclib2.2.8/src/DRANN.c0000664002275300236100000000112114017255270013540 0ustar wcbrownscs/*====================================================================== a <- DRANN() Digit, random non-negative. Outputs a : random non-negative BETA-digit. Caution, the low-order bits of a are not very random. ======================================================================*/ #include "saclib.h" Word DRANN() { Word a,t; /* hide algorithm */ Step1: /* Compute. */ DPR(RTERM,RMULT,&t,&a); a = a + RINC; if (a >= BETA) a = a - BETA; RTERM = a; Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/EQUAL.c0000664002275300236100000000174614017255270013562 0ustar wcbrownscs/*====================================================================== t <- EQUAL(a,b) Equal. Inputs a, b : objects. Outputs t : t = 1 if a and b are equal, t = 0 otherwise. ======================================================================*/ #include "saclib.h" Word EQUAL(a,b) Word a,b; { Word a1,ap,b1,bp,t; /* hide t; */ Step1: /* Identical atoms or list representations. */ t = 0; if (a == b) { t = 1; goto Return; } Step2: /* a or b is an atom. */ if (a < BETA || b < BETA) goto Return; Step3: /* Recursion. */ ap = a; bp = b; while (ap != NIL && bp != NIL) { ADV(ap,&a1,&ap); ADV(bp,&b1,&bp); if (EQUAL(a1,b1) == 0) goto Return; if (ap == bp) { t = 1; goto Return; } } Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/SRED.c0000664002275300236100000000063314017255270013442 0ustar wcbrownscs/*====================================================================== SRED(L,Lp) Set reductum. Inputs L : non empty list. Lp : list. Side effects The list L is modified by changing its reductum to Lp. ======================================================================*/ #include "sactypes.h" extern Word *SPACEB; void SRED(L,Lp) Word L,Lp; { SPACEB[L] = Lp; } saclib2.2.8/src/IUPVSI.c0000664002275300236100000000222114017255270013717 0ustar wcbrownscs/*====================================================================== v <- IUPVSI(A,I) Integral univariate polynomial, variations for standard interval. Inputs A : in Z[X], non-zero. I : a standard open interval. Let T(z) be the transformation mapping the right half-plane onto the circle having I as a diameter. Let B(x)=A(T(x)). Outputs v : the number of sign variations in the coefficients of B. ======================================================================*/ #include "saclib.h" Word IUPVSI(A,I) Word A,I; { Word B,C,a,b,d,h,k,kp,v; /* hide a,b,k,kp,v; */ Step1: /* Compute h and k such that I=(a,b), a=h * 2^k and b=(h+1)*2^k. */ FIRST2(I,&a,&b); d = RNDIF(b,a); RNFCL2(d,&k,&kp); if (a != 0) { h = RNQ(a,d); h = FIRST(h); } else h = 0; Step2: /* Transform and count variations. */ if (k != 0) B = IUPBHT(A,k); else B = A; if (h != 0) C = IUPTR(B,h); else C = B; v = IPVCHT(C); Return: /* Prepare for return. */ return(v); } saclib2.2.8/src/ISPFAC2.c0000664002275300236100000000233114017255270013731 0ustar wcbrownscs/*========================================================================= L <- ISPFAC2(r,A) Integral squarefree polynomial factorization, degree 2. Inputs r : a BETA-digit, r >= 1, the number of variables; A : in Z[X1,...,Xr], positive, primitive, squarefree and of degree 2. Output L : a list (A1,...,A_k) of all the irreducible factors A_i of A. ==========================================================================*/ #include "saclib.h" Word ISPFAC2(r,A) Word r,A; { Word a,b,c,D1,D2,D,rp,ap,F1,F2,f1,f2,L,d; Step1: /* Compute the discriminant D. */ a = PCOEFF(A,2); b = PCOEFF(A,1); c = PCOEFF(A,0); rp = r-1; D1 = IPPROD(rp,b,b); D2 = IPPROD(rp,IPIP(rp,-4,a),c); D = IPSUM(rp,D1,D2); Step2: /* Is D a square? */ d = IPSQRT(rp,D); if (d == NIL) { L = LIST1(A); goto Return; } Step3: /* D a square. */ f1 = IPSUM(rp,b,d); ap = IPIP(rp,2,a); F1 = IPSUM(r,PMON(ap,1),PMON(f1,0)); F1 = IPPP(r,F1); f2 = IPDIF(rp,b,d); F2 = IPSUM(1,PMON(ap,1),PMON(f2,0)); F2 = IPPP(r,F2); L = LIST2(F1,F2); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IEEEWRITE.c0000664002275300236100000000165414017255270014233 0ustar wcbrownscs/*====================================================================== IEEEWRITE(F) IEEE write. Input F : a hardware float. Effect The sign, high-order mantissa, low-order mantissa, and exponent are written as the elements of a list. The low-order mantissa is broken into a 5-bit unsigned integer followed by a 27-bit unsigned integer. ======================================================================*/ #include "saclib.h" void IEEEWRITE(F) ieee F; { unsigned m1,m0; int s,e; BDigit a,b; Word L; ieee_rep G; Step1: /* Decompose F. */ G = F.rep; s = G.sign; m1 = G.mant_h; m0 = G.mant_l; e = G.exp - BIAS; Step2: /* Break up the high-order mantissa. */ a = m0 >> 27; b = (m0 << 5) >> 5; Step3: /* Compoise and write list. */ L = LIST5(s,m1,a,b,e); LWRITE(L); Return: /* Return. */ return; } saclib2.2.8/src/IBCIND.c0000664002275300236100000000124514017255270013635 0ustar wcbrownscs/*=========================================================================== B <- IBCIND(A,n,k) Integer binomial coefficient induction. Inputs n,k : BETA-digits with 0 <= k <= n. A : the binomial coefficient (n choose k). Outputs B : the binomial coefficient (n choose (k+1)). ===========================================================================*/ #include "saclib.h" Word IBCIND(A,n,k) Word A,n,k; { Word B,kp,np; Step1: /* Compute. */ np = n - k; kp = k + 1; if ((A < BETA) && (np < (BETA / A))) B = (A * np) / kp; else B = IDEQ(IDPR(A,np),kp); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/LFML.c0000664002275300236100000000140414017255270013434 0ustar wcbrownscs/*======================================================================= M = LFML(L) List from multilist. Input L : a multilist of beta-integers, L = (a_1,...,a_n) with a_1 <= a_2 <= ... <= a_n. Output M : a list M = (b_1,...,b_k) with b_1 < b_2 < ... < b_k, consisting of all a_i in the list L. ========================================================================*/ #include "saclib.h" Word LFML(L) Word L; { BDigit e,f; Word Lp,M; Step1: /* L empty.*/ if (L == NIL) { M = NIL; goto Return; } Step2: /* L nonempty.*/ ADV(L,&e,&Lp); M = LIST1(e); while (Lp != NIL) { ADV(Lp,&f,&Lp); if (e != f) { M = COMP(f,M); e = f; } } M = INV(M); Return: /* Return M. */ return(M); } saclib2.2.8/src/IPRODAP.c0000664002275300236100000000336314017255270014006 0ustar wcbrownscs/*=========================================================================== IPRODAP(A,n1,B,n2; n3) Integer product - array multiplication in place. Inputs n1,n2: non-negative beta-digits. A, B : arrays that contain non-negative integers A',B' of BETA-length n1, n2, respectively. Array A has length >= n1 + n2. Effect : Array A contains the product A' * B'. Outputs n3 : a non-negative BETA-digit. n3 is the BETA-length of A' * B'. ===========================================================================*/ #include "saclib.h" void IPRODAP(A,n1,B,n2, n3_) Word *A,n1,*B,n2,*n3_; { Word a,c,c0,c1,cp,i,j,k,n3; Step1: /* A' = 0 or B' = 0. */ if (n1 == 0 || n2 == 0) { n3 = 0; goto Return; } Step2: /* Multiply by A[n1-1]. */ i = n1 - 1; a = A[i]; DPR(a,B[0],&cp,&A[i]); k = n1; for (j = 1; j < n2; j++) { DPR(a,B[j],&c1,&c0); c = c0 + cp; cp = c >> ZETA; A[k] = c & BETA1; cp = cp + c1; k++; } A[k] = cp; Step3: /* Multiply by A[n1-2],...,A[0]. */ while (i > 0) { k = i; i--; a = A[i]; DPR(a,B[0],&cp,&A[i]); for (j = 1; j < n2; j++) { DPR(a,B[j],&c1,&c0); c = A[k] + c0 + cp; cp = c >> ZETA; A[k] = c & BETA1; cp = cp + c1; k++; } do { c = A[k] + cp; cp = c >> ZETA; A[k] = c & BETA1; k++; } while (cp != 0); } Step4: /* Determine length of result. */ n3 = n1 + n2 - 1; if (A[n3] != 0) n3++; Return: /* Prepare for return. */ *n3_ = n3; return; } saclib2.2.8/src/AGIGCD2.c0000664002275300236100000001164314017255270013710 0ustar wcbrownscs/*======================================================================= D = AGICD2(A,B) Array Gaussian integer greatest common divisor. Inputs A, B : array Gaussian integers. Output C : an array Gaussian integer, a greatest common divisor of A and B. ========================================================================*/ #include "saclib.h" BDigit **AGIGCD2(A,B) BDigit **A,**B; { BDigit **D,**Dt,**E,**Et,**F,**Ft,*Gt,**Q,*T1,*T2,*T3,**U; BDigit d,dp,h,k,kp,M,m,N,n,np,p,t; BDigit d1,d2,e,e1,e2,f1,f2,q1,q2,r1,r2; BDigit i,I; /* BDigit g,j,*W,*X; BDigit **S; BDigit P,T,V; */ Step1: /* Set the precision. */ d = 8; Step2: /* Compute the initial bit lengths. */ AGIBL(A, &m,&h); M = m * ZETA + h; AGIBL(B, &n,&k); N = n * ZETA + k; Step3: /* Get Arrays. */ p = m + n + 4; D = GETMATRIX(2,p); E = GETMATRIX(2,p); F = GETMATRIX(2,p); Dt = GETMATRIX(2,p); Et = GETMATRIX(2,p); Ft = GETMATRIX(2,p); Q = GETMATRIX(2,p); U = GETMATRIX(2,p); Gt = GETARRAY(p); T1 = GETARRAY(p); T2 = GETARRAY(p); T3 = GETARRAY(p); /* W = GETARRAY(11); for (i = 0; i <= 10; i++) W[i] = 0; */ /* X = GETARRAY(12); for (i = 0; i <= 11; i++) X[i] = 0; */ /* S = GETMATRIX(11,11); for (i = 0; i<= 10; i++) { for (j = 0; j <= 10; j++) { S[i][j] = 0; } } */ Step4: /* Let D be the longer of A and B, E the shorter. */ if (M >= N) { AGICOPY(A,D); AGICOPY(B,E); } else { AGICOPY(B,D); AGICOPY(A,E); t = m; m = n; n = t; t = h; h = k; k = t; t = M; M = N; N = t; } i = 1; Step5: /* E = 0? */ if (N == 0) goto Step10; Step6: /* Truncate D and E. */ /* SWRITE("i = "); IWRITE(i); SWRITE(", M = "); IWRITE(M); SWRITE(", N = "); IWRITE(N); SWRITE("\n"); */ dp = M - N + d; if (M - N + dp + dp <= ZETA) { np = n; kp = k - dp; if (kp < 0) { np = np - 1; kp = kp + ZETA; } if (np < 0) { np = 0; kp = 0; } d1 = AITRS(D[0],np,kp); d2 = AITRS(D[1],np,kp); e1 = AITRS(E[0],np,kp); e2 = AITRS(E[1],np,kp); } else { np = dp / ZETA; kp = dp - np * ZETA; np = n - np; kp = k - kp; if (kp < 0) { kp = kp + ZETA; np = np - 1; } if (np < 0) { np = 0; kp = 0; } AGITR(D,np,kp,Dt); AGITR(E,np,kp,Et); } Step7: /* Compute the approximate nearest quotient, Q. */ if (M - N + dp + dp <= ZETA) { e = e1 * e1 + e2 * e2; f1 = d1 * e1 + d2 * e2; f2 = d2 * e1 - d1 * e2; q1 = f1 / e; r1 = f1 - e * q1; if (f1 >= 0 && r1 + r1 > e) q1 = q1 + 1; else if (f1 <= 0 && r1 + r1 < - e) q1 = q1 - 1; q2 = f2 / e; r2 = f2 - e * q2; if (f2 >= 0 && r2 + r2 > e) q2 = q2 + 1; else if (f2 <= 0 && r2 + r2 < - e) q2 = q2 - 1; Q[0][1] = 1; Q[0][0] = SIGN(q1); Q[0][2] = ABS(q1); Q[1][1] = 1; Q[1][0] = SIGN(q2); Q[1][2] = ABS(q2); } else { Et[1][0] = - Et[1][0]; AGIPROD(Dt,Et,Ft,T1,T2); AGINORM(Et,Gt,T1,T2); AINQ(Ft[0],Gt,Q[0],T1,T2,T3); AINQ(Ft[1],Gt,Q[1],T1,T2,T3); } /* if (Q[0][1] ==1 && Q[0][2] <= 9) { j = Q[0][2]; W[j] = W[j] + 1; } else W[10] = W[10] + 1; if (Q[1][1] ==1 && Q[1][2] <= 9) { j = Q[1][2]; W[j] = W[j] + 1; } else W[10] = W[10] + 1; */ /* g = Q[0][2]; j = Q[1][2]; if (j > g) { t = g; g = j; j = t; } if (g <= 10) S[g][j] = S[g][j] + 1; */ Step8: /* Compute F = D - E * Q. */ Q[0][0] = - Q[0][0]; Q[1][0] = - Q[1][0]; AGIPROD(E,Q,U,T1,T2); AGISUM(D,U,F); Step9: /*Update variables for next loop pass. */ i = i + 1; D = E; E = F; F = D; M = N; m = n; h = k; AGIBL(E, &n,&k); N = n * ZETA + k; /* j = M - N; if (j <= 10) X[j + 1] = X[j + 1] + 1; else X[12] = X[12] + 1; */ goto Step5; Step10: /* Free arrays. */ FREEMATRIX(E,2); FREEMATRIX(F,2); FREEMATRIX(Dt,2); FREEMATRIX(Et,2); FREEMATRIX(Ft,2); FREEMATRIX(Q,2); FREEMATRIX(U,2); FREEARRAY(Gt); FREEARRAY(T1); FREEARRAY(T2); FREEARRAY(T3); SWRITE("I = "); I = i - 1; SWRITE("I = "); IWRITE(I); SWRITE("\n"); /* for (j = 0; j <= 10; j++) { SWRITE("W["); IWRITE(j); SWRITE("] = "); IWRITE(W[j]); SWRITE("\n"); } FREEARRAY(W); */ /* for (j = 0; j <= 11; j++) { SWRITE("X["); IWRITE(j); SWRITE("] = "); IWRITE(X[j]); SWRITE("\n"); } FREEARRAY(X); */ /* T = 0; for (i = 1; i <= 10; i++) { for (j = 0; j <= i; j++) { P = IPROD(S[i][j],100000); T = ISUM(T,P); if (i == j || j == 0) P = IQ(P,4); else P = IQ(P,8); P = IQ(P,I); SWRITE("i = "); IWRITE(i); SWRITE(", j = "); IWRITE(j); SWRITE(", S = "); IWRITE(S[i][j]); SWRITE(", P = "); IWRITE(P); SWRITE(", "); V = IQ(T,I); SWRITE("V = "); IWRITE(V); SWRITE("\n"); } } */ Return: /* Return(D). */ return(D); } saclib2.2.8/src/AFUPFRPT.c0000664002275300236100000000344514017255270014140 0ustar wcbrownscs/*========================================================================== t <- AFUPFRPT(M,A,B) Algebraic number field univariate polynomial fast relative-primality test. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. A,B : in Q(alpha)[x], A != 0 or B != 0. Outputs t : 0 or 1. If A and B are shown to be relatively prime, then t = 1. Otherwise, t = 0 and the test is inconclusive. ==========================================================================*/ #include "saclib.h" Word AFUPFRPT(M,A,B) Word M,A,B; { Word A1,A1p,A2,A2p,Cp,G,Mp,Mpp,P,R,c,p,t; Word *Gp,*Sp,*Spp; Step1: /* A = 0 or B = 0. */ if (A == 0 || B == 0) { t = 0; goto Return; } Step2: /* Initialize. */ P = MPRIME; A1 = AFPICR(1,A); A2 = AFPICR(1,B); IPSRP(2,A1,&R,&A1); IPSRP(2,A2,&R,&A2); Step3: /* Reduce polynomials modulo a prime. */ if (P == NIL) FAIL("AFUPGCD","Prime list exhausted"); ADV(P,&p,&P); Mp = MPHOM(1,p,M); if (PDEG(Mp) < PDEG(M)) goto Step3; A1p = MPHOM(2,p,A1); if (PDEG(A1p) < PDEG(A1)) goto Step3; A2p = MPHOM(2,p,A2); if (PDEG(A2p) < PDEG(A2)) goto Step3; Step4: /* Check if p divides disc(M). */ Mpp = MUPDER(p,Mp); Sp = MAPFMUP(Mp); Spp = MAPFMUP(Mpp); Gp = MMAPGCD(p,Sp,Spp); G = MUPFMAP(Gp); MAPFREE(Sp); MAPFREE(Spp); MAPFREE(Gp); if (PDEG(G) > 0) goto Step3; Step5: /* Compute monic gcd modulo p. */ Mp = MPMON(1,p,Mp); Cp = FRUPGCD(p,Mp,A1p,A2p); if (Cp == NIL) goto Step3; Step6: /* Check degree. */ c = PDEG(Cp); if (c == 0) t = 1; else t = 0; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/MAPHOM.c0000664002275300236100000000144314017255270013666 0ustar wcbrownscs/*=========================================================================== MAPHOM(m,A,B) Modular array polynomial homomorphism. Inputs m : a BETA-digit. A : in Z/(q)[x], where q is a BETA-digit. A is in array representation. B : an array large enough to hold A. Side effect H_m(A) is computed and put in B. ===========================================================================*/ #include "saclib.h" void MAPHOM(m,A,B) Word m,*A,*B; { Word b,n,i; Step1: /* Initialize. */ n = MAPDEG(A); Step2: /* Compute. */ for (i = 0; i <= n; i++) { b = MAPCF(A,i) % m; MAPCF(B,i) = b; } Step3: /* Determine degree. */ i = n; while (MAPCF(B,i) == 0 && i > 0) i--; MAPDEG(B) = i; Return: /* Prepare for return. */ return; } saclib2.2.8/src/AFPNIP.c0000664002275300236100000000271214017255270013662 0ustar wcbrownscs/*====================================================================== L <- AFPNIP(M,A) Algebraic number field polynomial normalize to integral polynomial. Inputs M : in Z[x], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[x], deg(A) > 0. Outputs L : a list (L1,...,Ln), n >= 1, of the positive irreducible factors of positive degreee of a univariate integral polynomial which has among its roots the roots of A. ======================================================================*/ #include "saclib.h" Word AFPNIP(M,A) Word M,A; { Word Ap,As,C,L,L1,Lp,Mp,c,d,e,s; /* hide c,d,s; */ Step1: /* Convert representation. */ Ap = A; As = NIL; while (Ap != NIL) { ADV2(Ap,&e,&c,&Ap); c = AFICR(c); As = COMP2(c,e,As); } As = INV(As); IPSRP(2,As,&d,&Ap); Step2: /* Check for A having only rational coefficients. */ Ap = PPERMV(2,Ap,LIST2(2,1)); if (PDEG(Ap) == 0) { C = PLDCF(Ap); goto Step4; } Step3: /* Compute resultant of A and M. */ Mp = PINV(1,M,1); C = IPRES(2,Ap,Mp); Step4: /* Factor resultant. */ IPFAC(1,C,&s,&c,&Lp); L = NIL; do { ADV(Lp,&L1,&Lp); L = COMP(SECOND(L1),L); } while (!(Lp == NIL)); L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/LFS.c0000664002275300236100000000121214017255270013323 0ustar wcbrownscs/*====================================================================== L <- LFS(s) List from String. Inputs s : a character string. Outputs L : the list of the characters in s. ======================================================================*/ #include "saclib.h" #include Word LFS(s) const char *s; { Word L,i,l; const char *p; Step1: /* Make a list from the string s. */ L =NIL; l = strlen(s); p = s + l - 1; for (i=1; i<=l; i++) { L = COMP(*p,L); p--; } Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IQR.c0000664002275300236100000001017114017255270013336 0ustar wcbrownscs/*=========================================================================== IQR(A,B; Q,R) Integer quotient and remainder. Inputs A, B : in Z, B /= 0. Outputs Q : the quotient, integral part of A/B. R : the remainder A - B * Q. ===========================================================================*/ #include "saclib.h" #include #define IQR_SIZE 100 void IQR(A,B, Q_,R_) Word A,B, *Q_,*R_; { Word *Ah,Ap[IQR_SIZE],*Bh,Bp[IQR_SIZE],Q,Qp[IQR_SIZE],*Qh,R; Word a,ap,a0,a1,a2,b,bp,b0,b1,c,c0,c1,c2, h,hp,i,j,k,m,N,n,s,s1,s2,o,q; Step1: /* B single-precision. */ if (B < BETA) { IDQR(A,B,&Q,&R); goto Return; } Step2: /* A single-precision. */ if (A < BETA) { Q = 0; R = A; goto Return; } Step3: /* Copy |A| and |B| into arrays; determine lengths and signs. */ IFLTA(A,Ap,IQR_SIZE,&Ah,&m,&s1,&o); IFLTA(B,Bp,IQR_SIZE,&Bh,&n,&s2,&o); Step4: /* m <= n. */ if ( (m < n) || (m == n && Ah[m-1] < Bh[n-1]) ) { Q = 0; R = A; goto Return; } Step5: /* Normalize. */ b = Bh[n-1]; hp = PDLOG2(b); h = ZETA - hp; ap = 0; if (h > 0) { for (i = 0; i < m; i++) { a = Ah[i]; Ah[i] = ((a << h) & BETA1) | ap; ap = a >> hp; } bp = 0; for (i = 0; i < n; i++) { b = Bh[i]; Bh[i] = ((b << h) & BETA1) | bp; bp = b >> hp; } } Step6: /* Obtain leading digits of divisor. */ b1 = Bh[n-1]; b0 = Bh[n-2]; Step7: /* Get array for quotient. */ if (m - n + 1 <= IQR_SIZE) Qh = Qp; else Qh = GETARRAY(m-n+1); Step8: /* Initialize loop. */ j = m; k = m - n; Step9: /* Obtain high-order digits of dividend. */ if (j == m) a2 = ap; else a2 = Ah[j]; a1 = Ah[j-1]; a0 = Ah[j-2]; Step10: /* Compute quotient digit approximation q. */ if (a2 == b1) { q = BETA - 1; a1 = a1 + a2; a2 = 0; if (a1 >= BETA) { a1 = a1 - BETA; a2 = 1; } } else { PNDQR(a2,a1,b1,&q,&a1); a2 = 0; } DPR(b0,q,&c1,&c0); a0 = a0 - c0; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; } a1 = a1 - c1; if ( a1 < 0) { a1 = a1 + BETA; a2 = a2 - 1; } if (a2 < 0) { q = q - 1; a0 = a0 + b0; if (a0 >= BETA) { a0 = a0 - BETA; a1 = a1 + 1; } a1 = a1 + b1; if (a1 >= BETA) { a1 = a1 - BETA; a2 = a2 + 1; } } Step11: /* Subtract q times the remaining digits of the divisor. */ c = 0; for (i = 0; i <= n - 3; i++) { DPR(Bh[i],q,&c2,&c1); a = Ah[j - n + i]; a = a - c; if (a < 0) { a = a + BETA; c2 = c2 + 1; } a = a - c1; if (a < 0) { a = a + BETA; c2 = c2 + 1; } c = c2; Ah[j - n + i] = a; } a0 = a0 - c; if (a0 < 0) { a0 = a0 + BETA; a1 = a1 - 1; if (a1 < 0) { a1 = a1 + BETA; a2 = a2 - 1; } } Ah[j - 2] = a0; Ah[j - 1] = a1; if (j < m) Ah[j] = a2; Step12: /* If the remainder is negative, decrease q by 1 and add the divisor to the remainder. */ if (a2 < 0) { q = q - 1; c = 0; for (i = 0; i <= n - 1; i++) { a = Ah[j - n + i] + Bh[i] + c; if (a >= BETA) { a = a - BETA; c = 1; } else c = 0; Ah[j - n + i] = a; } if (j < m) Ah[j] = 0; } Step13: /* Store q and return for next quotient digit, if any. */ Qh[k] = q; if (j > n) { j = j - 1; k = k - 1; goto Step9; } Step14: /* De-normalize quotient and remainder. */ if (s2 > 0) s = s1; else s = -s1; Q = IFATL(Qh,m-n+1,s); if (h > 0) { ap = 0; N = (01 << h) - 1; for (i = n - 1; i >= 0; i--) { a = Ah[i]; Ah[i] = (a >> h) | ap; ap = (a & N) << hp; } } R = IFATL(Ah,n,s1); Step15: /* Free dynamic arrays. */ if (m > IQR_SIZE) FREEARRAY(Ah); if (n > IQR_SIZE) FREEARRAY(Bh); if (m - n + 1 > IQR_SIZE) FREEARRAY(Qh); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/LBIBS.c0000664002275300236100000000222014017255270013532 0ustar wcbrownscs/*====================================================================== LBIBS(L) List of BETA-integers bubble sort. Inputs L : an arbitrary list of BETA-integers, with possible repetitions. Side effects L is sorted into non-decreasing order by the bubble-sort method. The list L, though not its location, is modified. ======================================================================*/ #include "saclib.h" void LBIBS(L) Word L; { Word Lp,Lpp,M,Mp,ap,app; /* hide algorithm */ Step1: /* Trivial case. */ if (L == NIL) goto Return; Step2: /* General case. */ M = NIL; do { Lp = L; Lpp = RED(Lp); ap = FIRST(Lp); Mp = NIL; while (Lpp != M) { app = FIRST(Lpp); if (ap > app) { SFIRST(Lp,app); SFIRST(Lpp,ap); Mp = Lpp; } else ap = app; Lp = Lpp; Lpp = RED(Lp); } M = Mp; } while (!(M == NIL)); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPEQ.c0000664002275300236100000000361614017255270013447 0ustar wcbrownscs/*=========================================================================== C <- IPEQ(r,A,B) Integral polynomial exact quotient. Inputs r : a beta-digit, r >= 0, the number of variables. A,B : in Z[x_1,...,x_r], B a non-zero divisor of A. Output C : in Z[x_1,...,x_r], C = A / B. ===========================================================================*/ #include "saclib.h" Word IPEQ(r,A,B) Word r,A,B; { Word a,Ah,Ap,b,bh,bp,Bb,Bp,Bh,c,C,e,f,g,h,m,n,rp; Step1: /* A = 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { C = IEQ(A,B); goto Return; } Step3: /* Set m = deg(A), n = deg(B). */ m = PDEG(A); n = PDEG(B); Step4: /* Set b = ldcf(B), B_ = red(B), r' = r - 1. */ b = PLDCF(B); Bb = PRED(B); rp = r - 1; Step5: /* Set A^ to A(x) with terms of degree less than n deleted. */ Ap = A; Ah = NIL; while (Ap != NIL && PDEG(Ap) >= n) { ADV2(Ap,&e,&a,&Ap); Ah = COMP2(a,e,Ah); } Ah = INV(Ah); C = NIL; Step6: /* Compute next term, c x^g, of C. */ PADV(Ah,&e,&a,&Ah); if (rp == 0) c = IEQ(a,b); else c = IPEQ(rp,a,b); g = e - n; C = COMP2(c,g,C); Step7: /* B_ = 0? */ if (Bb == 0) if (Ah == 0) goto Step10; else goto Step6; Step8: /* Compute B^ = c x^g B_ minus terms of degree less than n. */ Bp = Bb; Bh = NIL; h = n - g; while (Bp != NIL && FIRST(Bp) >= h) { ADV2(Bp,&f,&bp,&Bp); bh = IPPROD(rp,bp,c); Bh = COMP2(bh,f + g,Bh); } Bh = INV(Bh); if (Bh == NIL) Bh = 0; Step9: /* Set A^ = A^ - B^ and, if A^ /= 0, go back to Step5. */ Ah = IPDIF(r,Ah,Bh); if (Ah != 0) goto Step6; Step10: /* Invert list for C */ C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AGITR.c0000664002275300236100000000135214017255270013552 0ustar wcbrownscs/*======================================================================= AGITR(A,n,k,B) Array Gaussian integer truncate and round. Inputs A : a nonzero array Gaussian integer. n, k : nonnegative BETA digits, with 0 <= k < ZETA. B : an array for a Gaussian integer. Let m = L(A). The sizes of B[0] and B[1] must be at least min(3,m - n + 3). Effect Let N = n * ZETA + k. {A / 2^N}, the nearest Gaussian integer to A / 2^N is placed in B. ========================================================================*/ #include "saclib.h" void AGITR(A,n,k,B) BDigit **A,n,k,**B; { Step1: /* Apply AITR. */ AITR(A[0],n,k,B[0]); AITR(A[1],n,k,B[1]); Return: /* Return. */ return; } saclib2.2.8/src/MIEXP.c0000664002275300236100000000207114017255270013565 0ustar wcbrownscs/*====================================================================== B <- MIEXP(M,A,N) Modular integer exponentiation. Inputs M : a positive integer. A : an element of Z_M. N : a non-negative integer. Outputs B : A^N in Z_M. ======================================================================*/ #include "saclib.h" Word MIEXP(M,A,N) Word M,A,N; { Word B,Np,t; /* hide t; */ Step1: /* Single precision. */ if (M < BETA && N < BETA) { B = MDEXP(M,A,N); goto Return; } Step2: /* N less than or equal to 1. */ if (N == 0) { B = 1; goto Return; } if (N == 1) { B = A; goto Return; } Step3: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step4: /* Recursion. */ IDQR(N,2,&Np,&t); B = MIEXP(M,A,Np); B = MIPROD(M,B,B); if (t == 1) B = MIPROD(M,B,A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MMDDET.c0000664002275300236100000000376414017255270013667 0ustar wcbrownscs/*====================================================================== d <- MMDDET(p,M) Matrix of modular digits determinant. Inputs p : a BETA-digit, prime. M : a square matrix over GF(p), represented as a list of rows. Outputs d : in GF(p), the determinant of M. ======================================================================*/ #include "saclib.h" Word MMDDET(p,M) Word p,M; { Word M1,M2,Mp1,R,R1,R2,Rp,Rs,S,S1,S2,Ss,a,ap,d,i,j; /* hide Mp1,R2,Rp,S1,S2,a,ap,d,i,j; */ Step1: /* Initialize. */ M1 = M; d = 1; Step2: /* Order 1 matrix. */ if (RED(M1) == NIL) { a = FIRST(FIRST(M1)); d = MDPROD(p,d,a); goto Return; } Step3: /* Find pivot row, if possible. */ Mp1 = M1; i = 0; do { i = i + 1; ADV(Mp1,&R,&Mp1); } while (FIRST(R) == 0 && Mp1 != NIL); Step4: /* No pivot row. */ if (FIRST(R) == 0) { d = 0; goto Return; } Step5: /* Transform pivot row. */ ADV(R,&a,&R); d = MDPROD(p,d,a); if (EVEN(i) == 1) d = MDNEG(p,d); ap = MDINV(p,a); Rs = NIL; do { ADV(R,&R1,&R); R1 = MDPROD(p,R1,ap); Rs = COMP(R1,Rs); } while (R != NIL); R = INV(Rs); Step6: /* Compute m2. */ M2 = NIL; j = 0; do { j = j + 1; ADV(M1,&S,&M1); if (j != i) { ADV(S,&S1,&S); Ss = NIL; Rp = R; do { ADV(Rp,&R2,&Rp); ADV(S,&S2,&S); S2 = MDDIF(p,S2,MDPROD(p,S1,R2)); Ss = COMP(S2,Ss); } while (Rp != NIL); M2 = COMP(Ss,M2); } } while (M1 != NIL); Step7: /* Prepare for next pivot step. */ M1 = M2; goto Step2; Return: /* Prepare for return. */ return(d); } saclib2.2.8/src/MMAPDEFL.c0000664002275300236100000000141514017255270014071 0ustar wcbrownscs/*=========================================================================== MMAPDEFL(m,A,c) Medium modulus array polynomial deflation. Inputs m : a medium BETA-digit. A : in Z/(m)[x] in array representation. c : in Z/(m) such that A(c) = 0. Side effects A / (x - c) is computed and put in A. ===========================================================================*/ #include "saclib.h" void MMAPDEFL(m,A,c) Word m,*A,c; { Word a,b,i,n; Step1: /* Initialize. */ n = MAPDEG(A) - 1; a = MAPCF(A,n); MAPCF(A,n) = MAPLDCF(A); MAPDEG(A) = n; Step2: /* Loop. */ for (i = n-1; i >= 0; i--) { b = a + c * MAPCF(A,i+1); a = MAPCF(A,i); MAPCF(A,i) = b % m; } Return: /* Prepare for return. */ return; } saclib2.2.8/src/RPPOWREAD.c0000664002275300236100000000247114017255270014252 0ustar wcbrownscs/*====================================================================== RPPOWREAD(r,V; A,t) Rational polynomial power read. Inputs r : a positive BETA-digit. V : a non-NIL list of r distinct variables. Outputs A : a rational polynomial with variables in V. t : 1 if successful, 0 otherwise. ======================================================================*/ #include "saclib.h" void RPPOWREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,e,i,t; /* hide C,i,t; */ Step1: /* Setup. */ t = 1; A = RNRED(1,1); A = PFBRE(r,A); Step2: /* Read in a factor. */ RPFACTREAD(r,V,&A1,&t); if (t == 0) goto Return; Step3: /* Read in an optional exponent. */ C = CREADB(); if (C != '^') { BKSP(); e = 1; } else { C = CREADB(); if (!DIGIT(C)) { SWRITE("Error RPPOWREAD: Digit was expected.\n"); goto Step5; } BKSP(); e = IREAD(); if (e >= BETA) { SWRITE("Error RPPOWREAD: Exponent is too big.\n"); goto Step5; } } Step4: /* Carry out the exponentiation. */ for (i = 1; i <= e; i++) A = RPPROD(r,A,A1); goto Return; Step5: /* Error exit. */ DIELOC(); t = 0; Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/IPPNPRS.c0000664002275300236100000000215614017255270014042 0ustar wcbrownscs/*=========================================================================== S <- IPPNPRS(A,B) Integral polynomial primitive negative polynomial remainder sequence. Inputs A,B : in Z[x], deg(A) > 0, deg(A) >= deg(B). Outputs L : a list (A_1,A_2,A_3,...,A_r), where A_i is an element of Z[x] and A_1 = A and A_2 = B. L is the primitive Sturm sequence of A and B. ===========================================================================*/ #include "saclib.h" Word IPPNPRS(A,B) Word A,B; { Word L,A1,A2,A3,n1,n2,n3; Step1: /* Initialize. */ A1 = A; A2 = B; n1 = PDEG(A1); n2 = PDEG(A2); L = LIST2(A2,A1); Step2: /* Compute pseudo-remainder. */ A3 = IPPSR(1,A1,A2); if (A3 == 0) { L = INV(L); goto Return; } Step3: /* Make primitive and negative and update. */ A3 = IPIPP(1,A3); n3 = PDEG(A3); if (IPSIGN(1,A2) > 0 || EVEN(n1 - n2 + 1)) A3 = IPNEG(1,A3); L = COMP(A3,L); A1 = A2; n1 = n2; A2 = A3; n2 = n3; goto Step2; Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/FSUM.c0000664002275300236100000000364414017255270013464 0ustar wcbrownscs/*====================================================================== FSUM(A,B,d,C) Floating-point sum. Inputs A, B : floating-point numbers. d : a sign (rounding direction). C : an array large enough for the sum. Output C : a floating-point number approximating the sum of A and B, rounded according to IEEE standards. If A and B are both non-zero, the precision of C is the maximum of the precisions of A and B. If A = 0, C = B and C has the same precision as B; if B = 0, C = A and C has the same precision as A. ======================================================================*/ #include "saclib.h" void FSUM(A,B,d,C) Word *A,*B; BDigit d; Word *C; { Word *Ap,*Bp,*D; BDigit i,p,q; Step1: /* A or B zero. */ if (A[1] == 0) { FCOPY(B,C); goto Return; } if (B[1] == 0) { FCOPY(A,C); goto Return; } Step2: /* Make precisions equal. */ Ap = A; Bp = B; p = A[2]; q = B[2]; if (p != q) { if (p < q) { D = GETARRAY(q+3); Ap = D; Ap[0] = A[0]; Ap[1] = A[1]; Ap[2] = q; for (i=3; i<=q-p+2; i++) Ap[i] = 0; for (i=q-p+3; i<=q+2; i++) Ap[i] = A[i-(q-p)]; } else { D = GETARRAY(p+3); Bp = D; Bp[0] = B[0]; Bp[1] = B[1]; Bp[2] = p; for (i=3; i<=p-q+2; i++) Bp[i] = 0; for (i=p-q+3; i<=p+2; i++) Bp[i] = B[i-(p-q)]; } } Step3: /* Branch according to case. */ if (Ap[0] == Bp[0]) { if (Ap[1] == Bp[1]) FSUMSESS(Ap,Bp,d,C); else FSUMSEOS(Ap,Bp,d,C); } else { if (Ap[1] == Bp[1]) FSUMDESS(Ap,Bp,d,C); else if (Ap[0] - Bp[0] == 1) FSUMDEOS1(Ap,Bp,d,C); else if (Bp[0] - Ap[0] == 1) FSUMDEOS1(Bp,Ap,d,C); else if (Ap[0] - Bp[0] > 0) FSUMDEOS2(Ap,Bp,d,C); else FSUMDEOS2(Bp,Ap,d,C); } Step4: /* Release array. */ if (p != q) FREEARRAY(D); Return: /* Return. */ return; } saclib2.2.8/src/MDCRA.c0000664002275300236100000000166214017255270013536 0ustar wcbrownscs/*=========================================================================== a <- MDCRA(m1,m2,mp1,a1,a2) Modular digit chinese remainder algorithm. Inputs m1,m2 : positive BETA-integers, with gcd(m1,m2)=1 and ml=m1*m2 less than BETA. mp1 : the inverse of m1 in Z/(m2). a1,a2 : elements of Z/(m1) and Z/(m2) respectively. Outpus a : the unique element of z(ml) such that a is congruent to a1 modulo m1 and a is congruent to a2 modulo m2. ===========================================================================*/ #include "saclib.h" Word MDCRA(m1,m2,mp1,a1,a2) Word m1,m2,mp1,a1,a2; { Word a,ab,b,d; Step1: /* a = a1. */ ab = REM(a1,m2); d = MDDIF(m2,a2,ab); if (d == 0) { a = a1; goto Return; } Step2: /* General case. */ b = REM(d * mp1,m2); a = m1 * b + a1; Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/LREAD.c0000664002275300236100000000236414017255270013537 0ustar wcbrownscs/*====================================================================== L <- LREAD() List read. Outputs L : a list. Side effects The list L is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word LREAD() { Word C,L,L1; /* hide C; */ Step1: /* Read list elements. */ L = NIL; C = CREADB(); if (C != '(') goto Step2; do { C = CREADB(); if (C == ')') { L = INV(L); goto Return; } else if (C == '(') { BKSP(); L1 = LREAD(); } else if (C == '+' || C == '-' || DIGIT(C) == 1) { BKSP(); L1 = AREAD(); } else goto Step2; L = COMP(L1,L); C = CREADB(); if (C == ')') BKSP(); else if (C != ',') goto Step2; } while (1); Step2: /* Error. */ FAIL("LREAD","Unexpected character",C); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/DIRPWRITE.c0000664002275300236100000000312614017255270014256 0ustar wcbrownscs/*=========================================================================== DIRPWRITE(r,A,V) Distributive rational polynomial write. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Q[X1,...,Xr], distributive representation. A is written in the output stream. V : a variable list for A. ===========================================================================*/ #include "saclib.h" void DIRPWRITE(r,A,V) Word r,A,V; { Word Ap,E,Ep,Vp,a,e,s,v,p1,n1; char fc,z; Step1: /* r = 0 or A = 0. */ if (r == 0 || A == 0) { RNWRITE(A); goto Return; } Step2: /* Initialize */ Ap = A; p1 = RNINT(1); n1 = RNINT(-1); fc = 1; CWRITE('('); Step3: /* General case. */ do { ADV2(Ap,&a,&E,&Ap); /* write coefficient */ s = RNSIGN(a); if (fc == 1) { fc = 0; if (!(EQUAL(a,p1) || EQUAL(a,n1))) { CWRITE(' '); RNWRITE(a); } else if (EQUAL(a,n1)) SWRITE(" -"); } else { CWRITE(' '); if (!(EQUAL(a,p1) || EQUAL(a,n1))) { if (s > 0) CWRITE('+'); RNWRITE(a); } else if (EQUAL(a,p1)) CWRITE('+'); else CWRITE('-'); } /* write monomial */ Ep = CINV(E); Vp = V; z = 0; do { ADV(Ep,&e,&Ep); ADV(Vp,&v,&Vp); if (e > 0) { z = 1; CWRITE(' '); CLOUT(v); } if (e > 1) { CWRITE('^'); AWRITE(e); } } while (Ep != NIL); if (z == 0 && (EQUAL(a,p1) || EQUAL(a,n1))) CWRITE('1'); } while (Ap != NIL); SWRITE(" )"); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPSUB.c0000664002275300236100000000232114017255270013563 0ustar wcbrownscs/*====================================================================== C <- IPSUB(r,A,i,B) Integral polynomial substitution. Inputs A : in Z[x_1,...,x_r]. r : a BETA-digit, r >= 1, the number of variables. i : a BETA-digit, 1 <= i <= r. B : in Z[x_1,...,x_{i-1}]. Outputs C : in Z[x_1,...x_{i-1},x_{i+1},...,x_r], C(x_1,...,x_{i-1},x_{i+1},...,x_r) = A(x_1,...,x_{i-1},B(x_1,...,x_{i-1}),x_{i+1},...,x_r), the result of substituting B(x_1,...,x_{i-1}) for x_i in A(x_1,...,x_r). ======================================================================*/ #include "saclib.h" Word IPSUB(r,A,i,B) Word r,A,i,B; { Word A1,Ap,C,C1,e1,rp; Step1: /* A = 0. */ if (A == 0) { C = 0; goto Return; } Step2: /* i = r. */ if (i == r) { C = IPSMV(r,A,B); goto Return; } Step3: /* i < r. */ rp = r - 1; Ap = A; C = NIL; do { ADV2(Ap,&e1,&A1,&Ap); C1 = IPSUB(rp,A1,i,B); if (C1 != 0) C = COMP2(C1,e1,C); } while (!(Ap == NIL)); C = INV(C); if (C == NIL) C = 0; Return: /* Return C. */ return(C); } saclib2.2.8/src/LIST10.c0000664002275300236100000000122714017255270013621 0ustar wcbrownscs/*====================================================================== L <- LIST10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) List, 10 elements. Iputs a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 : objects. Outputs L : the list (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10). ======================================================================*/ #include "saclib.h" Word LIST10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) Word a1,a2,a3,a4,a5,a6,a7,a8,a9,a10; { Word L; Step1: /* Compute. */ L = COMP(a1,COMP(a2,COMP(a3,COMP(a4,COMP(a5,COMP(a6,COMP(a7,COMP(a8,COMP(a9,COMP(a10,NIL)))))))))); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/SDR.c0000664002275300236100000000561314017255270013340 0ustar wcbrownscs/*====================================================================== SDR(S; A,I) System of distinct representatives. Inputs S : a list (S_1,...,S_n), n >= 1, where each S_i is a set represented as an ordered list of beta digits. Outputs A,I : either A is a list (a_1,...,a_n) of distinct representatives for (S_1,...,S_n) and I = (), or else A = () and I = (i_1,...,i_k) is a subsequence of (1,...,n) such that (S_{i_1},...,S_{i_k}) has no system of distinct representatives. Algorithm See "Combinatorial Theory" by Marshall Hall, Jr, Blaisdell Pub. Co, 1967, pages 44-49. Analysis Let m be the maximum number of elements in any of the S_i. Then the computing time is dominated by m n^2. ======================================================================*/ #include "saclib.h" void SDR(S, A_,I_) Word S, *A_,*I_; { BDigit a,b,i,j,k,r; Word A,As,B,I,S1,S2,Sp,T,T1,T2,Tp1,Ts1; Step1: /* Initialize the main loop. */ A = NIL; As = NIL; Sp = S; r = 0; Step2: /* Direct extension, S_i contains an element not already chosen as a representative. */ ADV(Sp,&S1,&Sp); B = SDIFF(S1,As); if (B != NIL) { a = FIRST(B); A = COMP(a,A); As = LINSRT(a,As); goto Step8; } Step3: /* Initialize indirect extension. */ T1 = S1; Ts1 = T1; T = NIL; Step4: /* Test for nonextensibility. */ if (T1 == NIL) goto Step9; Step5: /* Compute the next set T_i. */ T2 = NIL; Tp1 = T1; do { ADV(Tp1,&a,&Tp1); i = LSRCH(a,A); j = r - i + 1; S2 = LELTI(S,j); T2 = SUNION(T2,S2); } while (Tp1 != NIL); T2 = SDIFF(T2,Ts1); Ts1 = SUNION(Ts1,T2); T = COMP(T1,T); T1 = T2; Step6: /* Test whether T_i contains a possible representative. */ B = SDIFF(T2,As); if (B == NIL) goto Step4; Step7: /* Reassign representatives. */ b = FIRST(B); As = LINSRT(b,As); do { ADV(T,&T1,&T); do { ADV(T1,&a,&T1); i = LSRCH(a,A); j = r - i + 1; S1 = LELTI(S,j); k = LSRCH(b,S1); } while (k == 0); SLELTI(A,i,b); b = a; } while (T != NIL); A = COMP(b,A); Step8: /* Test for completion. */ r = r + 1; if (Sp != NIL) goto Step2; else { A = INV(A); I = NIL; goto Return; } Step9: /* Compute I. */ I = LIST1(r + 1); while (Ts1 != NIL) { ADV(Ts1,&a,&Ts1); i = LSRCH(a,A); j = r - i + 1; I = LINSRT(j,I); } A = NIL; Return: /* Return A and I. */ *A_ = A; *I_ = I; return; } saclib2.2.8/src/IPQ.c0000664002275300236100000000114014017255270013330 0ustar wcbrownscs/*=========================================================================== C <- IPQ(r,A,B) Integral polynomial quotient. Inputs r : a BETA-digit, r >= 0, the number of variables. A,B : in Z[x_1,...,x_r]. B is a non-zero divisor of A. Outputs C : in Z[x_1,...,x_r], C = A / B. ===========================================================================*/ #include "saclib.h" Word IPQ(r,A,B) Word r,A,B; { Word C; Step1: /* Compute. */ if (r == 0) C = IEQ(A,B); else C = IPEQ(r,A,B); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFFRN.c0000664002275300236100000000105414017255270013537 0ustar wcbrownscs/*====================================================================== a <- AFFRN(R) Algebraic number field element from rational number. Inputs R : in Q. Outputs a : in Q(alpha). a = R represented as an element of Q(alpha). ======================================================================*/ #include "saclib.h" Word AFFRN(R) Word R; { Word a; Step1: /* Convert. */ if (R == 0) a = 0; else a = LIST2(R,PMON(1,0)); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/IUPFT.c0000664002275300236100000000323514017255270013575 0ustar wcbrownscs/*=========================================================================== IUPFT(p,Q,Qp,q,A,B; Ab,Bb) Integral univariate polynomial factor test. Inputs p : an odd medium prime. Q : a positive power of p. Qp: the floor of the square root of Q/2. q : a BETA-digit, q = ILOG2(Qp). A : in Z[x], primitive, squarefree and PDEG(A) > 2. B : in Z/(Q)[x], monic and PDEG(B) > 2. Outputs Ab,Bb : in Z[x]. If there is a monic factor F of A in Q[x] which is congruent to B modulo Q then Bb is the positive, primitive integral polynomial similar to F and Ab = A / Bb; otherwise Ab = A and Bb = 0. ===========================================================================*/ #include "saclib.h" void IUPFT(p,Q,Qp,q,A,B,Ab_,Bb_) Word p,Q,Qp,q,A,B,*Ab_,*Bb_; { Word Ab,At,Bb,Bp,Bs,Mb,R,a,b,c,n,r,u; Step1: /* Convert B to a rational polynomial Bs if possible. */ Bb = 0; Ab = A; Bp = B; Bs = NIL; a = PLDCF(A); do { PADV(Bp,&n,&u,&Bp); r = RNFMRPP(Q,Qp,q,p,u); if (r == NIL) goto Return; b = RNDEN(r); if (IREM(a,b) != 0) goto Return; if (r != 0) Bs = COMP2(r,n,Bs); } while (Bp != 0); Bs = INV(Bs); Step2: /* Convert Bs to a primitive integral polynomial Bb. */ IPSRP(1,Bs,&c,&Bb); Step3: /* Check if Bb is guaranteed to be irreducible. */ Mb = IUPLB(Bb,2); if (ICOMP(Q,Mb) < 0) { Bb = 0; goto Return; } Step4: /* Is Bb a factor? */ IPQR(1,A,Bb,&At,&R); if (R != 0) { Bb = 0; goto Return; }; Ab = At; Return: /* Prepare for return. */ *Ab_ = Ab; *Bb_ = Bb; return; } saclib2.2.8/src/IUPIIR.c0000664002275300236100000000210714017255270013704 0ustar wcbrownscs/*====================================================================== Is <- IUPIIR(A,I) Integral univariate polynomial isolating interval refinement. Inputs A : a univariate squarefree polynomial. I : a binary rational isolating interval for a root of A. Outputs Is : a binary rational subinterval of I, obtained by a single application of RIB, containing the same root. ======================================================================*/ #include "saclib.h" Word IUPIIR(A,I) Word A,I; { Word Is; Word a,a1,a2,s,s2; Step1: /* Get the endpoints of I, a1 and a2, and the bisection point, a. */ FIRST2(I,&a1,&a2); a = RIB(a1,a2); Step2: /* If a2 is the zero then Is = (a,a_2). */ s2 = IUPBES(A,a2); if (s2 == 0) { Is = LIST2(a,a2); goto Return; } Step3: /* Otherwise, compare the signs of A at a and a2. */ s = IUPBES(A,a); if (s == s2) Is = LIST2(a1,a); else Is = LIST2(a,a2); Return: return(Is); } saclib2.2.8/src/SNLBRN.c0000664002275300236100000000213114017255270013676 0ustar wcbrownscs/*====================================================================== b <- SNLBRN(a,k) Small nearby logarithmic binary rational number. Inputs a : a logarithmic binary rational number. k : a beta digit. Output b : a logarithmic binary rational number. Let b' be the integral part of 2^k * b. Then b = b' / 2^k. If a >= 0, b is the largest multiple of 1 / 2^k that is less than or equal to a. If a < 0, b is the least multiple of 1 / 2^k that is greater then or equal to a. ======================================================================*/ #include "saclib.h" Word SNLBRN(a,k) Word a; BDigit k; { BDigit h; Word ap,b,bp; Step1: /* Compute b', the integral part of 2^k * a. */ if (a == 0) bp = 0; else { FIRST2(a,&ap,&h); if (h - k >= 0) bp = IDP2(ap,h - k); else bp = IMP2(ap,k - h); } Step2: /* Compute b = b' / 2^k. */ b = LBRNFIE(bp,- k); Return: /* Return b. */ return(b); } saclib2.2.8/src/MICINS.c0000664002275300236100000000207514017255270013671 0ustar wcbrownscs/*====================================================================== B <- MICINS(A,V) Matrix of integers column insertion. Inputs A : an m by n matrix over Z. A is represented as a list of columns. The elements of the first row are sorted in descending order. V : an m-vector over Z, v1 < a_{1,1}. Outputs B : an m by n+1 matrix over Z. B is obtained from A by inserting V after the i-th column of A, where i is the largest integer such that a_{1,i} >= v1. Remarks: A is modified. ======================================================================*/ #include "saclib.h" Word MICINS(A,V) Word A,V; { Word Ap,App,B,v; /* hide algorithm */ Step1: /* Initialize. */ Ap = A; App = RED(Ap); v = FIRST(V); Step2: /* Loop. */ while (App != NIL && ICOMP(FIRST(FIRST(App)),v) >= 0) { Ap = App; App = RED(App); } Step3: /* Finish. */ B = COMP(V,App); SRED(Ap,B); B = A; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/RSI.c0000664002275300236100000000152414017255270013342 0ustar wcbrownscs/*====================================================================== RSI(p,a,b,I) Ratio to software interval. Inputs p : a positive BETA-digit (precision). a : a nonzero integer. b : a positive integer. I : an array of size (at least) 2 p + 6. Effect Nearly the smallest software interval of precision p containing a / b is computed and stored in I. ======================================================================*/ #include "saclib.h" void RSI(p,a,b,I) BDigit p; Word a,b; BDigit *I; { BDigit *A,*B,q; Step1: /* Get arrays. */ q = 2 * p + 6; A = GETARRAY(q); B = GETARRAY(q); Step2: /* Convert a and B to intervals. */ ISI(a,p,A); ISI(b,p,B); Step3: /* Divide. */ SIQUOT(A,B,I); Step4: /* Free arrays. */ FREEARRAY(A); FREEARRAY(B); Return: /* Return. */ return; } saclib2.2.8/src/IPGTDRAN.c0000664002275300236100000000247414017255270014122 0ustar wcbrownscs/*==================================================================== A <- IPGTDRAN(r,k,q,n) Integral polynomial, guaranteed total degree, random. Inputs r : BETA-digit r >= 1. k : a positive BETA-digit. q : in Q, q = q1 / q2 with 0 < q1 <= q2 < BETA. n : a non-negative BETA-digit. Output A : an integral polynomial in r variables of total degree n. For 1 <= i <= r, the coefficient of x_i^n in A is nonzero. For all other terms of A, the coefficient is nonzero with probability q. Nonzero coefficients are random k-bit integers. =====================================================================*/ #include "saclib.h" Word IPGTDRAN(r,k,q,n) BDigit r,k,n; Word q; { BDigit i,j,m,q1,q2,qs,t; Word a,A,A1,E; Step1: /* Apply IPSTDRAN. */ A = IPSTDRAN(r,k,q,n); Step2: /* Include terms x_i^{n}. */ FIRST2(q,&q1,&q2); DQR(q1,0,q2,&qs,&t); for (i = 1; i <= r; i++) { m = PDEGSV(r,A,i); if (m < n) { do a = IRAND(k); while (a == 0); E = NIL; for (j = 1; j <= i - 1; j++) E = COMP(0,E); E = COMP(n,E); for (j = 1; j <= r - i; j++) E = COMP(0,E); A1 = LIST2(a,E); A1 = PFDIP(r,A1); A = IPSUM(r,A,A1); } } Return: /* Return A. */ return(A); } saclib2.2.8/src/CREADB.c0000664002275300236100000000122114017255270013617 0ustar wcbrownscs/*====================================================================== C <- CREADB() Character read. Outputs C : the next non-white-space character from the input stream. Remarks White space: space, newline, tab, formfeed, carriage return, and vertical tab. See ANSI C Appendix A: Page 191. ======================================================================*/ #include "saclib.h" #include Word CREADB() { Word C; /* hide C; */ Step1: /* Get the next non-white-space character. */ do C = CREAD(); while (isspace(C)); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/GETARRAY.c0000664002275300236100000000120114017255270014113 0ustar wcbrownscs/*========================================================================== A <- GETARRAY(n) Get array. Input n : a BETA-digit, n > 0. Output A : a pointer to an array of n Words. The array is not subject to garbage collection. ===========================================================================*/ #include #include "saclib.h" Word *GETARRAY(n) Word n; { Word *A; Step1: /* Allocate memory for array. */ A = (Word *)malloc((n)*sizeof(Word)); if (A==NULL) FAIL("GETARRAY","Out of memory."); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/GISUM.c0000664002275300236100000000153214017255270013570 0ustar wcbrownscs/*=========================================================================== C <- GISUM(A,B) Gaussian integer sum. Inputs A,B : Gaussian integers. Output C : A + B, a Gaussian integer. ===========================================================================*/ #include "saclib.h" Word GISUM(A,B) Word A,B; { Word A1,A2,B1,B2,C,C1,C2; Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* Add the parts. */ FIRST2(A,&A1,&A2); FIRST2(B,&B1,&B2); C1 = ISUM(A1,B1); C2 = ISUM(A2,B2); Step3: /* Compose the result. */ if (C1 == 0 && C2 == 0) C = 0; else C = LIST2(C1,C2); Return: /* Return C. */ return(C); } saclib2.2.8/src/USDIFF.c0000664002275300236100000000122014017255270013656 0ustar wcbrownscs/*=========================================================================== C <- USDIFF(A,B) Unordered set difference. Inputs A,B : unordered lists of objects. (A, B represent sets of objects.) Outputs C : an unordered list representing the difference of the sets A and B. ===========================================================================*/ #include "saclib.h" Word USDIFF(A,B) Word A,B; { Word Ap,C,a; Step1: /* Compute. */ Ap = A; C = NIL; while (Ap != NIL) { ADV(Ap,&a,&Ap); if (MEMBER(a,B) == 0) C = COMP(a,C); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPSRMS.c0000664002275300236100000000252614017255270013725 0ustar wcbrownscs/*====================================================================== L <- IPSRMS(A,I) Integral polynomial strong real root isolation, modified Uspensky method, standard interval. Inputs A : in Z[X], with no multiple real roots and with no real roots in common with A''. I : a standard interval. Outputs L : a list (I1,...,Ir) of isolating intervals for the roots of A in I. The intervals Ij contain no roots of A' or A'', are left-open and right-closed, have binary rational endpoints, are subintervals of I, and satisfy I1 < I2 < ... < Ir. ======================================================================*/ #include "saclib.h" Word IPSRMS(A,I) Word A,I; { Word Ap,App,Apps,Appsp,Aps,Apsp,L,Lp,Lpp; Step1: /* A=0. */ if (A == 0) { L = NIL; goto Return; } Step2: /* Isolate roots of A. */ Ap = IPDMV(1,A); L = IPRIMS(A,Ap,I); Step3: /* Remove roots of A'. */ Aps = IPPGSD(1,Ap); Apsp = IPDMV(1,Aps); Lp = IPRIMS(Aps,Apsp,I); IPRRLS(A,Aps,L,Lp,&L,&Lp); Step4: /* Remove roots of A''. */ App = IPDMV(1,Ap); Apps = IPPGSD(1,App); Appsp = IPDMV(1,Apps); Lpp = IPRIMS(Apps,Appsp,I); IPRRLS(A,Apps,L,Lpp,&L,&Lpp); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/ANHI.c0000664002275300236100000000317214017255270013425 0ustar wcbrownscs/*====================================================================== ANHI(I,a; J,t) Algebraic number to hardware interval. Inputs I : a hardware interval containing an algebraic number \alpha. a : a nonzero element of Q[\alpha]. a is represented by a list (r,A), where r is a rational number and A is a nonzero univariate integral polynomial A(x) of degree less than n such that r * A(\alpha) = a. Outputs J : If t = 1, J is a hardware interval containing a; otherwise t = 0, failure is due to exponent limitation, and the value of J is undefined. t : 0 or 1. ======================================================================*/ #include "saclib.h" void ANHI(I,a,J_,t_) interval I; Word a; interval *J_; BDigit *t_; { interval *B,J,K; BDigit i,m; Word A,Ap,b,c,d,e,r,t; Step1: /* Get an array B for a hardware interval polynomial. */ FIRST2(a,&r,&A); m = PDEG(A); B = GETHIPARRAY(m); Step2: /* Let r = c / d. */ FIRST2(r,&c,&d); Step3: /* Convert rational coefficients to intervals. */ Ap = A; for (i = m; i >= 0; i--) { if (Ap == NIL || FIRST(Ap) < i) IHI(0,&B[i],&t); else { Ap = RED(Ap); ADV(Ap,&e,&Ap); if (c == 1) b = e; else b = IPROD(c,e); RHI(b,d,&K,&t); if (t == 0) goto Step5; B[i] = K; } } Step4: /* Evaluate the hardware interval polynonmial at I. */ FPCATCH(); J = HIPIEVAL(m,B,I); if (FPCHECK() == 1) { t = 0; FPCATCH(); } Step5: /* Free array B. */ FREEARRAY(B); Return: /* Return J and t. */ *J_ = J; *t_ = t; return; } saclib2.2.8/src/IPRIMU.c0000664002275300236100000000345514017255270013717 0ustar wcbrownscs/*====================================================================== L <- IPRIMU(A) Integral polynomial real root isolation, modified Uspensky method, unit interval. Inputs A : in Z[X], squarefree. Outputs L : a list (I1,...,Ir) of isolating intervals for all the roots of A in the left closed right open interval (0,1). Each Ij is a pair (aj,bj) of binary rational numbers, with 0 <= a1 <= b1 <= ... <= ar <= br <= 1. If aj = bj then (aj,bj) represents the one-point interval. If aj < bj then (aj,bj) represents the open interval. ======================================================================*/ #include "saclib.h" Word IPRIMU(A) Word A; { Word B,B1,I,L,S,a,b,c,e,e1,t,v,v1; /* hide e,e1,v,v1; */ Step1: /* Initialize. */ L = NIL; S = NIL; B = A; a = 0; b = LIST2(1,1); e = PORD(A); v = IPVCHT(B); t = LIST2(1,2); Step2: /* One variation or less. */ if (v <= 1) { if (v == 1) { I = LIST2(a,b); L = COMP(I,L); } if (e > 0) { I = LIST2(a,a); L = COMP(I,L); } goto Step5; } Step3: /* Bisect. */ B1 = IUPBHT(B,-1); B = IUPTR1(B1); c = RNSUM(a,b); c = RNPROD(c,t); e1 = e; v1 = IPVCHT(B1); e = PORD(B); v = IPVCHT(B); Step4: /* STACK left half. */ if (e1 > 0 || v1 > 0) { S = COMP2(a,c,S); S = COMP3(v1,e1,B1,S); } a = c; goto Step2; Step5: /* Finished. */ if (S == NIL) goto Return; ADV3(S,&v,&e,&B,&S); ADV2(S,&a,&b,&S); goto Step2; Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/ISSUBSET.c0000664002275300236100000000161214017255270014144 0ustar wcbrownscs/*=========================================================================== t <- ISSUBSET(A,B) Is subset? Input A,B : ordered lists of BETA-digits. Output t : t = 1 if A is a subset of B, otherwise t = 0. ===========================================================================*/ #include "saclib.h" Word ISSUBSET(A,B) Word A,B; { Word A1,Ap,B1,Bp,t; Step1: /* Trivial Cases. */ if (A == NIL) { t = 1; goto Return; } if (B == NIL) { t = 0; goto Return; } Step2: /* General Case. */ Ap = A; Bp = B; while (Ap != NIL && Bp != NIL) { A1 = FIRST(Ap); B1 = FIRST(Bp); if (A1 < B1) { t = 0; goto Return; } else if (A1 == B1) { Ap = RED(Ap); Bp = RED(Bp); } else Bp = RED(Bp); } if (Ap == NIL) t = 1; else t = 0; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/MMDAHCP.c0000664002275300236100000000360514017255270013760 0ustar wcbrownscs/*=========================================================================== C <- MMDAHCP(p,A,n) Matrix of modular digits array representation Hessenberg form - characteristic polynomial. (A matrix is in Hessenberg form if its entries below the first diagonal are all zero.) Input p : a BETA-digit, prime. A : a square matrix in array representation over Z/(p) - Hessenberg form. n : a positive BETA-digit, the order of A. Output C : in Z/(p)[X], C = det(A-X*I), the characteristic polynomial of A. Remarks The submatrices (a_{i,j}) 0<=i,j<=k of A are again Hessenberg matrices; their determinants are computed by expansion along the last column. ===========================================================================*/ #include "saclib.h" Word MMDAHCP(p,A,n) BDigit p; Word **A; BDigit n; { BDigit b,bp,bs,f,j,k,s; Word B,Bp,C,c,D,F,L,Lp; Step1: /* Initialize. */ C = MPDIF(1,p,PMON(A[0][0],0),PMON(1,1)); if (n == 1) goto Return; L = LIST2(C,PMON(1,0)); B = NIL; Step2: /* Loop on order of square submatrix at the top left. */ k = 1; Step3: /* Products of lower diagonal elements.*/ bs = A[k][k-1]; Bp = NIL; while (B != NIL) { ADV(B,&b,&B); bp = MDPROD(p,bs,b); Bp = COMP(bp,Bp); } B = INV(Bp); B = COMP(bs,B); Step4: /* Characteristic polynomial of submatrix.*/ Lp = L; ADV(Lp,&C,&Lp); D = MPDIF(1,p,PMON(A[k][k],0),PMON(1,1)); C = MPPROD(1,p,D,C); Bp = B; s = -1; for (j = k-1; j >= 0; j--) { ADV(Lp,&c,&Lp); ADV(Bp,&b,&Bp); f = MDPROD(p,A[j][k],b); F = MPMDP(1,p,f,c); if (s < 0) C = MPDIF(1,p,C,F); else C = MPSUM(1,p,C,F); s = -s; } L = COMP(C,L); Step5: /* Loop back. */ if (k 1) { t = 1; goto Return; } if (n < -1) { t = 2; goto Return; } if (n == 1) { n = n1; k2 = k2 + ZETA; } else if (n == -1) { n = n2; k1 = k1 + ZETA; } n = n1; k = k2 - k1; if (k > 1) { t = 1; goto Return; } if (k < -1) { t = 2; goto Return; } k = MIN(k1,k2); if (k >= 10) k = k - 10; else { if (n > 0) { n = n - 1; k = ZETA + k - 10; } else k = 0; } a1 = AITRS(A[0],n,k); a2 = AITRS(A[1],n,k); b1 = AITRS(B[0],n,k); b2 = AITRS(B[1],n,k); a = a1 * a1 + a2 * a2; b = b1 * b1 + b2 * b2; if (a <= b) t = 1; else t = 2; Return: /* Return t. */ return(t); } saclib2.2.8/src/main.c0000664002275300236100000000141114017255270013624 0ustar wcbrownscs/*====================================================================== main(argc,argv) Default main routine. Inputs argc : the number of command line arguments. argv : the command line arguments. ======================================================================*/ #include "saclib.h" extern int sacMain P__((int ac, char **av)); void main(argc, argv) int argc; char **argv; { int ac,r; char **av; Step1: /* Process command line arguments. */ ARGSACLIB(argc,argv,&ac,&av); Step2: /* Initialize SACLIB. */ BEGINSACLIB((Word *)&argc); Step3: /* Start real main routine. */ r = sacMain(ac,av); Step4: /* Cleanup. */ ENDSACLIB(SAC_FREEMEM); Return: /* Exit. */ exit(r); } saclib2.2.8/src/MMPDDF.c0000664002275300236100000000453614017255270013662 0ustar wcbrownscs/*=========================================================================== L <- MMPDDF(p,A) Medium modulus polynomial distinct-degree factorization. Inputs p : a medium prime. A : in Z/(p)[X], deg(A) >= 2, monic and squarefree. A is in list representation. Outputs L : a list ((n_1,A_1),...,(n_k,A_k)), with n_i in Z, n_i > 0, n_1 < ... < n_k, and each A_i is in Z/(p)[x], in list representation, and is the product of all irreducible monic factors of A of degree n_i. ===========================================================================*/ #include "saclib.h" Word MMPDDF(p,Ap) Word p,Ap; { Word *A,**Q,n,*B,*Bp,*W,i,j,*C,*Cp,*D,L,Lp,L1,A1,b,d,e,k,w1; Step1: /* Initialize. */ A = MAPFMUP(Ap); Q = MMAPBM(p,A); n = MAPDEG(A)-1; B = MAPGET(n); Bp = GETARRAY(n+1); W = MAPGET(n); for (i = 0; i <= n; i++) MAPCF(B,i) = MATELT(Q,1,i); d = n; while (MAPCF(B,d) == 0) d--; MAPDEG(B) = d; C = MAPCOPY(A); L = NIL; k = 1; Step2: /* Compute A_k. */ do { MAPASSIGN(B,W); w1 = MDDIF(p,MAPCF(W,1),1); if (w1 == 0 && MAPDEG(W) == 1) MAPDEG(W) = 0; else MAPCF(W,1) = w1; D = MMAPGCD(p,W,C); if (MAPDEG(D) > 0) { L1 = COMP(k,PTRLIST1(D)); L = COMP(L1,L); Cp = MAPGET(MAPDEG(C)-MAPDEG(D)); MMAPQR(p,C,D,Cp); MAPFREE(C); C = Cp; } else MAPFREE(D); k++; e = MAPDEG(C); if (e >= 2 * k) { for (i = 0; i <= n; i++) { Bp[i] = MAPCF(B,i); MAPCF(B,i) = 0; } for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) { b = (MAPCF(B,i) + Bp[j] * MATELT(Q,j,i)) % p; MAPCF(B,i) = b; } d = n; while (MAPCF(B,d) == 0 && d > 0) d--; MAPDEG(B) = d; } else { if (e > 0) { L1 = COMP(e,PTRLIST1(C)); L = COMP(L1,L); } else MAPFREE(C); L = INV(L); goto Step3; } } while(1); Step3: /* Convert to lists. */ Lp = NIL; do { ADV(L,&L1,&L); ADV(L1,&e,&L1); PTRADV(L1,&C,&L1); A1 = MUPFMAP(C); MAPFREE(C); Lp = COMP(LIST2(e,A1),Lp); } while (L != NIL); L = INV(Lp); Step4: /* Free arrays. */ MAPFREE(A); MAPFREE(B); FREEARRAY(Bp); MAPFREE(W); FREEMATRIX(Q,n+1); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IPEMV.c0000664002275300236100000000227614017255270013572 0ustar wcbrownscs/*====================================================================== B <- IPEMV(r,A,a) Integral polynomial evaluation of main variable. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Z[x_1,...,x_r]. a : in Z. Outputs B : in Z[x_1,...,x_{r-1}], B(x_1,...,x_{r-1}) = A(x_1,...,x_{r-1},a). ======================================================================*/ #include "saclib.h" Word IPEMV(r,A,a) Word r,A,a; { Word A2,Ap,B,e1,e2,i,rp; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* Apply Horner's method. */ ADV2(A,&e1,&B,&Ap); rp = r - 1; while (Ap != NIL) { ADV2(Ap,&e2,&A2,&Ap); for (i = 1; i <= e1 - e2; i++) if (rp == 0) B = IPROD(a,B); else B = IPIP(rp,a,B); if (rp == 0) B = ISUM(B,A2); else B = IPSUM(rp,B,A2); e1 = e2; } for (i = 1; i <= e1; i++) if (rp == 0) B = IPROD(a,B); else B = IPIP(rp,a,B); Return: /* Return B. */ return(B); } saclib2.2.8/src/AMUPNT.c0000664002275300236100000000075114017255270013712 0ustar wcbrownscs/*====================================================================== B <- AMUPNT(A) Algebraic module univariate polynomial negative transformation. Inputs A : in Z[alpha,X]. Outputs B : in Z[alpha,X], B(X)=A(-X). ======================================================================*/ #include "saclib.h" Word AMUPNT(A) Word A; { Word B; Step1: /* Compute. */ B = IPNT(2,A,2); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AMUPIIWS.c0000664002275300236100000000576614017255270014157 0ustar wcbrownscs/*====================================================================== AMUPIIWS(M,I,A,L) Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. Inputs M : in Z[X], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Z[alpha,X], squarefree, deg(A) > 0. L : a list (I1,...,Ir) of open or one-point isolating intervals for real roots of A. Each Ij is a pair (aj,bj) of binary rational numbers, with a1 <= b1 <= ... <= ar <= br. Either a1 = b1 or A(a1) not zero. Side effects The input list L is modified such that L = (J1,...,Jr) is a list of strongly disjoint isolating intervals for real roots of A such that each Jk is a subinterval of Ik. If Ik is a standard interval then Jk is either a one-point or a standard interval. ======================================================================*/ #include "saclib.h" void AMUPIIWS(M,I,A,L) Word M,I,A,L; { Word I1,I2,Lp,a,a1,ap,b,b1,bp,c,r2,t,y1,y3; /* hide t,y1,y3; */ Step1: /* Make intervals strongly disjoint. */ Lp = L; r2 = RNINT(2); while (L != NIL && RED(Lp) != NIL) { I1 = FIRST(Lp); I2 = SECOND(Lp); FIRST2(I1,&a,&b); FIRST2(I2,&ap,&bp); if (RNCOMP(b,ap) == 0) { if (RNCOMP(a,b) < 0) { b1 = b; t = 0; do { c = RNQ(RNSUM(a,b),r2); y3 = AMUPBES(M,I,A,c); if (y3 == 0) { a = c; b1 = c; } else { if (t == 0) { y1 = AMUPBES(M,I,A,a); t = 1; } if (y1 * y3 < 0) b1 = c; else { a = c; y1 = y3; } } } while (!(RNCOMP(b1,b) < 0)); I1 = LIST2(a,b1); } else { a1 = ap; t = 0; do { c = RNQ(RNSUM(ap,bp),r2); y3 = AMUPBES(M,I,A,c); if (y3 == 0) { a1 = c; bp = c; } else { if (t == 0) { y1 = AMUPBES(M,I,AMPDMV(1,A),ap); t = 1; } if (y1 * y3 > 0) a1 = c; else bp = c; } } while (!(RNCOMP(ap,a1) < 0)); I2 = LIST2(a1,bp); } } SFIRST(Lp,I1); Lp = RED(Lp); SFIRST(Lp,I2); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/NORMMF.c0000664002275300236100000001302614017255270013703 0ustar wcbrownscs/*=========================================================================== NORMMF(M,A,N; p,F,C,L) Norm polynomial modular factorization. Inputs M : in Z[t], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[x]. The norm of A is squarefree, and deg(A) >= 2. N : in Z[x], the norm of A. Outputs p : in Z, the least examined prime in SPRIME for which N has the fewest modular factors, unless N is found to be irreducible, in which case p = 0. Only primes greater than or equal to MIN_PRIME (defined below) are examined. The number NP of primes that are examined is determined dynamically as follows. Unless N is found to be irreducible, between MIN_PRIMES and MAX_PRIMES primes are examined. (Both of these constants are defined below.) A minimum of MIN_PRIMES are examined, with more being examined until the computed factor degree set for A contains no more than deg(A)/2 elements, or until MAX_PRIMES have been examined. F : a list (N_1,...,N_r) of monic irreducible elements of Z/(p)[x] such that N = a N_1 ... N_r (mod p) where a = ldcf(N) (mod p). If p = 0, then F = (). C : a characteristic set, the intersection of the degree sets of factorizations of A (mod q) over Z/(q) for the NP primes q that were examined. L : a list of lists (p_i,(d_1,F_1),(d_2,F_2),...,(d_t,F_t)), i = 1, ..., NP-1. Let M = M_1 * ... * M_s (mod p_i) be a complete factorization of M (mod p_i) and let At(t,x) be the primitive and positive integral polynomial similar to A(t,x). Then d_i = deg(M_i) and F_i is the distinct- degree factorization of N_i(x) = res_t(M_i(t),At(t,x)) modulo p_i. That is, F_i is a list ((n_1,G_1),...,(n_r,G_r)), where G_j is the product of all the monic ireducible factors of N_i of degree n_j. The prime p is not among the p_i. ===========================================================================*/ #include "saclib.h" #define MIN_PRIME 3 /* smallest prime for factorization */ #define MIN_PRIMES 3 /* minimum number of primes for factorization */ #define MAX_PRIMES 10 /* maximum number of primes for factorization */ void NORMMF(M,A,N, p_,F_,C_,L_) Word M,A,N, *p_,*F_,*C_,*L_; { Word Ap,At,B,C,D,F,F1,F1p,Fp,G,G1,H,H1,I,J,K, L,Lp,M1,Mp,Ms,N1,Np,Npp,Ns,P,R, a,b,d,d1,e,f,f1,h1,i,j,k,k1,n,p,q; Step1: /* Initialize. */ p = 0; F = NIL; I = CSUN(IMP2(1,PDEG(A)),1); C = IDIF(IMP2(1,PDEG(A)+1),1); n = IMP2(1,PDEG(N)); L = NIL; i = 0; P = RED(SPRIME); while (P != NIL && FIRST(P) < MIN_PRIME) P = RED(P); J = PMON(1,0); At = AFPICR(1,A); IPSRP(2,At,&a,&At); At = PCPV(2,At,1,2); Step2: /* Get the next suitable prime. */ if (P == NIL) FAIL("NORMMF","Prime list exhausted"); ADV(P,&q,&P); /*if (MDHOM(q,PLDCF(M)) != 0 && MDHOM(q,PLDCF(N)) != 0) {*/ /* I'm replacing the above with the below. 3/14/97 */ if (MDHOM(q,PLDCF(M)) != 0 && MDHOM(q,PLDCF(N)) != 0 && IREM(FIRST(a),q) != 0) { Np = MPHOM(1,q,N); Npp = MUPDER(q,Np); if (!EQUAL(MMPGCD(q,Np,Npp),J)) goto Step2; } else goto Step2; Step3: /* Factor minimal polynomial mod q. */ Mp = MPHOM(1,q,M); Ms = MUPFAC(q,Mp); Step4: /* Compute modular norms. */ if (LENGTH(Ms) == 1) { d1 = PDEG(Mp); Np = MPMON(1,q,Np); Ns = LIST1(LIST2(d1,Np)); } else { Ap = MPHOM(2,q,At); Ns = NIL; while (Ms != NIL) { ADV(Ms,&M1,&Ms); M1 = PINV(1,M1,1); N1 = IPRES(2,M1,Ap); /* Is this more efficient mod q? */ N1 = MPHOM(1,q,N1); N1 = MPMON(1,q,N1); d1 = PDEG(M1); Ns = COMP(LIST2(d1,N1),Ns); } } Step5: /* Compute distinct-degree factorization. */ G = NIL; while (Ns != NIL) { ADV(Ns,&N1,&Ns); FIRST2(N1,&d1,&N1); G1 = MMPDDF(q,N1); G = COMP(LIST2(d1,G1),G); } Step6: /* Compute the factor degree set. */ H = G; k = PDEG(N) + 1; K = NIL; while (H != NIL) { ADV(H,&H1,&H); FIRST2(H1,&d1,&H1); R = NIL; while (H1 != NIL) { ADV(H1,&h1,&H1); FIRST2(h1,&f,&b); d = PDEG(b); e = d / f; f = f / d1; for (j = 1; j <= e; j++) R = COMP(f,R); } K = COMP(LENGTH(R),K); D = CSFPAR(R); C = CSINT(C,D); if (EQUAL(C,I)) { p = 0; F = NIL; L = NIL; goto Return; } } k = 1; while (K != NIL) { ADV(K,&k1,&K); k1 = IMP2(1,k1); k1 = IDIF(k1,2); k = IPROD(k,k1); } if (ICOMP(k,n) < 0) { p = q; F = G; n = k; } L = COMP(LIST2(q,G),L); i++; Step7: /* Loop. */ if ((i < MIN_PRIMES) || (i < MAX_PRIMES && LENGTH(SFCS(C)) > PDEG(A)/2)) goto Step2; Step8: /* Remove F from the list L. */ Lp = NIL; while (L != NIL) { ADV(L,&G,&L); if (FIRST(G) != p) Lp = COMP(G,Lp); } L = Lp; Step9: /* Completely factor mod p. */ Fp = NIL; while (F != NIL) { ADV(F,&F1,&F); FIRST2(F1,&d1,&F1); F1p = NIL; while (F1 != NIL) { ADV(F1,&f1,&F1); FIRST2(f1,&f,&b); d = PDEG(b); if (d > f) { /* split equal degree factors */ B = MMPFBL(p,b,f); F1p = CONC(B,F1p); } else F1p = COMP(b,F1p); } Fp = COMP(LIST2(d1,F1p),Fp); } F = Fp; Return: /* Prepare for return. */ *p_ = p; *F_ = F; *C_ = C; *L_ = L; return; } saclib2.2.8/src/ARGSACLIB.c0000664002275300236100000000463414017255270014201 0ustar wcbrownscs/*====================================================================== ARGSACLIB(argc,argv; ac,av) Process the command line arguments. Inputs argc : the number of command line arguments. argv : the command line arguments. Outputs ac : the number of remaining command line arguments (i.e. argc minus the number of SACLIB command line arguments). av : the non-SACLIB command line arguments. Side effects Various saclib global variables are initialized according to the command line arguments. ======================================================================*/ #include "saclib.h" void ARGSACLIB(argc,argv,ac_,av_) int argc; char **argv; int *ac_; char ***av_; { Word gcm,nsprime,nmprime,nlprime,nu,nup,rho,nptr1; int ac,i; char **av; Step1: /* Store the default values of certain global variables. */ nu = NU; nup = NUp; gcm = GCM; rho = RHO; nsprime = NSPRIME; nmprime = NMPRIME; nlprime = NLPRIME; nptr1 = NPTR1; Step2: /* Initialize return values. */ ac = 1; av = (char **)malloc(argc*sizeof(char *)); av[0] = argv[0]; Step3: /* Parse command line arguments. */ for (i=1; i < argc; i++) if (argv[i][0] == '+') { switch(argv[i][1]) { case 'N': if (argv[i][2] == 'p') nup = atoi(argv[i]+3); else nu = atoi(argv[i]+2); break; case 'G': gcm = atoi(argv[i]+2); break; case 'R': rho = atoi(argv[i]+2); break; case 'S': nsprime = atoi(argv[i]+2); break; case 'M': nmprime = atoi(argv[i]+2); break; case 'L': nlprime = atoi(argv[i]+2); break; case 'T': nptr1 = atoi(argv[i]+2); break; case 'h': INFOSACLIB(argv[0]); exit(0); default : INFOSACLIB(argv[0]); exit(0); } } else { av[ac] = argv[i]; ac++; } Step4: /* Set the global variables to their new values. */ NU = nu; NUp = nup; GCM = gcm; RHO = rho; NSPRIME = nsprime; NMPRIME = nmprime; NLPRIME = nlprime; NPTR1 = nptr1; if (NU > 1073741822 || NU < 20000) { FAIL("ARGSACLIB","+N option used with number outside range [20000,1073741822]!"); } Return: /* Prepare for return. */ *ac_ = ac; *av_ = av; return; } saclib2.2.8/src/SLIWE.c0000664002275300236100000000235214017255270013570 0ustar wcbrownscs/*================================================================== SLIWE(I; k,c,d) Standard logarithmic interval width and endpoints. Input I : an open standard logarithmic interval. Outputs k : the negative of the logarithm of the width of I, a BETA-integer. c, d : the integers such that I = (c / 2^k,d / 2^k). =================================================================*/ #include "saclib.h" void SLIWE(I, k_,c_,d_) Word I,*k_,*c_,*d_; { Word c,c1,c2,d,k,k1,k2,u1,u2; Step1: /* Decompose I. */ FIRST2(I,&u1,&u2); if (u1 != 0) FIRST2(u1,&c1,&k1); if (u2 != 0) FIRST2(u2,&c2,&k2); Step2: /* One endpoint zero. */ if (u1 == 0) { k = k2; d = c2; c = 0; goto Return; } if (u2 == 0) { k = k1; c = c1; d = 0; goto Return; } Step3: /* Neither endpoint zero. */ if (k1 < k2) { k = k2; d = c2; c = IDIF(d,1); } else { k = k1; c = c1; d = ISUM(c,1); } Return: /* Return outputs. */ *k_ = k; *c_ = c; *d_ = d; return; } saclib2.2.8/src/MPFFEXP.c0000664002275300236100000000164714017255270014020 0ustar wcbrownscs/*======================================================================= B <- MPFFEXP(p,F,A,e) Medium prime finite field exponentiation. Inputs p : a medium prime. F : an irreducible monic polynomial over Z_p in array representation of degree n defining a finite field GF(p^n). A : a nonzero element of GF(p^n) in array representation. e : a positive beta-integer. Output B : B = A^e, an element of GF(p^n) in array representation. =======================================================================*/ #include "saclib.h" BDigit *MPFFEXP(p,F,A,e) BDigit p,*F,*A,e; { BDigit f,*B,*C; Step1: /* e = 1. */ if (e == 1) { B = MAPCOPY(A); goto Return; } Step2: /* Recursion. */ f = e >> 1; B = MPFFEXP(p,F,A,f); C = MPFFPROD(p,F,B,B); MAPFREE(B); B = C; if (ODD(e)) { C = MPFFPROD(p,F,B,A); MAPFREE(B); B = C; } Return: /* Return B. */ return(B); } saclib2.2.8/src/MUPGCD.c0000664002275300236100000000204614017255270013664 0ustar wcbrownscs/*=========================================================================== C <- MUPGCD(p,A,B) Modular univariate polynomial greatest common divisor. Inputs p : a prime beta digit. A, B : modular univariate polynomials over Z_p. Output C : the monic greatest common divisor of A and B. ===========================================================================*/ #include "saclib.h" Word MUPGCD(p,A,B) BDigit p; Word A,B; { BDigit *Ap,*Bp,*Cp; Word C; Step1: /* A = 0 or B = 0. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* deg(A) = 0 or deg(B) = 0. */ if (PDEG(A) == 0 || PDEG(B) == 0) { C = LIST2(0,1); goto Return; } Step3: /* Convert inputs to array representation. */ Ap = MAPFMUP(A); Bp = MAPFMUP(B); Step4: /* Apply MAPGCD. */ Cp = MAPGCD(p,Ap,Bp); Step5: /* Convert result to list representation. */ C = MUPFMAP(Cp); Step6: /* Free arrays. */ MAPFREE(Ap); MAPFREE(Bp); MAPFREE(Cp); Return: /* Return C. */ return(C); } saclib2.2.8/src/IPOWER.c0000664002275300236100000000214414017255270013711 0ustar wcbrownscs/*====================================================================== IPOWER(A,L; B,n) Integer power. Inputs A : in Z, greater than or equal to 3, odd positive. L : a list (pl_1,pl_2,...,pl_kl) of the first kl prime numbers, with pl_kl greater than or equal to the base 3 logarithm of A. Outputs B,n : If A=B^ml for some ml >= 2 then n is the least such ml and B=A^(1/n). Otherwise B = 0 and n = 0. ======================================================================*/ #include "saclib.h" void IPOWER(A,L, B_,n_) Word A,L, *B_,*n_; { Word B,Lp,N,n,t; /* hide Lp,N,n,t; */ Step1: /* Compute bound on n. */ N = ILOG2(A); N = (7 * N) / 11; Step2: /* Apply iroot. */ Lp = L; while (Lp != NIL) { ADV(Lp,&n,&Lp); if (n > N) goto Step3; IROOT(A,n,&B,&t); if (t == 0) goto Return; } Step3: /* Non-power. */ B = 0; n = 0; Return: /* Prepare for return. */ *B_ = B; *n_ = n; return; } saclib2.2.8/src/OWRITE.c0000664002275300236100000000100114017255270013704 0ustar wcbrownscs/*====================================================================== OWRITE(B) Object write. Inputs B : an object. Side effects The input object B is written in the output stream. ======================================================================*/ #include "saclib.h" void OWRITE(B) Word B; { /* hide algorithm */ Step1: /* Write. */ if (B < BETA) AWRITE(B); else LWRITE(B); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IUPSQHLL.c0000664002275300236100000000366114017255270014152 0ustar wcbrownscs/*=========================================================================== IUPSQHLL(p,q,A,C; Ap,Bp,Sp,Tp) Integral univariate polynomial single-precision quadratic Hensel lifting, list. Inputs p : a medium prime. q : a single-precision power of p. A : a list (A_1,...,A_r), with r >= 2, of monic, squarefree, elements of Z/(p)[x] that are pairwise relatively prime. C : in Z[x], with C congruent to c * A_1 * ... * A_r, where p does not divide ldcf(C) and c = H_p(ldcf(C)). Outputs Ap: a list (Ap_1,...,Ap_r) of monic elements of Z(q)[x] such that A_i = H_p(Ap_i) and C congruent to cp * Ap_1 * ... * Ap_r, where cp = H_q(ldcf(C)). Bp: a list (Bp_1,...Bp_{r-1}) of elements of Z/(q)[x] such that C is congruent to A_1 * ... * A_i * B_i. Sp: a list (Sp_1,...,Sp_{r-1}) of elements of Z/(q)[x]; Tp: a list (Tp_1,...,Tp_{r-1}) of elements of Z/(q)[x]; such that Ap_i*Sp_i + Bp_i*Tp_i = 1, and deg(Tp_i) < deg(Ap_i). ===========================================================================*/ #include "saclib.h" void IUPSQHLL(p,q,A,C,Ap_,Bp_,Sp_,Tp_) Word p,q,A,C,*Ap_,*Bp_,*Sp_,*Tp_; { Word Ab,Ap,As,Bb,Bp,Bs,Cb,Cp,L,R,Sb,Sp,Ss,Tb,Tp,Ts; Step1: /* Initialize. */ Ap = NIL; Bp = NIL; Sp = NIL; Tp = NIL; L = A; Cp = MPHOM(1,q,C); Step2: /* Lift factors. */ while (RED(L) != NIL) { ADV(L,&Ab,&L); Cb = MPHOM(1,p,Cp); Bb = MPQ(1,p,Cb,Ab); MMPEGC(p,Ab,Bb,&R,&Sb,&Tb); IUPSQHL(p,Ab,Bb,Sb,Tb,q,Cp,&As,&Bs,&Ss,&Ts); Ap = COMP(As,Ap); Bp = COMP(Bs,Bp); Sp = COMP(MPHOM(1,q,Ss),Sp); Tp = COMP(MPHOM(1,q,Ts),Tp); if (RED(L) != NIL) Cp = MPQ(1,q,Cp,As); } As = MPMON(1,q,Bs); Ap = COMP(As,Ap); Ap = INV(Ap); Bp = INV(Bp); Sp = INV(Sp); Tp = INV(Tp); Return: /* Prepare for return. */ *Ap_ = Ap; *Bp_ = Bp; *Sp_ = Sp; *Tp_ = Tp; return; } saclib2.2.8/src/SFIRST.c0000664002275300236100000000064614017255270013723 0ustar wcbrownscs/*====================================================================== SFIRST(L,a) Set first element. Inputs L : non empty list. a : object. Side effects The list L is modified by changing the first element to a. ======================================================================*/ #include "sactypes.h" extern Word *SPACEB1; void SFIRST(L,a) Word L,a; { SPACEB1[L] = a; } saclib2.2.8/src/DPRNN.c0000664002275300236100000000105714017255270013567 0ustar wcbrownscs/*============================================================================ DPRNN(A,B; c1,c0) Digit product. Inputs A, B : nonnegative BETA-digits. Outputs c1, c0 : the unique nonnegative BETA-digits such that a * b = c1 * BETA + c0. ============================================================================*/ #include "saclib.h" void DPRNN(A,B,c1_,c0_) Word A,B,*c1_, *c0_; { DWord C; C = A; C = C*B; *c0_ = (Word)(C & (BETA - 1)); *c1_ = (Word)(C >> ZETA); return; } saclib2.2.8/src/LBRINSUM.c0000664002275300236100000000115414017255270014137 0ustar wcbrownscs/*====================================================================== J <- LBRINSUM(I,c) Logarithmic binary rational interval number sum. Inputs I : a logarithmic binary rational interval. c : a logarithmic binary rational number. Output J : a logarithmic binary rational interval. J = I + c. ======================================================================*/ #include "saclib.h" Word LBRINSUM(I,c) Word I,c; { Word a,b,J; Step1: /* Add r to each endpoint. */ FIRST2(I,&a,&b); a = LBRNSUM(a,c); b = LBRNSUM(b,c); J = LIST2(a,b); Return: /* Return J. */ return(J); } saclib2.2.8/src/IPRRII.c0000664002275300236100000001310014017255270013674 0ustar wcbrownscs/*====================================================================== L <- IPRRII(A,Ap,d,Lp) Integral polynomial real root isolation induction. Inputs A : in Z[X], primitive, positive, deg(A) > 0. Ap : the derivative of A. d : a binary rational real root bound for A. Lp : an inflectionless isolation list for Ap. Outputs L : an inflectionless isolation list for A. ======================================================================*/ #include "saclib.h" Word IPRRII(A,Ap,d,Lp) Word A,Ap,d,Lp; { Word Abp,B,B1,B2,I,I1,Ip,Ipp,L,Ls,a1,a2,as1,b0,b1,bs1,c,dp,k, m,m1,n,r,r0,r1,s,s1,s2,sbp,sbp1,sp,ss1,t0,t1,tp0,tp1,ts1, u,u1,u2,up,up1,us1,v1,vp1,vs1,ws0,ws1,z,z1,z2; /* hide B1,B2,I1,Ls,a1,a2,b0,b1,k,m,m1,n,r,r0,r1,s,s1,s2,sbp, sbp1,sp,ss1,t0,t1,tp0,tp1,ts1,ws0,ws1; */ Step1: /* A' without roots. */ dp = RNNEG(d); if (Lp == NIL) { I = LIST2(dp,d); L = LIST2(I,1); goto Return; } Step2: /* Initialize. */ Abp = IPPGSD(1,Ap); IPGCDC(1,A,Abp,&B,&B1,&B2); n = PDEG(A); k = PDEG(B); Ls = Lp; if (EVEN(n)) t0 = 1; else t0 = -1; tp0 = -t0; b0 = dp; I1 = FIRST(Ls); a1 = FIRST(I1); u1 = IUPBRE(A,a1); s1 = RNSIGN(u1); L = NIL; if (t0 * s1 > 0) r0 = 0; else { r0 = 1; I = LIST2(b0,a1); L = COMP2(1,I,L); } if (EVEN(k)) ws0 = 1; else ws0 = -1; m = PDEG(Abp); if (EVEN(m)) sbp1 = 1; else sbp1 = -1; Step3: /* Root of A in (b_i,a_{i+1}). */ ADV2(Ls,&I1,&m1,&Ls); b1 = SECOND(I1); v1 = IUPBRE(A,b1); t1 = RNSIGN(v1); if (EVEN(m1)) tp1 = tp0; else tp1 = -tp0; ts1 = t1; if (t1 == 0) ts1 = tp1; if (Ls == NIL) a2 = d; else a2 = FIRST(FIRST(Ls)); if (RNCOMP(b1,a2) < 0) { u2 = IUPBRE(A,a2); s2 = RNSIGN(u2); if (ts1 * s2 <= 0) r1 = 1; else r1 = 0; } else { u2 = v1; s2 = t1; r1 = 0; } Step4: /* alpha_i a root of A. */ if (k == 0) ws1 = ws0; else { ws1 = IUPBES(B,b1); if (ws1 == 0) ws1 = -ws0; } if (ws0 * ws1 < 0) { L = COMP2(m1 + 1,I1,L); goto Step9; } Step5: /* Other roots of A in (a_i,b_i). */ r = r0 + r1; if (r == 2) goto Step9; if (s1 != 0) ss1 = s1; else ss1 = tp0; if (r == 1 || EVEN(m1)) { if (ss1 * t1 <= 0) goto Step6; else goto Step9; } if (t1 == 0) { if (ss1 * tp0 > 0) goto Step6; as1 = a1; bs1 = b1; goto Step8; } if (ss1 * t1 < 0) goto Step6; if (ss1 * tp0 > 0) goto Step9; else goto Step7; Step6: /* One root in (a_i,b_i). */ I = IPRRRI(A,Abp,I1,ss1,sbp1); L = COMP2(1,I,L); goto Step9; Step7: /* Zero or two roots of A in (a_i,b_i). */ as1 = a1; bs1 = b1; us1 = u1; vs1 = v1; up1 = IUPBRE(Ap,as1); vp1 = IUPBRE(Ap,bs1); if (vp1 == 0) goto Step9; do { z = RNQ(us1,up1); z1 = RNDIF(as1,z); z = RNQ(vs1,vp1); z2 = RNDIF(bs1,z); z = RNCOMP(z1,z2); if (z >= 0) goto Step9; c = RIB(as1,bs1); u = IUPBRE(A,c); s = RNSIGN(u); up = IUPBRE(Ap,c); sp = RNSIGN(up); if (ss1 * s > 0 && sp == 0) goto Step9; if (s == 0 && tp0 * sp < 0) { bs1 = c; goto Step8; } if (ss1 * s <= 0) { Ip = LIST2(as1,c); Ipp = LIST2(c,bs1); if (tp0 * sp <= 0) { I = IPRRRI(A,Abp,Ip,ss1,sbp1); L = COMP4(1,Ipp,1,I,L); } else { I = IPRRRI(A,Abp,Ipp,-ss1,sbp1); L = COMP4(1,I,1,Ip,L); } goto Step9; } if (tp0 * sp > 0) { as1 = c; us1 = u; up1 = up; } else { bs1 = c; vs1 = u; vp1 = up; } } while (1); Step8: /* Roots at b*_i and in (a*_i,b*_i) */ do { c = RIB(as1,bs1); s = IUPBES(A,c); if (ss1 * s <= 0) { sbp = IUPBES(Abp,c); Ip = LIST2(as1,c); Ipp = LIST2(c,bs1); if (sbp1 * sbp <= 0) { I = IPRRRI(A,Abp,Ip,ss1,sbp1); L = COMP4(1,Ipp,1,I,L); } else { I = IPRRRI(A,Abp,Ipp,-ss1,sbp1); L = COMP4(1,I,1,Ip,L); } goto Step9; } as1 = c; } while (1); Step9: /* Update. */ if (r1 == 1) { I = LIST2(b1,a2); L = COMP2(1,I,L); } a1 = a2; r0 = r1; tp0 = tp1; s1 = s2; ws0 = ws1; sbp1 = -sbp1; u1 = u2; if (Ls != NIL) goto Step3; Step10: /* Finish. */ L = INV(L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/PDE.c0000664002275300236100000000175014017255270013316 0ustar wcbrownscs/*=========================================================================== B <- PDE(r,A,i,k) Polynomial division of exponents. Inputs r : a positive beta digit. A : a nonzero polynomial in r variables over any domain such that every exponent of x^i in A is divisible by k. i : a beta digit, 1 <= i <= r. k : a positive beta digit. Output B : the polynomial obtained from A by dividing every exponent of x^i in A by k. ======================================================================*/ #include "saclib.h" Word PDE(r,A,i,k) BDigit i,k,r; Word A; { BDigit e; Word a,Ap,B; Step1: /* i = r. */ if (i == r) { Ap = A; B = NIL; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); B = COMP2(a,e/k,B); } B = INV(B); goto Return; } Step2: /* i < r. */ Ap = A; B = NIL; while (Ap!= NIL) { ADV2(Ap,&e,&a,&Ap); B = COMP2(PDE(r-1,a,i,k),e,B); } B = INV(B); Return: /* Return B. */ return(B); } saclib2.2.8/src/IPGCDC.c0000664002275300236100000000712314017255270013637 0ustar wcbrownscs/*=========================================================================== IPGCDC(r,A,B; C,Ab,Bb) Integral polynomial greatest common divisor and cofactors. Inputs r : a BETA-digit, r >= 0. A,B : in Z[x_1,...,x_r]. Outputs C : in Z[x_1,...,x_r], C = gcd(A,B). Ab,Bb : If C is non-zero then Ab = A/C and Bb = B/C. Otherwise Ab = 0 and Bb = 0. ======================================================================*/ #include "saclib.h" void IPGCDC(r,A,B, C_,Ab_,Bb_) Word r,A,B, *C_,*Ab_,*Bb_; { Word Ab,Ah,Ahs,Ap,As,Bb,Bh,Bhs,Bp,Bs,C,Chs,Cp,Cs,P,Q,U,Us, V,Vs,W,Ws,a,ab,ah,ap,b,bb,bh,bp,c,ch,chp,cp,cpp,cs,d, e,f,g,p,q,qp,t; Step1: /* A = B = 0. */ if (A == 0 && B == 0) { C = 0; Ab = 0; Bb = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { C = IGCD(A,B); Ab = IEQ(A,C); Bb = IEQ(B,C); goto Return; } Step3: /* A=0 or B=0. */ if (A == 0) { C = IPABS(r,B); Ab = 0; Bb = PINV(0,IPSIGN(r,B),r); goto Return; } if (B == 0) { C = IPABS(r,A); Bb = 0; Ab = PINV(0,IPSIGN(r,A),r); goto Return; } Step4: /* Compute integer contents and primitive parts. */ Ap = 0; Bp = 0; Cp = 0; Q = 0; IPICPP(r,A,&a,&Ah); IPICPP(r,B,&b,&Bh); c = IGCD(a,b); Step5: /* Compute normalization factor. */ ah = PLBCF(r,Ah); bh = PLBCF(r,Bh); ch = IGCD(ah,bh); Step6: /* Compute norms. */ d = IPMAXN(r,Ah); e = IPMAXN(r,Bh); f = IMAX(d,e); g = IPROD(IPROD(2,ch),f); Step7: /* Compute degree vectors. */ U = PDEGV(r,Ah); V = PDEGV(r,Bh); Step8: /* Initialize prime list and degree vector. */ P = LPRIME; W = COMP(FIRST(U) + 1,RED(U)); Step9: /* Obtain next prime. */ if (P == NIL) FAIL("IPGCDC","Prime list exhausted",r,A,B); ADV(P,&p,&P); Step10: /* Map normalization factor. */ cs = MDHOM(p,ch); if (cs == 0) goto Step9; Step11: /* Map Ah and Bh. */ As = MPHOM(r,p,Ah); Us = PDEGV(r,As); if (EQUAL(U,Us) == 0) goto Step9; Bs = MPHOM(r,p,Bh); Vs = PDEGV(r,Bs); if (EQUAL(V,Vs) == 0) goto Step9; Step12: /* Compute g.c.d. */ MPGCDC(r,p,As,Bs,&Cs,&Ahs,&Bhs); Step13: /* Test for constant g.c.d. */ if (IPONE(r,Cs) == 1) { C = PINV(0,c,r); Ab = IPIQ(r,A,c); Bb = IPIQ(r,B,c); goto Return; } Step14: /* Conditional initialization of chinese remainder process. */ Ws = PDEGV(r,Cs); t = VCOMP(W,Ws); if (t >= 2) { Q = 1; Ap = 0; Bp = 0; Cp = 0; W = VMIN(W,Ws); } Step15: /* Test for unlucky prime. */ if (t == 1 || t == 3) goto Step9; Step16: /* Apply chinese remainder algorithm. */ Chs = MPMDP(r,p,cs,Cs); qp = MDINV(p,MDHOM(p,Q)); Cp = IPCRA(Q,p,qp,r,Cp,Chs); Ap = IPCRA(Q,p,qp,r,Ap,Ahs); Bp = IPCRA(Q,p,qp,r,Bp,Bhs); Q = IPROD(Q,p); Step17: /* Test for completion. */ if (ICOMP(Q,g) <= 0) goto Step9; q = ILOG2(Q); cp = ILOG2(IPSUMN(r,Cp)); ap = ILOG2(IPMAXN(r,Ap)); bp = ILOG2(IPMAXN(r,Bp)); cpp = MAX(ap,bp); if (q < cp + cpp + 2) goto Step9; Step18: /* Remove normalization. */ IPICPP(r,Cp,&cp,&C); chp = IEQ(ch,cp); Ab = IPIQ(r,Ap,chp); Bb = IPIQ(r,Bp,chp); C = IPIP(r,c,C); ab = IEQ(a,c); Ab = IPIP(r,ab,Ab); bb = IEQ(b,c); Bb = IPIP(r,bb,Bb); Return: /* Prepare for return. */ *C_ = C; *Ab_ = Ab; *Bb_ = Bb; return; } saclib2.2.8/src/CREAD.c0000664002275300236100000000112314017255270013516 0ustar wcbrownscs/*====================================================================== C <- CREAD() Character read. Outputs C : the next character from the input stream. Side effects LASTCHAR : set to the character C, for backspacing. ======================================================================*/ #include "saclib.h" #include Word CREAD() { Word C; /* hide algorithm */ Step1: /* Get the next character. */ C = getchar(); Step2: /* Remember the character. */ LASTCHAR = C; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SIPEVAL.c0000664002275300236100000000157114017255270014012 0ustar wcbrownscs/*====================================================================== SIPEVAL(A,I,J) Software interval polynomial evaluation. Inputs A : a software interval polynomial. Let p be its precision. I : a software interval of precision p. J : an array of (at least) 2 * p + 6 words. Effect A software interval of precision p containing A(I) is placed in J. ======================================================================*/ #include "saclib.h" void SIPEVAL(A,I,J) BDigit *A,*I,*J; { BDigit i,*J1,*J2,n,p,q,s; Step1: /* Apply Horner's method. */ n = A[0]; p = A[3]; q = 2 * (p + 3); J1 = GETARRAY(q); J2 = GETARRAY(q); s = n * q + 1; SICOPY(A + s,J1); for (i = n - 1; i >= 0; i--) { s = s - q; SIPROD(J1,I,J2); SISUM(J2,A + s,J1); } SICOPY(J1,J); FREEARRAY(J1); FREEARRAY(J2); Return: /* Return. */ return; } saclib2.2.8/src/AFPDIF.c0000664002275300236100000000375314017255270013644 0ustar wcbrownscs/*====================================================================== C <- AFPDIF(r,A,B) Algebraic number field polynomial difference. Inputs r : a BETA-digit, r >= 0, the number of variables. A,B : in Q(alpha)[X1,...,Xr]. Outputs C : in Q(alpha)[X1,...,Xr], C = A-B. ======================================================================*/ #include "saclib.h" Word AFPDIF(r,A,B) Word r,A,B; { Word Ap,Bp,C,Cp,Cpp,a,b,c,e,f,rp; /* hide C,Cpp,a,b,f,rp; */ Step1: /* A or B zero. */ if (A == 0) { C = AFPNEG(r,B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r = 0. */ if (r == 0) { C = AFDIF(A,B); goto Return; } Step3: /* General case. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = AFNEG(b); else c = AFPNEG(rp,b); Cp = COMP2(c,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = AFDIF(a,b); else c = AFPDIF(rp,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step4: /* Finish. */ if (Ap == NIL && Bp == NIL) Cpp = NIL; else if (Ap == NIL) Cpp = AFPNEG(r,Bp); else Cpp = Ap; C = INV(Cp); if (C == NIL) C = Cpp; else SRED(Cp,Cpp); if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/GIMS.c0000664002275300236100000000224514017255270013445 0ustar wcbrownscs/*======================================================================= c <- GIMS(a,b) Gaussian integer minimal sum. Inputs a, b : nonzero Gaussian integers. Output c : c has minimal norm among all u a + v b such that u and v are units. =======================================================================*/ #include "saclib.h" Word GIMS(a,b) Word a,b; { Word ap,bp,bp1,bp2,c,cp,d,dp; BDigit h,k,s; Step1: /* Compute the first quadrant associates of a and b. */ SWRITE("Entering GIMS.\n"); SWRITE("a = "); GIWRITE(a); SWRITE("\n"); SWRITE("b = "); GIWRITE(b); SWRITE("\n"); ap = GIFQA(a); bp = GIFQA(b); Step2: /* Compute the half-quadrants of a and b. */ h = GIHQ(ap); k = GIHQ(bp); Step3: /* h = k? */ c = GIDIF(ap,bp); if (h == k) goto Return; Step4: /* h /= k. */ FIRST2(bp, &bp1,&bp2); if (h < k) bp = LIST2(bp2,INEG(bp1)); else bp = LIST2(INEG(bp2),bp1); d = GIDIF(ap,bp); cp = GINORM(c); dp = GINORM(d); s = ICOMP(cp,dp); if (s > 0) c = d; Return: /* Return c. */ SWRITE("c = "); GIWRITE(c); SWRITE("\n"); SWRITE("Leaving GIMS.\n"); return(c); } saclib2.2.8/src/IEGCD.c0000664002275300236100000000154714017255270013525 0ustar wcbrownscs/*=========================================================================== IEGCD(a,b; c,u1,v1) Integer extended greatest common divisor algorithm. Inputs a,b : in Z. Outputs c : gcd(a,b) u1,v1 : in Z such that a * u1 + b * v1 = c. If a /= 0 and b /= 0 then abs(u1) <= abs(b)/(2*c), abs(v1) <= abs(a)/(2*c). Otherwise u1 = sign(a), v1 = sign(b). ===========================================================================*/ #include "saclib.h" void IEGCD(a,b, c_,u1_,v1_) Word a,b, *c_,*u1_,*v1_; { Word c,u1,v1; Step1: /* Compute. */ IHEGCD(a,b,&c,&v1); if (a == 0) u1 = 0; else u1 = IEQ(IDIF(c,IPROD(b,v1)),a); Return: /* Prepare for return. */ *c_ = c; *u1_ = u1; *v1_ = v1; return; } saclib2.2.8/src/LEXNEXTC.c0000664002275300236100000000166314017255270014143 0ustar wcbrownscs/*=========================================================================== LEXNEXTC(n,k,I; t) Lexicographically next combination. Inputs n : a postiive BETA-digit. k : a positive BETA-digit, 1 <= k <= n. I : an array of k indices, i.e, 0 <= I[0] < I[1] < ... < I[k-1] < n. Output t : the last-changed index Side effects I is modified to contain the lexicographically next index set. If I[k-i] = n-i, for i = 1,...,k, then I[0] is set to -1. ===========================================================================*/ #include "saclib.h" void LEXNEXTC(n,k,I,t_) Word n,k,*I,*t_; { Word c,i,j,t; Step1: /* Get next index set. */ i = 1; while (i <= k && I[k-i] == n-i) i++; t = k - i; if (i > k) I[0] = -1; else { c = I[t] + 1; I[t] = c; for (j = k-i+1; j < k; j++) I[j] = ++c; } Return: /* Prepare for return. */ *t_ = t; return; } saclib2.2.8/src/PNM.c0000664002275300236100000000144314017255270013337 0ustar wcbrownscs/*======================================================================= n = PNM(r,A) Polynomial number of monomials. Inputs r : a positive beta digit. A : a polynomial in r variables over an arbitrary domain, in recursive representation. Output n : the number of monomials in A. =======================================================================*/ #include "saclib.h" BDigit PNM(r,A) BDigit r; Word A; { BDigit n,rp; Word a,Ap; Step1: /* A = 0. */ if (A == 0) { n = 0; goto Return; } Step2: /* r = 1. */ if (r == 1) { n = LENGTH(A) >> 1; goto Return; } Step3: /* r > 1. */ n = 0; Ap = A; rp = r - 1; while (Ap != NIL) { Ap = RED(Ap); ADV(Ap,&a,&Ap); n = n + PNM(rp,a); } Return: /* Return n. */ return(n); } saclib2.2.8/src/MPNEG.c0000664002275300236100000000165214017255270013555 0ustar wcbrownscs/*====================================================================== B <- MPNEG(r,m,A) Modular polynomial negative. Inputs A : in Z/(m)[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. m : a BETA-digit. Outputs B : in Z/(m)[X1,...,Xr], B = -A. ======================================================================*/ #include "saclib.h" Word MPNEG(r,m,A) Word r,m,A; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A non-zero. */ Ap = A; B = NIL; rp = r - 1; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = MDNEG(m,a); else b = MPNEG(rp,m,a); B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MDQ.c0000664002275300236100000000102314017255270013320 0ustar wcbrownscs/*====================================================================== c <- MDQ(m,a,b) Modular digit quotient. Inputs m : a positive BETA-integer. a,b : elements of Z_m. b is a unit. Outputs c : a/b. ======================================================================*/ #include "saclib.h" Word MDQ(m,a,b) Word m,a,b; { Word c; /* hide algorithm */ Step1: /* Compute. */ c = MDPROD(m,a,MDINV(m,b)); Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/SLBRNIM.c0000664002275300236100000000173114017255270014013 0ustar wcbrownscs/*====================================================================== c <- SLBRNIM(a,b) Small logarithmic binary rational near interval midpoint. Inputs a, b : logarithmic binary rational numbers, a < b. Output c : a logarithmic binary rational number. Let d = b - a and k = floor(log_2 d). Then c is one of the two integral multiples of 1 / 2^{k - 3} that are nearest to the midpoint of [a,b]. It follows that c - a and b - c are both >= 3/8 * d. ======================================================================*/ #include "saclib.h" Word SLBRNIM(a,b) Word a,b; { BDigit h,k; Word c,cp,d,dp; Step1: /* Compute k. */ d = LBRNDIF(b,a); FIRST2(d,&dp,&h); k = ILOG2(dp) - h - 1; Step2: /* Compute c', the midpoint. */ cp = LBRIMID(LIST2(a,b)); Step3: /* Compute c. */ c = SNLBRN(cp,- k + 3); Return: /* Return c. */ return(c); } saclib2.2.8/src/LDELETE.c0000664002275300236100000000141314017255270013760 0ustar wcbrownscs/*=========================================================================== Lp <- LDELETE(e,L) List delete element. Inputs e : an object. L : a list. Output Lp : a list. If e is in L then Lp is the list obtained by removing the first occurrence of e in L. Otherwise, Lp = L. ===========================================================================*/ #include "saclib.h" Word LDELETE(e,L) Word e,L; { Word Lp,Lt,L1; Step1: /* Initialize. */ Lt = L; Lp = NIL; Step2: /* Loop. */ while (Lt != NIL) { ADV(Lt,&L1,&Lt); if (EQUAL(L1,e)) { Lp = INV(Lp); Lp = CONC(Lp,Lt); goto Return; } else Lp = COMP(L1,Lp); } Lp = L; Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/ISPD.c0000664002275300236100000000205314017255270013442 0ustar wcbrownscs/*=========================================================================== ISPD(n; F,m) Integer small prime divisors. Inputs n : in Z. n > 0. Outputs F,m : F is a list of primes (q_1,q_2,...,q_h), h non-negative, q_1 <= q_2 <= ... <= q_h, such that n is equal to m times the product of the q_i and m is not divisible by any prime in SPRIME. Either m=1 or m > p^2 + 1, where p is the largest element in SPRIME. ===========================================================================*/ #include "saclib.h" void ISPD(n, F_,m_) Word n, *F_,*m_; { Word F,Lp,m,p,q,r; Step1: /* Compute. */ F = NIL; m = n; Lp = SPRIME; do { p = FIRST(Lp); if (m < BETA) QREM(m,p,&q,&r); else IDQR(m,p,&q,&r); if (r == 0) { F = COMP(p,F); m = q; } else Lp = RED(Lp); } while (q > p && Lp != NIL); if (q <= p && m != 1) { F = COMP(m,F); m = 1; } F = INV(F); Return: /* Prepare for return. */ *F_ = F; *m_ = m; return; } saclib2.2.8/src/MAPFV.c0000664002275300236100000000147614017255270013564 0ustar wcbrownscs/*=========================================================================== B <- MAPFV(n,A) Modular array polynomial from vector. Inputs n : a BETA digit. A : an array of size at least n containing the coefficients of a modular univariate polynomial, A', with the coefficient of x^i in A[i], deg(A') < n. Output B : an array containing the polynomial A'. ===========================================================================*/ #include "saclib.h" Word *MAPFV(n,A) Word n,*A; { Word i,d,*B; Step1: /* Determine the degree of A'. */ d = n-1; while (A[d] == 0) d--; Step2: /* Get array B and assign A' to it. */ B = MAPGET(d); MAPDEG(B) = d; for (i = 0; i <= d; i++) MAPCF(B,i) = A[i]; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/ISFPIR.c0000664002275300236100000000213614017255270013701 0ustar wcbrownscs/*====================================================================== J <- ISFPIR(A,I,k) Integral squarefree polynomial isolating interval refinement. Inputs A : a squarefree univariate integral polynomial. I : an isolating interval for a real root alpha of A. k : a BETA-digit, k >= 0. Outputs J : a subinterval of I isolating alpha with length less than 10^{-k}. ======================================================================*/ #include "saclib.h" Word ISFPIR(A,I,k) Word A,I,k; { Word J,q,r,sh,sp,t,u,v,w,x; /* hide sh,sp,t; */ Step1: /* Compute. */ r = IEXP(10,k); q = LIST2(1,r); FIRST2(I,&u,&v); sp = IUPBES(A,v); x = RNDIF(v,u); t = RNCOMP(x,q); while (t >= 0) { w = RIB(u,v); sh = IUPBES(A,w); if (sp == 0 || sh * sp < 0) u = w; else { v = w; sp = sh; } x = RNDIF(v,u); t = RNCOMP(x,q); } J = LIST2(u,v); Return: /* Prepare for return. */ return(J); } saclib2.2.8/src/MUPEGC.c0000664002275300236100000000170414017255270013665 0ustar wcbrownscs/*====================================================================== MUPEGC(p,A,B; C,U,V) Modular univariate polynomial extended greatest common divisor. Inputs p : a BETA-digit, prime. A,B : in Z/(p)[X]. Outputs C : in Z/(p)[X], C = gcd(A,B). U,V : in Z/(p)[X], AU+BV=C. If deg(A/C) > 0, then deg(V) < deg(A/C), else deg(V) = 0. If deg(B/C) > 0, then deg(U) < deg(B/C), else deg(U) = 0. If A = 0, U = 0. If B = 0, V = 0. ======================================================================*/ #include "saclib.h" void MUPEGC(p,A,B, C_,U_,V_) Word p,A,B, *C_,*U_,*V_; { Word C,D,U,V; Step1: /* Compute. */ MUPHEG(p,A,B,&C,&V); if (A == 0) U = 0; else { D = MPPROD(1,p,B,V); D = MPDIF(1,p,C,D); U = MPQ(1,p,D,A); } Return: /* Prepare for return. */ *C_ = C; *U_ = U; *V_ = V; return; } saclib2.2.8/src/IROOT.c0000664002275300236100000000254014017255270013600 0ustar wcbrownscs/*====================================================================== IROOT(A,n; B,t) Integer root. Inputs A : in Z. A > 0. n : BETA-integer. n >= 2. Outputs B : floor(A^(1/n)). t : sign(A-B^n). ======================================================================*/ #include "saclib.h" void IROOT(A,n, B_,t_) Word A,n, *B_,*t_; { Word Ap,B,Bp,C,D,E,F,R,h,k,np,r,s,t,u; /* hide h,k,np,r,s,t,u; */ Step1: /* Compute first approximation. */ k = ILOG2(A); np = n - 1; h = k / n; r = k - h * n; u = (4 * r) / n; if (h >= 2) B = IMP2(u + 5,h - 2); else B = 4; Step2: /* Iterate modified newton method. */ do { C = IEXP(B,np); IQR(A,C,&D,&R); s = ICOMP(B,D); if (s <= 0) goto Step3; else { E = IDPR(B,np); F = ISUM(E,D); B = IDQ(F,n); } } while (1); Step3: /* Test whether result is too small. */ if (s == 0) t = ISIGNF(R); else { Bp = ISUM(B,1); Ap = IEXP(Bp,n); t = ICOMP(A,Ap); if (t >= 0) B = Bp; else t = 1; } Return: /* Prepare for return. */ *B_ = B; *t_ = t; return; } saclib2.2.8/src/VREAD.c0000664002275300236100000000133314017255270013544 0ustar wcbrownscs/*====================================================================== v <- VREAD() Variable read. Outputs v : a variable, is read from the input stream. Any number of preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word VREAD() { Word C,v; /* hide C; */ Step1: /* Read. */ C = CREADB(); if (LETTER(C) == 0) FAIL("VREAD","Unexpected character",C); v = NIL; do { v = COMP(C,v); C = CREAD(); } while (LETTER(C) || DIGIT(C) || C == '_'); v = INV(v); BKSP(); Return: /* Prepare for return. */ return(v); } saclib2.2.8/src/ISEM.c0000664002275300236100000000536214017255270013446 0ustar wcbrownscs/*====================================================================== ISEM(A; s,e,m1,m0,t) Integer sign, exponent and mantissa. Inputs: A : an integer. Outputs: s, e, m1 and m0 are the sign, exponent, mantissa high-order part and mantissa low-order part, respectively, of what would be the IEEE double produced from A by IIEEET in the absence of an exponent overflow test. t is the exactness flag that would be produced by IIEEET. ======================================================================*/ #include "saclib.h" void ISEM(A, s_,e_,m1_,m0_,t_) Word A; BDigit *s_,*e_,*m1_,*m0_,*t_; { BDigit a,a0,a1,a2,ap,app,b,e,eb,k,kp,m0,m1,mt,n,r,s,t; Word Ap,App; Step1: /* A = 0. */ if (A == 0) { s = 0; eb = 0; m1 = 0; m0 = 0; t = 0; goto Return; } Step2: /* A single precision. */ if (A < BETA) { if (A < 0) { s = 1; A = -A; } else s = 0; e = PDLOG2(A); k = ZETA - e; a2 = (A << k); a2 = a2 - BETA/2; m1 = (a2 >> 8); mt = (a2 & 255); m0 = (mt << 24); t = 0; eb = e+BIAS-1; goto Return; } Step3: /* Approximate A by 0.[a2,a1,a0] * 2^e. */ Ap = RED(A); App = RED(Ap); if (App == NIL) { a0 = 0; a1 = FIRST(A); a2 = FIRST(Ap); e = 2 * ZETA; r = 0; } else if (RED(App) == NIL) { a0 = FIRST(A); a1 = FIRST(Ap); a2 = FIRST(App); e = 3 * ZETA; r = 0; } else { n = 3; r = 0; Ap = A; do { App = RED(App); n = n + 1; ADV(Ap,&a,&Ap); if (a != 0) r = 1; } while (RED(App) != NIL); a0 = FIRST(Ap); a1 = FIRST(RED(Ap)); a2 = FIRST(App); e = n * ZETA; } Step4: /* Normalize [a2,a1,a0]. */ if (a2 < 0) { s = 1; a2 = -a2; a1 = -a1; a0 = -a0; } else s = 0; kp = PDLOG2(a2); k = ZETA - kp; ap = a0 >> kp; a0 = (a0 << k) & BETA1; r = r | a0; app = a1 >> kp; a1 = ((a1 << k) & BETA1) | ap; a2 = (a2 << k) | app; e = e - k; Step5: /* Extract mantissa. */ a2 = a2 - BETA/2; m1 = (a2 >> 8); mt = (a2 & 255); m0 = (mt << 24) | (a1 >> 5); b = a1 & 31; Step6: /* Determine exactness flag. */ if (r == 0 && b == 0) t = 0; else t = 1; Step7: /* Convert exponent. */ eb = e+BIAS-1; Return: /* return. */ *s_ = s; *e_ = eb; *m1_ = m1; *m0_ = m0; *t_ = t; } saclib2.2.8/src/AMSIGN.c0000664002275300236100000000104514017255270013661 0ustar wcbrownscs/*====================================================================== s <- AMSIGN(M,I,b) Algebraic module sign. Inputs M : the minimal integral polynomial of a real algebraic number alpha. I : an acceptable isolating interval for alpha. b : an element of Z[alpha]. Outputs s : sign(b). ======================================================================*/ #include "saclib.h" Word AMSIGN(M,I,b) Word M,I,b; { Word s,Is; Step1: AMSIGNIR(M,I,b,&s,&Is); Return: return(s); } saclib2.2.8/src/IPCPP.c0000664002275300236100000000122014017255270013551 0ustar wcbrownscs/*====================================================================== IPCPP(r,A; C,Ab) Integral polynomial content and primitive part. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr]. Outputs C : in Z[X1,...,X_{r-1}], the content of A. Ab : in Z[X1,...,Xr], the primitive part of A. ======================================================================*/ #include "saclib.h" void IPCPP(r,A, C_,Ab_) Word r,A, *C_,*Ab_; { Word Ab,C,s; /* hide algorithm */ Step1: /* Compute. */ IPSCPP(r,A,&s,&C,&Ab); Return: /* Prepare for return. */ *C_ = C; *Ab_ = Ab; return; } saclib2.2.8/src/CWRITE.c0000664002275300236100000000072214017255270013701 0ustar wcbrownscs/*====================================================================== CWRITE(C) Character write. Inputs C : character. Side effects C is written to the output stream. ======================================================================*/ #include "saclib.h" #include void CWRITE(C) Word C; { /* hide algorithm */ Step1: /* Write. */ putchar(C); Return: /* Prepare for return. */ return; } saclib2.2.8/src/ORDER.c0000664002275300236100000000122114017255270013552 0ustar wcbrownscs/*====================================================================== n <- ORDER(a) Order. Inputs a : object. Outputs n : integer, the order (depth) of a. ======================================================================*/ #include "saclib.h" Word ORDER(a) Word a; { Word a1,ap,n; /* hide a1,n; */ Step1: /* a an atom. */ n = 0; if (a < BETA) goto Return; Step2: /* a a list. */ ap = a; while (ap != NIL) { ADV(ap,&a1,&ap); n = MAX(n,ORDER(a1)); } n = n + 1; Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/CLOUT.c0000664002275300236100000000112014017255270013563 0ustar wcbrownscs/*====================================================================== CLOUT(L) Character list out. Inputs L : a list of characters. Side effects The characters in L are written to the output stream. ======================================================================*/ #include "saclib.h" void CLOUT(L) Word L; { Word C,Lp; /* hide algorithm */ Step1: /* Write them out. */ Lp = L; while (Lp != NIL) { ADV(Lp,&C,&Lp); CWRITE(C); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/MPFFDPGT.c0000664002275300236100000000203414017255270014111 0ustar wcbrownscs/*===================================================================== MPFFDPGT(p,n; F,G,A) Medium prime finite field defining polynomial, generator and table. Inputs p : a prime, p^2 < beta. n : a beta-digit, n >= 2 and p^n < beta. Outputs F : a monic irreducible polynomial of degree n over Z_p having a minimal number of nonzero terms. G : a monic primitive element of Z_p/(F) of minimal degree. A : an array of q = p^n beta-integers. A[0] = 0 and for 0 < i < q, A[i] = G^i(p). G^i is evaluated at p in Z, not in Z_p. =======================================================================*/ #include "saclib.h" void MPFFDPGT(p,n,F_,G_,A) BDigit p,n; Word *F_,*G_; BDigit *A; { BDigit *Fp,*Gp; Word F,G; Step1: /* Compute a defining polynomial F. */ F = MPFFDP(p,n); Step2: /* Compute a generator. */ Fp = MAPFMUP(F); Gp = MPFFGEN(p,Fp); G = MUPFMAP(Gp); Step3: /* Generate the table. */ A = MPFFAP(p,Fp,Gp); Return: /* Return F, G and A. */ *F_ = F; *G_ = G; return; } saclib2.2.8/src/PMPMV.c0000664002275300236100000000154214017255270013604 0ustar wcbrownscs/*====================================================================== B <- PMPMV(A,k) Polynomial multiplication by power of main variable. Inputs A : in R[X1,...,Xr], R ring, r >= 0. k : a BETA-digit, k >= -order(A). Outputs B : in R[X1,...,Xr], B(X1,...,Xr) = A(X1,...,Xr) * Xr^k. ======================================================================*/ #include "saclib.h" Word PMPMV(A,k) Word A,k; { Word Ap,B,a,e; /* hide Ap,a,e; */ Step1: /* A = 0 or k = 0. */ if (A == 0 || k == 0) { B = A; goto Return; } Step2: /* General case. */ B = NIL; Ap = A; do { ADV2(Ap,&e,&a,&Ap); B = COMP2(a,e + k,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/INEGA.c0000664002275300236100000000102014017255270013517 0ustar wcbrownscs/*=========================================================================== INEGA(A,n) Integer negation, array version. Inputs A : in Z, in array representation. n : a BETA digit, the length of A. Side effect A is replaced by -A. ===========================================================================*/ #include "saclib.h" void INEGA(A,n) Word *A,n; { Word i; Step1: /* Negate each digit. */ for (i = 0; i < n; i++) A[i] = -A[i]; Return: /* Prepare for return. */ return; } saclib2.2.8/src/PCOEFF.c0000664002275300236100000000150514017255270013646 0ustar wcbrownscs/*=========================================================================== a <- PCOEFF(A,i) Polynomial coefficient. Inputs A : a polynomial in r variables, r >= 1; i : a non-negative BETA-digit. Output a : the coefficient of x^i in A, where x is the main variable. ===========================================================================*/ #include "saclib.h" Word PCOEFF(A,i) Word A,i; { Word Ap,e,a; Step1: /* A = 0. */ if (A == 0) { a = 0; goto Return; } Step2: /* Search. */ Ap = A; e = -1; do { e = PDEG(Ap); if (e <= i) goto Step3; else Ap = PRED(Ap); } while (Ap != 0); Step3: /* Pluck coefficient. */ if (e == i) a = SECOND(Ap); else a = 0; Return: /*Prepare for return. */ return(a); } saclib2.2.8/src/IPDER.c0000664002275300236100000000210414017255270013543 0ustar wcbrownscs/*====================================================================== B <- IPDER(r,A,i) Integral polynomial derivative. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Z[X1,...Xr]. i : in Z, 1 <= i <= r. Outputs B : in Z[X1,...Xr], the derivative of A with respect to the i-th variable. ======================================================================*/ #include "saclib.h" Word IPDER(r,A,i) Word r,A,i; { Word Ap,B,a,b,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* i=r. */ if (i == r) { B = IPDMV(r,A); goto Return; } Step3: /* i < r. */ Ap = A; rp = r - 1; B = NIL; do { ADV2(Ap,&e,&a,&Ap); b = IPDER(rp,a,i); if (b != 0) B = COMP2(b,e,B); } while (!(Ap == NIL)); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/GWRITE.c0000664002275300236100000000137414017255270013711 0ustar wcbrownscs/*====================================================================== GWRITE(a) C integer write. Inputs a : a C integer. Side effects a is written to the output stream. ======================================================================*/ #include "saclib.h" void GWRITE(a) Word a; { Word D[21],N,ap,q; Step1: /* Write minus sign. */ if (a < 0) { ap = -a; CWRITE('-'); } else ap = a; Step2: /* Convert to decimal. */ N = 0; do { q = ap / 10; N = N + 1; D[N] = ap - 10 * q; ap = q; } while (ap != 0); Step3: /* Write digits. */ do { CWRITE(D[N] + '0'); N = N - 1; } while (N != 0); Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPRRS.c0000664002275300236100000000520314017255270013602 0ustar wcbrownscs/*====================================================================== IPRRS(A1,A2,I1,I2; Is1,Is2,s) Integral polynomial real root separation. Inputs A1,A2 : in Z[X], squarefree, deg(A) > 0. I1,I2 : intervals with binary rational number endpoints, each of which is either left-open and right-closed, or a one-point interval. I1 contains a unique root alpha_1 of A1, and I2 contains a unique root alpha_2 /= alpha_1 of A2. Outputs Is1,Is2 : binary rational subintervals of I1 and I2 containing alpha_1 and alpha_2 respectively, with Is1 and Is2 strongly disjoint. If I1 is left-open and right-closed then so is Is1, and similarly for I2 and Is2. s : a BETA-digit, s = -1 if Is1 < Is2, and s = 1 if Is1 > Is2. ======================================================================*/ #include "saclib.h" void IPRRS(A1,A2,I1,I2, Is1_,Is2_,s_) Word A1,A2,I1,I2, *Is1_,*Is2_,*s_; { Word Is1,Is2,a1,a2,b1,b2,c,d1,d2,s,s1,s2,t,u,v; /* hide s,s1,s2,t,u,v; */ Step1: /* I1 and I2 disjoint. */ FIRST2(I1,&a1,&b1); FIRST2(I2,&a2,&b2); if (RNCOMP(b1,a2) < 0) { Is1 = I1; Is2 = I2; s = -1; goto Return; } if (RNCOMP(b2,a1) < 0) { Is1 = I1; Is2 = I2; s = 1; goto Return; } Step2: /* Initialize. */ d1 = RNDIF(b1,a1); d2 = RNDIF(b2,a2); s1 = 2; s2 = 2; Step3: /* Bisect I1. */ t = RNCOMP(d1,d2); if (t >= 0) { if (s1 > 1) s1 = IUPBES(A1,b1); c = RIB(a1,b1); u = IUPBES(A1,c); if (s1 == 0 || s1 * u < 0) { a1 = c; v = 1; } else { b1 = c; s1 = u; v = -1; } d1 = RNDIF(b1,a1); } Step4: /* Bisect I2. */ if (t < 0) { if (s2 > 1) s2 = IUPBES(A2,b2); c = RIB(a2,b2); u = IUPBES(A2,c); if (s2 == 0 || s2 * u < 0) { a2 = c; v = -1; } else { b2 = c; s2 = u; v = 1; } d2 = RNDIF(b2,a2); } Step5: /* I1 and I2 disjoint. */ if (v < 0 && RNCOMP(b1,a2) < 0) s = -1; else if (v > 0 && RNCOMP(b2,a1) < 0) s = 1; else goto Step3; Is1 = LIST2(a1,b1); Is2 = LIST2(a2,b2); Return: /* Prepare for return. */ *Is1_ = Is1; *Is2_ = Is2; *s_ = s; return; } saclib2.2.8/src/IMAX.c0000664002275300236100000000102214017255270013434 0ustar wcbrownscs/*====================================================================== c <- IMAX(a,b) Integer maximum. Inputs a,b : in Z. Outputs c : the maximum of a and b. ======================================================================*/ #include "saclib.h" Word IMAX(a,b) Word a,b; { Word c,s; /* hide algorithm */ Step1: /* Compute. */ s = ICOMP(a,b); if (s >= 0) c = a; else c = b; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/ILWRITE.c0000664002275300236100000000123214017255270014020 0ustar wcbrownscs/*====================================================================== ILWRITE(L) Integer list write. Inputs L : a list of integers. Side effects The list L is written in the output stream. ======================================================================*/ #include "saclib.h" void ILWRITE(L) Word L; { Word Lp,a; /* hide algorithm */ Step1: /* Write. */ Lp = L; CWRITE('('); while (Lp != NIL) { ADV(Lp,&a,&Lp); IWRITE(a); if (Lp != NIL) CWRITE(','); } CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/GREAD.c0000664002275300236100000000160614017255270013530 0ustar wcbrownscs/*====================================================================== a <- GREAD() C integer read. Outputs a : a C integer read from the input stream. Any preceding white spaces are skipped. ======================================================================*/ #include "saclib.h" Word GREAD() { Word C,S,a; Step1: /* Skip blanks and read sign, if any. */ S = 1; C = CREADB(); if (C == '+') C = CREADB(); else if (C == '-') { C = CREADB(); S = -1; } if (DIGIT(C) == 0) goto Step3; Step2: /* Read digits and convert. */ a = 0; do { a = 10 * a + C - '0'; C = CREAD(); } while (DIGIT(C) != 0); BKSP(); a = S * a; goto Return; Step3: /* Error. */ FAIL("GREAD","Unexpected character",C); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/IPSFSD.c0000664002275300236100000000237314017255270013700 0ustar wcbrownscs/*====================================================================== L <- IPSFSD(r,A) Integral squarefree factorization, second derivative. Inputs A : in Z[X1,...,Xr], positive, deg(A) > 0. r : a BETA-digit, r > 0. Outputs L : a list ((e1,A1),...,(ek,Ak)) where pp(A) = A1^e1*...*Ak^ek. The Ai are pairwise relatively prime squarefree positive polynomials with deg(Ai) > 0, deg(Ai) = 1 or gcd(Ai,A''i) = 1 for all i where A''i is the second derivative of Ai. The ei are positive BETA-digits, e1 <= e2 <= ... <= ek. ======================================================================*/ #include "saclib.h" Word IPSFSD(r,A) Word r,A; { Word A1,Ab,L,L1,Lb,P,e; /* hide e; */ Step1: /* Compute primitive part. */ Ab = IPPP(r,A); Step2: /* Squarefree factorization. */ Lb = IPSF(r,Ab); Step3: /* Apply IPFSD. */ L = NIL; Lb = INV(Lb); do { ADV(Lb,&P,&Lb); FIRST2(P,&e,&A1); L1 = IPFSD(r,A1); while (L1 != NIL) { ADV(L1,&A1,&L1); P = LIST2(e,A1); L = COMP(P,L); } } while (!(Lb == NIL)); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MIPDIF.c0000664002275300236100000000401514017255270013653 0ustar wcbrownscs/*====================================================================== C <- MIPDIF(r,M,A,B) Modular integral polynomial difference. Inputs M : in Z, M > 0. A, B : in Z/(M)[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs C : in Z/(M)[X1,...,Xr], C = A - B. ======================================================================*/ #include "saclib.h" Word MIPDIF(r,M,A,B) Word r,M,A,B; { Word Ap,Bp,C,Cp,Cpp,a,b,c,e,f,rp; /* hide C,Cpp,a,b,f,rp; */ Step1: /* A or B zero. */ if (A == 0) { C = MIPNEG(r,M,B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r=0. */ if (r == 0) { C = MIDIF(M,A,B); goto Return; } Step3: /* General case. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = MINEG(M,b); else c = MIPNEG(rp,M,b); Cp = COMP2(c,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = MIDIF(M,a,b); else c = MIPDIF(rp,M,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (!(Ap == NIL || Bp == NIL)); Step4: /* Finish. */ if (Ap == NIL && Bp == NIL) Cpp = NIL; else if (Ap == NIL) Cpp = MIPNEG(r,M,Bp); else Cpp = Ap; C = INV(Cp); if (C == NIL) C = Cpp; else SRED(Cp,Cpp); if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MMAPMDP.c0000664002275300236100000000150314017255270013775 0ustar wcbrownscs/*========================================================================== MMAPMDP(m,a,A,B) Medium modulus array polynomial modular digit product. Inputs m : a medium BETA-digit. a : in Z/(m). A : in Z/(m)[x], A is in array representation. B : a pointer to an array large enough to hold A. Side effects B is modified to contain a*A. ==========================================================================*/ #include "saclib.h" void MMAPMDP(m,a,A,B) Word m,a,*A,*B; { Word i,d; Step1: /* a = 0 or A = 0. */ if (a == 0 || MAPZERO(A)) { MAPDEG(B) = 0; MAPLDCF(B) = 0; goto Return; } Step2: /* General case. */ d = MAPDEG(A); MAPDEG(B) = d; for (i = 0; i <= d; i++) MAPCF(B,i) = (a * MAPCF(A,i)) % m; Return: /* Prepare for return. */ return; } saclib2.2.8/src/PTBCF.c0000664002275300236100000000143014017255270013537 0ustar wcbrownscs/*====================================================================== a <- PTBCF(r,A) Polynomial trailing base coefficient. Inputs A : in R[X1,...,Xr], R ring. r : a BETA-digit, r >= 0. Outputs a : in R, the trailing base coefficient of A. ======================================================================*/ #include "saclib.h" Word PTBCF(r,A) Word r,A; { Word As,a,b,e,rp; /* hide b,e,rp; */ Step1: /* r=0 or A=0. */ if (r == 0 || A == 0) { a = A; goto Return; } Step2: /* General case. */ rp = r - 1; As = CINV(A); ADV2(As,&b,&e,&As); if (e == 0) a = PTBCF(rp,b); else a = 0; Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/DPFP.c0000664002275300236100000000201214017255270013427 0ustar wcbrownscs/*====================================================================== B <- DPFP(r,A) Dense polynomial from polynomial. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Z[X1,...,Xr]. Outputs B : the result of converting A to dense polynomial representation. ======================================================================*/ #include "saclib.h" Word DPFP(r,A) Word r,A; { Word Ap,B,b,k,n,rp; /* hide k,n,rp; */ Step1: /* Convert. */ if (A == 0 || r == 0) { B = A; goto Return; } n = PDEG(A); rp = r - 1; B = NIL; Ap = A; for (k = n; k >= 0; k--) { if (Ap == NIL || FIRST(Ap) < k) b = 0; else { Ap = RED(Ap); ADV(Ap,&b,&Ap); if (rp > 0) b = DPFP(rp,b); } B = COMP(b,B); } B = COMP(n,INV(B)); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/ADV2.c0000664002275300236100000000123414017255270013377 0ustar wcbrownscs/*====================================================================== ADV2(L; a,b,Lp) Advance 2. Inputs L : a list of length 2 or more. Outputs a : the first element of L. b : the second element of L. Lp : the second reductum of L; Lp = RED(RED(L)). ======================================================================*/ #include "saclib.h" void ADV2(L, a_,b_,Lp_) Word L, *a_,*b_,*Lp_; { Word Lp,a,b; /* hide algorithm */ Step1: /* Advance twice. */ ADV(L,&a,&Lp); ADV(Lp,&b,&Lp); Return: /* Prepare for return. */ *a_ = a; *b_ = b; *Lp_ = Lp; return; } saclib2.2.8/src/RNCEIL.c0000664002275300236100000000125614017255270013663 0ustar wcbrownscs/*====================================================================== a <- RNCEIL(r) Rational number, ceiling of. Inputs r : a rational number. Outputs a : ceiling(r), an integer. ======================================================================*/ #include "saclib.h" Word RNCEIL(r) Word r; { Word a,b,r1,r2,s; /* hide b,r1,r2,s; */ Step1: /* r=0. */ if (r == 0) { a = 0; goto Return; } Step2: /* r /= 0. */ FIRST2(r,&r1,&r2); IQR(r1,r2,&a,&b); s = ISIGNF(b); if (s > 0) a = ISUM(a,s); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/LBRIDWRITE.c0000664002275300236100000000176014017255270014356 0ustar wcbrownscs/*====================================================================== LBRIDWRITE(I,n) Logarithmic binary rational interval decimal write. Inputs I : an open or one-point interval with logarithmic binary rational number endpoints. n : a non-negative integer. Side effects If I is an open interval, the endpoints of I are approximated by n decimal digit fractions and printed, using RNDDWRITE. The left endpoint is rounded down, the right endpoint up. If I is a one-point interval, its one point is printed using RNDWRITE, which rounds it to the nearest n-digit decimal fraction. ======================================================================*/ #include "saclib.h" void LBRIDWRITE(I,n) Word I,n; { Word a,b; Step1: /* Convert from logarithmic representation. */ FIRST2(I,&a,&b); I = LIST2(LBRNRN(a),LBRNRN(b)); Step2: /* Apply RIDWRITE. */ RIDWRITE(I,n); Return: /* Return. */ return; } saclib2.2.8/src/IPFLC.c0000664002275300236100000000472514017255270013550 0ustar wcbrownscs/*=========================================================================== Lp <- IPFLC(r,M,I,A,L,D) Integral polynomial factor list combine. Inputs r : a BETA-digit, r >= 1. M : in Z, M > 0. I : a list (d1,...,d_{r-1}), with di BETA-digits, di >= 0. A : in Z[x_1,...,x_r], A non-constant. L : a list (x_1^{d1},...,x_{r-1}^d_{r-1}) of monic factors of A modulo M, such that if b is an integral factor of A, then H_M,I(B) is an associate of some product of elements of L. D : a characteristic set for the possible degrees of integral factors of A, or 0. Outputs Lp : a list of the primitive irreducible integral factors of A. ===========================================================================*/ #include "saclib.h" Word IPFLC(r,M,I,A,L,D) Word r,M,I,A,L,D; { Word As,Bs,C,Cs,Lb,Lp,Ls,P,Rs,S,Ss,as,c,cb,cs,d,ds,i,k,p,rp,s,x; Step1: /* Initialize. */ d = 1; C = A; k = LENGTH(L); P = PERMR(k); Lb = LPERM(L,P); Lp = NIL; rp = r - 1; Step2: /* Prepare polynomial. */ c = PLDCF(C); cs = PTBCF(rp,c); c = PMON(c,0); Cs = IPPROD(r,c,C); cb = PTBCF(r,Cs); cs = MIHOM(M,cs); Step3: /* Done. */ if (d > k / 2) { Lp = COMP(C,Lp); goto Return; } Ls = Lb; S = NIL; for (i = 1; i <= d; i++) { S = COMP(Ls,S); Ls = RED(Ls); } Step4: /* See if s is A factor. */ Ss = S; as = cs; ds = 0; while (Ss != NIL) { ADV(Ss,&s,&Ss); p = FIRST(s); ds = ds + PDEG(p); as = MIPROD(M,as,PTBCF(r,p)); } as = SMFMI(M,as); if (as == 0 && cb != 0) goto Step5; if ((D == 0 || IODD(IDP2(D,ds)) == 1) && (cb == 0 || IREM(cb,as) == 0)) { Ss = S; As = c; while (Ss != NIL) { ADV(Ss,&s,&Ss); p = FIRST(s); As = MIPIPR(r,M,I,As,p); } As = SMFMIP(r,M,As); IPQR(r,Cs,As,&Bs,&Rs); if (Rs == 0) goto Step6; } Step5: /* Advance to next set. */ S = LEXNEX(S); if (S != NIL) goto Step4; d = d + 1; goto Step3; Step6: /* Remove a factor. */ As = IPPP(r,As); Lp = COMP(As,Lp); C = IPEQ(r,Bs,PMON(PLDCF(As),0)); k = k - d; do { ADV(S,&s,&S); if (s == Lb) Lb = RED(Lb); else { x = RED(s); Lb = INV(Lb); s = RED(s); Lb = INV(Lb); SRED(s,x); } } while (S != NIL); goto Step2; Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/MPUQ.c0000664002275300236100000000176214017255270013473 0ustar wcbrownscs/*====================================================================== C <- MPUQ(r,p,A,b) Modular polynomial univariate quotient. Inputs A : in Z/(p)[X1,...,Xr]. b : in Z/(p)[X1], non-zero divisor of A. r : a BETA-digit, r >= 2. p : a prime BETA-digit. Outputs C : in Z/(p)[X1,...,Xr], C(X1,...,Xr) = A(X1,...,Xr) / b(X1). ======================================================================*/ #include "saclib.h" Word MPUQ(r,p,A,b) Word r,p,A,b; { Word Ap,C,a,c,e,rp; /* hide a,rp; */ Step1: /* A=0. */ if (A == 0) { C = 0; goto Return; } Step2: /* A non-zero. */ Ap = A; rp = r - 1; C = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 1) c = MPQ(rp,p,a,b); else c = MPUQ(rp,p,a,b); C = COMP2(c,e,C); } while (!(Ap == NIL)); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/DQR.c0000664002275300236100000000124214017255270013330 0ustar wcbrownscs/*====================================================================== DQR(a1,a0,b; q,r) Digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 * a0 >= 0 and abs(b) > abs(a1). Outputs q : a BETA-integer, the integral part of (a1 * BETA + a0) / b. r : a BETA-integer, (a1 * BETA + a0) - b * q. ======================================================================*/ #include "saclib.h" void DQR(a1,a0,b,q_,r_) Word a1, a0, b, *q_, *r_; { DWord N,T; N = a1; T = b; N <<= ZETA; N += a0; T = N / b; *q_ = (Word)(T); T *= b; N -= T; *r_ = (Word)(N); return; } saclib2.2.8/src/SIPRRID.c0000664002275300236100000000323514017255270014022 0ustar wcbrownscs/*====================================================================== L <- SIPRRID(A) Software interval polynomial real root isolation, Descartes method. Input A : a software interval polynomial of degree n > 0. The coefficient of x^n does not contain 0. Output L : Either 0 or a list (I_1,...,I_r) of standard logarithmic open or one-point binary rational isolating intervals for all of the real roots of A. Let (a_j,b_j) denote the endpoints of I_j. Then a_1 <= b_1 <= ... <= a_r <= b_r. L = 0 in case it is not possible to isolate all real roots using p-precision interval arithmetic. ======================================================================*/ #include "saclib.h" Word SIPRRID(A) BDigit *A; { BDigit *Ap,k,s,S; Word a,b,B,I,L,L1; Step1: /* Isolate the positive roots. */ S = SIPSIZE(A); Ap = GETARRAY(S); SIPCOPY(A,Ap); k = SIPPRB(A); if (k == NIL) { L = NIL; goto Step2; } SIPBHT(Ap,k); B = LIST2(1,-k); L = SIPRRISD(Ap,0,B); if (L == 0) goto Step4; Step2: /* Is 0 a root? */ s = SISIGN(A + 1); if (s == NIL) { L = 0; goto Step4; } if (s == 0) { I = LIST2(0,0); L = COMP(I,L); } Step3: /* Isolate the negative roots. */ SIPNT(A,Ap); k = SIPPRB(Ap); if (k == NIL) goto Step4; SIPBHT(Ap,k); B = LIST2(1,-k); L1 = SIPRRISD(Ap,0,B); if (L1 == 0) { L = 0; goto Step4; } while (L1 != NIL) { ADV(L1,&I,&L1); FIRST2(I,&a,&b); I = LIST2(LBRNNEG(b),LBRNNEG(a)); L = COMP(I,L); } Step4: /* Free array. */ FREEARRAY(Ap); Return: /* Return. */ return(L); } saclib2.2.8/src/AGINORM.c0000664002275300236100000000165014017255270014001 0ustar wcbrownscs/*======================================================================= AGINORM(A,B,T1,T2) Array Gaussian integer norm. Inputs A : a Gaussian integer in array representation. B,T1,T2 : arrays for integers. Their sizes must be at least 2 n + 3, where n is the length of A. Effect The norm of A is placed in B. ========================================================================*/ #include "saclib.h" void AGINORM(A,B,T1,T2) BDigit **A,*B,*T1,*T2; { Step1: /* A = 0. */ if (AGIZERO(A)) { B[0] = 0; B[1] = 0; B[2] = 0; goto Return; } Step2: /* Real or imaginary part of A is zero. */ if (AIZERO(A[0])) { AIPROD(A[1],A[1],B); goto Return; } if (AIZERO(A[1])) { AIPROD(A[0],A[0],B); goto Return; } Step3: /* Otherwise. */ AIPROD(A[0],A[0],T1); AIPROD(A[1],A[1],T2); AISUM(T1,T2,B); Return: /* Return. */ return; } saclib2.2.8/src/PADV.c0000664002275300236100000000130514017255270013434 0ustar wcbrownscs/*=========================================================================== PADV(A; e,a,Ap) Polynomial advance. Input A : in R[x], where R is a ring. Outputs e : a BETA-digit, the degree of A. a : in R, the leading coefficient of A. Ap : in R[x], the reductum of A. ===========================================================================*/ #include "saclib.h" void PADV(A,e_,a_,Ap_) Word A,*e_,*a_,*Ap_; { Word e,a,Ap; Step1: /* Compute. */ if (A == 0) { e = 0; a = 0; Ap = 0; } else { ADV2(A,&e,&a,&Ap); if (Ap == NIL) Ap = 0; } Return: /* Prepare for return. */ *e_ = e; *a_ = a; *Ap_ = Ap; return; } saclib2.2.8/src/DOR.c0000664002275300236100000000147414017255270013335 0ustar wcbrownscs/*====================================================================== c <- DOR(a,b) Digit or. Inputs a,b : non-negative BETA-digits. Outputs c : the bit-wise or of a and b. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word DOR(a,b) Word a,b; { Word a1,ap,b1,bp,c,cp; /* hide a1,ap,b1,bp,c,cp; */ Step1: /* Compute. */ if (a == 0) c = b; else if (b == 0) c = a; else { QREM(a,2,&ap,&a1); QREM(b,2,&bp,&b1); cp = DOR(ap,bp); c = cp + cp; if (a1 > 0 || b1 > 0) c = c + 1; } Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MUPFMAP.c0000664002275300236100000000134014017255270014006 0ustar wcbrownscs/*=========================================================================== Ap <- MUPFMAP(A) Modular univariate polynomial from modular array polynomial. Input A : a modular polynomial in array representation. Output Ap: the same polynomial converted to list representation. ===========================================================================*/ #include "saclib.h" Word MUPFMAP(A) Word *A; { Word Ap,a,i,n; Step1: /* A = 0. */ if (MAPZERO(A)) { Ap = 0; goto Return; } Step2: /* A != 0. */ Ap = NIL; n = MAPDEG(A); for (i = 0; i <= n; i++) { a = MAPCF(A,i); if (a != 0) Ap = PPLT(i,a,Ap); } Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/IPROD.c0000664002275300236100000000441714017255270013566 0ustar wcbrownscs/*=========================================================================== C <- IPROD(A,B) Integer product. Inputs A,B : in Z. Outputs C : A * B. ===========================================================================*/ #include "saclib.h" Word IPROD(A,B) Word A,B; { Word c,cp,n,n1,n2,n3,o1,o2,s1,s2,w; Word *Ap,Ah[FIXED]; Word *Bp,Bh[FIXED]; Word C,*Cp,Ch[FIXEDX2],W[WORK],*Wp; Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* A and B single-precision. */ if (A < BETA && B < BETA) { DPR(A,B,&cp,&c); if (cp == 0) C = c; else C = LIST2(c,cp); goto Return; } Step3: /* A or B single-precision. */ if (A < BETA) { C = IDPR(B,A); goto Return; } if (B < BETA) { C = IDPR(A,B); goto Return; } Step4: /* A and B double or triple precision. */ if (RED2(B) == NIL) { if (RED2(A) == NIL) { C = IPROD2X2(A,B); goto Return; } else if (RED3(A) == NIL) { C = IPROD3X2(A,B); goto Return; } } else { if (RED3(B) == NIL) if (RED2(A) == NIL) { C = IPROD3X2(B,A); goto Return; } else if (RED3(A) == NIL) { C = IPROD3X3(A,B); goto Return; } } Step5: /* Copy |A|,|B| into arrays, determine lengths and signs. */ IFLTA(A,Ah,FIXED,&Ap,&n1,&s1,&o1); IFLTA(B,Bh,FIXED,&Bp,&n2,&s2,&o2); n3 = n1 + n2; n = MAX(n1,n2); Step6: /* Classical multiplication or Karatsuba. */ if (n <= MAXCLASSICAL) { Cp = Ch; if (n1 >= n2) IPRODA(Ap,n1,Bp,n2,Cp); else IPRODA(Bp,n2,Ap,n1,Cp); } else { if (n > FIXED) { Cp = GETARRAY(n3 + 1); w = 2 * (n - 4 + 3 * (DLOG2(n - 3) - 1)); Wp = GETARRAY(w); } else { Cp = Ch; Wp = W; } CLEAR(Cp,n3 + 1); if (n1 >= n2) KARATSUBA(Ap,n1,Bp,n2,Cp,Wp); else KARATSUBA(Bp,n2,Ap,n1,Cp,Wp); } Step7: /* Store the product in a list. */ if (s1 == s2) C = IFATL(Cp,n3,1); else C = IFATL(Cp,n3,-1); Step8: /* Free up memory. */ if (n > FIXED) { if (n1 > FIXED) FREEARRAY(Ap); if (n2 > FIXED) FREEARRAY(Bp); FREEARRAY(Cp); FREEARRAY(Wp); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFUPIIWS.c0000664002275300236100000000610714017255270014136 0ustar wcbrownscs/*====================================================================== AFUPIIWS(M,I,A,L) Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. Inputs M : in Z[x], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Q(alpha)[x], squarefree, deg(A) > 0. L : a list (I1,...,Ir) of open or one-point isolating intervals for real roots of A. Each Ij is a pair (aj,bj) of binary rational numbers, with a1 <= b1 <= ... <= ar <= br. Either a1 = b1 or A(a1) not zero. Side effects The input list L is modified such that L = (J1,...,Jr) is a list of strongly disjoint isolating intervals for real roots of A such that each Jk is a subinterval of Ik. If Ik is a standard interval then Jk is either a one-point or a standard interval. ======================================================================*/ #include "saclib.h" void AFUPIIWS(M,I,A,L) Word M,I,A,L; { Word I1,I2,Lp,a,a1,ap,b,b1,bp,c,r2,t,y1,y3; /* hide t,y1,y3; */ Step1: /* Make intervals strongly disjoint. */ Lp = L; r2 = RNINT(2); while (L != NIL && RED(Lp) != NIL) { I1 = FIRST(Lp); I2 = SECOND(Lp); FIRST2(I1,&a,&b); FIRST2(I2,&ap,&bp); if (RNCOMP(b,ap) == 0) { if (RNCOMP(a,b) < 0) { b1 = b; t = 0; do { c = RNQ(RNSUM(a,b),r2); y3 = AFSIGN(M,I,AFPEMV(1,M,A,AFFRN(c))); if (y3 == 0) { a = c; b1 = c; } else { if (t == 0) { y1 = AFSIGN(M,I,AFPEMV(1,M,A,AFFRN(a))); t = 1; } if (y1 * y3 < 0) b1 = c; else { a = c; y1 = y3; } } } while (!(RNCOMP(b1,b) < 0)); I1 = LIST2(a,b1); } else { a1 = ap; t = 0; do { c = RNQ(RNSUM(ap,bp),r2); y3 = AFSIGN(M,I,AFPEMV(1,M,A,AFFRN(c))); if (y3 == 0) { a1 = c; bp = c; } else { if (t == 0) { y1 = AFSIGN(M,I,AFPEMV(1,M,AFPDMV(1,M,A),AFFRN(ap))); t = 1; } if (y1 * y3 > 0) a1 = c; else bp = c; } } while (!(RNCOMP(ap,a1) < 0)); I2 = LIST2(a1,bp); } } SFIRST(Lp,I1); Lp = RED(Lp); SFIRST(Lp,I2); } Return: /* Prepare for return. */ return; } saclib2.2.8/src/IFACT.c0000664002275300236100000000310714017255270013532 0ustar wcbrownscs/*====================================================================== F <- IFACT(n) Integer factorization. Inputs n : a positive integer. Outputs F : the ordered list (q1, q2,...,qh) of the prime factors of n, with n equal to the product of qi. ======================================================================*/ #include "saclib.h" Word IFACT(n) Word n; { Word F,Fp,a,b,c,m,mp,p,r,s,t; /* hide s,t; */ Step1: /* Find small factors of n. */ ISPD(n,&F,&m); if (m == 1) goto Return; F = INV(F); a = 1000; Step2: /* Test for primality. */ if (m < BETA) { mp = m - 1; r = MDEXP(m,3,mp); } else { mp = IDIF(m,1); r = MIEXP(m,3,mp); } if (r == 1) goto Step5; Step3: /* Search for a medium divisor. */ ISQRT(m,&c,&t); b = IMAX(5000,IDQ(c,3)); if (ICOMP(a,b) > 0) goto Step4; IMPDS(m,a,b,&p,&m); if (p != 1) { a = p; F = COMP(p,F); goto Step2; } a = b; Step4: /* Search for large divisor. */ b = c; ILPDS(m,a,b,&p,&m); if (p != 1) F = COMP(p,F); F = COMP(m,F); F = INV(F); goto Return; Step5: /* Selfridge primality test. */ Fp = IFACT(mp); s = ISPT(m,mp,Fp); if (s == 1) { F = COMP(m,F); F = INV(F); goto Return; } goto Step3; Return: /* Prepare for return. */ return(F); } saclib2.2.8/src/IPTRAN.c0000664002275300236100000000173114017255270013702 0ustar wcbrownscs/*====================================================================== B <- IPTRAN(r,A,T) Integral polynomial translation. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 1, the number of variables. T : a list (tr,...,t1) of integers. Outputs B : in Z[X1,...,Xr], B(X1,...,Xr) = A(X1+t1,...,Xr+tr). ======================================================================*/ #include "saclib.h" Word IPTRAN(r,A,T) Word r,A,T; { Word B,Bp,Tp,b,bp,e,rp,t; /* hide rp; */ Step1: /* Translate main variable. */ ADV(T,&t,&Tp); B = IPTRMV(r,A,t); Step2: /* Translate coefficients. */ rp = r - 1; if (rp == 0 || B == 0) goto Return; Bp = B; B = NIL; do { ADV2(Bp,&e,&bp,&Bp); b = IPTRAN(rp,bp,Tp); B = COMP2(b,e,B); } while (!(Bp == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AMUPTR1.c0000664002275300236100000000076214017255270014001 0ustar wcbrownscs/*====================================================================== B <- AMUPTR1(A) Algebraic module univariate polynomial translation by 1. Inputs A : in Z[alpha,X]. Outputs B : in Z[alpha,X], B(X) = A(X+1). ======================================================================*/ #include "saclib.h" Word AMUPTR1(A) Word A; { Word B; Step1: /* Translate by one. */ B = IPTR1(2,A,2); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPICS.c0000664002275300236100000000151614017255270013555 0ustar wcbrownscs/*====================================================================== d <- IPICS(r,A,c) Integral polynomial integer content subroutine. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr], non-zero. c : in Z. Outputs d : in Z, the g.c.d. of c and the integer content of A. ======================================================================*/ #include "saclib.h" Word IPICS(r,A,c) Word r,A,c; { Word Ap,a,d,e,rp; /* hide a,e,rp; */ Step1: /* Compute. */ Ap = A; rp = r - 1; d = c; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) d = IGCD(a,d); else d = IPICS(rp,a,d); if (d == 1) goto Return; } while (!(Ap == NIL)); Return: /* Prepare for return. */ return(d); } saclib2.2.8/src/IPRIM.c0000664002275300236100000000127214017255270013565 0ustar wcbrownscs/*====================================================================== L <- IPRIM(A) Integral polynomial real root isolation, modified Uspensky method. Inputs A : in Z[X], non-zero, squarefree. Outputs L : a list (I1,...,Ir) of strongly disjoint isolating intervals for all of the real roots of A with I1 < I2 < ... < Ir. Each I_j is a standard open or a one-point binary rational interval. ======================================================================*/ #include "saclib.h" Word IPRIM(A) Word A; { Word L; Step1: /* Compute. */ L = IPRIMW(A); IPIIWS(A,L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/IIC.c0000664002275300236100000000423314017255270013311 0ustar wcbrownscs/*====================================================================== Ls <- IIC(A,Ap,I,L) Isolating interval conversion. Inputs A : in Z[X], squarefree. Ap : in Z[X], the derivative of A. I : a left open right closed interval (a,b) with binary rational endpoints represented by the list (a,b). L : a list of isolating intervals with binary rational endpoints for the real roots of A in I. L=((a1,b1),...,(ak,bk)) with a1 <= b1 <= ... <= ak <= bk and (ai,bi) represents the open interval (ai,bi) if ai < bi, the closed interval (ai,bi) if ai = bi. Outputs Ls : a list ((as_1,bs_1),...,as_k,bs_k)) of isolating intervals for the same roots and satisfying the same conditions except that each pair (as_i,bs_i) represents the left open right closed interval (as_i,bs_i). ======================================================================*/ #include "saclib.h" Word IIC(A,Ap,I,L) Word A,Ap,I,L; { Word I1,I2,Lp,Ls,a1,a2,b1,b2,c,s,s1; /* hide I1,I2,a1,a2,b1,b2,s,s1; */ Step1: /* Initialize. */ Lp = CINV(L); Ls = NIL; Step2: /* Finish. */ if (Lp == NIL) goto Return; Step3: /* I2 open. */ ADV(Lp,&I2,&Lp); FIRST2(I2,&a2,&b2); s = RNCOMP(a2,b2); if (s != 0) { Ls = COMP(I2,Ls); goto Step2; } Step4: /* L' empty. */ if (Lp == NIL) { a2 = FIRST(I); Ls = COMP(LIST2(a2,b2),Ls); goto Return; } Step5: /* I1 not adjacent. */ I1 = FIRST(Lp); FIRST2(I1,&a1,&b1); s = RNCOMP(b1,a2); if (s != 0) { a2 = b1; Ls = COMP(LIST2(a2,b2),Ls); goto Step3; } Step6: /* Bisect I1. */ Lp = RED(Lp); s1 = IUPBES(A,a1); if (s1 == 0) s1 = IUPBES(Ap,a1); c = a1; do { c = RIB(c,b1); s = IUPBES(A,c); } while (!(s1 * s <= 0)); Step7: /* Adjoint two intervals. */ Ls = COMP(LIST2(c,b1),Ls); Ls = COMP(LIST2(a1,c),Ls); goto Step2; Return: /* Prepare for return. */ return(Ls); } saclib2.2.8/src/GCGLOBAL.c0000664002275300236100000000103414017255270014053 0ustar wcbrownscs/*====================================================================== GCGLOBAL(p) Declare a global variable to the Garbage Collector. Inputs p : a C pointer, the address of the global variable. Side effects A cell referencing the global variable is added to the GCGLOBALS list. ======================================================================*/ #include "saclib.h" void GCGLOBAL(p) Word *p; { Step1: /* Add. */ GCGLOBALS = PTRCOMP(p,GCGLOBALS); Return: /* Prepare for return. */ return; } saclib2.2.8/src/AFUPWRITE.c0000664002275300236100000000221314017255270014247 0ustar wcbrownscs/*=========================================================================== AFUPWRITE(A,vA,vc) Algebraic number field univariate polynomial write. Inputs A : in Q(alpha)[X], where the coefficients of A are represented as (ai,Ai) where ai is in Q and Ai is in Z[x]; vA: a variable for writing A; vc: a variable for writing the coefficients of A. Side effects The polynomial A is written in the output stream in external canonical form. ===========================================================================*/ #include "saclib.h" void AFUPWRITE(A,vA,vc) Word A,vA,vc; { Word Ap,e,a; Step1: /* A = 0 */ if (A == 0) { CWRITE('0'); return; } Step2: /* Initialize. */ Ap = A; CWRITE('('); Step3: /* Write coefficient */ FIRST2(Ap,&e,&a); if (Ap != A) CWRITE('+'); AFWRITE(a,vc); Step4: /* Write variable and exponent */ if (e > 0) VWRITE(vA); if (e > 1) { CWRITE('^'); AWRITE(e); } Ap = RED2(Ap); if (Ap != NIL) goto Step3; Step5: /* Close. */ CWRITE(')'); Return: /* Prepare for return. */ return; } saclib2.2.8/src/FCOPY.c0000664002275300236100000000077514017255270013574 0ustar wcbrownscs/*====================================================================== FCOPY(A,B) Floating point copy. Inputs A : a floating-point number. B : an array as large as A. Effect The floating-point number A is copied into B. ======================================================================*/ #include "saclib.h" void FCOPY(A,B) Word *A,*B; { BDigit i,p; Step1: /* Copy A. */ p = A[2]; for (i = 0; i <= p + 2; i++) B[i] = A[i]; Return: /* Return. */ return; } saclib2.2.8/src/AFPNORM.c0000664002275300236100000000214514017255270014007 0ustar wcbrownscs/*========================================================================== Bs <- AFPNORM(r,M,B) Algebraic number field polynomial norm. Inputs M : integral minimal polynomial of an algebraic number alpha. r : a non-negative BETA-digit. B : an element of Q(alpha)[x1,...,xr]. Outputs Bs : an element of Z[x1,...,xr]. Positive, primitive polynomial similar to the norm of B. ==========================================================================*/ #include "saclib.h" Word AFPNORM(r,M,B) Word r,M,B; { Word Mp,m,Bp,Bs,R,b; Step1: /* Convert representation. */ Bp = AFPICR(r,B); IPSRP(r+1,Bp,&b,&Bp); Step2: /* Check for A having only rational coefficients. */ Bp = PCPV(r+1,Bp,1,r+1); m = PDEG(M); if (PDEG(Bp) == 0) { R = PLDCF(Bp); R = IPEXP(r,R,m); goto Step4; } Step3: /* Compute resultant of B and M. */ Mp = PINV(1,M,r); R = IPRES(r + 1,Mp,Bp); Step4: /* Compute integral primitive part. */ Bs = IPABS(r,IPIPP(r,R)); Return: /* Prepare for return. */ return(Bs); } saclib2.2.8/src/IMPB.c0000664002275300236100000000352114017255270013433 0ustar wcbrownscs/*=========================================================================== IMPB(A,n; B,t) Integer multiplication by power of BETA. Inputs A : in Z. n : a BETA-integer. Outputs B : the integral part of A * BETA^n. t : in {0,1,2,3}. Truncation indicator. t = 0 if |A * BETA^n - B| = 0. t = 1 if |A * BETA^n - B| < 1/2. t = 2 if |A * BETA^n - B| = 1/2. t = 3 if |A * BETA^n - B| > 1/2. ===========================================================================*/ #include "saclib.h" void IMPB(A,n, B_,t_) Word A,n,*B_,*t_; { Word b,i,t,tp; Word B,L; Step1: /* A=0 or n=0. */ if (A == 0 || n == 0) { B = A; t = 0; goto Return; } if (n < 0) goto Step4; Step2: /* n > 0. */ B = AVAIL; L = B; for (i = 1; i < n; i++) { if (L == NIL) goto Step3; L = RED(L); } if (L == NIL) goto Step3; if (A < BETA) { L = RED(L); if (L == NIL) goto Step3; AVAIL = RED(L); SRED(L,NIL); SFIRST(L,A); } else { AVAIL = RED(L); SRED(L,A); } t = 0; goto Return; Step3: /* Collect garbage and retry Step2. */ GC(); goto Step2; Step4: /* n < 0. */ if (A < BETA) B = LIST1(A); else B = A; tp = 0; i = 0; while (!ISNIL(B) && i != -n-1) { ADV(B,&b,&B); if (b != 0) tp = 1; i = i + 1; } if (B == NIL) { B = 0; t = tp; goto Return; } ADV(B,&b,&B); if (b == 0 && tp == 0) t = 0; else { b = absm(b); if (b < BETA/2) t = 1; else if (b > BETA/2) t = 3; else if (tp == 0) t = 2; else t = 3; } if (B == NIL) B = 0; else if (RED(B) == NIL) B = FIRST(B); Return: /* Prepare for return. */ *B_ = B; *t_ = t; return; } saclib2.2.8/src/IEEEROUND.c0000664002275300236100000000354414017255270014230 0ustar wcbrownscs/*====================================================================== IEEEROUND(F,s,d; F',t) IEEE round. Inputs F : IEEE double. s : in {-3,-2,-1,0,1,2,3} The pair (F,s) represents a number F' that is located more than half a unit to the left of F if s = -3, exactly half a unit to the left of F if s = -2, less than half a unit to the left of F if s = -1, exactly at F if s = 0, less than half a unit to the right of F if s = 1, exactly half a unit to the right of F if s = 2, more than half a unit to the right of F if s = 3. d : rounding direction: d = -1 round down, d = 0 round to nearest, d = 1 round up. Outputs Fp : IEEE double. Fp is obtained by rounding F to F-, F or F+, depending on s and the rounding mode d. t : If t = 0, the program failed and F' is undefined. Otherwise t = 1. ======================================================================*/ #include "saclib.h" void IEEEROUND(F,s,d,Fp_,t_) ieee F; BDigit s,d; ieee *Fp_; BDigit *t_; { ieee Fp; BDigit t; Step1: /* Initialize. */ Fp = F; Step2: /* Round down. */ if (d == -1) { if (s < 0) { IEEENEIGH(F,-1,&Fp,&t); if (t == 0) goto Return; } goto Return; } Step3: /* Round up. */ if (d == 1) { if (s > 0) { IEEENEIGH(F,1,&Fp,&t); if (t == 0) goto Return; } goto Return; } Step4: /* Round to nearest. */ if (s == -3 || (s == -2 && ODD(F.rep.mant_l))) { IEEENEIGH(F,-1,&Fp,&t); if (t == 0) goto Return; } else if (s == 3 || (s == 2 && ODD(F.rep.mant_l))) { IEEENEIGH(F,1,&Fp,&t); if (t == 0) goto Return; } Return: /* Return F' and t. */ *Fp_ = Fp; *t_ = t; return; } saclib2.2.8/src/PTRLIST1.c0000664002275300236100000000053314017255270014126 0ustar wcbrownscs/*====================================================================== L <- PTRLIST1(a) List, 1 element. Inputs a : a pointer (i.e. Word*). Outputs L : the list (a). ======================================================================*/ #include "saclib.h" Word PTRLIST1(a) Word *a; { return PTRCOMP(a,NIL); } saclib2.2.8/src/LBRNSUM.c0000664002275300236100000000174114017255270014030 0ustar wcbrownscs/*===================================================================== T <- LBRNSUM(R,S) Logarithmic binary rational number sum. Inputs R, S : logarithmic binary rational numbers. Outputs T : R + S, a logarithmic binary rational number. ======================================================================*/ #include "saclib.h" Word LBRNSUM(R,S) Word R,S; { Word a,b,c,e,f,k,T; Step1: /* R=0 or S=0. */ if (R == 0) { T = S; goto Return; } if (S == 0) { T = R; goto Return; } Step2: /* Disassemble R and S. */ FIRST2(R,&a,&e); FIRST2(S,&b,&f); Step3: /* Compute sum. */ if (e < f) { c = ISUM(IMP2(a,f - e),b); T = LIST2(c,f); } else if (e > f) { c = ISUM(a,IMP2(b,e - f)); T = LIST2(c,e); } else { c = ISUM(a,b); if (c == 0) T = 0; else { k = IORD2(c); c = IDP2(c,k); T = LIST2(c, e - k); } } Return: /* Return T. */ return(T); } saclib2.2.8/src/MAPSUM.c0000664002275300236100000000221214017255270013702 0ustar wcbrownscs/*=========================================================================== MAPSUM(m,A,B,C) Modular array polynomial sum. Inputs m : a BETA-digit. A,B : in Z/(m)[x] in array representation. C : an array large enough to hold A + B. Side effects A + B is computed and put in C. ===========================================================================*/ #include "saclib.h" void MAPSUM(m,A,B,C) Word m,*A,*B,*C; { Word i,n,k,c,dmax,dmin; Step1: /* Initialize. */ n = MAPDEG(A); k = MAPDEG(B); i = 1; if (n > k) { dmax = n; dmin = k; } else { dmax = k; dmin = n; } MAPDEG(C) = 0; for (i = 0; i <= dmax; i++) MAPCF(C,i) = 0; Step2: /* Compute. */ for (i = 0; i <= dmin; i++) { c = MDSUM(m,MAPCF(A,i),MAPCF(B,i)); MAPCF(C,i) = c; } while (i <= n) { MAPCF(C,i) = MAPCF(A,i); i++; } while (i <= k) { MAPCF(C,i) = MAPCF(B,i); i++; } Step3: /* Determine degree. */ i = dmax; while (MAPCF(C,i) == 0 && i > 0) i--; MAPDEG(C) = i; Return: /* Prepare for return. */ return; } saclib2.2.8/src/IGCD.c0000664002275300236100000000343014017255270013411 0ustar wcbrownscs/*=========================================================================== C <- IGCD(A,B) Integer greatest common divisor. Inputs A,B : in Z. Outputs C : gcd(A,B). ===========================================================================*/ #include "saclib.h" Word IGCD(A,B) Word A,B; { Word *A1,*A2,*T,C,a,a0,a1,b,b0,b1,d,g1,g2,m1,m2,t,u1,u2,v1,v2; Step1: /* Single-precision input. */ if (A < BETA && B < BETA) { a = absm(A); b = absm(B); if (a > b) C = DGCD(a,b); else C = DGCD(b,a); goto Return; } Step2: /* Initialize and convert to array representation. */ m1 = ILENGTH(A) + 2; m2 = ILENGTH(B) + 2; A1 = GETARRAY(m1); A2 = GETARRAY(m2); IFLTA(A,A1,m1,&A1,&m1,&d,&d); IFLTA(B,A2,m2,&A2,&m2,&d,&d); Step3: /* Swap if necessary. */ if (IACOMPA(A1,m1,A2,m2) < 0) { T = A1; t = m1; A1 = A2; m1 = m2; A2 = T; m2 = t; } Step4: /* Compute remainders. */ while (ISIGNA(A2,m2) != 0) { if (m1 == 1) { C = DGCD(A1[0],A2[0]); A1[0] = C; goto Step5; } g1 = ILOG2A(A1,m1); g2 = ILOG2A(A2,m2); v1 = 0; if (g1 - g2 < ZETA) if (g1 >= 2 * ZETA) { ILWORDS(A1,m1,A2,m2,&a1,&a0,&b1,&b0); DDPCC(a1,a0,b1,b0,&u1,&u2,&v1,&v2); } else if (g1 - g2 < ZETA / 2) { ILWORD(A1,m1,A2,m2,&a1,&b1); DPCC(a1,b1,&u1,&u2,&v1,&v2); } if (v1 != 0) IDLCOMB(A1,m1,A2,m2,u1,v1,u2,v2,1,1,&m1,&m2); else { IEAS(A1,m1,A2,m2,&m1); T = A1; t = m1; A1 = A2; m1 = m2; A2 = T; m2 = t; } } Step5: /* Convert gcd to list representation and free arrays. */ C = IFATL(A1,m1,1); FREEARRAY(A1); FREEARRAY(A2); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/CSFAM.c0000664002275300236100000000133014017255270013531 0ustar wcbrownscs/*======================================================================= c = CSFAM(n,A) Characteristic set from array of members. Inputs n ; a beta digit, 1 <= n <= zeta. A : an array of n beta digits. 0 <= A[0] < A[1] < ... < A[n-1] < zeta. Output c : a beta digit. A represents a subset of {0,1,...,zeta - 1}. c is the characteristic set of A. Bit i of c is 1 if and only if A[j] = i for some j. =======================================================================*/ #include "saclib.h" BDigit CSFAM(n,A) BDigit n,*A; { BDigit c,i; Step1: /* Shift and add. */ c = 0; for (i = 0; i < n; i++) c = c | (1 << A[i]); Return: /* Return c. */ return(c); } saclib2.2.8/src/AMUPMPR.c0000664002275300236100000000467414017255270014037 0ustar wcbrownscs/*====================================================================== AMUPMPR(M,I,B,J,L; Js,j) Algebraic module univariate polynomial minimal polynomial of a real root. Inputs M : in Z[X], the minimal polynomial of an algebraic number alpha. I : an acceptable isolating interval for alpha. J : a Binary rational interval which is either left-open and right-closed or a one-point interval. B : in Z[alpha,X]. B has a unique root beta of odd multiplicity in J. L : is a nonempty list (L1,...,Lt) of positive irreducible elements of Z[X]. Exactly one Li has beta as a root. Outputs Js : a Binary rational interval. Js is a subinterval of J which is an isolating interval for beta as a root of Lj. Js is either left-open and right-closed or a one-point interval. j : a BETA-digit. Lj is the unique element of L having beta as a root. ======================================================================*/ #include "saclib.h" void AMUPMPR(M,I,B,J,L, Js_,j_) Word M,I,B,J,L, *Js_,*j_; { Word Js,L1,Lp,a,b,c,j,jp,s,t,v,vp; /* hide L1,Lp,j,jp,s,t,v,vp; */ Step1: /* Initialize. */ FIRST2(J,&a,&b); t = AMUPBES(M,I,B,b); if (t == 0) goto Step4; Step2: /* Test for real roots of each Li in current interval. */ v = 0; j = 0; jp = 0; Lp = L; Js = LIST2(a,b); do { ADV(Lp,&L1,&Lp); jp = jp + 1; vp = IUPVOI(L1,Js); if (vp > 1) goto Step3; if (vp == 1) if (v == 1) goto Step3; else { v = 1; j = jp; } } while (!(Lp == NIL)); goto Return; Step3: /* Bisect current interval. */ c = RIB(a,b); s = AMUPBES(M,I,B,c); if (s == 0) { b = c; goto Step4; } else if (s * t < 0) a = c; else { b = c; t = s; } goto Step2; Step4: /* B has root at right end point of current interval. */ j = 0; Js = LIST2(b,b); Lp = L; do { ADV(Lp,&L1,&Lp); j = j + 1; if (PDEG(L1) == 1) if (IUPBES(L1,b) == 0) goto Return; } while (1); Return: /* Prepare for return. */ *Js_ = Js; *j_ = j; return; } saclib2.2.8/src/GCSI.c0000664002275300236100000000723614017255270013440 0ustar wcbrownscs/*====================================================================== GCSI(s,EACSTACK) Garbage collection, system independent. Inputs s : a BETA-digit, the size in bytes at which data is aligned on the stack. EACSTACK : a C pointer, the address of the last element on the stack. Side effects Active variables are marked. Then a new available cell list is formed from the unmarked cells and the marks are removed. If GCM=1 a report is written out. If the number of reclaimed cells is no more than NU / RHO then a message is written and a failure occurs. ======================================================================*/ #include "saclib.h" void GCSI(s,EACSTACK) Word s; char *EACSTACK; { Word I,L,N,N1,Np,Np1,T,T1,c,inc; char *a; /* hide I,L,N,N1,Np,Np1,T,T1,c,inc,a; */ Step1: /* Setup. */ if (GCM == 1) { SWRITE("\nThe "); GWRITE(GCC+1); SWRITE("--th garbage collection....\n"); } T1 = CLOCK(); Step3: /* Mark the global variables. */ L = GCGLOBALS; while (L != NIL) { c = *((Word *)PTRFIRST(L)); if ((ISLIST(c) || ISGCA(c)) && !ISNIL(c)) MARK(c); L = PTRRED(L); } Step2: /* Mark the cells in the GCGLOBALS list. */ L = GCGLOBALS; while (L != NIL) { I = RED(L); SRED(L,-I); L = I; } /* Step3: /\* Mark the global variables. *\/ */ /* L = GCGLOBALS; */ /* while (L != NIL) { */ /* c = *(PTRFIRST(L)); */ /* if ((ISLIST(c) || ISGCA(c)) && !ISNIL(c)) MARK(c); */ /* #if __WORDSIZE == 64 */ /* L = -RED(L); L = -RED(L); L = -RED(L); L = -RED(L); */ /* #else /\* Assumes 32-bit pointers. *\/ */ /* L = -RED(L); L = -RED(L); */ /* #endif */ /* } */ Step4: /* Mark the cells accessible from the system stack. */ if (((BACSTACK - EACSTACK) % s) != 0) FAIL("GCSI (marking stack)","Alignment error",BACSTACK,EACSTACK); if (EACSTACK > BACSTACK) inc = s; else inc = -s; for (a = BACSTACK; a != EACSTACK; a += inc) { c = *((Word *) a); if ((ISLIST(c) || ISGCA(c)) && !ISNIL(c)) MARK(c); } Step5: /* Unmark the cells in the AVAIL and GCAAVAIL lists. */ for (L=AVAIL,N1=0; L!=NIL; L=RED(L),N1++) if (RED(L) <= -BETA) SRED(L,-RED(L)); for (L=GCAAVAIL,Np1=0; L!=NIL; L=GCASPACEBp[L].next,Np1++) if (GCASPACEBp[L].next <= -BETA) GCASPACEBp[L].next = -GCASPACEBp[L].next; Step6: /* Reclaim unmarked cells */ AVAIL = NIL; N = 0; for (L = BETA+NU-1; L > BETA; L -= 2) { if (RED(L) > 0) { SRED(L,AVAIL); SFIRST(L,0); AVAIL = L; N++; } else SRED(L,-RED(L)); } GCAAVAIL = NIL; Np = 0; for (I = BETApp-1; I > BETAp; I--) { if (GCASPACEBp[I].next > 0) { GCAFREE(I); Np++; } else GCASPACEBp[I].next = -GCASPACEBp[I].next; } Step7: /* Increment counters. */ T = CLOCK() - T1; TAU = TAU + T; GCC = GCC + 1; GCCC = GCCC + N - N1; GCAC = GCAC + Np - Np1; Step8: /* Optional report. */ if (GCM == 1 || N <= NU / RHO) { SWRITE("** "); GWRITE(N); SWRITE(" cells, "); GWRITE(Np); SWRITE(" arrays in "); GWRITE(T); SWRITE(" milliseconds.\n"); } Step9: /* Too few cells or arrays? */ if (N <= NU / RHO) FAIL("GCSI (final check)","Too few cells reclaimed.",N,NU,RHO); if (Np == 0) FAIL("GCSI (final check)","No arrays reclaimed.",N,NU,RHO); Return: /* Prepare for return. */ return; } saclib2.2.8/src/ILCM.c0000664002275300236100000000127514017255270013434 0ustar wcbrownscs/*=========================================================================== C <- ILCM(A,B) Integer least common multiple. Inputs A,B : in Z. Outputs C : lcm(A,B), C >= 0. ===========================================================================*/ #include "saclib.h" Word ILCM(A,B) Word A,B; { Word Ap,App,Bp,C,Cp; Step1: /* A or B = 0. */ Ap = IABSF(A); Bp = IABSF(B); if (Ap == 0) { C = Bp; goto Return; } else if (Bp == 0) { C = Ap; goto Return; } Step2: /* A and B nonzero. */ Cp = IGCD(Ap,Bp); App = IEQ(Ap,Cp); C = IPROD(App,Bp); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AMUPBES.c0000664002275300236100000000134414017255270014001 0ustar wcbrownscs/*====================================================================== s <- AMUPBES(M,I,A,c) Algebraic module univariate polynomial, binary rational evaluation of sign. Inputs M : in Z[X], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Z[alpha,X]. c : A binary rational number. Outputs s : a BETA-digit, s = sign(A(c)). ======================================================================*/ #include "saclib.h" Word AMUPBES(M,I,A,c) Word M,I,A,c; { Word b,s; /* hide s; */ Step1: /* Compute the sign. */ b = IPBREI(2,A,2,c); s = AMSIGN(M,I,b); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/DRAN.c0000664002275300236100000000123514017255270013430 0ustar wcbrownscs/*====================================================================== a <- DRAN() Digit, random. Outputs a : random BETA-digit. ======================================================================*/ #include "saclib.h" Word DRAN() { Word a,a1,a2,s; /* hide algorithm */ Step1: /* Compute. */ a1 = DRANN(); s = 0; a1 = a1 + a1; if (a1 >= BETA) { s = 1; a1 = a1 - BETA; } a1 = a1 / DELTA; a2 = DRANN(); a2 = a2 / EPSIL; a = a1 * DELTA + a2; if (s == 1) a = -a; Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/LINS.c0000664002275300236100000000111114017255270013442 0ustar wcbrownscs/*====================================================================== LINS(a,L) List insertion. Inputs L : a non-null list ( a1,...,an ) a : object Side effects: L is modified by inserting a after the first element in L, so L will become (a1,a,a2,...,an). ======================================================================*/ #include "saclib.h" void LINS(a,L) Word a,L; { Word A; /* hide algorithm */ Step1: /* Compute. */ A = COMP(a,RED(L)); SRED(L,A); Return: /* Prepare for return. */ return; } saclib2.2.8/src/FQUOT.c0000664002275300236100000000413514017255270013604 0ustar wcbrownscs/*====================================================================== FQUOT(A,B,d,C) Floating-point quotient. Inputs A, B : floating-point numbers of the same precision, p. B is nonzero. d : a sign (rounding direction). C : an array of size at least 2 * p + 6. Effect A / B is computed with p-precision arithmetic, rounded according to d, and the result is placed in the array C. ======================================================================*/ #include "saclib.h" void FQUOT(A,B,d,C) BDigit *A,*B,d,*C; { BDigit e,i,p,s,t,u,v; Word a,b,q,r,rs; Step1: /* Get precision. */ p = A[2]; Step2: /* A = 0? */ if (A[1] == 0) { C[0] = 0; C[1] = 0; C[2] = p; goto Return; } Step3: /* Convert mantissas to integers, a and b. */ if (p == 1) a = A[3]; else { a = NIL; for (i = p + 2; i >= 3; i--) a = COMP(A[i],a); } if (p == 1) b = B[3]; else { b = NIL; for (i = p + 2; i >= 3; i--) b = COMP(B[i],b); } Step4: /* Make b to be greater than a. */ t = ICOMP(a,b); if (t >= 0) { b = IMP2(b,1); u = 1; } else u = 0; Step5: /* Multiply a by BETA^p. */ if (p == 1) a = LIST1(a); for (i = 1; i <= p; i++) a = COMP(0,a); Step6: /* Let a = q b + r, r >= 0. */ IQR(a,b, &q,&r); Step7: /* Compute the sign, s, of C. */ if (A[1] == B[1]) s = 1; else s = -1; C[1] = s; Step8: /* Round. */ if (r != 0) { if (d != 0) { if (s == d) q = ISUM(q,1); } else { rs = IMP2(r,1); v = ICOMP(rs,b); if (v == 0) { if (IODD(q)) q = ISUM(q,1); } else if (v > 0) q = ISUM(q,1); } } Step9: /* q > BETA^p? */ if (q > BETA && LENGTH(q) > p) { q = IDP2(q,1); u = u + 1; } Step10: /* Compute and store exponent of C. */ e = A[0] - B[0] + u; C[0] = e; Step11: /* Store the precision of C. */ C[2] = p; Step12: /* Store mantissa of c. */ if (p == 1) C[3] = q; else { for (i = 3; i <= p + 2; i++) { C[i] = FIRST(q); q = RED(q); } } Return: /* Return. */ return; } saclib2.2.8/src/SIPCOPY.c0000664002275300236100000000105014017255270014025 0ustar wcbrownscs/*====================================================================== SIPCOPY(A,B) Software interval polynomial copy. Input A : a software interval polynomial. B : an array large enough for a copy of A. Effect A is copied into B. ======================================================================*/ #include "saclib.h" void SIPCOPY(A,B) BDigit *A,*B; { BDigit i,S; Step1: /* Get size of A. */ S = SIPSIZE(A); Step2: /* Copy. */ for (i = 0; i < S; i++) B[i] = A[i]; Return: /* Return. */ return; } saclib2.2.8/src/DIPDEG.c0000664002275300236100000000117414017255270013642 0ustar wcbrownscs/*====================================================================== n <- DIPDEG(r,A) Distributive polynomial degree. Inputs r : a BETA-digit, r >= 0, the number of variables. A : in Z[X1,...,Xr], distributive representation. Outputs n : the degree of A in its main variable. ======================================================================*/ #include "saclib.h" Word DIPDEG(r,A) Word r,A; { Word n; /* hide algorithm */ Step1: if (r == 0 || A == 0) n = 0; else n = FIRST(SECOND(A)); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/AGIRP.c0000664002275300236100000000260614017255270013551 0ustar wcbrownscs/*====================================================================== AGIRP(A,B,T; k) Array Gaussian integer reduced part. Inputs A : a nonzero array Gaussian integer. B : an array for the result. T : an auxilliary Gaussian integer array. Output k : a nonnegative BETA digit. (1 + i)^k divides A, but (1 + i)^{k + 1} does not. Effect An associate of A / (1 + i)^k is placed in B. ======================================================================*/ #include "saclib.h" void AGIRP(A,B,T, k_) BDigit **A,**B,**T, *k_; { BDigit *A1,*A2,a1,a2,h,i,k,n,n1,n2; Step1: /* Compute h = floor(k/2). */ A1 = A[0]; A2 = A[1]; n1 = A1[1]; n2 = A2[1]; n = MIN(n1,n2); h = 0; i = 0; while (i <= n) { a1 = A1[i + 2]; a2 = A2[i + 2]; if (a1 == 0 && a2 == 0) { h = h + ZETA; i = i + 1; } else { while (!(a1 & 1) && !(a2 & 1)) { h = h + 1; a1 = a1 >> 1; a2 = a2 >> 1; } goto Step2; } } Step2: /* If A is divisible by 1 + 1, multiply A by 1 - i, add 1 to k, and divide by 2^{h + 1}. Otherwise divide A by 2^h. */ k = h + h; if (((a1 & 1) == 1) && ((a2 & 1) == 1)) { A1[0] = - A1[0]; AISUM(A1,A2,B[1]); A1[0] = - A1[0]; AISUM(A1,A2,B[0]); k = k + 1; AGIDP2(B,h + 1,B); } else AGIDP2(A,h,B); Return: /* Return k. */ *k_ = k; return; } saclib2.2.8/src/INSET.c0000664002275300236100000000124614017255270013570 0ustar wcbrownscs/*=========================================================================== t <- INSET(S,a) Is the element in the set? Inputs S : a list of BETA-digits in ascending order. a : a BETA-digit. Output t : is 1 if a in a member of S, 0 otherwise. ===========================================================================*/ #include "saclib.h" Word INSET(S,a) Word S,a; { Word S1,Sp,t; Step1: /* Check. */ Sp = S; while (Sp != NIL) { ADV(Sp,&S1,&Sp); if (S1 == a) { t = 1; goto Return; } if (S1 > a) { t = 0; goto Return; } } t = 0; Return: /* Prepare for return. */ return(t); } saclib2.2.8/src/SMDM.c0000664002275300236100000000352314017255270013446 0ustar wcbrownscs/*====================================================================== M <- SMDM(r,A,B,k) Sylvester matrix degree matrix. Inputs r : a beta digit, r >= 2. A, B : r-variate polynomials of positive degrees. k : a beta digit, 1 <= k < r. Output M : Let S be the Sylvester matrix of A and B. M is the matrix of beta integers such that if S_{i,j} /= 0 then M_{i,j} is the degree in x_k of S_{i,j} and otherwise M_[i,j} is -[beta/(m + n)] - 1, where m and n are the degrees of A and B in x_r. M is represented as an arrray of arrays. ======================================================================*/ #include "saclib.h" BDigit **SMDM(r,A,B,k) Word A,B; BDigit k,r; { BDigit d,I,i,j,**M,m,n,q; Word Ap,Bp; Step1: /* Get a matrix. */ m = PDEG(A); n = PDEG(B); q = m + n; M = GETMATRIX(q,q); Step2: /* Store I = -[beta/(m + n)] - 1 in triangular regions. */ I = -(BETA/(m + n)) - 1; for (i = 1; i < n; i++) { for (j = 0; j < i; j++) M[i][j] = I; } for (i = n; i < m + n; i++) { for (j = 0; j < i; j++) M[i][j] = I; } for (i = 0; i < n - 1; i++) { for (j = m + i + 1; j < m + n; j++) M[i][j] = I; } for (i = n; i < m + n - 1; i++) { for (j = i + 1; j < m + n; j++) M[i][j] = I; } Step3: /* Store degrees of coefficients of A and B. */ Ap = A; for (j = m; j >= 0; j--) { if (Ap != 0 && PDEG(Ap) == j) { d = PDEGSV(r-1,PLDCF(Ap),k); Ap = PRED(Ap); } else d = I; for (i = 0; i < n; i++) M[i][m-j+i] = d; } Bp = B; for (j = n; j >= 0; j--) { if (Bp != 0 && PDEG(Bp) == j) { d = PDEGSV(r-1,PLDCF(Bp),k) ; Bp = PRED(Bp); } else d = I; for (i = 0; i < m; i++) M[n+i][n-j+i] = d; } Return: /* Return M. */ return(M); } saclib2.2.8/src/IPSUMN.c0000664002275300236100000000165014017255270013720 0ustar wcbrownscs/*====================================================================== b <- IPSUMN(r,A) Integral polynomial sum norm. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 0, the number of variables. Outputs b : in Z, the sum norm of A. ======================================================================*/ #include "saclib.h" Word IPSUMN(r,A) Word r,A; { Word Ap,a1,b,b1,e1,rp; /* hide a1,e1,rp; */ Step1: /* r=0. */ if (r == 0) { b = IABSF(A); goto Return; } Step2: /* r > 0. */ b = 0; if (A == 0) goto Return; Ap = A; rp = r - 1; do { ADV2(Ap,&e1,&a1,&Ap); if (rp == 0) b1 = IABSF(a1); else b1 = IPSUMN(rp,a1); b = ISUM(b,b1); } while (Ap != NIL); Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/ANR.c0000664002275300236100000000261214017255270013324 0ustar wcbrownscs/*====================================================================== J <- ANR(p,A,I) Algebraic number refinement. Inputs p : a positive beta integer, the precision of the software arithmetic to be employed. A : the minimal integral polynomial of an algebraic number \alpha. I : a logarithmic open standard isolating interval for \alpha. Output J : a logarithmic open standard isolating interval for \alpha that is a subinterval of I, the smallest that could be obtained with precision p arithmetic. ======================================================================*/ #include "saclib.h" Word ANR(p,A,I) BDigit p; Word A,I; { BDigit *Ap,*bp,n,q1,q2,S,t; Word b,J; Step1: /* Convert the minimal polynomial to a software interval polynomial. */ n = PDEG(A); q1 = p + 3; q2 = q1 + q1; S = (n + 1) * q2 + 1; Ap = GETARRAY(S); IPSIP(A,p,Ap); Step2: /* Compute the trend of \alpha. */ b = SECOND(I); bp = GETARRAY(q1); t = LBRNFEC(b,p,bp); J = I; if (t == 0) { FREEARRAY(bp); goto Return; } t = SIPES(Ap,bp); FREEARRAY(bp); if (t == NIL) goto Return; Step3: /* Refine the isolating interval for \alpha. */ J = SIPIR(Ap,I,t,- (p * ZETA)); FREEARRAY(Ap); Return: /* Return J. */ return(J); } saclib2.2.8/src/ABS.c0000664002275300236100000000072414017255270013313 0ustar wcbrownscs/*=========================================================================== b <- ABS(a) Absolute value. Inputs a : a C integer. Outputs b : the absolute value of a. ===========================================================================*/ #include "saclib.h" Word ABS(a) Word a; { Word b; Step1: /* Get the absolute value. */ if (a >= 0) b = a; else b = -a; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/MIPROD.c0000664002275300236100000000074714017255270013705 0ustar wcbrownscs/*====================================================================== C <- MIPROD(M,A,B) Modular integer product. Inputs M : a positive integer. A,B : elements of Z_M. Outputs C : A * B. ======================================================================*/ #include "saclib.h" Word MIPROD(M,A,B) Word M,A,B; { Word C; Step1: /* Compute. */ C = IREM(IPROD(A,B),M); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/AFCR.c0000664002275300236100000000132714017255270013421 0ustar wcbrownscs/*====================================================================== Ap <- AFCR(A) Algebraic number field element convert representation. Inputs A : in Q(alpha), represented as an element of Q[x]. Outputs Ap : in Q(alpha), represented as (a,Ab), where a is in Q and Ab is in Z[x]. A = a * Ab. ======================================================================*/ #include "saclib.h" Word AFCR(A) Word A; { Word Ab,Ap,a; Step1: /* A equal 0. */ if (A == 0) { Ap = 0; goto Return; } Step2: /* A not equal 0. */ IPSRP(1,A,&a,&Ab); Ap = LIST2(RNINV(a),Ab); Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/LBRIW.c0000664002275300236100000000102514017255270013560 0ustar wcbrownscs/*====================================================================== w <- LBRIW(I) Logarithmic binary rational interval width. Input I : a logarithmic binary rational interval. Output w : the width of I, a logarithmic binary rational number. ======================================================================*/ #include "saclib.h" Word LBRIW(I) Word I; { Word a,b,w; Step1: /* Compute difference of endpoints. */ FIRST2(I,&a,&b); w = LBRNDIF(b,a); Return: /* Return w. */ return(w); } saclib2.2.8/src/AFPHIP.c0000664002275300236100000000247714017255270013664 0ustar wcbrownscs/*====================================================================== AFPHIP(I,A; B,t) Algebraic field polynomial to hardware interval polynomial. Inputs I : a hardware interval containing an algebraic number \alpha. A : a univariate polynomial of positive degree over the algebraic number field Q(\alpha). Each nonzero coefficient of A is represented by a pair (r,a) where r is a rational number and a is an integral polynomial of degree less than the degree of \alpha. Outputs B : if t = 1, B is a hardware interval polynomial containing A(x). Otherwise t = 0 and the value of B is undefined due to exponent limitation. t : 0 or 1. ======================================================================*/ #include "saclib.h" void AFPHIP(I,A,B_,t_) interval I; Word A; interval **B_; BDigit *t_; { interval *B; BDigit i,m,t; Word a,Ap; Step1: /* Get an array for B. */ m = PDEG(A); B = GETHIPARRAY(m); Step2: /* Convert and evaluate coefficients. */ Ap = A; for (i = m; i >= 0; i--) { if (Ap == NIL || PDEG(Ap) < i) IHI(0,&B[i],&t); else { Ap = RED(Ap); ADV(Ap,&a,&Ap); ANHI(I,a,&B[i],&t); if (t == 0) goto Return; } } Return: /* Return B and t. */ *B_ = B; *t_ = t; return; } saclib2.2.8/src/IPTPR.c0000664002275300236100000000264414017255270013607 0ustar wcbrownscs/*====================================================================== C <- IPTPR(r,D,A,B) Integral polynomial truncated product. Inputs D : a list (d_1,...,d_r) of non-negative BETA-digits. r : a BETA-digit, r >= 1. A,B : in Z[X1,...,Xr]/(X1^d1,...,Xr^dr). Outputs C : in Z[X1,...,Xr]/(X1^d1,...,Xr^dr), C = A * B. ======================================================================*/ #include "saclib.h" Word IPTPR(r,D,A,B) Word r,D,A,B; { Word Ap,As,Bs,C,Cp,Dp,a,b,c,e,f,n,rp; /* hide rp; */ Step1: /* A or B zero. */ if (A == 0 || B == 0) { C = 0; goto Return; } Step2: /* Prepare general case. */ Dp = CINV(D); ADV(Dp,&n,&Dp); Dp = INV(Dp); C = 0; if (n == 0) goto Return; As = CINV(A); Bs = CINV(B); rp = r - 1; Step3: /* Multiply. */ while (Bs != NIL && SECOND(Bs) < n) { ADV2(Bs,&b,&f,&Bs); Ap = As; Cp = NIL; while (Ap != NIL && SECOND(Ap) < n - f) { ADV2(Ap,&a,&e,&Ap); if (rp == 0) c = IPROD(a,b); else c = IPTPR(rp,Dp,a,b); if (c != 0) Cp = COMP2(e + f,c,Cp); } if (Cp != NIL) C = IPSUM(r,C,Cp); } Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MAPFMUP.c0000664002275300236100000000155714017255270014020 0ustar wcbrownscs/*=========================================================================== Ap <- MAPFMUP(A) Modular array polynomial from modular univariate polynomial. Input A : a modular univariate polynomial. Output Ap: the same polynomial converted to array representation. ===========================================================================*/ #include "saclib.h" Word *MAPFMUP(A) Word A; { Word n,*Ap,As,i; Step1: /* Get array. */ n = PDEG(A); Ap = MAPGET(n); Step2: /* A = 0. */ if (A == 0) { MAPDEG(Ap) = 0; MAPCF(Ap,0) = 0; goto Return; } Step3: /* A != 0. */ MAPDEG(Ap) = n; As = A; for (i = n; i >= 0; i--) if (As == 0 || PDEG(As) != i) MAPCF(Ap,i) = 0; else { MAPCF(Ap,i) = PLDCF(As); As = PRED(As); } Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/IUPBHT.c0000664002275300236100000000170214017255270013676 0ustar wcbrownscs/*=========================================================================== B <- IUPBHT(A,k) Integral univariate polynomial binary homothetic transformation. Inputs A : in Z[X], A non-zero. k : a BETA-digit. Outputs B : in Z[X], B(X) = 2^(-h) * A(2^k*X), where h is uniquely determined so that B is an integral polynomial not divisible by 2. ===========================================================================*/ #include "saclib.h" Word IUPBHT(A,k) Word A,k; { Word Ap,B,a,b,e,h,m,n; Step1: /* Compute h. */ Ap = A; h = BETA; do { ADV2(Ap,&e,&a,&Ap); m = IORD2(a); n = k * e + m; if (n < h) h = n; } while (Ap != NIL); Step2: /* Compute B. */ Ap = A; B = NIL; do { ADV2(Ap,&e,&a,&Ap); b = ITRUNC(a,h - k * e); B = COMP2(b,e,B); } while (Ap != NIL); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPPP.c0000664002275300236100000000104414017255270013452 0ustar wcbrownscs/*====================================================================== Ab <- IPPP(r,A) Integral polynomial primitive part. Inputs r : a BETA-digit, r > 0. A : in Z[X1,...,Xr]. Outputs Ab : in Z[X1,...,Xr], the primitive part of A. ======================================================================*/ #include "saclib.h" Word IPPP(r,A) Word r,A; { Word Ab,C,s; /* hide algorithm */ Step1: /* Compute. */ IPSCPP(r,A,&s,&C,&Ab); Return: /* Prepare for return. */ return(Ab); } saclib2.2.8/src/AMUPSR.c0000664002275300236100000000130614017255270013712 0ustar wcbrownscs/*====================================================================== s <- AMUPSR(M,I,A,c) Algebraic module univariate polynomial, sign at a rational point. Inputs M : in Z[X], the minimal polynomial for an algebraic number alpha. I : an acceptable isolating interval for alpha. A : in Z[alpha,X]. c : in Q. Outputs s : a BETA-digit, s = sign(A(c)). ======================================================================*/ #include "saclib.h" Word AMUPSR(M,I,A,c) Word M,I,A,c; { Word b,s; /* hide s; */ Step1: /* Compute the sign. */ b = IPBREI(2,A,2,c); s = AMSIGN(M,I,b); Return: /* Prepare for return. */ return(s); } saclib2.2.8/src/IPEXPREAD.c0000664002275300236100000000153314017255270014226 0ustar wcbrownscs/*=========================================================================== IPEXPREAD(r,V; A,t) Integral polynomial expression read. Inputs r : a positive BETA-digit. V : a non-NIL list (x_1,...,x_r) of r distinct variables. Outputs A : in Z[x_1,...,x_r]. A is read from the input stream. t : 1 if A is successfully read in, 0 otherwise. ===========================================================================*/ #include "saclib.h" void IPEXPREAD(r,V, A_,t_) Word r,V, *A_,*t_; { Word A,A1,C,t; Step1: /* Setup. */ t = 1; A = 0; Step2: /* Read in terms. */ do { IPTERMREAD(r,V,&A1,&t); if (t == 0) goto Return; A = IPSUM(r,A,A1); C = CREADB(); BKSP(); } while (C == '+' || C == '-'); Return: /* Prepare for return. */ *A_ = A; *t_ = t; return; } saclib2.2.8/src/MIRAN.c0000664002275300236100000000076114017255270013555 0ustar wcbrownscs/*====================================================================== R <- MIRAN(M) Modular integer, random. Inputs M : a positive integer. Outputs R : a uniformly distributed random element of Z_M. ======================================================================*/ #include "saclib.h" Word MIRAN(M) Word M; { Word R; Step1: /* Compute. */ R = MIHOM(M,IRAND(ILOG2(M) + ZETA)); Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/AFPME.c0000664002275300236100000000154014017255270013533 0ustar wcbrownscs/*=========================================================================== B <- AFPME(r,M,A,b) Algebraic number field polynomial multiple evaluation. Inputs r : a BETA-digit, r >= 1. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[X1,...,Xr]. b : a list (b1,...,bk) of elements of Q(alpha), 1 <= k <= r. Outputs B : in Q(alpha)[X_{k+1},...,Xr], B = A(b1,...,bk,X_{k+1},...,Xr). ===========================================================================*/ #include "saclib.h" Word AFPME(r,M,A,b) Word r,M,A,b; { Word B,b1,bp,i; Step1: /* Evaluate. */ i = 0; bp = b; B = A; do { i++; ADV(bp,&b1,&bp); B = AFPEV(r - i + 1,M,B,1,b1); } while (bp != NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/ADV.c0000664002275300236100000000111214017255270013310 0ustar wcbrownscs/*====================================================================== ADV(L; a,Lp) Advance. Inputs L : a non-empty list. Outputs a : FIRST(L). Lp : RED(L). ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" void ADV(L, a_,Lp_) Word L, *a_,*Lp_; { Word Lp,a; /* hide algorithm */ Step1: /* Advance. */ a = FIRST(L); Lp = RED(L); Return: /* Prepare for return. */ *a_ = a; *Lp_ = Lp; return; } saclib2.2.8/src/AFUPCSFB.c0000664002275300236100000000167414017255270014104 0ustar wcbrownscs/*====================================================================== B <- AFUPCSFB(M,A) Algebraic number field univariate polynomial coarsest squarefree basis. Inputs M : in Z[x], the integral minimal polynomial of an algebraic number alpha. A : a list (A1,...,An), n >= 0, Ai in Q(alpha)[x], is a monic polynomial of positive degree. Outputs B : a list of polynomials in Q(alpha)[x], a coarsest squarefree basis for A. ======================================================================*/ #include "saclib.h" Word AFUPCSFB(M,A) Word M,A; { Word B; Word Ap,A1,As,L,L1,Ap1; Step1: /* Compute. */ As = NIL; Ap = A; while (Ap != NIL) { ADV(Ap,&A1,&Ap); L = AFUPSF(M,A1); do { ADV(L,&L1,&L); Ap1 = SECOND(L1); As = COMP(Ap1,As); } while (L != NIL); } B = AFUSPSFB(M,As); goto Return; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IDP2.c0000664002275300236100000000364014017255270013404 0ustar wcbrownscs/*=========================================================================== B <- IDP2(A,k) Integer division by power of 2. Inputs A : in Z. k : a non-negative BETA-digit. Outputs B : the integral part of A/2^k. ===========================================================================*/ #include "saclib.h" Word IDP2(A,k) Word A,k; { Word B,Ap,*As,a,ap,app,i,M,m,n,np,s; Step1: /* A=0 or k=0. */ if (A == 0 || k == 0) { B = A; goto Return; } Step2: /* A single-precision. */ if (A < BETA) { if (k >= ZETA) B = 0; else { if (A > 0) B = A >> k; else B = - (- A >> k); } goto Return; } Step3: /* Reduce to the case k < ZETA. */ Ap = A; n = k; while (n >= ZETA && Ap != NIL) { Ap = RED(Ap); n = n - ZETA; } if (Ap == NIL) { B = 0; goto Return; } if (n == 0) { if (RED(Ap) == NIL) B = FIRST(Ap); else B = Ap; goto Return; } Step4: /* Ap single-precision. */ if (RED(Ap) == NIL) { a = FIRST(Ap); if (a < 0) B = - ((-a) >> n); else B = a >> n; goto Return; } Step5: /* Put A' into array and get sign. */ m = LENGTH(Ap); As = GETARRAY(m); for (i = 0; i < m; i++) { As[i] = FIRST(Ap); Ap = RED(Ap); } s = As[m - 1]; Step6: /* Shift right n bits. */ np = ZETA - n; M = (01 << n) - 1; if (s > 0) { ap = As[0] >> n; for (i = 1; i < m; i++) { app = (As[i] & M) << np; As[i - 1] = ap | app; ap = As[i] >> n; } As[m - 1] = ap; } else { ap = (- As[0]) >> n; for (i = 1; i < m; i++) { app = ((- As[i]) & M) << np; As[i - 1] = -(ap | app); ap = -(As[i]) >> n; } As[m - 1] = - ap; } Step7: /* Transfer result to a list. */ B = IFATL(As,m,1); Step8: /* Return array. */ FREEARRAY(As); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/RPDIF.c0000664002275300236100000000331314017255270013547 0ustar wcbrownscs/*====================================================================== C <- RPDIF(r,A,B) Rational polynomial difference. Inputs A, B : in Q[X1,...,Xr]. r : a BETA-digit, r >= 0. Outputs C : in Q[X1,...,Xr], C = A - B. ======================================================================*/ #include "saclib.h" Word RPDIF(r,A,B) Word r,A,B; { Word Ap,Bp,C,Cp,Cpp,a,b,c,e,f,rp; Step1: /* A or B zero. */ if (A == 0) { C = RPNEG(r,B); goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* r=0. */ if (r == 0) { C = RNDIF(A,B); goto Return; } Step3: /* General case. */ Ap = A; Bp = B; Cp = NIL; rp = r - 1; do { e = FIRST(Ap); f = FIRST(Bp); if (e > f) { ADV2(Ap,&e,&a,&Ap); Cp = COMP2(a,e,Cp); } else if (e < f) { ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = RNNEG(b); else c = RPNEG(rp,b); Cp = COMP2(c,f,Cp); } else { ADV2(Ap,&e,&a,&Ap); ADV2(Bp,&f,&b,&Bp); if (rp == 0) c = RNDIF(a,b); else c = RPDIF(rp,a,b); if (c != 0) Cp = COMP2(c,e,Cp); } } while (Ap != NIL && Bp != NIL); Step4: /* Finish. */ if (Ap == NIL && Bp == NIL) Cpp = NIL; else if (Ap == NIL) Cpp = RPNEG(r,Bp); else Cpp = Ap; C = INV(Cp); if (C == NIL) C = Cpp; else SRED(Cp,Cpp); if (C == NIL) C = 0; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/MUPRES.c0000664002275300236100000000263614017255270013725 0ustar wcbrownscs/*====================================================================== c <- MUPRES(p,A,B) Modular univariate polynomial resultant. Inputs p : a prime BETA-digit. A,B : univariate polynomials over Z_p having positive degrees. Output c : the resultant of A and B, an element of Z_p. ======================================================================*/ #include "saclib.h" Word MUPRES(p,A,B) BDigit p; Word A,B; { BDigit c,d,i,k,m,n,s; Word *C,*D,*E, *Cp, *Dp; Step1: /* Convert A and B to array representation. */ Cp = C = MAPFMUP(A); Dp = D = MAPFMUP(B); Step2: /* Initialize the product, c, and the sign, s. */ c = 1; s = +1; m = MAPDEG(C); n = MAPDEG(D); if (m < n) { E = C; C = D; D = E; if (ODD(m) && ODD(n)) s = -1; } Step3: /* Compute the natural PRS of A and B. */ do { m = MAPDEG(C); n = MAPDEG(D); if (ODD(m) && ODD(n)) s = -s; while (MAPDEG(C) >= MAPDEG(D)) MAPRS(p,C,D); if (MAPZERO(C)) { c = 0; goto Return; } k = MAPDEG(C); d = MAPLDCF(D); for (i = 1; i <= m - k; i++) c = MDPROD(p,c,d); E = C; C = D; D = E; } while (k != 0); Step4: /* Multiply by power of last leading coefficient and fix sign. */ d = MAPLDCF(D); for (i = 1; i <= n; i++) c = MDPROD(p,c,d); if (s < 0) c = MDNEG(p,c); Return: /* Return c. */ MAPFREE(Cp); MAPFREE(Dp); return(c); } saclib2.2.8/src/LEINST.c0000664002275300236100000000163414017255270013705 0ustar wcbrownscs/*====================================================================== L <- LEINST(A,i,a) List element insertion. Inputs A : a list ( a1,...,an ) of objects i : a BETA-integer, 0 <= i <= n a : an object. Outputs L : a list obtained from A by inserting the object a after the i-th element of A. The list A is modified. If n=0 then L = (a,a1,...,an ). ======================================================================*/ #include "saclib.h" Word LEINST(A,i,a) Word A,i,a; { Word Ap,App,L,j; /* hide j; */ Step1: /* i=0. */ if (i == 0) { L = COMP(a,A); goto Return; } Step2: /* i > 0. */ L = A; Ap = A; for (j = 2; j <= i; j++) Ap = RED(Ap); App = RED(Ap); App = COMP(a,App); SRED(Ap,App); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/VMIN.c0000664002275300236100000000143014017255270013452 0ustar wcbrownscs/*====================================================================== W <- VMIN(U,V) Vector minimum. Inputs U,V : lists of BETA-digits, U=(u1,...,ur) and V=(v1,...,vr). r : a BETA-digit, r >= 1. Outputs W : a list of BETA-digits, W=(w1,...,wr) where wi = min(ui,vi). ======================================================================*/ #include "saclib.h" Word VMIN(U,V) Word U,V; { Word Us,Vs,W,u,v,w; /* hide Us,Vs,u,v,w; */ Step1: /* Compute. */ W = NIL; Us = U; Vs = V; do { ADV(Us,&u,&Us); ADV(Vs,&v,&Vs); w = MIN(u,v); W = COMP(w,W); } while (!(Us == NIL)); W = INV(W); Return: /* Prepare for return. */ return(W); } saclib2.2.8/src/IPBHTMV.c0000664002275300236100000000214014017255270014011 0ustar wcbrownscs/*=========================================================================== B <- IPBHTMV(r,A,k) Integral polynomial binary homothetic transformation, main variable. Inputs r : a BETA-digit. r >= 0. A : an element of Z[x_1,...,x_r]. k : a Beta-digit. Outputs B : an element of Z[x_1,...,x_r]. If k >= 0 then B(x_1,...,x_r) = A(x_1,...,2^k x_r). If k < 0 then B(x_1,...,x_r) = 2^{-km}A(x_1,...,2^k x_r), where m = deg(A). ===========================================================================*/ #include "saclib.h" Word IPBHTMV(r,A,k) Word r,A,k; { Word B; Word Ap,a,b,e,h,m,rp; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r = 1. */ if (r == 1) { B = IUPBHT(A,k); goto Return; } Step3: /* r > 1. */ Ap = A; rp = r - 1; m = PDEG(A); B = NIL; if (k >= 0) h = 0; else h = m * k; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = IPP2P(rp,a,k * e - h); B = COMP2(b,e,B); } B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MRFMAP.c0000664002275300236100000000145514017255270013672 0ustar wcbrownscs/*========================================================================== MRFMAP(A,n,M,r) Matrix row from modular array polynomial. Inputs A : a modular array polynomial. n : a positive BETA-digit, deg(A) < n. M : an n*n matrix. r : a BETA-digit, 0 <= r < n. Side effect The coefficients of A are stored in the rth row of M, i.e., MATELT(M,r,i) will be set to the coefficient of x^i in A. ===========================================================================*/ #include "saclib.h" void MRFMAP(A,n,M,r) Word *A,n,**M,r; { Word i,m; Step1: /* Put coefficients in rth row. */ m = MAPDEG(A); for (i = 0; i <= m; i++) MATELT(M,r,i) = MAPCF(A,i); for (i = m + 1; i < n; i++) MATELT(M,r,i) = 0; Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPRRIS.c0000664002275300236100000000265314017255270013721 0ustar wcbrownscs/*===================================================================== L <- IPRRIS(A) Integral polynomial real root isolation, Sturm method. Inputs A : in Z[x], non-zero, squarefree. Outputs L : a list (I_1,...,I_r) of isolating intervals for all of the real roots of A, with I_1 < I_2 < ... < I_r. Each I_j is either an open or a one-point logarithmic standard interval. ======================================================================*/ #include "saclib.h" Word IPRRIS(A) Word A; { Word Ap,Ab,b,bp,L,L1,s,S,S1,S2,t,v1,v2; Step1: /* Compute a primitive Sturm sequence S. */ Ab = IPIPP(1,A); Ap = IPIPP(1,IPDMV(1,Ab)); S = IPPNPRS(Ab,Ap); Step2: /* Isolate positive roots. */ b = IUPPRB(Ab); L = NIL; S1 = IPLSEVAL(S,0); v1 = VAR(S1); if (b == 0) goto Step3; S2 = IPLSEVAL(S,b); v2 = VAR(S2); s = FIRST(S2); L = IPRRISS(S,0,b,v1,v2,s); Step3: /* Is 0 a root? */ t = FIRST(S1); if (t == 0) L = COMP(LIST2(0,0),L); Step4: /* Isolate negative roots. */ Ab = IUPNT(Ab); b = IUPPRB(Ab); if (b == 0) goto Return; bp = LBRNNEG(b); S2 = IPLSEVAL(S,bp); v2 = VAR(S2); s = FIRST(S1); L1 = IPRRISS(S,bp,0,v2,v1,s); Step5: /* Concatenate isolation lists. */ L = CONC(L1,L); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/AIZERO.c0000664002275300236100000000077414017255270013704 0ustar wcbrownscs/*======================================================================== t = AIZERO(A) Array integer zero. Input A : an integer in array representation. Output t : a BETA digit. t = 1 if A = 0; t = 0 otherwise. ========================================================================*/ #include "saclib.h" BDigit AIZERO(A) BDigit *A; { BDigit t; Step1: /* Check the sign. */ if (A[0] == 0) t = 1; else t = 0; Return: /* Return t. */ return(t); } saclib2.2.8/src/RED4.c0000664002275300236100000000074314017255270013405 0ustar wcbrownscs/*====================================================================== M <- RED4(L) Reductum 4. Inputs L : list of length 4 or more. Outputs M : the fourth reductum of L. ======================================================================*/ #include "saclib.h" Word RED4(L) Word L; { Word M; /* hide algorithm */ Step1: /* Compute. */ M = RED(RED(RED(RED(L)))); Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/RNFMRPP.c0000664002275300236100000000263214017255270014032 0ustar wcbrownscs/*=========================================================================== R <- RNFMRPP(M,Mp,m,p,u) Rational number from modular residue, modulus a power of a prime. Inputs M : in Z, M = p^k, for some k >= 1, and M odd. [That M is odd is used in certain inequality tests.] Mp: in Z, Mp = floor((M/2)^(1/2)). m : a BETA-digit, m = ILOG2(Mp). p : a BETA-digit, p prime, p < 2^15. U : in Z/(M). Outputs R : in Q, or R = NIL. If there exist integers A and B such that (1) A = B U (mod M), (2) 1 <= B < (M/2)^(1/2), |A| < (M/2)^(1/2), and (3) gcd(A,B) = gcd(B,M) = 1, then R = A / B; otherwise R = NIL. If such A and B exist, they are unique. ===========================================================================*/ #include "saclib.h" #define MAXB 200 Word RNFMRPP(M,Mp,m,p,U) Word M,Mp,m,p,U; { Word B,Bp[MAXB],*Bt,R,o,n,s; Step1: /* Solve the congruence. */ R = ISMC(M,Mp,m,U); if (R == NIL || R == 0) goto Return; Step2: /* Check the denominator. */ B = SECOND(R); if (B < BETA) { if ((B % p) == 0) R = NIL; } else { IFLTA(B,Bp,MAXB,&Bt,&n,&s,&o); if (IHDREM(Bt,n,p) == 0) R = NIL; if (n > MAXB) FREEARRAY(Bt); } Return: /* Prepare for return. */ return(R); } saclib2.2.8/src/IPSQRT.c0000664002275300236100000000322514017255270013727 0ustar wcbrownscs/*========================================================================== B <- IPSQRT(r,A) Integral polynomial square root. Inputs r : a BETA-digit, r >= 0, the number of variables; A : in Z[X1,...,Xr]. Output B : in Z[X1,...,Xr]. If A has a square root then B is the positive or zero square root of A. Otherwise, B = NIL. ==========================================================================*/ #include "saclib.h" Word IPSQRT(r,A) Word r,A; { Word B,B1,B1s,B1b,s,t,m,n,a,rp,b,Ap,bb,mp,np,ap,bp,C; Step1: /* A <= 0? */ if (A == 0) { B = 0; goto Return; } s = IPSIGN(r,A); if (s < 0) { B = NIL; goto Return; } Step2: /* r == 0? */ if (r == 0) { ISQRT(A,&B,&t); if (t != 0) B = NIL; goto Return; } Step3: /* Compute leading term of B, if it exists. */ m = PDEG(A); QREM(m,2,&n,&t); if (t != 0) { B = NIL; goto Return; } a = PLDCF(A); rp = r - 1; b = IPSQRT(rp,a); if (b == NIL) { B = NIL; goto Return; } B = PMON(b,n); Ap = PRED(A); Step4: /* Compute successive terms of B. */ bb = IPIP(rp,2,b); while (Ap != 0) { mp = PDEG(Ap); np = mp - n; if (np < 0) { B = NIL; goto Return; } ap = PLDCF(Ap); if (rp > 0) IPQR(rp,ap,bb,&bp,&t); else IQR(ap,bb,&bp,&t); if (t != 0) { B = NIL; goto Return; } B1 = PMON(bp,np); B1b = IPIP(r,2,B1); C = IPPROD(r,B,B1b); B = IPSUM(r,B,B1); B1s = IPPROD(r,B1,B1); C = IPSUM(r,C,B1s); Ap = IPDIF(r,Ap,C); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/AFICR.c0000664002275300236100000000141414017255270013527 0ustar wcbrownscs/*====================================================================== Ap <- AFICR(A) Algebraic number field element inverse convert representation. Inputs A : in Q(alpha), represented as (a,Ab), where a is an element of Q and Ab is an element of Z[x]. Outputs Ap : in Q(alpha), represented as an element of Q[x]. Ap = a * Ab. ======================================================================*/ #include "saclib.h" Word AFICR(A) Word A; { Word Ab,Ap,a; Step1: /* A equal 0. */ if (A == 0) { Ap = 0; goto Return; } Step2: /* A not equal 0. */ FIRST2(A,&a,&Ab); Ab = RPFIP(1,Ab); Ap = RPRNP(1,a,Ab); Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/MAPGCD.c0000664002275300236100000000167014017255270013642 0ustar wcbrownscs/*=========================================================================== C <- MAPGCD(p,A,B) Modular array polynomial greatest common divisor. Inputs p : a prime beta digit. A,B : modular array polynomials over Z_p, both non-zero. Outputs C : the greatest common divisor of A and B, a modular array polynomial over Z_p. ===========================================================================*/ #include "saclib.h" Word *MAPGCD(p,A,B) BDigit p; Word *A,*B; { Word *C,*D,*E,*T; Step1: /* Copy A and B to D and E. */ D = MAPCOPY(A); E = MAPCOPY(B); Step2: /* Compute remainders. */ do { while (MAPDEG(D) >= MAPDEG(E)) MAPRS(p,D,E); T = D; D = E; E = T; } while (MAPDEG(E) > 0); Step3: /* Make the result monic. */ if (MAPZERO(E)) C = MAPMON(p,D); else C = MAPMON(p,E); Step4: /* Free arrays. */ MAPFREE(D); MAPFREE(E); Return: /* Return C. */ return(C); } saclib2.2.8/src/LIST2.c0000664002275300236100000000136314017255270013543 0ustar wcbrownscs/*====================================================================== L <- LIST2(a,b) List, 2 elements. Inputs a,b : objects. Outputs L : the list (a,b). ======================================================================*/ #include "saclib.h" Word LIST2(a,b) Word a,b; { Word L,M; Step1: /* Store a. */ L = AVAIL; if (L == NIL) { GC(); goto Step1; } SFIRST(L,a); Step2: /* Store b. */ M = RED(L); if (M == NIL) { GC(); goto Step1; } SFIRST(M,b); Step3: /* Set AVAIL to reductum of M. */ AVAIL = RED(M); Step4: /* Set reductum of M to NIL. */ SRED(M,NIL); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/AFPDMV.c0000664002275300236100000000222114017255270013655 0ustar wcbrownscs/*====================================================================== B <- AFPDMV(r,M,A) Algebraic number field polynomial derivative, main variable. Inputs r : a BETA-digit, r >= 1. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[X1,...,Xr]. Outputs B : in Q(alpha)[X1,...,Xr]. B is the derivative of A with respect to its main variable. ======================================================================*/ #include "saclib.h" Word AFPDMV(r,M,A) Word r,M,A; { Word Ap,B,a,b,e,ep,rp; /* hide a,ep,rp; */ Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* General case. */ Ap = A; rp = r - 1; B = NIL; do { ADV2(Ap,&e,&a,&Ap); if (rp == 0) b = AFPROD(M,AFFINT(e),a); else b = AFPAFP(rp,M,AFFINT(e),a); ep = e - 1; if (e != 0) B = COMP2(b,ep,B); } while (Ap != NIL); B = INV(B); if (B == NIL) B = 0; Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPRIMO.c0000664002275300236100000000224114017255270013701 0ustar wcbrownscs/*====================================================================== L <- IPRIMO(A,Ap,I) Integral polynomial real root isolation, modified Uspensky method, open interval. Inputs A : in Z[X], without multiple roots. Ap : the derivative of A. I : an open interval (a,b) with binary rational endpoints, represented by the list (a,b), such that there are integers h and k for which a = h 2^k and b = (h+1) 2^k. Outputs L : a list (I1,...,Ir) of isolating intervals for the real roots of A in I. Each Ij is a left open right closed interval with binary rational endpoints and I1 < I2 < ... < Ir. ======================================================================*/ #include "saclib.h" Word IPRIMO(A,Ap,I) Word A,Ap,I; { Word J,L,b,c; /* hide J,b,c; */ Step1: L = IPRIMS(A,Ap,I); if (L != NIL) { L = INV(L); J = FIRST(L); b = SECOND(I); c = SECOND(J); if (RNCOMP(b,c) == 0 && IUPBES(A,b) == 0) L = RED(L); L = INV(L); } Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/LSILW.c0000664002275300236100000000136114017255270013576 0ustar wcbrownscs/*====================================================================== w <- LSILW(I) Logarithmic standard interval - logarithm of width. Inputs I : an open logarithmic standard interval. Outputs w : a BETA-integer. Width(I) = 2^w. ======================================================================*/ #include "saclib.h" Word LSILW(I) Word I; { Word a,b,k,l,w; Step1: /* Consider three cases. */ FIRST2(I,&a,&b); if (a == 0) w = -SECOND(b); else { if (b == 0) w = -SECOND(a); else { k = SECOND(a); l = SECOND(b); w = -maxm(k,l); } } Return: /* Prepare for return. */ return(w); } saclib2.2.8/src/IPDQNR.c0000664002275300236100000000242714017255270013705 0ustar wcbrownscs/*=========================================================================== IPDQNR(r,A,m; Q,R) Integral polynomial digit quotient and non-negative remainder. Inputs r : a BETA-digit, r >= 0. A : in Z[x_1,...,x_r]. m : a BETA-digit, m >= 2. Outputs Q : in Z[x_1,...,x_r]. R : in Z[x_1,...,x_r]. Q and R satisfy A = m Q + R. Each coefficient of R is in [0,...,m-1]. ===========================================================================*/ #include "saclib.h" void IPDQNR(r,A,m,Q_,R_) Word r,A,m,*Q_,*R_; { Word Ap,A1,e,Q,Q1,R,R1,rp; Step1: /* A = 0. */ if (A == 0) { Q = 0; R = 0; goto Return; } Step2: /* r = 0. */ if (r == 0) { IDQR(A,m,&Q,&R); if (R < 0) { R = m + R; Q = IDIF(Q,1); } goto Return; } Step3: /* Loop though the coefficients. */ Ap = A; Q = R = NIL; rp = r - 1; do { A1 = PLDCF(Ap); e = PDEG(Ap); IPDQNR(rp,A1,m,&Q1,&R1); if (Q1 != 0) Q = COMP2(Q1,e,Q); if (R1 != 0) R = COMP2(R1,e,R); Ap = PRED(Ap); } while (Ap != 0); Step4: /* Clean up. */ if (Q == NIL) Q = 0; else Q = INV(Q); if (R == NIL) R = 0; else R = INV(R); Return: /* Prepare for return. */ *Q_ = Q; *R_ = R; } saclib2.2.8/src/LBRNFEC.c0000664002275300236100000000155214017255270013761 0ustar wcbrownscs/*====================================================================== t <- LBRNFEC(B,p,A) Logarithmic binary rational to floating, exact conversion. Inputs B : a logarithmic binary rational number. p : a beta digit, the desired precision. A : an array of size at least p + 3. Output t : 0 or 1. Effect If t = 0, B could not be exactly converted to a p-precision software float and the content of A is undefined. If t = 1, the p-precision software float equal to B is placed in A. ========================================================================*/ #include "saclib.h" BDigit LBRNFEC(B,p,A) Word B; BDigit p,*A; { Word b; BDigit e,t; Step1: /* Apply IFEC. */ if (B == 0) t = IFEC(0,p,A); else { FIRST2(B,&b,&e); t = IFEC(b,p,A); A[0] = A[0] - e; } Return: /* Return t. */ return(t); } saclib2.2.8/src/IPHDMV.c0000664002275300236100000000136314017255270013675 0ustar wcbrownscs/*====================================================================== B <- IPHDMV(r,A,k) Integral polynomial higher derivative, main variable. Inputs r : a BETA-digit, r >= 1, the number of variables. A : in Z[X1,...,Xr]. k : BETA-digit, k >= 0. Outputs B : in Z[X1,...,Xr], the k-th derivative of A with respect to its main variable. ======================================================================*/ #include "saclib.h" Word IPHDMV(r,A,k) Word r,A,k; { Word B,i; /* hide i; */ Step1: /* Compute. */ B = A; i = k; while (i > 0 && B != 0) { B = IPDMV(r,B); i = i - 1; } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IPRPRS.c0000664002275300236100000000215514017255270013725 0ustar wcbrownscs/*=========================================================================== S <- IPRPRS(r,A,B) Integral polynomial reduced polynomial remainder sequence. Inputs r : a BETA-digit, r > 0. A,B : in Z[x_1,...,x_r], A and non-zero, deg(A) >= deg(B). Outputs S : a list of elements in Z[x_1,...,x_r], the reduced polynomial remainder sequence of A and B. ===========================================================================*/ #include "saclib.h" Word IPRPRS(r,A,B) Word r,A,B; { Word A1,A2,A3,S,a1,as1,d,i,n1,n2; Step1: /* Compute. */ A1 = A; A2 = B; S = LIST2(A2,A1); d = -1; do { A3 = IPPSR(r,A1,A2); if (A3 == 0) { S = INV(S); goto Return; } if (d >= 0) { a1 = PLDCF(A1); as1 = a1; for (i = 1; i <= d; i++) if (r == 1) as1 = IPROD(as1,a1); else as1 = IPPROD(r - 1,as1,a1); as1 = PMON(as1,0); A3 = IPEQ(r,A3,as1); } S = COMP(A3,S); n1 = PDEG(A1); n2 = PDEG(A2); d = n1 - n2; A1 = A2; A2 = A3; } while (1); Return: /* Prepare for return. */ return(S); } saclib2.2.8/src/HISIGN.c0000664002275300236100000000120214017255270013657 0ustar wcbrownscs/*====================================================================== s <- HISIGN(I) Hardware interval sign. Inputs I : a hardware interval. Outputs s : If 0 is not in I then s = sign(I). Otherwise s = NIL. ======================================================================*/ #include "saclib.h" Word HISIGN(I) interval I; { Word s; Step1: /* Determine sign. */ if (I.left > 0) s = 1; else if (I.right < 0) s = -1; else if (I.left == 0 && I.right == 0) s = 0; else s = NIL; Return: /* Return s. */ return(s); } saclib2.2.8/src/MPGCDC.c0000664002275300236100000001001014017255270013630 0ustar wcbrownscs/*====================================================================== MPGCDC(r,p,A,B; C,Ab,Bb) Modular polynomial greatest common divisor and cofactors. Inputs r : a BETA-digit, r > 0. p : a BETA-digit, prime. A,B : in Z/(p)[X1,...,Xr]. Outputs C,Ab,Bb : in Z/(p)[X1,...,Xr], C = gcd(A,B). If C is non-zero then Ab = A/C and Bb = B/C. Otherwise Ab = 0 and Bb = 0. ======================================================================*/ #include "saclib.h" void MPGCDC(r,p,A,B, C_,Ab_,Bb_) Word r,p,A,B, *C_,*Ab_,*Bb_; { Word Ab,Ah,Ahs,Ap,As,Bb,Bh,Bhs,Bp,Bs,C,Chs,Cp,Cs,Q,U,Us,V,Vs, W,Ws,a,ab,ah,ap,b,bb,bh,bp,c,ch,chp,cp,cpp,cs,d,e,f,g,qp, rp,t; /* hide Us,Vs,ap,bp,cp,cpp,d,e,f,g,qp,rp,t; */ Step1: /* A=B=0. */ if (A == 0 && B == 0) { C = 0; Ab = 0; Bb = 0; goto Return; } Step2: /* A=0 or B=0. */ if (A == 0) { b = PLBCF(r,B); C = MPMON(r,p,B); Ab = 0; Bb = PINV(0,b,r); goto Return; } if (B == 0) { a = PLBCF(r,A); C = MPMON(r,p,A); Bb = 0; Ab = PINV(0,a,r); goto Return; } Step3: /* r=1. */ if (r == 1) { C = MUPGCD(p,A,B); Ab = MPQ(r,p,A,C); Bb = MPQ(r,p,B,C); goto Return; } Step4: /* Compute univariate contents and primitive parts. */ Ap = 0; Bp = 0; Cp = 0; Q = 0; MPUCPP(r,p,A,&a,&Ah); MPUCPP(r,p,B,&b,&Bh); c = MUPGCD(p,a,b); Step5: /* Compute normalization factor. */ rp = r - 1; ah = PLBCF(rp,Ah); bh = PLBCF(rp,Bh); ch = MUPGCD(p,ah,bh); Step6: /* Compute degrees. */ U = PDEGV(rp,Ah); V = PDEGV(rp,Bh); e = PDEGSV(r,Ah,1); f = PDEGSV(r,Bh,1); g = PDEG(ch) + MAX(e,f); Step7: /* Initialize element and degree vector. */ d = -1; W = COMP(FIRST(U) + 1,RED(U)); Step8: /* Obtain next element. */ d = d + 1; if (d == p) FAIL("MPGCDC","Elements of Z_p exhausted",r,p,A,B); Step9: /* Map normalization factor. */ cs = MPEMV(1,p,ch,d); if (cs == 0) goto Step8; Step10: /* Map Ah and Bh. */ As = MPEVAL(r,p,Ah,1,d); Us = PDEGV(rp,As); if (EQUAL(U,Us) == 0) goto Step8; Bs = MPEVAL(r,p,Bh,1,d); Vs = PDEGV(rp,Bs); if (EQUAL(V,Vs) == 0) goto Step8; Step11: /* Compute g.c.d. */ MPGCDC(rp,p,As,Bs,&Cs,&Ahs,&Bhs); Step12: /* Test for constant g.c.d. */ if (IPONE(rp,Cs) == 1) { C = PINV(0,c,rp); Ab = MPUQ(r,p,A,c); Bb = MPUQ(r,p,B,c); goto Return; } Step13: /* Conditional initialization of interpolation process. */ Ws = PDEGV(rp,Cs); t = VCOMP(W,Ws); if (t >= 2) { Q = LIST2(0,1); Ap = 0; Bp = 0; Cp = 0; W = VMIN(W,Ws); } Step14: /* Test for unlucky element. */ if (t == 1 || t == 3 || (t == 0 && PDEG(Q) > g)) goto Step8; Step15: /* Interpolate. */ Chs = MPMDP(rp,p,cs,Cs); qp = MDINV(p,MPEMV(1,p,Q,d)); Cp = MPINT(p,Q,d,qp,r,Cp,Chs); Ap = MPINT(p,Q,d,qp,r,Ap,Ahs); Bp = MPINT(p,Q,d,qp,r,Bp,Bhs); Q = MPPROD(1,p,Q,LIST4(1,1,0,MDNEG(p,d))); Step16: /* Test for completion. */ if (PDEG(Q) <= g) goto Step8; cp = PDEGSV(r,Cp,1); ap = PDEGSV(r,Ap,1); bp = PDEGSV(r,Bp,1); cpp = MAX(ap,bp); if (PDEG(Q) <= cp + cpp) goto Step8; Step17: /* Remove normalization. */ MPUCPP(r,p,Cp,&cp,&C); chp = MPQ(1,p,ch,cp); Ab = MPUQ(r,p,Ap,chp); Bb = MPUQ(r,p,Bp,chp); C = MPUP(r,p,c,C); ab = MPQ(1,p,a,c); Ab = MPUP(r,p,ab,Ab); bb = MPQ(1,p,b,c); Bb = MPUP(r,p,bb,Bb); Return: /* Prepare for return. */ *C_ = C; *Ab_ = Ab; *Bb_ = Bb; return; } saclib2.2.8/src/AMUPVARIR.c0000664002275300236100000000225514017255270014255 0ustar wcbrownscs/*====================================================================== AMUPVARIR(M,I,A; n,J) Algebraic module univariate polynomial variations, interval refinement. Inputs M : an element of Z[X]. M is the integral minimal polynomial of a real algebraic number alpha. I : I is an acceptable isolating interval for alpha. A : an element of Z[alpha][X]. A /= 0. Outputs n : a BETA-digit, n = min(var(A),2). J : an acceptable isolating interval for alpha contained in I. ======================================================================*/ #include "saclib.h" void AMUPVARIR(M,I,A, n_,J_) Word M,I,A; Word *n_,*J_; { Word n,J; Word Ap,a,e,s,t; Step1: /* Count coefficient sign variations and stop when two are obtained. */ n = 0; Ap = A; ADV2(Ap,&e,&a,&Ap); AMSIGNIR(M,I,a,&s,&J); while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); AMSIGNIR(M,J,a,&t,&J); if (s != t) { n = n + 1; s = t; if (n > 1) goto Return; } } Return: *n_ = n; *J_ = J; return; } saclib2.2.8/src/IABSF.c0000664002275300236100000000104314017255270013525 0ustar wcbrownscs/*====================================================================== B <- IABSF(A) Integer absolute value function. Inputs A : integer. Outputs B : the absolute value of A. ======================================================================*/ #include "saclib.h" Word IABSF(A) Word A; { Word B,s; /* hide algorithm */ Step1: /* Compute. */ s = ISIGNF(A); if (s >= 0) B = A; else B = INEG(A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/HIPSV.c0000664002275300236100000000241414017255270013575 0ustar wcbrownscs/*====================================================================== v <- HIPSV(n,A) Hardware interval polynomial sign variations. Inputs n : a beta-digit, n >= 0. A : a hardware interval polynomial polynomial of degree n. Output v : a beta-digit indicating the number of sign variations in A, as follows. If v = 0 or v = 1, the number of variations is v. If v = 2, the number of variations is at least 2. Otherwise v = -1, indicating that the program could not determine which of these three possibilities is the case. ======================================================================*/ #include "saclib.h" Word HIPSV(n,A) BDigit n; interval *A; { BDigit h,i,k,s,t,v; Step1: /* Initialize. */ h = 0; k = 0; i = 0; s = HISIGN(A[0]); if (s == 0) { i = 1; s = HISIGN(A[1]); } Step2: /* Process one coefficient. */ i = i + 1; if (i > n) goto Step3; t = HISIGN(A[i]); if (t == 0) goto Step2; if (t != NIL) { if (s == t) goto Step2; if (s == -t) h = h + 1; } k = k + 1; s = t; Step3: /* Check for termination. */ if (h >= 2) { v = 2; goto Return; } if (i < n) goto Step2; if (h == k) v = h; else v = -1; Return: /* Return v. */ return(v); } saclib2.2.8/src/DLOG2.c0000664002275300236100000000115014017255270013507 0ustar wcbrownscs/*=========================================================================== n <- DLOG2(a) Digit logarithm, base 2. Inputs a : a BETA-digit. Outputs n : a BETA-digit. If a = 0 then n = 0. Otherwise n = floor(log2(|a|)) + 1, the bit-length of a. ===========================================================================*/ #include "saclib.h" Word DLOG2(a) Word a; { Word ab,n; Step1: /* a = 0. */ if (a == 0) { n = 0; goto Return; } Step2: /* Use PDLOG2. */ ab = absm(a); n = PDLOG2(ab); Return: /* Prepare for return. */ return(n); } saclib2.2.8/src/AGICOPY.c0000664002275300236100000000101614017255270013774 0ustar wcbrownscs/*======================================================================== AGICOPY(A,B) Array Gaussian integer copy. Inputs A : an array Gaussian integer. B : a Gaussian integer array large enough to hold A. Effect A copy of A is placed in B. ========================================================================*/ #include "saclib.h" void AGICOPY(A,B) BDigit **A,**B; { Step1: /* Copy the parts. */ AICOPY(A[0],B[0]); AICOPY(A[1],B[1]); Return: /* Return. */ return; } saclib2.2.8/src/FOURTH.c0000664002275300236100000000073214017255270013714 0ustar wcbrownscs/*====================================================================== a <- FOURTH(L) Fourth. Inputs L : list of length 4 or more. Outputs a : the fourth element of L. ======================================================================*/ #include "saclib.h" Word FOURTH(L) Word L; { Word a; /* hide algorithm */ Step1: /* Get it. */ a = FIRST(RED3(L)); Return: /* Prepare for return. */ return(a); } saclib2.2.8/src/PFFGEN.c0000664002275300236100000000165514017255270013657 0ustar wcbrownscs/*======================================================================= a <- PFFGEN(p) Prime finite field generator. Inputs p : a prime beta digit. Output a : the least primitive element of Z_p. ========================================================================*/ #include "saclib.h" BDigit PFFGEN(p) BDigit p; { BDigit a,b,d,e,pp; Word L,Lp,M; Step1: /* p = 2 */ if (p == 2) { a = 1; goto Return; } Step2: /* Let p' = p - 1. Make a list L of all p'/d such that d is a prime divisor of p'. */ pp = p - 1; L = IFACT(pp); M = LFML(L); L = NIL; do { ADV(M,&d,&M); L = COMP(pp/d,L); } while (M != NIL); Step3: /* Search for a primitive element. */ for (a = 2; a < p; a++) { Lp = L; do { ADV(Lp,&e,&Lp); b = MDEXP(p,a,e); } while (Lp != NIL && b != 1); if (Lp == NIL && b != 1) goto Return; } Return: /* Return a. */ return(a); } saclib2.2.8/src/CINV.c0000664002275300236100000000115214017255270013441 0ustar wcbrownscs/*====================================================================== M <- CINV(L) Constructive inverse. Inputs L : a list. Outputs M : a list, the inverse of L. M is constructed using COMP. ======================================================================*/ #include "saclib.h" Word CINV(L) Word L; { Word Lp,M,a; /* hide Lp,a; */ Step1: /* Construct. */ M = NIL; Lp = L; while (Lp != NIL) { ADV(Lp,&a,&Lp); M = COMP(a,M); } goto Return; Return: /* Prepare for return. */ return(M); } saclib2.2.8/src/DLSUM.c0000664002275300236100000000123214017255270013565 0ustar wcbrownscs/*======================================================================= c <- DLSUM(a,b) Discrete logarithm sum. Inputs a, b : elements of a finite field represented as discrete logarithms. Output c : a + b, the finite field sum. =======================================================================*/ #include "saclib.h" BDigit DLSUM(a,b) BDigit a,b; { BDigit c,d; Step1: /* c = b * ( a / b + 1). */ if (a == 0) c = b; else if (b == 0) c = a; else { d = a - b; if (d <= 0) d = d + FFSIZE; c = b + FFPLUS1[d]; if ( c > FFSIZE) c = c - FFSIZE; } Return: /* Return c. */ return(c); } saclib2.2.8/src/IMIN.c0000664002275300236100000000103014017255270013431 0ustar wcbrownscs/*====================================================================== c <- IMIN(a,b) Integer minimum. Inputs a, b : in Z. Outputs c : the minimum of a and b. ======================================================================*/ #include "saclib.h" Word IMIN(a,b) Word a,b; { Word c,s; /* hide algorithm */ Step1: /* Compute. */ s = ICOMP(a,b); if (s <= 0) c = a; else c = b; Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/REDI.c0000664002275300236100000000105114017255270013423 0ustar wcbrownscs/*====================================================================== B <- REDI(A,i) Reductum. Inputs A : list i : integer, 0 <= i <= LENGTH(A). Outputs B : the i-th reductum of A. If i=0 then B=A. ======================================================================*/ #include "saclib.h" Word REDI(A,i) Word A,i; { Word B,j; /* hide algorithm */ Step1: /* Compute. */ B = A; for (j = 1; j <= i; j++) B = RED(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/IFATL.c0000664002275300236100000000255414017255270013550 0ustar wcbrownscs/*=========================================================================== B <- IFATL(A,m,s) Integer from array to list. Inputs m : a positive beta integer. A : An array of length m containing an integer A'. s : +1 or -1. Output B : The integer s * A' in list representation. ===========================================================================*/ #include "saclib.h" Word IFATL(A,m,s) Word *A,m,s; { Word k,n; Word B,Bp; Step1: /* Skip leading zeros. Determine length of A'*/ for (n = m - 1; n >= 0; n--) if (A[n] != 0) goto Step3; Step2: /* A' = 0. */ B = 0; goto Return; Step3: /* A' BETA-digit. */ if (n == 0) { if (s < 0) B = -A[0]; else B = A[0]; goto Return; } Step4: /* Copy digits to initial segment of AVAIL. */ if (AVAIL == NIL) GC(); B = AVAIL; Bp = 0; if (s < 0) { for (k = 0; k <= n; k++) { if (AVAIL == NIL) { GC(); SRED(Bp,AVAIL); } SFIRST(AVAIL,-A[k]); Bp = AVAIL; AVAIL = RED(AVAIL); } } else { for (k = 0; k <= n; k++) { if (AVAIL == NIL) { GC(); SRED(Bp,AVAIL); } SFIRST(AVAIL,A[k]); Bp = AVAIL; AVAIL = RED(AVAIL); } } SRED(Bp,NIL); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/DMPSUM.c0000664002275300236100000000312414017255270013710 0ustar wcbrownscs/*====================================================================== C <- DMPSUM(r,m,A,B) Dense modular polynomial sum. Inputs r : a BETA-digit, r >= 1, the number of variables. A , B : in Z/(m)[X1,...Xr] dense representation. m : a BETA-digit. Outputs C : in Z/(m)[X1,...Xr] dense representation, C = A + B. ======================================================================*/ #include "saclib.h" Word DMPSUM(r,m,A,B) Word r,m,A,B; { Word Ap,Bp,C,a,b,c,e,f,i,rp; /* hide a,b,f,i,rp; */ Step1: /* A or B zero. */ if (A == 0) { C = B; goto Return; } if (B == 0) { C = A; goto Return; } Step2: /* General case. */ rp = r - 1; if (FIRST(A) >= FIRST(B)) { ADV(A,&e,&Ap); ADV(B,&f,&Bp); } else { ADV(B,&e,&Ap); ADV(A,&f,&Bp); } C = NIL; for (i = 1; i <= e - f; i++) { ADV(Ap,&a,&Ap); C = COMP(a,C); } do { ADV(Ap,&a,&Ap); ADV(Bp,&b,&Bp); if (rp == 0) c = MDSUM(m,a,b); else c = DMPSUM(rp,m,a,b); C = COMP(c,C); } while (!(Ap == NIL)); Step3: /* Finish. */ C = INV(C); while (C != NIL && FIRST(C) == 0) { C = RED(C); e = e - 1; } if (C == NIL) C = 0; else C = COMP(e,C); goto Return; Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/SUBFROM.c0000664002275300236100000000221114017255270014014 0ustar wcbrownscs/*=========================================================================== SUBFROM(A,B,n) Subtract array from array. Inputs A : non-negative integer of length >= n in array representation B : non-negative integer of length n in array representation. A - B >= 0. n : positive BETA-digit. Effect : B[0],...,B[n-1] is subtracted from A[0],...,A[n-1],... and the result is put in A. ===========================================================================*/ #include "saclib.h" void SUBFROM(A,B,n) Word *A,*B,n; { Word c,cp,i; Step1: /* Subtract. */ cp = 0; for (i = 0; i < n; i++) { c = A[i] - B[i] + cp; if (c < 0) { c = c + BETA; cp = -1; } else cp = 0; A[i] = c; } Step2: /* Propagate borrow. */ while (cp != 0) { c = A[i] + cp; if (c < 0) { c = c + BETA; cp = -1; } else cp =0; A[i] = c; i++; } Return: /* Prepare for return. */ return; } saclib2.2.8/src/LBRIMID.c0000664002275300236100000000112214017255270013761 0ustar wcbrownscs/*====================================================================== c <- LBRIMID(I) Logarithmic binary rational interval midpoint. Input I : a logarithmic binary rational interval. Output c : the midpoint of I, a logarithmic binaary rational number. ======================================================================*/ #include "saclib.h" Word LBRIMID(I) Word I; { Word a,b,c; Step1: /* Add endpoints and divide by 2. */ FIRST2(I,&a,&b); c = LBRNSUM(a,b); if (c != 0) c = LIST2(FIRST(c),SECOND(c) + 1); Return: /* Return c. */ return(c); } saclib2.2.8/src/PDEGV.c0000664002275300236100000000166514017255270013560 0ustar wcbrownscs/*=========================================================================== V <- PDEGV(r,A) Polynomial degree vector. Inputs r : a BETA-digit, r >= 1. A : in R[x_1,...,x_r], R a ring. Outputs V : the list (v_r,...,v_1) where v_i is the degree of A in x_i. ===========================================================================*/ #include "saclib.h" Word PDEGV(r,A) Word r,A; { Word A1,Ap,V,V1,i,n,rp; Step1: /* A = 0. */ if (A == 0) { V = NIL; for (i = 1; i <= r; i++) V = COMP(0,V); goto Return; } Step2: /* r = 1. */ n = PDEG(A); if (r == 1) { V = LIST1(n); goto Return; } Step3: /* r > 1. */ rp = r - 1; A1 = PLDCF(A); V = PDEGV(rp,A1); Ap = PRED(A); while (Ap != 0) { A1 = PLDCF(Ap); V1 = PDEGV(rp,A1); V = VMAX(V,V1); Ap = PRED(Ap); } V = COMP(n,V); Return: /* Prepare for return. */ return(V); } saclib2.2.8/src/SIPSIZE.c0000664002275300236100000000112714017255270014032 0ustar wcbrownscs/*====================================================================== S <- SIPSIZE(A) Software interval polynomial size. Input A : a software interval polynomial. Output S : the size of an array needed for a polynomial having the same degree and same precision as A. ======================================================================*/ #include "saclib.h" BDigit SIPSIZE(A) BDigit *A; { BDigit n,p,q1,q2,S; Step1: /* Compute the size. */ n = A[0]; p = A[3]; q1 = p + 3; q2 = q1 + q1; S = (n + 1) * q2 + 1; Return: /* Return S. */ return(S); } saclib2.2.8/src/GINQR.c0000664002275300236100000000304314017255270013563 0ustar wcbrownscs/*=========================================================================== GINQR(A,B; Q,R) Gaussian integer nearest quotient and remainder. Inputs A, B : Gaussian integers, B /= 0. Outputs Q : the nearest Gaussian integer to A/B; if several are equally near to A/B, Q is the one nearest to the origin. R : the corresponding remainder, A - B * Q. ===========================================================================*/ #include "saclib.h" void GINQR(A,B, Q_,R_) Word A,B, *Q_,*R_; { Word A1,A2,B1,B2,N,P,P1,P2,Q,Q1,Q2,R,R1,R2; Step1: /* A = 0. */ if (A == 0) { Q = 0; R = 0; goto Return; } Step2: /* B real or imaginary. */ FIRST2(B,&B1,&B2); if (B1 != 0 && B2 != 0) goto Step3; FIRST2(A,&A1,&A2); if (B2 == 0) { INQR(A1,B1,&Q1,&R1); INQR(A2,B1,&Q2,&R2); } else { INQR(A2,B2,&Q1,&R2); INQR(A1,INEG(B2),&Q2,&R1); } Q = GIFP(Q1,Q2); R = GIFP(R1,R2); goto Return; Step3: /* Compute N = norm(B) and P = A * conj(B). */ N = GINORM(B); P = GIPROD(A,GICONJ(B)); Step4: /* Compute the nearest Gaussian integer, Q, to P / N. */ FIRST2(P,&P1,&P2); INQR(P1,N,&Q1,&R1); INQR(P2,N,&Q2,&R2); Q = GIFP(Q1,Q2); Step5: /* Compute the remainder R = A - B * Q. */ R = GIDIF(A,GIPROD(B,Q)); Return: /* Return Q and R. */ *Q_ = Q; *R_ = R; return; } saclib2.2.8/src/DAND.c0000664002275300236100000000142614017255270013414 0ustar wcbrownscs/*====================================================================== c <- DAND(a,b) Digit and. Inputs a,b : non-negative BETA-digits. Outputs c : a BETA-digit, the bit-wise and of a and b. ======================================================================*/ #ifndef NO_SACLIB_MACROS #define NO_SACLIB_MACROS #endif #include "saclib.h" Word DAND(a,b) Word a,b; { Word a1,ap,b1,bp,c,cp; /* hide a1,ap,b1,bp,c,cp; */ Step1: /* Compute. */ if (a == 0 || b == 0) c = 0; else { QREM(a,2,&ap,&a1); QREM(b,2,&bp,&b1); cp = DAND(ap,bp); c = cp + cp; if (a1 == 1 && b1 == 1) c = c + 1; } Return: /* Prepare for return. */ return(c); } saclib2.2.8/src/MAPPROD.c0000664002275300236100000000170014017255270014003 0ustar wcbrownscs/*=========================================================================== MAPPROD(m,A,B,C) Modular array polynomial product. Inputs m : a postive BETA-digit. A,B : in Z/(m)[x] in array representation. C : an array large enough to hold the product of A and B. Side effects A * B is computed and put in C. ===========================================================================*/ #include "saclib.h" void MAPPROD(m,A,B,C) Word m,*A,*B,*C; { Word n1,n2,k,i; Step1: /* A = 0 or B = 0. */ if (MAPZERO(A) || MAPZERO(B)) { MAPDEG(C) = 0; MAPCF(C,0) = 0; goto Return; } Step2: /* Get degrees. */ n1 = MAPDEG(A); n2 = MAPDEG(B); Step3: /* Set C == 0. */ k = n1 + n2; MAPDEG(C) = k; for (i = 0; i <= k; i++) MAPCF(C,i) = 0; Step4: /* Multiply-add loop. */ for (i = 0; i <= n2; i++) MAPMADD(m,A,MAPCF(B,i),i,C); Return: /* Prepare for return. */ return; } saclib2.2.8/src/MMPFBL.c0000664002275300236100000000277114017255270013667 0ustar wcbrownscs/*=========================================================================== L <- MMPFBL(p,A,d) Medium modulus polynomial factorization, Berlekamp algorithm. Inputs p : a medium prime. A : in Z/(p), deg(A) = n >= 2, monic and squarefree. A is in list representation. d : a BETA-digit, d > 0, such that A has no irreducible factor of degree less than d. Outputs L : a list of all the distinct monic irreducible factors of A of positive degree in list representation. ===========================================================================*/ #include "saclib.h" Word MMPFBL(p,A,d) Word p,A,d; { Word *Ap,B,*B1,L,Lp,*L1,**Q,i,n,N,*N1; Step1: /* Construct the matrix Q-I. */ Ap = MAPFMUP(A); Q = MMAPBM(p,Ap); n = MAPDEG(Ap); for (i = 0; i < n; i++) MATELT(Q,i,i) = MDDIF(p,MATELT(Q,i,i),1); Step2: /* Generate null space basis and convert to polynomials. */ N = MMAMNSB(p,n,Q); B = NIL; do { PTRADV(N,&N1,&N); B1 = MAPFV(n,N1); FREEARRAY(N1); B = PTRCOMP(B1,B); } while (N != NIL); Step3: /* Factorize. */ Lp = MMAPFS(p,Ap,B,d); Step4: /* Convert to lists. */ L = NIL; do { PTRADV(Lp,&L1,&Lp); L = COMP(MUPFMAP(L1),L); MAPFREE(L1); } while (Lp != NIL); Step5: /* Free arrays. */ MAPFREE(Ap); FREEMATRIX(Q,n); do { PTRADV(B,&B1,&B); MAPFREE(B1); } while(B != NIL); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/VMAX.c0000664002275300236100000000143014017255270013454 0ustar wcbrownscs/*====================================================================== W <- VMAX(U,V) Vector maximum. Inputs U,V : lists of BETA-digits, U=(u1,...,ur) and V=(v1,...,vr). r : a BETA-digit, r >= 1. Outputs W : a list of BETA-digits, W=(w1,...,wr) where wi = max(ui,vi). ======================================================================*/ #include "saclib.h" Word VMAX(U,V) Word U,V; { Word Us,Vs,W,u,v,w; /* hide Us,Vs,u,v,w; */ Step1: /* Compute. */ W = NIL; Us = U; Vs = V; do { ADV(Us,&u,&Us); ADV(Vs,&v,&Vs); w = MAX(u,v); W = COMP(w,W); } while (!(Us == NIL)); W = INV(W); Return: /* Prepare for return. */ return(W); } saclib2.2.8/src/MMUPIT.c0000664002275300236100000000177414017255270013727 0ustar wcbrownscs/*===================================================================== t <- MMUPIT(p,A) Medium Modulus univariate polynomial irreducibility test. Inputs p : a medium prime. A : a polynomial over Z_p, 2 <= deg(A) <= beta^{1/2}. Output t : 0 or 1. t = 1 if A(x) is irreducible in Z_p[x], 0 otherwise. =======================================================================*/ #include "saclib.h" BDigit MMUPIT(p,A) BDigit p; Word A; { BDigit a,*Ap,n,t; Word B,C,L; Step1: /* If p is small, check for a linear factor. */ n = PDEG(A); if (p < n * n) { Ap = MAPFMUP(A); for (a = 0; a< p; a++) { if (MMAPEVAL(p,Ap,a) == 0) { MAPFREE(Ap); t = 0; goto Return; } } MAPFREE(Ap); } Step2: /* Test for a repeated factor. */ B = MUPDER(p,A); C = MUPGCD(p,A,B); if (PDEG(C) > 0) { t = 0; goto Return; } L = MMPDDF(p,A); if (FIRST(FIRST(L)) == n) t = 1; else t = 0; Return: /* Return t. */ return(t); } saclib2.2.8/src/IUPQHL.c0000664002275300236100000000254614017255270013714 0ustar wcbrownscs/*=========================================================================== Fp <- IUPQHL(p,F,M,C) Integral univariate polynomial quadratic hensel lemma, list. Inputs p : a BETA-digit, p prime. F : a list (f1,...,fr), with fi in Z/(p)[X], fi monic, gcd(fi,fj) = 1 for 1 <= i < j <= r. M : in Z, M = p^j for some j in Z, j > 0. C : in Z[X], with C congruent to cp * f1 * ... * fr, where cp is the residue of ldcf(C) mod p. Outputs Fp : a list (fp1,...,fpr), with fpi in Z/(M)[X], fpi monic, deg(fpi) = deg(fi), fpi congruent to fi, C congruent to cp * 1fp1 * ... fpr, where cp is the residue of ldcf(C) mod p. ===========================================================================*/ #include "saclib.h" Word IUPQHL(p,F,M,C) Word p,F,M,C; { Word A,Ab,B,Bb,Cb,Cp,Fp,Fs,Q,R,Sb,Tb; Step1: /* Initialize. */ Fp = NIL; Fs = F; Cp = MIPHOM(1,M,C); B = Cp; Step2: /* Lift factors. */ while (RED(Fs) != NIL) { ADV(Fs,&Ab,&Fs); Cb = MIPHOM(1,p,Cp); Bb = MPQ(1,p,Cb,Ab); MUPEGC(p,Ab,Bb,&R,&Sb,&Tb); IUPQH(p,Ab,Bb,Sb,Tb,M,Cp,&A,&B); Fp = COMP(A,Fp); if (RED(Fs) != NIL) MIUPQR(M,Cp,A,&Cp,&R); } MIUPQR(M,B,LIST2(0,PLDCF(B)),&Q,&R); Fp = COMP(Q,Fp); Fp = INV(Fp); Return: /* Prepare for return. */ return(Fp); } saclib2.2.8/src/IPSIFI.c0000664002275300236100000000307114017255270013667 0ustar wcbrownscs/*====================================================================== J <- IPSIFI(A,I) Integral polynomial standard isolating interval from isolating interval. Inputs I : an interval with binary rational endpoints, which is either left-open and right-closed or a one-point interval. A : in Z[X], has a unique root alpha of odd multiplicity in I. Outputs J : If I is a one-point interval, then J = I. If I is left-open and right closed, then J is either a standard left-open and right-closed subinterval of I containing alpha, or if alpha is a binary rational number, J may possibly instead be the one-point interval (alpha,alpha). ======================================================================*/ #include "saclib.h" Word IPSIFI(A,I) Word A,I; { Word J,a,b,c,k,m,n,s,t; /* hide k,s,t; */ Step1: /* Initialization. */ FIRST2(I,&a,&b); t = IUPBES(A,b); if (t == 0) { J = LIST2(b,b); goto Return; } Step2: /* Bisect I until standard subinterval obtained. */ do { RNBCR(a,b,&m,&n,&k); if (IDIF(n,m) == 1) { J = LIST2(a,b); goto Return; } c = RIB(a,b); s = IUPBES(A,c); if (s == 0) { J = LIST2(c,c); goto Return; } else if (s * t < 0) a = c; else b = c; } while (1); Return: /* Prepare for return. */ return(J); } saclib2.2.8/src/IUPRC.c0000664002275300236100000000255014017255270013567 0ustar wcbrownscs/*====================================================================== IUPRC(A,B; C,R) Integral univariate polynomial resultant and cofactor. Inputs A,B : in Z[x], of positive degree. Outputs R : in Z, the resultant of A and B. C : in Z[x], C is such that for some D in Z[x], A*D + B*C = R. ======================================================================*/ #include "saclib.h" void IUPRC(A,B, C_,R_) Word A,B, *C_,*R_; { Word As,Bs,C,Cs,I,Q,R,Rs,d,e,f,m,n,p,q; Step1: /* Compute coefficient bound. */ m = PDEG(A); n = PDEG(B); d = IPMAXN(1,A); e = IPMAXN(1,B); d = IEXP(d,n); e = IEXP(e,m); f = IFACTL(m + n); f = IPROD(e,f); f = IPROD(d,f); f = IPROD(2,f); Step2: /* Initialize. */ I = LPRIME; Q = 1; C = 0; R = 0; Step3: /* Loop. */ while (I != NIL) { ADV(I,&p,&I); As = MPHOM(1,p,A); if (PDEG(As) == m) { Bs = MPHOM(1,p,B); if (PDEG(Bs) == n) { MUPRC(p,As,Bs,&Cs,&Rs); q = MDHOM(p,Q); q = MDINV(p,q); C = IPCRA(Q,p,q,1,C,Cs); R = IPCRA(Q,p,q,0,R,Rs); Q = IPROD(Q,p); if (ICOMP(Q,f) >= 0) goto Return; } } } Step4: /* Algorithm fails. */ FAIL("IUPRC","Prime list exausted",A,B,f,Q); Return: /* Prepare for return. */ *C_ = C; *R_ = R; return; } saclib2.2.8/src/MMAPEXP.c0000664002275300236100000000176414017255270014022 0ustar wcbrownscs/*=========================================================================== B <- MMAPEXP(m,A,n) Medium modulus array polynomial exponentiation. Inputs m : a medium BETA-digit. A : in Z/(m)[x], in array representation, and ldcf(A) is a unit. n : a non-negative BETA-digit. Output B : in Z/(p), B = x^n modulo A(x). B is in array representation. ===========================================================================*/ #include "saclib.h" Word *MMAPEXP(m,A,n) Word m,*A,n; { Word d,*B,i,k,*C; Step1: /* Get array B. */ d = MAPDEG(A); B = MAPGET(2 * (d - 1)); Step2: /* n < d. */ if (n < d) { MAPDEG(B) = n; MAPCF(B,n) = 1; for (i = 0; i < n; i++) MAPCF(B,i) = 0; goto Return; } Step3: /* n >= d. */ k = n / 2; C = MMAPEXP(m,A,k); MMAPPROD(m,C,C,B); MAPFREE(C); MMAPREM(m,B,A); if (ODD(n)) { MAPMPV(B,1); MMAPREM(m,B,A); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MIAIM.c0000664002275300236100000000171414017255270013542 0ustar wcbrownscs/*====================================================================== B <- MIAIM(A) Matrix of integers, adjoin identity matrix. Inputs A : an m by n matrix over Z. A is represented as a list of columns. Outputs B : an m+n by n matrix over Z. B is obtained by adjoining an n by n identity matrix to the bottom of A. Remarks: A is modified. ======================================================================*/ #include "saclib.h" Word MIAIM(A) Word A; { Word A1,Ap,B,T,i,j,n; /* hide i,j,n; */ Step1: /* Compute. */ n = LENGTH(A); Ap = INV(A); B = NIL; for (i = 1; i <= n; i++) { ADV(Ap,&A1,&Ap); T = NIL; for (j = 1; j <= n; j++) if (i == j) T = COMP(1,T); else T = COMP(0,T); A1 = CONC(A1,T); B = COMP(A1,B); } Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/SICOPY.c0000664002275300236100000000105114017255270013706 0ustar wcbrownscs/*====================================================================== SICOPY(A,B) Software interval copy. Inputs A : a software interval. B : an array large enough for a copy of A. Effect The software interval A is copied into B. ======================================================================*/ #include "saclib.h" void SICOPY(A,B) BDigit *A,*B; { BDigit i,p,q1,q2; Step1: /* Copy A. */ p = A[2]; q1 = p + 3; q2 = q1 + q1; for (i = 0; i < q2; i++) B[i] = A[i]; Return: /* Return. */ return; } saclib2.2.8/src/GIGCD.c0000664002275300236100000000211614017255270013520 0ustar wcbrownscs/*=========================================================================== C <- GIGCD(A,B) Gaussian integer greatest common divisor. Inputs A,B : Gaussian integers. Output C : The greatest common divisor of A and B that is real or in the first quadrant, a Gaussian integer. ===========================================================================*/ #include "saclib.h" Word GIGCD(A,B) Word A,B; { Word A1,A2,A3,a,b,C,Q; Step1: /* Initialize a remainder sequence. */ A1 = A; A2 = B; Step2: /* Compute remainders until zero is obtained. */ while (A2 != 0) { GINQR(A1,A2,&Q,&A3); A1 = A2; A2 = A3; } Step3: /* Set C to the real or first quadrant associate of A1. */ FIRST2(A1,&a,&b); if (a <= 0 && b > 0) C = LIST2(b,INEG(a)); else if (a < 0 && b <= 0) C = LIST2(INEG(a),INEG(b)); else if (a >= 0 && b < 0) C = LIST2(INEG(b),a); else C = A1; Return: /* Return C. */ return(C); } saclib2.2.8/src/SINTER.c0000664002275300236100000000173714017255270013717 0ustar wcbrownscs/*====================================================================== C <- SINTER(A,B) Set intersection. Inputs A,B : ordered lists of of BETA-integers. (A, B represent sets of BETA-integers.) Outputs C : the ordered list representing the intersection of the sets A and B. ======================================================================*/ #include "saclib.h" Word SINTER(A,B) Word A,B; { Word Ap,Bp,C,Cp,a,b; /* hide Ap,Bp,C,a,b; */ Step1: /* Compute. */ Cp = NIL; Ap = A; Bp = B; while (Ap != NIL && Bp != NIL) { a = FIRST(Ap); b = FIRST(Bp); if (a == b) { Cp = COMP(a,Cp); Ap = RED(Ap); Bp = RED(Bp); } else if (a < b) Ap = RED(Ap); else Bp = RED(Bp); } C = INV(Cp); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPRRISS.c0000664002275300236100000000304414017255270014037 0ustar wcbrownscs/*===================================================================== L <- IPRRISS(M,a,b,v1,v2,s) Integral polynomial real root isolation, standard interval, Sturm method. Inputs M: a list (A_1,A_2,...,A_t) of integral univariate polynomials. M is a Sturm sequence for A_1. a, b: logarithmic binary rational numbers, a < b. (a,b) is an open standard interval. v1, v2: integers. v1 = var(M,a). v2 = var(M,b) s: sign(A_1(b)). Outputs L : a list (I_1,...,I_r) of standard isolating intervals for the real roots of A1 in the interval (a,b), I_1 < I_2 < ... < I_r. Each I_j is a one-point or open binary rational interval. =====================================================================*/ #include "saclib.h" Word IPRRISS(M,a,b,v1,v2,s) Word M,a,b,v1,v2,s; { Word L,L1,c,S,t,v,w2; Step1: /* No roots or only 1 in (a,b). */ if (s == 0) w2 = v2 - 1; else w2 = v2; if (v1 - w2 == 0) { L = NIL; goto Return; } if (v1 - w2 == 1) { L = LIST1(LIST2(a,b)); goto Return; } Step2: /* Count variations at the midpoint, c. */ c = LSIM(a,b); S = IPLSEVAL(M,c); v = VAR(S); Step3: /* Isolate roots in (c,b). */ L = IPRRISS(M,c,b,v,v2,s); Step4: /* Is c a root? */ t = FIRST(S); if (t == 0) L = COMP(LIST2(c,c),L); Step5: /* Isolate roots in (a,c). */ L1 = IPRRISS(M,a,c,v1,v,t); Step6: /* Concatenate lists. */ L = CONC(L1,L); Return: /* Return L. */ return(L); } saclib2.2.8/src/PPLT.c0000664002275300236100000000116214017255270013462 0ustar wcbrownscs/*=========================================================================== B <- PPLT(e,a,A) Polynomial prefix leading term. Inputs e : a BETA-digit, e >= 0. a : in R, where R is a ring. A : in R[x]. Either A = 0 or deg(A) < e. Output B : in R[x], B = a x^e + A. ===========================================================================*/ #include "saclib.h" Word PPLT(e,a,A) Word e,a,A; { Word B; Step1: /* Compute. */ if (a == 0) B = A; else if (A == 0) B = LIST2(e,a); else B = COMP2(e,a,A); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/DPR.c0000664002275300236100000000125414017255270013332 0ustar wcbrownscs/*============================================================================ DPR(A,B; c1,c0) Digit product. Inputs A, B : BETA-digits. Outputs c1, c0 : the unique BETA-digits such that a * b = c1 * BETA + c0, with c1 * c0 >= 0. ============================================================================*/ #include "saclib.h" void DPR(A,B,c1_,c0_) Word A,B,*c1_, *c0_; { DWord C; C = A; C = C*B; if (C < 0) { C = -C; *c0_ = (Word)(-(C & (BETA - 1))); *c1_ = (Word)(-(C >> ZETA)); } else { *c0_ = (Word)(C & (BETA - 1)); *c1_ = (Word)(C >> ZETA); } return; } saclib2.2.8/src/IREAD.c0000664002275300236100000000426114017255270013532 0ustar wcbrownscs/*====================================================================== A <- IREAD() Integer read. Inputs (from the input stream) An integer in external form. Let designate any non-empty word over the alphabet {0,1,...,9}. Then the input is of the following form or + or - Note that there is no blank between the optional sign and the digit sequence; also note that leading zeros are allowed. Outputs A : The internal representation of the input integer. A is either a BETA-digit or a list of more than one BETA-digit which are either all non-negative or all non-positive and such that the last list element (= the leading BETA-digit) is not 0. Side effects An integer is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word IREAD() { Word A,B,C,b,bp,i,s; /* hide C,b,bp,i,s; */ Step1: /* Read sign. */ s = 1; C = CREADB(); if (C == '-') s = -1; if (C == '+' || C == '-') C = CREAD(); if (DIGIT(C) == 0) goto Step6; Step2: /* Skip leading zeros. */ while (C == 0) C = CREAD(); Step3: /* Is A=0. */ A = 0; if (DIGIT(C) == 0) { BKSP(); goto Return; } Step4: /* Compute THETA-digits. */ B = NIL; b = 0; i = 0; do { b = 10 * b + C - '0'; i = i + 1; if (i == ETA) { B = COMP(b,B); b = 0; i = 0; } C = CREAD(); } while (!(DIGIT(C) == 0)); Step5: /* Convert to base BETA. */ B = INV(B); while (B != NIL) { A = IDPR(A,THETA); ADV(B,&bp,&B); A = ISUM(A,bp); } if (A != 0) A = IDPR(A,EXPF(10,i)); A = ISUM(A,b); if (s < 0) A = INEG(A); BKSP(); goto Return; Step6: /* Error. */ FAIL("IREAD","Unexpected character",C); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/VLREAD.c0000664002275300236100000000174014017255270013662 0ustar wcbrownscs/*====================================================================== V <- VLREAD() Variable list read. Outputs V : a list of variables, is read from the input stream. Any preceding blanks are skipped. ======================================================================*/ #include "saclib.h" Word VLREAD() { Word C,V,v; /* hide C; */ Step1: /* Read variables. */ V = NIL; C = CREADB(); if (C != '(') goto Step2; C = CREADB(); if (C == ')') goto Return; else BKSP(); do { v = VREAD(); V = COMP(v,V); C = CREADB(); if (C == ')') { V = INV(V); goto Return; } else if (C != ',') goto Step2; } while (1); Step2: /* Error. */ FAIL("VLREAD","Unexpected character",C); Return: /* Prepare for return. */ return(V); } saclib2.2.8/src/LBRNDIF.c0000664002275300236100000000101614017255270013761 0ustar wcbrownscs/*===================================================================== T <- LBRNDIF(R,S) Logarithmic binary rational number difference. Inputs R, S : logarithmic binary rational numbers. Outputs T : R - S, a logarithmic binary rational integer. ======================================================================*/ #include "saclib.h" Word LBRNDIF(R,S) Word R,S; { Word T; Step1: /* Do it. */ T = LBRNSUM(R,LBRNNEG(S)); Return: /* Return T. */ return(T); } saclib2.2.8/src/PFFAP.c0000664002275300236100000000124014017255270013534 0ustar wcbrownscs/*======================================================================= A <- PFFAP(p,a) Prime finite field array of powers. Inputs p : a prime beta digit. a : a generator for Z_p. Output A : An array of p beta digits. A[0] = 0 and, for 0 < i < p, A[i] = a^i, an element of Z_p. =======================================================================*/ #include "saclib.h" BDigit *PFFAP(p,a) BDigit p,a; { BDigit *A,i; Step1: /* Get array for A. */ A = GETARRAY(p); Step2: /* Compute array elements. */ A[0] = 0; A[1] = a; for (i = 2; i < p; i++) A[i] = MDPROD(p,A[i-1],a); Return: /* Return A. */ return(A); } saclib2.2.8/src/IPTRLV.c0000664002275300236100000000175414017255270013732 0ustar wcbrownscs/*====================================================================== B <- IPTRLV(r,A,h) Integral polynomial translation, leading variable. Inputs r : A BETA-digit. r >= 0. A : an element of Z[X1,...,Xr]. Outputs B : an element of Z[X1,...,Xr]. B(X1,...,Xr) = A(X1+h,X2,...,Xr). ======================================================================*/ #include "saclib.h" Word IPTRLV(r,A,h) Word r,A,h; { Word B; Word Ap,a,b,e; Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* r=1. */ if (r == 1) { B = IUPTR(A,h); goto Return; } Step3: /* r>1. */ B = NIL; Ap = A; while (Ap != NIL) { ADV2(Ap,&e,&a,&Ap); b = IPTRLV(r - 1,a,h); if (b != 0) B = COMP2(b,e,B); } if (B == NIL) B = 0; else B = INV(B); Return: return(B); } saclib2.2.8/src/REM.c0000664002275300236100000000074214017255270013331 0ustar wcbrownscs/*========================================================================== r <- REM(a,b) Remainder. Inputs a,b : C integers, b /= 0. Outputs r : a - q * b where q is the integral part of a / b. ==========================================================================*/ #include "saclib.h" Word REM(a,b) Word a,b; { Word q,r; Step1: /* Use QREM */ QREM(a,b,&q,&r); Return: /* Prepare for return */ return(r); } saclib2.2.8/src/GETHIPARRAY.c0000664002275300236100000000127014017255270014462 0ustar wcbrownscs/*========================================================================== A <- GETHIPARRAY(n) Get hardware interval polynomial array. Input n : a BETA-digit, n >= 0. Output A : a pointer to an array of n + 1 hardware intervals. The array is not subject to garbage collection. ===========================================================================*/ #include #include "saclib.h" interval *GETHIPARRAY(n) BDigit n; { interval *A; Step1: /* Allocate memory for array. */ A = (interval *)malloc((n + 1)*sizeof(interval)); if (A == NULL) FAIL("GETHIPARRAY","Out of memory."); Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/MAIPP.c0000664002275300236100000000241014017255270013546 0ustar wcbrownscs/*====================================================================== C <- MAIPP(r,A,B) Matrix of integral polynomials product. Inputs r : a BETA-digit, r >= 0. A,B : matrices over Z[X1,...,Xr] for which the matrix product A*B is defined. Outputs C : a matrix over Z[X1,...,Xr], C = A*B. ======================================================================*/ #include "saclib.h" Word MAIPP(r,A,B) Word r,A,B; { Word A1,A11,Ap,Ap1,B1,B11,Bp,Bs,C,C1,C11; /* hide A1,A11,Ap,Ap1,B1,B11; */ Step1: /* Compute. */ C = NIL; Ap = A; do { ADV(Ap,&A1,&Ap); Bp = B; C1 = NIL; do { C11 = 0; Bs = NIL; Ap1 = A1; do { ADV(Ap1,&A11,&Ap1); ADV(Bp,&B1,&Bp); ADV(B1,&B11,&B1); C11 = IPSUM(r,C11,IPPROD(r,A11,B11)); Bs = COMP(B1,Bs); } while (Bp != NIL); Bp = INV(Bs); C1 = COMP(C11,C1); } while (FIRST(Bp) != NIL); C1 = INV(C1); C = COMP(C1,C); } while (Ap != NIL); C = INV(C); Return: /* Prepare for return. */ return(C); } saclib2.2.8/src/IPPFAC2.c0000664002275300236100000000270314017255270013731 0ustar wcbrownscs/*========================================================================= L <- IPPFAC2(r,A) Integral primitive polynomial factorization, degree 2. Inputs r : a BETA-digit, r >= 1, the number of variables; A : in Z[X1,...,Xr], positive, primitive and of degree 2. Output L : a list of pairs (e_i,A_i) consisting of all the irreducible factors A_i of A with their multiplicities e_i. ==========================================================================*/ #include "saclib.h" Word IPPFAC2(r,A) Word r,A; { Word a,b,c,D1,D2,D,rp,ap,F1,F2,f1,f2,L,d; Step1: /* Compute the discriminant D. */ a = PCOEFF(A,2); b = PCOEFF(A,1); c = PCOEFF(A,0); rp = r-1; D1 = IPPROD(rp,b,b); D2 = IPPROD(rp,IPIP(rp,-4,a),c); D = IPSUM(rp,D1,D2); Step2: /* D = 0. */ if (D == 0) { ap = IPIP(rp,2,a); F1 = IPSUM(r,PMON(ap,1),PMON(b,0)); F1 = IPPP(r,F1); L = LIST1(LIST2(2,F1)); goto Return; } Step3: /* Is D a square? */ d = IPSQRT(rp,D); if (d == NIL) { L = LIST1(LIST2(1,A)); goto Return; } Step4: /* D a square. */ f1 = IPSUM(rp,b,d); ap = IPIP(rp,2,a); F1 = IPSUM(r,PMON(ap,1),PMON(f1,0)); F1 = IPPP(r,F1); f2 = IPDIF(rp,b,d); F2 = IPSUM(1,PMON(ap,1),PMON(f2,0)); F2 = IPPP(r,F2); L = LIST2(LIST2(1,F1),LIST2(1,F2)); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/MMAPRC.c0000664002275300236100000000400014017255270013654 0ustar wcbrownscs/*========================================================================== MMAPRC(p,A,B,C; r) Medium modulus array polynomial resultant and cofactor. Inputs p : a BETA-digit, prime. A,B : in Z/(p)[X]. A and B have positive degrees. A and B are in array representation. C : an array large enough to hold a polynomial of degree deg(A)-1. Outputs r : in Z/(p), the resultant of A and B. Side effects C is modified so that it contains the polynomial in Z/(p)[X] of degree less than deg(A) such that for some D in Z/(p)[X], A*D + B*C = r. ==========================================================================*/ #include "saclib.h" void MMAPRC(p,A,B,C, r_) Word p,*A,*B,*C, *r_; { Word *A1,*A2,*Q,*P,i,n1,n2,n3,r,r2,s,*t,*v1,*v2; Step1: /* Initialize. */ r = 1; A1 = MAPCOPY(A); A2 = MAPCOPY(B); n1 = MAPDEG(A1); n2 = MAPDEG(A2); v1 = MAPFMD(0,maxm(n1,n2)); v2 = MAPFMD(1,maxm(n1,n2)); s = 1; if (n1 < n2) { if (ODD(n1) && ODD(n2)) s = -s; t = A1; A1 = A2; A2 = t; t = v1; v1 = v2; v2 = t; } Q = MAPGET(n1); P = MAPGET(n1); Step2: /* Loop. */ do { n1 = MAPDEG(A1); MMAPQR(p,A1,A2,Q); MMAPPROD(p,Q,v2,P); MAPIDIF(p,v1,P); if (MAPZERO(A1)) { r = 0; MAPASSIGN(v1,C); goto Step4; } n3 = MAPDEG(A1); n2 = MAPDEG(A2); if (ODD(n1) && ODD(n2)) s = -s; r2 = MAPLDCF(A2); for (i = 1; i <= n1 - n3; i++) r = (r * r2) % p; t = A1; A1 = A2; A2 = t; t = v1; v1 = v2; v2 = t; } while (n3 != 0); Step3: /* Finish. */ r2 = MAPLDCF(A2); for (i = 1; i <= n2 - 1; i++) r = (r * r2) % p; if (s == -1) r = p - r; MMAPMDP(p,r,v2,C); r = (r * r2) % p; Step4: /* Free arrays. */ MAPFREE(A1); MAPFREE(A2); MAPFREE(v1); MAPFREE(v2); MAPFREE(Q); MAPFREE(P); Return: /* Prepare for return. */ *r_ = r; return; } saclib2.2.8/src/NORMHLEFD.c0000664002275300236100000001313014017255270014217 0ustar wcbrownscs/*=========================================================================== Ft <- NORMHLEFD(N,n,p,F,C,G) Norm polynomial Hensel lifting with early factor detection. Inputs N : in Z[x], the norm of a polynomial A[alpha,x] in Z[alpha][x], where alpha is an algebraic number. N is squarefree. n : the degree of alpha. p : an odd medium prime. p divides neither the leading coefficient nor the discriminant of N. F : a list of pairs ((d_1,F_1),...,,(d_s,F_s)). Let M be the minimal polynomial of alpha, and let M_1 * ... * M_s be a complete factorization of M (mod p). Then d_i = deg(M_i) and F_i is a list of the distinct monic irreducible factors of res_t(M_i(t),A(t,x)) (mod p). C : a characteristic set, a superset of the set of possible degrees of factors of A[alpha,x]. G : a list of pairs (p_i,G_i), where p_i is an element of SPRIME and G_i is a list of pairs (e_i,H_i). Let Mb_1 * ... * Mb_r be a complete factorization of M (mod p_i). Then e_i = deg(Mb_i) and H_i is the distinct-degree factorization of res_t(Mb_i(t),A(t,x)), that is, H_i is a list of pairs (f_j,Hb_j) where Hb_j is the product of all monic irreducible factors of H_i of degree f_j. Outputs Ft : a list of elements of Z[x]. Ft is the list of distinct positive irreducible factors of N. ===========================================================================*/ #include "saclib.h" #define TIME_RATIO 4 Word NORMHLEFD(N,n,p,F,C,G) Word N,n,p,F,C,G; { Word A,Ab,Ap,As,B,Bb,Bp,Bs,Cb,D,Fb,Fs,Ft,Gb,Ib,Ib1,Ip,Ipp,Ip1,Ipp1, M,Nb,Ns,Nt,N1,Q,Qp,Qpp,Qs,Sb,Tb,Th,Tt,U,Us,Y,Yp,Z,Zp, b,c,cb,cq,d,e,ep,f,k,q,qp,t,th,tt; Step0: /* Initialize the lifting and testing times, and evaluate N at 1. */ Th = Tt = 0; N1 = IPEMV(1,N,1); Step1: /* Compute the two-factor lifting bound and the highest single-precision power of p not exceeding the bound. */ M = IUPLB(N,2); q = p; while (ICOMP(q,M) < 0 && q < BETA/q) q = q * q; while (ICOMP(q,M) < 0 && q < BETA/p) q = q * p; Step2: /* Lift quadratically to single-precision. */ NORMSQHL(N,p,q,F,&Ab,&Bb,&Sb,&Tb); Step3: /* Compute the maximum degree d of trial factors. */ c = ILOG2(IPSUMN(1,N)); c = c + c; cq = ILOG2(q); k = RNCEIL(RNRED(c,cq)); d = RNFLOR(RNRED(PDEG(N)/n,k)); Step4: /* Factor testing. */ tt = ACLOCK(); NORMEFD(N,n,p,q,M,Ab,G,C,d,N1,&Fs,&Nb,&Gb,&M,&Ib,&Cb,&N1); tt = ACLOCK()-tt; if (Ib == NIL) goto Return; if (Fs == NIL) Tt += tt; Step5: /* Perform the initial linear lifting step. */ th = ACLOCK(); Q = IPROD(q,q); Nt = MIPHOM(1,Q,N); NORMILHS(Nt,q,Q,Ab,Bb,Sb,Tb,&Y,&Z,&Us,&As,&Bs); th = ACLOCK()-th; Th += th; e = 2; Step6: /* Recompute the maximum degree d of trial factors. */ if (Fs != NIL) { c = ILOG2(IPSUMN(1,Nb)); c = c + c; k = RNCEIL(RNRED(c,cq)); } d = RNFLOR(RNRED(2*(PDEG(Nb)/n),k)); Step7: /* Compute f, an estimate of the number of true factors and ep, the level at which to test regardless of time. */ f = IUPENF(Nb); cb = IPSUMN(1,Nb); IROOT(cb,f,&cb,&t); cb = ISUM(cb,t); cb = IPROD(cb,cb); cb = IPROD(2,cb); ep = 1; qp = q; while (ICOMP(qp,cb) < 0) { qp = IPROD(qp,q); ep++; } Step8: /* Factor testing. */ if (Tt == 0 || e == ep || (Th / Tt >= TIME_RATIO) || ICOMP(Q,M) >= 0) { tt = ACLOCK(); Ft = LLGIE(As,Ib); Ip = Ib; NORMEFD(Nb,n,p,Q,M,Ft,Gb,Cb,d,N1,&Fb,&Nb,&Gb,&M,&Ib,&Cb,&N1); if (Fb != NIL) { Fs = CONC(Fs,Fb); if (Ib == NIL) goto Return; Ipp = NIL; while (Ip != NIL) { ADV(Ip,&Ip1,&Ip); ADV(Ib,&Ib1,&Ib); Ipp1 = LGIE(Ip1,Ib1); Ipp = COMP(Ipp1,Ipp); } Ib = INV(Ipp); } else { tt = ACLOCK(); Tt += tt; Ib = Ip; } } Step9: /* Prepare for linear lifting. */ Ns = N; IPDQNR(1,Ns,q,&Ns,&D); IPDQNR(1,Ns,q,&Ns,&D); IPDQNR(1,Ns,q,&Ns,&D); Qpp = 1; Qp = q; Ap = Ab; Ab = NORMFL(Ab); Bp = Bb; Yp = Y; Zp = Z; U = Us; A = As; B = Bs; Step10: /* Do one linear Hensel step. */ th = ACLOCK(); NORMLHS(q,Q,Qpp,Ab,Bb,Sb,Tb,Ap,Bp,Yp,Zp,U,D,A,B, &Qs,&Y,&Z,&Us,&As,&Bs); th = ACLOCK()-th; Th += th; e++; Step11: /* Compute the maximum degree d of trial factors. */ b = ICOMP(Qs,M); if (b >= 0) d = PDEG(Nb)/n - 1; else { if (Fb != NIL) { c = ILOG2(IPSUMN(1,Nb)); c = c + c; k = RNCEIL(RNRED(c,cq)); } d = RNFLOR(RNRED(e*(PDEG(Nb)/n),k)); } Step12: /* Factor testing. */ if (Tt == 0 || e == ep || (Th / Tt >= TIME_RATIO) || b >= 0) { tt = ACLOCK(); Ft = LLGIE(As,Ib); Ip = Ib; NORMEFD(Nb,n,p,Qs,M,Ft,Gb,Cb,d,N1,&Fb,&Nb,&Gb,&M,&Ib,&Cb,&N1); if (Fb != NIL) { Fs = CONC(Fs,Fb); if (Ib == NIL) goto Return; Ipp = NIL; while (Ip != NIL) { ADV(Ip,&Ip1,&Ip); ADV(Ib,&Ib1,&Ib); Ipp1 = LGIE(Ip1,Ib1); Ipp = COMP(Ipp1,Ipp); } Ib = INV(Ipp); } else { tt = ACLOCK()-tt; Tt += tt; Ib = Ip; } } Step13: /* Advance. */ Qpp = Qp; Qp = Q; Q = Qs; Ap = A; Bp = B; Yp = Y; Zp = Z; U = Us; IPDQNR(1,Ns,q,&Ns,&D); A = As; B = Bs; goto Step10; Return: /* Prepare for return. */ return(Fs); } saclib2.2.8/src/DVCMP.c0000664002275300236100000000176214017255270013562 0ustar wcbrownscs/*====================================================================== b <- DVCMP(d1,d2) Degree vector comparison. Inputs d1 , d2 : are degree vectors of distributive polynomials in r variables, r >= 0. Outputs b : b = -1 if d1 < d2, b = 0 if d1 = d2, b = 1 if d1 > d2, with respect to the inverse lexicographical ordering of degree vectors. ======================================================================*/ #include "saclib.h" Word DVCMP(d1,d2) Word d1,d2; { Word b,dp1,dp2,e1,e2; /* hide algorithm */ Step1: /* Compute. */ dp1 = d1; dp2 = d2; b = 0; while (dp1 != NIL) { ADV(dp1,&e1,&dp1); ADV(dp2,&e2,&dp2); if (e1 < e2) { b = -1; goto Return; } if (e1 > e2) { b = 1; goto Return; } } Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/AFPMON.c0000664002275300236100000000147614017255270013673 0ustar wcbrownscs/*====================================================================== Ap <- AFPMON(r,M,A) Algebraic number field polynomial monic. Inputs r : a BETA-digit, r >= 0. M : in Z[x], the minimal polynomial of an algebraic number alpha. A : in Q(alpha)[X1,...,Xr]. Outputs Ap : in Q(alpha)[X1,...,Xr]. If A = 0 then Ap = 0, otherwise Ap is the monic associate of A. ======================================================================*/ #include "saclib.h" Word AFPMON(r,M,A) Word r,M,A; { Word Ap,a,ap; Step1: /* A equal 0. */ if (A == 0) { Ap = 0; goto Return; } Step2: /* A not equal 0. */ a = PLBCF(r,A); ap = AFINV(M,a); Ap = AFPAFP(r,M,ap,A); Return: /* Prepare for return. */ return(Ap); } saclib2.2.8/src/LIST6.c0000664002275300236100000000104714017255270013546 0ustar wcbrownscs/*=========================================================================== L <- LIST6(a1,a2,a3,a4,a5,a6) List, 6 elements. Inputs a1, a2, a3, a4, a5, a6 : objects. Output L : the list (a1,a2,a3,a4,a5,a6). ===========================================================================*/ #include "saclib.h" Word LIST6(a1,a2,a3,a4,a5,a6) Word a1,a2,a3,a4,a5,a6; { Word L; Step1: /* Construct. */ L = COMP(a1,COMP(a2,COMP(a3,COMP(a4,COMP(a5,COMP(a6,NIL)))))); Return: /* Prepare for return. */ return(L); } saclib2.2.8/src/FDIF.c0000664002275300236100000000125314017255270013414 0ustar wcbrownscs/*====================================================================== FDIF(A,B,d,C) Floating-point difference. Inputs A, B : floating-point numbers of the same precision. d : a sign (rounding direction). C : an array large enough for the difference. Output C : a floating-point number approximating A - B, rounded according to IEEE standards. ======================================================================*/ #include "saclib.h" void FDIF(A,B,d,C) Word *A,*B; BDigit d; Word *C; { Step1: /* Change the sign of B and add. */ B[1] = - B[1]; FSUM(A,B,d,C); B[1] = - B[1]; Return: /* Return. */ return; } saclib2.2.8/src/NORMFL.c0000664002275300236100000000133114017255270013676 0ustar wcbrownscs/*=========================================================================== Lp <- NORMFL(L) Norm polynomial flatten list. Input L : a list ((d_1,F_1),...,(d_s,F_s)), where the F_i are lists. Output Lp: the list of elements in the F_i in the same order. ===========================================================================*/ #include "saclib.h" Word NORMFL(L) Word L; { Word F1,Lp,Lt,L1,f; Step1: /* Flatten. */ Lt = L; Lp = NIL; while (Lt != NIL) { ADV(Lt,&L1,&Lt); F1 = SECOND(L1); while (F1 != NIL) { ADV(F1,&f,&F1); Lp = COMP(f,Lp); } } Lp = INV(Lp); Return: /* Prepare for return. */ return(Lp); } saclib2.2.8/src/LBRIHI.c0000664002275300236100000000146714017255270013664 0ustar wcbrownscs/*======================================================================== LBRIHI(I; J,t) Logarithmic binary rational interval to hardware interval. Input I : a logarithmic binary rational interval. Outputs J : the smallest hardware interval containing I. t : If t = 0, the program failed and J is undefined. Otherwise t = 1. =========================================================================*/ #include "saclib.h" void LBRIHI(I,J_,t_) Word I; interval *J_; BDigit *t_; { Word a,b; ieee ap,bp; interval J; BDigit t; Step1: /* Convert endpoints and make interval. */ FIRST2(I,&a,&b); LBRNIEEE(a,-1,&ap,&t); if (t == 0) goto Return; LBRNIEEE(b,+1,&bp,&t); if (t == 0) goto Return; J.left = ap.num; J.right = bp.num; Return: /* Return J and t. */ *J_ = J; *t_ = t; return; } saclib2.2.8/src/MMAPMADD.c0000664002275300236100000000162614017255270014070 0ustar wcbrownscs/*=========================================================================== MMAPMADD(m,A,b,j,C) Medium modulus array polynomial multiply and add. Input m : a medium BETA-digit. A : in Z/(m) in array representation. b : in Z/(m). j : a non-negative BETA-digit such that j + deg(A) <= deg(C). C : in Z/(m) in array representation. Side effect C is modified such that C <- C + A(x) * b * x^j. ===========================================================================*/ #include "saclib.h" void MMAPMADD(m,A,b,j,C) Word m,*A,b,j,*C; { Word n,i,a,k,c; Step1: /* b = 0 or A = 0. */ if (b == 0 || MAPZERO(A)) goto Return; Step2: /* Otherwise. */ n = MAPDEG(A); for (i = 0; i <= n; i++) { a = MAPCF(A,i); k = i + j; if (a != 0) { c = (a * b + MAPCF(C,k)) % m; MAPCF(C,k) = c; } } Return: /* Prepare for return. */ return; } saclib2.2.8/src/IPRES.c0000664002275300236100000000362514017255270013573 0ustar wcbrownscs/*====================================================================== C <- IPRES(r,A,B) Integral polynomial resultant. Inputs r : a BETA-digit, r > 0. A,B : in Z[x_1,...,x_r]. A and B have positive degrees in x_r. Output C : in Z[x_1,...,x_{r-1}], the resultant of A and B with respect to x_r. Algorithm The modular algorithm is used. Degree bounds for the resultant are computed using ASSPR (which solves optimal assignment problems). ======================================================================*/ #include "saclib.h" Word IPRES(r,A,B) BDigit r; Word A,B; { BDigit d1,i,k,**M,m,n,p,q,rp; Word As,Bs,C,Cs,D,L,Mp,P,Q,d,e,f; Step1: /* Compute a coefficient bound. */ d = IPSUMN(r,A); e = IPSUMN(r,B); m = PDEG(A); n = PDEG(B); f = IPROD(IEXP(d,n),IEXP(e,m)); f = IDPR(f,2); Step2: /* Check for a common divisor x_i, 1 <= i <= r. */ for (i = r; i >= 1; i--) { if (PDVAR(r,A,i) == 1 && PDVAR(r,B,i) == 1) { C = 0; goto Return; } } Step3: /* Compute degree bounds. */ D = NIL; k = m + n; for (i = r - 1; i >= 1; i--) { M = SMDM(r,A,B,i); Mp = AMLM(M,k,k); FREEMATRIX(M,k); ASSPR(Mp,&P,&d1); D = COMP(d1,D); } Step4: /* Initialize loop. */ L = LPRIME; Q = 1; C = 0; rp = r - 1; Step5: /* Compute the resultant modulo several primes and apply the Chinese remainder algorithm. */ while (ICOMP(Q,f) <= 0) { if (L == NIL) FAIL("IPRES","Prime list exhausted"); ADV(L,&p,&L); As = MPHOM(r,p,A); Bs = MPHOM(r,p,B); if (PDEG(As) == m && PDEG(Bs) == n) { Cs = MPRESDB(r,p,As,Bs,D); q = MDHOM(p,Q); q = MDINV(p,q); C = IPCRA(Q,p,q,rp,C,Cs); Q = IPROD(Q,p); } } Return: /* Return C. */ return(C); } saclib2.2.8/src/AGIWRITE.c0000664002275300236100000000113414017255270014115 0ustar wcbrownscs/*====================================================================== AGIWRITE(A) Array Gaussian integer write. Input A : a Gaussian integer in array representation. Effect A is written in the output stream. ======================================================================*/ #include "saclib.h" void AGIWRITE(A) BDigit **A; { BDigit B,B1,B2; Step1: /* Convert to list representation and write. */ B1 = AII(A[0]); B2 = AII(A[1]); if (B1 == 0 && B2 == 0) B = 0; else B = LIST2(B1,B2); GIWRITE(B); Return: /* Return. */ return; } saclib2.2.8/src/IPRRRI.c0000664002275300236100000000257314017255270013721 0ustar wcbrownscs/*====================================================================== Is <- IPRRRI(A,B,I,s1,t1) Integral polynomial relative real root isolation. Inputs A, B : in Z[X]. I : a left-open, right-closed interval (a1,a2) where a1 and a2 are binary rational numbers with a1 < a2. A and B have unique roots, alpha and beta respectively, in I, each of odd multiplicity and with alpha /= beta. s1,t1 : BETA-digits, s1 = sign(A(a_1 +)) and t1 = sign(B(a_1 +)). Outputs Is : a left-open, right-closed subinterval of I, Is = (as1, as2) with as1 and as2 binary rational numbers and as1 < as2, such that Is contains alpha but not beta. ======================================================================*/ #include "saclib.h" Word IPRRRI(A,B,I,s1,t1) Word A,B,I,s1,t1; { Word Is,a,as1,as2,s,t,u,v; /* hide s,t,u,v; */ Step1: /* Initialize. */ FIRST2(I,&as1,&as2); Step2: /* Bisect. */ a = RIB(as1,as2); s = IUPBES(A,a); if (s == 0) s = -s1; t = IUPBES(B,a); if (t == 0) t = -t1; u = s1 * s; v = t1 * t; if (u > 0) as1 = a; else as2 = a; if (u == v) goto Step2; Step3: /* Construct I*. */ Is = LIST2(as1,as2); Return: /* Prepare for return. */ return(Is); } saclib2.2.8/src/PARTN.c0000664002275300236100000000200014017255270013557 0ustar wcbrownscs/*====================================================================== Q <- PARTN(n,P) Partition, next. Inputs n : a BETA-digit, n > 0. P : a partition of n. Outputs Q : the next partition of n after P in lexicographical order, if any. Otherwise Q=(). ======================================================================*/ #include "saclib.h" Word PARTN(n,P) Word n,P; { Word Pp,Q,a,ap,b,i,q,r; /* hide Pp,a,ap,b,i,q,r; */ Step1: /* r=1. */ r = LENGTH(P); if (r == 1) { Q = NIL; goto Return; } Step2: /* r >= 2. */ Q = NIL; Pp = P; for (i = 1; i <= r - 2; i++) { ADV(Pp,&a,&Pp); Q = COMP(a,Q); } a = FIRST(Pp); b = SECOND(Pp); ap = a + 1; QREM(a + b,ap,&q,&r); for (i = 1; i <= q - 1; i++) Q = COMP(ap,Q); Q = COMP(ap + r,Q); Q = INV(Q); Return: /* Prepare for return. */ return(Q); } saclib2.2.8/src/PBIN.c0000664002275300236100000000122314017255270013431 0ustar wcbrownscs/*====================================================================== A <- PBIN(a1,e1,a2,e2) Polynomial binomial. Inputs a1,a2 : in a coefficient ring R. e1,e2 : non-negative BETA-digits, e1 > e2. Outputs A : in R[X], A(x)=a1x^e1+a2x^e2. ======================================================================*/ #include "saclib.h" Word PBIN(a1,e1,a2,e2) Word a1,e1,a2,e2; { Word A; Step1: /* Compute. */ A = NIL; if (a2 != 0) A = LIST2(e2,a2); if (a1 != 0) A = COMP2(e1,a1,A); if (A == NIL) A = 0; Return: /* Prepare for return. */ return(A); } saclib2.2.8/src/RPIMV.c0000664002275300236100000000172114017255270013601 0ustar wcbrownscs/*====================================================================== B <- RPIMV(r,A) Rational polynomial integration, main variable. Inputs A : in Q[X1,...,Xr]. r : a BETA-digit, r >= 1. Outputs B : in Q[X1,...,Xr], the integral of A with respect to its main variable. The constant of integration is 0. ======================================================================*/ #include "saclib.h" Word RPIMV(r,A) Word r,A; { Word Ap,B,a,b,e,ep,es,rp; /* hide Ap,a,e,ep,rp; */ Step1: /* A=0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ Ap = A; rp = r - 1; B = NIL; do { ADV2(Ap,&e,&a,&Ap); ep = e + 1; es = LIST2(1,ep); b = RPRNP(rp,es,a); B = COMP2(b,ep,B); } while (!(Ap == NIL)); B = INV(B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/MDHOM.c0000664002275300236100000000110214017255270013541 0ustar wcbrownscs/*====================================================================== b <- MDHOM(m,A) Modular digit homomorphism. Inputs m : a positive BETA-integer. A : an integer. Outpus b : the image of A under the homomorphism h sub m. ======================================================================*/ #include "saclib.h" Word MDHOM(m,A) Word m,A; { Word Q,b; /* hide algorithm */ Step1: /* Compute. */ IDQR(A,m,&Q,&b); if (b < 0) b = b + m; Return: /* Prepare for return. */ return(b); } saclib2.2.8/src/IUPFCT.c0000664002275300236100000002464314017255270013706 0ustar wcbrownscs/*=========================================================================== IUPFCT(p,Q,Qp,q,C,M,L,G,D,e,d,k; F,Cb,Mb,Lb,Gb,Db) Integral univariate polynomial factor combination test. Inputs p : an odd medium prime. Q : a positive power of p. Qp: the floor of the square root of Q/2. q : a BETA-digit, q = ILOG2(Qp). C : a positive, primitive, and squarefree integral polynomial. M : the two-factor lifting bound for C. L : a list of monic factors of C modulo Q whose product is congruent to the monic associate of C. G : a list of pairs (p_i,G_i), where p_i is an element of SPRIME and G_i is the distinct-degree factorization of C (mod p_i), i.e., G_i is a list ((n_1,H_1),...,(n_k,H_k)) of pairs, where H_i is the product of all monic irreducible factors of C (mod p_i) of degree n_i. D : a characteristic set, a superset of the possible degrees of integral factors of C. e : a BETA-digit, the minimum degree for trial factors. d : a BETA-digit, the maximum degree for trial factors. k : a BETA-digit, LENGTH(L) > k >= 1. No combination of less than k elements of L can be converted into an integral factor of C. Outputs F : a (possibly empty) list of all the irreducible factors of C that were obtained by performing early factor detection on combinations of exactly k elements of L, the degree of whose product is >= e and <= d. (But see Notes below.) Cb: C divided by the product of the elements of F. Mb: the two-factor lifting bound for Cb. If Cb = 1, then Mb = 0. Lb: a (possibly empty) list of pairs, (i,L_i) where L_i is the ith element of L and L_i could not be so combined as to produce a factor. If i < j then (i,L_i) precedes (j,L_j) in the list Lb, and Lb contains all uncombined factors. Gb: a list of pairs (p_i,Gb_i), where p_i is as in the specifications of the input variable G above, and Gb_i is the distinct-degree factorization of Cb (mod p_i). Db: a characteristic set, a superset of the possible degrees of integral factors of Cb. If Cb = 1, then Db = 0. Notes Attempts are made to convert products of exactly k elements of L into irreducible integral factors of C. If a true factor is found then the factor degree set is properly adjusted which may show that the remaining polynomial is irreducible, in which case it is added to the output list F. If the degree of the remaining polynomial is 2 then it is factored using the quadratic formula and the factor(s) so obtained are added to F. Otherwise, the two-factor lifting bound is recomputed and if this new bound is <= Q and k >= the number of remaining factors, then the remaining polynomial must irreducible and it is added to F. If the irreducibility of the remaining polynomial has not been determined by any of these three means then all other k-combinations of the remaining elements of L are tested. After trying all such combinations, if k is equal to one less than the number of remaining elements of L, and Cb <= Q, then the remaining polynomial is irreducible and it is added to F. If no tests are successful then all combinations of k elements of L will have been tested. ===========================================================================*/ #include "saclib.h" void IUPFCT(p,Q,Qp,q,C,M,L,G,D,e,d,k,F_,Cb_,Mb_,Lb_,Gb_,Db_) Word p,Q,Qp,q,C,M,L,G,D,e,d,k,*F_,*Cb_,*Mb_,*Lb_,*Gb_,*Db_; { Word B,B1,B2,Cb,Ch,Db,Dp,Dpp,Ds,F,Ft,Gb,Gp,G1, H1,H1p,I,L1,L1p,Lb,Lp,Mb,*P,T,T1,T2, b,b1,b2,c,c1,dp,d1,f1,g,h,h1,i,j,k1,m,n,n1,p1,r,t; Step1: /* Convert L to an array Lp with tags and initialize Dp, the list of degrees of the remaining modular factors. */ Dp = NIL; LLTGCA(L,&Lp,&n); for (i = 0; i < n; i++) { L1 = GCAGET(Lp,i); L1p = LIST2(i+1,L1); Dp = COMP(PDEG(L1),Dp); GCASET(Lp,i,L1p); } Step2: /* Get arrays for combinations and trailing coefficient products. */ P = GETARRAY(k); T = GCAMALLOC(k,GC_CHECK); Step3: /* Initialize F, the list of factors found, Cb, the polynomial that remains to be factored, Gb, the other modular factors of the remaining poly, Mb, the single-factor bound of Cb, Db, the factor degree set, m, the number of remaining modular factors, P, the combination array and t, the last-changed index. */ F = NIL; Cb = C; Gb = G; Mb = M; Db = D; m = n; for (i = 0; i < k; i++) P[i] = i; t = 0; /* Entering the loop executed for each combination. */ Step4: /* Test whether the degree of the factor combination product is a possible factor degree and form the list Ds of modular factor degrees for this combination. */ dp = 0; Ds = NIL; for (i = 0; i < k; i++) { f1 = GCAGET(Lp,P[i]); d1 = PDEG(SECOND(f1)); dp = dp + d1; if (dp > d) goto Step18; Ds = COMP(d1,Ds); } if (dp < e) goto Step18; if (!ISCSELT(dp,Db)) goto Step18; j = t; t = m-1; Step5: /* Update the trailing coefficient product. */ if (j == 0) T1 = 1; else T1 = GCAGET(T,j-1); for (i = j; i < k; i++) { h = P[i]; f1 = GCAGET(Lp,h); L1 = SECOND(f1); T2 = PTBCF(1,L1); T1 = MIPROD(Q,T1,T2); GCASET(T,i,T1); } Step6: /* Convert the trailing coefficient product to a rational number, if possible. */ r = RNFMRPP(Q,Qp,q,p,T1); if (r == NIL) goto Step18; Step7: /* Test whether the denominator of r divides the leading coefficient of C. */ b = RNDEN(r); c = PLDCF(C); if (IREM(c,b) != 0) goto Step18; Step8: /* Compute the modular polynomial product. */ B = PMON(1,0); for (i = 0; i < k; i++) { h = P[i]; f1 = GCAGET(Lp,h); L1 = SECOND(f1); B = MIPPR(1,Q,B,L1); } Step9: /* Test whether the product yields factor(s) of Cb. */ if (PDEG(B) == 2) IUPFT2(p,Q,Qp,q,Cb,B,&Ch,&B1,&B2); else { IUPFT(p,Q,Qp,q,Cb,B,&Ch,&B1); B2 = 0; } if (B1 == 0) goto Step18; Step10: /* Put the factor(s) in the list of factors found and update Cb. */ F = COMP(B1,F); if (B2 != 0) F = COMP(B2,F); Cb = Ch; Step11: /* Update the list Dp of degrees of the remaining modular factors. */ do { ADV(Ds,&d1,&Ds); Dp = LDELETE(d1,Dp); } while (Ds != NIL); Step12: /* Recompute the factor degree set. */ if (LENGTH(Dp) == 1) { /* Only one remaining modular factor. */ F = COMP(Cb,F); Cb = PMON(1,0); Mb = 0; Lb = NIL; Db = 0; goto Step20; } else Db = CSFPAR(Dp); I = CSUN(IMP2(1,PDEG(Cb)),1); Gp = NIL; while (Gb != NIL) { ADV(Gb,&G1,&Gb); FIRST2(G1,&p1,&H1); b1 = MPHOM(1,p1,B1); if (B2 != 0) { /* Taking the product rather than each */ b2 = MPHOM(1,p1,B2); /* linear factor separately makes */ b1 = MPPROD(1,p1,b1,b2); } /* the program much simpler. */ Dpp = NIL; H1p = NIL; while (H1 != NIL) { ADV(H1,&h1,&H1); FIRST2(h1,&n1,&h1); MPGCDC(1,p1,b1,h1,&c1,&b1,&h1); d1 = PDEG(h1); if (d1 > 0) { k1 = d1/n1; for (i = 1; i <= k1; i++) Dpp = COMP(n1,Dpp); H1p = COMP(LIST2(n1,h1),H1p); } } Db = CSINT(Db,CSFPAR(Dpp)); if (EQUAL(Db,I)) { F = COMP(Cb,F); Cb = PMON(1,0); Mb = 0; Lb = NIL; Db = 0; goto Step20; } H1 = INV(H1p); Gp = COMP(LIST2(p1,H1),Gp); } Gb = INV(Gp); Step13: /* Can the remaining polynomial be factored by formula? */ if (PDEG(Cb) == 2) { Ft = IUSFPF2(Cb); F = CONC(F,Ft); Cb = PMON(1,0); Mb = 0; Lb = NIL; Db = 0; goto Step20; } Step14: /* Recompute the two-factor lifting bound. */ Mb = IUPLB(Cb,2); Step15: /* Check whether we have lifted beyond the new bound and have combined enough factors to prove the irreducibility of the remaining polynomial. */ if (k >= m - k && d >= PDEG(Cb) - 1 && ICOMP(Q,Mb) >= 0) { F = COMP(Cb,F); Cb = PMON(1,0); Mb = 0; Lb = NIL; Db = 0; goto Step20; } Step16: /* Remove the combined factors from the array Lp. */ j = 0; g = 0; i = 0; do { h = P[i]; while (g < h) { f1 = GCAGET(Lp,g); GCASET(Lp,j,f1); j++; g++; } g = h + 1; i++; } while (i < k); while (g < m) { f1 = GCAGET(Lp,g); GCASET(Lp,j,f1); j++; g++; } h = P[0]; for (i = 1; i < k; i++) P[i] = h+i; Step17: /* Update the number of remaining factors and test for completion. */ m = m - k; if (m <= k || P[k-1] >= m) { Lb = GCATL(Lp,m); goto Step20; } else { t = 0; goto Step4; } Step18: /* Compute the next combination, if any. */ i = 1; while (i <= k && P[k - i] == m - i) i++; if (i == k+1) Lb = GCATL(Lp,m); else { h = P[k - i]; for (j = k - i; j < k; j++) { h++; P[j] = h; } j = k - i; if (j < t) t = j; goto Step4; } Step19: /* Have we combined enough factors and lifted far enough to show that the remaining factor is irreducible? */ if (k >= m-1 && d >= PDEG(Cb) - 1 && ICOMP(Q,Mb) >= 0) { F = COMP(Cb,F); Cb = PMON(1,0); Mb = 0; Lb = NIL; Db = 0; } Step20: /* Free arrays. */ GCAFREE(Lp); FREEARRAY(P); GCAFREE(T); Return: /* Prepare for return. */ *F_ = F; *Cb_ = Cb; *Mb_ = Mb; *Lb_ = Lb; *Gb_ = Gb; *Db_ = Db; return; } saclib2.2.8/src/IUPENF.c0000664002275300236100000000231114017255270013666 0ustar wcbrownscs/*=========================================================================== r <- IUPENF(A) Integral univariate polynomial, estimate number of factors. Inputs A : in Z[x], deg(A) > 0. Output r : a BETA-digit > 1. r is an estimate of the number of integral factors of A. ===========================================================================*/ #include "saclib.h" #define NPENF 25 /* number of primes for estimation */ Word IUPENF(A) Word A; { Word *Ap,P,a,i,k,p,r,rp; Step1: /* Initialize. */ P = RED(SPRIME); a = PLDCF(A); k = 1; r = 0; rp = 0; Step2: /* Count the number of linear factors by evaluation. */ while (k <= NPENF) { do { if (P == NIL) FAIL("IUPENF","Prime list exhausted"); ADV(P,&p,&P); } while (MDHOM(p,a) == 0); Ap = MAPFMUP(MPHOM(1,p,A)); for (i = 0; i < p; i++) { if (MMAPEVAL(p,Ap,i) == 0) { MMAPDEFL(p,Ap,i); if (MMAPEVAL(p,Ap,i) == 0) { MAPFREE(Ap); goto Step2; } else rp++; } } k++; MAPFREE(Ap); } Step3: /* Round to nearest integer. */ r = RNROUND(RNRED(rp,NPENF)); if ( r < 2 ) r = 2; Return: /* Prepare for return. */ return(r); } saclib2.2.8/src/ISNIL.c0000664002275300236100000000055414017255270013565 0ustar wcbrownscs/*====================================================================== t <- ISNIL(L) Test for empty list. Inputs L : list. Outputs t : t = 1 if L is empty, t = 0 otherwise. ======================================================================*/ #include "sactypes.h" Word ISNIL(a) Word a; { return(a == BETA); } saclib2.2.8/src/RPMAIP.c0000664002275300236100000000147314017255270013700 0ustar wcbrownscs/*====================================================================== B <- RPMAIP(r,A) Rational polynomial monic associate of integral polynomial. Inputs A : in Z[X1,...,Xr]. r : a BETA-digit, r >= 1. Outputs B : in Q[X1,...,Xr]. If A = 0 then B = 0. If A /= 0, let the integer a be the leading base coefficient of A. Then B = (1/a)A, a monic rational polynomial. ======================================================================*/ #include "saclib.h" Word RPMAIP(r,A) Word r,A; { Word B,a; Step1: /* A = 0. */ if (A == 0) { B = 0; goto Return; } Step2: /* A /= 0. */ B = RPFIP(r,A); a = PLBCF(r,B); a = RNINV(a); B = RPRNP(r,a,B); Return: /* Prepare for return. */ return(B); } saclib2.2.8/src/ILBRN.c0000664002275300236100000000100514017255270013545 0ustar wcbrownscs/*=========================================================================== L <- ILBRN(I) Integer to logarithmic binary rational number. Inputs I : in Z. Outputs L : the logarithmic binary rational representation of L. ===========================================================================*/ #include "saclib.h" Word ILBRN(I) Word I; { Word L,n,Ip; if (I == 0) L = 0; else { n = IORD2(I); Ip = IDP2(I,n); L = LIST2(Ip,-n);} return L; } saclib2.2.8/LICENSE0000664002275300236100000000146314017255270012761 0ustar wcbrownscsSaclib 2.2 Copyright (c) 1993, 2008, RISC-Linz (contact wcbrown@usna.edu) Permission to use, copy, modify, and/or distribute this software, including source files, README files, etc., for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. saclib2.2.8/bin/0000775002275300236100000000000014017255270012520 5ustar wcbrownscssaclib2.2.8/bin/mklib0000775002275300236100000000445414017255270013553 0ustar wcbrownscs#!/bin/bash # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if [ $# -lt 1 ] then echo "USAGE:" echo " mklib " exit fi if [ $1 = "clean" ] then ### remove .o and .a and makefiles echo "Removing object files, libraries and makefiles ..." pushd >/dev/null $saclib/lib/objo 'rm' -f * popd >/dev/null pushd >/dev/null $saclib/lib/objd 'rm' -f * popd >/dev/null pushd >/dev/null $saclib/lib/ 'rm' -f *.a popd >/dev/null ### do sysdep cleanup echo "Removing system-dependent files ..." pushd >/dev/null $saclib/sysdep/linuxX86 ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/linuxX86_64 ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/solarisSparc ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/macosX86 ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/macosX86_64 ./cleanup popd >/dev/null exit fi if [ ! -n "${CC+1}" ] then CC=cc fi echo "Compiling with" $CC if [ $1 = "std" ] then echo "This option no longer exists!" elif [ $1 = "deb" ]; then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null elif [ $1 = "opt" ]; then pushd >/dev/null $saclib/lib/objo make CC=$CC "SACFLAG=" EXTENSION=o popd >/dev/null elif [ $1 = "all" ]; then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC "SACFLAG=" EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit fi echo "mklib done." saclib2.2.8/bin/sdesc0000775002275300236100000000261114017255270013547 0ustar wcbrownscs#!/bin/tcsh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" perl $saclib/bin/svers.pl exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=12 else set sc=$4 endif if ($#argv < 5) then set ll=70 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # The last line used to look like this: # awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # but I took it out saclib2.2.8/bin/sconf0000775002275300236100000000020314017255270013551 0ustar wcbrownscs#!/bin/bash if [ $# -eq 0 ] ; then perl $saclib/bin/mksysdep.pl fi if [ $# -eq 1 ] ; then perl $saclib/bin/mksysdep.pl $1 fi saclib2.2.8/bin/mkproto.awk0000775002275300236100000000275114017255270014727 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^((const )?.*) .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; if ($1 == "const") { type = "const " $2; i = 3; } while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/bin/mktexkwic.sed0000775002275300236100000000061114017255270015224 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/bin/mkkwic.awk0000775002275300236100000000306114017255270014514 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/bin/mksysdep.pl0000775002275300236100000000716514017255270014730 0ustar wcbrownscs################################################ # mksysdep.pl V 0.0 # Created by Chris Brown, 20 May, 208 ################################################ if ($#ARGV == 0 && ($ARGV[0] eq "-h" || $ARGV[0] eq "--help")) { print "sconf/mksysdep.pl\n". "sconf [x86linux|sparcsolaris|x86_64linux|x86macos|x86_64macos]\n\n". "This script installs system dependent files for\n". "saclib. It attempts to diagnose architecture and\n". "processor type and install the proper files. You\n". "can give the arch/os type explicitly as one of the\n". "arguments listed above, and the script will install\n". "what you've asked for regardless of its diagnosis.\n"; exit 0; } if (! $ENV{'saclib'}) { print "SACLIB Error: The saclib environment variable must be set!\n"; exit(1); } ### Get architecture type $ptype = "unknown"; $uname = `uname -mp`; if ($uname =~ /i\S*86/) { $ptype = "x86"; } elsif ($uname =~ /x86_64/) { $ptype = "x86_64"; } elsif ($uname =~ /Sun|sun|SUN|Sparc|sparc|SPARC/) { $ptype = "sparc"; } else { print "SACLIB Warning: Could not determine processor type!\n"; } ### Get OS type $ostype = "unknown"; $uname = `uname -s`; if ($uname =~ /linux|Linux|LINUX/) { $ostype = "linux"; } elsif ($uname =~ /Sun|sun|SUN|solaris|Solaris/) { $ostype = "solaris"; } elsif ($uname =~ /Darwin|darwin|DARWIN/) { $ostype = "macos"; ### Do we have a 32-bit or 64-bit kernel running? $macosKernelTest = `ioreg -l -p IODeviceTree | grep firmware-abi | grep EFI64`; if ($macosKernelTest) { $ptype = "x86_64"; } elsif ($ptype == "x86_64") { $ptype = "x86"; } } else { print "SACLIB Warning: Could not determine OS type!\n"; } ### Call appropriate install script if ($#ARGV == 1 && $ARGV[0] eq "x86linux") { print "SACLIB Warning: Installing x86linux system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "x86macos") { print "SACLIB Warning: Installing x86macos system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "x86_64macos") { print "SACLIB Warning: Installing x86_64macos system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86_64 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "x86_64linux") { print "SACLIB Warning: Installing x86_64linux system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86_64 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "sparcsolaris") { print "SACLIB Warning: Installing sparcsolaris system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/solarisSparc ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86" && $ostype eq "linux") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86" && $ostype eq "macos") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86_64" && $ostype eq "macos") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86_64 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86_64" && $ostype eq "linux") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86_64 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "sparc" && $ostype eq "solaris") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/solarisSparc ; ./install ; popd >/dev/null\""); } saclib2.2.8/bin/svers.pl0000775002275300236100000000064014017255270014222 0ustar wcbrownscsif (! $ENV{'saclib'}) { print "SACLIB Error: The saclib environment variable must be set!\n"; exit(1); } open(SACMAC,"< $ENV{'saclib'}/include/sacmacros.h"); $maj = "?"; $min = "?"; $rev = "?"; while() { if ($_ =~ /SACMAJVERS\s+(\d+)/) { $maj = $1; } if ($_ =~ /SACMINVERS\s+(\d+)/) { $min = $1; } if ($_ =~ /SACREVVERS\s+(\d+)/) { $rev = $1; } } print "Saclib ${maj}.${min}.${rev}\n"; saclib2.2.8/bin/l2b.awk0000775002275300236100000000246114017255270013711 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/bin/mktexkwic.awk0000775002275300236100000000303714017255270015240 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/bin/mkmspec.awk0000775002275300236100000000020514017255270014663 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/bin/mkdesc.awk0000775002275300236100000000164414017255270014502 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/bin/mkproto0000775002275300236100000000077414017255270014151 0ustar wcbrownscs#!/bin/bash # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if [ $# -ne 0 ] then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((const char *algName, const char *msg,...)) __noreturn;" for fname in *.c do if [ $fname != FAIL.c -a $fname != main.c ] ; then awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h fi done fi saclib2.2.8/bin/mkdesc0000775002275300236100000000023214017255270013711 0ustar wcbrownscs#!/bin/bash # USAGE # mkdesc # # FUNCTION # Calls: mkdescd 12 70 $saclib/src/*.c $saclib/bin/mkdescd 12 70 $saclib/src/*.c > $saclib/doc/desc.doc saclib2.2.8/bin/mktexkwic1.awk0000775002275300236100000000031714017255270015317 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/bin/mkkwic.sed0000775002275300236100000000023414017255270014504 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/bin/sman0000775002275300236100000000041314017255270013402 0ustar wcbrownscs#!/bin/tcsh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " perl $saclib/bin/svers.pl else more $saclib/src/$1.c endif saclib2.2.8/bin/mkmake0000775002275300236100000000575014017255270013722 0ustar wcbrownscs#!/bin/bash # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. mkdir -p $saclib/lib/objo mkdir -p $saclib/lib/objd MAKEFILE=$saclib/lib/objo/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = as AR = ar RANLIB = ranlib # Object files OBJS1 = \ EOF # ## Write list of object files # pushd >/dev/null $saclib/src 'ls' [A-H]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \\" >> $MAKEFILE 'ls' I[A-P]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \\" >> $MAKEFILE 'ls' I[Q-z]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \\" >> $MAKEFILE 'ls' [J-P]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \\" >> $MAKEFILE 'ls' [Q-Za-z]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <<\EOF # Target dependencies new: ${OBJS1} ${OBJS2a} ${OBJS2b} ${OBJS3} ${OBJS4} rm -f ${TARGET} ${AR} cq ${TARGET} ${OBJS1} ${AR} cq ${TARGET} ${OBJS2a} ${AR} cq ${TARGET} ${OBJS2b} ${AR} cq ${TARGET} ${OBJS3} ${AR} cq ${TARGET} ${OBJS4} # Use "ar ts" if your system does not have "ranlib". # ${AR} ts ${TARGET} # Use "ranlib" if your system's "ar" does not have the option "s". ${RANLIB} ${TARGET} @echo "Created '${TARGET}'." EOF # ## Write object dependencies # cat >> $MAKEFILE <<\EOF # Object dependencies EOF 'ls' *.[c] 2> /dev/null |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE 'ls' *.[s] 2> /dev/null |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # 'cp' $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objd.'" saclib2.2.8/bin/mkmspec0000775002275300236100000000043014017255270014102 0ustar wcbrownscs#! /bin/tcsh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/bin/b2l.awk0000775002275300236100000000106114017255270013704 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/bin/mkspec0000775002275300236100000000040614017255270013730 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/bin/mkkwic0000775002275300236100000000235214017255270013735 0ustar wcbrownscs#! /bin/tcsh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/bin/mkdescd0000775002275300236100000000145314017255270014063 0ustar wcbrownscs#!/bin/bash # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if [ $# -lt 1 ] then echo "USAGE:" echo " mkdesc " else args=("$@") for fname in "${args[@]:2}" do awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname done fi saclib2.2.8/bin/subst0000775002275300236100000000141714017255270013611 0ustar wcbrownscs#! /bin/tcsh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/bin/mktexkwic0000775002275300236100000000243014017255270014453 0ustar wcbrownscs#! /bin/tcsh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/bin/mktexkwic2.awk0000775002275300236100000000162714017255270015325 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/bin/strip1st.awk0000775002275300236100000000045514017255270015024 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/README0000664002275300236100000000232114017255270012626 0ustar wcbrownscs---------------------------------------------------------------- Saclib2.2 ---------------------------------------------------------------- 0. COPYRIGHT/LICENSE Please see the file COPYRIGHT for informtion. If you have questions contact Chris Brown: wcbrown@usna.edu. 1. INSTALLATION Saclib2.2 is research software. The distributors do not have the time or equipment to ensure that it installs and runs on a wide range of platforms. We welcome ports to new systems. Please read sydep/README for details. To install saclib, assuming that you have untarred it already: a) create an environment variable "saclib" and set it to the absolute path to the root directory of your installation. Using the tcsh shell you might do something like this: setenv saclib /home/charlie/saclib2.2 Using bash you might do something like this: saclib=/home/charlie/saclib2.2 ; export saclib b) Give the following commands: cd $saclib bin/sconf bin/mkproto bin/mkmake bin/mklib all c) Assuming you didn't get any error messages, you should be done. 2. CONTACT For bug reports or ports, please contact Chris Brown at wcbrown@usna.edu. saclib2.2.8/include/0000775002275300236100000000000014017255270013373 5ustar wcbrownscssaclib2.2.8/include/hfloats.h0000664002275300236100000000376414017255270015216 0ustar wcbrownscs/*=============================================== hfloats.h Header file for hardware floats routines. ===============================================*/ /* ----------------------------------------*/ /* Include */ /* ----------------------------------------*/ #include #include "sysdep.h" #ifdef _SPARC_SOLARIS_ #include #endif #ifdef _X86_LINUX_ #include #include #endif #ifdef _MAC_OSX_ #include #endif #include "sysdep.h" /* ----------------------------------------*/ /* Hardware Floats */ /* ----------------------------------------*/ #ifdef _LITTLE_ENDIAN_ typedef struct { unsigned mant_l : 32; unsigned mant_h : 20; unsigned exp : 11; unsigned sign : 1; } ieee_rep; #endif #ifdef _BIG_ENDIAN_ /* SPARCstations: */ typedef struct { unsigned sign : 1; unsigned exp : 11; unsigned mant_h : 20; unsigned mant_l : 32; } ieee_rep; #endif typedef union { double num; ieee_rep rep; } ieee; #define BIAS 1023 #define MAXEXP 1023 #define MAXEXP1 1024 #define MINEXP -1022 #define MINEXP1 -1023 #define PREC 53 #define PREC1 52 /* ----------------------------------------*/ /* Rounding modes */ /* ----------------------------------------*/ /* Sun SPARCs: see also man ieee_flags and /usr/include/ieeefp.h */ #ifdef _SPARC_SOLARIS_ #define rounddown() fpsetround(FP_RM) #define roundup() fpsetround(FP_RP) #endif /* Linux */ #ifdef _X86_LINUX_ #define rounddown() fesetround(FE_DOWNWARD) #define roundup() fesetround(FE_UPWARD) #endif /* MAC OSX */ #ifdef _MAC_OSX_ #define rounddown() fesetround(FE_DOWNWARD) #define roundup() fesetround(FE_UPWARD) #endif /* ----------------------------------------*/ /* Hardware intervals */ /* ----------------------------------------*/ typedef struct { double left, right; } interval; /* static interval izero = { 0.0, 0.0 }; static interval ione = { 1.0, 1.0 }; */ saclib2.2.8/include/sacsys.h0000664002275300236100000000252014017255270015050 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETALENGTH 29 /* BETA is 29 bits */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ #define BETA2 0x10000000 /* BETA / 2 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 20000 #define NSPRIME_ 500 #define NMPRIME_ 2000 #define NLPRIME_ 2000 #define NPFDS_ 5 #define RHO_ 10 #define NPTR1_ 2001 /* LARGE = dimension of fixed size arrays used in IUPBEIN and * IUPBRESN to hold the result of the polynomial evaluation. * SMALL = dimension of fixed size array used in IUPBEIN and * IUPBRESN to hold the evaluation point. */ #define LARGE 2000 #define SMALL 50 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif /* Indicate that a function does not return. */ #ifndef __noreturn # ifdef __GNUC__ # define __noreturn __attribute__ ((noreturn)) # else # define __noreturn # endif #endif #endif saclib2.2.8/include/saclib.h0000664002275300236100000000532714017255270015010 0ustar wcbrownscs/*=========================================================================== saclib.h Header file for SACLIB ===========================================================================*/ #ifndef SACLIB_H #define SACLIB_H #include "sacsys.h" #include "sactypes.h" #include "hfloats.h" #include /*------------------------------------------- Constants -------------------------------------------*/ #define NIL BETA #define GC_CHECK 0 #define GC_NO_CHECK 1 #define SAC_KEEPMEM 0 #define SAC_FREEMEM 1 /* FIXED = dimension of fixed size array used in IPROD to hold * the operands. FIXEDX2 / 2 > FIXED >= MAXCLASSICAL. */ #define FIXED 200 /* FIXEDX2 = dimension of fixed size array used in IPROD to hold * the result. FIXEDX2 > FIXED * 2. */ #define FIXEDX2 401 /* WORK is the dimension of the fixed size work array for KARATSUBA * it has to be >= 2(FIXED - a + 3 floor(log_2(FIXED - 3))), * where a = 2^(k - 1) + 3 * k * and k = ceiling(log_2(MAXCLASSICAL - 3)). */ #define WORK 400 /* If integers are of length <= MAXCLASSICAL * classical multiplication is used, * i.e. the Karatsuba algorithm is not invoked. * MAXCLASSICAL <= FIXED. * Also the Karatsuba algorithm KARATSUBA uses classical multiplication * for operands of length <= MAXCLASSICAL. * The Karatsuba algorithm requires MAXCLASSICAL >= 4. */ #define MAXCLASSICAL 14 /*------------------------------------------- Function Prototypes -------------------------------------------*/ #include "sacproto.h" /*------------------------------------------- Macros --------------------------------------------*/ #include "sacmacros.h" /*------------------------------------------- External Variables -------------------------------------------*/ /* List processing */ extern Word AVAIL; extern char *BACSTACK; extern Word GCC; extern Word GCCC; extern Word GCAC; extern Word GCGLOBALS; extern Word GCM; extern Word NU; extern Word RHO; extern Word *SPACE; extern Word *SPACEB; extern Word *SPACEB1; extern Word GCAAVAIL; extern GCArray *GCASPACE; extern GCArray *GCASPACEBp; extern Word NUp; extern Word BETAp; extern Word BETApp; /* Timing */ extern Word TAU; extern Word TAU0; extern Word TAU1; /* Integer arithmetic */ extern Word DELTA; extern Word EPSIL; extern Word ETA; extern Word RINC; extern Word RMULT; extern Word RTERM; extern Word TABP2[]; extern Word THETA; extern Word TMI[128]; extern Word ZETA; /* Miscellaneous */ extern BDigit *FFPLUS1; extern BDigit FFSIZE; extern Word NPFDS; extern Word SPRIME; extern Word NSPRIME; extern Word MPRIME; extern Word NMPRIME; extern Word LPRIME; extern Word NLPRIME; extern Word UZ210; extern Word NPTR1; extern Word GCAPTR1; /* Input/Output */ extern Word LASTCHAR; #endif saclib2.2.8/include/sactypes.h0000664002275300236100000000054314017255270015401 0ustar wcbrownscs/*=============================================== sactypes.h Header file for SACLIB type definitions ===============================================*/ #ifndef SACTYPES_H #define SACTYPES_H #include "sacsys.h" typedef struct {Word next; Word flag; Word len; Word *array;} GCArray; #define BDigit Word #define DWord long long #endif saclib2.2.8/include/sacproto.h0000664002275300236100000015534614017255270015414 0ustar wcbrownscsextern void FAIL P__((const char *algName, const char *msg,...)) __noreturn; extern void AADV P__((Word L, Word *a_, Word *Lp_)); extern Word ABS P__((Word a)); extern Word ACLOCK P__((void)); extern void ADDTO P__((Word *A, Word *B, Word n)); extern void ADV2 P__((Word L, Word *a_, Word *b_, Word *Lp_)); extern void ADV3 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *Lp_)); extern void ADV4 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_, Word *Lp_)); extern void ADV P__((Word L, Word *a_, Word *Lp_)); extern Word AFCOMP P__((Word M, Word I, Word a, Word b)); extern Word AFCR P__((Word A)); extern Word AFDIF P__((Word a, Word b)); extern void AFDWRITE P__((Word M, Word I, Word b, Word n)); extern Word AFFINT P__((Word M)); extern Word AFFRN P__((Word R)); extern Word AFGEN P__((void)); extern Word AFICR P__((Word A)); extern Word AFINV P__((Word M, Word a)); extern Word AFNEG P__((Word a)); extern Word AFPAFP P__((Word r, Word M, Word a, Word B)); extern Word AFPAFQ P__((Word r, Word M, Word A, Word b)); extern Word AFPCMV P__((Word r, Word M, Word A, Word B)); extern Word AFPCR P__((Word r, Word A)); extern Word AFPDIF P__((Word r, Word A, Word B)); extern Word AFPDMV P__((Word r, Word M, Word A)); extern Word AFPEMV P__((Word r, Word M, Word A, Word a)); extern Word AFPEV P__((Word r, Word M, Word A, Word i, Word a)); extern Word AFPFIP P__((Word r, Word A)); extern Word AFPFRP P__((Word r, Word A)); extern Word AFPHIIR P__((BDigit n, interval I, Word A, BDigit k)); extern void AFPHIP P__((interval I, Word A, interval **B_, BDigit *t_)); extern Word AFPICR P__((Word r, Word A)); extern Word AFPINT P__((Word r, Word M, Word A, Word b)); extern Word AFPME P__((Word r, Word M, Word A, Word b)); extern Word AFPMON P__((Word r, Word M, Word A)); extern Word AFPNEG P__((Word r, Word A)); extern Word AFPNIP P__((Word M, Word A)); extern Word AFPNORM P__((Word r, Word M, Word B)); extern Word AFPPR P__((Word r, Word M, Word A, Word B)); extern void AFPQR P__((Word r, Word M, Word A, Word B, Word *Q_, Word *R_)); extern Word AFPROD P__((Word P, Word a, Word b)); extern void AFPSIP P__((Word I, Word A, BDigit p, BDigit *B)); extern Word AFPSIR P__((BDigit p, Word I, Word B, Word J)); extern Word AFPSUM P__((Word r, Word A, Word B)); extern void AFPWRITE P__((Word r, Word A, Word V, Word v)); extern Word AFQ P__((Word M, Word a, Word b)); extern Word AFSIGN P__((Word M, Word I, Word a)); extern Word AFSUM P__((Word a, Word b)); extern Word AFUPBRI P__((Word M, Word I, Word L)); extern Word AFUPCSFB P__((Word M, Word A)); extern Word AFUPFAC P__((Word M, Word B)); extern void AFUPFMRC P__((Word Q1, Word Q1p, Word q1, Word C1, Word L1, Word Q2, Word Q2p, Word q2, Word C2, Word *L2_, Word *C_)); extern Word AFUPFRPT P__((Word M, Word A, Word B)); extern void AFUPGC1 P__((Word M, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern void AFUPGC P__((Word M, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word AFUPGS P__((Word M, Word A)); extern void AFUPHIBRI P__((Word M, Word I, Word B, Word *L_, BDigit *t_)); extern Word AFUPIIR P__((Word M, Word I, Word B, Word J)); extern void AFUPIIWS P__((Word M, Word I, Word A, Word L)); extern void AFUPMPR P__((Word M, Word I, Word B, Word J, Word L, Word *Js_, Word *j_)); extern void AFUPQR P__((Word M, Word A, Word B, Word *Q_, Word *R_)); extern Word AFUPRB P__((Word M, Word I, Word A)); extern Word AFUPRICL P__((Word M, Word I, Word A)); extern Word AFUPRICS P__((Word M, Word I, Word A)); extern Word AFUPRII P__((Word M, Word J, Word A, Word Ap, Word d, Word Lp)); extern Word AFUPRL P__((Word M, Word A)); extern void AFUPRLS P__((Word M, Word I, Word A1, Word A2, Word L1, Word L2, Word *Ls1_, Word *Ls2_)); extern Word AFUPRRI P__((Word M, Word I, Word A, Word B, Word J, Word s1, Word t1)); extern void AFUPRRS P__((Word M, Word I, Word A1, Word A2, Word I1, Word I2, Word *Is1_, Word *Is2_, Word *s_)); extern Word AFUPSFBA P__((Word M, Word A, Word B)); extern Word AFUPSF P__((Word M, Word A)); extern void AFUPSFN P__((Word M, Word B, Word *s_, Word *Bt_, Word *F_)); extern void AFUPSIBRI P__((Word A, Word I, Word B, BDigit p, Word *J_, Word *L_)); extern Word AFUPSR P__((Word M, Word I, Word A, Word c)); extern Word AFUPVAR P__((Word M, Word I, Word A)); extern void AFUPWRITE P__((Word A, Word vA, Word vc)); extern Word AFUSPSFB P__((Word M, Word A)); extern void AFWRITE P__((Word A, Word v)); extern void AGIBL P__((BDigit **A, BDigit *n_, BDigit *k_)); extern void AGICOPY P__((BDigit **A, BDigit **B)); extern void AGIDP2 P__((BDigit **A, BDigit k, BDigit **B)); extern BDigit **AGIGCD2 P__((BDigit **A, BDigit **B)); extern BDigit **AGIGCDAE P__((BDigit **A, BDigit **B)); extern BDigit **AGIGCDW P__((BDigit **A, BDigit **B)); extern void AGIMD P__((BDigit **A, BDigit **B, BDigit **C)); extern void AGIMP2 P__((BDigit **A, BDigit h, BDigit **B)); extern void AGIMU P__((BDigit **A, BDigit k, BDigit **B)); extern BDigit AGINC P__((BDigit **A, BDigit **B)); extern void AGINORM P__((BDigit **A, BDigit *B, BDigit *T1, BDigit *T2)); extern void AGIPROD P__((BDigit **A, BDigit **B, BDigit **C, BDigit *T1, BDigit *T2)); extern void AGIQHQ P__((BDigit **A, BDigit *q_, BDigit *h_)); extern void AGIRP P__((BDigit **A, BDigit **B, BDigit **T, BDigit *k_)); extern void AGIRSUM P__((BDigit **A, BDigit **B, BDigit k, BDigit **C)); extern void AGISUM P__((BDigit **A, BDigit **B, BDigit **C)); extern void AGITR P__((BDigit **A, BDigit n, BDigit k, BDigit **B)); extern void AGIWRITE P__((BDigit **A)); extern BDigit AGIZERO P__((BDigit **A)); extern BDigit AICOMP P__((BDigit *A, BDigit *B)); extern void AICOPY P__((BDigit *A, BDigit *B)); extern void AIDP2 P__((BDigit *A, BDigit k, BDigit *B)); extern void AIFAN P__((Word M, Word *mh_, Word *Mh_)); extern Word AII P__((BDigit *A)); extern void AIMP2 P__((BDigit *A, BDigit h, BDigit *B)); extern void AINQ P__((BDigit *A, BDigit *B, BDigit *Q, BDigit *R, BDigit *S, BDigit *T)); extern void AIPROD P__((BDigit *A, BDigit *B, BDigit *C)); extern void AIQR P__((BDigit *A, BDigit *B, BDigit *Q, BDigit *R, BDigit *T)); extern void AISUM P__((BDigit *A, BDigit *B, BDigit *C)); extern void AITR P__((BDigit *A, BDigit n, BDigit k, BDigit *B)); extern BDigit AITRS P__((BDigit *A, BDigit n, BDigit k)); extern void AIWRITE P__((BDigit *A)); extern BDigit AIZERO P__((BDigit *A)); extern Word ALSIL P__((Word A, Word L)); extern Word AMLM P__((BDigit **M, BDigit m, BDigit n)); extern Word AMPDMV P__((Word r, Word A)); extern Word AMPSAFP P__((Word r, Word A)); extern Word AMSIGN P__((Word M, Word I, Word b)); extern void AMSIGNIR P__((Word M, Word I, Word b, Word *s_, Word *J_)); extern Word AMUPBES P__((Word M, Word I, Word A, Word c)); extern Word AMUPBHT P__((Word A, Word k)); extern Word AMUPIIR P__((Word M, Word I, Word B, Word J)); extern void AMUPIIWS P__((Word M, Word I, Word A, Word L)); extern void AMUPMPR P__((Word M, Word I, Word B, Word J, Word L, Word *Js_, Word *j_)); extern Word AMUPNT P__((Word A)); extern void AMUPRBH P__((Word M, Word I, Word A, Word *b_, Word *B_)); extern Word AMUPRICS P__((Word M, Word I, Word A)); extern void AMUPRICSW P__((Word M, Word I, Word A, Word *L_, Word *Is_)); extern void AMUPRINCS P__((Word M, Word I, Word A, Word a, Word b, Word *L_, Word *Is_)); extern void AMUPRLS P__((Word M, Word I, Word A1, Word A2, Word L1, Word L2, Word *Ls1_, Word *Ls2_)); extern void AMUPRRS P__((Word M, Word I, Word A1, Word A2, Word I1, Word I2, Word *Is1_, Word *Is2_, Word *s_)); extern Word AMUPSR P__((Word M, Word I, Word A, Word c)); extern Word AMUPTR1 P__((Word A)); extern Word AMUPTR P__((Word A, Word h)); extern void AMUPVARIR P__((Word M, Word I, Word A, Word *n_, Word *J_)); extern void ANDWRITE P__((Word M, Word I, Word n)); extern void ANFAF P__((Word M, Word I, Word a, Word *N_, Word *J_)); extern void ANHI P__((interval I, Word a, interval *J_, BDigit *t_)); extern void ANIIPE P__((Word M, Word I, Word N, Word J, Word t, Word L, Word *S_, Word *k_, Word *K_)); extern void ANPEDE P__((Word A, Word B, Word *C_, Word *t_)); extern void ANPROD P__((Word A, Word I, Word B, Word J, Word *C_, Word *K_)); extern Word ANR P__((BDigit p, Word A, Word I)); extern Word ANREPE P__((Word M, Word A, Word B, Word t)); extern void ANSI P__((BDigit *I, Word a, BDigit *J)); extern void ANSUM P__((Word A, Word I, Word B, Word J, Word *C_, Word *K_)); extern Word AREAD P__((void)); extern void ARGSACLIB P__((int argc, char **argv, int *ac_, char ***av_)); extern void ARIE P__((Word A, Word n, Word I)); extern void ASSPR P__((Word A, Word *p_, Word *m_)); extern void AWCOPY P__((Word *A, BDigit n, Word *B)); extern void AWRITE P__((Word A)); extern Word BDGCD P__((Word a, Word b)); extern void BEGINSACLIB P__((Word *p)); extern Word BERNOULLINUM P__((BDigit n)); extern Word BERNOULLIPOL P__((BDigit n, Word L)); extern Word BITRAN P__((void)); extern void BKSP P__((void)); extern Word BRILBRI P__((Word I)); extern Word CCONC P__((Word L1, Word L2)); extern Word CHEBY P__((BDigit n)); extern Word CINV P__((Word L)); extern void CLEAR P__((Word *A, Word n)); extern Word CLOCK P__((void)); extern void CLOUT P__((Word L)); extern Word COMP2 P__((Word a, Word b, Word L)); extern Word COMP3 P__((Word a1, Word a2, Word a3, Word L)); extern Word COMP4 P__((Word a1, Word a2, Word a3, Word a4, Word L)); extern Word COMP P__((Word a, Word L)); extern Word CONC P__((Word L1, Word L2)); extern void COPYTO P__((Word *A, Word *B, Word n)); extern void CPLEXN P__((Word L, Word *I_, Word *M_)); extern Word CREADB P__((void)); extern Word CREAD P__((void)); extern BDigit CSFAM P__((BDigit n, BDigit *A)); extern Word CSFPAR P__((Word L)); extern Word CSFS P__((Word S)); extern Word CSINT P__((Word A, Word B)); extern Word CSSUB P__((Word A, Word B)); extern Word CSUN P__((Word A, Word B)); extern void CTMI P__((Word *A)); extern void CWRITE P__((Word C)); extern Word DAND P__((Word a, Word b)); extern void DDPCC P__((Word a1, Word a0, Word b1, Word b0, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern void DDRPCC P__((Word m, Word a1, Word a0, Word b1, Word b0, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern void DEGCD P__((Word a, Word b, Word *c_, Word *u_, Word *v_)); extern Word DGCD P__((Word a, Word b)); extern void DIELOC P__((void)); extern Word DIGIT P__((Word C)); extern Word DIIPREAD P__((Word V)); extern void DIIPWRITE P__((Word r, Word A, Word V)); extern Word DIPDEG P__((Word r, Word A)); extern Word DIPFP P__((Word r, Word A)); extern void DIPINS P__((Word a, Word d, Word A, Word *t_, Word *B_)); extern Word DIRPREAD P__((Word V)); extern void DIRPWRITE P__((Word r, Word A, Word V)); extern void DLINIT P__((BDigit p, BDigit n, BDigit **Fp, BDigit **Gp, BDigit **A, BDigit **B, BDigit **C)); extern BDigit DLINV P__((BDigit a)); extern BDigit DLNEG P__((BDigit a)); extern Word DLOG2 P__((Word a)); extern BDigit DLPROD P__((BDigit a, BDigit b)); extern BDigit DLSUM P__((BDigit a, BDigit b)); extern Word DMPPRD P__((Word r, Word m, Word A, Word B)); extern Word DMPSUM P__((Word r, Word m, Word A, Word B)); extern Word DMUPNR P__((Word p, Word A, Word B)); extern Word DNIMP P__((Word a, Word b)); extern Word DNOT P__((Word a)); extern Word DOR P__((Word a, Word b)); extern void DPCC P__((Word a, Word b, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern Word DPFP P__((Word r, Word A)); extern Word DPGEN P__((Word m, Word k)); extern void DPR P__((Word A, Word B, Word *c1_, Word *c0_)); extern void DPRNN P__((Word A, Word B, Word *c1_, Word *c0_)); extern void DQR P__((Word a1, Word a0, Word b, Word *q_, Word *r_)); extern Word DRAN P__((void)); extern Word DRANN P__((void)); extern void DRPCC P__((Word m, Word a, Word b, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern Word DSMC P__((Word m, Word mp, Word u)); extern void DSQRTF P__((Word a, Word *b_, Word *t_)); extern Word DVCMP P__((Word d1, Word d2)); extern void ENDSACLIB P__((Word f)); extern Word EQUAL P__((Word a, Word b)); extern Word EVEN P__((Word a)); extern Word EXPF P__((Word a, Word b)); extern Word EXTENT P__((Word a)); extern BDigit FCOMP P__((BDigit *I, BDigit *J)); extern void FCOPY P__((Word *A, Word *B)); extern void FDIF P__((Word *A, Word *B, BDigit d, Word *C)); extern void FILINE P__((void)); extern void FIRST2 P__((Word L, Word *a_, Word *b_)); extern void FIRST3 P__((Word L, Word *a1_, Word *a2_, Word *a3_)); extern void FIRST4 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_)); extern void FIRST5 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_, Word *a5_)); extern void FIRST6 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_, Word *a5_, Word *a6_)); extern Word FIRST P__((Word L)); extern Word FLBRN P__((BDigit *F)); extern Word FOURTH P__((Word L)); extern void FPCATCH P__((void)); extern Word FPCHECK P__((void)); extern void FPROD1 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FPROD21 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FPROD2 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FPROD P__((Word *A, Word *B, BDigit d, Word *C)); extern void FQUOT P__((BDigit *A, BDigit *B, BDigit d, BDigit *C)); extern Word FRAPCR P__((Word **A)); extern Word **FRAPFMD P__((Word c, Word n)); extern void FRAPFREE P__((Word **A)); extern Word **FRAPGET P__((Word d, Word n)); extern Word **FRAPMON P__((Word p, Word *M, Word **A)); extern void FRAPREM P__((Word p, Word *M, Word **A, Word **B)); extern void FREEMATRIX P__((Word **A, Word n)); extern Word *FREINV P__((Word p, Word *M, Word *A)); extern void FREPROD P__((Word p, Word *M, Word *A, Word *B, Word *C)); extern void FRESL P__((Word n, Word *m_, Word *L_)); extern Word FRLSM P__((Word m, Word a)); extern Word **FRUPCR P__((Word A, Word n)); extern Word FRUPGCD P__((Word p, Word M, Word A, Word B)); extern void FSUM P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMDEOS1 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMDEOS2 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMDESS P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMSEOS P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMSESS P__((Word *A, Word *B, BDigit d, Word *C)); extern Word *GCA2PTR P__((Word A)); extern void GCAFREE P__((Word A)); extern Word GCAGET P__((Word A, Word i)); extern Word GCAMALLOC P__((Word s, Word f)); extern void GCASET P__((Word A, Word i, Word a)); extern Word GCATL P__((Word A, Word n)); extern void GC P__((void)); extern void GCGLOBAL P__((Word *p)); extern void GCSI P__((Word s, char *EACSTACK)); extern Word GDPGEN P__((Word m, Word k)); extern interval **GETAHIA P__((BDigit (n))); extern Word *GETARRAY P__((Word n)); extern interval *GETHIPARRAY P__((BDigit n)); extern Word **GETMATRIX P__((Word m, Word n)); extern BDigit **GIAGI P__((Word A)); extern Word GICONJ P__((Word A)); extern Word GIDIF P__((Word A, Word B)); extern Word GIFP P__((Word A1, Word A2)); extern Word GIFQA P__((Word a)); extern Word GIGCD P__((Word A, Word B)); extern BDigit GIHQ P__((Word a)); extern Word GIMS P__((Word a, Word b)); extern Word GINEG P__((Word A)); extern Word GINORM P__((Word A)); extern Word GINQ P__((Word a, Word b)); extern void GINQR P__((Word A, Word B, Word *Q_, Word *R_)); extern void GIPGEN P__((Word N, Word *L1_, Word *L2_)); extern Word GIPROD P__((Word A, Word B)); extern Word GIRP P__((Word a)); extern Word GISUM P__((Word A, Word B)); extern void GIWRITE P__((Word a)); extern Word GREAD P__((void)); extern void GWRITE P__((Word a)); extern BDigit HEXP P__((double a)); extern BDigit HIACC P__((interval I)); extern void HIDWRITE P__((interval I, BDigit k)); extern Word HILBRI P__((interval I)); extern void HIPBHT P__((BDigit n, interval A[], BDigit k, interval **B_, BDigit *t_)); extern interval *HIPCHT P__((BDigit n, interval A[])); extern interval *HIPCOPY P__((BDigit n, interval A[])); extern void HIPDWRITE P__((BDigit n, interval *A, BDigit k)); extern Word HIPFES P__((BDigit n, interval A[], double a)); extern interval HIPIEVAL P__((BDigit n, interval A[], interval I)); extern void HIPIR P__((BDigit n, interval A[], interval I, BDigit t, BDigit h, BDigit k, interval *J_, BDigit *j_)); extern void HIPLWRITE P__((BDigit n, interval *A)); extern interval *HIPNEGT P__((BDigit n, interval A[])); extern BDigit HIPPRB P__((BDigit n, interval *A)); extern interval HIPROD P__((interval I, interval J)); extern void HIPRRID P__((BDigit n, interval *A, Word *L_, BDigit *t_)); extern void HIPRRISD P__((BDigit n, interval *A, Word a, Word b, Word *L_, BDigit *t_)); extern interval *HIPRT P__((BDigit n, interval *A)); extern Word HIPSV P__((BDigit n, interval *A)); extern interval *HIPTR1 P__((BDigit n, interval A[])); extern void HIPVCHT P__((BDigit n, interval *A, BDigit *v_, BDigit *t_)); extern interval HIQUOT P__((interval I, interval J)); extern Word HISIGN P__((interval I)); extern interval HISUM P__((interval I, interval J)); extern BDigit HSIGN P__((double a)); extern Word IABSF P__((Word A)); extern Word IACOMPA P__((Word *A, Word m, Word *B, Word n)); extern BDigit *IAI P__((Word A)); extern Word IBCIND P__((Word A, Word n, Word k)); extern Word IBCOEF P__((Word n, Word k)); extern Word IBCOEFS P__((Word n)); extern Word IBCPS P__((Word n, Word k)); extern Word IBPPOL P__((Word A, Word a, Word k)); extern Word IBPPOS P__((Word A, Word a, Word b, Word e, Word k)); extern Word ICOMP P__((Word A, Word B)); extern Word ICRAND P__((Word n, Word s)); extern void IDEGCD P__((Word a, Word b, Word *c_, Word *u1_, Word *v1_, Word *u2_, Word *v2_)); extern Word IDENTMAT P__((Word n)); extern Word IDEQ P__((Word A, Word b)); extern void IDIFA P__((Word *A, Word m, Word *B, Word n, Word *k_)); extern Word IDIF P__((Word A, Word B)); extern Word IDIPR2 P__((Word A, Word B, Word a, Word b)); extern void IDLCOMB P__((Word *A, Word m, Word *B, Word n, Word u1, Word v1, Word u2, Word v2, Word s, Word t, Word *mp_, Word *np_)); extern Word IDP2 P__((Word A, Word k)); extern Word IDPR P__((Word A, Word b)); extern Word IDQ P__((Word A, Word b)); extern void IDQRA P__((Word *A, Word m, Word b, Word *Q, Word *k_, Word *r_)); extern void IDQR P__((Word A, Word b, Word *Q_, Word *r_)); extern Word IDREM P__((Word A, Word b)); extern void IEAS P__((Word *A1, Word m1, Word *A2, Word m2, Word *m1p_)); extern void IEEEDWRITE P__((ieee F, BDigit k)); extern Word IEEELBRN P__((double F)); extern void IEEENEIGH P__((ieee F, BDigit d, ieee *Fp_, BDigit *t_)); extern void IEEEROUND P__((ieee F, BDigit s, BDigit d, ieee *Fp_, BDigit *t_)); extern void IEEEWRITE P__((ieee F)); extern void IEGCD P__((Word a, Word b, Word *c_, Word *u1_, Word *v1_)); extern Word IEQ P__((Word A, Word B)); extern Word IEVEN P__((Word A)); extern Word IEXP P__((Word A, Word n)); extern Word IFACT P__((Word n)); extern Word IFACTL P__((Word n)); extern Word IFATL P__((Word *A, Word m, Word s)); extern void IF P__((Word I, BDigit p, BDigit d, BDigit *A)); extern void IFCL2 P__((Word a, Word *m_, Word *n_)); extern BDigit IFEC P__((Word I, BDigit p, BDigit *A)); extern void IFLTA P__((Word A, Word *B, Word b, Word **Bp_, Word *n_, Word *s_, Word *o_)); extern Word IGCD P__((Word A, Word B)); extern void IGCDCF P__((Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word IHDREM P__((Word *A, Word n, Word b)); extern void IHEAS P__((Word *A1, Word m1, Word *A2, Word m2, Word *V1, Word n1, Word *V2, Word n2, Word *mp_, Word *np_)); extern void IHEGCD P__((Word A, Word B, Word *C_, Word *V_)); extern void IHI P__((Word A, interval *I_, BDigit *u_)); extern Word IIC P__((Word A, Word Ap, Word I, Word L)); extern void IIEEE P__((Word A, BDigit d, ieee *F_, BDigit *u_)); extern void IIEEET P__((Word A, ieee *F_, BDigit *t_, BDigit *u_)); extern Word ILBRN P__((Word I)); extern Word ILCM P__((Word A, Word B)); extern Word ILCOMB P__((Word A, Word B, Word u, Word v)); extern Word ILOG2 P__((Word A)); extern Word ILOGB P__((Word A)); extern void ILPDS P__((Word n, Word a, Word b, Word *p_, Word *np_)); extern void ILSA P__((BDigit *A, BDigit n, BDigit k)); extern void ILWORD P__((Word *A, Word m, Word *B, Word n, Word *a_, Word *b_)); extern void ILWORDS P__((Word *A, Word m, Word *B, Word n, Word *a1_, Word *a0_, Word *b1_, Word *b0_)); extern void ILWRITE P__((Word L)); extern Word IMAX P__((Word a, Word b)); extern Word IMIN P__((Word a, Word b)); extern Word IMP2 P__((Word A, Word h)); extern void IMPBAA P__((Word *A, Word *B, Word m, Word n, Word s, Word t, Word h, Word *p_, Word *u_)); extern void IMPB P__((Word A, Word n, Word *B_, Word *t_)); extern void IMPDS P__((Word n, Word a, Word b, Word *p_, Word *q_)); extern void INEGA P__((Word *A, Word n)); extern Word INEG P__((Word A)); extern void INFOSACLIB P__((const char *s)); extern Word INQ P__((Word a, Word b)); extern void INQR P__((Word A, Word B, Word *Q_, Word *R_)); extern Word INSET P__((Word S, Word a)); extern Word INV P__((Word L)); extern BDigit *INVPERM P__((BDigit n, BDigit *A)); extern Word IODD P__((Word A)); extern Word IORD2 P__((Word A)); extern Word IPABS P__((Word r, Word A)); extern Word IPAFME P__((Word r, Word M, Word A, Word b)); extern Word IPBEILV P__((Word r, Word A, Word c, Word k, Word m)); extern Word IPBEZM P__((BDigit r, Word A, Word B)); extern Word IPBHT P__((Word r, Word A, Word i, Word k)); extern Word IPBHTLV P__((Word r, Word A, Word k)); extern Word IPBHTMV P__((Word r, Word A, Word k)); extern Word IPBREI P__((Word r, Word A, Word i, Word c)); extern void IPCA P__((BDigit r, Word A, BDigit *n_, BDigit *h_, BDigit *k_, BDigit *t_)); extern Word IPC P__((Word r, Word A)); extern void IPCEVP P__((Word r, Word A, Word *B_, Word *L_)); extern Word IPCONST P__((Word r, Word A)); extern void IPCPP P__((Word r, Word A, Word *C_, Word *Ab_)); extern Word IPCRA P__((Word M, Word m, Word mp, Word r, Word A, Word a)); extern Word IPCSFB P__((Word r, Word A)); extern Word IPDER P__((Word r, Word A, Word i)); extern Word IPDIF P__((Word r, Word A, Word B)); extern Word IPDMV P__((Word r, Word A)); extern void IPDQNR P__((Word r, Word A, Word m, Word *Q_, Word *R_)); extern void IPDQR P__((Word r, Word A, Word m, Word *Q_, Word *R_)); extern Word IPDSCRBEZ P__((Word r, Word A)); extern Word IPDSCR P__((Word r, Word A)); extern void IPDWRITE P__((Word r, Word A, Word V)); extern Word IPEMV P__((Word r, Word A, Word a)); extern Word IPEQ P__((Word r, Word A, Word B)); extern Word IPEVAL P__((Word r, Word A, Word i, Word a)); extern Word IPEXP P__((Word r, Word A, Word n)); extern void IPEXPREAD P__((Word r, Word V, Word *A_, Word *t_)); extern void IPEXPREADR P__((Word r, Word V, Word *A_, Word *t_)); extern void IPFAC P__((Word r, Word A, Word *s_, Word *c_, Word *L_)); extern void IPFACTREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word IPFCB P__((Word V)); extern Word IPFLC P__((Word r, Word M, Word I, Word A, Word L, Word D)); extern Word IPFRP P__((Word r, Word A)); extern Word IPFSD P__((Word r, Word A)); extern Word IPFSFB P__((Word r, Word A)); extern void IPGCDC P__((Word r, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word IPGFCB P__((Word r, Word A)); extern Word IPGSUB P__((Word r, Word A, Word s, Word L)); extern Word IPGTDRAN P__((BDigit r, BDigit k, BDigit n, Word q)); extern Word IPHDMV P__((Word r, Word A, Word k)); extern Word IPIC P__((Word r, Word A)); extern void IPICPP P__((Word r, Word A, Word *a_, Word *Ab_)); extern Word IPICS P__((Word r, Word A, Word c)); extern Word IPIHOM P__((Word r, Word D, Word A)); extern Word IPIIRB P__((Word A, Word I, Word t, Word k)); extern void IPIIS P__((Word A1, Word A2, Word I1, Word I2, Word t1, Word t2, Word *J1_, Word *J2_, Word *s_)); extern Word IPIISS P__((Word M, Word a, Word b, Word v1, Word v2)); extern void IPIIWS P__((Word A, Word L)); extern Word IPINT P__((Word r, Word A, Word b)); extern Word IPIP P__((Word r, Word a, Word B)); extern Word IPIPP P__((Word r, Word A)); extern Word IPIPR P__((Word r, Word D, Word A, Word B)); extern Word IPIQ P__((Word r, Word A, Word b)); extern void IPIQH P__((Word r, Word p, Word D, Word Ab, Word Bb, Word Sb, Word Tb, Word M, Word C, Word *A_, Word *B_)); extern void IPLCPP P__((Word r, Word A, Word *C_, Word *P_)); extern Word IPLEV P__((Word S, Word a)); extern Word IPLRRI P__((Word L)); extern Word IPLSEVAL P__((Word L, Word a)); extern Word IPLSILM P__((Word L1, Word L2)); extern Word IPMAXN P__((Word r, Word A)); extern void IPMONFACT P__((Word r, Word A, Word *L_, Word *Ap_)); extern Word IPNEG P__((Word r, Word A)); extern Word IPNT P__((Word r, Word A, Word i)); extern Word IPONE P__((Word r, Word A)); extern void IPOWER P__((Word A, Word L, Word *B_, Word *n_)); extern Word IPP2P P__((Word r, Word B, Word m)); extern Word IPPFAC2 P__((Word r, Word A)); extern Word IPPGSD P__((Word r, Word A)); extern Word IPPNPRS P__((Word A, Word B)); extern void IPPOWREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word IPPP P__((Word r, Word A)); extern Word IPPROD P__((Word r, Word A, Word B)); extern Word IPPSC P__((Word r, Word A, Word B)); extern Word IPPSR P__((Word r, Word A, Word B)); extern Word IPPVED P__((Word r, Word A)); extern Word IPQ P__((Word r, Word A, Word B)); extern void IPQR P__((Word r, Word A, Word B, Word *Q_, Word *R_)); extern Word IPRAN P__((Word r, Word k, Word q, Word N)); extern Word IPRCH P__((Word A, Word I, Word k)); extern Word IPRCHS P__((Word A, Word I, Word k)); extern Word IPRCN1 P__((Word A, Word I, Word s, Word k)); extern void IPRCNP P__((Word A, Word I, Word *sp_, Word *spp_, Word *J_)); extern void IPREAD P__((Word *r_, Word *A_)); extern Word IPRESBEZ P__((BDigit r, Word A, Word B)); extern Word IPRES P__((BDigit r, Word A, Word B)); extern Word IPRESPRS P__((BDigit r, Word A, Word B)); extern Word IPRICL P__((Word A)); extern Word IPRIM P__((Word A)); extern Word IPRIMO P__((Word A, Word Ap, Word I)); extern Word IPRIMS P__((Word A, Word Ap, Word I)); extern Word IPRIMU P__((Word A)); extern Word IPRIMW P__((Word A)); extern void IPRIP P__((Word A, Word *A1_, Word *A2_)); extern Word IPRIST P__((Word A)); extern Word IPRNME P__((Word r, Word A, Word b)); extern Word IPROD2X2 P__((Word A, Word B)); extern Word IPROD3X2 P__((Word A, Word B)); extern Word IPROD3X3 P__((Word A, Word B)); extern void IPRODA P__((Word *A, Word n1, Word *B, Word n2, Word *C)); extern void IPRODAP P__((Word *A, Word n1, Word *B, Word n2, Word *n3_)); extern Word IPROD P__((Word A, Word B)); extern Word IPRPRS P__((Word r, Word A, Word B)); extern Word IPRRID P__((Word A)); extern Word IPRRII P__((Word A, Word Ap, Word d, Word Lp)); extern Word IPRRIRDB P__((Word A, Word k)); extern Word IPRRIRSB P__((Word A, Word k)); extern Word IPRRIS P__((Word A)); extern Word IPRRISD P__((Word A, Word a, Word b)); extern Word IPRRISI P__((Word A, Word I)); extern Word IPRRISS P__((Word M, Word a, Word b, Word v1, Word v2, Word s)); extern void IPRRLS P__((Word A1, Word A2, Word L1, Word L2, Word *Ls1_, Word *Ls2_)); extern Word IPRRRI P__((Word A, Word B, Word I, Word s1, Word t1)); extern void IPRRS P__((Word A1, Word A2, Word I1, Word I2, Word *Is1_, Word *Is2_, Word *s_)); extern Word IPSBLSIL P__((Word A)); extern Word IPSBLSSIL P__((Word A)); extern void IPSCPP P__((Word r, Word A, Word *s_, Word *C_, Word *Ab_)); extern Word IPSFBA P__((Word r, Word A, Word B)); extern Word IPSF P__((Word r, Word A)); extern Word IPSFSD P__((Word r, Word A)); extern Word IPSIFI P__((Word A, Word I)); extern Word IPSIGN P__((Word r, Word A)); extern void IPSIP P__((Word A, BDigit p, Word *B)); extern Word IPSMV P__((Word r, Word A, Word B)); extern Word IPSPRS P__((Word r, Word A, Word B)); extern Word IPSQRT P__((Word r, Word A)); extern Word IPSRM P__((Word A, Word I)); extern Word IPSRMS P__((Word A, Word I)); extern void IPSRP P__((Word r, Word A, Word *a_, Word *Ab_)); extern Word IPSTDRAN P__((Word r, Word k, Word q, Word n)); extern Word IPSUB P__((Word r, Word A, Word i, Word B)); extern Word IPSUM P__((Word r, Word A, Word B)); extern Word IPSUMN P__((Word r, Word A)); extern void IPTERMREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word IPTPR P__((Word r, Word D, Word A, Word B)); extern Word IPTR1 P__((Word r, Word A, Word i)); extern Word IPTR1LV P__((Word r, Word A)); extern Word IPTRAN P__((Word r, Word A, Word T)); extern Word IPTR P__((Word r, Word A, Word i, Word h)); extern Word IPTRLV P__((Word r, Word A, Word h)); extern Word IPTRMV P__((Word r, Word A, Word h)); extern Word IPTRUN P__((Word r, Word D, Word A)); extern Word IPVCHT P__((Word A)); extern Word IPVCHTP P__((Word A)); extern void IPVDEG12 P__((Word r, Word A, Word *k_, Word *B_)); extern void IPWRITE P__((Word r, Word A, Word V)); extern Word IQ P__((Word A, Word B)); extern void IQRA P__((Word *A, Word m, Word *B, Word n, Word *Q, Word *mp_, Word *k_)); extern void IQR P__((Word A, Word B, Word *Q_, Word *R_)); extern Word IRAND P__((Word n)); extern Word IREAD P__((void)); extern Word IREM P__((Word A, Word B)); extern void IRLSA P__((Word *A, Word n, Word k, Word *np_)); extern void IROOT P__((Word A, Word n, Word *B_, Word *t_)); extern Word ISATOM P__((Word a)); extern Word ISCSELT P__((Word i, Word C)); extern void ISEM P__((Word A, BDigit *s_, BDigit *e_, BDigit *m1_, BDigit *m0_, BDigit *t_)); extern Word ISFPF P__((Word r, Word A)); extern Word ISFPIR P__((Word A, Word I, Word k)); extern Word ISGCA P__((Word a)); extern void ISI P__((Word I, BDigit p, BDigit *A)); extern Word ISIGNF P__((Word A)); extern void ISLCOMB P__((Word *A, Word m, Word *B, Word n, Word v, Word s, Word *mp_)); extern Word ISLIST P__((Word a)); extern Word ISMC P__((Word M, Word Mp, Word m, Word U)); extern Word ISNIL P__((Word a)); extern Word ISOBJECT P__((Word a)); extern void ISPD P__((Word n, Word *F_, Word *m_)); extern Word ISPFAC2 P__((Word r, Word A)); extern void ISPROD P__((Word *A, BDigit n1, Word *B, BDigit n2, Word *C)); extern Word ISPSFB P__((Word r, Word A)); extern Word ISPT P__((Word m, Word mp, Word F)); extern void ISQRT P__((Word A, Word *B_, Word *t_)); extern Word ISSUBSET P__((Word A, Word B)); extern Word ISUM P__((Word A, Word B)); extern Word ISZERO P__((Word a)); extern Word ITRUNC P__((Word A, Word n)); extern Word IUPBEI P__((Word A, Word c, Word k)); extern Word IUPBES P__((Word A, Word a)); extern Word IUPBHT P__((Word A, Word k)); extern void IUPBREA P__((Word A, Word *C, Word m, Word t, Word k, Word *B, Word M, Word *p_, Word *s_)); extern Word IUPBRE P__((Word A, Word a)); extern BDigit IUPBRES P__((Word A, Word a)); extern Word IUPBREV P__((Word A, Word a)); extern Word IUPCHT P__((Word A)); extern void IUPEFD P__((Word p, Word Q, Word C, Word M, Word L, Word G, Word D, Word d, Word *F_, Word *Cb_, Word *Gb_, Word *Mb_, Word *Ib_, Word *Db_)); extern Word IUPENF P__((Word A)); extern Word IUPEVAL P__((Word A, Word a)); extern void IUPFAC P__((Word A, Word *s_, Word *c_, Word *L_)); extern void IUPFCT P__((Word p, Word Q, Word Qp, Word q, Word C, Word M, Word L, Word G, Word D, Word e, Word d, Word k, Word *F_, Word *Cb_, Word *Mb_, Word *Lb_, Word *Gb_, Word *Db_)); extern void IUPFT2 P__((Word p, Word Q, Word Qp, Word q, Word A, Word B, Word *Ab_, Word *B1_, Word *B2_)); extern void IUPFT P__((Word p, Word Q, Word Qp, Word q, Word A, Word B, Word *Ab_, Word *Bb_)); extern void IUPHIP P__((Word A, interval **B_, BDigit *t_)); extern Word IUPHLEFD P__((Word p, Word F, Word C, Word E, Word G)); extern Word IUPIHT P__((Word A, Word n)); extern Word IUPIIR P__((Word A, Word I)); extern void IUPILHS P__((Word q, Word Q, Word Ab, Word Bb, Word Sb, Word Tb, Word C, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern Word IUPLB P__((Word A, Word k)); extern void IUPLHS P__((Word q, Word Q, Word Qpp, Word Ab, Word Bb, Word Sb, Word Tb, Word Ap, Word Bp, Word Yp, Word Zp, Word U, Word D, Word A, Word B, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern void IUPLHSL P__((Word q, Word Q, Word Qpp, Word Ab, Word Bb, Word Sb, Word Tb, Word Ap, Word Bp, Word Yp, Word Zp, Word U, Word D, Word A, Word B, Word *Qs_, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern Word IUPLRB P__((Word A)); extern Word IUPNT P__((Word A)); extern Word IUPPRB P__((Word A)); extern void IUPQH P__((Word p, Word Ab, Word Bb, Word Sb, Word Tb, Word M, Word C, Word *A_, Word *B_)); extern Word IUPQHL P__((Word p, Word F, Word M, Word C)); extern Word IUPQS P__((Word A)); extern Word IUPRB P__((Word A)); extern void IUPRC P__((Word A, Word B, Word *C_, Word *R_)); extern Word IUPRLP P__((Word A)); extern Word IUPRRAFE P__((Word A, Word E, Word k)); extern void IUPSQHL P__((Word p, Word Ab, Word Bb, Word Sb, Word Tb, Word Q, Word C, Word *A_, Word *B_, Word *S_, Word *T_)); extern void IUPSQHLL P__((Word p, Word q, Word A, Word C, Word *Ap_, Word *Bp_, Word *Sp_, Word *Tp_)); extern void IUPSR P__((Word A, Word B, Word *ab_, Word *bb_, Word *C_)); extern Word IUPSWN P__((Word A)); extern Word IUPTPR P__((Word n, Word A, Word B)); extern Word IUPTR1 P__((Word A)); extern Word IUPTR P__((Word A, Word h)); extern Word IUPVAR P__((Word A)); extern Word IUPVART P__((Word A)); extern Word IUPVOI P__((Word A, Word I)); extern Word IUPVSI P__((Word A, Word I)); extern void IUPWRITE P__((Word A, Word v)); extern Word IUSFPF2 P__((Word A)); extern Word IUSFPF P__((Word A)); extern void IUSFPMF P__((Word A, Word *p_, Word *F_, Word *C_, Word *L_)); extern void IWRITE P__((Word A)); extern void KARATSUBA P__((Word *A, Word n1, Word *B, Word n2, Word *C, Word *W)); extern Word LAST P__((Word L)); extern Word LASTCELL P__((Word L)); extern Word LBIBMS P__((Word L)); extern void LBIBS P__((Word L)); extern Word LBIM P__((Word L1, Word L2)); extern Word LBRIBRI P__((Word I)); extern void LBRIDWRITE P__((Word I, Word n)); extern void LBRIHI P__((Word I, interval *J_, BDigit *t_)); extern Word LBRIMID P__((Word I)); extern Word LBRINPROD P__((Word I, Word c)); extern Word LBRINSUM P__((Word I, Word c)); extern Word LBRIREAD P__((void)); extern void LBRISI P__((Word I, BDigit p, Word *J)); extern Word LBRIW P__((Word I)); extern void LBRIWRITE P__((Word I)); extern Word LBRN P__((BDigit k, Word a)); extern Word LBRNCOMP P__((Word A, Word B)); extern Word LBRNDIF P__((Word R, Word S)); extern void LBRNDWRITE P__((Word R, BDigit n)); extern void LBRNF P__((Word B, BDigit p, BDigit d, BDigit *A)); extern BDigit LBRNFEC P__((Word B, BDigit p, BDigit *A)); extern Word LBRNFIE P__((Word I, Word e)); extern void LBRNIEEE P__((Word A, BDigit d, ieee *F_, BDigit *u_)); extern void LBRNIEEEE P__((Word A, BDigit *t_, ieee *F_, BDigit *n_)); extern Word LBRNNEG P__((Word R)); extern Word LBRNP2PROD P__((Word r, Word k)); extern Word LBRNPROD P__((Word r, Word s)); extern Word LBRNREAD P__((void)); extern Word LBRNRN P__((Word A)); extern Word LBRNSIGN P__((Word A)); extern Word LBRNSUM P__((Word R, Word S)); extern void LBRNWRITE P__((Word A)); extern Word LCONC P__((Word L)); extern Word LCOPY P__((Word L)); extern Word LDELETE P__((Word e, Word L)); extern void LDSMKB P__((Word A, Word b, Word *xs_, Word *N_)); extern void LDSSBR P__((Word A, Word b, Word *xs_, Word *N_)); extern Word LEINST P__((Word A, Word i, Word a)); extern Word LELTI P__((Word A, Word i)); extern Word LENGTH P__((Word L)); extern Word LEROT P__((Word L, Word i, Word j)); extern Word LETTER P__((Word C)); extern Word LEXNEX P__((Word A)); extern BDigit LEXNEXT P__((BDigit n, BDigit m, BDigit *A)); extern void LEXNEXTC P__((Word n, Word k, Word *I, Word *t_)); extern Word LFML P__((Word L)); extern Word LFS P__((const char *s)); extern Word LGIE P__((Word L, Word I)); extern void LIBS P__((Word L)); extern void LINS P__((Word a, Word L)); extern Word LINSRT P__((Word a, Word A)); extern Word LIST10 P__((Word a1, Word a2, Word a3, Word a4, Word a5, Word a6, Word a7, Word a8, Word a9, Word a10)); extern Word LIST1 P__((Word a)); extern Word LIST2 P__((Word a, Word b)); extern Word LIST3 P__((Word a1, Word a2, Word a3)); extern Word LIST4 P__((Word a1, Word a2, Word a3, Word a4)); extern Word LIST5 P__((Word a1, Word a2, Word a3, Word a4, Word a5)); extern Word LIST6 P__((Word a1, Word a2, Word a3, Word a4, Word a5, Word a6)); extern Word LKAHEAD P__((void)); extern Word LLCOPY P__((Word L)); extern Word LLGIE P__((Word L, Word I)); extern void LLTGCA P__((Word L, Word *A_, Word *n_)); extern Word LMERGE P__((Word A, Word B)); extern void LPBSD P__((Word L)); extern Word LPERM P__((Word L, Word P)); extern Word LREAD P__((void)); extern void LSHIFT1 P__((Word *A, BDigit n)); extern Word LSICOMP P__((Word I, Word J)); extern Word LSIIT P__((Word I, Word J)); extern Word LSILW P__((Word I)); extern Word LSIM P__((Word a, Word b)); extern Word LSRCH P__((Word a, Word A)); extern void LWRITE P__((Word L)); extern Word MAIPDE P__((Word r, Word M)); extern Word MAIPDM P__((Word r, Word M)); extern Word MAIPDME P__((BDigit r, Word M)); extern Word MAIPHM P__((Word r, Word m, Word A)); extern Word MAIPP P__((Word r, Word A, Word B)); extern void MAPASSIGN P__((Word *A, Word *B)); extern Word *MAPCOPY P__((Word *A)); extern void MAPDIF P__((Word m, Word *A, Word *B, Word *C)); extern Word *MAPFMD P__((Word a, Word n)); extern Word *MAPFMUP P__((Word A)); extern Word *MAPFMUPS P__((Word A, Word k)); extern Word *MAPFV P__((Word n, Word *A)); extern Word *MAPGCD P__((BDigit p, Word *A, Word *B)); extern void MAPHOM P__((Word m, Word *A, Word *B)); extern void MAPIDIF P__((Word m, Word *A, Word *B)); extern void MAPMADD P__((Word m, Word *A, Word b, Word j, Word *C)); extern Word *MAPMON P__((BDigit p, BDigit *A)); extern void MAPMPV P__((Word *A, Word k)); extern void MAPPROD P__((Word m, Word *A, Word *B, Word *C)); extern void MAPQR P__((Word m, Word *A, Word *B, Word *Q)); extern void MAPRS P__((BDigit p, Word *A, Word *B)); extern void MAPSE P__((Word m, Word *A, Word *B, Word *S, Word *T, Word *C, Word *U, Word *V)); extern BDigit MAPSEV P__((BDigit *A, BDigit a)); extern void MAPSUM P__((Word m, Word *A, Word *B, Word *C)); extern void MAPTPR P__((Word m, Word n, Word *A, Word *B, Word *C)); extern void MARK P__((Word L)); extern Word MAX P__((Word a, Word b)); extern Word MCPMV P__((Word n, Word L)); extern Word MDCRA P__((Word m1, Word m2, Word mp1, Word a1, Word a2)); extern Word MDDIF P__((Word m, Word a, Word b)); extern Word MDEXP P__((Word m, Word a, Word n)); extern Word MDHOM P__((Word m, Word A)); extern Word MDINVB P__((Word a)); extern Word MDINV P__((Word m, Word a)); extern Word MDLCRA P__((Word m1, Word m2, Word L1, Word L2)); extern Word MDNEG P__((Word m, Word a)); extern Word MDPROD P__((Word m, Word a, Word b)); extern Word MDQ P__((Word m, Word a, Word b)); extern Word MDRAN P__((Word m)); extern Word MDSUM P__((Word m, Word a, Word b)); extern Word MEMBER P__((Word a, Word L)); extern Word MIAIM P__((Word A)); extern Word MICINS P__((Word A, Word V)); extern Word MICS P__((Word A)); extern Word MIDCRA P__((Word M, Word m, Word mp, Word A, Word a)); extern Word MIDIF P__((Word M, Word A, Word B)); extern Word MIEXP P__((Word M, Word A, Word N)); extern Word MIHOM P__((Word M, Word A)); extern Word MIINV P__((Word M, Word A)); extern Word MIN P__((Word a, Word b)); extern Word MINEG P__((Word M, Word A)); extern Word MINNCT P__((Word A)); extern Word MIPDIF P__((Word r, Word M, Word A, Word B)); extern Word MIPEMV P__((Word r, Word M, Word A, Word a)); extern Word MIPFSM P__((Word r, Word M, Word A)); extern Word MIPHOM P__((Word r, Word M, Word A)); extern Word MIPIPR P__((Word r, Word M, Word D, Word A, Word B)); extern void MIPISE P__((Word r, Word M, Word D, Word A, Word B, Word S, Word T, Word C, Word *U_, Word *V_)); extern Word MIPMIP P__((Word r, Word M, Word a, Word B)); extern Word MIPMON P__((Word r, Word M, Word A)); extern Word MIPNEG P__((Word r, Word M, Word A)); extern Word MIPPR P__((Word r, Word M, Word A, Word B)); extern Word MIPRAN P__((Word r, Word M, Word q, Word N)); extern Word MIPROD P__((Word M, Word A, Word B)); extern Word MIPSUM P__((Word r, Word M, Word A, Word B)); extern Word MIQ P__((Word M, Word A, Word B)); extern Word MIRAN P__((Word M)); extern Word MISUM P__((Word M, Word A, Word B)); extern void MIUPQR P__((Word M, Word A, Word B, Word *Q_, Word *R_)); extern void MIUPSE P__((Word M, Word A, Word B, Word S, Word T, Word C, Word *U_, Word *V_)); extern Word MMAMNSB P__((Word p, Word n, Word **M)); extern Word **MMAPBM P__((Word p, Word *A)); extern void MMAPDEFL P__((Word m, Word *A, Word c)); extern Word MMAPEVAL P__((Word m, Word *A, Word s)); extern Word *MMAPEXP P__((Word m, Word *A, Word n)); extern Word MMAPFS P__((Word p, Word *A, Word B, Word d)); extern Word *MMAPGCD P__((Word p, Word *A, Word *B)); extern void MMAPHEG P__((Word p, Word *A, Word *B, Word *C, Word *V)); extern void MMAPMADD P__((Word m, Word *A, Word b, Word j, Word *C)); extern void MMAPMDP P__((Word m, Word a, Word *A, Word *B)); extern Word *MMAPMON P__((Word m, Word *A)); extern void MMAPPROD P__((Word m, Word *A, Word *B, Word *C)); extern void MMAPQR P__((Word m, Word *A, Word *B, Word *Q)); extern void MMAPRC P__((Word p, Word *A, Word *B, Word *C, Word *r_)); extern void MMAPREM P__((Word m, Word *A, Word *B)); extern void MMAPSE P__((Word m, Word *A, Word *B, Word *S, Word *T, Word *C, Word *U, Word *V)); extern void MMAPTPR P__((Word m, Word n, Word *A, Word *B, Word *C)); extern void MMDAH P__((BDigit p, Word **A, BDigit n)); extern Word MMDAHCP P__((BDigit p, Word **A, BDigit n)); extern Word MMDDET P__((Word p, Word M)); extern Word MMPDDF P__((Word p, Word Ap)); extern Word MMPDMA P__((Word r, Word p, Word M)); extern void MMPEGC P__((Word p, Word A, Word B, Word *C_, Word *U_, Word *V_)); extern Word MMPEV P__((Word r, Word m, Word A, Word k, Word a)); extern Word MMPFBL P__((Word p, Word A, Word d)); extern Word MMPGCD P__((Word p, Word A, Word B)); extern void MMPIQR P__((Word r, Word M, Word D, Word A, Word B, Word *Q_, Word *R_)); extern BDigit MMUPIT P__((BDigit p, Word A)); extern Word MPDIF P__((Word r, Word m, Word A, Word B)); extern Word MPEMV P__((Word r, Word m, Word A, Word a)); extern Word MPEVAL P__((Word r, Word m, Word A, Word i, Word a)); extern Word MPEXP P__((Word r, Word m, Word A, Word n)); extern BDigit *MPFFAP1 P__((BDigit p, BDigit q, BDigit *A, BDigit *B)); extern BDigit *MPFFAP P__((BDigit p, BDigit *F, BDigit *G)); extern Word MPFFDP P__((BDigit p, BDigit n)); extern void MPFFDPGT P__((BDigit p, BDigit n, Word *F_, Word *G_, BDigit *A)); extern BDigit *MPFFEXP P__((BDigit p, BDigit *F, BDigit *A, BDigit e)); extern BDigit *MPFFGEN P__((BDigit p, BDigit *F)); extern BDigit *MPFFPROD P__((BDigit p, BDigit *F, BDigit *A, BDigit *B)); extern void MPGCDC P__((Word r, Word p, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word MPHOM P__((Word r, Word m, Word A)); extern Word MPINT P__((Word p, Word B, Word b, Word bp, Word r, Word A, Word A1)); extern void MPIQH P__((Word r, Word p, Word D, Word Ab, Word Bb, Word Sb, Word Tb, Word M, Word Dp, Word C, Word *A_, Word *B_)); extern Word MPIQHL P__((Word r, Word p, Word F, Word M, Word D, Word C)); extern void MPIQHS P__((Word r, Word M, Word D, Word Ab, Word Bb, Word Sb, Word Tb, Word s, Word n, Word C, Word *A_, Word *B_, Word *S_, Word *T_, Word *Dp_)); extern Word MPMDP P__((Word r, Word m, Word a, Word B)); extern Word MPMON P__((Word r, Word m, Word A)); extern Word MPNEG P__((Word r, Word m, Word A)); extern Word MPPROD P__((Word r, Word m, Word A, Word B)); extern Word MPPSR P__((Word r, Word p, Word A, Word B)); extern Word MPQ P__((Word r, Word p, Word A, Word B)); extern void MPQR P__((Word r, Word p, Word A, Word B, Word *Q_, Word *R_)); extern Word MPRAN P__((Word r, Word m, Word q, Word N)); extern Word MPRES P__((Word r, Word p, Word A, Word B)); extern Word MPRESDB P__((BDigit r, BDigit p, Word A, Word B, Word D)); extern Word MPSPRS P__((Word r, Word p, Word A, Word B)); extern Word MPSUM P__((Word r, Word m, Word A, Word B)); extern Word MPUC P__((Word r, Word p, Word A)); extern void MPUCPP P__((Word r, Word p, Word A, Word *a_, Word *Ab_)); extern Word MPUCS P__((Word r, Word p, Word A, Word c)); extern Word MPUP P__((Word r, Word m, Word c, Word A)); extern Word MPUPP P__((Word r, Word p, Word A)); extern Word MPUQ P__((Word r, Word p, Word A, Word b)); extern void MRFMAP P__((Word *A, Word n, Word **M, Word r)); extern Word MUPDER P__((Word m, Word A)); extern void MUPEGC P__((Word p, Word A, Word B, Word *C_, Word *U_, Word *V_)); extern Word MUPFAC P__((Word p, Word A)); extern Word MUPFMAP P__((Word *A)); extern Word MUPFS P__((Word p, Word A, Word B, Word d)); extern Word MUPGCD P__((BDigit p, Word A, Word B)); extern void MUPHEG P__((Word p, Word A, Word B, Word *C_, Word *V_)); extern Word MUPRAN P__((Word p, Word n)); extern void MUPRC P__((Word p, Word A, Word B, Word *C_, Word *r_)); extern Word MUPRES P__((BDigit p, Word A, Word B)); extern Word MUPSFF P__((Word p, Word A)); extern BDigit NEXTSS P__((BDigit n, BDigit m, BDigit *A)); extern void NORMEFD P__((Word N, Word n, Word p, Word Q, Word B, Word L, Word G, Word C, Word d, Word N1, Word *F_, Word *Nb_, Word *Gb_, Word *Bb_, Word *Ib_, Word *Cb_, Word *Nb1_)); extern Word NORMFAC P__((Word M, Word A, Word N)); extern void NORMFCT P__((Word N, Word n, Word p, Word Q, Word Qp, Word q, Word B, Word L, Word T, Word G, Word C, Word e, Word d, Word k, Word N1, Word *F_, Word *Nb_, Word *Bb_, Word *Lb_, Word *Tb_, Word *Gb_, Word *Cb_, Word *Nb1_)); extern void NORMFCTS P__((Word N, Word p, Word Q, Word Qp, Word q, Word K, Word L, Word T, Word d, Word W0, Word N1, Word *F_, Word *Nb_, Word *Ib_)); extern Word NORMFL P__((Word L)); extern void NORMFT P__((Word N, Word p, Word Q, Word Qp, Word q, Word K, Word T, Word N1, Word *F_, Word *Nb_)); extern Word NORMHLEFD P__((Word N, Word n, Word p, Word F, Word C, Word G)); extern void NORMILHS P__((Word N, Word q, Word Q, Word Ap, Word B, Word S, Word T, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern void NORMLHS P__((Word q, Word Q, Word Qpp, Word Ab, Word Bb, Word Sb, Word Tb, Word Ap, Word Bp, Word Yp, Word Zp, Word U, Word D, Word A, Word B, Word *Qs_, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern void NORMMF P__((Word M, Word A, Word N, Word *p_, Word *F_, Word *C_, Word *L_)); extern Word NORMRL P__((Word F, Word L)); extern void NORMSQHL P__((Word N, Word p, Word q, Word F, Word *A_, Word *B_, Word *S_, Word *T_)); extern Word ODD P__((Word a)); extern Word ORDER P__((Word a)); extern Word OREAD P__((void)); extern void OWRITE P__((Word B)); extern void PADV P__((Word A, Word *e_, Word *a_, Word *Ap_)); extern Word PAIR P__((Word A, Word B)); extern Word PARTN P__((Word n, Word P)); extern Word PARTR P__((Word n)); extern Word PARTSS P__((Word p)); extern Word PBIN P__((Word a1, Word e1, Word a2, Word e2)); extern Word PCL P__((Word A)); extern Word PCOEFF P__((Word A, Word i)); extern Word PCONST P__((Word r, Word A)); extern Word PCPV P__((Word r, Word A, Word i, Word j)); extern Word PDBORD P__((Word A)); extern Word PDE P__((BDigit i, BDigit k, BDigit r, Word A)); extern Word PDEG P__((Word A)); extern Word PDEGSV P__((Word r, Word A, Word i)); extern Word PDEGV P__((Word r, Word A)); extern Word PDLOG2 P__((Word a)); extern Word PDPV P__((Word r, Word A, Word i, Word n)); extern BDigit PDVAR P__((BDigit r, BDigit i, Word A)); extern Word PERMCY P__((Word P)); extern Word PERMR P__((Word n)); extern Word PFBRE P__((Word r, Word a)); extern Word PFDIP P__((Word r, Word A)); extern Word PFDP P__((Word r, Word A)); extern BDigit *PFFAP1 P__((BDigit p, BDigit *A, BDigit *B)); extern BDigit *PFFAP P__((BDigit p, BDigit a)); extern BDigit PFFGEN P__((BDigit p)); extern Word PGCDE P__((BDigit i, BDigit r, Word A)); extern void PHDQR P__((Word a1, Word a0, Word b, Word *q_, Word *r_)); extern Word PHDREM P__((Word a1, Word a0, Word b)); extern Word PICPV P__((Word r, Word A, Word i, Word j)); extern Word PINV P__((Word r, Word A, Word k)); extern Word PLBCF P__((Word r, Word A)); extern Word PLDCF P__((Word A)); extern Word PMDEG P__((Word A)); extern Word PME P__((BDigit i, BDigit k, BDigit r, Word A)); extern Word PMON P__((Word a, Word e)); extern Word PMONSV P__((Word r, Word a, Word i, Word e)); extern Word PMPMV P__((Word A, Word k)); extern Word PMPSV P__((Word A, Word r, Word i, Word k)); extern void PNDQR P__((Word a1, Word a0, Word b, Word *q_, Word *r_)); extern BDigit PNM P__((BDigit r, Word A)); extern Word PORD P__((Word A)); extern Word PPERMV P__((Word r, Word A, Word P)); extern Word PPLT P__((Word e, Word a, Word A)); extern Word PRED P__((Word A)); extern void PRODUCT P__((Word *A, Word n1, Word *B, Word n2, Word *C)); extern Word PRT P__((Word A)); extern Word PSDSV P__((Word r, Word A, Word i, Word n)); extern Word PTBCF P__((Word r, Word A)); extern BDigit PTDEG P__((BDigit r, Word A)); extern Word PTMV P__((Word r, Word A)); extern void PTRADV2 P__((Word L, Word **a_, Word **b_, Word *Lp_)); extern void PTRADV P__((Word L, Word **a_, Word *Lp_)); extern Word PTRCF P__((Word A)); extern Word PTRCOMP P__((Word *p, Word L)); extern Word* PTRFIRST P__((Word L)); extern Word PTRLENGTH P__((Word L)); extern Word PTRLIST1 P__((Word *a)); extern Word PTRRED P__((Word L)); extern Word PTV P__((Word r, Word A, Word i)); extern Word PUFP P__((Word r, Word A)); extern Word PUNT P__((Word r, Word A)); extern void QREM P__((Word a, Word b, Word *q_, Word *r_)); extern Word RED2 P__((Word L)); extern Word RED3 P__((Word L)); extern Word RED4 P__((Word L)); extern Word RED P__((Word L)); extern Word REDI P__((Word A, Word i)); extern Word REM P__((Word a, Word b)); extern void RHI P__((Word a, Word b, interval *I_, BDigit *t_)); extern Word RIB P__((Word r, Word s)); extern void RIDWRITE P__((Word I, Word n)); extern Word RIL P__((Word I)); extern Word RILC P__((Word I, Word k)); extern Word RINEG P__((Word I)); extern Word RINT P__((Word I)); extern Word RIPROD P__((Word I, Word J)); extern Word RIRNP P__((Word I, Word c)); extern Word RISIGN P__((Word I)); extern Word RISUM P__((Word I, Word J)); extern void RIWRITE P__((Word I)); extern Word RMDUP P__((Word L)); extern Word RNABS P__((Word R)); extern void RNBCR P__((Word A, Word B, Word *M_, Word *N_, Word *k_)); extern Word RNCEIL P__((Word r)); extern Word RNCOMP P__((Word R, Word S)); extern void RNDDWRITE P__((Word R, Word n, Word t)); extern Word RNDEN P__((Word R)); extern Word RNDIF P__((Word R, Word S)); extern void RNDWRITE P__((Word R, Word n)); extern void RNFCL2 P__((Word a, Word *m_, Word *n_)); extern Word RNFLOR P__((Word r)); extern Word RNFMR P__((Word M, Word Mp, Word m, Word U)); extern Word RNFMRPP P__((Word M, Word Mp, Word m, Word p, Word U)); extern Word RNINT P__((Word A)); extern Word RNINV P__((Word R)); extern Word RNLBRN P__((Word A)); extern Word RNMAX P__((Word a, Word b)); extern Word RNMIN P__((Word a, Word b)); extern Word RNNEG P__((Word R)); extern Word RNNUM P__((Word R)); extern Word RNP2 P__((Word k)); extern Word RNPROD P__((Word R, Word S)); extern Word RNQ P__((Word R, Word S)); extern Word RNRAND P__((Word n)); extern Word RNREAD P__((void)); extern Word RNRED P__((Word A, Word B)); extern Word RNROUND P__((Word R)); extern Word RNSIGN P__((Word R)); extern Word RNSUM P__((Word R, Word S)); extern void RNWRITE P__((Word R)); extern Word RPAFME P__((Word r, Word M, Word A, Word b)); extern void RPBLGS P__((Word r, Word A, Word *a_, Word *b_, Word *s_)); extern Word RPDIF P__((Word r, Word A, Word B)); extern Word RPDMV P__((Word r, Word A)); extern void RPDWRITE P__((Word r, Word A, Word V)); extern Word RPEMV P__((Word r, Word A, Word b)); extern Word RPEV P__((Word r, Word A, Word i, Word a)); extern void RPEXPREAD P__((Word r, Word V, Word *A_, Word *t_)); extern void RPFACTREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word RPFIP P__((Word r, Word A)); extern Word RPIMV P__((Word r, Word A)); extern Word RPMAIP P__((Word r, Word A)); extern Word RPME P__((Word r, Word A, Word b)); extern Word RPNEG P__((Word r, Word A)); extern void RPPOWREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word RPPROD P__((Word r, Word A, Word B)); extern void RPQR P__((Word r, Word A, Word B, Word *Q_, Word *R_)); extern Word RPRAN P__((Word r, Word k, Word q, Word N)); extern void RPREAD P__((Word *r_, Word *A_)); extern Word RPRNP P__((Word r, Word a, Word B)); extern Word RPSUM P__((Word r, Word A, Word B)); extern void RPTERMREAD P__((Word r, Word V, Word *A_, Word *t_)); extern void RPWRITE P__((Word r, Word A, Word V)); extern void RSI P__((BDigit p, Word a, Word b, BDigit *I)); extern void RUPFMRC P__((Word M1, Word M1p, Word m1, Word C1, Word L1, Word M2, Word M2p, Word m2, Word C2, Word *L2_, Word *C_)); extern void RUPWRITE P__((Word A, Word v)); extern Word SDIFF P__((Word A, Word B)); extern void SDR P__((Word S, Word *A_, Word *I_)); extern Word SECOND P__((Word L)); extern Word SEQUAL P__((Word A, Word B)); extern Word SFCS P__((Word A)); extern void SFIRST P__((Word L, Word a)); extern Word SIAFEE P__((Word B, Word I, BDigit p)); extern void SICOPY P__((BDigit *A, BDigit *B)); extern void SIDWRITE P__((BDigit *I, BDigit k)); extern Word SIGN P__((Word a)); extern Word SILBRI P__((BDigit *I)); extern Word SINTER P__((Word A, Word B)); extern void SIPBHT P__((BDigit *A, BDigit k)); extern void SIPCOPY P__((BDigit *A, BDigit *B)); extern Word SIPES P__((Word *A, Word *a)); extern void SIPEVAL P__((BDigit *A, BDigit *I, BDigit *J)); extern Word SIPIIRMS P__((Word L, BDigit **C)); extern void SIPIIS P__((BDigit *A1, Word I1, BDigit t1, BDigit *A2, Word I2, BDigit t2, BDigit *J1_, BDigit *J2_, BDigit *s_)); extern Word SIPIR P__((Word *A, Word I, BDigit t, BDigit k)); extern void SIPNT P__((BDigit *A, BDigit *B)); extern Word SIPPRB P__((BDigit *A)); extern void SIPR P__((Word *A, Word *B)); extern void SIPROD P__((BDigit *I, BDigit *J, BDigit *K)); extern Word SIPRRID P__((BDigit *A)); extern Word SIPRRISD P__((BDigit *A, Word a, Word b)); extern BDigit SIPSIZE P__((BDigit *A)); extern void SIPTR1 P__((BDigit *A, BDigit *B)); extern BDigit SIPVCHT P__((BDigit *A)); extern void SIQUOT P__((BDigit *I, BDigit *J, BDigit *K)); extern BDigit SISIGN P__((Word *I)); extern void SISUM P__((BDigit *I, BDigit *J, BDigit *K)); extern Word SLBRNIM P__((Word a, Word b)); extern void SLELTI P__((Word A, Word i, Word a)); extern void SLIWE P__((Word I, Word *k_, Word *c_, Word *d_)); extern BDigit **SMDM P__((Word A, Word B, BDigit k, BDigit r)); extern Word SMFMI P__((Word M, Word A)); extern Word SMFMIP P__((Word r, Word M, Word A)); extern Word SNLBRN P__((Word a, BDigit k)); extern Word SPOWER P__((Word s, Word a)); extern void SRED P__((Word L, Word Lp)); extern void STATSACLIB P__((void)); extern void SUBFROM P__((Word *A, Word *B, Word n)); extern Word SUFFIX P__((Word L, Word b)); extern Word SUNION P__((Word A, Word B)); extern void SWRITE P__((const char *s)); extern Word TANGENTNUM P__((BDigit n)); extern Word THIRD P__((Word L)); extern Word TLIL P__((BDigit a, Word L)); extern Word TSVSLI P__((Word A, Word I)); extern Word USDIFF P__((Word A, Word B)); extern Word USINT P__((Word A, Word B)); extern Word USUN P__((Word A, Word B)); extern Word VAR P__((Word L)); extern Word VCOMP P__((Word U, Word V)); extern Word VIAZ P__((Word A, Word n)); extern Word VIDIF P__((Word A, Word B)); extern Word VIERED P__((Word U, Word V, Word i)); extern Word VILCOM P__((Word a, Word b, Word A, Word B)); extern Word VINEG P__((Word A)); extern Word VISPR P__((Word a, Word A)); extern Word VISUM P__((Word A, Word B)); extern void VIUT P__((Word U, Word V, Word i, Word *Up_, Word *Vp_)); extern Word VLREAD P__((void)); extern Word VLSRCH P__((Word v, Word V)); extern void VLWRITE P__((Word V)); extern Word VMAX P__((Word U, Word V)); extern Word VMIN P__((Word U, Word V)); extern Word VMPIP P__((Word r, Word m, Word A, Word B)); extern Word VREAD P__((void)); extern void VWRITE P__((Word v)); saclib2.2.8/include/sacmacros.h0000664002275300236100000001017314017255270015521 0ustar wcbrownscs/*=========================================================================== sacmacros.h Header file for SACLIB macro definitions ===========================================================================*/ #ifndef SACMACROS_H #define SACMACROS_H #include "sacsys.h" #include "sactypes.h" /*--------------------------------------------------------------------------- The canonical saclib version number. ---------------------------------------------------------------------------*/ #define SACMAJVERS 2 #define SACMINVERS 2 #define SACREVVERS 8 /*--------------------------------------------------------------------------- Macros that are always defined. ---------------------------------------------------------------------------*/ #ifdef NO_SACLIB_MACROS #define FIRST(L) SPACEB1[(L)] #define GCAGET(A,i) (GCASPACEBp[(A)].array[(i)]) #define GCASET(A,i,a) (GCASPACEBp[(A)].array[(i)] = (a)) #define ISNIL(a) ((a) == NIL) #define ISZERO(a) ((a) == 0) #define RED(L) SPACEB[(L)] #define SFIRST(L,a) (SPACEB1[(L)] = (a)) #define SRED(L,Lp) (SPACEB[(L)] = (Lp)) #endif #define ILENGTH(A) (((A) < BETA) ? 1 : LENGTH(A)) #define ILOG2A(A,n) (((n)==0) ? 0 : ((n)-1)*ZETA + DLOG2((A)[(n)-1])) #define ISIGNA(A,n) ((n) == 0 ? 0 : (((A)[(n)-1] > 0) ? 1 : -1)) #define absm(a) (((a) >= 0) ? (a) : -(a)) #define maxm(a,b) (((a) > (b)) ? (a) : (b)) #define minm(a,b) (((a) < (b)) ? (a) : (b)) #define signm(a) ((a) > 0 ? 1 : ((a) < 0 ? -1 : 0)) /*--------------------------------------------------------------------------- Arrays. ---------------------------------------------------------------------------*/ #define FREEARRAY(A) free((A)) /*--------------------------------------------------------------------------- Array polynomials. ---------------------------------------------------------------------------*/ /* MAP coefficient */ #define MAPCF(A,e) (A[e]) /* MAP degree */ #define MAPDEG(A) (A[-1]) /* MAP free memory */ #define MAPFREE(A) FREEARRAY((A)-1) /* MAP get memory */ #define MAPGET(n) (GETARRAY((n)+2) + 1) /* MAP leading coefficient */ #define MAPLDCF(A) (MAPCF(A,MAPDEG(A))) /* MAP zero test */ #define MAPZERO(A) (MAPDEG(A) == 0 && MAPCF(A,0) == 0) /*--------------------------------------------------------------------------- Finite ring array polynomials. ---------------------------------------------------------------------------*/ /* FRAP degree */ #define FRAPDEG(A) (A[-1][0]) /* FRAP size---the size of the array */ #define FRAPSIZE(A) (A[-1][1]) /* FRAP coefficient */ #define FRAPCF(A,i) (A[i]) /* FRAP leading coefficient */ #define FRAPLDCF(A) (FRAPCF(A,FRAPDEG(A))) /* FRAP zero test */ #define FRAPZERO(A) (FRAPDEG(A) == 0 && MAPZERO(FRAPLDCF(A))) /*--------------------------------------------------------------------------- Matrices. ---------------------------------------------------------------------------*/ /* matrix element */ #define MATELT(M,i,j) (M[i][j]) #ifndef NO_SACLIB_MACROS /*--------------------------------------------------------------------------- List processing. ---------------------------------------------------------------------------*/ #define RED2(L) RED(RED(L)) #define SECOND(L) FIRST(RED(L)) /* Arithmetic */ #define ODD(a) ((a) & 1) #define EVEN(a) (!ODD(a)) #define DAND(a,b) ((a) & (b)) #define DOR(a,b) ((a) | (b)) #define DNOT(a) (~(a)) #define DNIMP(a,b) ((a) & ~(b)) #define MDSUM(m,a,b) (((a)+(b))%(m)) /*** * * The following macros give troubles w.r.t. side effects and therefore * are commented out for the time being. * ***/ /* #define ISATOM(a) (-BETA < (a) && (a) < BETA) #define ISLIST(a) ((BETA < (a) && (a) < BETAp && ((a) & 1)) || (a) == BETA) #define ISOBJECT(a) (ISATOM(a) || ISLIST(a)) #define ISGCA(a) (BETAp < (a) && (a) < BETApp) #define ADV(L,a,Lp) do {*(a)=FIRST(L); *(Lp)=RED(L);} while (0) #define QREM(a,b,q,r) do {*(q)=(a)/(b); *(r)=(a)%(b);} while (0) #define MDDIF(m,a,b) (((a)-(b)+(m))%(m)) #define MDNEG(m,a) ((a)==0?0:(m)-(a)) */ #endif /* NO_SACLIB_MACROS */ #endif /* SACMACROS_H */ saclib2.2.8/CHANGELOG0000664002275300236100000001044714017255270013170 0ustar wcbrownscs------------------------------------------------------------ 2.2.7 - 2021-03-01 Changed * Version number bumped to 2.2.7. * Switched to git repo from bzr. * Now Saclib allows underscores in variable names (but not as the first character). ------------------------------------------------------------ revno: 15 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Tue 2018-01-30 11:40:42 -0500 message: Increased saclib version number to 2.2.7. ------------------------------------------------------------ revno: 14 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Tue 2018-01-30 11:32:00 -0500 message: added documentation pdf's ------------------------------------------------------------ revno: 13 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Thu 2018-01-25 16:13:14 -0500 message: Added check in ARGSACLIB for +N values that are out of the range [20000,1073741822]. Anything bigger than that is too big for Saclib to handle because Word is limited to 32-bits. ------------------------------------------------------------ revno: 12 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Wed 2017-03-15 13:27:00 -0400 message: Lots of misc cleanups ------------------------------------------------------------ revno: 11 committer: Christopher W Brown branch nick: saclib2.2.6 timestamp: Sun 2014-02-09 19:23:09 -0500 message: Changed version number to Saclib 2.2.6. ------------------------------------------------------------ revno: 10 committer: Christopher W Brown branch nick: saclib2.2.5 timestamp: Sun 2014-02-09 11:36:02 -0500 message: Made a large number of changes to improve portability, fix a few bugs, and silence some compiler error messages. These came from Jerry James from RedHat, who was very kind to point out so many fixes. Also, added under version control the Mac OS X 64 sysdep files, which have been distributed for a while, but somehow missing from version control. ------------------------------------------------------------ revno: 9 committer: Christopher Brown branch nick: saclib2.2.4 timestamp: Thu 2010-04-22 11:03:35 -0400 message: Removed spurrious include of ucontext.h, which 64-bit macs don't like. ------------------------------------------------------------ revno: 8 committer: Christopher Brown branch nick: saclib timestamp: Wed 2010-04-21 13:31:57 -0400 message: Officially upped the version number of 2.2.4. ------------------------------------------------------------ revno: 7 committer: Christopher Brown branch nick: saclib timestamp: Wed 2010-04-21 13:26:53 -0400 message: Changed over all scripts to bash, and added mac OS X port. ------------------------------------------------------------ revno: 6 committer: Christopher Brown branch nick: saclib timestamp: Thu 2010-04-15 14:21:26 -0400 message: Fixed minor portability bug in FAIL.c ------------------------------------------------------------ revno: 5 committer: Christopher Brown branch nick: saclib timestamp: Thu 2010-04-15 13:15:01 -0400 message: Fixed a few bugs in the 32-bit version of the 64/32 code. ------------------------------------------------------------ revno: 4 committer: Christopher Brown branch nick: saclib timestamp: Thu 2010-04-15 12:46:34 -0400 message: This commit (saclib 2.2.3) finally includes a port to 64-bit linux. The primary issue addressed in the port is the few places in which pointer values are stored in saclib list nodes. This is now done sanely and portably. ------------------------------------------------------------ revno: 3 committer: Christopher Brown branch nick: saclib timestamp: Thu 2009-07-16 09:24:53 -0400 message: Minor changes to README. ------------------------------------------------------------ revno: 2 [merge] committer: Christopher Brown branch nick: saclib timestamp: Thu 2009-07-16 09:15:45 -0400 message: Merged changes. ------------------------------------------------------------ revno: 1 committer: Christopher Brown branch nick: saclib timestamp: Wed 2009-07-15 16:41:43 -0400 message: Initial commit. ------------------------------------------------------------ saclib2.2.8/sysdep/0000775002275300236100000000000014017255270013257 5ustar wcbrownscssaclib2.2.8/sysdep/linuxX86/0000775002275300236100000000000014017255270014724 5ustar wcbrownscssaclib2.2.8/sysdep/linuxX86/cleanup0000775002275300236100000000017714017255270016306 0ustar wcbrownscs#!/bin/bash echo "Removing any linuxX86 system dependent files ..." 'rm' -f $saclib/src/GC.c 'rm' -f $saclib/include/sysdep.h saclib2.2.8/sysdep/linuxX86/GC.c0000664002275300236100000000155414017255270015366 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" static int gc_dummy(); void GC(void) { Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/linuxX86/sysdep.h0000664002275300236100000000016614017255270016407 0ustar wcbrownscs#ifndef _LITTLE_ENDIAN_ #define _LITTLE_ENDIAN_ #endif #undef _BIG_ENDIAN_ #define _X86_LINUX_ #define __WORDSIZE 32 saclib2.2.8/sysdep/linuxX86/install0000775002275300236100000000017514017255270016323 0ustar wcbrownscs#!/bin/bash echo "Installing linuxX86 system dependent files ..." 'cp' -f GC.c $saclib/src/ 'cp' -f sysdep.h $saclib/include saclib2.2.8/sysdep/LICENSE0000664002275300236100000000146314017255270014270 0ustar wcbrownscsSaclib 2.2 Copyright (c) 1993, 2008, RISC-Linz (contact wcbrown@usna.edu) Permission to use, copy, modify, and/or distribute this software, including source files, README files, etc., for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. saclib2.2.8/sysdep/linuxX86_64/0000775002275300236100000000000014017255270015235 5ustar wcbrownscssaclib2.2.8/sysdep/linuxX86_64/cleanup0000775002275300236100000000020214017255270016604 0ustar wcbrownscs#!/bin/bash echo "Removing any linuxX86_64 system dependent files ..." 'rm' -f $saclib/src/GC.c 'rm' -f $saclib/include/sysdep.h saclib2.2.8/sysdep/linuxX86_64/GC.c0000664002275300236100000000155414017255270015677 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" static int gc_dummy(); void GC(void) { Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/linuxX86_64/sysdep.h0000664002275300236100000000016614017255270016720 0ustar wcbrownscs#ifndef _LITTLE_ENDIAN_ #define _LITTLE_ENDIAN_ #endif #undef _BIG_ENDIAN_ #define _X86_LINUX_ #define __WORDSIZE 64 saclib2.2.8/sysdep/linuxX86_64/install0000775002275300236100000000020014017255270016621 0ustar wcbrownscs#!/bin/bash echo "Installing linuxX86_64 system dependent files ..." 'cp' -f GC.c $saclib/src/ 'cp' -f sysdep.h $saclib/include saclib2.2.8/sysdep/bin/0000775002275300236100000000000014017255270014027 5ustar wcbrownscssaclib2.2.8/sysdep/bin/mklib0000775002275300236100000000445414017255270015062 0ustar wcbrownscs#!/bin/bash # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if [ $# -lt 1 ] then echo "USAGE:" echo " mklib " exit fi if [ $1 = "clean" ] then ### remove .o and .a and makefiles echo "Removing object files, libraries and makefiles ..." pushd >/dev/null $saclib/lib/objo 'rm' -f * popd >/dev/null pushd >/dev/null $saclib/lib/objd 'rm' -f * popd >/dev/null pushd >/dev/null $saclib/lib/ 'rm' -f *.a popd >/dev/null ### do sysdep cleanup echo "Removing system-dependent files ..." pushd >/dev/null $saclib/sysdep/linuxX86 ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/linuxX86_64 ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/solarisSparc ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/macosX86 ./cleanup popd >/dev/null pushd >/dev/null $saclib/sysdep/macosX86_64 ./cleanup popd >/dev/null exit fi if [ ! -n "${CC+1}" ] then CC=cc fi echo "Compiling with" $CC if [ $1 = "std" ] then echo "This option no longer exists!" elif [ $1 = "deb" ]; then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null elif [ $1 = "opt" ]; then pushd >/dev/null $saclib/lib/objo make CC=$CC "SACFLAG=" EXTENSION=o popd >/dev/null elif [ $1 = "all" ]; then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC "SACFLAG=" EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit fi echo "mklib done." saclib2.2.8/sysdep/bin/sdesc0000775002275300236100000000261114017255270015056 0ustar wcbrownscs#!/bin/tcsh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" perl $saclib/bin/svers.pl exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=12 else set sc=$4 endif if ($#argv < 5) then set ll=70 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # The last line used to look like this: # awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # but I took it out saclib2.2.8/sysdep/bin/sconf0000775002275300236100000000020314017255270015060 0ustar wcbrownscs#!/bin/bash if [ $# -eq 0 ] ; then perl $saclib/bin/mksysdep.pl fi if [ $# -eq 1 ] ; then perl $saclib/bin/mksysdep.pl $1 fi saclib2.2.8/sysdep/bin/mkproto.awk0000775002275300236100000000275114017255270016236 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^((const )?.*) .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; if ($1 == "const") { type = "const " $2; i = 3; } while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/bin/mktexkwic.sed0000775002275300236100000000061114017255270016533 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/bin/mkkwic.awk0000775002275300236100000000306114017255270016023 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/bin/mksysdep.pl0000775002275300236100000000716514017255270016237 0ustar wcbrownscs################################################ # mksysdep.pl V 0.0 # Created by Chris Brown, 20 May, 208 ################################################ if ($#ARGV == 0 && ($ARGV[0] eq "-h" || $ARGV[0] eq "--help")) { print "sconf/mksysdep.pl\n". "sconf [x86linux|sparcsolaris|x86_64linux|x86macos|x86_64macos]\n\n". "This script installs system dependent files for\n". "saclib. It attempts to diagnose architecture and\n". "processor type and install the proper files. You\n". "can give the arch/os type explicitly as one of the\n". "arguments listed above, and the script will install\n". "what you've asked for regardless of its diagnosis.\n"; exit 0; } if (! $ENV{'saclib'}) { print "SACLIB Error: The saclib environment variable must be set!\n"; exit(1); } ### Get architecture type $ptype = "unknown"; $uname = `uname -mp`; if ($uname =~ /i\S*86/) { $ptype = "x86"; } elsif ($uname =~ /x86_64/) { $ptype = "x86_64"; } elsif ($uname =~ /Sun|sun|SUN|Sparc|sparc|SPARC/) { $ptype = "sparc"; } else { print "SACLIB Warning: Could not determine processor type!\n"; } ### Get OS type $ostype = "unknown"; $uname = `uname -s`; if ($uname =~ /linux|Linux|LINUX/) { $ostype = "linux"; } elsif ($uname =~ /Sun|sun|SUN|solaris|Solaris/) { $ostype = "solaris"; } elsif ($uname =~ /Darwin|darwin|DARWIN/) { $ostype = "macos"; ### Do we have a 32-bit or 64-bit kernel running? $macosKernelTest = `ioreg -l -p IODeviceTree | grep firmware-abi | grep EFI64`; if ($macosKernelTest) { $ptype = "x86_64"; } elsif ($ptype == "x86_64") { $ptype = "x86"; } } else { print "SACLIB Warning: Could not determine OS type!\n"; } ### Call appropriate install script if ($#ARGV == 1 && $ARGV[0] eq "x86linux") { print "SACLIB Warning: Installing x86linux system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "x86macos") { print "SACLIB Warning: Installing x86macos system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "x86_64macos") { print "SACLIB Warning: Installing x86_64macos system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86_64 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "x86_64linux") { print "SACLIB Warning: Installing x86_64linux system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86_64 ; ./install ; popd >/dev/null\""); } elsif ($#ARGV == 1 && $ARGV[0] eq "sparcsolaris") { print "SACLIB Warning: Installing sparcsolaris system dependent files!\n"; system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/solarisSparc ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86" && $ostype eq "linux") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86" && $ostype eq "macos") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86_64" && $ostype eq "macos") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/macosX86_64 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "x86_64" && $ostype eq "linux") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/linuxX86_64 ; ./install ; popd >/dev/null\""); } elsif ($ptype eq "sparc" && $ostype eq "solaris") { system("bash -c \"pushd >/dev/null $ENV{'saclib'}/sysdep/solarisSparc ; ./install ; popd >/dev/null\""); } saclib2.2.8/sysdep/bin/svers.pl0000775002275300236100000000064014017255270015531 0ustar wcbrownscsif (! $ENV{'saclib'}) { print "SACLIB Error: The saclib environment variable must be set!\n"; exit(1); } open(SACMAC,"< $ENV{'saclib'}/include/sacmacros.h"); $maj = "?"; $min = "?"; $rev = "?"; while() { if ($_ =~ /SACMAJVERS\s+(\d+)/) { $maj = $1; } if ($_ =~ /SACMINVERS\s+(\d+)/) { $min = $1; } if ($_ =~ /SACREVVERS\s+(\d+)/) { $rev = $1; } } print "Saclib ${maj}.${min}.${rev}\n"; saclib2.2.8/sysdep/bin/l2b.awk0000775002275300236100000000246114017255270015220 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/bin/mktexkwic.awk0000775002275300236100000000303714017255270016547 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/bin/mkmspec.awk0000775002275300236100000000020514017255270016172 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/bin/mkdesc.awk0000775002275300236100000000164414017255270016011 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/bin/mkproto0000775002275300236100000000077414017255270015460 0ustar wcbrownscs#!/bin/bash # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if [ $# -ne 0 ] then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((const char *algName, const char *msg,...)) __noreturn;" for fname in *.c do if [ $fname != FAIL.c -a $fname != main.c ] ; then awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h fi done fi saclib2.2.8/sysdep/bin/mkdesc0000775002275300236100000000023214017255270015220 0ustar wcbrownscs#!/bin/bash # USAGE # mkdesc # # FUNCTION # Calls: mkdescd 12 70 $saclib/src/*.c $saclib/bin/mkdescd 12 70 $saclib/src/*.c > $saclib/doc/desc.doc saclib2.2.8/sysdep/bin/mktexkwic1.awk0000775002275300236100000000031714017255270016626 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/bin/mkkwic.sed0000775002275300236100000000023414017255270016013 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/bin/sman0000775002275300236100000000041314017255270014711 0ustar wcbrownscs#!/bin/tcsh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " perl $saclib/bin/svers.pl else more $saclib/src/$1.c endif saclib2.2.8/sysdep/bin/mkmake0000775002275300236100000000566414017255270015235 0ustar wcbrownscs#!/bin/bash # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. MAKEFILE=$saclib/lib/objo/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = as AR = ar RANLIB = ranlib # Object files OBJS1 = \ EOF # ## Write list of object files # pushd >/dev/null $saclib/src 'ls' [A-H]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \\" >> $MAKEFILE 'ls' I[A-P]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \\" >> $MAKEFILE 'ls' I[Q-z]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \\" >> $MAKEFILE 'ls' [J-P]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \\" >> $MAKEFILE 'ls' [Q-Za-z]*.[cs] 2> /dev/null |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <<\EOF # Target dependencies new: ${OBJS1} ${OBJS2a} ${OBJS2b} ${OBJS3} ${OBJS4} rm -f ${TARGET} ${AR} cq ${TARGET} ${OBJS1} ${AR} cq ${TARGET} ${OBJS2a} ${AR} cq ${TARGET} ${OBJS2b} ${AR} cq ${TARGET} ${OBJS3} ${AR} cq ${TARGET} ${OBJS4} # Use "ar ts" if your system does not have "ranlib". # ${AR} ts ${TARGET} # Use "ranlib" if your system's "ar" does not have the option "s". ${RANLIB} ${TARGET} @echo "Created '${TARGET}'." EOF # ## Write object dependencies # cat >> $MAKEFILE <<\EOF # Object dependencies EOF 'ls' *.[c] 2> /dev/null |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE 'ls' *.[s] 2> /dev/null |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # 'cp' $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objd.'" saclib2.2.8/sysdep/bin/mkmspec0000775002275300236100000000043014017255270015411 0ustar wcbrownscs#! /bin/tcsh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/bin/b2l.awk0000775002275300236100000000106114017255270015213 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/bin/mkspec0000775002275300236100000000040614017255270015237 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/bin/mkkwic0000775002275300236100000000235214017255270015244 0ustar wcbrownscs#! /bin/tcsh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/bin/mkdescd0000775002275300236100000000145314017255270015372 0ustar wcbrownscs#!/bin/bash # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if [ $# -lt 1 ] then echo "USAGE:" echo " mkdesc " else args=("$@") for fname in "${args[@]:2}" do awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname done fi saclib2.2.8/sysdep/bin/subst0000775002275300236100000000141714017255270015120 0ustar wcbrownscs#! /bin/tcsh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/bin/mktexkwic0000775002275300236100000000243014017255270015762 0ustar wcbrownscs#! /bin/tcsh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/bin/mktexkwic2.awk0000775002275300236100000000162714017255270016634 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/bin/strip1st.awk0000775002275300236100000000045514017255270016333 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/0000775002275300236100000000000014017255270014700 5ustar wcbrownscssaclib2.2.8/sysdep/archive/generic/0000775002275300236100000000000014017255270016314 5ustar wcbrownscssaclib2.2.8/sysdep/archive/generic/src/0000775002275300236100000000000014017255270017103 5ustar wcbrownscssaclib2.2.8/sysdep/archive/generic/src/CLOCK.c0000664002275300236100000000071614017255270020106 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in milliseconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; /* hide t; */ Step1: /* Get the system time. */ t = (Word)time(NULL)*1000; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/generic/src/GC.c0000664002275300236100000000155314017255270017544 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { static int gc_dummy(); Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/archive/generic/src/FAIL_varargs.c0000664002275300236100000001524214017255270021513 0ustar wcbrownscs/*====================================================================== FAIL(algName,msg,...) Failure handler. Inputs algName : the name of the algorithm which called this algorithm. msg : a string giving the reason for the failure. ... : any other arguments that the calling algorithm passed. Side effects This algorithm display the information about why the failure occurred and aborts the whole program. ======================================================================*/ #include "saclib.h" #include #include void FAIL(va_alist) va_dcl { va_list argPtr; char *algName; char *msg; extern int strcmp(); Step1: /* Basic message. */ va_start(argPtr); SWRITE("\n\n"); algName = va_arg(argPtr,char *); msg = va_arg(argPtr,char *); SWRITE("Failure occurred in: "); SWRITE(algName); SWRITE("\n"); SWRITE("Reason for the failure: "); SWRITE(msg); SWRITE("\n\n"); Step2: /* Failures from the SACLIB library. */ /* GCSI marking stack */ if (!strcmp(algName,"GCSI (marking stack)")) { /* Note that this step is NOT portable since we are assuming that pointers fit into integers. */ SWRITE("BACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); SWRITE("EACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); goto Abort; } /* GCSI final check */ if (!strcmp(algName,"GCSI (final check)")) { SWRITE("N = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("NU = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("RHO = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* GREAD */ if (!strcmp(algName,"GREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* AREAD */ if (!strcmp(algName,"AREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* LREAD */ if (!strcmp(algName,"LREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IREAD */ if (!strcmp(algName,"IREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIIPREAD */ if (!strcmp(algName,"DIIPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIRPREAD */ if (!strcmp(algName,"DIRPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IPREAD */ if (!strcmp(algName,"IPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* RPREAD */ if (!strcmp(algName,"RPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VLREAD */ if (!strcmp(algName,"VLREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VREAD */ if (!strcmp(algName,"VREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* SFRLS */ if (!strcmp(algName,"SFRLS")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("a = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("e = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRQ */ if (!strcmp(algName,"SFRQ")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRSUM */ if (!strcmp(algName,"SFRSUM")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* MAIPDM */ if (!strcmp(algName,"MAIPDM")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("b = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("bp = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(PRIME)); SWRITE("\n"); goto Abort; } /* MMPDMA */ if (!strcmp(algName,"MMPDMA")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("p = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* IPGCDC */ if (!strcmp(algName,"IPGCDC")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("gb = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(PRIME)); SWRITE("\n"); goto Abort; } /* IPRES */ if (!strcmp(algName,"IPRES")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("f = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("Q = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(PRIME)); SWRITE("\n"); goto Abort; } /* AFINV */ if (!strcmp(algName,"AFINV")) { SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } Abort: /* Prepare for abort. */ SWRITE("\n\nNow the FAIL handler is aborting the program ...\n"); va_end(argPtr); abort(); Exit: /* Prepare for exit. */ SWRITE("\n\nNow the FAIL handler is exiting the program ...\n"); va_end(argPtr); exit(1); } saclib2.2.8/sysdep/archive/generic/src/DPRNN.c0000664002275300236100000000237514017255270020137 0ustar wcbrownscs/*============================================================================ DPRNN(a,b; c1,c0) Digit product. Inputs a, b : nonnegative BETA-digits. Outputs c1, c0 : the unique nonnegative BETA-digits such that a * b = c1 * BETA + c0. Note: This program assumes that BETA = 2^29. ============================================================================*/ #include "saclib.h" void DPRNN(a,b, c1_,c0_) Word a,b, *c1_,*c0_; { BDigit a0,a1,b0,b1,c0,c1,d0,d1,dp,p0,p1,p10,p11,p2; const BDigit m15 = (1 << 15) - 1, m29 = (1 << 29) - 1, m30 = (1 << 30) - 1; Step1: /* Break apart the inputs. */ a0 = a & m15; a1 = a >> 15; b0 = b & m15; b1 = b >> 15; Step2: /* Multiply the parts. */ p0 = a0 * b0; p1 = a1 * b0 + a0 * b1; p2 = a1 * b1; Step3: /* Add the products in base 2^30. */ p10 = p1 & m15; p11 = p1 >> 15; d0 = p0 + (p10 << 15); dp = d0 >> 30; d0 = d0 & m30; d1 = p2 + p11 + dp; Step4: /* Convert to base 2^29. */ c0 = d0 & m29; dp = d0 >> 29; c1 = (d1 << 1) | dp; Return: /* Return c1 and c0. */ *c1_ = c1; *c0_ = c0; return; } saclib2.2.8/sysdep/archive/generic/src/DQR.c0000664002275300236100000000262314017255270017700 0ustar wcbrownscs/*====================================================================== DQR(a1,a0,b; q,r) Digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 * a0 >= 0 and abs(b) > abs(a1). Outputs q : a BETA-integer, the integral part of (a1 * BETA + a0) / b. r : a BETA-integer, (a1 * BETA + a0) - b * q. ======================================================================*/ #include "saclib.h" void DQR(a1,a0,b, q_,r_) Word a1,a0,b, *q_,*r_; { Word ap0,ap1,bp,i,q,qp,r; /* hide algorithm */ Step1: /* a1 = 0. */ if (a1 == 0) { QREM(a0,b,&q,&r); goto Return; } Step2: /* Compute absolute values. */ ap1 = ABS(a1); ap0 = ABS(a0); bp = ABS(b); Step3: /* Shift and subtract. */ qp = 0; for (i = 1; i <= ZETA; i++) { ap1 = ap1 + ap1; ap0 = ap0 + ap0; if (ap0 >= BETA) { ap0 = ap0 - BETA; ap1 = ap1 + 1; } qp = qp + qp; if (ap1 >= bp) { ap1 = ap1 - bp; qp = qp + 1; } } Step4: /* Compute signs. */ if (a1 < 0) { qp = -qp; ap1 = -ap1; } if (b < 0) qp = -qp; q = qp; r = ap1; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/sysdep/archive/generic/src/DPR.c0000664002275300236100000000316014017255270017674 0ustar wcbrownscs/*============================================================================ DPR(a,b; c1,c0) Digit product. Inputs a, b : BETA-digits. Outputs c1, c0 : the unique BETA-digits such that a * b = c1 * BETA + c0, with c1 * c0 >= 0. Note: This program assumes that BETA = 2^29. ============================================================================*/ #include "saclib.h" void DPR(a,b, c1_,c0_) Word a,b, *c1_,*c0_; { BDigit a0,a1,ap,b0,b1,bp,c0,c1,d0,d1,dp,p0,p1,p10,p11,p2,s; const BDigit m15 = (1 << 15) - 1, m29 = (1 << 29) - 1, m30 = (1 << 30) - 1; Step1: /* Compute absolute values of inputs. */ s = 1; if (a < 0) { ap = -a; s = -s; } else ap = a; if (b < 0) { bp = -b; s = -s; } else bp = b; Step2: /* Break apart the inputs. */ a0 = ap & m15; a1 = ap >> 15; b0 = bp & m15; b1 = bp >> 15; Step3: /* Multiply the parts. */ p0 = a0 * b0; p1 = a1 * b0 + a0 * b1; p2 = a1 * b1; Step4: /* Add the products in base 2^30. */ p10 = p1 & m15; p11 = p1 >> 15; d0 = p0 + (p10 << 15); dp = d0 >> 30; d0 = d0 & m30; d1 = p2 + p11 + dp; Step5: /* Convert to base 2^29. */ c0 = d0 & m29; dp = d0 >> 29; c1 = (d1 << 1) | dp; Step6: /* Give correct signs to c1 and c0. */ if (s < 0) { c1 = -c1; c0 = -c0; } Return: /* Return c1 and c0. */ *c1_ = c1; *c0_ = c0; return; } saclib2.2.8/sysdep/archive/generic/bin/0000775002275300236100000000000014017255270017064 5ustar wcbrownscssaclib2.2.8/sysdep/archive/generic/bin/mklib0000664002275300236100000000324014017255270020104 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/generic/bin/sdesc0000664002275300236100000000240114017255270020105 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/generic/bin/mkproto.awk0000664002275300236100000000265214017255270021270 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/generic/bin/mktexkwic.sed0000664002275300236100000000061114017255270021565 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/generic/bin/mkkwic.awk0000664002275300236100000000306114017255270021055 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/generic/bin/l2b.awk0000664002275300236100000000246114017255270020252 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/generic/bin/mktexkwic.awk0000664002275300236100000000303714017255270021601 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/generic/bin/mkmspec.awk0000664002275300236100000000020514017255270021224 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/generic/bin/mkdesc.awk0000664002275300236100000000164414017255270021043 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/generic/bin/mkproto0000664002275300236100000000072214017255270020503 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/generic/bin/mkdesc0000664002275300236100000000141614017255270020257 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/generic/bin/mktexkwic1.awk0000664002275300236100000000031714017255270021660 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/generic/bin/mkkwic.sed0000664002275300236100000000023414017255270021045 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/generic/bin/sman0000664002275300236100000000035614017255270017751 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/generic/bin/mkmake0000664002275300236100000000534514017255270020263 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[cs] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/generic/bin/mkmspec0000664002275300236100000000042714017255270020451 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/generic/bin/b2l.awk0000664002275300236100000000106114017255270020245 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/generic/bin/mkspec0000664002275300236100000000040614017255270020271 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/generic/bin/mkkwic0000664002275300236100000000235114017255270020275 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/generic/bin/subst0000664002275300236100000000141614017255270020151 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/generic/bin/mktexkwic0000664002275300236100000000242714017255270021022 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/generic/bin/mktexkwic2.awk0000664002275300236100000000162714017255270021666 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/generic/bin/strip1st.awk0000664002275300236100000000045514017255270021365 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/generic/README0000664002275300236100000001026714017255270017202 0ustar wcbrownscs GENERIC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- This version should run on any UN*X machine requiring only minimal changes (but note that the scripts provided are written for 'csh'). 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/generic/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/generic/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "generic" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/generic/install0000664002275300236100000000330014017255270017701 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=generic # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/generic/include/0000775002275300236100000000000014017255270017737 5ustar wcbrownscssaclib2.2.8/sysdep/archive/generic/include/sacsys.h0000664002275300236100000000142214017255270021414 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/SPARC/0000775002275300236100000000000014017255270015550 5ustar wcbrownscssaclib2.2.8/sysdep/archive/SPARC/notes0000664002275300236100000000121314017255270016620 0ustar wcbrownscs1) Need to use assembly GC routines to dump register windows. flush and get_pointers 2) Modified mkmake so that *.s files are properly assembled. Need to make sure cpp is run so that include files are included. 3) use varargs 4) set CC=cc (note this is K&R C and does not have parameter types). this should be set in install (want to be able to use gcc) In this case need to define __STDC__ in sacsys.h 5) Need to use ranlib instead of ar ts 6) changed the environment variable "system" to SPARC in install 7) I had to remove the reference to SACFLAGS in AFLAGS (in mkmake) since as doesn't accept flags such as -g and -O. saclib2.2.8/sysdep/archive/SPARC/src/0000775002275300236100000000000014017255270016337 5ustar wcbrownscssaclib2.2.8/sysdep/archive/SPARC/src/notes0000664002275300236100000000121314017255270017407 0ustar wcbrownscs1) Need to use assembly GC routines to dump register windows. flush and get_pointers 2) Modified mkmake so that *.s files are properly assembled. Need to make sure cpp is run so that include files are included. 3) use varargs 4) set CC=cc (note this is K&R C and does not have parameter types). this should be set in install (want to be able to use gcc) In this case need to define __STDC__ in sacsys.h 5) Need to use ranlib instead of ar ts 6) changed the environment variable "system" to SPARC in install 7) I had to remove the reference to SACFLAGS in AFLAGS (in mkmake) since as doesn't accept flags such as -g and -O. saclib2.2.8/sysdep/archive/SPARC/src/FAIL.c0000664002275300236100000001524514017255270017225 0ustar wcbrownscs/*====================================================================== FAIL(algName,msg,...) Failure handler. Inputs algName : the name of the algorithm which called this algorithm. msg : a string giving the reason for the failure. ... : any other arguments that the calling algorithm passed. Side effects This algorithm display the information about why the failure occurred and aborts the whole program. ======================================================================*/ #include "saclib.h" #include #include void FAIL(va_alist) va_dcl { va_list argPtr; char *algName; char *msg; extern int strcmp(); Step1: /* Basic message. */ va_start(argPtr); SWRITE("\n\n"); algName = va_arg(argPtr,char *); msg = va_arg(argPtr,char *); SWRITE("Failure occurred in: "); SWRITE(algName); SWRITE("\n"); SWRITE("Reason for the failure: "); SWRITE(msg); SWRITE("\n\n"); Step2: /* Failures from the SACLIB library. */ /* GCSI marking stack */ if (!strcmp(algName,"GCSI (marking stack)")) { /* Note that this step is NOT portable since we are assuming that pointers fit into integers. */ SWRITE("BACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); SWRITE("EACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); goto Abort; } /* GCSI final check */ if (!strcmp(algName,"GCSI (final check)")) { SWRITE("N = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("NU = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("RHO = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* GREAD */ if (!strcmp(algName,"GREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* AREAD */ if (!strcmp(algName,"AREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* LREAD */ if (!strcmp(algName,"LREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IREAD */ if (!strcmp(algName,"IREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIIPREAD */ if (!strcmp(algName,"DIIPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIRPREAD */ if (!strcmp(algName,"DIRPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IPREAD */ if (!strcmp(algName,"IPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* RPREAD */ if (!strcmp(algName,"RPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VLREAD */ if (!strcmp(algName,"VLREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VREAD */ if (!strcmp(algName,"VREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* SFRLS */ if (!strcmp(algName,"SFRLS")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("a = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("e = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRQ */ if (!strcmp(algName,"SFRQ")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRSUM */ if (!strcmp(algName,"SFRSUM")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* MAIPDM */ if (!strcmp(algName,"MAIPDM")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("b = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("bp = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* MMPDMA */ if (!strcmp(algName,"MMPDMA")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("p = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* IPGCDC */ if (!strcmp(algName,"IPGCDC")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("gb = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* IPRES */ if (!strcmp(algName,"IPRES")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("f = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("Q = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* AFINV */ if (!strcmp(algName,"AFINV")) { SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } Abort: /* Prepare for abort. */ SWRITE("\n\nNow the FAIL handler is aborting the program ...\n"); va_end(argPtr); abort(); Exit: /* Prepare for exit. */ SWRITE("\n\nNow the FAIL handler is exiting the program ...\n"); va_end(argPtr); exit(1); } saclib2.2.8/sysdep/archive/SPARC/src/CLOCK.c0000664002275300236100000000104314017255270017334 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in millisecconds. For 60 Hz cpu-clock. ======================================================================*/ #include "saclib.h" #include #include Word CLOCK() { Word t; struct tms a; /* hide t; */ Step1: /* Get the system time. */ times(&a); t = a.tms_utime * 100 / 6; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/SPARC/src/DPR.s0000664002275300236100000000412114017255270017146 0ustar wcbrownscs! ! DPR(a,b;c,d) ! [Digit product. a and b are beta-digits. c and d are the unique ! beta-digits such that a*b=c*beta+d and c*d>=0.] ! This version of DPR is written for the UNIX assembler running on the ! Sun Workstation SPARC architecture. ! The original assembly code was written by Todd Torgersen ! Jeremy Johnson ! .seg "text" .global _DPR _DPR: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 ! Take the absolute value of the operands, store sign in %o5. tst %o0 bge 1f xor %o0,%o1,%o5 ! Store sign of result in delay slot. sub %g0,%o0,%o0 ! it's a SPARC :-) 1: tst %o1 bge 2f mov %o0, %y ! Load the y register in the delay slot. sub %g0,%o1,%o1 ! 2: andcc %g0, %g0 ,%o4 ! Zero the partial product and clear N and V. nop ! I don't know why, but this thing does ! not work without this "nop". ! 29 bit multiply ! mulscc %o4, %o1, %o4 ! 1st iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 10th iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 20th iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 29th iteration. mulscc %o4, %g0, %o4 ! The last iteration does necessary shift. rd %y, %g1 ! Read the y register. Least significant bits. srl %g1, 3, %g1 ! Right justify the 29 bits. ! Fix the signs of the output. tst %o5 bge 4f nop ! Nothing in the delay slot. sub %g0, %g1,%g1 sub %g0, %o4,%o4 4: st %g1, [%o3] ! Send least significant bits back. st %o4, [%o2] ! Send most significant bits back. LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/SPARC/src/bin/0000775002275300236100000000000014017255270017107 5ustar wcbrownscssaclib2.2.8/sysdep/archive/SPARC/src/bin/mklib0000664002275300236100000000324014017255270020127 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/SPARC/src/bin/sdesc0000664002275300236100000000240114017255270020130 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/SPARC/src/bin/mkproto.awk0000664002275300236100000000265214017255270021313 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/SPARC/src/bin/mktexkwic.sed0000664002275300236100000000061114017255270021610 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/SPARC/src/bin/mkkwic.awk0000664002275300236100000000306114017255270021100 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/SPARC/src/bin/l2b.awk0000664002275300236100000000246114017255270020275 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/SPARC/src/bin/mktexkwic.awk0000664002275300236100000000303714017255270021624 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/SPARC/src/bin/mkmspec.awk0000664002275300236100000000020514017255270021247 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/SPARC/src/bin/mkdesc.awk0000664002275300236100000000164414017255270021066 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/SPARC/src/bin/mkproto0000664002275300236100000000072214017255270020526 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/SPARC/src/bin/mkdesc0000664002275300236100000000141614017255270020302 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/SPARC/src/bin/mktexkwic1.awk0000664002275300236100000000031714017255270021703 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/SPARC/src/bin/mkkwic.sed0000664002275300236100000000023414017255270021070 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/SPARC/src/bin/sman0000664002275300236100000000035614017255270017774 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/SPARC/src/bin/mkmake0000664002275300236100000000561714017255270020310 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = /bin/as # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[c] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE /bin/ls *.[s] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/SPARC/src/bin/mkmspec0000664002275300236100000000042714017255270020474 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/SPARC/src/bin/b2l.awk0000664002275300236100000000106114017255270020270 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/SPARC/src/bin/mkspec0000664002275300236100000000040614017255270020314 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/SPARC/src/bin/mkkwic0000664002275300236100000000235114017255270020320 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/SPARC/src/bin/mkmake.old0000664002275300236100000000533714017255270021064 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[cs] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/SPARC/src/bin/subst0000664002275300236100000000141614017255270020174 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/SPARC/src/bin/mktexkwic0000664002275300236100000000242714017255270021045 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/SPARC/src/bin/mktexkwic2.awk0000664002275300236100000000162714017255270021711 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/SPARC/src/bin/strip1st.awk0000664002275300236100000000045514017255270021410 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/SPARC/src/flush.s0000664002275300236100000000067114017255270017650 0ustar wcbrownscs!Sparcstation SLC assembler routine to flush register windows. !This routine is coded as a leaf routine, !i.e. it does not get its own window. !Author: N.J.Nevin: 20 Nov 90 #include .seg "text" ! void ! flush_windows(void) .globl _flush_windows _flush_windows: ta ST_FLUSH_WINDOWS !call software trap to flush !register windows to stack jmpl %o7+8, %g0 !return to caller nop !delay slot saclib2.2.8/sysdep/archive/SPARC/src/GC.c0000664002275300236100000000130214017255270016770 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { char *EACSTACK; /* Flush register windows to the stack. */ flush_windows(); /* Get top pointer to the top of the stack. */ EACSTACK = (char *) get_frame_ptr(); GCSI(sizeof(Word),EACSTACK); } saclib2.2.8/sysdep/archive/SPARC/src/README0000664002275300236100000001112114017255270017213 0ustar wcbrownscs SPARC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sun SPARC Operating system: SunOS Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/SPARC/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/SPARC/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "SPARC" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1 Default compilation with mklib ---------------------------------- If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.1 Using gcc instead of cc ---------------------------- If you want to use a different C compiler such as the Gnu C compiler (gcc) all you need to do is set the environment variable CC. This can be accomplished with the command (setenv CC=gcc). ANSI C type type declarations can be used if the variable __STDC__ is set. To see how this is done look in the file include/sacsys.h 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/SPARC/src/install0000664002275300236100000000331614017255270017733 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=SPARC # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." # setenv CC gcc mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/SPARC/src/include/0000775002275300236100000000000014017255270017762 5ustar wcbrownscssaclib2.2.8/sysdep/archive/SPARC/src/include/sacsys.h0000664002275300236100000000142214017255270021437 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/SPARC/src/get_pointers.s0000664002275300236100000000107014017255270021223 0ustar wcbrownscs!Sparcstation SLC assembler routines to get the current framepointer !and the current stackpointer. !These routines are coded as leaf routines, !i.e. they do not get their own windows. !Author: N.J.Nevin, 20 Nov 90 .seg "text" ! int ! *get_frame_ptr(void) .globl _get_frame_ptr _get_frame_ptr: jmpl %o7+8, %g0 !return to caller mov %fp, %o0 !return value is fp (delay slot) ! int ! *get_stack_ptr(void) .globl _get_stack_ptr _get_stack_ptr: jmpl %o7+8, %g0 !return to caller mov %sp, %o0 !return value is sp (delay slot) saclib2.2.8/sysdep/archive/SPARC/src/DQR.s0000664002275300236100000000625714017255270017163 0ustar wcbrownscs! ! DQR(a1,a0,b;q,r) ! [Digit quotient and remainder. a1, a0 and b are BETA-integers with ! a1*a0 >= 0 and abs(b) > abs(a1). q is the integral part of ! (a1*BETA+a0)/b and r is (a1*BETA+a0)-b*q. q and r are ! BETA-integers.] ! ! Replacement routine for DQR.ald ! ! Variables: a1 b a'1 a'0 b' q' q r loopcounter temp ! Registers: o0 o1 o2 g3 [o3] [o4] g5 o5 ! ! Also, register g4 is used for the constant 2^29. ! Register g1 is used for the sign of (a1 * BETA + a0) and the ! sign of b. Register g2 is used for 2*b. ! ! This version of DQR is written for the UNIX assembler running on the ! Sun Workstation SPARC architecture. ! The original assembly code was written by Todd Torgersen. ! Jeremy Johnson ! .seg "text" .global _DQR _DQR: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 mov %o2,%o2 ! Take the absolute value a1, a0, and b. orcc %o0,%o1,%g1 ! if either a1 or a0 is negative. bpos 1f sethi %hi(0x60000000), %g4 ! Delay slot: initialize %g4 = 2^29. sub %g0,%o0,%o0 ! Negate both since a0 and a1 have the sub %g0,%o1,%o1 ! same sign. 1: tst %o2 bge 2f srl %o2,31,%g2 ! Delay slot: Keep sign of b in low order bit. sub %g0,%o2,%o2 ! End taking absolute values. 2: andn %g1,1, %g1 ! Force low order bit of %g1 to 0. or %g1,%g2,%g1 ! Pack sign bit of b in low order bit of %g1. mov 14, %g5 ! Initialize loop counter. mov 0, %g3 ! Initialize q' = 0. add %o2,%o2,%g2 ! Store 2*b in %g2. ! ! Develop quotient bits two at a time. ! sll %o1,2,%o1 ! Skew loop to take advantage of delay slot. 3: ! Begin loop. ! Shift left (a1*BETA+ao). sll %o0,2,%o0 ! Shift a'1. srl %o1,29,%o5 ! top bits of a'0, right justified. or %o5,%o0,%o0 ! Put in low order positions of a'1. andn %o1,%g4,%o1 ! Set 29th and 30th bit of a'0 to 0. subcc %o0,%g2,%g0 ! if ( a'1 >= 2*b' ) bl 7f sll %g3,2,%g3 ! Delay slot: shift q'. sub %o0,%g2,%o0 ! a'1 := a'1 - 2*b' add %g3,2,%g3 ! q' := q' + 2 7: subcc %o0,%o2,%g0 ! if ( a'1 >= b' ) bl 4f subcc %g5,1,%g5 ! Delay slot: Decrement loop counter. sub %o0,%o2,%o0 ! a'1 := a'1 - b' add %g3,1,%g3 ! q' := q' + 1 4: bg 3b ! Branch back. sll %o1,2,%o1 ! Delay slot: Prepare for next iter. ! Develop the last bit. sll %o0,1,%o0 ! Shift a'1. srl %o1,30,%o5 ! Get last bit of a'0. 30 because of shift ! by 2 in the delay slot at end of loop. or %o5,%o0,%o0 ! Put in low order positions of a'1. subcc %o0,%o2,%g0 ! if ( a'1 >= b' ) bl 8f sll %g3,1,%g3 ! Delay slot: shift q'. sub %o0,%o2,%o0 ! a'1 := a'1 - b' add %g3,1,%g3 ! q' := q' + 1 ! Fix the signs of the output. 8: tst %g1 ! if ( (a'1* BETA + a'0) < 0 ) bge 5f sll %g1,31,%g2 ! Delay slot: Restore sign bit of b in %g2. sub %g0,%g3,%g3 ! q' := -q' sub %g0,%o0,%o0 ! a'1 := -a'1 5: tst %g2 ! if ( b < 0 ) bge 6f st %o0, [%o4] ! Delay slot: Send r back (indirect). sub %g0,%g3,%g3 ! q' := -q' 6: st %g3, [%o3] ! Send q back (indirect). LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/SPARC/bin/0000775002275300236100000000000014017255270016320 5ustar wcbrownscssaclib2.2.8/sysdep/archive/SPARC/bin/mklib0000664002275300236100000000324014017255270017340 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/SPARC/bin/sdesc0000664002275300236100000000240114017255270017341 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/SPARC/bin/mkproto.awk0000664002275300236100000000265214017255270020524 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/SPARC/bin/mktexkwic.sed0000664002275300236100000000061114017255270021021 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/SPARC/bin/mkkwic.awk0000664002275300236100000000306114017255270020311 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/SPARC/bin/l2b.awk0000664002275300236100000000246114017255270017506 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/SPARC/bin/mktexkwic.awk0000664002275300236100000000303714017255270021035 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/SPARC/bin/mkmspec.awk0000664002275300236100000000020514017255270020460 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/SPARC/bin/mkdesc.awk0000664002275300236100000000164414017255270020277 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/SPARC/bin/mkproto0000664002275300236100000000072214017255270017737 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/SPARC/bin/mkdesc0000664002275300236100000000141614017255270017513 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/SPARC/bin/mktexkwic1.awk0000664002275300236100000000031714017255270021114 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/SPARC/bin/mkkwic.sed0000664002275300236100000000023414017255270020301 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/SPARC/bin/sman0000664002275300236100000000035614017255270017205 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/SPARC/bin/mkmake0000664002275300236100000000561714017255270017521 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = /bin/as # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[c] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE /bin/ls *.[s] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/SPARC/bin/mkmspec0000664002275300236100000000042714017255270017705 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/SPARC/bin/b2l.awk0000664002275300236100000000106114017255270017501 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/SPARC/bin/mkspec0000664002275300236100000000040614017255270017525 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/SPARC/bin/mkkwic0000664002275300236100000000235114017255270017531 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/SPARC/bin/mkmake.old0000664002275300236100000000533714017255270020275 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[cs] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/SPARC/bin/subst0000664002275300236100000000141614017255270017405 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/SPARC/bin/mktexkwic0000664002275300236100000000242714017255270020256 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/SPARC/bin/mktexkwic2.awk0000664002275300236100000000162714017255270021122 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/SPARC/bin/strip1st.awk0000664002275300236100000000045514017255270020621 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/SPARC/README0000664002275300236100000001112114017255270016424 0ustar wcbrownscs SPARC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sun SPARC Operating system: SunOS Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/SPARC/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/SPARC/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "SPARC" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1 Default compilation with mklib ---------------------------------- If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.1 Using gcc instead of cc ---------------------------- If you want to use a different C compiler such as the Gnu C compiler (gcc) all you need to do is set the environment variable CC. This can be accomplished with the command (setenv CC=gcc). ANSI C type type declarations can be used if the variable __STDC__ is set. To see how this is done look in the file include/sacsys.h 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/SPARC/install0000664002275300236100000000331614017255270017144 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=SPARC # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." # setenv CC gcc mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/SPARC/include/0000775002275300236100000000000014017255270017173 5ustar wcbrownscssaclib2.2.8/sysdep/archive/SPARC/include/sacsys.h0000664002275300236100000000142214017255270020650 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/UltraSPARC/0000775002275300236100000000000014017255270016560 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/notes0000664002275300236100000000121314017255270017630 0ustar wcbrownscs1) Need to use assembly GC routines to dump register windows. flush and get_pointers 2) Modified mkmake so that *.s files are properly assembled. Need to make sure cpp is run so that include files are included. 3) use varargs 4) set CC=cc (note this is K&R C and does not have parameter types). this should be set in install (want to be able to use gcc) In this case need to define __STDC__ in sacsys.h 5) Need to use ranlib instead of ar ts 6) changed the environment variable "system" to SPARC in install 7) I had to remove the reference to SACFLAGS in AFLAGS (in mkmake) since as doesn't accept flags such as -g and -O. saclib2.2.8/sysdep/archive/UltraSPARC/src/0000775002275300236100000000000014017255270017347 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/src/notes0000664002275300236100000000075314017255270020427 0ustar wcbrownscs1) Need to use assembly GC routines to dump register windows. flush and get_pointers 2) Modified mkmake so that *.s files are properly assembled. Need to make sure cpp is run so that include files are included. 3) use varargs 4) set CC=cc (note this is K&R C and does not have parameter types). this should be set in install (want to be able to use gcc) In this case need to define __STDC__ in sacsys.h 5) changed the environment variable "system" to SPARC in install saclib2.2.8/sysdep/archive/UltraSPARC/src/FAIL.c0000664002275300236100000001476114017255270020237 0ustar wcbrownscs/*====================================================================== FAIL(algName,msg,...) Failure handler. Inputs algName : the name of the algorithm which called this algorithm. msg : a string giving the reason for the failure. ... : any other arguments that the calling algorithm passed. Side effects This algorithm display the information about why the failure occurred and aborts the whole program. ======================================================================*/ #include "saclib.h" #include #include #ifdef __STDC__ void FAIL(char *algName, char *msg,...) #else void FAIL(algName,msg) char *algName; char *msg; #endif { va_list argPtr; extern int strcmp(); Step1: /* Basic message. */ SWRITE("\n\n"); SWRITE("Failure occurred in: "); SWRITE(algName); SWRITE("\n"); SWRITE("Reason for the failure: "); SWRITE(msg); SWRITE("\n\n"); Step2: /* Failures from the SACLIB library. */ va_start(argPtr,msg); /* GCSI marking stack */ if (!strcmp(algName,"GCSI (marking stack)")) { /* Note that this step is NOT portable since we are assuming that pointers fit into integers. */ SWRITE("BACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); SWRITE("EACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); goto Abort; } /* GCSI final check */ if (!strcmp(algName,"GCSI (final check)")) { SWRITE("N = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("NU = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("RHO = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* GREAD */ if (!strcmp(algName,"GREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* AREAD */ if (!strcmp(algName,"AREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* LREAD */ if (!strcmp(algName,"LREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IREAD */ if (!strcmp(algName,"IREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIIPREAD */ if (!strcmp(algName,"DIIPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIRPREAD */ if (!strcmp(algName,"DIRPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IPREAD */ if (!strcmp(algName,"IPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* RPREAD */ if (!strcmp(algName,"RPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VLREAD */ if (!strcmp(algName,"VLREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VREAD */ if (!strcmp(algName,"VREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* SFRLS */ if (!strcmp(algName,"SFRLS")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("a = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("e = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRQ */ if (!strcmp(algName,"SFRQ")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRSUM */ if (!strcmp(algName,"SFRSUM")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* MAIPDM */ if (!strcmp(algName,"MAIPDM")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("b = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("bp = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* MMPDMA */ if (!strcmp(algName,"MMPDMA")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("p = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* IPGCDC */ if (!strcmp(algName,"IPGCDC")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("gb = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* IPRES */ if (!strcmp(algName,"IPRES")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("f = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("Q = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* AFINV */ if (!strcmp(algName,"AFINV")) { SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } Abort: /* Prepare for abort. */ SWRITE("\n\nNow the FAIL handler is aborting the program ...\n"); va_end(argPtr); abort(); Exit: /* Prepare for exit. */ SWRITE("\n\nNow the FAIL handler is exiting the program ...\n"); va_end(argPtr); exit(1); } saclib2.2.8/sysdep/archive/UltraSPARC/src/CLOCK.c0000664002275300236100000000106714017255270020352 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in millisecconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; struct rusage r; struct timeval v; Step1: /* Get the system time. */ getrusage(RUSAGE_SELF, &r); v = r.ru_utime; t = v.tv_sec * 1000 + v.tv_usec / 1000; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/UltraSPARC/src/FPCATCH.c0000664002275300236100000000221414017255270020562 0ustar wcbrownscs/*====================================================================== FPCATCH() Floating-point catch. Side Effects This function: 1) Sets FPHAND as the exception handling funciton for floating- point exceptions. 2) Sets overflow, underflow, and divide-by-zero as errors which result in traps. 3) Sets FPFLAG, a global variable that indicates whether a floating-point error has occured, to zero --- i.e. no error. ======================================================================*/ #include "saclib.h" #include #include void FPCATCH() { struct sigaction *p; Step1: /* Set hand as the handler for floating point exceptions. */ p = (struct sigaction *)malloc(sizeof(struct sigaction)); p->sa_handler = NULL; p->sa_sigaction = FPHAND; sigemptyset(&(p->sa_mask)); p->sa_flags = SA_SIGINFO; sigaction(SIGFPE,p,NULL); Step2: /* Set exceptions that actually cause traps. */ fpsetmask(FP_X_OFL | FP_X_UFL | FP_X_DZ); Step3: /* Set error flag to zero. */ FPFLAG = 0; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/0000775002275300236100000000000014017255270020117 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mklib0000664002275300236100000000324014017255270021137 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/sdesc0000664002275300236100000000240114017255270021140 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkproto.awk0000664002275300236100000000265214017255270022323 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mktexkwic.sed0000664002275300236100000000061114017255270022620 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkkwic.awk0000664002275300236100000000306114017255270022110 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/l2b.awk0000664002275300236100000000246114017255270021305 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mktexkwic.awk0000664002275300236100000000303714017255270022634 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkmspec.awk0000664002275300236100000000020514017255270022257 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkdesc.awk0000664002275300236100000000164414017255270022076 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkproto0000664002275300236100000000072214017255270021536 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkdesc0000664002275300236100000000141614017255270021312 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mktexkwic1.awk0000664002275300236100000000031714017255270022713 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkkwic.sed0000664002275300236100000000023414017255270022100 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/sman0000664002275300236100000000035614017255270021004 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkmake0000664002275300236100000000561714017255270021320 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = /bin/as # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[c] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE /bin/ls *.[s] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkmspec0000664002275300236100000000042714017255270021504 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/b2l.awk0000664002275300236100000000106114017255270021300 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkspec0000664002275300236100000000040614017255270021324 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkkwic0000664002275300236100000000235114017255270021330 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mkmake.old0000664002275300236100000000533714017255270022074 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[cs] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/subst0000664002275300236100000000141614017255270021204 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mktexkwic0000664002275300236100000000242714017255270022055 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/mktexkwic2.awk0000664002275300236100000000162714017255270022721 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/UltraSPARC/src/bin/strip1st.awk0000664002275300236100000000045514017255270022420 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/UltraSPARC/src/flush.s0000664002275300236100000000066714017255270020665 0ustar wcbrownscs!Sparcstation SLC assembler routine to flush register windows. !This routine is coded as a leaf routine, !i.e. it does not get its own window. !Author: N.J.Nevin: 20 Nov 90 #include .seg "text" ! void ! flush_windows(void) .globl flush_windows flush_windows: ta ST_FLUSH_WINDOWS !call software trap to flush !register windows to stack jmpl %o7+8, %g0 !return to caller nop !delay slot saclib2.2.8/sysdep/archive/UltraSPARC/src/old_assembly/0000775002275300236100000000000014017255270022024 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/src/old_assembly/DPR.s0000664002275300236100000000233714017255270022642 0ustar wcbrownscs! ! DPR(a,b;c,d) ! [Digit product. a and b are beta-digits. c and d are the unique ! beta-digits such that a*b=c*beta+d and c*d>=0.] ! This version of DPR is written for the UNIX assembler running on the ! Sun SPARC version 9 architecture. ! Author: Jeremy Johnson ! Written: Oct. 12, 1997 ! .seg "text" .global DPR DPR: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 ! Take the absolute value of the operands, store sign in %o5. tst %o0 bge 1f xor %o0,%o1,%o5 ! Store sign of result in delay slot. sllx %o0,32,%o0 ! Extend sign srax %o0,32,%o0 sub %g0,%o0,%o0 1: tst %o1 bge 2f nop ! Do nothing in the delay slot sllx %o1,32,%o1 ! Extend sign srax %o1,32,%o1 sub %g0,%o1,%o1 ! 2: mulx %o0,%o1,%o0 srlx %o0,29,%o1 sllx %o0,35,%o0 srlx %o0,35,%o0 ! Fix the signs of the output. tst %o5 bge 4f nop ! Nothing in the delay slot. sub %g0, %o0,%o0 sub %g0, %o1,%o1 4: st %o0, [%o3] ! Send least significant bits back. st %o1, [%o2] ! Send most significant bits back. LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/UltraSPARC/src/old_assembly/DPRNN.s0000664002275300236100000000132414017255270023071 0ustar wcbrownscs! DPRNN(a,b;c,d) ! [Digit product, non-negative. a and b are non-negative beta-digits. ! c and d are the unique beta-digits such that a*b=c*beta+d and c*d>=0.] ! This version of DPRNN is written for the SPARC V9 architecture. ! Author: Jeremy Johnson ! Written: Oct. 12, 1997 ! .seg "text" .global DPRNN DPRNN: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 mulx %o0,%o1,%o0 srlx %o0,29,%o1 ! Extract c and d. sllx %o0,35,%o0 srlx %o0,35,%o0 st %o0, [%o3] ! Send least significant bits back. st %o1, [%o2] ! Send most significant bits back. retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/UltraSPARC/src/old_assembly/DQR.s0000664002275300236100000000625514017255270022646 0ustar wcbrownscs! ! DQR(a1,a0,b;q,r) ! [Digit quotient and remainder. a1, a0 and b are BETA-integers with ! a1*a0 >= 0 and abs(b) > abs(a1). q is the integral part of ! (a1*BETA+a0)/b and r is (a1*BETA+a0)-b*q. q and r are ! BETA-integers.] ! ! Replacement routine for DQR.ald ! ! Variables: a1 b a'1 a'0 b' q' q r loopcounter temp ! Registers: o0 o1 o2 g3 [o3] [o4] g5 o5 ! ! Also, register g4 is used for the constant 2^29. ! Register g1 is used for the sign of (a1 * BETA + a0) and the ! sign of b. Register g2 is used for 2*b. ! ! This version of DQR is written for the UNIX assembler running on the ! Sun Workstation SPARC architecture. ! The original assembly code was written by Todd Torgersen. ! Jeremy Johnson ! .seg "text" .global DQR DQR: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 mov %o2,%o2 ! Take the absolute value a1, a0, and b. orcc %o0,%o1,%g1 ! if either a1 or a0 is negative. bpos 1f sethi %hi(0x60000000), %g4 ! Delay slot: initialize %g4 = 2^29. sub %g0,%o0,%o0 ! Negate both since a0 and a1 have the sub %g0,%o1,%o1 ! same sign. 1: tst %o2 bge 2f srl %o2,31,%g2 ! Delay slot: Keep sign of b in low order bit. sub %g0,%o2,%o2 ! End taking absolute values. 2: andn %g1,1, %g1 ! Force low order bit of %g1 to 0. or %g1,%g2,%g1 ! Pack sign bit of b in low order bit of %g1. mov 14, %g5 ! Initialize loop counter. mov 0, %g3 ! Initialize q' = 0. add %o2,%o2,%g2 ! Store 2*b in %g2. ! ! Develop quotient bits two at a time. ! sll %o1,2,%o1 ! Skew loop to take advantage of delay slot. 3: ! Begin loop. ! Shift left (a1*BETA+ao). sll %o0,2,%o0 ! Shift a'1. srl %o1,29,%o5 ! top bits of a'0, right justified. or %o5,%o0,%o0 ! Put in low order positions of a'1. andn %o1,%g4,%o1 ! Set 29th and 30th bit of a'0 to 0. subcc %o0,%g2,%g0 ! if ( a'1 >= 2*b' ) bl 7f sll %g3,2,%g3 ! Delay slot: shift q'. sub %o0,%g2,%o0 ! a'1 := a'1 - 2*b' add %g3,2,%g3 ! q' := q' + 2 7: subcc %o0,%o2,%g0 ! if ( a'1 >= b' ) bl 4f subcc %g5,1,%g5 ! Delay slot: Decrement loop counter. sub %o0,%o2,%o0 ! a'1 := a'1 - b' add %g3,1,%g3 ! q' := q' + 1 4: bg 3b ! Branch back. sll %o1,2,%o1 ! Delay slot: Prepare for next iter. ! Develop the last bit. sll %o0,1,%o0 ! Shift a'1. srl %o1,30,%o5 ! Get last bit of a'0. 30 because of shift ! by 2 in the delay slot at end of loop. or %o5,%o0,%o0 ! Put in low order positions of a'1. subcc %o0,%o2,%g0 ! if ( a'1 >= b' ) bl 8f sll %g3,1,%g3 ! Delay slot: shift q'. sub %o0,%o2,%o0 ! a'1 := a'1 - b' add %g3,1,%g3 ! q' := q' + 1 ! Fix the signs of the output. 8: tst %g1 ! if ( (a'1* BETA + a'0) < 0 ) bge 5f sll %g1,31,%g2 ! Delay slot: Restore sign bit of b in %g2. sub %g0,%g3,%g3 ! q' := -q' sub %g0,%o0,%o0 ! a'1 := -a'1 5: tst %g2 ! if ( b < 0 ) bge 6f st %o0, [%o4] ! Delay slot: Send r back (indirect). sub %g0,%g3,%g3 ! q' := -q' 6: st %g3, [%o3] ! Send q back (indirect). LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/UltraSPARC/src/FPHAND.c0000664002275300236100000000213014017255270020447 0ustar wcbrownscs/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. This function is system dependent: for SunOS 5.6. ======================================================================*/ #include "saclib.h" #include #include void FPHAND(i,sip,uap) int i; siginfo_t* sip; void* uap; { struct ucontext *p; Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ p = (struct ucontext*)uap; p->uc_mcontext.fpregs.fpu_fsr &= (~( (FP_X_INV | FP_X_OFL | FP_X_UFL | FP_X_DZ | FP_X_IMP) << 23) ); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/UltraSPARC/src/GC.c0000664002275300236100000000130214017255270020000 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { char *EACSTACK; /* Flush register windows to the stack. */ flush_windows(); /* Get top pointer to the top of the stack. */ EACSTACK = (char *) get_frame_ptr(); GCSI(sizeof(Word),EACSTACK); } saclib2.2.8/sysdep/archive/UltraSPARC/src/README0000664002275300236100000001112114017255270020223 0ustar wcbrownscs SPARC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sun SPARC Operating system: SunOS Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/SPARC/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/SPARC/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "SPARC" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1 Default compilation with mklib ---------------------------------- If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.1 Using gcc instead of cc ---------------------------- If you want to use a different C compiler such as the Gnu C compiler (gcc) all you need to do is set the environment variable CC. This can be accomplished with the command (setenv CC=gcc). ANSI C type type declarations can be used if the variable __STDC__ is set. To see how this is done look in the file include/sacsys.h 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/UltraSPARC/src/install0000664002275300236100000000331614017255270020743 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=SPARC # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." # setenv CC gcc mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/UltraSPARC/src/include/0000775002275300236100000000000014017255270020772 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/src/include/sacsys.h0000664002275300236100000000142214017255270022447 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/UltraSPARC/src/DPRNN.c0000664002275300236100000000105714017255270020377 0ustar wcbrownscs/*============================================================================ DPRNN(A,B; c1,c0) Digit product. Inputs A, B : nonnegative BETA-digits. Outputs c1, c0 : the unique nonnegative BETA-digits such that a * b = c1 * BETA + c0. ============================================================================*/ #include "saclib.h" void DPRNN(A,B,c1_,c0_) Word A,B,*c1_, *c0_; { DWord C; C = A; C = C*B; *c0_ = (Word)(C & (BETA - 1)); *c1_ = (Word)(C >> ZETA); return; } saclib2.2.8/sysdep/archive/UltraSPARC/src/DQR.c0000664002275300236100000000124214017255270020140 0ustar wcbrownscs/*====================================================================== DQR(a1,a0,b; q,r) Digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 * a0 >= 0 and abs(b) > abs(a1). Outputs q : a BETA-integer, the integral part of (a1 * BETA + a0) / b. r : a BETA-integer, (a1 * BETA + a0) - b * q. ======================================================================*/ #include "saclib.h" void DQR(a1,a0,b,q_,r_) Word a1, a0, b, *q_, *r_; { DWord N,T; N = a1; T = b; N <<= ZETA; N += a0; T = N / b; *q_ = (Word)(T); T *= b; N -= T; *r_ = (Word)(N); return; } saclib2.2.8/sysdep/archive/UltraSPARC/src/get_pointers.s0000664002275300236100000000106414017255270022236 0ustar wcbrownscs!Sparcstation SLC assembler routines to get the current framepointer !and the current stackpointer. !These routines are coded as leaf routines, !i.e. they do not get their own windows. !Author: N.J.Nevin, 20 Nov 90 .seg "text" ! int ! *get_frame_ptr(void) .globl get_frame_ptr get_frame_ptr: jmpl %o7+8, %g0 !return to caller mov %fp, %o0 !return value is fp (delay slot) ! int ! *get_stack_ptr(void) .globl get_stack_ptr get_stack_ptr: jmpl %o7+8, %g0 !return to caller mov %sp, %o0 !return value is sp (delay slot) saclib2.2.8/sysdep/archive/UltraSPARC/src/DPR.c0000664002275300236100000000125414017255270020142 0ustar wcbrownscs/*============================================================================ DPR(A,B; c1,c0) Digit product. Inputs A, B : BETA-digits. Outputs c1, c0 : the unique BETA-digits such that a * b = c1 * BETA + c0, with c1 * c0 >= 0. ============================================================================*/ #include "saclib.h" void DPR(A,B,c1_,c0_) Word A,B,*c1_, *c0_; { DWord C; C = A; C = C*B; if (C < 0) { C = -C; *c0_ = (Word)(-(C & (BETA - 1))); *c1_ = (Word)(-(C >> ZETA)); } else { *c0_ = (Word)(C & (BETA - 1)); *c1_ = (Word)(C >> ZETA); } return; } saclib2.2.8/sysdep/archive/UltraSPARC/bin/0000775002275300236100000000000014017255270017330 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/bin/mklib0000664002275300236100000000325514017255270020356 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif echo "Compiling with" $CC if ($1 == "std") then echo "This option no longer exists!" # pushd >/dev/null $saclib/lib/obj # make CC=$CC SACFLAG= EXTENSION= # popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo # make CC=$CC "SACFLAG=-O" EXTENSION=o make CC=cc "SACFLAG=-O" EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=cc SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/UltraSPARC/bin/sdesc0000664002275300236100000000255314017255270020361 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # The last line used to look like this: # awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # but I took it out saclib2.2.8/sysdep/archive/UltraSPARC/bin/slist.awk0000664002275300236100000000207714017255270021200 0ustar wcbrownscsBEGIN { p = length(rcsdir)+2; count = 0; history = ""; } $1 == "head" { history = "" } $1 == "date" { history = substr($6,0,length($6)-1) " " history } $1 == "desc" { n = split(history,a); if (state == "algo" && a[1] != "new" && a[n] != "del" && match(history,"algo") > 0) { count++; print shortname(FILENAME,p); } if (state == "bug" && a[1] != "new" && a[n] != "del" && match(history,"bug") > 0) { count++; print shortname(FILENAME,p); } if (state == "del" && a[1] != "new" && a[n] == "del") { count++; print shortname(FILENAME,p); } if (state == "new" && a[1] == "new" && a[n] != "del") { count++; print shortname(FILENAME,p); } } END { printf "\n>> %d functions ", count if (state == "algo") print "have modified algorithms." if (state == "bug") print "have bug fixes." if (state == "del") print "were deleted." if (state == "new") print "are new." printf "\n" } function shortname(longname,p) { sname = substr(longname,p); sname = substr(sname,0,length(sname)-2); return sname; } saclib2.2.8/sysdep/archive/UltraSPARC/bin/sci0000664002275300236100000000024414017255270020031 0ustar wcbrownscs#!/bin/csh if ($#argv != 3) then echo "Usage: sci " else ci -l -s$2 -w$3 ${saclib}/RCS/$1,v endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/isachelp0000664002275300236100000001146214017255270021047 0ustar wcbrownscs#!/bin/csh ###################################################### # This is a ISAC Help Program # # Written by Hoon Hong April 24, 1991 # Modified by Herbert Vielhaber in March, 1992 # # This shell script is called by the system "isac". # The isac always passes one argument # which is either "general" or a saclib algorithm name. ###################################################### ##################################################### # PLEASE ADJUST THE FOLLOWING!!!! ##################################################### # The paths to be searched for algorithms: set searchPaths = ($saclib/src) # The number of lines displayed by more: set moreNumLines = 15 ##################################################### # Defaults ##################################################### set view_flag = false set general_flag = true set module = "" ##################################################### # Process command line ##################################################### while ($#argv > 0) set a=$argv[1] shift switch ($a) case '-general': set general_flag = true breaksw case '-view': set view_flag = true breaksw default: if ($module == "") then set general_flag = false set module = $a endif breaksw endsw end ####################################################### # If the user asked for a help on a specific algorithm, ###################################################### if ($general_flag == false) then foreach aPath ($searchPaths) if (-e $aPath/${module}.c) then if ($view_flag == true) then view $aPath/${module}.c else more -$moreNumLines $aPath/${module}.c endif exit 0 endif end echo ${module} not found. exit 1 endif #################################################### # If the user asked for a general help, #################################################### more -$moreNumLines <<\END_GENERAL_HELP ======================================================== Help on ISAC (Version 2.0) ======================================================== Disclaimer ---------- This help text was written in a very short time, thus is not really helpful yet! -- Herbert Vielhaber, March 10, 1992 Currently supported SACLIB algorithms ------------------------------------- All the SACLIB library algorithms and macros are accessible. NIL and BETA are available as constants. Command line options -------------------- Several command line options are available for initializing certain SACLIB global variables. In order to find out what is available, issue the command: isac +h Interface functionality ----------------------- An ISAC session consists of one or more statements. Every statement must end with a semicolon ';'. A statement can be one of the three kinds command call assignment The commands supported in this version are: quit; : For quitting the session. vars; : For displaying the contents of the variables. Values are displayed in internal SACLIB format. help [algName]; : For displaying a general help or an algorithm. For example, in order to display the algorithm IPROD, issue the the command: help IPROD; view algName; : For displaying an algorithm with the editor vi(1). save fileName; : For saving the current state of the session (i.e. the variable binding) to a file. restore fileName; : For restoring the state of a session from a file. A call statement is a call to any procedures in the SACLIB library. For example, IPFAC(r,A; s,c,F); IPWRITE(r,IPSUM(r,A,B),V); An assignment statement is of the form: var := expression; For example, A := IPROD(a,ISUM(b,c)); a := 2 * 3 + 4; a := 3 % 2; Interface Grammar ----------------- Below we give a context-free grammar for a session. Conventions: upper-case strings and quoted strings denote tokens, lower-case strings denote non-terminals. session : statement | session statement ; statement : command ';' | proc_call ';' | assignment ';' ; command : IDENT | IDENT CMDARGS ; proc_call : IDENT '(' proc_arg_star ')' ; assignment : IDENT ':=' expr ; proc_arg_star : val_star | val_star ';' ref_star ; val_star : /* empty */ | val_plus ; val_plus : expr | val_plus ',' expr ; ref_star : /* empty */ | ref_plus ; ref_plus : ref | ref_plus ',' ref ; ref : IDENT expr : expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | expr '%' expr | '+' expr | '-' expr | '(' expr ')' | func_call | atom ; func_call : IDENT '(' func_arg_star ')' ; func_arg_star : val_star ; atom : IDENT | INTEGER ; ================================================== \END_GENERAL_HELP exit 0 saclib2.2.8/sysdep/archive/UltraSPARC/bin/slog0000664002275300236100000000063314017255270020221 0ustar wcbrownscs#!/bin/csh if ($#argv < 1) then echo "Usage: slog [rev]" else if !(-f ${saclib}/RCS/$1,v) then echo $1": No RCS record." else if ($#argv == 1) then echo "=============================================================================" echo $1 rlog ${saclib}/RCS/$1,v | sed '1,13d' | more else co -q -p$2 ${saclib}/RCS/$1,v | more endif endif endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkproto.awk0000664002275300236100000000265214017255270021534 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/UltraSPARC/bin/mktexkwic.sed0000664002275300236100000000061114017255270022031 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkkwic.awk0000664002275300236100000000306114017255270021321 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/UltraSPARC/bin/l2b.awk0000664002275300236100000000246114017255270020516 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/UltraSPARC/bin/mktexkwic.awk0000664002275300236100000000303714017255270022045 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkmspec.awk0000664002275300236100000000020514017255270021470 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkdesc.awk0000664002275300236100000000164414017255270021307 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkproto0000664002275300236100000000072314017255270020750 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName, char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkdesc0000664002275300236100000000141614017255270020523 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/mktexkwic1.awk0000664002275300236100000000031714017255270022124 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkkwic.sed0000664002275300236100000000023414017255270021311 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/UltraSPARC/bin/sman0000664002275300236100000000035614017255270020215 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkmake0000664002275300236100000000577514017255270020536 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/objo/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P -xarch=v8plus AS = /usr/ccs/bin/as AR = /usr/ccs/bin/ar RANLIB = /usr/ccs/bin/ranlib # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[c] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE /bin/ls *.[s] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkisac0000664002275300236100000000035314017255270020523 0ustar wcbrownscs#! /bin/csh # USAGE: # mkisac # # FUNCTION # makes isac. if ($#argv > 0) then echo "USAGE:" echo " mkisac" exit endif # use gcc set CC=gcc pushd >/dev/null $saclib/isac make CC=$CC popd >/dev/null echo "mkisac done." saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkmspec0000664002275300236100000000042714017255270020715 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/UltraSPARC/bin/b2l.awk0000664002275300236100000000106114017255270020511 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkspec0000664002275300236100000000040614017255270020535 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/UltraSPARC/bin/mkkwic0000664002275300236100000000235114017255270020541 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/UltraSPARC/bin/slist0000664002275300236100000000037614017255270020417 0ustar wcbrownscs#!/bin/csh # lists all RCS files that have the state value of the first argument. set RCSDIR = $saclib/RCS if ($#argv != 1) then echo "Usage: slist " else nawk -f $saclib/bin/slist.awk state=$1 rcsdir=$RCSDIR $RCSDIR/*.c,v endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/isac0000664002275300236100000143267414017255270020213 0ustar wcbrownscsTy-@  \.text( .data\\\@.bss .comment(6ET\RU RPguuq Pt3ɸ)ÐUՁ43error: %s Uuh,hЋ裤hЋÐwsave_state: couldn't open file %s %d %s UVS]hh\S  u#Sh^hЋ3hЋ93l5\Fhpw3ۃ9\F~?44 PhHw4th0wC9\FV:ue[^rrestore_state: couldn't open file %s %d%srestore_state: couldn't enter string into table UWVS]hhCS uShEhЋhЋCh\FhkvP u/3hqhЋբhЋWA Ӑ39\F~OVhnavP{ tV Ѓt44DC9\FW[^_restore_state: end of file too early US]uhhЋhЋ BË]/dev/ttyrestore_state: unable to restore standard input UhhChq u h hЋ臡hЋj^qsave_state: unable to restore standard output Uhh\h u h|hЋhЋjpUsh .hh؏u h ːU yhJ uÐ ======================================================== I S A C ======= Interface to SAC Library Version 2.0 June 26, 1992 Copyright (C) 1992 by Herbert Vielhaber Developed at RISC-Linz (Research Institute for Symbolic Computation) Type 'help;' for help. Report any problem to SACLIB Maintenance saclib@risc.uni-linz.ac.at UhhphjphphphphRyphophep hXphNph:Dpht:ph0ph&phphp hph"oh\ohjoÐUVS`F=lFtPlF`F@4lFhS$t `F@\`F`F@ Uh5ddh =nhÐUhUS]SjSjSjSj SjSjSjSj Sj Sj Sj Sj  SjSjSj|Sjt SjiSjaSjYSjQ] ********** UNRECOVERABLE ERROR SITUATION ENCOUNTERED ********** SIGNAL #%d has been raised. Please press the return key, if the prompt '>' does not appear in the next line! US]h lSh/ lhM lhl |l[hijhhstring table is fullUWVS}39~5PW՚t C99~ [5CWi؉= &4WPh e[^_ÐUEÐUuiÐ       !#%)*,.248<@DHKNRTV[]_          !  5./0& '',.   ! ()*+, 1 ! !'$#"-26374%   ! $  3USE]M P~CAUJ}]parser stack overflowcommand failedcannot assign a value to a constantconstant used as reference argumentunknown variableunknown identifierparse errorUWVSp4P0Dž,Dž@Dž88<n<0<f@t8EEf44cPh+4D4th3DC9\Fċ]ÐUVS]u PCtCSVuSK |3PCtKyD3ۀ>t3PCt3 C<3ue[^Ð bye! Uh57Dj@isachelp UdSE] 5 $5UMf (5fMPS_tSuj]isachelp -view UdSE]m5 q5UMu5 y5UMPStSj]UdÐUuÐUuÐFAILAADVABSACLOCKADDTOADVADV2ADV3ADV4AFCOMPAFCRAFDIFAFDWRITEAFFINTAFFRNAFICRAFINVAFNEGAFPAFPAFPAFQAFPBRIAFPCMVAFPCRAFPDIFAFPDMVAFPEMVAFPEVAFPFIPAFPFRPAFPICRAFPINTAFPMEAFPMONAFPNEGAFPNIPAFPNORMAFPPRAFPQRAFPRCLAFPRIIAFPRLSAFPRODAFPRRIAFPRRSAFPSUMAFPWRITEAFQAFSIGNAFSUMAFUPBRIAFUPCSFBAFUPFACAFUPGCAFUPGSAFUPIIRAFUPIIWSAFUPMPRAFUPRBAFUPRICLAFUPRICSAFUPRIIAFUPRLAFUPRLSAFUPRRIAFUPRRSAFUPSFAFUPSFBAAFUPSFNAFUPSRAFUPVARAFUPWRITEAFUSPSFBAFWRITEAIFANAMPDMVAMPSAFPAMSIGNAMSIGNIRAMUPBESAMUPBHTAMUPIIRAMUPIIWSAMUPMPRAMUPNTAMUPRBHAMUPRICSAMUPRICSWAMUPRINCSAMUPRLSAMUPRRSAMUPSRAMUPTRAMUPTR1AMUPVARIRANDWRITEANFAFANIIPEANPEDEANPRODANREPEANSUMAREADASSPRAWRITEBEGINSACLIBBITRANBKSPCCONCCINVCLEARCLOCKCLOUTCOMPCOMP2COMP3COMP4CONCCOPYTOCPLEXNCREADCREADBCSFPARCSINTCSSUBCSUNCTMICWRITEDANDDEGCDDGCDDIELOCDIGITDIIPREADDIIPWRITEDIPDEGDIPFPDIPINSDIRPREADDIRPWRITEDLOG2DMPPRDDMPSUMDMUPNRDNIMPDNOTDORDPCCDPFPDPGENDPRDQRDRANDRANNDSQRTFDVCMPENDSACLIBEQUALEVENEXPFEXTENTFILINEFIRSTFIRST2FIRST3FIRST4FOURTHFREEARRAYFRESLFRLSMGCGCA2PTRGCAFREEGCAGETGCAMALLOCGCGLOBALGCSIGDPGENGETARRAYGETLISTGREADGWRITEIABSFIBCINDIBCOEFIBCPSICOMPICRANDIDEGCDIDEQIDIFIDIPR2IDP2IDPRIDQIDQRIDREMIEGCDIEQIEVENIEXPIFACTIFACTLIFATLIFCL2IFLTAIGCDIGCDCFIHEGCDIICILCMILCOMBILOG2ILPDSILWRITEIMAXIMINIMP2IMPBIMPDSINEGINFOSACLIBINVIODDIORD2IPABSIPAFMEIPBEILVIPBHTIPBHTLVIPBHTMVIPBREIIPCIPCEVPIPCONSTIPCPPIPCRAIPCSFBIPDERIPDIFIPDMVIPDQRIPDSCRIPDWRITEIPEMVIPEQIPEVALIPEXPIPEXPREADIPEXPREADRIPFACIPFACTREADIPFCBIPFLCIPFRPIPFSDIPFSFBIPGCDCIPGFCBIPGSUBIPHDMVIPICIPICPPIPICSIPIHOMIPIISSIPIIWSIPINTIPIPIPIPPIPIPRIPIQIPIQHIPLCPPIPLEVIPLRRIIPMAXNIPMONFACTIPNEGIPNTIPONEIPOWERIPP2PIPPFAC2IPPGSDIPPNPRSIPPOWREADIPPPIPPRODIPPSCIPPSRIPPVEDIPQIPQRIPRANIPRCHIPRCHSIPRCN1IPRCNPIPREADIPRESIPRICLIPRIMIPRIMOIPRIMSIPRIMUIPRIMWIPRISTIPRODIPROD2X2IPROD3X2IPROD3X3IPRODAIPRPRSIPRRIIIPRRLSIPRRRIIPRRSIPSCPPIPSFIPSFBAIPSFSDIPSIFIIPSIGNIPSMVIPSPRSIPSQRTIPSRMIPSRMSIPSRPIPSUBIPSUMIPSUMNIPTERMREADIPTPRIPTRIPTR1IPTR1LVIPTRANIPTRLVIPTRMVIPTRUNIPVCHTIPVDEG12IPWRITEIQIQRIRANDIREADIREMIROOTISATOMISFPFISFPIRISGCAISIGNFISLISTISNILISOBJECTISPDISPFAC2ISPSFBISPTISQRTISUMISZEROITRUNCIUPBEIIUPBESIUPBHTIUPBREIUPCHTIUPFACIUPFDSIUPIHTIUPIIRIUPNTIUPQHIUPQHLIUPQSIUPRBIUPRCIUPRLPIUPSRIUPTPRIUPTRIUPTR1IUPVARIUPVOIIUPVSIIUPWRITEIUSFPFIUSFPF2IWRITEKARATSUBALASTCELLLBIBMSLBIBSLBIMLCONCLDSMKBLDSSBRLEINSTLELTILENGTHLEROTLETTERLEXNEXLFSLINSLINSRTLIST1LIST10LIST2LIST3LIST4LIST5LKAHEADLMERGELPERMLREADLSRCHLWRITEMAIPDEMAIPDMMAIPHMMAIPPMARKMAXMCPMVMDCRAMDDIFMDEXPMDHOMMDINVMDINVBMDLCRAMDNEGMDPRODMDQMDRANMDSUMMEMBERMIAIMMICINSMICSMIDCRAMIDIFMIEXPMIHOMMIINVMINMINEGMINNCTMIPDIFMIPFSMMIPHOMMIPIPRMIPISEMIPMIPMIPMONMIPNEGMIPPRMIPRANMIPRODMIPSUMMIQMIRANMISUMMIUPQRMIUPSEMMDDETMMDNSBMMPDMAMMPEVMMPIQRMPDIFMPEMVMPEVALMPEXPMPGCDCMPHOMMPINTMPIQHMPIQHLMPIQHSMPMDPMPMONMPNEGMPPRODMPPSRMPQMPQRMPRANMPRESMPSPRSMPSUMMPUCMPUCPPMPUCSMPUPMPUPPMPUQMUPBQPMUPDDFMUPDERMUPEGCMUPFBLMUPFSMUPGCDMUPHEGMUPRANMUPRCMUPRESMUPSFFODDORDEROREADOWRITEPADVPAIRPARTNPARTRPARTSSPBINPCLPCOEFFPCONSTPCPVPDBORDPDEGPDEGSVPDEGVPDLOG2PDPVPERMCYPERMRPFBREPFDIPPFDPPHDQRPICPVPINVPLBCFPLDCFPMDEGPMONPMONSVPMPMVPNDQRPORDPPERMVPPLTPREDPRODUCTPRTPSDSVPTBCFPTMVPTVPUFPPUNTQREMREDRED2RED3RED4REDIREMRIBRILRILCRINEGRINTRIPRODRIRNPRISIGNRISUMRNABSRNBCRRNCEILRNCOMPRNDENRNDIFRNDWRITERNFCL2RNFLORRNINTRNINVRNMAXRNMINRNNEGRNNUMRNP2RNPRODRNQRNRANDRNREADRNREDRNSIGNRNSUMRNWRITERPAFMERPBLGSRPDIFRPDMVRPDWRITERPEMVRPEXPREADRPFACTREADRPFIPRPIMVRPMAIPRPNEGRPPOWREADRPPRODRPQRRPRANRPREADRPRNPRPSUMRPTERMREADRPWRITERUPWRITESDIFFSDRSECONDSEQUALSFCCONSFCDIFSFCFRSFCIPSFCMSQSFCNEGSFCPRSFCQSFCRPSFCSSFCSUMSFIFISFIRSTSFRABSSFRDIFSFRLSSFRNEGSFRPRSFRQSFRSUMSIGNSINTERSLELTISMFMISMFMIPSREDSTATSACLIBSUBFROMSUFFIXSUNIONSWRITETHIRDUSDIFFUSINTUSUNVARVCOMPVIAZVIDIFVIEREDVILCOMVINEGVISPRVISUMVIUTVLREADVLSRCHVLWRITEVMAXVMINVMPIPVREADVWRITEquithelpviewvarssaverestoreNILBETA Failure occurred in: Reason for the failure: GCSI (marking stack)BACSTACK = EACSTACK = GCSI (final check)N = NU = RHO = GREADC = AREADLREADIREADDIIPREADDIRPREADIPREADRPREADVLREADVREADSFRLSu = v = a = e = SFRQg = SFRSUMMAIPDMr = A = b = bp = The current length of PRIME list = MMPDMAp = M = IPGCDCB = gb = IPRESf = Q = AFINV Now the ISAC signal handler is taking control ... UWVS] h|G!hG!u !hG!hG S h|G ]}Gu@hG u覛hG hG u芛hG }GuWhGu sRhG` hGV s3hGA hH7 3 }H}H}Htw}Htf}%H tU}.H tD}7Ht3}>Ht"}EHt}LHu&hHl3ushG[ S}RHhXH1shGh]HshGhbHs hGhgH3hG}lHuKhXHsVhGh]H~s7hGihqH3}vHuKhXHAshG,h]H"shG hqH}}HuwhHshGhHshGhHs` hGhH3B}HuKhH]shGHhH>shG)hH}HhHshGhHshGhHsx hGhH3ohGhH5Tw{PYhGg O}HhH=shG(hHshG hHs hGhHsnhGhH3nhGhH 5TzPwhG p}Hu_hHeshGPhHFshG1hH'3 hGhH&hH&UVSU] u tEPEPREE M Me[^ÐUE}ÐUh+UWVS]} u33;}G=~ 3҉A;|=~ 3҉Auލe[^_ÐUVSM] uLP e[^ÐU WVSu }]SEPuSEPuMUUMe[^_ÐUWVSu }]SEPEPuSEPu\MUUMUMe[^_ÐUWVSu }]SEPuSEPu SEPu$SEPuMUUMUMUMe[^_ÐUVSu] uuNPSV.#e[^ÐUUu3ÐEPEPRj(.uuPzÐUS]u PS&#]ÐUS]EPEPuu uRSuuP]ÐUSEu3PjjPS@z]ÐUS]u3jjPSz]ÐUUu3ÐEPEPR貄ujEPujResultant is 0AFINVUS]EPEPu f u7uuXEuEPEPuSO]}uuuShRhREPEPEPuj"}}u"EuuuPSEuPxEE]ÐUUu3ÐEPEPR膃uu#PxU WVS}Etu3iE uNEPEPEPuDuuWu q uWu VSuPd؃ } uS؋Íe[^_ÐU WVSE}u3iEuN EPEPEPuuWuu  Wuu VSuPJd؃ } uS؋Íe[^_ÐU@WVSuu EPEPuuu u"EWuc } uW"MM}P؁< Lu MUEË4uLEPEP4uu4uu uMMLu4PM M uLMu UPU MU؁< Suu}E ]EPEPuEPSuE } t.SEPEPuuuubE܃} uuuPBbEԃ} {uEԃPUċEԋ؁< `M̉MȍuЉu } ËЋMā< EPEPEPR:E gE܋LEE؋4E4}EPuuuEPuuuuuuaE } t} u} uu؉uuuPbEWP a} t4PUԁ< } tWUԡL4`WPEԃ PMċ؁< EԋLe[^_ÐUWVS}Uu 3EPEPEPRjuGPWjVWxEPEPEPujuGPZE~WjPWEuVu W? CE+E;~uVWMM } }9]|uVu W C9]}ƍe[^_ÐU VSE u3muNE } tOEPEPEPuu u uVSuPR_؃ } uS芾؋Íe[^ÐUWVSE UuRuu}uRPvEU ]KLM<}EE9E~+EPEPEPQVuu^}9}}frE } tLEPEPEPuu u uVSuPY؃ } uSʸ؋Íe[^ÐUWVS}u UU WUEPEPEPuxE@EuP'PuVuPuVuOSuPX؃ } u}tSjuX؃ S؍e[^_ÐUWVS} E3UUؐFEPEPuujSWE+@P؃ } u΍e[^_ÐUWVS}u ]u3SWPVSPVWe[^_ÐU VSUE u3nuP^E rEPEPEPu(u ua uVSuPW؃ } uS؋Íe[^ÐUSM M t9EPEPEPuuESuP[W؃ } uS蓶؍EPEPSjjjjPujrEPuuЃjujPujaЃEPEPEPRj EPEPuSUPL4[V؃} uSӵ؋]UWVSu} uV\EEPEPu^SSjuS蚽EWAu7uuSPVVWjuPFPvPV`PVe[^_ÐUWVSE]tu 3}uSPu , PTESyTE3}OEPEPEPuUU EPEPEPuuuuu uuu WISPEEPU؃ } uSVu  } bƍe[^_UWVSu]S׼ESESE MIMV誼+]VdЃ}uuRu EE EPEPuRu ui}uHWSu:TuSgV;Suu u6(PVu T u3W6M9M1e[^_ÐU WVSu˻u ]Suj6E S薻~.SjZEuu0SESujŐ uu uuE VuWSu uC} t)EPEPuuSuj؃뺐ƍe[^_ÐUWVS}u uuV#fjPfDuu!EEPEPEPuuu u聺uwE}So tىMLEEUR`PuujjEPu u EE E ~ E$EuVHeuPjQE܃u/otu趹PoEtEEPEPEPuUPLEuPuujE$uu u untMMىMu}} u MMELUuu}DuPuujEuu uQ EE %EMM]E}u t/uuu u'ttu ىtt}uuE@P2PE܃ _EEMMM}tMMtu^mtEÅ~EuEE1M؉M̋MȉMXEÅ|EEuuuuuu uuPj{OE܃(}uuuuuu uuPjV`uuuuuu uuPjV8M؉M̋MȉMMMMxu%EuEuuujEuuuj |(uuu PuI|xu Pu'PSu uuuW|SuujEuu u (Suuj`Euu u ؋Eƃ~(uEÅnEƅ0Wu3aEuW'aEÃDEÅ~}̋MMMM}MxM|uuWuu u$EƃmWuu u$Wu`EuW`] uEPVuuu ucuujPjgME܃0 }`}uuu`uPjLE܃MԉM؋MMMMMMt]MM} u趫E܋E܍h[^_ÐU WVSU] t u EPEPEPRZ EPEPEPSC MM}EPuWuuuuu u$}}4VuuK } tEPEPWu4E>SuuK؃ } tEPEPuu E}t}Y}uSSuu;K؃ } }萐WEPEPuOSuuK؃} uNVuuJ } t1}WEPEPuVuuJ} uVS؋M 1M$e[^_ÐU(WVS}U ]tu 3EPEPR~hEPEPSphuuEuujEW"u;|%EPEPEPWu0CuS؃̍EPEPEPuj}}uESuPuuP\e[^_ÐUWVS} EPEPug uuVuu u ؃u]Vuu u u؋UDž~uu;tuuf\e[^_ÐUWVS]uEPEPSgEPEPVfuu }ƾuu}ƾ}uu%EuuEuuDE}|u~uuu uuuSuu uЃt …} ] ]uuE}}n~uuu uEuuSuu u$Ѓt …} ] ]uuE}uuF}#uu%uuZuuuZM M$M(1e[^_ÐUWVSMU Eu H=uPR+UE qLM<}EE9E~EPEPEPQSuu#}9}}(EPEPEPuSuuHF؃cEPEPEPuhEPEPEPuT uuuuuV tSuPE؃ } t}  } u}} uUSСP}< u3ҋe[^_ÐUVSEU M]u SRuLESPR|pUQDEEPEPu1ueEj(GJEPEPEPu4SuuVg }~ u}~j^Ju=} tj+I} uj)Ie[^ÐUVSu] u3uV#PSVe[^USUu3:EPEPRrbuu<tuu u؋Ë]ÐU8WVSU] u uEPEPR bEP}WSaEPEPuaEPEPuaEPEPEPuuF,uulEȃuu[uuNuSj-uVj (PSj  URURWPj@}}u臟EЃuuu3 uP_Ve[^_ÐU@WVS}} EPEPuujEVurB} uVuE EPEPuuu u#Euu BE } uP藡EuEP؁< LM<}UEË4LEPEP4u4uu uC&MML}؃} uɁ} uSVe[^ÐUWVS}] EPEPEPSW*uNuSWj*PHQ MMjju艭PjjjzPASjSj؃ } thEPEPu0ujEURURURPuW=,}tSuWjEVu=} uƍe[^_ÐUWVS}} uV}u3EE} u2uWjEjuDPjmE}u2u WjEju Pj5Eu u;| ] u ]u Wj EPEPVSWj}t uѐ]SEPVu WjSEPVuWjM1MU MU e[^_ÐU S]E u E>PSjEuX~!uSjURURURPuShE]UWVS}EPEPu0Zuui؃uWu umuuu SWu uO;uSuuSOe[^_ÐU,WVSUUUj觽E܃} RP؋M< ; LU MLUEPEPQ`YEPEPuPYuu  uu}EuuujPESPuujPu uK(u ]M}u/uPuujPu uEE Eƅ}]uuW=VWuME}Euuu袿P}S5Puuj?Pu u(u }Z}u=uPuujP PujPu u:EE Eƅ~]WuhIuWLELUM5P MU} tށ< e[^_ÐUWVSu}ujCURURuVPu u]]M e[^_ÐU@WVSEPEPEPu} uE3]ؐEPEPEPuu+uEPEPuu u#$juuEURURPkV}u EPSu}uEPSu- +EPSuEPSuuuUEԃ EPEPVu(}~EȅtM9M~MȉM} E@Pƺe[^_ÐU WVSu苟u ]SujE SV~.SjEuu6ESujŐ uu u5E VuWSu uk} t)EPEPuuSujM؃뺐ƍe[^_ÐUVSu] ujPSVe[^ÐUWVS}u= uuVIjPIDuuEEPEPEPuuu\ uuE}ScS tىMLEEURPuujEPu uCEE E ~ E$EuVHuPjm5E܃uRtuNPREtEEPEPEPuSUPLEu)Puuj3E$uu uou5RtMMىMu}} u MMELUuuo}DuPuujEuu uEE %EMM]E}u t/uuu u ttu ىtt}uuE@P3E܃ _EEMMM}tMMtuPtEÅ~EuEE1M؉M̋MȉMXEÅ|EEuuuuuu uNuPj3E܃(}uuuuuu uuPjV`uuuuuu uuPjV8M؉M̋MȉMMMMxuEuEuuujEuuuj|(uuuPu|xu PuPSu uNuu\WSuujEuu u[(SuujEuu u7؋Eƃ~(uEÅnEƅ0WuDEuWDEÃDEÅ~}̋MMMM}MxM|uueWuu ulEƃmWuu uNWu#DEuWD] uEPVuuu uuujPj0E܃0 }`}uuuCuPjD0E܃MԉM؋MMMMMMt]MM} uNE܋E܍h[^_ÐUS] Su3,SURURPMuu9Pu]U WVSU] t u EPEPEPR EPEPEPS MM}EPuWuuuuu u$}}4Vuu / } tEPEPWu4E>Suu.؃ } tEPEPuu E}t}Y}uSSuu.؃ } }萐WEPEPuSuuS.؃} uNVuu4. } t1}WEPEPuKVuu.} uV;S3؋M 1M$e[^_ÐUWVS} EPEPuK uuVuu u؃u]Vuu uu؋UDž~uu;tuu@e[^_ÐUWVS]uEPEPSKKEPEPV=Kuu }ƾuuի}ƾ}uumEuu_Euu茫E}|u~uuu uuuڤSuu uЃt …} ] ]uuϫE}}n~uuu uuueSuu ulЃt …} ] ]uu[E}uu莪}#uumuu>uu>M M$M(1e[^_ÐUWVS}] SWjURURURPSWK$u~QEPEPEPuuWuْ~VuS(>Pw*MMMMC룐VuS=PM*Vщe[^_ÐUWVS}u UU t~VV~oEPEPuGEPEPEPuVWa$u~Su)؃u~Su)؃u} uVڑ~ SV)؃} t'}uWVuSu])؃} uߋÍe[^_ÐUWVS] jjj艘PjjjzPAWj׸Wj jSj&PjK uWSujDE ESujqEPEPEPVjǒPVj胤$u̐~WSujEu詐V*UMMUe[^_ÐUWVSu} ]uPSVjPWVe[^_ÐU WVS} U3UEPEPEPRZuWu؃} t,EPEPEPu,uWu|;tFˋƍe[^_ÐUWVSu}uj0wj(,EPEPSE ;t j+,Wu}~ u }~j^,uP uj)q,e[^_ÐUWVS} U U t*uVEPuSuW}؃} uۋÍe[^_ÐUUu j+ÐEPEPRDj(+u臭j,+u u' j)+ÐUWVS]} ]EPEPEPS蠽}tuuj9MEPEPEPulE+EPuMlPVUU VuSuP%؃} uS4؋UUe[^_Uu E@P谏ÐUS]u SEEPEPuCSXE]UEPEPuu uEÐU WVSu }u 3quPuuPLEPEPVJCuu軤؃uuuEPEPS }t%uu*EVuMM}tSuP譧PuEuuEEPEPWBuu֜uLPv S# uSQjjuEVuЋEƒ|}uuu EuUuuO7^MM9e[^_ÐUVSu] ujujVPSVe[^ÐUu uj舅ÐUWVS}EPEPuAuu՛؃uWu uuuu SWu ug;uSuuS6e[^_ÐU,WVSUUUjE܃} P؋M<  LU MLUEPEPQ@EPEPu@uuu duu_}Euuu֧P豦Suu udu]:}uuuu u=EEEƅ}]uuW͠zWu15E}Euuu2P Suu uu}C}u)uujPu uEEEƅ~]Wu quW4ELUM5P MU} tށ< e[^_ÐUWVSEPEPu>uuu uE33ۋUUuu3EEPEPu耷Cuu` u t} uuu襘Suu uXu]"E} ]f]uY3uuO3EMMEPEPuضGuLJuuu u͋MU U :e[^_UjujݯÐUWVSu ]jj2EEEu}t/W؍EPEPSuuS3EEu@}t.WzPT؍EPEPSuuRSE }u}t&jPu"EjWfUMM9e[^_ÐUVSu]EPEPSu VuSuVXEe[^ÐU(WVSuVR؃u NVƅEu+;}jj{1P0E܃ E EPEPuu uaEPEPjPjuu u0} t5EPEPu謴uuEVPG} uV|uu0E؍EPEPjfPjSuud$} t3EPEPu,uumEWP} uVuPWMMU e[^_UWVS]SʄSR؋} }S贄 ;}uu0PP/E E SoPURURPuu}uE}uuu/P.Pu}jIPuu譡P舠EjSmSUuVEPuuSuuVEPuuWuuuuPuyMM} e[^_U WVSU] t u uEPEPRz EPEPSg MM}EPuWuuuuu u5$}}0Vu} t EPWu0E6Su؃} tEPuuֱ E}t}e}uKSuZ؃} twMM}uWu脱Su+؃} uFVu} t,MM}uWuuu莑Suu uЃt …} ] ]uu胘E}}n~uuu uuuSuu uЃt …} ] ]uuE}uuB}#uu!uu~+uuq+M M$M(1e[^_ÐUVSu] ujujzzPSV>e[^ÐUu jujUjujÐUWVS}U3UEPEPEPR貮EPEPuu W$} t|u[jPL4jj0PyEEPEPuj uELEEjSjjjPقPyEEPEPuj_ jj&Puj܄Ejuj腁 PujPj蟧EPWEEPEPuPEPEPu\1uXuN SW«VW蹫Su uVu u؃(uMU MU e[^_ÐU8WVSu Euzuzu?u&L}<}W肷ءLuMM܋]iu}}܋VEPEPVf0uu+Eԋ]EPEPSG0 uu EuẼ uSOURURP0uufPuuZP-%؃$E3MMEPEPu谨FSu&u}tE}}܉u؁} uwuu͉SuNEԃ}]]Uuu蟉Su EЃ}]]Uuug$؃}܋M 9}؋M$9M(e[^_ÐUWVS3uxu xu7ujjPW#uu C#Euu'#E3ju j[~E jjjYPjjVGPvP"Pjuj苐$uPj}EujyURURURPuj葋,uw~~ +uw\EPEPEPujuvEMM}e[^_ÐU WVS}t}u3jj"UM MMMujuj.}PSj蕱URURURPjFE EPEPuUPLEuPE} uuu EPEPu褥WutSu9؃} uSmEP< u u]VuHPu?PE ~uu}EPuueE8MM9e[^_ÐU WVSu }]jjj|PjjS|PsP\ PjVj؃$SjSj­jWj~{RjЃ$Rj蟭ЃEPEPEPRSuuE,P賧e[^_ÐU WVS}u E}}uE} M MMMjujzjj9 Pjjj- Pj $PSjjujzPSj$URURURPj~E EPEPutUPLEuP E} uuu; EPEPu Wu tSu ؃} uS-kEP< u uEVuĄPu 軄P薊E ~uuEPuuE8MM9e[^_ÐUnexpected characterAREADUWVSH +u !-u Vt;3ې3330\FЁ! VXuM Vhh訚Íe[^_ÐU8WVS}}E E ]EPSu臡SEPuz} t)SEPu_uud'E} uuu Euj Ẽ} uuRiEuGiẼ MM}Љ}MMȐE EPuu֠EPEPuƠ}̉}EPEPu訠uȍEPu虠EE9EuuS2 E؃C} uuhEVu } `VhEPEPV } tK3ۋMЉM}̉}䐍EPEPuEPEPuE]} uE uԋ]ܾEPEPu踟 t#L94uPuuEȃF uMЉM} t#]܋L94uEE uaESu StSt juMwI ؃+t -3VPXt w jt-u PuuPcE Sktr+uPƨE9uH;uNWj C;~؃^uWPuF9uz9]|WjC9]}uWE؃+t-u P)uuPEShh蔁Ee[^_Ð - )U WVSE }tuPLxEjvsjmsEj(| EPEPEPuhuv؃}uYEWu u)Vu uj &uw|Vu tjh[j Wu u)Vu u~ j+ucwWuW tj+j-u:EUU2ۃEPEPuLEPEPu<}~j Ru}~j^:uF} uu*Wu uVu t j1} shѠe[^_ÐUEu3Ð}PXÐU(WVSU]tu Eg}uSRu ENEPEPRFEPEPS8uEuEEMIM3 M9M ;Sj؃F;~MMEPEPuȅ3 9u|TEPEPu謅 }uuuu I uuu uSP%؃F9u}U tML<uPJ t,<t tSRuSu uE܃G9}E܍e[^_ÐUWVSu]Pu EMIML 9 |EPEPV貄EPEPSEPEPS薄EPEPV舄 E+E;-}WEPu_Su؃FE+E;~ڐEPEPu4EPEPu$}uEE} uuu uЃSR؃} uSL؃ t.LЃ<uPM t<t u3 SuC؋Íe[^_ÐU(WVSMLE܅u 3\PURUR4Kuu4 E} EPEPW&EPEPuuuu E؋uu$EPEPuuuu EMLUPuu EUJU$} tڋ}ELu4EPU} u}S} tF5Lu؋ PUJUEu؃<tڋ}uuEE} } u̅|L9]#Ǎe[^_ÐUUu3ÐEPEPjRbEPEPju b uu}u}u@ÐU+EÐUSU] uHu=EPEPjRaEPEPjSa uu}}~@]ÐU WVS]u EEEEÙƋ+EU+ЉUMME+EPGE;|5+ߋE+EP-;|ދUUEEUUEE됋EUEUEUEUe[^_U WVSu] tu S>QE~ ]]}|d} tLE9} E3PEUEPEPR ~uWsEVuKyVGPuiƍe[^_ÐNo more memoryDPGENUWVSU PEuu hhGx uEEU UUUU9] |UC9] }3E;EڋE;}uVu 0S6uÅ}C++Ӌڅ}CC9u U9] }uuubQ }] U<u VWKu}u L}u Vjuƍe[^_ÐUWVSM] =+ȉMÙ=+؉]]]}Eu~ 3ɋǙ=+Mˡ9tMށ~ q q ˋU2Ee[^_ÐU WVS] }uEPEPuS!]UU}ډU}ۋu}}95ȕ~EPEPVSuRDVN=+eӋ EEPEPVSu%U}}}]]}}]MU MU e[^_ÐUVSN3ہ~FÙ=)Й=ȋуuڋe[^ÐUEPEP55U}~EUUWVS}u33Z+PeGWЍB}BuVEPSWp[9]}]yC␐M Me[^_ÐUSE UUE3ہ} t?EPEPuzEPEPuzU9U} U9U~Ë]US]5\ u:9|;`| t t C9}55` ]ÐUSEU 3;u f=~]~UEU;EPEPuyEPEPuyuu tM9Mt} t } uË]ÐUEЅ}@$+Ћ…}3Ð+ȋÐUS]M ;B;~]ÐUVSE3=~5E} t)uVEPu'yu\} uۋÍe[^ÐU uUULUVS] uEPEPuxULM e[^ÐU WVS] u}EPEPEPuxULM Me[^_ÐUWVSu }]SEPuExSEPu8xSEPu+xLUMUUMMe[^_ÐUuXLÐUu] ÐU WVSj u%؉]}KME$+ЉUUyUE$M+ȉMEy$U+Ћƒu}a}u}uKDÅ}Ctt+ttuVE+PV=EuEju'عUuEjK؃ESj`؃SuuWjE}uujuعUt}u$E+EPEHPzؾESjؾ 9EuuSuuWE}j j jEjj0j@sEEPEPuu 9E}VuuSuVSSuuW[E}uu$EPEPuBu 9u}U :UMe[^_ÐU WVSu}FE 3;#SSuEuuEC;~ݿ UUޅ|VEPEPutu uuuP t%WSKSu(;t WP2KyǍe[^_U(WVSEEEEzErEjEbEZERKD=PSVWuuuuuuuuu4EPj_e[^_ÐUÐIllegal GCA handle!GCA2PTRUS]9d}9hhhbllD ]ÐUS]9d}M9h~El| t t lD D t t]ÐUM lED ÐOut of memory.GCAMALLOCUWVS}=t u>5tl  t PlD uhhhwIkl|M Lƍe[^_ÐU5؆u؆ The --th garbage collection....Alignment errorGCSI (marking stack) ** cells, arrays in milliseconds. Too few cells reclaimed.GCSI (final check)No arrays reclaimed.U WVS}=܆u#h$m̆@PIh*W wE؆ tP4؉ށ u؆ tIL0V茻u Vt t VPہ ux+E tu 5xhFhVviE 9xrߋx9] t73Vu V蓺t t VJ9] űpE t&P<؉E utE t,l<E up 3 ~? PL<~ppG ؉ t 3ۋ5h/l<~VClN95d|P+u5̆І+EІԆ+EԆ=܆t=;=hkԈWhpĈShy贈Vh褈5ƙ=;5VWhhEgu55Whh"ge[^_ÐNo more memoryGDPGENUWVS]U R(Euu hh+f S/]}}EE$+ЉU+ډ]E DE9] |UC9] }EEE;ΉM}AEU+‰Eu E}u UBU +EEE+ȋ+]yC+MU+ރ~}uEW}u E E}uE'E u] ~E<u WV KuǍe[^_ÐOut of memory.GETARRAYUSUPP؃uhh dË]ÐUWVS]5pָ;} P t(@;| tP<=p ?벐ƍe[^_ÐUnexpected characterGREADUWVS؃+u t-u fؿSt*3tCSuShhcƍe[^_ÐUXWVSU}j- 3ۋƿ CEe+utuݐD0PKue[^_ÐUS]S|S/]ÐUVSuE] +؍H ;} ÙQSV Pe[^UWVS}E +RP%Ⱥ3ۃA;qSWR|Ѓ C;~e[^_UWVSU 3ۍB;#JUSuV:VW虸C9]}Ǎe[^_UVSEU ='+Pk~= RP3EUEPEPu,iEPEPuiu~u ~à tOE+Et P}} t} u} u%} t&} uu uƍe[^ÐUWVS} EPEP5uH}u M M0PgЋ +MEHƒ}ڃ}uCR9]|+P}gЃ}VRC9]}؋ƍe[^_ÐU WVSu] }EPEPEPSV;}u33uSP,uVzMMU MU UM e[^_ÐUWVSU] ™@`PdPhPlPjdpPR~~dDd؉DTT}T3TuFѽTTttuDž@ +ΉLHHhKx?l << @<#HL@KyT|P33ۋhH;\l<PWP4WXQTl4lD+Ɖ}9U~"#M EDÍe[^_UWVSut} uE3;}+5L PM M t(@;|L<Ee[^_ÐU WVSE3=E3CEۍ}WEPukM } t}t} u̓}}]}t*}WEPjua-}tC}u܋U ދUe[^_UWVSE} }u3EEK=)}؋MEы}EÐE3ۋMM=L}PM}E~E}C4}u9]ȍKM}u< 9]~_LP } C4 9]4 tp9]~'LP ً} C4 tI9] t#ً3 SACLIB Options: +h : print this usage information. +N : NU <- . default = +Np : NUp <- . default = +G : GCM <- . default = +R : RHO <- . default = +P : NPRIME <- . default = +S : NSMPRM <- . default = +T : NPTR1 <- . default = US]h<RSRhFRhYRhkRh}R5ZhhR 5BhPR5܆-h ;R5h0&R5hWR 5h~Q5hQ]ÐUS U t PڋЁ uË]ÐUU ƒÐLÐUSE3=~+СL؃<uP <tLЅ}ڋ©u At]ÐUVSu] SV`| SV/e[^ÐUWVSu} ]uVDSPWVFe[^_U WVSu }}u#V}+EPWuV謊 Psg u} tCEPEPEPuo6uWuuEHP$tSuP؃ 뷐 u3S>؋Íe[^_ÐUWVSuE ]}u3.u WPV'SjPVWPVSjPVl e[^_U WVS}E uu3gu VPU E} tu؃u uSuVWjVu@uSuPu@e[^_USU uEPUEPEPR3]K } tVUPEEPEPuz3EPEPEPuuS$uSj-t} uuS8EE]ÐU$WVS}OU E u 3ۍEPEPEPRSuW? E }tkSWuGP1 Euuu EuW$URURURPuW?uuS3EOU܃[~t+eMMue[^_ÐUWVSE 3t+9]|VuV C9]}Ǎe[^_ÐU VS]uEPEPEPu uWUUe[^ÐUWVSMEUuRPuu u{u E Eu E UIM } uEEPEPEPu"} u#EEPEPEPu@1]L E;~EPEPEPS1EL;} EPEPEPu0E(EPEP]Su0EPEPSu0 }uuuuu uҼuuuuu uVuP8 } }  u3 VRƍe[^_ÐUVSu M M tbEPEPu/uVVEEPEPu/UPLS4O؃} uɁ} uSVq|e[^ÐU WVSUE utk;uPV3^Ez EPEPEPu\/VuWtSuP؃ } uS=؁ u3ۋÍe[^_ÐUWVSE UuRu'u}uRPvEU ]KLM<}EE9E~+EPEPEPQ.VuuI}9}}EuuWz$VuW[>E܃ }uuuuW1uuuuW(PVuW?uVuW uVWURURPuuuuuuW4uuWVuuW螛EuuW(VuuW}]]MM]܉]MMЉE]]M܉MM], M]0 e[^_UWVS} U UWU} tiEPEPue EPEPEPuWP2 uu:uSut؃u~Vut됐SBV:UU2e[^_ÐUVSu UU t0EPEPu Vu`SPXt؃} uS؍e[^ÐUPuujPB Puu ]܋U؉U܋u+ډ]UUE~UUGEe[^_ÐU WVSu }WEu 3VWEWuPjyE9}otkV;uGVIV}uVu S+EPyPuu(PVu\uVu O9}~ƍe[^_ÐUWVSE] u SS؃uWxcHESSPuS؃t/SSvPuPV&S؃uVW6ee[^_ÐUUM Eu PQMÐPQRÐUWVSu ]S7ESES1E MIM MMV+]VЃ}uuEPuR6uEPuRui}uEWSuduSwVSuu)$PVu c u3 WM9M1e[^_ÐUWVS]EPEPuDEPEPuju~ u39Eu =u{EPEPu 3ۃ 9]|Gu~9E~1u <uuu W]t VPSc C9]} u3ƍe[^_ÐUWVS} uujSPj"E EPEPu4EPEPu@VWu^E$} t6EPEPuuuEvESPb؃} ú} uS؍e[^_UWVS} u W'E= MM쐐EPuuyUPLSWOOuSSuEAuEPEPuW8uuIuEEuPuW6EVua} eV#ƍe[^_ÐU WVS] ujEuSEPEPSuuNuurN}}EEPuTNSVSWVuE SuEPutuutS؃LÍe[^_ÐU WVSEPEPu ~jj2tEuuLEujEuPMEuuMuW, PEEE~jjjjsEWuPuPE}RuuuSxSu Lu]] SuL9uu]듉]Euu=sUMUMMe[^_Unexpected characterIPREADU WVSa؃(t ^9E EsS;puSeu(uRSpt ESetV9E(EPEPR`؃+t - JsVou V=et1Vot E8E-uuE(u&EPEP-uuu(ErS1ot>T`؃^t \#rSdtHR3WSu] `؃ )t j\MAMWShYhYMU U :e[^_ÐPrime list exhaustedIPRESUWVSu u8uu+u aEuVEPVp uSb؋EEPEPSEPVEjPeE$TUEUJU} EPEPuu uuĜV9Euuuu覜S9EuSVuu5WuN{Puq{ SuuPuWEuW1 uW迉}$LWuuu uh[h[ Ee[^_ÐUVS]Su SjhEujE u~DujEEPEPVjuju uuuv[E 뮐 uQSPVu؃} t7EPEPEPukuujuVjEE(멐Íe[^ÐUVSuV.SVÍe[^UWVS}Wu ug tPVL P<4W uWuFuP4V輹ƍe[^_U WVSu[u EPEPu\xuuEPEPW) }u3WuoLuu= uTVS$V*= u@P< uSVODS= uVS&$P(P,P0PhPSڞPPP PhPV謞,8,qX|9,|V ,0V,0 f~H@P~j Nd@GP;d+H@R~ |< @PVR9,|# V ,0! V,0 X9(ujjVj؃ ~E,~0|~ p|Vg| \|Í[^_ÐUEe[^_ÐUWVS}u uuV`jP_xu jEEPEPEPuuj ugu]Eĉ}Si tىMLEEURu9EPvEE E ~ E#EuV@_uPjKE܃u'itu讳PiEtEEPEPEPuUPLEuuV8Euuh tMMىMu}} u MMELUuu}4uu7EuBEE %EMM]E}u |)uu6||u ى||}uuE@PTJE܃ EEMM}tMMtugtEÅ~EuEE1M؉MЋM̉MEÅ|EESvuuuuuPuPjIE܃ "uuuuuuuPjVuuuuuuPjVM؉MЋM̉MȋMMMMuu -6Euu 6EuuuPuuu_Pu PSYuu6Vu5EuVu 5EuEà ~ uEDžEÅ/Vu[EuV[EǃEDž~uЋMMMM uȋMMMMuuiVu3؋EÃ_Vu3Vu3[EuV'[]>uEPVuu9uujPjHE܃( ut}uuuZuPj\GE܃MԉM؋MMMMMM|]MM} ufE܋E܍p[^_ÐU WVSU] t u mEPEPR EPEPS MM}EPuWuuu u}}.VuAF} t EPWu.E6SuF؃} tEPuuF E}t}m}uKSuE؃} twMM}uWuSuE؃} uFVuE} t,MM}uWuVuSE} uVˤSä؋M1Me[^_ÐUWVS}EPEPupc uu覽Vu'1؃u]Vu 1u؋UDž~uu;tuuJXe[^_ÐUWVS]uEPEPSbEPEPVbuu }ƾuuq}ƾeuu EuuEuu(E}|i~uu0uu|Su/Ѓt …} ] ]uuwE}}b~uu /uuSu /Ѓt …} ] ]uuE}uuB}#uu!uu~VuuqVMMM 1e[^_ÐUWVSu] uE33SVESVǢE~uVܥVW u]H EPEPEPuVuWSuPdB؃(} uS蜡؋UMM1Ue[^_UWVS}] SWURURURPSW蹽 u~QEPEPEPuuW艽uթ~VuS$UPsAMMMMC룐VuSTPIAV͠e[^_ÐUWVS}u UU t~VR~oEPEPuCEPEPEPuVWѼ$u~Su@؃u~Su@؃u} uV֨~ SV@؃} t'}uWVuSuY@؃} uߋÍe[^_ÐUWVS}u WPW-E u蚟EuEPEPuDVEPuS^uW袺E } t3EPVuuu\SESP?؃} uЁ} uÍe[^_ÐUWVS}EPEPu ]uW+u*uuRyuuRkSSR_EPEPEPuuuujqtuu諷SW.+tƅ}]믐]말e[^_Uu u螭P` ÐUWVSEU }uEuWRj&EpEPEPEPR} t_EPEPEPuWuVE CE+E;~uuV EMM } u9]|WuVE C9]}Ee[^_ÐU,WVS} UUWRWQEWuEE+؉]UJUEuWu؃ uuEuZuSuG؃SxE؃}~EW6EuuuQE}~"EHPuu5Puu詫E}u5uuu PuujP PSui uVE 2V>URURjPv}uVMIMPQu؃ tuSEV SjuEWң+]pW茪Ѓ}~EPEPuRuQEPEPuRK }(Su腪Sju,Puu SuuESSuPVu$VWuA EPEPEPVWeuubruPeL؃$VSWPWٲUUe[^_ÐUWVSUE u}to;uWPVaJUE EPEPEPuWVuu tSuPj8؃ } uS袗؁ u3ۋÍe[^_UWVSMU Eu H=uPR+UE qLM<}EE9E~EPEPEPQSuu#}9}}(EPEPEPuSuu7؃cEPEPEPuEPEPEPu uuuVuuV tSuP/7؃ } t}  } u}} uUS>СP}< u3ҋe[^_ÐU VSUE u P0cU3ۅtOErEPEPEPuu ub uVPSq؃} uÍe[^ÐUWVS}EjW衡K8؃+u-u 4u VWEPEPu W}t:uVW7N4 SA<uSFu(tM1MU e[^_ÐU(WVS]utu Egu @4EEPEPu]u葔EE},S4EV3EuN} PEȋEPEPEPQ}܉}  P lEPEPEPuuuuzuuuVtSPEEPl4؃ } tPE LE+E9| tSuuE؃ } tPML}9<E؍e[^_ÐUWVSuE ]}u3.u WPVSjPVWPVrSjPV|e[^_UVSuE ]u3-u PV(SjPVʚPVSjPV1e[^ÐU VSuE tbu P[/_ E} t;EPEPEPuOuFPtSuP2؃ 뿐 u3S&؋Íe[^ÐUVSu] EPEPuuSV؃NtLtH] EPEPEPuuuVSuPf2؃(} uS螑؋Íe[^ÐU WVS}E utbu VPR-^ E} t;EPEPEPu7VuGPtSuP1؃ 뾐 u3S؋Íe[^_ÐUWVSU t}u EPEPEPRujD} u EULE)jW謠WuuPSu FE+E;~Ё} t3EPEPEPu3ujUDPWu$iǍe[^_ÐUWVSUEtu rP/E u s/EEPEPuuďE} ttPEȋWEPEPEPQuEuuV` tSPu0؃ } tPML}9<| u3ۋÍe[^_ÐUuŢP+PY/ÐUWVS}3u WEEߋPEE= t6Vl+ÃSVQURURP6E}CSuoE EPEPuV+uuG~uuFjPUE}uu EEM} M}e[^_ÐU$WVS]} u }u]H@~ jj P,EUzSEWES,E] W,=p u;5pu]M9M}E]} t Lu4uܡPM M E tLP<3UU~EELuP up ;pP}G}  .E]} t LM MܡPu4u E tLP<3UU EELMP u p ':pPu}D} t /} u}pPuM4(E]LM MܡPu4u<tULMP u p q9pPu} t u} u }MM}u%} uu5pEo}t} tkuq9Et[]LM MܡPu4u  u p 8pPM}tu܉upPM EE}}I=LPU~E EtE= uB=LPUy EEtE= ú} uPu PuM4PM< u L MEe[^_ÐU}%ÐUMU tt~ RP(LÐPQiÐUWVSU} uuEEPEPEPR辫9]|cWuOE} tDMLE+9u1EPEPEPQsPu?Pu"E C9]}Ee[^_ÐUS]U u3uWj33uPWjV؃(EPEPuSuW9cEPEPuuuuSuW'P tfLE}; ʡPڡPˋ t+LE9EPʋ릋ˡP͐ u P Pƍe[^_ÐU VSE= u E qEu]VSuj } u } u]} t9EPEPu9 } tSPM ]Ee[^ÐUHWVS]S ESEuu ӨPEԃu EȋLE܋E3ۃ}uuCWuu藋 }tS4E؃9]%EE}uullEСLMЋEu܉uM؉ME@;uu9}|EPEPu MȋučDEMM3ۍuuCuuuي }t9]Gu3LEUEPEPSuRLEM PEE=LMuЉ E@PWuESGPuE؃9]|E GE@;߅}CPu4kEWEPuSukE} t:WEPuEPEPuۉuuuEE$} uơLMuЉ K{E̋u9u59]|u33EPEPjR uSVPPV^(}uSPVMe[^ÐUVSuVu SǼ } SVU؋Íe[^ÐU S]U EPEPEPRSEPEPRS(ub} uSEE]ÐUUE ;ÐUE u3ÐPu ÐUWVS}L4}S苎ءLP4 uƋǍe[^_UWVSEUuRu uqu}uRPu EU ]KL}} MEE9E~,EPEPEPuqVuu}9}}DEPEPEPupuuu uu S VuaEPEPEPupEPEPEPu|p uuuu uuu StVuP } t} } u0} u #} uuu u؃ ]V7Ё u P u3ҋe[^_U WVSE} ]u3huS边}USWLJ] pEPEPEPu`ouWVSuP؃(} uSH7؋Íe[^_U WVSU} Etwu PWWwE rEPEPEPunuuW$uWV tSuPy؃ } u u3 S6؋Íe[^_ÐUVS]u uuuS]PVS6e[^ÐU WVS]u$Vu Su uURURuPSu u1 0VuSu uEuuSu uu(Puu u}(}M,9e[^_ÐU WVS}Etu3iE uNEPEPEPumuuWu  uWu VSuP&؃ } uS^5؋Íe[^_ÐUWVS}u ]u3SWDPVSPVWAe[^_ÐU WVSU} Eu3wu PWfE rEPEPEPuluuWuWV SuPQ؃ } uS4؋Íe[^_ÐUVS]u uuSkPVS!e[^ÐUWVS]EPEPuEPEPuju u9Eu >u{EPEPuk 3ۃ 9]|Gu9E~1u uuu W]t VPSV C9]} u3ƍe[^_ÐUuuu ~PίUWVSM} UEuMEuPRW2UE IM䐋LM4uEE9E~EPEPEPQjSuu#u9u}(EPEPEPujSuul؃jEPEPEPujEPEPEPuxj }uuuW uuWutSuP؃ } t} } uuu uUS2СPu4 u3ҋe[^_ÐUVS]u uSHPVSPe[^ÐUS]S$P藫PS]ÐUVS]uu ESVTS蘳|ƍe[^ÐUWVS] uV:EV@VDEE ]Wuttu9+u|]u@WPu~uVSESV؃$uCSuujOPVujE$}u} u E u0EUMUMe[^_ÐU WVS}W&9u 9u9P+CS Wuuj$URMQu PuWuV؃ uuVPSjuPujU UM$e[^_ÐU4WVSM MEPU< u%LEPuuEMME]ESEPu8g UL<u#} u֋UL<u ETEPEPufuuuEu3uuu`EЃuu EPEPufVuuDESP6؃ } uS.EE 3uGEPVuRf 9}tVEPu=f MM܃ EPEPufVEPufuuuPuuIE؃0SP؃} uuSEԃ} ^MԉM%EЍe[^_ÐU@WVS} }E E EL4ẼE؉EE = tE]EPSuGeSEPu:e}uuE؃} u E+E;}+}Љ}VjC9]}VjUԉU t8EPEPudVuuj薅EVPL$} uuV5Euj(Eԃ0uuEuuGEċ}+}UU t?u=LE4uE=LUP<} uā} ]EPSucSEPucuusE؃ }tmUU t_EP}Wucuuu>ELU M}ʉM=LE P<}} u} UU9U} EE܍e[^_ÐElements of finite field exhaustedMMPDMAUWVSPM< uLU_}uuu EDMM uEPVub VEPusbjuuz3SP؃ } uWS} uEPEPWz 3MIMjjj9 9u uuVuh,hOZVjuu uPu u؃ VWu jPu SuuPVWu M E4Vu 2PjjjzEPWu jF(Wk29EWEe[^_U WVSUU }EPWu7a WEPuauuuu u SP؃} uS))VS } uV )e[^_ÐU WVSu]S1ES;EE tfW1+u|QW@8uVS\ESVW^;Suuu u0PVu uu} u EuL(EUMM 9e[^_UWVSEUuRu uuEU ]KL}} MEE9E~,EPEPEPu_Vuud}9}}DEPEPEPux_uuu uu S VuaEPEPEPu4_EPEPEPu _ uuuu 3 uuu StVuP } t} } u0} u #} uuu uU؃ ]V&Ё u P u3ҋe[^_UWVSMu3EPEPQ ^3ۋ}O UU쐐uEPu] uE} uSu W{؃} tuEPu] E-uSuu 8؃ Suu W؃FE+E;~ˋUU} TÍe[^_ÐUWVSUEu}tj;uWPu VdJUE EPEPEPu ]WVuu u$tSuP؃ } u u3 S$؋Íe[^_ÐUWVS}Muujj35u3,׻A;IMWRu uЃC9]}e[^_ÐElements of Z_p exhaustedMPGCDCUTWVS}uU}uE33}u6uus3Euu u E3uuj2}u6uu73Euu uF E3uuj2Y}u:uuu Euuu juuu jEPEPuu ubEPEPuu uL(uuu KE MIMuQy2uul2PSu EuuI,Euu;,Ejuu+juu+؃(u+SWu PU4L@PEG9} uuuu uh h&SWuu jE}tWjuu uVu+Pu$tWjuu uSuS+Pu$fEPEPEPSVu uuuSuEPuuVEEuNE ;uj޻E܃C;~} MM؍EPEPuSuuI2Pu j uPu j=؍EPEPuSuu (Vuj)EVSj)Vuj)E$Vuj)EURURuuuPuSuuu uuuu uPuu u$ PjPSu uuV>E]܋U؉U܋UU+]܉]}u}~UUEEe[^_ÐUWVS} EUCu 8EU uNu䐐LM4uEE9E~EPEPEPQ FSuu#u9u}(EPEPEPuESuu蠮؃hEPEPEPuEEPEPEPuE }uUU™uuWu ЃtSuR6؃ } t} } uuu uUSB СPu4 u3ҋe[^_ÐUEu3ÐjPu uFUWVS} uu33VWuSVWuUUUe[^_ÐU WVSU} EMMrؐEPEPEPuxDuSuW؃ SuWV؃} t S uÍe[^_U WVSUuEtntjuPVu jEazE EPEPEPuCuVu W tSuP肬؃ } u u3S ؋Íe[^_ÐUEPEPuu uEÐU WVSE}u3iEuN EPEPEPu4CuWuu jV Wuu VSuPƫ؃ } uS ؋Íe[^_ÐUWVSU 9]| 9]}}CLERjEjjǾVEjjj}u+ WWuj謻LM9 |uWu蚾 }C;|3WuujpLM9 |uWu^ +uuWjoPrEMVWujLM9 |uVu uVjPECEH;~u EEe[^_U$WVS] SuEPULE Ejj[EWEuuujWPu&ءL<~#SuVPjSWuj ELEUU9E}uuuEujEEPEPuR@ujECE+EH;~u`E UUEPEPu@uSuj`uP虨E$} uʋUJUML؃<uPM MM<tuuOEPj8E}~WuѻVP"Ve[^_ÐU VSuE t[ EEPEPEPuX?uuVЉUtEHESPR؃ } u u3 S؋Íe[^ÐUWVS]u }EPEPWVSu3(uWSjPuSj VPSjUMMMU e[^_ÐUWVSLM Mu uEPuVE}3ۃIL4;P4@;~Lj4uFСLP< CEH;~uu%E EPEPu=uE]KL<uPKEEE<tuSEPjEVP} ujVu u e[^_ÐU$WVS]u ĸES'E@P]Ejj=E EPEPu< EPEPu P\ tjP!VP PSe[^ÐU$WVS] EPEPu谣EPEPS袣u |Du |uuuuu } uuuu }Iuu |uuuuguX } uuuJuuuu=u, |uuuuu }uuuu脘E2uuuukPuuuuYPEUURuV]SusuuEuVSuX(uuj} tKuVSu/uuDPuE uVSuuuPWF Wue[^_UWVS] EPEPu贡SuSuS |VWWVe[^_ÐUEPEPuf }u }u31u~ up }ÐUS] EPEPuEPEPSuuFuu9PS ]ÐUS]S|SR]ÐUWVS}u EFEPEPWz }uuVu莹E uރ} u E3CEPEPu $ }uuSu8E uxۃt5} u-;+PuE+PuEËUMUMMe[^_ÐUUu E>EPEPRrEPEPuuRub ~ PugEEÐUSU] u SemuRV`EPEPREPEPSu,bu"b+؋Å}@ u uu*Puuu*P]ÐUUu ÐPLÐUS]u PS]ÐUWVSUuEEEPEPR: uka؃}uZEu j Wu)EURURuPQ juEu30uuu}jueE} j-襄EPEPWu%Qu襃j.肄9] |2j u莸EURURWPPE0PLC9] }υ~j+ }j--e[^_ÐUWVSEPEPuEPEPu/EPEPuu+u}+}$^;~Ju Ѓ|USu+PREEPuܫ}OFM 1M9e[^_ÐUUu E>EPEPRFEPEPuuOug_ } PucEEÐUEu3ÐjP4ÐUSEPEPuݛu_~ ]EuuPS]ÐUVSu] SVR|ދÍe[^ÐUVSu] SV.ދÍe[^ÐUUu3ÐEPEPRujuP|ÐUUu3ÐLÐUS]SOPj |jPPj]ÐU(SU] tu3EPEPR覚EPEPS蘚}uK}uuu6&j}u*EPEPEPuuuu&u{}u*EPEPEPuuuu%uKEPEPEPuuEPEPEPuuj(uu%uu%PS]ÐUS]u3u PS]UVS]STSTPȧjPLaPVMe[^ÐUVSvU}/u eU yu3 SVee[^ÐUWVSu} u3BWVSVȹSW迹W'\}VS؃SVe[^_ÐUUu3ÐL4[ÐUVSU] u 2u$EPEPRjEPEPS\}uO}u!uu`؃j}u"uu#uS_u}u"uu#uS_uEPEPEPuuIuur#Puuf#P}_؃$u3C}t+uStVSDVu9Euu#PS葌e[^ÐUUu jXqÐEPEPR&uF}}tj/~u.}UWVSu} ]uV<SPWVe[^_U$WVSE] uEEEu8LEPYEuԤEPLUxEPEPEPSgEPEPEPuWj$} tuu]EPEPEPu,uVSu EPSVuWuu#E}tuu`E} uMU MU MU e[^_ÐUWVSE UuRu,u}uRPvEU ]KLM<}EE9E~+EPEPEPQ-Vuuv}9}}؋Íe[^ÐU WVSE u3WE}O EPEPEPu]CSj uPW.$VSPo } uVƍe[^_ÐUVSuE u3!PVSVPzSPV؋Íe[^ÐU VSUE u3nuP^E rEPEPEPu$u u uVSuPn؃ } uS؋Íe[^ÐError RPPOWREAD: Digit was expected. Error RPPOWREAD: Exponent is too big. UWVS] Ejj! k؃^t {g#g}SgotH]3WSuhj؃ )t 6gMAMWShNhN|MU U :e[^_ÐU WVSUu Etu3\u PVK EzEPEPEPuXuVWSuPh؃(} uS@؋Íe[^_UWVSMU Eu H=uPRA+UE qLM<}EE9E~EPEPEPQSuu#}9}}(EPEPEPuSuu EEPEPuHuSVPJ} uV`ƍe[^_USE UUEEPEPuEPEPuuu0 SP{J؃} uS؋]UWVSu ]Su|ZSVsZURURURURURPWy,Vuuu*VuuuMMe[^_ÐUnexpected characterVLREADUS L(u>L)tDvHSPIK)u S,tPhoh%oË]UWVS}U U t-uVEPuuWNft C} u3ۋÍe[^_UVSUUj(sN} tPEPEPu/uC} t,u]j,5NVSuu} uj)Ne[^ÐUSE UUEEPEPuEPEPuuue SPCH؃} uS軧؋]USE UUEEPEPuPEPEPu@uuIm SPG؃} uSS؋]UWVS}u EM3ۅtqtmEM𐐐EPEPuEPEPuuuuVihÙڃ uuVW PSVWF؃ } uÍe[^_ÐUnexpected characterVREADUVS^IS"XuShqhq VSFH؃SWuSvMuV1fEƍe[^ÐUVSEE= t%u]VSuuK} ue[^ÐUS] EPEPSu0UR?uu&؃jbSU WVSu MU ܆MU MU MUPmE9}8+`@!?$sXttttttt ttttptttttttttttttttttttttttxpuPbEPHEP0E{PEfPERPE>PE*6j 6Ѣj U GC9]UM U܆M UM UM9MU e[^_USu3<t@:u~Ѓ]US=tЃ;u]ÐU=uÐUS]dKdS+]UWVS3kWZ >Ct~t WVVtPZ4G|h[^_ÐÐUEEEP0EPjjoo u+}u%jEPjUo @u}cj~pP`phcjEPjo jojOpP1pUWVS} 3GЃuWt9Wu?uDuWif;G EfGtsuxmEu3[^_Puw?n E|4EEU;uE[^_+ЉUEERPw n E}fO [^_ËGE]+؅Sjuu-Et+EH)GÉGW +Ћ};} Wf}t'fG@tWdu [^_Ë[^_]GE]+؅uWdP[^_ø[^_ÐUEގÐUWVS}E%ގuK%ގtGÃ+t-t%ގu[EG%ގtD؃0G؋Ёގu}t[^_Ë[^_k Ѓ03[^_UE Eu t fh huu3 f tÐUE Puha UEPu uG ÐU$EfEUUURjEEEPu EP UWVS}u EEEEEEؔԔEEEkExExǂǂǂǂ@Ex|Euuj%ViETEPHMU܃%uEEEEEEEEގt4E܋Ёގ}$uEEE MEE@EU܃4_-**# p+e210F3;9t7tx 6tq5tl!8teht [tcLt%lt%ElE}4YEE}?E},} E@EU܃]tuMEE܃Ex${~~}~~}}}}}}}}}}}}}}}}}}}}}@~}}}}}@~}~~~~~~}}}}}}}}}}}@~}}}}}fE}UE}B}tkEǀܒ:}tkEǀܒ$}tkEǀܒkEǀܒEkǂ9E}EkEU}Ekǂܒǂ9E}EkEU}}t!Ekǂܒǂ9E}NF}t!Ekǂܒǂ9E}'Ekǂܒǂ9E}EEkEUEEj%uPeEkU ЃЉUEP@EU}tpE}~VkExtxuEttEE@Etx9E}tEu3ҊFڅuEE؃}'ގtt=ԔuؔHyW!E%ގuGPWEގu ؔWu+pԔa%P@؃%}tIEގtkE ÃЉE3Fގu$u3F؃*u1j*u E3FEގu :EE%ގtkE ÃЉE3Fގu}uEÉ]lu3ҊFEhu$ Ehu3FE}Lu# E}Lu3FEt( Etk|PVuU%ߏ؃}tEhE/}tElE}tELEE%ގt&XtGt EtEl%ߏ؃nto=Ԕufcta[t\ؔHyWE%ގuGPWEގu ؔWu($[1c(itnt8suЋEHPEPWuuSu EF6EhuK}t!kEؔfǀ}uEPUؔf[luG}tkEؔǀ1}'EPUؔ}tkEؔǀ}EPUؔ}t(EHPuW|PuSu Et/"EPW|PuSur Et EEm=Ԕt}uE}2EEؔHyWE;uGPWE; ؔWu&tEE؃}'EtE؃}E}E}kExExot]ttAt8MTAEPT@ExEMXMX @ExE@Ext8t/M\QU\ @ExJE7tStJMdQUd`d B`@ExEt8t/MhAEh@ExEt7t.MlMl f@ExREBt5t,MpQUp @ExEExE9EE[^_ÐUWVS}EEEEEEEEE d|`x[$y]]]]]]}m]]]]]]d3[^_E'EEEEE ؔHyW؃+t4-t,0trGPW؃+t-t 0tPEEHEؔHyW؃0tGPW؃0q} ig}]ؔHyW@Ext>GPWExt%EXt ؔWP!EGtA?uujh$ܔP ܔ^_ÐUWVkE00tY6 tA?tujh&P ^_ÐUuḣ u9Mƀ̇/u ͇PÐUTh(u=tNh*u)t:h0EPjuEP EPEP}3øÐCCCPOSIX/usr/lib/locale/UxWVSE=6~&h"}t D[^_L[^_=}h"T[^_ËEu T[^_ËUNk ȁ??UΊMʉM]ډMԋM]̊E̋EÉUȋUЉUEMMEMˉM]֊]ۉ]ă~UEMEEăuɉMEEEE3E Ё?U?]EكFM?ًMMMU܋U#׉U#ljE#߉]E#ljE3t]o]AM%?E?UEEE*3t],]É]]UUUUEEt݉]]}]]Á c]NjU+׉UMȋ]MȉUUMȉ]܋]MȋEًыE؋EMM?UԋU#׉U#߉]MЋM#ωM#ljE]̋]]ۉEčCGPk  UUӉM]]ىEUUڋUM]]ىEEË]؋EU‹ỦMMщ]]EEӋ]UUڋMˋ]ًM] EË]EÉE]UڋM]]ˉEEMUUЉUEMM‰EU‰EEUЉUEȨ%E]؉]MẺEUEȨiE%?EU?M?]?UUM܋Mكk ]UӉEŰUЉM ]ċ]Ӌ]ȉEUUЉMMʋUыM]ˋ]EE؉UUЉMMڋU܉]]ӋE‹UЋEȉUMʋUMʉMU]ӋE܉UU‰MMȋE]ȋEEM]ˋ]ȉMEȉMEE3e?e?3} }]G |]NjeeE+}3ǁ~&h"}t D[^_L[^_iU‹U EM ڋUڋ}ut @EuuE[^_Vuu+ [^_GU}]EPu u8 ؋E~>E=~(h"]v (EEE=sh"EEEU4WVS}u [^_J u&juh{hxhpjEEEPEPEPjE EPEPjE ESD;tujEPjnE jEPj^E u[^_ËE[^_ÐD$Pt$Ð5\t$ t$  ÐL$;+WFÐL$)UWVS}\u3[^_Ëu3[^_ÃPWt[^_ÐUWV}E F8uG8=u^_ÊF8t?u ~=u^_3^_ËL$+)EÐUWV}fGt ^_Ãu W\<Gu'tfGDtEh ^_èDt,5`95dvf@@t P895dwGGfGt EW +ЉUuww HxGPW^_ÃtfO ^_GfGtfG^_ÐUPu u, ÐUu7uu u ÐUWVS}u3[^_ËE Pbu(x+EEatgrtSwt.%+EEat@rt,wt3[^_ÅtE;E-t"3tE  E hSu E}3[^_GtEfGE 8auG'E 8ru EEEfGE 8auujju < }3[^_GGG [^_ÐUW=`?t8f@t.9=dw7uh 3_Ë=`?uȃ?uj j_ÐUWVSd+`EjPeu3[^_Ëߋ5`95dv95dw`=t P=`Eãd[^_ÐUWEE EPE;tEPjW> _ÐUuI=WV|$ t$T$L$I|L:tAI|C:t8I|::t/I|1:t&I|(:tI|:tI|:t I| :t붋^_3^_ÐUWS]ESu8€t fSSPu  fC t5*h [_SPu  fC t [_Ë[_ÐL$+rÃNt@UE~> w9=uhr@EHȸ3U=uh2@E3ÐUE3Uu iuhËE HȸU 3ÐUu -uhËE HȸЋU!3ÐUu uhËE HȸUÐU$EEEEfEEEURPu ) UÐVt$T$ +9Ѓ#9urЃ#9uRЃ#uq9u6Ѓ#uU9uЃ#u9c*ut**but!*But*bw^ø^3^ÐVW3I|$ t$2OL$tMtGItAt>It8t5It/t,It&t#IttIttIt tItD$ _^ÐWV|$L$3ыϋt$+΋|$ ȃ3^_D$ÐL$+=ÐL$T$*=ÐT$R;T$Vt$ +#u|B#u_B#uBB#u%B#uBjBtbt Btb^D$ÐVT$t$ +#u|B#u_B#uBB#u%B#uBjBtbt Btb^D$ÐUW} }u_GЁufGfGtG9Gvu!oGW;?BWtPfGtOG fGE_ËGPWUPG fGE_W 2GUG fGE_ø_ÐZ"(rt3h␐UEʃ‰MUUEUЃ0ÐUVSu]{tB+C)CS=2Su jup+fC t [^ËC3[^u u66 E 3[^ÐU$WVS}uEEEEEDž<Dž\\DŽDŽ@\ |Dž`lhj%W6dL dP@dU%u h DžtDžXDžTDžPDžLEގt6kX EЉXdP@dUގuʃ}$udEDžxdDžxdHdU3e-0*# +1r0g.b2SW8H*6=524)-7"htHL 9ltDžxDžtxMxM@x@EDžL%ގt6kL EЉLdP@dUގuʃ}$t/E@tLPxP1LTdP@dU뵃xEEx$DeDeeeeeeeeeeeeeeeeLeeeeeeeeeeDDDeeeeeԲLeejeLeeL}}t/XDŽ*DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9``}t/XDŽ* DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`}`Džpdh}titt+XDŽ*DŽ* 9`}7)XDŽ* DŽ* 9`} X`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`8`-}titt+XDŽ*DŽ* 9`}7)XDŽ*DŽ* 9`} X`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`R`G}t/XDŽ*DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9``}titt+XDŽ*DŽ* 9`}7)XDŽ*DŽ* 9`} X`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`}`Džpdh}t/XDŽ*DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`}`dhj%hh-d}trDž\`~O\u Dž<\t Dž<\@\9`<tE}}Dž\`f\ʼn|8 3$Է߸̸{hR<&EU U U U U U U U U U uU U bU RM M $7U U $U U U U \@\9`lF8VUuUEtF EE}utE+F4)EFE9Es~t V%FDt%uEPj U+R) t V=#fF t [^_ËE[^_EEEEEGGE txk$RxxIBxxxx xx*777777777xxxxxxxxxxxExxxxxxxxxxxxxxxxxxxxxxxxxxȾEȾxxx xxuxxxOEDžpEE}y}tH(EEt8/EبtU U MtU U MtEE؉]EЃ%EЍ؃0o}tHE@u&E PU E@uS(ÉE((P(8t EHEy㋅(HEsDžpEE}t JDžpEE}u,EبtU U MtVME E U7ptH(EEt"H(EEtEEEXtpt EE}tEEt%HUEkBHUAEE E EE'}%GEt%u+É8EU 49Ms"URVPS3[^_PSR/% EE E EM,}tH(EEt8/EبtU U MtU U MtEE؉]E}}EE=t؉E4 Ѓ%EЍ؃06UtEE4 @!tEEE4 4uE@uJ4K0<48 Kk 4+ʉ40 Ћ4K0Eب@ U+ӋM+ʉ4 MM E MgE@uE}tG}uE}t2H((UEE%='E HE UME%=E uK}uEuE}Gu܈E߈E ؈EۈE EuEEEU ‰EEEE}GuE҈EËEEPEPE~Puub]uEE艅(Eu5S"89E~((||0u H(E|9E|(+ЉU}E(HE}'E@uE}t2H((UEE%='E HE UME%=E u-}u'uEE؈Eۈ EuEEEU ‰EEEEEËEPEPE<~<Puu ؃}t7E؋U;~+;0t&EEE(E[Eبt)EEEE(E+tEEEE(E(~)t#M}AMCMAMH(pE0@E(H(pEu}~E@EE<}(%Dž(<<~ME+(E܉Eċ(H(y LE@E~ ptU}BUCUBU뻋E0@EE@uE}t2HUEE%='E HE UME%=E uD}u>uEE}Eu܈E߈i؈EۈXEuEEEU ‰EEEE}EuE҈EËE؉]E4uEب@uDEE E,4#UMK%U4uԋEب@t"U+ӋM+ʉ4~MM E؋EبX}NUXtFotxt7EE$EE EEEEPEPE@~Puu ؃}tEEE;tbEEبtEEE;t= tEEE;tC4UBU}u"Dž40E0@E}uEtE@EE艅0~!tCUBU0H0pߋ0~ E܉EāM؍Eƅ]thEH0y؉00 0UЃ0BJU4Uй 0EЈPHEЋ 0묍E9}]t Dž,- Dž,+EЋ,PHEЋE%ގt Dž,E Dž,eEЋ,PHEЍ+ЉUUāM؀PU@0W}t,H(؍EYE E ؍E2EبDu E؋EЉ4}t Dž|GE%u Dž|EЁގuB}$u|t4HTE@t4E@4E2k4 ЃЉ4G뒋EE߃@EE؃߃EM}dEЁގtaЉXGE%ގtC%ގkX EЉXE䃽uۃ}$uX D d?E@uE}tDEE E U]u}tDEE E UeؿE䈅؍E}t[}tEEEE7EبtEEEtEEEE+É8UEEEM;ETMU tHu&U؋+ЉUM+UM+ȉ4~3EVjh04쉅4֋4U 09Ms"URVPhu([^_PhR E}tPE̋U 49Ms URVPuu&[^_PuR E}tVEP49Us!EPVjuFu'[^_juPC EEEE4~3EVjh4쉅4֋4U 09Ms"URVPhu([^_PhR E8~IU 49MsURVPSGu$[^_PSRG EEfE܉4~3EVjh4쉅4֋4U 09Ms"URVPhu([^_PhR EE؀tPEȋU 49Ms URVPuEu&[^_PuRC EEEU;+Љ4~3EVjh4쉅4֋4U 09Ms&URVPh,[^_PhR EMMUjuuuu u'ÐUjuuuu uÐU WVS}E }uKt=u@EEvWj0P  Ƈ[^_ËE %u8EPu u iE@B E}t)$Uihr @B E}t}}3G؍GE~ ;v]+EuURuPEPVP E++ӉU~ U}tE~$PuR E;sE@0HE;rEEvENjހ>5|309]uE@1HEE}tuNK@9EUE[^_ÐUPWVS}GEM%E=uEPw7` ?U ?M_Ë؁?]% Eu uމU܍V Pk  EƉM]Ћ]ىuEȋEUċUڋUӋ]ĉM ]ًMȉuu܉EE΋uЉUUUӉUMЋ؋uMދu؉]]]ӉU]؋EuuEEEc#؉]ME܉EEE>E%?U?M?]?UU ڃk M]ى]uЋuE UȋUUȉM]]]ދuЉEEEU‰MM̉]]M܉uuMȋEUEEUMыMыM‰EUMMuuEEE%?EU?UM?M]-ދE΋UθHU#ЉU}C9]MΉE؉]θ?M#ȉMUEE}E[^_ËNjUMȋ]MȋuMȋEы?###uEk ΊUщŮ]ډMԋMˋ]؉uuދuˉMuމ]֊E؋EE[^_#ωM̋ȋUEӉE[^_ÐUE ]uEËEE5ÐUWVS}EE}GЃuWt9Wu?uDuWG EE U;n;fG9GfGuryu3[^_EVuw ؅|$];t7+EÉEVPw ؅}fO E U‹M 3[^_ËE U‹M 3[^_ËGE]+؅;sSuuO )GÉGW +Ћ};} Wg+u6GDt&uEE Pj u t WE[^_]GE]+؅qWLE J‹M 3U+Ћ[^_3[^_3[^_ÐUW=`9=dv"tf@t P9=dw_ÐUWVS]u[^_Ct;u6t3s}!SOs}fGtwGfGGG[^_ÐUWVS}Eu>`E8t)u]f@t P ؃>uu]E[^_fGu#tjPw 3[^_GutGt9GvWRufG t [^_3[^_ÐUW} GЃRBuDG9G PW3ҊU t_WUu_3E_ËЃu:3EEjEPwj u3E_fO _ËЃuWt9Wu?uDu Wu[fGD2WRHyW3EP fG t GPWUfG t_3E_ø_ÐUWVS}w_+މwfGDtG +Gy&G +ƉW +W};} Wu3[^_SVwT E|$E+u3[^_SVw0 E}fO [^_ÐUW}GЃt uh _ÃfGu W?G9Gu,fGDu$W +ЉG +G};} W3_ÐU0WVS]sfCt%CCS S CVVu4jj,EPVW|Eԅ~EPCt9EhGuGGW W GVt2!fOGUW GVtGu@fG[^_ÐUS]C +SyC[9~[U} uE E E URE u3ËU E3UЋEBÐUEp3ÐUju{ÐL$)ÐL$&,kÐUhEEPhTu } Eh3øÐL$6+rÃNtL$+ÐUWS]} Où k Ӄ0؅u[_ÐUWVSE}v3[^_Ã=,u20Ѓ,,ʃ 0$(E؋=(EuT7;r>;r:(;v  (9=u (G[^_ËNj?;w$;C,7E@Ep=j$P;t5 Et=ٍQUփE"++Ё UE;s3[^_ÉE=v'hE u3[^_ËEEuu+EP3[^_É5$0E+E$P;t$,EI3[^_É=(951=&UEt P(HH9 $uU WVS]t Ct SF+ƙEu Fta;t]tYE E9EvEEPSWc ;s)U;r+։E™ M[^_Ë[^_Ð׋|$D$L$ t uH3Ð׋Ƌ|$t$L$ L$ D$Ð׋|$D$L$ rD$L$ D$ÐV5lD$tlP Yt^ÐL$)T$lË֋t$L$:tJtA:tAt8:t8t/:t/t&:t&t:tt:tt :t t3ÍFÐT$#u^#uG#u0#u#uЄtBt BtBB+D$ÐL$)r T$t ÃNtL$T$ d*r T$tډ ÃNtL$+rÃNth(t$ t$ $̸0+s h Ðh(t$t$t$ $̸0,s hÐ(Ðh(t$ t$ ̸0+s h ÐL$L$T$0*ÐL$L$T$0*ÐL$L$T$0*ÐL$L$T$0*gÐL$L$0+KÐT$0*2Ð搹 ސL$T$%* Ð(ÃNuhÐ54I5tO6O6O 6O6LP6xP6P!6Q&6Q-6Q26Q86RA6:E:HL:XR:hY:`:g:Ln:dx:t~:(::::L:: ::4::H::L:::$:p::;l ;;X;h;;$;(;-;3;9;4=;@C;hH;N;$U;[;a;Tg;l;s;<z; ~; ; ;L ; ; ;;@;d;;l;;;;;;H;x;;X;;4< <l << <X"<(<D /< 5<d!;<(#A<#G<$N<,%W<&]<'b<)i<@*o<*y< +<+<.</<40<,3<3<t4<4<H9<9<$:<P:<p:<:<;<;<H<<l>< ?=?=?=@=@A =C =dD&=D-=H4=pH>=ID=II=`JO=JV=XK\=Ld=xMk=Ms=N}=O=O=P=`R=0S=S=S=U=U=V=tW=PX=Y=[=4]=<^=\^=^=`=xa=b> c >f>tg>h$>j+>tk2>pl9>4r@>sG>dtM>LvT>wY>w`>xg>tyn>0zu>Hz{>4{>|><~>@>>h>>l>>>H>>>p>>>p>\>x>? ??p???%?,?82?9???F?M?S?0\?`a?$i?<p?u?`{?@?@?T??8??<???<?\?? ????d??4??0@l @\@̸@8!@(@H1@,8@@@G@Q@Z@a@Dg@l@r@Hy@@@0@d@@$@L@@P@x@@4 @@@8@t@@@d@@@AL A AA< AP%A\)Ap/Ad5A;AAAGA@MATAD[AaAhA<lA`rAxAA(AA0AA A<AAA`AtAAAALAA AA8ApA A4B B$BBB$B+B 2B9B@BXGBMBTBTZB`B gBmB0tBDzBB BBD BlBB4BBBBBBBxB Bh B B BL B B B BC CxCC  C'C(.C5C<;CBCpICMCSCYC(`CHeCjCpCvC}C(CdCCD C C CD!C`!C!C"C#C#C$C$C$C%C&C 'CH'C'C(C8(CX(Dt( D(D)DL*D*#D$+(DP+-Dx+5D,,9D,?D-EDl-JD /ND/SD 0XD0]D1aD1fD,1kDD1pD`1uD1yD1}DH2Dl2D2D2D3D5D5DL6D6D6D7D,8D8D8D9DP:D:DX;Dt;D;D;E<EH< Ed<E<E=E=#E>*EH>0E>7E>=E@EEd@LE@SEAYEC_E4DhEEnEXFxE`GEHEXIEIEJEJEKELEMENEPETQERESETEUEVETXElXEXF0Y FLYFhYFY FY'FZ-FZ2F[8F8[=F[DFX\JF]QF]XF]_F^eFLalFarFxbwFtc~FLeFheFeFfFDfFfF$hFn G79 85q&5 1Z$.H+jt'!]6$J !5w%^_KLza N } dP@fff&h&QG!+ A j<h"2S58C7{-_k2+/4 U# >D K) m5\W?YU }?^Fz !%ph]( ZJ(9H/9Y!,Ћ0PpЌ0PpЍ`ԠCCCCCCC ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~. ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~.@(#)$Header: crt0.s 1.8 1991/09/18 22:00:07 $$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: setjmp.h 1.19 1992/10/15 21:40:18 $@(#)head:setjmp.h 1.9$Header: signal.h 1.13 1992/06/19 18:44:15 $@(#)head:signal.h 1.5$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: time.h 1.10 1992/01/11 01:47:15 $@(#)head:time.h 1.5$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: timer.h 1.5 1992/07/04 20:56:00 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: times.h 1.7 1990/07/29 22:53:53 $$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: param.h 1.18 1990/05/16 20:57:08 $$Header: mc_param.h 1.10 1989/11/15 09:29:49 $$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: ctype.h 1.11 1990/06/24 15:35:17 $@(#)head:ctype.h 1.9$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: ctype.h 1.11 1990/06/24 15:35:17 $@(#)head:ctype.h 1.9$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: malloc.h 1.9 1992/06/18 16:34:29 $@(#)head:malloc.h 1.4$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: _init_locale.c 1.4 1991/09/18 21:58:08 $@(#)libc-port:locale/_init_locale.c 1.0 AT&T-UP$Header: locale.h 1.15 1992/07/06 18:22:06 $@(#)head:locale.h 1.0 AT&T-UP$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7acomp: 2.0.0 (00048)$Header: _ppinit.c 1.1 1989/04/15 10:46:53 $acomp: 2.0.0 (00048)@(#)libc-port:gen/abort.c 1.12$Header: signal.h 1.13 1992/06/19 18:44:15 $@(#)head:signal.h 1.5$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/fputs.c 3.10$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)libc-port:stdio/stdiom.h 1.3acomp: 2.0.0 (00048)$Header: isspace.c 1.2 1991/09/18 21:57:13 $$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9acomp: 2.0.0 (00048)@(#)libc-port:gen/atoi.c 2.5$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9acomp: 2.0.0 (00048)@(#)libc-port:print/printf.c 1.10$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/scanf.c 1.8$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8acomp: 2.0.0 (00048)$Header: doscan.c 1.14 1992/06/26 22:10:12 $@(#)libc-port:stdio/doscan.c 2.18$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: unistd.h 1.10 1992/03/11 21:45:57 $@(#)head:unistd.h 1.5$Header: unistd.h 1.23 1992/07/04 20:56:19 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: limits.h 1.9 1992/01/11 02:01:09 $@(#)head:limits.h 1.3$Header: limits.h 1.22 1992/07/04 20:54:30 $$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9$Header: varargs.h 1.8 1992/06/19 17:56:44 $@(#)head:varargs.h 1.4$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)$Header: atof.c 1.10 1992/01/30 01:53:06 $@(#)libc-i386:libc-i386/gen/atof.c 1.4$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11acomp: 2.0.0 (00048)@(#)$Header: setjmp.s 1.4 1991/12/13 00:25:52 $$Header: _set_tab.c 1.6 1992/06/24 23:49:51 $@(#)libc-port:locale/_set_tab.c 1.0 AT&T-UP$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: locale.h 1.15 1992/07/06 18:22:06 $@(#)head:locale.h 1.0 AT&T-UP$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: fcntl.h 1.9 1992/03/11 21:29:48 $@(#)head:fcntl.h 1.8$Header: fcntl.h 1.17 1992/07/17 17:07:57 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)$Header: _locale.c 1.9 1992/04/23 00:51:49 $@(#)libc-port:locale/_locale.c $Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stat.h 1.20 1992/07/04 20:55:21 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-m32:gen/ptod.c 1.7$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)$Header: ldexp.c 1.6 1991/09/09 22:28:55 $$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11acomp: 2.0.0 (00048)@(#)libc-port:stdio/system.c 1.9$Header: signal.h 1.13 1992/06/19 18:44:15 $@(#)head:signal.h 1.5$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)$Header: execl.s 1.3 1989/10/10 15:31:43 $@(#)$Header: execv.s 1.4 1989/10/10 15:31:57 $@(#)$Header: execve.s 1.3 1989/10/10 15:32:08 $@(#)$Header: exit.s 1.3 1989/10/10 15:32:19 $@(#)libc-port:gen/getenv.c 1.6acomp: 2.0.0 (00048)@(#)$Header: times.s 1.3 1989/10/10 15:34:48 $@(#)libc-port:stdio/filbuf.c 2.5$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/fopen.c 1.13$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: fcntl.h 1.9 1992/03/11 21:29:48 $@(#)head:fcntl.h 1.8$Header: fcntl.h 1.17 1992/07/17 17:07:57 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/findiop.c 1.6$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:gen/calloc.c 1.7$Header: stdlib.h 1.24 1992/07/15 20:44:42 $acomp: 2.0.0 (00048)@(#)$Header: memccpy.s 1.2 1989/10/10 15:31:32 $@(#)libc-port:print/fprintf.c 1.10$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)$Header: read.s 1.4 1992/01/08 22:14:22 $$Header: sigsetops.c 1.1 1992/01/08 21:55:29 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: param.h 1.20 1992/07/04 20:54:56 $$Header: mc_param.h 1.12 1992/07/04 20:46:36 $$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:print/sprintf.c 1.9$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)$Header: strcmp.s 1.7 1992/05/31 00:42:09 $@(#)$Header: strncat.s 1.3 1989/10/10 15:32:56 $@(#)$Header: strncpy.s 1.2 1989/10/10 15:33:14 $@(#)$Header: open.s 1.3 1989/10/10 15:31:43 $@(#)$Header: stat.s 1.3 1989/10/10 15:33:55 $@(#)$Header: strcat.s 1.5 1992/01/09 23:21:37 $@(#)$Header: strcpy.s 1.4 1991/12/13 23:55:39 $@(#)libc-port:stdio/ungetc.c 2.7$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)$Header: vfork.s 1.3 1992/01/28 23:14:24 $$Header: doprnt.c 1.12 1992/05/27 22:27:50 $@(#)libc-port:print/doprnt.c 3.11$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: limits.h 1.9 1992/01/11 02:01:09 $@(#)head:limits.h 1.3$Header: limits.h 1.22 1992/07/04 20:54:30 $$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: nan.h 1.5 1992/03/11 21:31:54 $@(#)head:nan.h 1.12@(#)libc-port:print/print.h 1.8$Header: limits.h 1.22 1992/07/04 20:54:30 $acomp: 2.0.0 (00048)@(#)libc-i386:libc-i386/gen/ecvt.c 1.6$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11$Header: nan.h 1.5 1992/03/11 21:31:54 $@(#)head:nan.h 1.12$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)libc-i386:gen/dtop.c 1.1$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)libc-i386:gen/biglitpow.s 1.1@(#)$Header: frexp.c 1.5 1991/09/09 22:28:44 $$Header: nan.h 1.5 1992/03/11 21:31:54 $@(#)head:nan.h 1.12acomp: 2.0.0 (00048)@(#)libc-port:stdio/fwrite.c 3.12$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)libc-port:stdio/stdiom.h 1.3$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/flsbuf.c 2.12$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)libc-port:stdio/stdiom.h 1.3$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: statfs.h 1.9 1992/07/04 20:55:23 $acomp: 2.0.0 (00048)$Header: align_malloc.c 1.3 1992/07/03 01:27:08 $acomp: 2.0.0 (00048)@(#)$Header: close.s 1.3 1989/10/10 15:31:17 $@(#)libc-port:stdio/data.c 2.9$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)$Header: fstatfs.s 1.3 1989/10/10 15:32:51 $@(#)libc-port:gen/isatty.c 1.7$Header: termio.h 1.27 1992/07/04 20:55:55 $acomp: 2.0.0 (00048)@(#)$Header: i386_data.s 1.3 1989/10/10 15:30:54 $@(#)$Header: ioctl.s 1.4 1992/01/08 22:13:46 $@(#)$Header: lseek.s 1.3 1989/10/10 15:31:00 $@(#)$Header: ltostr.c 1.3 1989/10/10 20:24:17 $acomp: 2.0.0 (00048)@(#)libc-port:gen/malloc.c 1.14$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: assert.h 1.11 1992/03/11 21:27:17 $@(#)head:assert.h 1.6acomp: 2.0.0 (00048)@(#)$Header: memchr.s 1.2 1989/10/10 15:31:43 $@(#)$Header: memcpy.s 1.3 1989/10/10 15:31:56 $@(#)$Header: memset.s 1.4 1989/10/10 15:32:05 $@(#)$Header: strchr.s 1.2 1989/10/10 15:32:32 $@(#)$Header: strlen.s 1.5 1991/12/13 23:55:55 $@(#)$Header: wait.s 1.7 1992/01/08 22:14:34 $$Header: _loc_data.c 1.7 1992/06/24 23:47:55 $@(#)libc-port:locale/_loc_data.c 1.0 AT&T-UP$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9$Header: langinfo.h 1.7 1992/03/11 21:30:39 $@(#)langinfo.h 1.1 89/12/06 acomp: 2.0.0 (00048)@(#)$Header: write.s 1.4 1992/01/08 22:14:45 $@(#)$Header: sigaction.s 1.3 1991/09/18 22:00:28 $@(#)$Header: signal.s 1.11 1992/01/10 22:06:28 $@(#)$Header: kill.s 1.3 1989/10/10 15:30:46 $@(#)$Header: getpid.s 1.3 1989/10/10 15:30:03 $@(#)$Header: cerror.s 1.4 1992/01/08 22:13:17 $.file gcrt0.s.text<.data\.bss.comment0.filegmain.c.text P.data`.bss.comment0p .file#gfileio.c.text\Q.data`.bss.comment\"RR1<.file9ginterface.c.text.data` .bss.commentP?N`Zgl y 4 hprompt  4R d.fileHgstrtable.c.text .dataJ.bss.commentD .filetgparser.c.text t.data0F,.bss.commentH  yyprhsyyrhs yyr1yyr2&yydefactjyypactyypgotofyytableyycheck)d4yy_ec8yy_metayy_baseyy_defyy_nxtyy_chkZ>8Fyy_init|{.file~gAFUPGS.c.text|`.data.bssM|.filegAFUPIIR.c.text}|.data.bss\}.filegAFUPIIWS.c.text}'.data.bssk}.filegAFUPMPR.c.text L.data.bssz .filegAFUPRB.c.textl< .data.bssl.filegAFUPRICL.c.text .data.bss.filegAFUPRICS.c.text(.data.bss.filegAFUPRII.c.textU.data.bss.filegAFUPRL.c.textLL.data.bssL.filegAFUPRLS.c.text.data.bss.filegAFUPRRI.c.textl.data.bssl.filegAFUPRRS.c.text.data.bss.filegAFUPSF.c.text .data.bss.filegAFUPSFBA.c.textĎ .data.bssĎ.filegAFUPSFN.c.text .data.bss.filegAFUPSR.c.textĐ4.data.bss.Đ.filegAFUPVAR.c.textx.data.bss=.filegAFUPWRITE.c.textp .data.bssLp.file gAFUSPSFB.c.text T.data.bss[ .file)gAFWRITE.c.text`T.data.bssj`.file2gAIFAN.c.text.data.bssy.file;gAMPDMV.c.texth.data.bssh.fileDgAMPSAFP.c.text|0.data.bss|.fileMgAMSIGN.c.text$.data.bss.fileVgAMSIGNIR.c.textГ.data.bssГ.file_gAMUPBES.c.textp,.data.bssp.filehgAMUPBHT.c.text.data.bss.fileqgAMUPIIR.c.text|.data.bss.filezgAMUPIIWS.c.text,<.data.bss,.filegAMUPMPR.c.texthD.data.bssh.filegAMUPNT.c.text.data.bss.filegAMUPRBH.c.text .data.bss.filegAMUPRICS.c.text<.data.bss-.filegAMUPRICSW.c.text.data.bss<.filegAMUPRINCS.c.texth4.data.bssKh.filegAMUPRLS.c.text.data.bssZ.filegAMUPRRS.c.textL.data.bssiL.filegAMUPSR.c.textL,.data.bssxL.filegAMUPTR.c.textx.data.bssx.filegAMUPTR1.c.text.data.bss.filegAMUPVARIR.c.text.data.bss.filegANDWRITE.c.text8..data.bss8.filegANFAF.c.textȤ.data.bssȤ.filegANIIPE.c.textt.data.bsst.file gANPEDE.c.texthh.data.bssh.filegANPROD.c.textЩ.data.bssЩ.filegANREPE.c.text` .data.bss`.file%gANSUM.c.text.data.bss.file.gAREAD.c.text .data.bss.file7gASSPR.c.text .data.bss,.file@gAWRITE.c.texth.data.bss;.fileIgBEGINSACLIB.c.texto.data.bssJ.fileRgBITRAN.c.text.data.bssY.file]gBKSP.c.textķ.data.bss.comment\phķ.filefgCCONC.c.textܷ@.data.bsswܷ.fileogCINV.c.textP.data.bss.filexgCLEAR.c.textl .data.bssl.filegCLOCK.c.text,.data.bss.comment.filegCLOUT.c.textD.data.bss.filegCOMP.c.text@.data.bss.filegCOMP2.c.text<`.data.bss<.filegCOMP3.c.text,.data.bss.filegCOMP4.c.textȹ8.data.bssȹ.filegCONC.c.text8.data.bss.filegCOPYTO.c.text8(.data.bss 8.filegCPLEXN.c.text` .data.bss `.filegCREAD.c.text(0.data.bss.commentp+ (.filegCREADB.c.textX .data.bss.comment@: X.filegCSFPAR.c.textxT.data.bssI x.filegCSINT.c.text̻ .data.bssX ̻.filegCSSUB.c.text.data.bssg .filegCSUN.c.textT .data.bssv T.filegCTMI.c.text@4.data.bss @.filegCWRITE.c.textt0.data.bss.comment\p t.file"gDAND.c.text`.data.bss .file+gDEGCD.c.text.data.bss .file4gDGCD.c.text$.data.bss .file=gDIELOC.c.text.data.bss .fileHgDIGIT.c.text.data.bss.comment@ .fileQgDIIPREAD.c.textؿ%.data.bss ؿ.fileZgDIIPWRITE.c.text.data.bss .filecgDIPDEG.c.textl,.data.bss l.filelgDIPFP.c.text .data.bss .fileugDIPINS.c.text|(.data.bss* |.file~gDIRPREAD.c.text'.data.bss9 .filegDIRPWRITE.c.text#.data.bssH .filegDLOG2.c.text .data.bssW .filegDMPPRD.c.text.data.bssf .filegDMPSUM.c.textTt.data.bssu T.filegDMUPNR.c.text.data.bss .filegDNIMP.c.textPX.data.bss P.filegDNOT.c.text.data.bss .filegDOR.c.textd.data.bss .filegDPCC.c.text.data.bss .filegDPFP.c.text .data.bss .filegDPGEN.c.text.data.bss .filegDPR.c.textH .data.bss H.filegDQR.c.textH.data.bss H.filegDRAN.c.text X.data.bss .filegDRANN.c.textxH.data.bss x.filegDSQRTF.c.text.data.bss) .filegDVCMP.c.textDd.data.bss8 D.file gENDSACLIB.c.textt .data.bssG .file)gEQUAL.c.text.data.bssV .file2gEVEN.c.text(.data.bsse .file;gEXPF.c.text(.data.bsst .fileDgEXTENT.c.textT.data.bss .fileMgFILINE.c.textH.data.bss H.fileVgFIRST.c.textX.data.bss X.file_gFIRST2.c.texth8.data.bss h.filehgFIRST3.c.textH.data.bss .fileqgFIRST4.c.textd.data.bss .filezgFOURTH.c.textL.data.bss L.filegFREEARRAY.c.textd.data.bss.comment 0 d.filegFRESL.c.textt.data.bss t.filegFRLSM.c.text(.data.bss (.filegGC.c.text.data.bss gc_dummy.filegGCA2PTR.c.textX.data.bss( .filegGCAFREE.c.textd.data.bss7 .filegGCAGET.c.textL.data.bssF L.filegGCAMALLOC.c.texth .data.bssU h.filegGCGLOBAL.c.text .data.bssd .filegGCSI.c.text$J.data.bsss $.filegGDPGEN.c.text .data.bss .filegGETARRAY.c.textL.data.bss.comment<p .filegGETLIST.c.textHd.data.bss H.filegGREAD.c.text .data.bss .filegGWRITE.c.textLh.data.bss L.filegIABSF.c.text$.data.bss .filegIBCIND.c.textL.data.bss .file!gIBCOEF.c.text$L.data.bss $.file*gIBCPS.c.textpL.data.bss p.file3gICOMP.c.text .data.bss .file<gICRAND.c.text .data.bss .fileEgIDEGCD.c.textlx.data.bss' l.fileNgIDEQ.c.textt .data.bss6 .fileWgIDIF.c.textXJ.data.bssE X.file`gIDIPR2.c.texth0.data.bssT h.fileigIDP2.c.text.data.bssc .filergIDPR.c.text#.data.bssr .file{gIDQ.c.text .data.bss .filegIDQR.c.text.data.bss .filegIDREM.c.text .data.bss .filegIEGCD.c.texth.data.bss .filegIEQ.c.text4 ..data.bss 4.filegIEVEN.c.text@(.data.bss @.filegIEXP.c.texthd.data.bss h.filegIFACT.c.textX.data.bss .filegIFACTL.c.text$d.data.bss $.filegIFATL.c.text .data.bss.filegIFCL2.c.text.data.bss.filegIFLTA.c.textT .data.bss&T.filegIGCD.c.text.data.bss5.filegIGCDCF.c.textP.data.bssD.filegIHEGCD.c.text<.data.bssS<.filegIIC.c.text .data.bssb .file gILCM.c.text H.data.bssq .filegILCOMB.c.text `.data.bss .filegILOG2.c.textL X.data.bssL .file&gILPDS.c.text .data.bss .file/gILWRITE.c.text d.data.bss .file8gIMAX.c.text$.data.bss.fileAgIMIN.c.text@$.data.bss@.fileJgIMP2.c.textd4.data.bssd.fileSgIMPB.c.text.data.bss.file\gIMPDS.c.textl8.data.bssl.fileegINEG.c.text .data.bss.filengINFOSACLIB.c.text<L'.data.bss<.filewgINV.c.text8.data.bss%.filegIODD.c.text(.data.bss4.filegIORD2.c.text`.data.bssC.filegIPABS.c.textH0.data.bssRH.filegIPAFME.c.textx,.data.bssax.filegIPBEILV.c.text.data.bssp.filegIPBHT.c.textXP.data.bssX.filegIPBHTLV.c.text.data.bss.filegIPBHTMV.c.text4.data.bss4.filegIPBREI.c.text.data.bss.filegIPC.c.textl.data.bssl.filegIPCEVP.c.text .data.bss.filegIPCONST.c.text L.data.bss .filegIPCPP.c.textX8.data.bssX.filegIPCRA.c.text.data.bss.filegIPCSFB.c.textD .data.bssD .file gIPDER.c.text .data.bss .file gIPDIF.c.textd!.data.bss$d!.file gIPDMV.c.text(#.data.bss3(#.file" gIPDQR.c.text# .data.bssB#.file+ gIPDSCR.c.text$\.data.bssQ$.file4 gIPDWRITE.c.text,%t.data.bss`,%.file= gIPEMV.c.text&  .data.bsso&.fileF gIPEQ.c.text'.data.bss~'.fileO gIPEVAL.c.text).data.bss).fileX gIPEXP.c.text@*`.data.bss@*.filea gIPEXPREAD.c.text*l.data.bss*.filej gIPEXPREADR.c.text +t.data.bss +.files gIPFAC.c.text+'.data.bss+.file| gIPFACTREAD.c.textH.|.data.bssH..file gIPFCB.c.text/p.data.bss/.file gIPFLC.c.text40-.data.bss40.file gIPFRP.c.text,3.data.bss,3.file gIPFSD.c.text3 .data.bss3.file gIPFSFB.c.textt4`.data.bss#t4.file gIPGCDC.c.text4tP.data.bss24.file gIPGFCB.c.textH9p.data.bssAH9.file gIPGSUB.c.text9l.data.bssP9.file gIPHDMV.c.text$:,.data.bss_$:.file gIPIC.c.textP: .data.bssnP:.file gIPICPP.c.textp:<.data.bss}p:.file gIPICS.c.text:p.data.bss:.file gIPIHOM.c.text;.data.bss;.file gIPIISS.c.text; .data.bss;.file gIPIIWS.c.textH<$.data.bssH<.file gIPINT.c.textl>.data.bssl>.file gIPIP.c.text ?.data.bss ?.file gIPIPP.c.text? .data.bss?.file' gIPIPR.c.text? .data.bss?.file0 gIPIQ.c.text@.data.bss@.file9 gIPIQH.c.text@Al.data.bss@A.fileB gIPLCPP.c.textC.data.bss"C.fileK gIPLEV.c.textdD`.data.bss1dD.fileT gIPLRRI.c.textD@).data.bss@D.file] gIPMAXN.c.textHl.data.bssOH.filef gIPMONFACT.c.textpH.data.bss^pH.fileo gIPNEG.c.textI.data.bssmI.filex gIPNT.c.textI .data.bss|I.file gIPONE.c.text`J\.data.bss`J.file gIPOWER.c.textJ.data.bssJ.file gIPP2P.c.textXK.data.bssXK.file gIPPFAC2.c.textLx.data.bssL.file gIPPGSD.c.textxM\.data.bssxM.file gIPPNPRS.c.textM .data.bssM.file gIPPOWREAD.c.textN0.data.bssN.file gIPPP.c.textO$.data.bssO.file gIPPROD.c.textO .data.bssO.file gIPPSC.c.textP.data.bssP.file gIPPSR.c.text`R.data.bss!`R.file gIPPVED.c.text0S .data.bss00S.file gIPQ.c.textS(.data.bss?S.file gIPQR.c.textS.data.bssNS.file gIPRAN.c.textU .data.bss]U.file gIPRCH.c.textU .data.bsslU.file gIPRCHS.c.textV .data.bss{V.file gIPRCN1.c.texttW.data.bsstW.file# gIPRCNP.c.textPX4.data.bssPX.file, gIPREAD.c.textY).data.bssY.file5 gIPRES.c.text[.data.bss[.file> gIPRICL.c.text4].data.bss4].fileG gIPRIM.c.text<^ .data.bss<^.fileP gIPRIMO.c.text\^|.data.bss\^.fileY gIPRIMS.c.text^,.data.bss^.fileb gIPRIMU.c.text`t.data.bss`.filek gIPRIMW.c.textxa0.data.bssxa.filet gIPRIST.c.textbx .data.bss b.file} gIPROD.c.text c`#.data.bss/ c.file gIPROD2X2.c.textf .data.bss>f.file gIPROD3X2.c.texttgP .data.bssMtg.file gIPROD3X3.c.texth.data.bss\h.file gIPRODA.c.textj.data.bsskj.file gIPRPRS.c.texttk .data.bssztk.file gIPRRII.c.textplO.data.bsspl.file gIPRRLS.c.text4r.data.bss4r.file gIPRRRI.c.texts.data.bsss.file gIPRRS.c.textdt.data.bssdt.file gIPSCPP.c.textLv .data.bssLv.file gIPSF.c.textw .data.bssw.file gIPSFBA.c.textw .data.bssw.file gIPSFSD.c.textx .data.bssx.file gIPSIFI.c.textty .data.bssty.file gIPSIGN.c.text0z.data.bss0z.file gIPSMV.c.textHz.data.bssHz.file gIPSPRS.c.text4{t.data.bss.4{.file gIPSQRT.c.text|.data.bss=|.file( gIPSRM.c.text<~.data.bssL<~.file1 gIPSRMS.c.text@ .data.bss[@.file: gIPSRP.c.textl.data.bssj.fileC gIPSUB.c.texth.data.bssyh.fileL gIPSUM.c.textp.data.bss.fileU gIPSUMN.c.textl|.data.bssl.file^ gIPTERMREAD.c.text .data.bss.fileg gIPTPR.c.text.data.bss.filep gIPTR.c.textHP.data.bssH.filey gIPTR1.c.textL.data.bss.file gIPTR1LV.c.text.data.bss.file gIPTRAN.c.textp.data.bssp.file gIPTRLV.c.text.data.bss.file gIPTRMV.c.text .data.bss.file gIPTRUN.c.textp .data.bssp.file gIPVCHT.c.text\.data.bss-\.file gIPVDEG12.c.textx.data.bss<x.file gIPWRITE.c.text.data.bssK.file gIQ.c.text .data.bssZ.file gIQR.c.texth.data.bss.commentDi.file gIRAND.c.textp.data.bssxp.file gIREAD.c.texth.data.bssh.file gIREM.c.text .data.bss.file gIROOT.c.text .data.bss.file gISATOM.c.text .data.bss.file gISFPF.c.text=.data.bss.file gISFPIR.c.text .data.bss.file gISGCA.c.text .data.bss.file& gISIGNF.c.textH.data.bss.file/ gISLIST.c.text0.data.bss.file8 gISNIL.c.text.data.bss.fileA gISOBJECT.c.text00.data.bss0.fileJ gISPD.c.text`.data.bss,`.fileS gISPFAC2.c.text$.data.bss;$.file\ gISPSFB.c.text<T.data.bssJ<.filee gISPT.c.text .data.bssY.filen gISQRT.c.text` .data.bssh`.filew gISUM.c.text@F.data.bssw@.file gISZERO.c.text@.data.bss@.file gITRUNC.c.textT0.data.bssT.file gIUPBEI.c.text.data.bss.file gIUPBES.c.text8X.data.bss8.file gIUPBHT.c.text.data.bss.file gIUPBRE.c.text< .data.bss<.file gIUPCHT.c.text.data.bss.file gIUPFAC.c.text.data.bss.file gIUPFDS.c.text <!.data.bss .file gIUPIHT.c.text\H.data.bss \.file gIUPIIR.c.texth.data.bss.file gIUPNT.c.text x.data.bss+ .file gIUPQH.c.text0.data.bss:.file gIUPQHL.c.text@.data.bssI.file gIUPQS.c.textp.data.bssX.filegIUPRB.c.textd .data.bssgd.filegIUPRC.c.textl.data.bssvl.filegIUPRLP.c.text4L.data.bss4.file"gIUPSR.c.text .data.bss.file+gIUPTPR.c.text0<.data.bss0.file4gIUPTR.c.textl .data.bssl.file=gIUPTR1.c.text\p.data.bss\.fileFgIUPVAR.c.text̸l.data.bss̸.fileOgIUPVOI.c.text8.data.bss8.fileXgIUPVSI.c.text.data.bss.fileagIUPWRITE.c.textH.data.bssH.filejgIUSFPF.c.text,T.data.bss ,.filesgIUSFPF2.c.text.data.bss.file|gIWRITE.c.text.data.bss*.filegKARATSUBA.c.textD.data.bss9.filegLASTCELL.c.text,.data.bssH.filegLBIBMS.c.text@ .data.bssW.filegLBIBS.c.textD|.data.bssfD.filegLBIM.c.text .data.bssu.filegLCONC.c.text.data.bss.filegLDSMKB.c.textHT(.data.bssH.filegLDSSBR.c.text4.data.bss.filegLEINST.c.text`.data.bss.filegLELTI.c.text04.data.bss0.filegLENGTH.c.textd(.data.bssd.filegLEROT.c.text.data.bss.filegLETTER.c.text$(.data.bss$.filegLEXNEX.c.textL.data.bssL.filegLFS.c.textL.data.bss .file gLINS.c.textP(.data.bssP.filegLINSRT.c.textx.data.bss)x.filegLIST1.c.text<.data.bss8.file'gLIST10.c.text4p .data.bssG4.file0gLIST2.c.textd.data.bssV.file9gLIST3.c.text0.data.bsse.fileBgLIST4.c.text8<.data.bsst8.fileKgLIST5.c.texttD.data.bsst.fileVgLKAHEAD.c.text.data.bss.commentp.file_gLMERGE.c.text.data.bss.filehgLPERM.c.textd`.data.bssd.fileqgLREAD.c.text.data.bss.filezgLSRCH.c.textP.data.bss.filegLWRITE.c.textt.data.bss.filegMAIPDE.c.textL.data.bssL.filegMAIPDM.c.text.data.bss.filegMAIPHM.c.text.data.bss .filegMAIPP.c.text<.data.bss<.filegMARK.c.textP  .data.bss(P.filegMAX.c.text\.data.bss7\.filegMCPMV.c.textp .data.bssFp.filegMDCRA.c.textd<.data.bssUd.filegMDDIF.c.text.data.bssd.filegMDEXP.c.textd.data.bsss.filegMDHOM.c.text,.data.bss.filegMDINV.c.text@d.data.bss@.filegMDINVB.c.text.data.bss.filegMDLCRA.c.textD.data.bssD.file gMDNEG.c.text.data.bss.filegMDPROD.c.text<.data.bss.filegMDQ.c.text<$.data.bss<.file%gMDRAN.c.text`d.data.bss`.file.gMDSUM.c.text.data.bss.file7gMEMBER.c.textP.data.bss .file@gMIAIM.c.text(.data.bss(.fileIgMICINS.c.textl.data.bss'.fileRgMICS.c.text0|.data.bss60.file[gMIDCRA.c.text`.data.bssE.filedgMIDIF.c.text 0.data.bssT .filemgMIEXP.c.text<.data.bssc<.filevgMIHOM.c.text4.data.bssr.filegMIINV.c.texth.data.bss.filegMIN.c.text`.data.bss`.filegMINEG.c.textt.data.bsst.filegMINNCT.c.textP.data.bss.filegMIPDIF.c.text.data.bss.filegMIPFSM.c.text.data.bss.filegMIPHOM.c.textL.data.bssL.filegMIPIPR.c.text,.data.bss.filegMIPISE.c.text .data.bss .filegMIPMIP.c.text.data.bss.filegMIPMON.c.text88.data.bss8.filegMIPNEG.c.textp.data.bss&p.filegMIPPR.c.text (.data.bss5 .filegMIPRAN.c.text4 .data.bssD4.filegMIPROD.c.text.data.bssS.filegMIPSUM.c.text$x.data.bssb$.filegMIQ.c.text$.data.bssq.filegMIRAN.c.text(.data.bss.file!gMISUM.c.text4.data.bss.file*gMIUPQR.c.text .data.bss.file3gMIUPSE.c.text  .data.bss .file<gMMDDET.c.text.data.bss.fileEgMMDNSB.c.text.data.bss.fileNgMMPDMA.c.text,.data.bss,.fileWgMMPEV.c.text.data.bss.file`gMMPIQR.c.text .data.bss.fileigMPDIF.c.textT.data.bssT.filergMPEMV.c.text.data.bss.file{gMPEVAL.c.text .data.bss% .filegMPEXP.c.textd.data.bss4.filegMPGCDC.c.text 8O.data.bssC .filegMPHOM.c.textD.data.bssRD.filegMPINT.c.text.data.bssa.filegMPIQH.c.text.data.bssp.filegMPIQHL.c.text.data.bss.filegMPIQHS.c.textD(#.data.bssD.filegMPMDP.c.textl.data.bssl.filegMPMON.c.text8.data.bss.filegMPNEG.c.text4.data.bss4.filegMPPROD.c.text  .data.bss.filegMPPSR.c.text.data.bss.filegMPQ.c.textD.data.bss.filegMPQR.c.text.data.bss.filegMPRAN.c.text .data.bss.file gMPRES.c.text.data.bss.filegMPSPRS.c.textx.data.bss$x.filegMPSUM.c.text h .data.bss3 .file&gMPUC.c.texth  .data.bssBh .file/gMPUCPP.c.text D.data.bssQ .file8gMPUCS.c.text .data.bss` .fileAgMPUP.c.textL .data.bssoL .fileJgMPUPP.c.text $.data.bss~ .fileSgMPUQ.c.text .data.bss .file\gMUPBQP.c.text l.data.bss .fileegMUPDDF.c.text.data.bss.filengMUPDER.c.text.data.bss.filewgMUPEGC.c.textxt.data.bssx.filegMUPFBL.c.text4.data.bss.filegMUPFS.c.text x.data.bss .filegMUPGCD.c.text.data.bss.filegMUPHEG.c.text(.data.bss (.filegMUPRAN.c.text\.data.bss .filegMUPRC.c.text<.data.bss# <.filegMUPRES.c.text`.data.bss2 .filegMUPSFF.c.textp .data.bssA p.filegODD.c.text.data.bssP .filegORDER.c.textX.data.bss_ .filegOREAD.c.text(.data.bssn .filegOWRITE.c.text( .data.bss} (.filegPADV.c.textHh.data.bss H.filegPAIR.c.textl.data.bss .filegPARTN.c.text .data.bss .filegPARTR.c.text.data.bss .filegPARTSS.c.textT.data.bss .filegPBIN.c.text(<.data.bss (.file"gPCL.c.textd.data.bss d.file+gPCOEFF.c.textT.data.bss .file4gPCONST.c.textD P.data.bss!D .file=gPCPV.c.text @.data.bss! .fileFgPDBORD.c.text p.data.bss"! .fileOgPDEG.c.textD!.data.bss1!D!.fileXgPDEGSV.c.text`!t.data.bss@!`!.fileagPDEGV.c.text! .data.bssO!!.filejgPDLOG2.c.text".data.bss^!".filesgPDPV.c.text#.data.bssm!#.file|gPERMCY.c.text#|.data.bss|!#.filegPERMR.c.text$.data.bss!$.filegPFBRE.c.text$8.data.bss!$.filegPFDIP.c.text$.data.bss!$.filegPFDP.c.text%.data.bss!%.filegPHDQR.c.text&.data.bss!&.filegPICPV.c.text '<.data.bss! '.filegPINV.c.textH'.data.bss!H'.filegPLBCF.c.text'8.data.bss!'.filegPLDCF.c.text($.data.bss"(.filegPMDEG.c.text8( .data.bss"8(.filegPMON.c.textX(.data.bss!"X(.filegPMONSV.c.textt(8.data.bss0"t(.filegPMPMV.c.text(d.data.bss?"(.filegPNDQR.c.text)<.data.bssN").filegPORD.c.textL*D.data.bss]"L*.file gPPERMV.c.text*.data.bssl"*.filegPPLT.c.text$+,.data.bss{"$+.filegPRED.c.textP+(.data.bss"P+.file'gPRODUCT.c.textx+.data.bss"x+.file0gPRT.c.text,,X.data.bss",,.file9gPSDSV.c.text,.data.bss",.fileBgPTBCF.c.text-T.data.bss"-.fileKgPTMV.c.textl-.data.bss"l-.fileTgPTV.c.text /.data.bss" /.file]gPUFP.c.text/.data.bss"/.filefgPUNT.c.text 0l.data.bss# 0.fileogQREM.c.text0|.data.bss#0.filexgRED.c.text1.data.bss #1.filegRED2.c.text1.data.bss/#1.filegRED3.c.text,1.data.bss>#,1.filegRED4.c.textD1.data.bssM#D1.filegREDI.c.text`1,.data.bss\#`1.filegREM.c.text1 .data.bssk#1.filegRIB.c.text1 .data.bssz#1.filegRIL.c.textH2$.data.bss#H2.filegRILC.c.textl2P.data.bss#l2.filegRINEG.c.text28.data.bss#2.filegRINT.c.text2 .data.bss#2.filegRIPROD.c.text3.data.bss#3.filegRIRNP.c.text5T.data.bss#5.filegRISIGN.c.text5`.data.bss#5.filegRISUM.c.textL6T.data.bss#L6.filegRNABS.c.text6$.data.bss$6.filegRNBCR.c.text6  .data.bss$6.filegRNCEIL.c.text7\.data.bss$7.filegRNCOMP.c.text,8 .data.bss.$,8.file#gRNDEN.c.text8(.data.bss=$8.file,gRNDIF.c.text8.data.bssL$8.file5gRNDWRITE.c.text9P.data.bss[$9.file>gRNFCL2.c.textP:.data.bssj$P:.fileGgRNFLOR.c.text:\.data.bssy$:.filePgRNINT.c.textX;.data.bss$X;.fileYgRNINV.c.textt;T.data.bss$t;.filebgRNMAX.c.text;$.data.bss$;.filekgRNMIN.c.text;$.data.bss$;.filetgRNNEG.c.text<8.data.bss$<.file}gRNNUM.c.textH<.data.bss$H<.filegRNP2.c.textd<4.data.bss$d<.filegRNPROD.c.text<.data.bss$<.filegRNQ.c.text=$.data.bss%=.filegRNRAND.c.text=4.data.bss%=.filegRNREAD.c.text>D.data.bss%>.filegRNRED.c.textH>`.data.bss-%H>.filegRNSIGN.c.text> .data.bss<%>.filegRNSUM.c.text>T.data.bssK%>.filegRNWRITE.c.text@H.data.bssZ%@.filegRPAFME.c.textd@,.data.bssi%d@.filegRPBLGS.c.text@8.data.bssx%@.filegRPDIF.c.textA.data.bss%A.filegRPDMV.c.textC.data.bss%C.filegRPDWRITE.c.text4D.data.bss%4D.filegRPEMV.c.textE.data.bss%E.file gRPEXPREAD.c.textXFl.data.bss%XF.filegRPFACTREAD.c.textF.data.bss%F.filegRPFIP.c.textH.data.bss%H.file(gRPIMV.c.textXIx.data.bss%XI.file1gRPMAIP.c.textI@.data.bss%I.file:gRPNEG.c.textJ.data.bss&J.fileCgRPPOWREAD.c.textJ8.data.bss&J.fileLgRPPROD.c.textK .data.bss,&K.fileUgRPQR.c.textL.data.bss;&L.file^gRPRAN.c.textM .data.bssJ&M.fileggRPREAD.c.textN(+.data.bssY&N.filepgRPRNP.c.textP.data.bssh&P.fileygRPSUM.c.textTQp.data.bssw&TQ.filegRPTERMREAD.c.textR .data.bss&R.filegRPWRITE.c.textS.data.bss&S.filegRUPWRITE.c.textT.data.bss&T.filegSDIFF.c.textU.data.bss&U.filegSDR.c.textVD.data.bss&V.filegSECOND.c.textTX.data.bss&TX.filegSEQUAL.c.textlX.data.bss&lX.filegSFCCON.c.textX8.data.bss&X.filegSFCDIF.c.text0Y.data.bss&0Y.filegSFCFR.c.textLY.data.bss 'LY.filegSFCIP.c.texthY$.data.bss'hY.filegSFCMSQ.c.textYH.data.bss+'Y.filegSFCNEG.c.textY@.data.bss:'Y.filegSFCPR.c.textZ .data.bssI'Z.filegSFCQ.c.textZp.data.bssX'Z.file gSFCRP.c.text[.data.bssg'[.filegSFCS.c.text8[.data.bssv'8[.filegSFCSUM.c.text[t.data.bss'[.file$gSFIFI.c.textX\@.data.bss'X\.file-gSFIRST.c.text].data.bss'].file6gSFRABS.c.text]8.data.bss'].file?gSFRDIF.c.text].data.bss'].fileHgSFRLS.c.text^L&.data.bss'^.fileQgSFRNEG.c.textLa4.data.bss'La.fileZgSFRPR.c.texta .data.bss'a.filecgSFRQ.c.texthb.data.bss'hb.filelgSFRSUM.c.textdc.data.bss (dc.fileugSIGN.c.textLe.data.bss(Le.file~gSINTER.c.texthet.data.bss*(he.filegSLELTI.c.texte8.data.bss9(e.filegSMFMI.c.textf0.data.bssH(f.filegSMFMIP.c.textDf.data.bssW(Df.filegSRED.c.textf.data.bssf(f.filegSTATSACLIB.c.textfH1.data.bssu(f.filegSUBFROM.c.text+$o.textd'.data(H.bssܔ .commentlang(+0.filegptod.c_ptod\'.textD.datap.bss.comment .filegldexp.cldexp0'.text .datap.bss.comment4.filegsystem.csystem؟$.text؟ .datap.bss.comment0+pshellxshflg{.file gexecl.s.text.data.bss.comment0.filegexecv.s.textĠ.data.bss.comment40.file gexecve.s.textܠ.data.bss.commentd0.file*gexit.s.text .data.bss.comment0.file8ggetenv.cgetenvbA.nvmatch@b@0.text.data.bss.comment4.fileBgtimes.s.text.data.bss.comment0.fileNgfilbuf.c__filbuf$F.text.data.bss.comment(.file^gfopen.cfopenhRfreopenĢh!T+hgV.text.data.bss.comment<.filelgfindiop.c+Ph_b+$d.textP.data.bss.comment4.filezgcalloc.ccalloc@`7pcfreex r.text@H.data.bss.commentD d.filegmemccpy.s.texth.data.bss.comment 4.filegfprintf.cfprintf$u.textx.data.bss.comment T.filegread.s.texth.data.bss.comment0"0.filegsigsetops.csigvalid$L+̦$.+$+ $9,H$;,$?.textD.data.bss.comment`"$sigsinitsigs.filegsprintf.csprintfħ$>.textħ@.data.bss.comment#,.filegstrcmp.s.text.data.bss.comment$0.filegstrncat.s.textp.data.bss.comment$4,O),6,L.filegstrncpy.s.textX8.data.bss.comment%4.filegopen.s.text.data.bss.commentH%0.filegstat.s.text.data.bss.commentx%0.filegstrcat.s.text.data.bss.comment%0.filegstrcpy.s.text.data.bss.comment%0.filegungetc.cungetcT$ .textT.data.bss.comment&.filegvfork.s.text@ .data.bss.comment&,errRparentP.file7gdoprnt.cC,`$G#_dowrite$n%_doprnt $;$'.text`$.data.bss.comment&_blanks_zeroesuc_digslc_digslc_nan̈uc_nan҈lc_inf؈uc_inf܈.fileHgecvt.cecvt\b;fcvt|b=cvtb?.text\ .data.bss.comment)buf.fileTgdtop.c_dtopp%L.textp.data.bss.comment* .file^gbiglitpow.s.text .data.bss.comment+$.filejgfrexp.cfrexp'5b.text @.data.bss.comment+.filevgfwrite.cfwriteL.n.textL.data.bss.commenth,.filegflsbuf.c_cleanup4 7zfclosel$|fflush$~__flsbuf$/M,$__wrtchk$}W,$a,$ .text4".data.bss.comment\-L.filegalign_malloc.ck,(b_y, ,b.text(.data.bss.comment.H.filegclose.s.text.data.bss.comment.0.filegdata.c.text.data.bss.comment /.filegfstatfs.s.text.datah.bss.comment/4.filegisatty.cisatty$9.text<.datah.bss.comment/d.filegi386_data.s.text.datah.bss.comment\04.filegioctl.s.text.datal.bss.comment00.fileglseek.s.text0.datal.bss.comment00.filegltostr.c_ltostrDb1.textD4.datal.bss.comment0H.file gmalloc.cmallocx`Rfree ,realloc`.textx,..datal.bss.comment81allocendallocx alloct$allocp(allocs,.filegmemchr.s.text$.datal.bss4.comment 20.filegmemcpy.s.text(.datal.bss4.commentP20.file'gmemset.s.text4.datal.bss4.comment20.file0gsbrk.s.text$D.datal.bss4_curbrkl.file:gstrchr.s.texth`.datap.bss4.comment20.fileDgstrlen.s.text.datap.bss4.comment20.fileNgwait.s.text`L.datap.bss4.comment30.fileXg_loc_data.c.text.datap.bss4.comment@3.filebgwrite.s.text.data.bss4.comment50.fileogsigaction.s.textd.data.bss4.comment054_12ok,_16ok!.file}gsignal.s.text( .data.bss4.commentd54_12sigG_12okZ,Psigsw1.filegkill.s.text$.data.bss4.comment50.fileggetpid.s.text<.data.bss4.comment50.filegcerror.s.textD.data.bss4.comment50_startenviron\mainr_mcount sacMain ,4,err8__iob,nr_bound\F, OWRITE(,, OREADsetjmp,`F,lF -dF-D-hF,-yyparse08-L&signal8longjmpstrcmpstrlenstrcpyyyerror yynerrs8yychar<yylexyylval@B-(2N-)assign\(INVCOMPLIST1getref(call`*LIST2[-T)yyin0Fyyout4Ff-(u-'-&yytextDyylengH-2readh-d&-'SPACEB1LSPACEBPLENGTHdADVLP- 3-3-44- 5cmd_help,5strcatcmd_view5cmd_vars5.5.5FAIL4IAADVtOABSOACLOCKOADDTOOADV2xPADV3PADV4QAFCOMPQAFCRQAFDIFQAFDWRITERAFFINTIPIP ?IPIPP?IPIPR?IPIQ@IPIQH@AIPLCPPCIPLEVdDIPLRRIDIPMAXNH.pHIPNEGIIPNTIIPONE`JIPOWERJIPP2PXKIPPFAC2LIPPGSDxMIPPNPRSM.NIPPPOIPPRODOIPPSCPIPPSR`RIPPVED0SIPQSIPQRSIPRANUIPRCHUIPRCHSVIPRCN1tWIPRCNPPXIPREADYIPRES[IPRICL4]IPRIM<^IPRIMO\^IPRIMS^IPRIMU`IPRIMWxaIPRISTbIPROD cIPROD2X2fIPROD3X2tgIPROD3X3hIPRODAjIPRPRStkIPRRIIplIPRRLS4rIPRRRIsIPRRSdtIPSCPPLvIPSFwIPSFBAwIPSFSDxIPSIFItyIPSIGN0zIPSMVHzIPSPRS4{IPSQRT|IPSRM<~IPSRMS@IPSRPIPSUBhIPSUMIPSUMNl.IPTPRIPTRHIPTR1IPTR1LVIPTRANpIPTRLVIPTRMVIPTRUNpIPVCHT\IPVDEG12xIPWRITEIQIQRIRANDpIREADIREMIROOTISATOMISFPF8ISFPIRISGCAISIGNFISLISTISNILISOBJECT0ISPD`ISPFAC2$ISPSFB<ISPTISQRT`ISUM@ISZERO@ITRUNCTIUPBEIIUPBES8IUPBHTIUPBRE<IUPCHTIUPFACIUPFDS<IUPIHT\IUPIIRIUPNT IUPQHIUPQHLIUPQSIUPRBdIUPRCIUPRLP4IUPSRIUPTPR0IUPTRlIUPTR1\IUPVAR̸IUPVOI8IUPVSIIUPWRITEHIUSFPF,IUSFPF2IWRITE.LASTCELLLBIBMSLBIBSDLBIMLCONCLDSMKBHLDSSBRLEINSTLELTI0LEROTLETTER$LEXNEXLLFSLINSPLINSRTxLIST104LIST3LIST48LIST5tLKAHEADLMERGELPERMdLREADLSRCHLWRITEMAIPDELMAIPDM MAIPHMMAIPP<MARKPMAX\MCPMVpMDCRAdMDDIFMDEXPMDHOMMDINV@MDINVBMDLCRADMDNEGMDPRODMDQ<MDRAN`MDSUMMEMBERMIAIM(MICINSMICS0MIDCRAMIDIF MIEXP<MIHOMMIINVMIN`MINEGtMINNCTMIPDIFMIPFSMMIPHOMLMIPIPRMIPISE MIPMIPMIPMON8MIPNEGpMIPPR MIPRAN4MIPRODMIPSUM$MIQMIRANMISUMMIUPQRMIUPSE MMDDETMMDNSBMMPDMAXMMPEVMMPIQRMPDIFTMPEMVMPEVAL MPEXPMPGCDC0MPHOMDMPINTMPIQHMPIQHLMPIQHSDMPMDPlMPMONMPNEG4MPPRODMPPSRMPQMPQRMPRANMPRESMPSPRSxMPSUM MPUCh MPUCPP MPUCS MPUPL MPUPP MPUQ MUPBQP MUPDDFMUPDERMUPEGCxMUPFBLMUPFS MUPGCDMUPHEG(MUPRANMUPRC<MUPRESMUPSFFpODDORDERPADVHPAIRPARTNPARTRPARTSSPBIN(PCLdPCOEFFPCONSTD PCPV PDBORD PDEGD!PDEGSV`!PDEGV!PDLOG2"PDPV#PERMCY#PERMR$PFBRE$PFDIP$PFDP%PHDQR&PICPV 'PINVH'PLBCF'PLDCF(PMDEG8(PMONX(PMONSVt(PMPMV(PNDQR)PORDL*PPERMV*PPLT$+PREDP+PRODUCTx+PRT,,PSDSV,PTBCF-PTMVl-PTV /PUFP/PUNT 0QREM0RED1RED21RED3,1RED4D1REDI`1REM1RIB1RILH2RILCl2RINEG2RINT2RIPROD3RIRNP5RISIGN5RISUML6RNABS6RNBCR6RNCEIL7RNCOMP,8RNDEN8RNDIF8RNDWRITE9RNFCL2P:RNFLOR:RNINTX;RNINVt;RNMAX;RNMIN;RNNEG<RNNUMH<RNP2d<RNPROD<RNQ=RNRAND=RNREAD>RNREDH>RNSIGN>RNSUM>RNWRITE@RPAFMEd@RPBLGS@RPDIFARPDMVCRPDWRITE4DRPEMVE.XF.`GRPFIPHRPIMVXIRPMAIPIRPNEGJ.JRPPRODKRPQRLRPRANMRPREADNRPRNPPRPSUMTQ.RRPWRITESRUPWRITETSDIFFUSDRVSECONDTXSEQUALlXSFCCONXSFCDIF0YSFCFRLYSFCIPhYSFCMSQYSFCNEGYSFCPRZSFCQZSFCRP[SFCS8[SFCSUM[SFIFIX\SFIRST]SFRABS]SFRDIF]SFRLS^SFRNEGLaSFRPRaSFRQxbSFRSUMtcSIGNLeSINTERheSLELTIeSMFMIfSMFMIPDfSREDf/$hSUBFROM # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/UltraSPARC/bin/supdate0000664002275300236100000000035514017255270020723 0ustar wcbrownscs#!/bin/csh if ($#argv != 1) then echo "Usage: supdate " else rcp $1 jade:/usr/local/saclib/`pwd | sed 's/.*\/saclib2.1/saclib2.1/g'`/. rcp $1 crocus:/usr/local/saclib/`pwd | sed 's/.*\/saclib2.1/saclib2.1/g'`/. endif saclib2.2.8/sysdep/archive/UltraSPARC/bin/mktexkwic0000664002275300236100000000242714017255270021266 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/UltraSPARC/bin/mktexkwic2.awk0000664002275300236100000000162714017255270022132 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/UltraSPARC/bin/strip1st.awk0000664002275300236100000000045514017255270021631 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/UltraSPARC/README0000664002275300236100000001112114017255270017434 0ustar wcbrownscs SPARC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sun SPARC Operating system: SunOS Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/SPARC/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/SPARC/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "SPARC" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1 Default compilation with mklib ---------------------------------- If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.1 Using gcc instead of cc ---------------------------- If you want to use a different C compiler such as the Gnu C compiler (gcc) all you need to do is set the environment variable CC. This can be accomplished with the command (setenv CC=gcc). ANSI C type type declarations can be used if the variable __STDC__ is set. To see how this is done look in the file include/sacsys.h 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/UltraSPARC/install0000664002275300236100000000331614017255270020154 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=SPARC # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." # setenv CC gcc mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/UltraSPARC/include/0000775002275300236100000000000014017255270020203 5ustar wcbrownscssaclib2.2.8/sysdep/archive/UltraSPARC/include/sacsys.h0000664002275300236100000000142214017255270021660 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/sequent/0000775002275300236100000000000014017255270016364 5ustar wcbrownscssaclib2.2.8/sysdep/archive/sequent/src/0000775002275300236100000000000014017255270017153 5ustar wcbrownscssaclib2.2.8/sysdep/archive/sequent/src/CLOCK.c0000664002275300236100000000104614017255270020153 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in milliseconds. ======================================================================*/ #include "saclib.h" #include #include #include Word CLOCK() { Word t; struct tms a; /* hide t; */ Step1: /* Get the system time. */ times(&a); t = a.tms_utime * 1000 / HZ; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/sequent/src/GC.c0000664002275300236100000000150614017255270017612 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { static int gc_dummy(); Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/archive/sequent/src/DPRNN.c0000664002275300236100000000237514017255270020207 0ustar wcbrownscs/*============================================================================ DPRNN(a,b; c1,c0) Digit product. Inputs a, b : nonnegative BETA-digits. Outputs c1, c0 : the unique nonnegative BETA-digits such that a * b = c1 * BETA + c0. Note: This program assumes that BETA = 2^29. ============================================================================*/ #include "saclib.h" void DPRNN(a,b, c1_,c0_) Word a,b, *c1_,*c0_; { BDigit a0,a1,b0,b1,c0,c1,d0,d1,dp,p0,p1,p10,p11,p2; const BDigit m15 = (1 << 15) - 1, m29 = (1 << 29) - 1, m30 = (1 << 30) - 1; Step1: /* Break apart the inputs. */ a0 = a & m15; a1 = a >> 15; b0 = b & m15; b1 = b >> 15; Step2: /* Multiply the parts. */ p0 = a0 * b0; p1 = a1 * b0 + a0 * b1; p2 = a1 * b1; Step3: /* Add the products in base 2^30. */ p10 = p1 & m15; p11 = p1 >> 15; d0 = p0 + (p10 << 15); dp = d0 >> 30; d0 = d0 & m30; d1 = p2 + p11 + dp; Step4: /* Convert to base 2^29. */ c0 = d0 & m29; dp = d0 >> 29; c1 = (d1 << 1) | dp; Return: /* Return c1 and c0. */ *c1_ = c1; *c0_ = c0; return; } saclib2.2.8/sysdep/archive/sequent/src/DQR.c0000664002275300236100000000262314017255270017750 0ustar wcbrownscs/*====================================================================== DQR(a1,a0,b; q,r) Digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 * a0 >= 0 and abs(b) > abs(a1). Outputs q : a BETA-integer, the integral part of (a1 * BETA + a0) / b. r : a BETA-integer, (a1 * BETA + a0) - b * q. ======================================================================*/ #include "saclib.h" void DQR(a1,a0,b, q_,r_) Word a1,a0,b, *q_,*r_; { Word ap0,ap1,bp,i,q,qp,r; /* hide algorithm */ Step1: /* a1 = 0. */ if (a1 == 0) { QREM(a0,b,&q,&r); goto Return; } Step2: /* Compute absolute values. */ ap1 = ABS(a1); ap0 = ABS(a0); bp = ABS(b); Step3: /* Shift and subtract. */ qp = 0; for (i = 1; i <= ZETA; i++) { ap1 = ap1 + ap1; ap0 = ap0 + ap0; if (ap0 >= BETA) { ap0 = ap0 - BETA; ap1 = ap1 + 1; } qp = qp + qp; if (ap1 >= bp) { ap1 = ap1 - bp; qp = qp + 1; } } Step4: /* Compute signs. */ if (a1 < 0) { qp = -qp; ap1 = -ap1; } if (b < 0) qp = -qp; q = qp; r = ap1; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/sysdep/archive/sequent/src/DPR.c0000664002275300236100000000316014017255270017744 0ustar wcbrownscs/*============================================================================ DPR(a,b; c1,c0) Digit product. Inputs a, b : BETA-digits. Outputs c1, c0 : the unique BETA-digits such that a * b = c1 * BETA + c0, with c1 * c0 >= 0. Note: This program assumes that BETA = 2^29. ============================================================================*/ #include "saclib.h" void DPR(a,b, c1_,c0_) Word a,b, *c1_,*c0_; { BDigit a0,a1,ap,b0,b1,bp,c0,c1,d0,d1,dp,p0,p1,p10,p11,p2,s; const BDigit m15 = (1 << 15) - 1, m29 = (1 << 29) - 1, m30 = (1 << 30) - 1; Step1: /* Compute absolute values of inputs. */ s = 1; if (a < 0) { ap = -a; s = -s; } else ap = a; if (b < 0) { bp = -b; s = -s; } else bp = b; Step2: /* Break apart the inputs. */ a0 = ap & m15; a1 = ap >> 15; b0 = bp & m15; b1 = bp >> 15; Step3: /* Multiply the parts. */ p0 = a0 * b0; p1 = a1 * b0 + a0 * b1; p2 = a1 * b1; Step4: /* Add the products in base 2^30. */ p10 = p1 & m15; p11 = p1 >> 15; d0 = p0 + (p10 << 15); dp = d0 >> 30; d0 = d0 & m30; d1 = p2 + p11 + dp; Step5: /* Convert to base 2^29. */ c0 = d0 & m29; dp = d0 >> 29; c1 = (d1 << 1) | dp; Step6: /* Give correct signs to c1 and c0. */ if (s < 0) { c1 = -c1; c0 = -c0; } Return: /* Return c1 and c0. */ *c1_ = c1; *c0_ = c0; return; } saclib2.2.8/sysdep/archive/sequent/bin/0000775002275300236100000000000014017255270017134 5ustar wcbrownscssaclib2.2.8/sysdep/archive/sequent/bin/mklib0000664002275300236100000000327114017255270020160 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=gcc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make -P15 CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make -P15 CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make -P15 CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make -P15 CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make -P15 CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make -P15 CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/sequent/bin/sdesc0000664002275300236100000000240114017255270020155 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/sequent/bin/mkproto.awk0000664002275300236100000000265214017255270021340 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/sequent/bin/mktexkwic.sed0000664002275300236100000000057314017255270021644 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/sequent/bin/mkkwic.awk0000664002275300236100000000306114017255270021125 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/sequent/bin/l2b.awk0000664002275300236100000000246114017255270020322 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/sequent/bin/mktexkwic.awk0000664002275300236100000000303714017255270021651 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/sequent/bin/mkmspec.awk0000664002275300236100000000020514017255270021274 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/sequent/bin/mkdesc.awk0000664002275300236100000000164414017255270021113 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/sequent/bin/mkproto0000664002275300236100000000072214017255270020553 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/sequent/bin/mkdesc0000664002275300236100000000141614017255270020327 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/sequent/bin/mktexkwic1.awk0000664002275300236100000000031714017255270021730 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/sequent/bin/mkkwic.sed0000664002275300236100000000023414017255270021115 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/sequent/bin/sman0000664002275300236100000000035614017255270020021 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/sequent/bin/mkmake0000664002275300236100000000523114017255270020325 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Sequent 'make' allows parallel compilation. # set SPECIAL='$&' # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[cs] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/sequent/bin/mkmspec0000664002275300236100000000042714017255270020521 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/sequent/bin/b2l.awk0000664002275300236100000000106114017255270020315 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/sequent/bin/mkspec0000664002275300236100000000040614017255270020341 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/sequent/bin/mkkwic0000664002275300236100000000234614017255270020351 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are $saclib/doc/desc.doc, # 8, 43 and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/sequent/bin/subst0000664002275300236100000000141614017255270020221 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/sequent/bin/mktexkwic0000664002275300236100000000242414017255270021067 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif awk -f $saclib/bin/b2l.awk $infile |\ awk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ awk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/sequent/bin/mktexkwic2.awk0000664002275300236100000000162714017255270021736 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/sequent/bin/strip1st.awk0000664002275300236100000000045514017255270021435 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/sequent/README0000664002275300236100000001144614017255270017252 0ustar wcbrownscs SEQUENT INSTALLATION INFORMATION ================================ 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sequent Operating system: UNIX System V Shell: csh C Compiler: GNU C (gcc) 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/sequent/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/sequent/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "sequent" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. If you ran into trouble here because you do not have the GNU C-compiler 'gcc' installed then see Section 3. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1. Compiling with 'gcc' ------------------------- If you have 'gcc', there should not be any problems and during the installation a standard version of the library should have been compiled. If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.2. Compiling with standard 'cc' --------------------------------- The simplest way to define the standard 'cc' as the default compiler for SACLIB is to define an environment variable 'CC' by "setenv CC cc". This causes 'mklib' to use the standard 'cc' command for compilation. After these changes, you can proceed as described in Section 3.1. 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/sequent/install0000664002275300236100000000327214017255270017761 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=sequent # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB library ..." mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' file to make the installation complete." saclib2.2.8/sysdep/archive/sequent/include/0000775002275300236100000000000014017255270020007 5ustar wcbrownscssaclib2.2.8/sysdep/archive/sequent/include/sacsys.h0000664002275300236100000000142214017255270021464 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/linux/0000775002275300236100000000000014017255270016037 5ustar wcbrownscssaclib2.2.8/sysdep/archive/linux/src/0000775002275300236100000000000014017255270016626 5ustar wcbrownscssaclib2.2.8/sysdep/archive/linux/src/FPHAND.c.debian0000664002275300236100000000201314017255270021147 0ustar wcbrownscs/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. ======================================================================*/ #include "saclib.h" #include #include #include void FPHAND(i,p) int i; struct sigcontext p; { Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ // p = (struct sigcontext *)uap; p.fpstate->cw |= (_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/linux/src/CLOCK.c0000664002275300236100000000106714017255270017631 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in millisecconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; struct rusage r; struct timeval v; Step1: /* Get the system time. */ getrusage(RUSAGE_SELF, &r); v = r.ru_utime; t = v.tv_sec * 1000 + v.tv_usec / 1000; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/linux/src/FPCATCH.c0000664002275300236100000000244414017255270020046 0ustar wcbrownscs/*====================================================================== FPCATCH() Floating-point catch. Side Effects This function: 1) Sets FPHAND as the exception handling funciton for floating- point exceptions. 2) Sets overflow, underflow, and divide-by-zero as errors which result in traps. 3) Sets FPFLAG, a global variable that indicates whether a floating-point error has occured, to zero --- i.e. no error. ======================================================================*/ #include "saclib.h" #include #include #include void FPCATCH() { fpu_control_t cw; struct sigaction *p; Step1: /* Set FPHAND as the handler for floating point exceptions. */ p = (struct sigaction *)malloc(sizeof(struct sigaction)); p->sa_handler = FPHAND; sigemptyset(&(p->sa_mask)); p->sa_flags = SA_ONESHOT | SA_SIGINFO; sigaction(SIGFPE,p,NULL); Step2: /* Set exceptions that actually cause traps. This must include overflow and underflow. */ _FPU_GETCW(cw); cw &= ~(_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM); _FPU_SETCW(cw); Step3: /* Set error flag to zero. */ FPFLAG = 0; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/linux/src/FPHAND.c0000664002275300236100000000203114017255270017726 0ustar wcbrownscs/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. This function is system dependent: Linux kernel v2.2 ======================================================================*/ #include "saclib.h" void FPHAND(i,sip,uap) int i; siginfo_t* sip; void* uap; { ucontext_t *p; Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ p = (ucontext_t*)uap; (p->uc_mcontext.fpregs)->cw |= (_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/linux/src/GC.c0000664002275300236100000000155314017255270017267 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { static int gc_dummy(); Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/archive/linux/README0000664002275300236100000000232214017255270016716 0ustar wcbrownscsSaclib2.1 for PC's runninx linux -------------------------------- 1. The src contains the system dependent source files you'll need. 2. The includes directory contains the hfloats.h appropriate to linux on PC's. 3. Comment out the "#define BIG_ENDIAN" in sacsys.h. This environment variable already exists in the linux C files. 4. You might want to make sure that bin/mklib doesn't contain any compiler flags that won't make sense on your system. Also, be sure to set the environment variable CC = gcc, or else change bin/mklib so that gcc (rather than cc) is the default value for CC. Note: Debian linux seems not to have the ucontext.h file required by FPHAND. I don't know if this is a version problem or what, but other linux's seem okay with it. Try using src/FPHAND.c.debian instead of src/FPHAND.c. LOG: 06/18/2002 - Changed FPCATCH line 27 from p->sa_handler = FPHAND; to p->sa_sigaction = FPHAND; The reason for this is that sa_handler only takes an int as an arguments, whereas sa_sigaction takes the three parameters specified by FPHAND. This doesn't affect anything in reality other than the type checking, since the OS doesn't really distinguish! saclib2.2.8/sysdep/archive/linux/include/0000775002275300236100000000000014017255270017462 5ustar wcbrownscssaclib2.2.8/sysdep/archive/linux/include/hfloats.h0000664002275300236100000000367314017255270021304 0ustar wcbrownscs/*=============================================== hfloats.h Header file for hardware floats routines. ===============================================*/ /* ----------------------------------------*/ /* Include */ /* ----------------------------------------*/ #include #include #include /* ----------------------------------------*/ /* Hardware Floats */ /* ----------------------------------------*/ /* DECstations: */ typedef struct { unsigned mant_l : 32; unsigned mant_h : 20; unsigned exp : 11; unsigned sign : 1; } ieee_rep; /* SPARCstations: typedef struct { unsigned sign : 1; unsigned exp : 11; unsigned mant_h : 20; unsigned mant_l : 32; } ieee_rep; */ typedef union { double num; ieee_rep rep; } ieee; #define BIAS 1023 #define MAXEXP 1023 #define MAXEXP1 1024 #define MINEXP -1022 #define MINEXP1 -1023 #define PREC 53 #define PREC1 52 /* ----------------------------------------*/ /* Rounding modes */ /* ----------------------------------------*/ /* DECstations: */ /* #define rounddown() swapRM(ROUND_TO_MINUS_INFINITY) */ /* #define roundup() swapRM(ROUND_TO_PLUS_INFINITY) */ /* Sun SPARCs: see also man ieee_flags and /usr/include/ieeefp.h */ /* #define rounddown() fpsetround(FP_RM) */ /* #define roundup() fpsetround(FP_RP) */ /* Linux */ #define rounddown() { fpu_control_t cw; _FPU_GETCW(cw); cw= (cw & ~0x0C00)|_FPU_RC_DOWN; _FPU_SETCW(cw); } #define roundup() { fpu_control_t cw; _FPU_GETCW(cw); cw= (cw & ~0x0C00)|_FPU_RC_UP; _FPU_SETCW(cw); } /* ----------------------------------------*/ /* Hardware intervals */ /* ----------------------------------------*/ typedef struct { double left, right; } interval; static interval izero = { 0.0, 0.0 }; static interval ione = { 1.0, 1.0 }; saclib2.2.8/sysdep/archive/ultrix/0000775002275300236100000000000014017255270016227 5ustar wcbrownscssaclib2.2.8/sysdep/archive/ultrix/src/0000775002275300236100000000000014017255270017016 5ustar wcbrownscssaclib2.2.8/sysdep/archive/ultrix/src/FAIL.c0000664002275300236100000001461714017255270017706 0ustar wcbrownscs/*====================================================================== FAIL(algName,msg,...) Failure handler. Inputs algName : the name of the algorithm which called this algorithm. msg : a string giving the reason for the failure. ... : any other arguments that the calling algorithm passed. Side effects This algorithm display the information about why the failure occurred and aborts the whole program. ======================================================================*/ #include "saclib.h" #include #include void FAIL(char *algName, char *msg,...) { va_list argPtr; extern int strcmp(); Step1: /* Basic message. */ SWRITE("\n\n"); SWRITE("Failure occurred in: "); SWRITE(algName); SWRITE("\n"); SWRITE("Reason for the failure: "); SWRITE(msg); SWRITE("\n\n"); Step2: /* Failures from the SACLIB library. */ va_start(argPtr,msg); /* GCSI marking stack */ if (!strcmp(algName,"GCSI (marking stack)")) { /* Note that this step is NOT portable since we are assuming that pointers fit into integers. */ SWRITE("BACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); SWRITE("EACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); goto Abort; } /* GCSI final check */ if (!strcmp(algName,"GCSI (final check)")) { SWRITE("N = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("NU = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("RHO = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* GREAD */ if (!strcmp(algName,"GREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* AREAD */ if (!strcmp(algName,"AREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* LREAD */ if (!strcmp(algName,"LREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IREAD */ if (!strcmp(algName,"IREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIIPREAD */ if (!strcmp(algName,"DIIPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIRPREAD */ if (!strcmp(algName,"DIRPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IPREAD */ if (!strcmp(algName,"IPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* RPREAD */ if (!strcmp(algName,"RPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VLREAD */ if (!strcmp(algName,"VLREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VREAD */ if (!strcmp(algName,"VREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* SFRLS */ if (!strcmp(algName,"SFRLS")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("a = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("e = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRQ */ if (!strcmp(algName,"SFRQ")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRSUM */ if (!strcmp(algName,"SFRSUM")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* MAIPDM */ if (!strcmp(algName,"MAIPDM")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("b = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("bp = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(PRIME)); SWRITE("\n"); goto Abort; } /* MMPDMA */ if (!strcmp(algName,"MMPDMA")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("p = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* IPGCDC */ if (!strcmp(algName,"IPGCDC")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("gb = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(PRIME)); SWRITE("\n"); goto Abort; } /* IPRES */ if (!strcmp(algName,"IPRES")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("f = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("Q = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of PRIME list = "); GWRITE(LENGTH(PRIME)); SWRITE("\n"); goto Abort; } /* AFINV */ if (!strcmp(algName,"AFINV")) { SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } Abort: /* Prepare for abort. */ SWRITE("\n\nNow the FAIL handler is aborting the program ...\n"); va_end(argPtr); abort(); Exit: /* Prepare for exit. */ SWRITE("\n\nNow the FAIL handler is exiting the program ...\n"); va_end(argPtr); exit(1); } saclib2.2.8/sysdep/archive/ultrix/src/GETREGSTR.s0000664002275300236100000000376514017255270020563 0ustar wcbrownscs ################################################################# # void GETREGSTR(Word register_buff[], Word *num_registers, char **stack_top) ################################################################# # Get the registers. # # Outputs # register_buff: filled with the values of the registers # which might contain saclib list locations. # num_registers: the number of registers values stored in # the buffer. # stack_top: the current top-of-stack. # # Environment # Processor: MIPS R2000 or R3000 # Assembler: MIPS Assembler # Operating system: UNIX # Computer: DEC station # # Notes for programmers # Please refer to the following book for further details: # "mips RISC Architecture", # by Gerry Kane, # Prentice Hall # ISBN 0-13-584749-4 # Especially Appendix D is helpful. # # Remarks # Most probably it would suffice to store only s0-s8. # But to free me from anxiety, I decided to store every # registers except the followings six registers: # zero, AT, k0, k1, gp, sp # # Written by Hoon Hong April 6th 1991 ################################################################ #include .globl GETREGSTR ## Prologue. .ent GETREGSTR GETREGSTR: .frame sp, 0, ra sw v0, 0(a0) ## Store user registers into register_buff. */ sw v1, 4(a0) sw a0, 8(a0) sw a1, 12(a0) sw a2, 16(a0) sw a3, 20(a0) sw t0, 24(a0) sw t1, 28(a0) sw t2, 32(a0) sw t3, 36(a0) sw t4, 40(a0) sw t5, 44(a0) sw t6, 48(a0) sw t7, 52(a0) sw s0, 56(a0) sw s1, 60(a0) sw s2, 64(a0) sw s3, 68(a0) sw s4, 72(a0) sw s5, 76(a0) sw s6, 80(a0) sw s7, 84(a0) sw t8, 88(a0) sw t9, 92(a0) sw s8, 96(a0) sw ra, 100(a0) li t0, 26 ## Store 26 into num_register. */ sw t0, 0(a1) or t0, sp, 0 ## Store the top-of-stack adddress. */ sw t0, 0(a2) j ra ## Epillogue. .end GETREGSTR saclib2.2.8/sysdep/archive/ultrix/src/CLOCK.c0000664002275300236100000000104214017255270020012 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in milliseconds. For 60 Hz cpu-clock. ======================================================================*/ #include "saclib.h" #include #include Word CLOCK() { Word t; struct tms a; /* hide t; */ Step1: /* Get the system time. */ times(&a); t = a.tms_utime * 100 / 6; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/ultrix/src/DPR.s0000664002275300236100000000775314017255270017643 0ustar wcbrownscs ###################################################### # void DPR(Word a, Word b, Word *c_, Word *d_) ###################################################### # Digit Product. # # Inputs # a, b : beta-digits. # # Outputs # c, d : the unique beta-digits such that a*b = c*beta+d and c*d >= 0. # # Environement # Processor: MIPS R2000 or R3000 # Assembler: MIPS Assembler # Operating system: UNIX # Computer: DEC station # # Notes for programmers # Please refer to the following book for further details: # "mips RISC Architecture", # by Gerry Kane, # Prentice Hall # ISBN 0-13-584749-4 # Especially Appendix D is helpful. # According to the terminology of the book, this routine can be # classified as "leaf without stack storage for local variables". # # Remarks # One might investigate the possibility of utilizing the # branch delay slots. (though it is not neccessary in this # case, since the "mult" takes 10 cycles.) # # Written by Hoon Hong April 5th 1991 ####################################################### #=====================================================# # Register Allocation # #=====================================================# #include #define a a0 #define b a1 #define c_ a2 #define d_ a3 #define c t2 #define d t3 #define high t0 #define low t1 #define mask t7 #define temp0 t4 #define temp1 t5 #define temp2 t6 #=====================================================# # Assembly code # #=====================================================# #-------------------------------------------------------# .globl DPR ## Define DPR as external. .ent DPR ## Tell debugger this starts DPR. DPR: ## This is the entry point. .frame sp, 0, ra ## Define frame size, return reg. #-------------------------------------------------------# mult a ,b ## Takes 10 cycles, and the following ## instructios are executed in parallel. #-------------------------------------------------------# beq a, zero, ab_zero ## Classifying the cases. beq b, zero, ab_zero ## bltz a, a_negative ## bltz b, ab_negative ## #-------------------------------------------------------# ab_positive: ## You get here if a * b > 0. addi temp2, zero, -1 ## mask <-- 0001...1 srl mask, temp2, 3 ## mfhi high ## Get the result of "mult a, b". mflo low ## and d, low, mask ## d <--- 000 low28...0 sll temp0, high, 3 ## c <--- high28...0 low31..29 srl temp1, low, 29 ## or c, temp0, temp1 ## sw c, 0(c_) ## *c_ <--- c. sw d, 0(d_) ## *d_ <--- d. j ra ## Return to the caller. #-------------------------------------------------------# a_negative: ## Classifying the cases. bltz b, ab_positive #-------------------------------------------------------# ab_negative: ## You get here if a * b < 0. lui mask, 0xE000 ## mask <--- 1110...0 = - beta. mfhi high ## Get the result of "mult a, b". mflo low ## or d, low, mask ## d <--- 111 low28...0 sll temp0, high, 3 ## c <--- high28...0 low31..29. srl temp1, low, 29 ## or c, temp0, temp1 ## beq d, mask, degenerate ## Classifying the subcases. #------------------------------------------------# nondegenerate: ## You get here if d > -beta. addi c, c, 1 ## c <--- c + 1. sw c, 0(c_) ## *c_ <--- c. sw d, 0(d_) ## *d_ <--- d. j ra ## Return to the caller. #------------------------------------------------# degenerate: ## You get here if d = -beta. sw c, 0(c_) ## *c_ <--- c. sw zero, 0(d_) ## *d_ <--- 0. j ra ## Return to the caller. #-------------------------------------------------------# ab_zero: ## You get here if a * b = 0. sw zero, 0(c_) ## *c_ <--- 0. sw zero, 0(d_) ## *d_ <--- 0. j ra ## Return to the caller. #-------------------------------------------------------# .end DPR ## This the end of the code. saclib2.2.8/sysdep/archive/ultrix/src/GC.c0000664002275300236100000000122714017255270017455 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. Remarks This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { Word num_registers,register_buff[400]; char *EACSTACK; GETREGSTR(register_buff, &num_registers, &EACSTACK); GCSI(sizeof(Word),EACSTACK); } saclib2.2.8/sysdep/archive/ultrix/src/DQR.c0000664002275300236100000000262314017255270017613 0ustar wcbrownscs/*====================================================================== DQR(a1,a0,b; q,r) Digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 * a0 >= 0 and abs(b) > abs(a1). Outputs q : a BETA-integer, the integral part of (a1 * BETA + a0) / b. r : a BETA-integer, (a1 * BETA + a0) - b * q. ======================================================================*/ #include "saclib.h" void DQR(a1,a0,b, q_,r_) Word a1,a0,b, *q_,*r_; { Word ap0,ap1,bp,i,q,qp,r; /* hide algorithm */ Step1: /* a1 = 0. */ if (a1 == 0) { QREM(a0,b,&q,&r); goto Return; } Step2: /* Compute absolute values. */ ap1 = ABS(a1); ap0 = ABS(a0); bp = ABS(b); Step3: /* Shift and subtract. */ qp = 0; for (i = 1; i <= ZETA; i++) { ap1 = ap1 + ap1; ap0 = ap0 + ap0; if (ap0 >= BETA) { ap0 = ap0 - BETA; ap1 = ap1 + 1; } qp = qp + qp; if (ap1 >= bp) { ap1 = ap1 - bp; qp = qp + 1; } } Step4: /* Compute signs. */ if (a1 < 0) { qp = -qp; ap1 = -ap1; } if (b < 0) qp = -qp; q = qp; r = ap1; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/sysdep/archive/ultrix/bin/0000775002275300236100000000000014017255270016777 5ustar wcbrownscssaclib2.2.8/sysdep/archive/ultrix/bin/mklib0000664002275300236100000000324014017255270020017 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/ultrix/bin/sdesc0000664002275300236100000000240114017255270020020 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/ultrix/bin/mkproto.awk0000664002275300236100000000265214017255270021203 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/ultrix/bin/mktexkwic.sed0000664002275300236100000000057314017255270021507 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/ultrix/bin/mkkwic.awk0000664002275300236100000000306114017255270020770 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/ultrix/bin/l2b.awk0000664002275300236100000000246114017255270020165 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/ultrix/bin/mktexkwic.awk0000664002275300236100000000303714017255270021514 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/ultrix/bin/mkmspec.awk0000664002275300236100000000020514017255270021137 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/ultrix/bin/mkdesc.awk0000664002275300236100000000164414017255270020756 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/ultrix/bin/mkproto0000664002275300236100000000072214017255270020416 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/ultrix/bin/mkdesc0000664002275300236100000000141614017255270020172 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/ultrix/bin/mktexkwic1.awk0000664002275300236100000000031714017255270021573 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/ultrix/bin/mkkwic.sed0000664002275300236100000000023414017255270020760 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/ultrix/bin/sman0000664002275300236100000000035614017255270017664 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/ultrix/bin/mkmake0000664002275300236100000000561614017255270020177 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.c |\ awk -F. '{\ printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0;\ printf "\tld -r -s %s.o\n",$1;\ printf "\tmv a.out %s.o\n",$1;\ }' >>$MAKEFILE /bin/ls *.s |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\tcc ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/ultrix/bin/mkmspec0000664002275300236100000000042714017255270020364 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/ultrix/bin/b2l.awk0000664002275300236100000000106114017255270020160 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/ultrix/bin/mkspec0000664002275300236100000000040614017255270020204 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/ultrix/bin/mkkwic0000664002275300236100000000234614017255270020214 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are $saclib/doc/desc.doc, # 8, 43 and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/ultrix/bin/subst0000664002275300236100000000141614017255270020064 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/ultrix/bin/mktexkwic0000664002275300236100000000242414017255270020732 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif awk -f $saclib/bin/b2l.awk $infile |\ awk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ awk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/ultrix/bin/mktexkwic2.awk0000664002275300236100000000162714017255270021601 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/ultrix/bin/strip1st.awk0000664002275300236100000000045514017255270021300 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/ultrix/README0000664002275300236100000001017214017255270017110 0ustar wcbrownscs ULTRIX INSTALLATION INFORMATION =============================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: DECstation Operating system: Ultrix Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/ultrix/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/ultrix/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "generic" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/ultrix/install0000664002275300236100000000335314017255270017624 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=ultrix # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo 'Creating $saclib/include/sacproto.h ...' mkproto echo "Creating makefiles ..." mkmake echo "Compiling optimized SACLIB library ..." mklib opt ln -s $saclib/lib/saclibo.a $saclib/lib/saclib.a # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' file to make the installation complete." saclib2.2.8/sysdep/archive/ultrix/include/0000775002275300236100000000000014017255270017652 5ustar wcbrownscssaclib2.2.8/sysdep/archive/ultrix/include/sacsys.h0000664002275300236100000000136514017255270021335 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Use this definition if compiler does support function prototypes. */ #define P__(A) A #endif saclib2.2.8/sysdep/archive/Solaris/0000775002275300236100000000000014017255270016314 5ustar wcbrownscssaclib2.2.8/sysdep/archive/Solaris/notes0000664002275300236100000000121314017255270017364 0ustar wcbrownscs1) Need to use assembly GC routines to dump register windows. flush and get_pointers 2) Modified mkmake so that *.s files are properly assembled. Need to make sure cpp is run so that include files are included. 3) use varargs 4) set CC=cc (note this is K&R C and does not have parameter types). this should be set in install (want to be able to use gcc) In this case need to define __STDC__ in sacsys.h 5) Need to use ranlib instead of ar ts 6) changed the environment variable "system" to SPARC in install 7) I had to remove the reference to SACFLAGS in AFLAGS (in mkmake) since as doesn't accept flags such as -g and -O. saclib2.2.8/sysdep/archive/Solaris/src/0000775002275300236100000000000014017255270017103 5ustar wcbrownscssaclib2.2.8/sysdep/archive/Solaris/src/notes0000664002275300236100000000121314017255270020153 0ustar wcbrownscs1) Need to use assembly GC routines to dump register windows. flush and get_pointers 2) Modified mkmake so that *.s files are properly assembled. Need to make sure cpp is run so that include files are included. 3) use varargs 4) set CC=cc (note this is K&R C and does not have parameter types). this should be set in install (want to be able to use gcc) In this case need to define __STDC__ in sacsys.h 5) Need to use ranlib instead of ar ts 6) changed the environment variable "system" to SPARC in install 7) I had to remove the reference to SACFLAGS in AFLAGS (in mkmake) since as doesn't accept flags such as -g and -O. saclib2.2.8/sysdep/archive/Solaris/src/FAIL.c0000664002275300236100000001476114017255270017773 0ustar wcbrownscs/*====================================================================== FAIL(algName,msg,...) Failure handler. Inputs algName : the name of the algorithm which called this algorithm. msg : a string giving the reason for the failure. ... : any other arguments that the calling algorithm passed. Side effects This algorithm display the information about why the failure occurred and aborts the whole program. ======================================================================*/ #include "saclib.h" #include #include #ifdef __STDC__ void FAIL(char *algName, char *msg,...) #else void FAIL(algName,msg) char *algName; char *msg; #endif { va_list argPtr; extern int strcmp(); Step1: /* Basic message. */ SWRITE("\n\n"); SWRITE("Failure occurred in: "); SWRITE(algName); SWRITE("\n"); SWRITE("Reason for the failure: "); SWRITE(msg); SWRITE("\n\n"); Step2: /* Failures from the SACLIB library. */ va_start(argPtr,msg); /* GCSI marking stack */ if (!strcmp(algName,"GCSI (marking stack)")) { /* Note that this step is NOT portable since we are assuming that pointers fit into integers. */ SWRITE("BACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); SWRITE("EACSTACK = "); GWRITE((int)va_arg(argPtr,char *)); SWRITE("\n"); goto Abort; } /* GCSI final check */ if (!strcmp(algName,"GCSI (final check)")) { SWRITE("N = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("NU = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("RHO = "); GWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* GREAD */ if (!strcmp(algName,"GREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* AREAD */ if (!strcmp(algName,"AREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* LREAD */ if (!strcmp(algName,"LREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IREAD */ if (!strcmp(algName,"IREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIIPREAD */ if (!strcmp(algName,"DIIPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* DIRPREAD */ if (!strcmp(algName,"DIRPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* IPREAD */ if (!strcmp(algName,"IPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* RPREAD */ if (!strcmp(algName,"RPREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VLREAD */ if (!strcmp(algName,"VLREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* VREAD */ if (!strcmp(algName,"VREAD")) { SWRITE("C = "); CWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Exit; } /* SFRLS */ if (!strcmp(algName,"SFRLS")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("a = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("e = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRQ */ if (!strcmp(algName,"SFRQ")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* SFRSUM */ if (!strcmp(algName,"SFRSUM")) { SWRITE("u = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("v = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("g = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* MAIPDM */ if (!strcmp(algName,"MAIPDM")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("b = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("bp = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* MMPDMA */ if (!strcmp(algName,"MMPDMA")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("p = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } /* IPGCDC */ if (!strcmp(algName,"IPGCDC")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("gb = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* IPRES */ if (!strcmp(algName,"IPRES")) { SWRITE("r = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("f = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("Q = "); IWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("The current length of LPRIME list = "); GWRITE(LENGTH(LPRIME)); SWRITE("\n"); goto Abort; } /* AFINV */ if (!strcmp(algName,"AFINV")) { SWRITE("M = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("A = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); SWRITE("B = "); OWRITE(va_arg(argPtr,int)); SWRITE("\n"); goto Abort; } Abort: /* Prepare for abort. */ SWRITE("\n\nNow the FAIL handler is aborting the program ...\n"); va_end(argPtr); abort(); Exit: /* Prepare for exit. */ SWRITE("\n\nNow the FAIL handler is exiting the program ...\n"); va_end(argPtr); exit(1); } saclib2.2.8/sysdep/archive/Solaris/src/CLOCK.c0000664002275300236100000000106714017255270020106 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in millisecconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; struct rusage r; struct timeval v; Step1: /* Get the system time. */ getrusage(RUSAGE_SELF, &r); v = r.ru_utime; t = v.tv_sec * 1000 + v.tv_usec / 1000; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/Solaris/src/FPCATCH.c0000664002275300236100000000221414017255270020316 0ustar wcbrownscs/*====================================================================== FPCATCH() Floating-point catch. Side Effects This function: 1) Sets FPHAND as the exception handling funciton for floating- point exceptions. 2) Sets overflow, underflow, and divide-by-zero as errors which result in traps. 3) Sets FPFLAG, a global variable that indicates whether a floating-point error has occured, to zero --- i.e. no error. ======================================================================*/ #include "saclib.h" #include #include void FPCATCH() { struct sigaction *p; Step1: /* Set hand as the handler for floating point exceptions. */ p = (struct sigaction *)malloc(sizeof(struct sigaction)); p->sa_handler = NULL; p->sa_sigaction = FPHAND; sigemptyset(&(p->sa_mask)); p->sa_flags = SA_SIGINFO; sigaction(SIGFPE,p,NULL); Step2: /* Set exceptions that actually cause traps. */ fpsetmask(FP_X_OFL | FP_X_UFL | FP_X_DZ); Step3: /* Set error flag to zero. */ FPFLAG = 0; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/Solaris/src/DPR.s0000664002275300236100000000411314017255270017713 0ustar wcbrownscs! ! DPR(a,b;c,d) ! [Digit product. a and b are beta-digits. c and d are the unique ! beta-digits such that a*b=c*beta+d and c*d>=0.] ! This version of DPR is written for the UNIX assembler running on the ! Sun SPARC version 8 architecture. ! Author: Todd Torgersen ! Last Modified: Oct. 12, 1997, Jeremy Johnson ! .seg "text" .global DPR DPR: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 ! Take the absolute value of the operands, store sign in %o5. tst %o0 bge 1f xor %o0,%o1,%o5 ! Store sign of result in delay slot. sub %g0,%o0,%o0 ! it's a SPARC :-) 1: tst %o1 bge 2f mov %o0, %y ! Load the y register in the delay slot. sub %g0,%o1,%o1 ! 2: andcc %g0, %g0 ,%o4 ! Zero the partial product and clear N and V. nop ! I don't know why, but this thing does ! not work without this "nop". ! 29 bit multiply ! mulscc %o4, %o1, %o4 ! 1st iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 10th iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 20th iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 29th iteration. mulscc %o4, %g0, %o4 ! The last iteration does necessary shift. rd %y, %g1 ! Read the y register. Least significant bits. srl %g1, 3, %g1 ! Right justify the 29 bits. ! Fix the signs of the output. tst %o5 bge 4f nop ! Nothing in the delay slot. sub %g0, %g1,%g1 sub %g0, %o4,%o4 4: st %g1, [%o3] ! Send least significant bits back. st %o4, [%o2] ! Send most significant bits back. LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/Solaris/src/bin/0000775002275300236100000000000014017255270017653 5ustar wcbrownscssaclib2.2.8/sysdep/archive/Solaris/src/bin/mklib0000664002275300236100000000324014017255270020673 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif if ($1 == "std") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/obj make CC=$CC SACFLAG= EXTENSION= popd >/dev/null pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=$CC SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/Solaris/src/bin/sdesc0000664002275300236100000000240114017255270020674 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - saclib2.2.8/sysdep/archive/Solaris/src/bin/mkproto.awk0000664002275300236100000000265214017255270022057 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/Solaris/src/bin/mktexkwic.sed0000664002275300236100000000061114017255270022354 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/Solaris/src/bin/mkkwic.awk0000664002275300236100000000306114017255270021644 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/Solaris/src/bin/l2b.awk0000664002275300236100000000246114017255270021041 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/Solaris/src/bin/mktexkwic.awk0000664002275300236100000000303714017255270022370 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/Solaris/src/bin/mkmspec.awk0000664002275300236100000000020514017255270022013 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/Solaris/src/bin/mkdesc.awk0000664002275300236100000000164414017255270021632 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/Solaris/src/bin/mkproto0000664002275300236100000000072214017255270021272 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName,char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/Solaris/src/bin/mkdesc0000664002275300236100000000141614017255270021046 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/Solaris/src/bin/mktexkwic1.awk0000664002275300236100000000031714017255270022447 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/Solaris/src/bin/mkkwic.sed0000664002275300236100000000023414017255270021634 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/Solaris/src/bin/sman0000664002275300236100000000035614017255270020540 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/Solaris/src/bin/mkmake0000664002275300236100000000561714017255270021054 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = /bin/as # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[c] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE /bin/ls *.[s] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/Solaris/src/bin/mkmspec0000664002275300236100000000042714017255270021240 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/Solaris/src/bin/b2l.awk0000664002275300236100000000106114017255270021034 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/Solaris/src/bin/mkspec0000664002275300236100000000040614017255270021060 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/Solaris/src/bin/mkkwic0000664002275300236100000000235114017255270021064 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/Solaris/src/bin/mkmake.old0000664002275300236100000000533714017255270021630 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/obj/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[cs] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/Solaris/src/bin/subst0000664002275300236100000000141614017255270020740 0ustar wcbrownscs#! /bin/csh # USAGE: # subst [-b] # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/Solaris/src/bin/mktexkwic0000664002275300236100000000242714017255270021611 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/Solaris/src/bin/mktexkwic2.awk0000664002275300236100000000162714017255270022455 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/Solaris/src/bin/strip1st.awk0000664002275300236100000000045514017255270022154 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/Solaris/src/flush.s0000664002275300236100000000066714017255270020421 0ustar wcbrownscs!Sparcstation SLC assembler routine to flush register windows. !This routine is coded as a leaf routine, !i.e. it does not get its own window. !Author: N.J.Nevin: 20 Nov 90 #include .seg "text" ! void ! flush_windows(void) .globl flush_windows flush_windows: ta ST_FLUSH_WINDOWS !call software trap to flush !register windows to stack jmpl %o7+8, %g0 !return to caller nop !delay slot saclib2.2.8/sysdep/archive/Solaris/src/FPHAND.c0000664002275300236100000000213014017255270020203 0ustar wcbrownscs/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. This function is system dependent: for SunOS 5.6. ======================================================================*/ #include "saclib.h" #include #include void FPHAND(i,sip,uap) int i; siginfo_t* sip; void* uap; { struct ucontext *p; Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ p = (struct ucontext*)uap; p->uc_mcontext.fpregs.fpu_fsr &= (~( (FP_X_INV | FP_X_OFL | FP_X_UFL | FP_X_DZ | FP_X_IMP) << 23) ); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/archive/Solaris/src/DPRNN.s0000664002275300236100000000322714017255270020154 0ustar wcbrownscs! DPRNN(a,b;c,d) ! [Digit product, non-negative. a and b are non-negative beta-digits. ! c and d are the unique beta-digits such that a*b=c*beta+d and c*d>=0.] ! This version of DPR is written for the SPARC V8 architecture. ! Author: Jeremy Johnson ! Written: Nov. 7, 1997 .seg "text" .global DPRNN DPRNN: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 mov %o0, %y ! Load the y register in the delay slot. andcc %g0, %g0 ,%o4 ! Zero the partial product and clear N and V. ! ! 29 bit multiply ! mulscc %o4, %o1, %o4 ! 1st iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 10th iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 20th iteration. mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 mulscc %o4, %o1, %o4 ! 29th iteration. mulscc %o4, %g0, %o4 ! The last iteration does necessary shift. rd %y, %g1 ! Read the y register. Least significant bits. srl %g1, 3, %g1 ! Right justify the 29 bits. 4: st %g1, [%o3] ! Send least significant bits back. st %o4, [%o2] ! Send most significant bits back. LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/Solaris/src/GC.c0000664002275300236100000000130214017255270017534 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { char *EACSTACK; /* Flush register windows to the stack. */ flush_windows(); /* Get top pointer to the top of the stack. */ EACSTACK = (char *) get_frame_ptr(); GCSI(sizeof(Word),EACSTACK); } saclib2.2.8/sysdep/archive/Solaris/src/README0000664002275300236100000001112114017255270017757 0ustar wcbrownscs SPARC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sun SPARC Operating system: SunOS Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/SPARC/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/SPARC/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "SPARC" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1 Default compilation with mklib ---------------------------------- If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.1 Using gcc instead of cc ---------------------------- If you want to use a different C compiler such as the Gnu C compiler (gcc) all you need to do is set the environment variable CC. This can be accomplished with the command (setenv CC=gcc). ANSI C type type declarations can be used if the variable __STDC__ is set. To see how this is done look in the file include/sacsys.h 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/Solaris/src/install0000664002275300236100000000331614017255270020477 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=SPARC # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." # setenv CC gcc mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/Solaris/src/include/0000775002275300236100000000000014017255270020526 5ustar wcbrownscssaclib2.2.8/sysdep/archive/Solaris/src/include/sacsys.h0000664002275300236100000000142214017255270022203 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/Solaris/src/get_pointers.s0000664002275300236100000000106414017255270021772 0ustar wcbrownscs!Sparcstation SLC assembler routines to get the current framepointer !and the current stackpointer. !These routines are coded as leaf routines, !i.e. they do not get their own windows. !Author: N.J.Nevin, 20 Nov 90 .seg "text" ! int ! *get_frame_ptr(void) .globl get_frame_ptr get_frame_ptr: jmpl %o7+8, %g0 !return to caller mov %fp, %o0 !return value is fp (delay slot) ! int ! *get_stack_ptr(void) .globl get_stack_ptr get_stack_ptr: jmpl %o7+8, %g0 !return to caller mov %sp, %o0 !return value is sp (delay slot) saclib2.2.8/sysdep/archive/Solaris/src/DQR.s0000664002275300236100000000625514017255270017725 0ustar wcbrownscs! ! DQR(a1,a0,b;q,r) ! [Digit quotient and remainder. a1, a0 and b are BETA-integers with ! a1*a0 >= 0 and abs(b) > abs(a1). q is the integral part of ! (a1*BETA+a0)/b and r is (a1*BETA+a0)-b*q. q and r are ! BETA-integers.] ! ! Replacement routine for DQR.ald ! ! Variables: a1 b a'1 a'0 b' q' q r loopcounter temp ! Registers: o0 o1 o2 g3 [o3] [o4] g5 o5 ! ! Also, register g4 is used for the constant 2^29. ! Register g1 is used for the sign of (a1 * BETA + a0) and the ! sign of b. Register g2 is used for 2*b. ! ! This version of DQR is written for the UNIX assembler running on the ! Sun Workstation SPARC architecture. ! The original assembly code was written by Todd Torgersen. ! Jeremy Johnson ! .seg "text" .global DQR DQR: ! Get the operands from memory (indirect). mov %o0,%o0 mov %o1,%o1 mov %o2,%o2 ! Take the absolute value a1, a0, and b. orcc %o0,%o1,%g1 ! if either a1 or a0 is negative. bpos 1f sethi %hi(0x60000000), %g4 ! Delay slot: initialize %g4 = 2^29. sub %g0,%o0,%o0 ! Negate both since a0 and a1 have the sub %g0,%o1,%o1 ! same sign. 1: tst %o2 bge 2f srl %o2,31,%g2 ! Delay slot: Keep sign of b in low order bit. sub %g0,%o2,%o2 ! End taking absolute values. 2: andn %g1,1, %g1 ! Force low order bit of %g1 to 0. or %g1,%g2,%g1 ! Pack sign bit of b in low order bit of %g1. mov 14, %g5 ! Initialize loop counter. mov 0, %g3 ! Initialize q' = 0. add %o2,%o2,%g2 ! Store 2*b in %g2. ! ! Develop quotient bits two at a time. ! sll %o1,2,%o1 ! Skew loop to take advantage of delay slot. 3: ! Begin loop. ! Shift left (a1*BETA+ao). sll %o0,2,%o0 ! Shift a'1. srl %o1,29,%o5 ! top bits of a'0, right justified. or %o5,%o0,%o0 ! Put in low order positions of a'1. andn %o1,%g4,%o1 ! Set 29th and 30th bit of a'0 to 0. subcc %o0,%g2,%g0 ! if ( a'1 >= 2*b' ) bl 7f sll %g3,2,%g3 ! Delay slot: shift q'. sub %o0,%g2,%o0 ! a'1 := a'1 - 2*b' add %g3,2,%g3 ! q' := q' + 2 7: subcc %o0,%o2,%g0 ! if ( a'1 >= b' ) bl 4f subcc %g5,1,%g5 ! Delay slot: Decrement loop counter. sub %o0,%o2,%o0 ! a'1 := a'1 - b' add %g3,1,%g3 ! q' := q' + 1 4: bg 3b ! Branch back. sll %o1,2,%o1 ! Delay slot: Prepare for next iter. ! Develop the last bit. sll %o0,1,%o0 ! Shift a'1. srl %o1,30,%o5 ! Get last bit of a'0. 30 because of shift ! by 2 in the delay slot at end of loop. or %o5,%o0,%o0 ! Put in low order positions of a'1. subcc %o0,%o2,%g0 ! if ( a'1 >= b' ) bl 8f sll %g3,1,%g3 ! Delay slot: shift q'. sub %o0,%o2,%o0 ! a'1 := a'1 - b' add %g3,1,%g3 ! q' := q' + 1 ! Fix the signs of the output. 8: tst %g1 ! if ( (a'1* BETA + a'0) < 0 ) bge 5f sll %g1,31,%g2 ! Delay slot: Restore sign bit of b in %g2. sub %g0,%g3,%g3 ! q' := -q' sub %g0,%o0,%o0 ! a'1 := -a'1 5: tst %g2 ! if ( b < 0 ) bge 6f st %o0, [%o4] ! Delay slot: Send r back (indirect). sub %g0,%g3,%g3 ! q' := -q' 6: st %g3, [%o3] ! Send q back (indirect). LE12: retl ! This is a leaf routine, hence "retl". nop ! Nothing in the delay slot. .seg "data" saclib2.2.8/sysdep/archive/Solaris/bin/0000775002275300236100000000000014017255270017064 5ustar wcbrownscssaclib2.2.8/sysdep/archive/Solaris/bin/mklib0000664002275300236100000000325514017255270020112 0ustar wcbrownscs#! /bin/csh # USAGE: # mklib # # FUNCTION # Creates ".a" files in "$saclib/lib/" depending on the argument: # - 'std' causes a standard library to be built. The library file will have # the name "saclib.a" and the corresponding object files are in # "saclib/lib/obj". # - 'deb' switches on the '-g' option of the compiler which includes # debugging information in the object files. The library file will have # the name "saclibd.a" and the corresponding object files are in # "saclib/lib/objd". # - 'opt' switches on the '-O' option which produces optimized code. The # library file will have the name "saclibo.a" and the corresponding object # files are in "saclib/lib/objo". # - 'all' builds all three types of libraries. if ($#argv < 1) then echo "USAGE:" echo " mklib " exit endif if (! $?CC) then set CC=cc endif echo "Compiling with" $CC if ($1 == "std") then echo "This option no longer exists!" # pushd >/dev/null $saclib/lib/obj # make CC=$CC SACFLAG= EXTENSION= # popd >/dev/null else if ($1 == "deb") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null else if ($1 == "opt") then pushd >/dev/null $saclib/lib/objo # make CC=$CC "SACFLAG=-O" EXTENSION=o make CC=cc "SACFLAG=-O" EXTENSION=o popd >/dev/null else if ($1 == "all") then pushd >/dev/null $saclib/lib/objd make CC=$CC "SACFLAG=-g -DNO_SACLIB_MACROS" EXTENSION=d popd >/dev/null pushd >/dev/null $saclib/lib/objo make CC=cc SACFLAG=-O EXTENSION=o popd >/dev/null else echo "USAGE:" echo " mklib " exit endif echo "mklib done." saclib2.2.8/sysdep/archive/Solaris/bin/sdesc0000664002275300236100000000255314017255270020115 0ustar wcbrownscs#!/bin/csh # USAGE: # sdesc [ [ [ []]]] # # FUNCTION # Takes an an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The text part of these blocks is searched for the pattern. If it is # found, the block is displayed in the following format: # # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # The default input file is "$saclib/doc/desc.doc", the default output file # is STDOUT, default values for sc and ll are 8 and 77. if ($#argv < 1) then echo "USAGE:" echo " sdesc [ [ [ []]]]" exit endif if ($#argv < 2) then set infile=$saclib/doc/desc.doc else set infile=$2 endif if ($#argv < 3) then set outfile=`tty` else set outfile=$3 endif if ($#argv < 4) then set sc=8 else set sc=$4 endif if ($#argv < 5) then set ll=77 else set ll=$5 endif awk -f $saclib/bin/b2l.awk $infile |\ grep -i "$1" |\ awk -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # The last line used to look like this: # awk >$outfile -f $saclib/bin/l2b.awk sc=$sc ll=$ll - # but I took it out saclib2.2.8/sysdep/archive/Solaris/bin/slist.awk0000664002275300236100000000207714017255270020734 0ustar wcbrownscsBEGIN { p = length(rcsdir)+2; count = 0; history = ""; } $1 == "head" { history = "" } $1 == "date" { history = substr($6,0,length($6)-1) " " history } $1 == "desc" { n = split(history,a); if (state == "algo" && a[1] != "new" && a[n] != "del" && match(history,"algo") > 0) { count++; print shortname(FILENAME,p); } if (state == "bug" && a[1] != "new" && a[n] != "del" && match(history,"bug") > 0) { count++; print shortname(FILENAME,p); } if (state == "del" && a[1] != "new" && a[n] == "del") { count++; print shortname(FILENAME,p); } if (state == "new" && a[1] == "new" && a[n] != "del") { count++; print shortname(FILENAME,p); } } END { printf "\n>> %d functions ", count if (state == "algo") print "have modified algorithms." if (state == "bug") print "have bug fixes." if (state == "del") print "were deleted." if (state == "new") print "are new." printf "\n" } function shortname(longname,p) { sname = substr(longname,p); sname = substr(sname,0,length(sname)-2); return sname; } saclib2.2.8/sysdep/archive/Solaris/bin/sci0000664002275300236100000000024414017255270017565 0ustar wcbrownscs#!/bin/csh if ($#argv != 3) then echo "Usage: sci " else ci -l -s$2 -w$3 ${saclib}/RCS/$1,v endif saclib2.2.8/sysdep/archive/Solaris/bin/isachelp0000664002275300236100000001146214017255270020603 0ustar wcbrownscs#!/bin/csh ###################################################### # This is a ISAC Help Program # # Written by Hoon Hong April 24, 1991 # Modified by Herbert Vielhaber in March, 1992 # # This shell script is called by the system "isac". # The isac always passes one argument # which is either "general" or a saclib algorithm name. ###################################################### ##################################################### # PLEASE ADJUST THE FOLLOWING!!!! ##################################################### # The paths to be searched for algorithms: set searchPaths = ($saclib/src) # The number of lines displayed by more: set moreNumLines = 15 ##################################################### # Defaults ##################################################### set view_flag = false set general_flag = true set module = "" ##################################################### # Process command line ##################################################### while ($#argv > 0) set a=$argv[1] shift switch ($a) case '-general': set general_flag = true breaksw case '-view': set view_flag = true breaksw default: if ($module == "") then set general_flag = false set module = $a endif breaksw endsw end ####################################################### # If the user asked for a help on a specific algorithm, ###################################################### if ($general_flag == false) then foreach aPath ($searchPaths) if (-e $aPath/${module}.c) then if ($view_flag == true) then view $aPath/${module}.c else more -$moreNumLines $aPath/${module}.c endif exit 0 endif end echo ${module} not found. exit 1 endif #################################################### # If the user asked for a general help, #################################################### more -$moreNumLines <<\END_GENERAL_HELP ======================================================== Help on ISAC (Version 2.0) ======================================================== Disclaimer ---------- This help text was written in a very short time, thus is not really helpful yet! -- Herbert Vielhaber, March 10, 1992 Currently supported SACLIB algorithms ------------------------------------- All the SACLIB library algorithms and macros are accessible. NIL and BETA are available as constants. Command line options -------------------- Several command line options are available for initializing certain SACLIB global variables. In order to find out what is available, issue the command: isac +h Interface functionality ----------------------- An ISAC session consists of one or more statements. Every statement must end with a semicolon ';'. A statement can be one of the three kinds command call assignment The commands supported in this version are: quit; : For quitting the session. vars; : For displaying the contents of the variables. Values are displayed in internal SACLIB format. help [algName]; : For displaying a general help or an algorithm. For example, in order to display the algorithm IPROD, issue the the command: help IPROD; view algName; : For displaying an algorithm with the editor vi(1). save fileName; : For saving the current state of the session (i.e. the variable binding) to a file. restore fileName; : For restoring the state of a session from a file. A call statement is a call to any procedures in the SACLIB library. For example, IPFAC(r,A; s,c,F); IPWRITE(r,IPSUM(r,A,B),V); An assignment statement is of the form: var := expression; For example, A := IPROD(a,ISUM(b,c)); a := 2 * 3 + 4; a := 3 % 2; Interface Grammar ----------------- Below we give a context-free grammar for a session. Conventions: upper-case strings and quoted strings denote tokens, lower-case strings denote non-terminals. session : statement | session statement ; statement : command ';' | proc_call ';' | assignment ';' ; command : IDENT | IDENT CMDARGS ; proc_call : IDENT '(' proc_arg_star ')' ; assignment : IDENT ':=' expr ; proc_arg_star : val_star | val_star ';' ref_star ; val_star : /* empty */ | val_plus ; val_plus : expr | val_plus ',' expr ; ref_star : /* empty */ | ref_plus ; ref_plus : ref | ref_plus ',' ref ; ref : IDENT expr : expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | expr '%' expr | '+' expr | '-' expr | '(' expr ')' | func_call | atom ; func_call : IDENT '(' func_arg_star ')' ; func_arg_star : val_star ; atom : IDENT | INTEGER ; ================================================== \END_GENERAL_HELP exit 0 saclib2.2.8/sysdep/archive/Solaris/bin/slog0000664002275300236100000000063314017255270017755 0ustar wcbrownscs#!/bin/csh if ($#argv < 1) then echo "Usage: slog [rev]" else if !(-f ${saclib}/RCS/$1,v) then echo $1": No RCS record." else if ($#argv == 1) then echo "=============================================================================" echo $1 rlog ${saclib}/RCS/$1,v | sed '1,13d' | more else co -q -p$2 ${saclib}/RCS/$1,v | more endif endif endif saclib2.2.8/sysdep/archive/Solaris/bin/mkproto.awk0000664002275300236100000000265214017255270021270 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/Solaris/bin/mktexkwic.sed0000664002275300236100000000061114017255270021565 0ustar wcbrownscs# Keywords to be deleted and keywords to be modified. /^.* OLD_/ d /^[0123456789]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d /^[^ ]\{1,\}\. / s/\. / /1 /^[^ ]\{1,\}\.$/ s/\.//1 /^[^ ]\{1,\}, / s/, / /1 /^[^ ]\{1,\},$/ s/,//1 /^[^ ]\{1,\}) / s/) / /1 /^[^ ]\{1,\})$/ s/)//1 /^(/ s/(//1 saclib2.2.8/sysdep/archive/Solaris/bin/mkkwic.awk0000664002275300236100000000306114017255270021055 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/Solaris/bin/l2b.awk0000664002275300236100000000246114017255270020252 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/Solaris/bin/mktexkwic.awk0000664002275300236100000000303714017255270021601 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); print $i,sprintf(sfmt,$1),t1,$i,t2; } } saclib2.2.8/sysdep/archive/Solaris/bin/mkmspec.awk0000664002275300236100000000020514017255270021224 0ustar wcbrownscs/^/ {printf("/*======================================================================\n"} /^/,/^====*===\*\/$/ {print} saclib2.2.8/sysdep/archive/Solaris/bin/mkdesc.awk0000664002275300236100000000164414017255270021043 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/Solaris/bin/mkproto0000664002275300236100000000072314017255270020504 0ustar wcbrownscs#! /bin/csh # USAGE # mkproto # # FUNCTION # Creates the file "$saclib/include/sacproto.h" from the files in # "$saclib/src". if ($#argv != 0) then echo "USAGE:" echo " mkproto" else cd $saclib/src echo >$saclib/include/sacproto.h \ "extern void FAIL P__((char *algName, char *msg,...));" foreach fname (*.c) if ($fname != FAIL.c && $fname != main.c) \ awk -f $saclib/bin/mkproto.awk $fname >>$saclib/include/sacproto.h end endif saclib2.2.8/sysdep/archive/Solaris/bin/mkdesc0000664002275300236100000000141614017255270020257 0ustar wcbrownscs#! /bin/csh # USAGE # mkdesc # # FUNCTION # The files are assumed to be text files beginning with the standard SAC # function specification header. The function name and the description of # each file are extracted and formatted as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # If the function name consists of more than 'sc-2' characters the text in # the first line will begin to the right of column 'sc'. if ($#argv < 3) then echo "USAGE:" echo " mkdesc " else foreach fname (${argv[3-]}) awk -f $saclib/bin/mkdesc.awk sc=$1 ll=$2 $fname end endif saclib2.2.8/sysdep/archive/Solaris/bin/mktexkwic1.awk0000664002275300236100000000031714017255270021660 0ustar wcbrownscs { for (i=2;i<=NF;i++) { kw = tolower($i); j = index(kw,"-"); if (j > 0) { print substr(kw,1,j-1),$0; print substr(kw,j+1,length(kw)-j),$0; } else print kw,$0; } } saclib2.2.8/sysdep/archive/Solaris/bin/mkkwic.sed0000664002275300236100000000023414017255270021045 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/Solaris/bin/sman0000664002275300236100000000035614017255270017751 0ustar wcbrownscs#!/bin/csh # USAGE: # sman # # FUNCTION # Displays the SAC source file containing the given function. if ($#argv < 1) then echo "USAGE:" echo " sman " else more $saclib/src/$1.c endif saclib2.2.8/sysdep/archive/Solaris/bin/mkmake0000664002275300236100000000575614017255270020271 0ustar wcbrownscs#! /bin/csh # USAGE # mkmake # # FUNCTION # Creates the makefiles for SACLIB. set MAKEFILE=$saclib/lib/objo/makefile # ## Write header # cat > $MAKEFILE <<\EOF # FILE # makefile (automatically generated by 'mkmake') # # USAGE # make [SACFLAG=] [EXTENSION=] # where is a compilation flag such as '-O' and is the # corresponding extension character which will be appended to the name of # the compiled library. # E.g. if is -g and is d, the library will be # compiled with the debug option set and the library name will be # "saclibg.a". # # REMARK # This file should not be modified. Modify 'mkmake' instead and then use it # to create the new makefile. # Macros SRCDIR = ${saclib}/src TARGET = ${saclib}/lib/saclib${EXTENSION}.a CFLAGS = -I${saclib}/include -c ${SACFLAG} AFLAGS = -I${saclib}/include -P AS = /usr/ccs/bin/as AR = /usr/ccs/bin/ar RANLIB = /usr/ccs/bin/ranlib # Object files OBJS1 = \ \EOF # ## Write list of object files # pushd >/dev/null $saclib/src /bin/ls [A-H]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2a = \" >> $MAKEFILE /bin/ls I[A-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS2b = \" >> $MAKEFILE /bin/ls I[Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS3 = \" >> $MAKEFILE /bin/ls [J-P]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE echo " " >> $MAKEFILE echo "OBJS4 = \" >> $MAKEFILE /bin/ls [Q-z]*.[cs] |\ awk -F. '{if (prev) printf("\\\n%s.o",$1);\ else {printf("%s.o",$1); prev = 1;}}' >>$MAKEFILE # ## Write target dependencies # cat >> $MAKEFILE <> $MAKEFILE <<\EOF # Object dependencies \EOF /bin/ls *.[c] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${CC} ${CFLAGS} ${SRCDIR}/%s\n",$1,$0,$0}' >>$MAKEFILE /bin/ls *.[s] |\ awk -F. '{printf "%s.o: ${SRCDIR}/%s\n\t${AS} ${AFLAGS} ${SRCDIR}/%s -o %s.o\n",$1,$0,$0,$1}' >>$MAKEFILE echo " " >>$MAKEFILE echo "# END OF FILE makefile" >>$MAKEFILE # ## Done # cp $MAKEFILE $saclib/lib/objo cp $MAKEFILE $saclib/lib/objd popd >/dev/null echo "Made '$MAKEFILE'" echo "and copies in '$saclib/lib/objo'" echo " and '$saclib/lib/objd.'" saclib2.2.8/sysdep/archive/Solaris/bin/mkisac0000664002275300236100000000035314017255270020257 0ustar wcbrownscs#! /bin/csh # USAGE: # mkisac # # FUNCTION # makes isac. if ($#argv > 0) then echo "USAGE:" echo " mkisac" exit endif # use gcc set CC=gcc pushd >/dev/null $saclib/isac make CC=$CC popd >/dev/null echo "mkisac done." saclib2.2.8/sysdep/archive/Solaris/bin/mkmspec0000664002275300236100000000042714017255270020451 0ustar wcbrownscs#! /bin/csh # USAGE # mkmspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # if they contain a macro description and writes them to STDOUT. foreach fname ($argv) awk $saclib/bin/mkmspec.awk $fname end saclib2.2.8/sysdep/archive/Solaris/bin/b2l.awk0000664002275300236100000000106114017255270020245 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) printf("%s %s\n",subject,text); subject = $1; text = substr($0,length($1)+2,length($0)-length($1)-1); subcnt++; } /^ / {text = text $0} END {printf("%s %s\n",subject,text)} saclib2.2.8/sysdep/archive/Solaris/bin/mkspec0000664002275300236100000000040614017255270020271 0ustar wcbrownscs#! /bin/csh # USAGE # mkspec # # FUNCTION # Extracts the function specifications from the headers of SAC source files # and writes them to STDOUT. foreach fname ($argv) awk '/^\/\*====*===$/,/^====*===\*\/$/ {print}' $fname end saclib2.2.8/sysdep/archive/Solaris/bin/mkkwic0000664002275300236100000000235114017255270020275 0ustar wcbrownscs#! /bin/csh # USAGE: # mkkwic [ [ [ []]]] # # FUNCTION # Creates a KWIC index from a file which consists of one or more blocks # of the following format: # # # <0 or more lines of additional text, beginning with at least one blank.> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output consists of lines of the following format, sorted alphabetically # by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for , , and are # "$saclib/doc/desc.doc", 8, 43, and 79, resp. if ($#argv < 1) then set fname=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set sc=8 else set sc=$2 endif if ($#argv < 3) then set kc=43 else set kc=$3 endif if ($#argv < 4) then set ll=79 else set ll=$4 endif awk -f $saclib/bin/b2l.awk $fname |\ awk -f $saclib/bin/mkkwic.awk sc=$sc kc=$kc ll=$ll - |\ sed -f $saclib/bin/mkkwic.sed |\ sort -f |\ awk -f $saclib/bin/strip1st.awk - saclib2.2.8/sysdep/archive/Solaris/bin/slist0000664002275300236100000000037614017255270020153 0ustar wcbrownscs#!/bin/csh # lists all RCS files that have the state value of the first argument. set RCSDIR = $saclib/RCS if ($#argv != 1) then echo "Usage: slist " else nawk -f $saclib/bin/slist.awk state=$1 rcsdir=$RCSDIR $RCSDIR/*.c,v endif saclib2.2.8/sysdep/archive/Solaris/bin/isac0000664002275300236100000143267414017255270017747 0ustar wcbrownscsTy-@  \.text( .data\\\@.bss .comment(6ET\RU RPguuq Pt3ɸ)ÐUՁ43error: %s Uuh,hЋ裤hЋÐwsave_state: couldn't open file %s %d %s UVS]hh\S  u#Sh^hЋ3hЋ93l5\Fhpw3ۃ9\F~?44 PhHw4th0wC9\FV:ue[^rrestore_state: couldn't open file %s %d%srestore_state: couldn't enter string into table UWVS]hhCS uShEhЋhЋCh\FhkvP u/3hqhЋբhЋWA Ӑ39\F~OVhnavP{ tV Ѓt44DC9\FW[^_restore_state: end of file too early US]uhhЋhЋ BË]/dev/ttyrestore_state: unable to restore standard input UhhChq u h hЋ臡hЋj^qsave_state: unable to restore standard output Uhh\h u h|hЋhЋjpUsh .hh؏u h ːU yhJ uÐ ======================================================== I S A C ======= Interface to SAC Library Version 2.0 June 26, 1992 Copyright (C) 1992 by Herbert Vielhaber Developed at RISC-Linz (Research Institute for Symbolic Computation) Type 'help;' for help. Report any problem to SACLIB Maintenance saclib@risc.uni-linz.ac.at UhhphjphphphphRyphophep hXphNph:Dpht:ph0ph&phphp hph"oh\ohjoÐUVS`F=lFtPlF`F@4lFhS$t `F@\`F`F@ Uh5ddh =nhÐUhUS]SjSjSjSj SjSjSjSj Sj Sj Sj Sj  SjSjSj|Sjt SjiSjaSjYSjQ] ********** UNRECOVERABLE ERROR SITUATION ENCOUNTERED ********** SIGNAL #%d has been raised. Please press the return key, if the prompt '>' does not appear in the next line! US]h lSh/ lhM lhl |l[hijhhstring table is fullUWVS}39~5PW՚t C99~ [5CWi؉= &4WPh e[^_ÐUEÐUuiÐ       !#%)*,.248<@DHKNRTV[]_          !  5./0& '',.   ! ()*+, 1 ! !'$#"-26374%   ! $  3USE]M P~CAUJ}]parser stack overflowcommand failedcannot assign a value to a constantconstant used as reference argumentunknown variableunknown identifierparse errorUWVSp4P0Dž,Dž@Dž88<n<0<f@t8EEf44cPh+4D4th3DC9\Fċ]ÐUVS]u PCtCSVuSK |3PCtKyD3ۀ>t3PCt3 C<3ue[^Ð bye! Uh57Dj@isachelp UdSE] 5 $5UMf (5fMPS_tSuj]isachelp -view UdSE]m5 q5UMu5 y5UMPStSj]UdÐUuÐUuÐFAILAADVABSACLOCKADDTOADVADV2ADV3ADV4AFCOMPAFCRAFDIFAFDWRITEAFFINTAFFRNAFICRAFINVAFNEGAFPAFPAFPAFQAFPBRIAFPCMVAFPCRAFPDIFAFPDMVAFPEMVAFPEVAFPFIPAFPFRPAFPICRAFPINTAFPMEAFPMONAFPNEGAFPNIPAFPNORMAFPPRAFPQRAFPRCLAFPRIIAFPRLSAFPRODAFPRRIAFPRRSAFPSUMAFPWRITEAFQAFSIGNAFSUMAFUPBRIAFUPCSFBAFUPFACAFUPGCAFUPGSAFUPIIRAFUPIIWSAFUPMPRAFUPRBAFUPRICLAFUPRICSAFUPRIIAFUPRLAFUPRLSAFUPRRIAFUPRRSAFUPSFAFUPSFBAAFUPSFNAFUPSRAFUPVARAFUPWRITEAFUSPSFBAFWRITEAIFANAMPDMVAMPSAFPAMSIGNAMSIGNIRAMUPBESAMUPBHTAMUPIIRAMUPIIWSAMUPMPRAMUPNTAMUPRBHAMUPRICSAMUPRICSWAMUPRINCSAMUPRLSAMUPRRSAMUPSRAMUPTRAMUPTR1AMUPVARIRANDWRITEANFAFANIIPEANPEDEANPRODANREPEANSUMAREADASSPRAWRITEBEGINSACLIBBITRANBKSPCCONCCINVCLEARCLOCKCLOUTCOMPCOMP2COMP3COMP4CONCCOPYTOCPLEXNCREADCREADBCSFPARCSINTCSSUBCSUNCTMICWRITEDANDDEGCDDGCDDIELOCDIGITDIIPREADDIIPWRITEDIPDEGDIPFPDIPINSDIRPREADDIRPWRITEDLOG2DMPPRDDMPSUMDMUPNRDNIMPDNOTDORDPCCDPFPDPGENDPRDQRDRANDRANNDSQRTFDVCMPENDSACLIBEQUALEVENEXPFEXTENTFILINEFIRSTFIRST2FIRST3FIRST4FOURTHFREEARRAYFRESLFRLSMGCGCA2PTRGCAFREEGCAGETGCAMALLOCGCGLOBALGCSIGDPGENGETARRAYGETLISTGREADGWRITEIABSFIBCINDIBCOEFIBCPSICOMPICRANDIDEGCDIDEQIDIFIDIPR2IDP2IDPRIDQIDQRIDREMIEGCDIEQIEVENIEXPIFACTIFACTLIFATLIFCL2IFLTAIGCDIGCDCFIHEGCDIICILCMILCOMBILOG2ILPDSILWRITEIMAXIMINIMP2IMPBIMPDSINEGINFOSACLIBINVIODDIORD2IPABSIPAFMEIPBEILVIPBHTIPBHTLVIPBHTMVIPBREIIPCIPCEVPIPCONSTIPCPPIPCRAIPCSFBIPDERIPDIFIPDMVIPDQRIPDSCRIPDWRITEIPEMVIPEQIPEVALIPEXPIPEXPREADIPEXPREADRIPFACIPFACTREADIPFCBIPFLCIPFRPIPFSDIPFSFBIPGCDCIPGFCBIPGSUBIPHDMVIPICIPICPPIPICSIPIHOMIPIISSIPIIWSIPINTIPIPIPIPPIPIPRIPIQIPIQHIPLCPPIPLEVIPLRRIIPMAXNIPMONFACTIPNEGIPNTIPONEIPOWERIPP2PIPPFAC2IPPGSDIPPNPRSIPPOWREADIPPPIPPRODIPPSCIPPSRIPPVEDIPQIPQRIPRANIPRCHIPRCHSIPRCN1IPRCNPIPREADIPRESIPRICLIPRIMIPRIMOIPRIMSIPRIMUIPRIMWIPRISTIPRODIPROD2X2IPROD3X2IPROD3X3IPRODAIPRPRSIPRRIIIPRRLSIPRRRIIPRRSIPSCPPIPSFIPSFBAIPSFSDIPSIFIIPSIGNIPSMVIPSPRSIPSQRTIPSRMIPSRMSIPSRPIPSUBIPSUMIPSUMNIPTERMREADIPTPRIPTRIPTR1IPTR1LVIPTRANIPTRLVIPTRMVIPTRUNIPVCHTIPVDEG12IPWRITEIQIQRIRANDIREADIREMIROOTISATOMISFPFISFPIRISGCAISIGNFISLISTISNILISOBJECTISPDISPFAC2ISPSFBISPTISQRTISUMISZEROITRUNCIUPBEIIUPBESIUPBHTIUPBREIUPCHTIUPFACIUPFDSIUPIHTIUPIIRIUPNTIUPQHIUPQHLIUPQSIUPRBIUPRCIUPRLPIUPSRIUPTPRIUPTRIUPTR1IUPVARIUPVOIIUPVSIIUPWRITEIUSFPFIUSFPF2IWRITEKARATSUBALASTCELLLBIBMSLBIBSLBIMLCONCLDSMKBLDSSBRLEINSTLELTILENGTHLEROTLETTERLEXNEXLFSLINSLINSRTLIST1LIST10LIST2LIST3LIST4LIST5LKAHEADLMERGELPERMLREADLSRCHLWRITEMAIPDEMAIPDMMAIPHMMAIPPMARKMAXMCPMVMDCRAMDDIFMDEXPMDHOMMDINVMDINVBMDLCRAMDNEGMDPRODMDQMDRANMDSUMMEMBERMIAIMMICINSMICSMIDCRAMIDIFMIEXPMIHOMMIINVMINMINEGMINNCTMIPDIFMIPFSMMIPHOMMIPIPRMIPISEMIPMIPMIPMONMIPNEGMIPPRMIPRANMIPRODMIPSUMMIQMIRANMISUMMIUPQRMIUPSEMMDDETMMDNSBMMPDMAMMPEVMMPIQRMPDIFMPEMVMPEVALMPEXPMPGCDCMPHOMMPINTMPIQHMPIQHLMPIQHSMPMDPMPMONMPNEGMPPRODMPPSRMPQMPQRMPRANMPRESMPSPRSMPSUMMPUCMPUCPPMPUCSMPUPMPUPPMPUQMUPBQPMUPDDFMUPDERMUPEGCMUPFBLMUPFSMUPGCDMUPHEGMUPRANMUPRCMUPRESMUPSFFODDORDEROREADOWRITEPADVPAIRPARTNPARTRPARTSSPBINPCLPCOEFFPCONSTPCPVPDBORDPDEGPDEGSVPDEGVPDLOG2PDPVPERMCYPERMRPFBREPFDIPPFDPPHDQRPICPVPINVPLBCFPLDCFPMDEGPMONPMONSVPMPMVPNDQRPORDPPERMVPPLTPREDPRODUCTPRTPSDSVPTBCFPTMVPTVPUFPPUNTQREMREDRED2RED3RED4REDIREMRIBRILRILCRINEGRINTRIPRODRIRNPRISIGNRISUMRNABSRNBCRRNCEILRNCOMPRNDENRNDIFRNDWRITERNFCL2RNFLORRNINTRNINVRNMAXRNMINRNNEGRNNUMRNP2RNPRODRNQRNRANDRNREADRNREDRNSIGNRNSUMRNWRITERPAFMERPBLGSRPDIFRPDMVRPDWRITERPEMVRPEXPREADRPFACTREADRPFIPRPIMVRPMAIPRPNEGRPPOWREADRPPRODRPQRRPRANRPREADRPRNPRPSUMRPTERMREADRPWRITERUPWRITESDIFFSDRSECONDSEQUALSFCCONSFCDIFSFCFRSFCIPSFCMSQSFCNEGSFCPRSFCQSFCRPSFCSSFCSUMSFIFISFIRSTSFRABSSFRDIFSFRLSSFRNEGSFRPRSFRQSFRSUMSIGNSINTERSLELTISMFMISMFMIPSREDSTATSACLIBSUBFROMSUFFIXSUNIONSWRITETHIRDUSDIFFUSINTUSUNVARVCOMPVIAZVIDIFVIEREDVILCOMVINEGVISPRVISUMVIUTVLREADVLSRCHVLWRITEVMAXVMINVMPIPVREADVWRITEquithelpviewvarssaverestoreNILBETA Failure occurred in: Reason for the failure: GCSI (marking stack)BACSTACK = EACSTACK = GCSI (final check)N = NU = RHO = GREADC = AREADLREADIREADDIIPREADDIRPREADIPREADRPREADVLREADVREADSFRLSu = v = a = e = SFRQg = SFRSUMMAIPDMr = A = b = bp = The current length of PRIME list = MMPDMAp = M = IPGCDCB = gb = IPRESf = Q = AFINV Now the ISAC signal handler is taking control ... UWVS] h|G!hG!u !hG!hG S h|G ]}Gu@hG u覛hG hG u芛hG }GuWhGu sRhG` hGV s3hGA hH7 3 }H}H}Htw}Htf}%H tU}.H tD}7Ht3}>Ht"}EHt}LHu&hHl3ushG[ S}RHhXH1shGh]HshGhbHs hGhgH3hG}lHuKhXHsVhGh]H~s7hGihqH3}vHuKhXHAshG,h]H"shG hqH}}HuwhHshGhHshGhHs` hGhH3B}HuKhH]shGHhH>shG)hH}HhHshGhHshGhHsx hGhH3ohGhH5Tw{PYhGg O}HhH=shG(hHshG hHs hGhHsnhGhH3nhGhH 5TzPwhG p}Hu_hHeshGPhHFshG1hH'3 hGhH&hH&UVSU] u tEPEPREE M Me[^ÐUE}ÐUh+UWVS]} u33;}G=~ 3҉A;|=~ 3҉Auލe[^_ÐUVSM] uLP e[^ÐU WVSu }]SEPuSEPuMUUMe[^_ÐUWVSu }]SEPEPuSEPu\MUUMUMe[^_ÐUWVSu }]SEPuSEPu SEPu$SEPuMUUMUMUMe[^_ÐUVSu] uuNPSV.#e[^ÐUUu3ÐEPEPRj(.uuPzÐUS]u PS&#]ÐUS]EPEPuu uRSuuP]ÐUSEu3PjjPS@z]ÐUS]u3jjPSz]ÐUUu3ÐEPEPR貄ujEPujResultant is 0AFINVUS]EPEPu f u7uuXEuEPEPuSO]}uuuShRhREPEPEPuj"}}u"EuuuPSEuPxEE]ÐUUu3ÐEPEPR膃uu#PxU WVS}Etu3iE uNEPEPEPuDuuWu q uWu VSuPd؃ } uS؋Íe[^_ÐU WVSE}u3iEuN EPEPEPuuWuu  Wuu VSuPJd؃ } uS؋Íe[^_ÐU@WVSuu EPEPuuu u"EWuc } uW"MM}P؁< Lu MUEË4uLEPEP4uu4uu uMMLu4PM M uLMu UPU MU؁< Suu}E ]EPEPuEPSuE } t.SEPEPuuuubE܃} uuuPBbEԃ} {uEԃPUċEԋ؁< `M̉MȍuЉu } ËЋMā< EPEPEPR:E gE܋LEE؋4E4}EPuuuEPuuuuuuaE } t} u} uu؉uuuPbEWP a} t4PUԁ< } tWUԡL4`WPEԃ PMċ؁< EԋLe[^_ÐUWVS}Uu 3EPEPEPRjuGPWjVWxEPEPEPujuGPZE~WjPWEuVu W? CE+E;~uVWMM } }9]|uVu W C9]}ƍe[^_ÐU VSE u3muNE } tOEPEPEPuu u uVSuPR_؃ } uS芾؋Íe[^ÐUWVSE UuRuu}uRPvEU ]KLM<}EE9E~+EPEPEPQVuu^}9}}frE } tLEPEPEPuu u uVSuPY؃ } uSʸ؋Íe[^ÐUWVS}u UU WUEPEPEPuxE@EuP'PuVuPuVuOSuPX؃ } u}tSjuX؃ S؍e[^_ÐUWVS} E3UUؐFEPEPuujSWE+@P؃ } u΍e[^_ÐUWVS}u ]u3SWPVSPVWe[^_ÐU VSUE u3nuP^E rEPEPEPu(u ua uVSuPW؃ } uS؋Íe[^ÐUSM M t9EPEPEPuuESuP[W؃ } uS蓶؍EPEPSjjjjPujrEPuuЃjujPujaЃEPEPEPRj EPEPuSUPL4[V؃} uSӵ؋]UWVSu} uV\EEPEPu^SSjuS蚽EWAu7uuSPVVWjuPFPvPV`PVe[^_ÐUWVSE]tu 3}uSPu , PTESyTE3}OEPEPEPuUU EPEPEPuuuuu uuu WISPEEPU؃ } uSVu  } bƍe[^_UWVSu]S׼ESESE MIMV誼+]VdЃ}uuRu EE EPEPuRu ui}uHWSu:TuSgV;Suu u6(PVu T u3W6M9M1e[^_ÐU WVSu˻u ]Suj6E S薻~.SjZEuu0SESujŐ uu uuE VuWSu uC} t)EPEPuuSuj؃뺐ƍe[^_ÐUWVS}u uuV#fjPfDuu!EEPEPEPuuu u聺uwE}So tىMLEEUR`PuujjEPu u EE E ~ E$EuVHeuPjQE܃u/otu趹PoEtEEPEPEPuUPLEuPuujE$uu u untMMىMu}} u MMELUuu}DuPuujEuu uQ EE %EMM]E}u t/uuu u'ttu ىtt}uuE@P2PE܃ _EEMMM}tMMtu^mtEÅ~EuEE1M؉M̋MȉMXEÅ|EEuuuuuu uuPj{OE܃(}uuuuuu uuPjV`uuuuuu uuPjV8M؉M̋MȉMMMMxu%EuEuuujEuuuj |(uuu PuI|xu Pu'PSu uuuW|SuujEuu u (Suuj`Euu u ؋Eƃ~(uEÅnEƅ0Wu3aEuW'aEÃDEÅ~}̋MMMM}MxM|uuWuu u$EƃmWuu u$Wu`EuW`] uEPVuuu ucuujPjgME܃0 }`}uuu`uPjLE܃MԉM؋MMMMMMt]MM} u趫E܋E܍h[^_ÐU WVSU] t u EPEPEPRZ EPEPEPSC MM}EPuWuuuuu u$}}4VuuK } tEPEPWu4E>SuuK؃ } tEPEPuu E}t}Y}uSSuu;K؃ } }萐WEPEPuOSuuK؃} uNVuuJ } t1}WEPEPuVuuJ} uVS؋M 1M$e[^_ÐU(WVS}U ]tu 3EPEPR~hEPEPSphuuEuujEW"u;|%EPEPEPWu0CuS؃̍EPEPEPuj}}uESuPuuP\e[^_ÐUWVS} EPEPug uuVuu u ؃u]Vuu u u؋UDž~uu;tuuf\e[^_ÐUWVS]uEPEPSgEPEPVfuu }ƾuu}ƾ}uu%EuuEuuDE}|u~uuu uuuSuu uЃt …} ] ]uuE}}n~uuu uEuuSuu u$Ѓt …} ] ]uuE}uuF}#uu%uuZuuuZM M$M(1e[^_ÐUWVSMU Eu H=uPR+UE qLM<}EE9E~EPEPEPQSuu#}9}}(EPEPEPuSuuHF؃cEPEPEPuhEPEPEPuT uuuuuV tSuPE؃ } t}  } u}} uUSСP}< u3ҋe[^_ÐUVSEU M]u SRuLESPR|pUQDEEPEPu1ueEj(GJEPEPEPu4SuuVg }~ u}~j^Ju=} tj+I} uj)Ie[^ÐUVSu] u3uV#PSVe[^USUu3:EPEPRrbuu<tuu u؋Ë]ÐU8WVSU] u uEPEPR bEP}WSaEPEPuaEPEPuaEPEPEPuuF,uulEȃuu[uuNuSj-uVj (PSj  URURWPj@}}u臟EЃuuu3 uP_Ve[^_ÐU@WVS}} EPEPuujEVurB} uVuE EPEPuuu u#Euu BE } uP藡EuEP؁< LM<}UEË4LEPEP4u4uu uC&MML}؃} uɁ} uSVe[^ÐUWVS}] EPEPEPSW*uNuSWj*PHQ MMjju艭PjjjzPASjSj؃ } thEPEPu0ujEURURURPuW=,}tSuWjEVu=} uƍe[^_ÐUWVS}} uV}u3EE} u2uWjEjuDPjmE}u2u WjEju Pj5Eu u;| ] u ]u Wj EPEPVSWj}t uѐ]SEPVu WjSEPVuWjM1MU MU e[^_ÐU S]E u E>PSjEuX~!uSjURURURPuShE]UWVS}EPEPu0Zuui؃uWu umuuu SWu uO;uSuuSOe[^_ÐU,WVSUUUj觽E܃} RP؋M< ; LU MLUEPEPQ`YEPEPuPYuu  uu}EuuujPESPuujPu uK(u ]M}u/uPuujPu uEE Eƅ}]uuW=VWuME}Euuu袿P}S5Puuj?Pu u(u }Z}u=uPuujP PujPu u:EE Eƅ~]WuhIuWLELUM5P MU} tށ< e[^_ÐUWVSu}ujCURURuVPu u]]M e[^_ÐU@WVSEPEPEPu} uE3]ؐEPEPEPuu+uEPEPuu u#$juuEURURPkV}u EPSu}uEPSu- +EPSuEPSuuuUEԃ EPEPVu(}~EȅtM9M~MȉM} E@Pƺe[^_ÐU WVSu苟u ]SujE SV~.SjEuu6ESujŐ uu u5E VuWSu uk} t)EPEPuuSujM؃뺐ƍe[^_ÐUVSu] ujPSVe[^ÐUWVS}u= uuVIjPIDuuEEPEPEPuuu\ uuE}ScS tىMLEEURPuujEPu uCEE E ~ E$EuVHuPjm5E܃uRtuNPREtEEPEPEPuSUPLEu)Puuj3E$uu uou5RtMMىMu}} u MMELUuuo}DuPuujEuu uEE %EMM]E}u t/uuu u ttu ىtt}uuE@P3E܃ _EEMMM}tMMtuPtEÅ~EuEE1M؉M̋MȉMXEÅ|EEuuuuuu uNuPj3E܃(}uuuuuu uuPjV`uuuuuu uuPjV8M؉M̋MȉMMMMxuEuEuuujEuuuj|(uuuPu|xu PuPSu uNuu\WSuujEuu u[(SuujEuu u7؋Eƃ~(uEÅnEƅ0WuDEuWDEÃDEÅ~}̋MMMM}MxM|uueWuu ulEƃmWuu uNWu#DEuWD] uEPVuuu uuujPj0E܃0 }`}uuuCuPjD0E܃MԉM؋MMMMMMt]MM} uNE܋E܍h[^_ÐUS] Su3,SURURPMuu9Pu]U WVSU] t u EPEPEPR EPEPEPS MM}EPuWuuuuu u$}}4Vuu / } tEPEPWu4E>Suu.؃ } tEPEPuu E}t}Y}uSSuu.؃ } }萐WEPEPuSuuS.؃} uNVuu4. } t1}WEPEPuKVuu.} uV;S3؋M 1M$e[^_ÐUWVS} EPEPuK uuVuu u؃u]Vuu uu؋UDž~uu;tuu@e[^_ÐUWVS]uEPEPSKKEPEPV=Kuu }ƾuuի}ƾ}uumEuu_Euu茫E}|u~uuu uuuڤSuu uЃt …} ] ]uuϫE}}n~uuu uuueSuu ulЃt …} ] ]uu[E}uu莪}#uumuu>uu>M M$M(1e[^_ÐUWVS}] SWjURURURPSWK$u~QEPEPEPuuWuْ~VuS(>Pw*MMMMC룐VuS=PM*Vщe[^_ÐUWVS}u UU t~VV~oEPEPuGEPEPEPuVWa$u~Su)؃u~Su)؃u} uVڑ~ SV)؃} t'}uWVuSu])؃} uߋÍe[^_ÐUWVS] jjj艘PjjjzPAWj׸Wj jSj&PjK uWSujDE ESujqEPEPEPVjǒPVj胤$u̐~WSujEu詐V*UMMUe[^_ÐUWVSu} ]uPSVjPWVe[^_ÐU WVS} U3UEPEPEPRZuWu؃} t,EPEPEPu,uWu|;tFˋƍe[^_ÐUWVSu}uj0wj(,EPEPSE ;t j+,Wu}~ u }~j^,uP uj)q,e[^_ÐUWVS} U U t*uVEPuSuW}؃} uۋÍe[^_ÐUUu j+ÐEPEPRDj(+u臭j,+u u' j)+ÐUWVS]} ]EPEPEPS蠽}tuuj9MEPEPEPulE+EPuMlPVUU VuSuP%؃} uS4؋UUe[^_Uu E@P谏ÐUS]u SEEPEPuCSXE]UEPEPuu uEÐU WVSu }u 3quPuuPLEPEPVJCuu軤؃uuuEPEPS }t%uu*EVuMM}tSuP譧PuEuuEEPEPWBuu֜uLPv S# uSQjjuEVuЋEƒ|}uuu EuUuuO7^MM9e[^_ÐUVSu] ujujVPSVe[^ÐUu uj舅ÐUWVS}EPEPuAuu՛؃uWu uuuu SWu ug;uSuuS6e[^_ÐU,WVSUUUjE܃} P؋M<  LU MLUEPEPQ@EPEPu@uuu duu_}Euuu֧P豦Suu udu]:}uuuu u=EEEƅ}]uuW͠zWu15E}Euuu2P Suu uu}C}u)uujPu uEEEƅ~]Wu quW4ELUM5P MU} tށ< e[^_ÐUWVSEPEPu>uuu uE33ۋUUuu3EEPEPu耷Cuu` u t} uuu襘Suu uXu]"E} ]f]uY3uuO3EMMEPEPuضGuLJuuu u͋MU U :e[^_UjujݯÐUWVSu ]jj2EEEu}t/W؍EPEPSuuS3EEu@}t.WzPT؍EPEPSuuRSE }u}t&jPu"EjWfUMM9e[^_ÐUVSu]EPEPSu VuSuVXEe[^ÐU(WVSuVR؃u NVƅEu+;}jj{1P0E܃ E EPEPuu uaEPEPjPjuu u0} t5EPEPu謴uuEVPG} uV|uu0E؍EPEPjfPjSuud$} t3EPEPu,uumEWP} uVuPWMMU e[^_UWVS]SʄSR؋} }S贄 ;}uu0PP/E E SoPURURPuu}uE}uuu/P.Pu}jIPuu譡P舠EjSmSUuVEPuuSuuVEPuuWuuuuPuyMM} e[^_U WVSU] t u uEPEPRz EPEPSg MM}EPuWuuuuu u5$}}0Vu} t EPWu0E6Su؃} tEPuuֱ E}t}e}uKSuZ؃} twMM}uWu脱Su+؃} uFVu} t,MM}uWuuu莑Suu uЃt …} ] ]uu胘E}}n~uuu uuuSuu uЃt …} ] ]uuE}uuB}#uu!uu~+uuq+M M$M(1e[^_ÐUVSu] ujujzzPSV>e[^ÐUu jujUjujÐUWVS}U3UEPEPEPR貮EPEPuu W$} t|u[jPL4jj0PyEEPEPuj uELEEjSjjjPقPyEEPEPuj_ jj&Puj܄Ejuj腁 PujPj蟧EPWEEPEPuPEPEPu\1uXuN SW«VW蹫Su uVu u؃(uMU MU e[^_ÐU8WVSu Euzuzu?u&L}<}W肷ءLuMM܋]iu}}܋VEPEPVf0uu+Eԋ]EPEPSG0 uu EuẼ uSOURURP0uufPuuZP-%؃$E3MMEPEPu谨FSu&u}tE}}܉u؁} uwuu͉SuNEԃ}]]Uuu蟉Su EЃ}]]Uuug$؃}܋M 9}؋M$9M(e[^_ÐUWVS3uxu xu7ujjPW#uu C#Euu'#E3ju j[~E jjjYPjjVGPvP"Pjuj苐$uPj}EujyURURURPuj葋,uw~~ +uw\EPEPEPujuvEMM}e[^_ÐU WVS}t}u3jj"UM MMMujuj.}PSj蕱URURURPjFE EPEPuUPLEuPE} uuu EPEPu褥WutSu9؃} uSmEP< u u]VuHPu?PE ~uu}EPuueE8MM9e[^_ÐU WVSu }]jjj|PjjS|PsP\ PjVj؃$SjSj­jWj~{RjЃ$Rj蟭ЃEPEPEPRSuuE,P賧e[^_ÐU WVS}u E}}uE} M MMMjujzjj9 Pjjj- Pj $PSjjujzPSj$URURURPj~E EPEPutUPLEuP E} uuu; EPEPu Wu tSu ؃} uS-kEP< u uEVuĄPu 軄P薊E ~uuEPuuE8MM9e[^_ÐUnexpected characterAREADUWVSH +u !-u Vt;3ې3330\FЁ! VXuM Vhh訚Íe[^_ÐU8WVS}}E E ]EPSu臡SEPuz} t)SEPu_uud'E} uuu Euj Ẽ} uuRiEuGiẼ MM}Љ}MMȐE EPuu֠EPEPuƠ}̉}EPEPu訠uȍEPu虠EE9EuuS2 E؃C} uuhEVu } `VhEPEPV } tK3ۋMЉM}̉}䐍EPEPuEPEPuE]} uE uԋ]ܾEPEPu踟 t#L94uPuuEȃF uMЉM} t#]܋L94uEE uaESu StSt juMwI ؃+t -3VPXt w jt-u PuuPcE Sktr+uPƨE9uH;uNWj C;~؃^uWPuF9uz9]|WjC9]}uWE؃+t-u P)uuPEShh蔁Ee[^_Ð - )U WVSE }tuPLxEjvsjmsEj(| EPEPEPuhuv؃}uYEWu u)Vu uj &uw|Vu tjh[j Wu u)Vu u~ j+ucwWuW tj+j-u:EUU2ۃEPEPuLEPEPu<}~j Ru}~j^:uF} uu*Wu uVu t j1} shѠe[^_ÐUEu3Ð}PXÐU(WVSU]tu Eg}uSRu ENEPEPRFEPEPS8uEuEEMIM3 M9M ;Sj؃F;~MMEPEPuȅ3 9u|TEPEPu謅 }uuuu I uuu uSP%؃F9u}U tML<uPJ t,<t tSRuSu uE܃G9}E܍e[^_ÐUWVSu]Pu EMIML 9 |EPEPV貄EPEPSEPEPS薄EPEPV舄 E+E;-}WEPu_Su؃FE+E;~ڐEPEPu4EPEPu$}uEE} uuu uЃSR؃} uSL؃ t.LЃ<uPM t<t u3 SuC؋Íe[^_ÐU(WVSMLE܅u 3\PURUR4Kuu4 E} EPEPW&EPEPuuuu E؋uu$EPEPuuuu EMLUPuu EUJU$} tڋ}ELu4EPU} u}S} tF5Lu؋ PUJUEu؃<tڋ}uuEE} } u̅|L9]#Ǎe[^_ÐUUu3ÐEPEPjRbEPEPju b uu}u}u@ÐU+EÐUSU] uHu=EPEPjRaEPEPjSa uu}}~@]ÐU WVS]u EEEEÙƋ+EU+ЉUMME+EPGE;|5+ߋE+EP-;|ދUUEEUUEE됋EUEUEUEUe[^_U WVSu] tu S>QE~ ]]}|d} tLE9} E3PEUEPEPR ~uWsEVuKyVGPuiƍe[^_ÐNo more memoryDPGENUWVSU PEuu hhGx uEEU UUUU9] |UC9] }3E;EڋE;}uVu 0S6uÅ}C++Ӌڅ}CC9u U9] }uuubQ }] U<u VWKu}u L}u Vjuƍe[^_ÐUWVSM] =+ȉMÙ=+؉]]]}Eu~ 3ɋǙ=+Mˡ9tMށ~ q q ˋU2Ee[^_ÐU WVS] }uEPEPuS!]UU}ډU}ۋu}}95ȕ~EPEPVSuRDVN=+eӋ EEPEPVSu%U}}}]]}}]MU MU e[^_ÐUVSN3ہ~FÙ=)Й=ȋуuڋe[^ÐUEPEP55U}~EUUWVS}u33Z+PeGWЍB}BuVEPSWp[9]}]yC␐M Me[^_ÐUSE UUE3ہ} t?EPEPuzEPEPuzU9U} U9U~Ë]US]5\ u:9|;`| t t C9}55` ]ÐUSEU 3;u f=~]~UEU;EPEPuyEPEPuyuu tM9Mt} t } uË]ÐUEЅ}@$+Ћ…}3Ð+ȋÐUS]M ;B;~]ÐUVSE3=~5E} t)uVEPu'yu\} uۋÍe[^ÐU uUULUVS] uEPEPuxULM e[^ÐU WVS] u}EPEPEPuxULM Me[^_ÐUWVSu }]SEPuExSEPu8xSEPu+xLUMUUMMe[^_ÐUuXLÐUu] ÐU WVSj u%؉]}KME$+ЉUUyUE$M+ȉMEy$U+Ћƒu}a}u}uKDÅ}Ctt+ttuVE+PV=EuEju'عUuEjK؃ESj`؃SuuWjE}uujuعUt}u$E+EPEHPzؾESjؾ 9EuuSuuWE}j j jEjj0j@sEEPEPuu 9E}VuuSuVSSuuW[E}uu$EPEPuBu 9u}U :UMe[^_ÐU WVSu}FE 3;#SSuEuuEC;~ݿ UUޅ|VEPEPutu uuuP t%WSKSu(;t WP2KyǍe[^_U(WVSEEEEzErEjEbEZERKD=PSVWuuuuuuuuu4EPj_e[^_ÐUÐIllegal GCA handle!GCA2PTRUS]9d}9hhhbllD ]ÐUS]9d}M9h~El| t t lD D t t]ÐUM lED ÐOut of memory.GCAMALLOCUWVS}=t u>5tl  t PlD uhhhwIkl|M Lƍe[^_ÐU5؆u؆ The --th garbage collection....Alignment errorGCSI (marking stack) ** cells, arrays in milliseconds. Too few cells reclaimed.GCSI (final check)No arrays reclaimed.U WVS}=܆u#h$m̆@PIh*W wE؆ tP4؉ށ u؆ tIL0V茻u Vt t VPہ ux+E tu 5xhFhVviE 9xrߋx9] t73Vu V蓺t t VJ9] űpE t&P<؉E utE t,l<E up 3 ~? PL<~ppG ؉ t 3ۋ5h/l<~VClN95d|P+u5̆І+EІԆ+EԆ=܆t=;=hkԈWhpĈShy贈Vh褈5ƙ=;5VWhhEgu55Whh"ge[^_ÐNo more memoryGDPGENUWVS]U R(Euu hh+f S/]}}EE$+ЉU+ډ]E DE9] |UC9] }EEE;ΉM}AEU+‰Eu E}u UBU +EEE+ȋ+]yC+MU+ރ~}uEW}u E E}uE'E u] ~E<u WV KuǍe[^_ÐOut of memory.GETARRAYUSUPP؃uhh dË]ÐUWVS]5pָ;} P t(@;| tP<=p ?벐ƍe[^_ÐUnexpected characterGREADUWVS؃+u t-u fؿSt*3tCSuShhcƍe[^_ÐUXWVSU}j- 3ۋƿ CEe+utuݐD0PKue[^_ÐUS]S|S/]ÐUVSuE] +؍H ;} ÙQSV Pe[^UWVS}E +RP%Ⱥ3ۃA;qSWR|Ѓ C;~e[^_UWVSU 3ۍB;#JUSuV:VW虸C9]}Ǎe[^_UVSEU ='+Pk~= RP3EUEPEPu,iEPEPuiu~u ~à tOE+Et P}} t} u} u%} t&} uu uƍe[^ÐUWVS} EPEP5uH}u M M0PgЋ +MEHƒ}ڃ}uCR9]|+P}gЃ}VRC9]}؋ƍe[^_ÐU WVSu] }EPEPEPSV;}u33uSP,uVzMMU MU UM e[^_ÐUWVSU] ™@`PdPhPlPjdpPR~~dDd؉DTT}T3TuFѽTTttuDž@ +ΉLHHhKx?l << @<#HL@KyT|P33ۋhH;\l<PWP4WXQTl4lD+Ɖ}9U~"#M EDÍe[^_UWVSut} uE3;}+5L PM M t(@;|L<Ee[^_ÐU WVSE3=E3CEۍ}WEPukM } t}t} u̓}}]}t*}WEPjua-}tC}u܋U ދUe[^_UWVSE} }u3EEK=)}؋MEы}EÐE3ۋMM=L}PM}E~E}C4}u9]ȍKM}u< 9]~_LP } C4 9]4 tp9]~'LP ً} C4 tI9] t#ً3 SACLIB Options: +h : print this usage information. +N : NU <- . default = +Np : NUp <- . default = +G : GCM <- . default = +R : RHO <- . default = +P : NPRIME <- . default = +S : NSMPRM <- . default = +T : NPTR1 <- . default = US]h<RSRhFRhYRhkRh}R5ZhhR 5BhPR5܆-h ;R5h0&R5hWR 5h~Q5hQ]ÐUS U t PڋЁ uË]ÐUU ƒÐLÐUSE3=~+СL؃<uP <tLЅ}ڋ©u At]ÐUVSu] SV`| SV/e[^ÐUWVSu} ]uVDSPWVFe[^_U WVSu }}u#V}+EPWuV謊 Psg u} tCEPEPEPuo6uWuuEHP$tSuP؃ 뷐 u3S>؋Íe[^_ÐUWVSuE ]}u3.u WPV'SjPVWPVSjPVl e[^_U WVS}E uu3gu VPU E} tu؃u uSuVWjVu@uSuPu@e[^_USU uEPUEPEPR3]K } tVUPEEPEPuz3EPEPEPuuS$uSj-t} uuS8EE]ÐU$WVS}OU E u 3ۍEPEPEPRSuW? E }tkSWuGP1 Euuu EuW$URURURPuW?uuS3EOU܃[~t+eMMue[^_ÐUWVSE 3t+9]|VuV C9]}Ǎe[^_ÐU VS]uEPEPEPu uWUUe[^ÐUWVSMEUuRPuu u{u E Eu E UIM } uEEPEPEPu"} u#EEPEPEPu@1]L E;~EPEPEPS1EL;} EPEPEPu0E(EPEP]Su0EPEPSu0 }uuuuu uҼuuuuu uVuP8 } }  u3 VRƍe[^_ÐUVSu M M tbEPEPu/uVVEEPEPu/UPLS4O؃} uɁ} uSVq|e[^ÐU WVSUE utk;uPV3^Ez EPEPEPu\/VuWtSuP؃ } uS=؁ u3ۋÍe[^_ÐUWVSE UuRu'u}uRPvEU ]KLM<}EE9E~+EPEPEPQ.VuuI}9}}EuuWz$VuW[>E܃ }uuuuW1uuuuW(PVuW?uVuW uVWURURPuuuuuuW4uuWVuuW螛EuuW(VuuW}]]MM]܉]MMЉE]]M܉MM], M]0 e[^_UWVS} U UWU} tiEPEPue EPEPEPuWP2 uu:uSut؃u~Vut됐SBV:UU2e[^_ÐUVSu UU t0EPEPu Vu`SPXt؃} uS؍e[^ÐUPuujPB Puu ]܋U؉U܋u+ډ]UUE~UUGEe[^_ÐU WVSu }WEu 3VWEWuPjyE9}otkV;uGVIV}uVu S+EPyPuu(PVu\uVu O9}~ƍe[^_ÐUWVSE] u SS؃uWxcHESSPuS؃t/SSvPuPV&S؃uVW6ee[^_ÐUUM Eu PQMÐPQRÐUWVSu ]S7ESES1E MIM MMV+]VЃ}uuEPuR6uEPuRui}uEWSuduSwVSuu)$PVu c u3 WM9M1e[^_ÐUWVS]EPEPuDEPEPuju~ u39Eu =u{EPEPu 3ۃ 9]|Gu~9E~1u <uuu W]t VPSc C9]} u3ƍe[^_ÐUWVS} uujSPj"E EPEPu4EPEPu@VWu^E$} t6EPEPuuuEvESPb؃} ú} uS؍e[^_UWVS} u W'E= MM쐐EPuuyUPLSWOOuSSuEAuEPEPuW8uuIuEEuPuW6EVua} eV#ƍe[^_ÐU WVS] ujEuSEPEPSuuNuurN}}EEPuTNSVSWVuE SuEPutuutS؃LÍe[^_ÐU WVSEPEPu ~jj2tEuuLEujEuPMEuuMuW, PEEE~jjjjsEWuPuPE}RuuuSxSu Lu]] SuL9uu]듉]Euu=sUMUMMe[^_Unexpected characterIPREADU WVSa؃(t ^9E EsS;puSeu(uRSpt ESetV9E(EPEPR`؃+t - JsVou V=et1Vot E8E-uuE(u&EPEP-uuu(ErS1ot>T`؃^t \#rSdtHR3WSu] `؃ )t j\MAMWShYhYMU U :e[^_ÐPrime list exhaustedIPRESUWVSu u8uu+u aEuVEPVp uSb؋EEPEPSEPVEjPeE$TUEUJU} EPEPuu uuĜV9Euuuu覜S9EuSVuu5WuN{Puq{ SuuPuWEuW1 uW迉}$LWuuu uh[h[ Ee[^_ÐUVS]Su SjhEujE u~DujEEPEPVjuju uuuv[E 뮐 uQSPVu؃} t7EPEPEPukuujuVjEE(멐Íe[^ÐUVSuV.SVÍe[^UWVS}Wu ug tPVL P<4W uWuFuP4V輹ƍe[^_U WVSu[u EPEPu\xuuEPEPW) }u3WuoLuu= uTVS$V*= u@P< uSVODS= uVS&$P(P,P0PhPSڞPPP PhPV謞,8,qX|9,|V ,0V,0 f~H@P~j Nd@GP;d+H@R~ |< @PVR9,|# V ,0! V,0 X9(ujjVj؃ ~E,~0|~ p|Vg| \|Í[^_ÐUEe[^_ÐUWVS}u uuV`jP_xu jEEPEPEPuuj ugu]Eĉ}Si tىMLEEURu9EPvEE E ~ E#EuV@_uPjKE܃u'itu讳PiEtEEPEPEPuUPLEuuV8Euuh tMMىMu}} u MMELUuu}4uu7EuBEE %EMM]E}u |)uu6||u ى||}uuE@PTJE܃ EEMM}tMMtugtEÅ~EuEE1M؉MЋM̉MEÅ|EESvuuuuuPuPjIE܃ "uuuuuuuPjVuuuuuuPjVM؉MЋM̉MȋMMMMuu -6Euu 6EuuuPuuu_Pu PSYuu6Vu5EuVu 5EuEà ~ uEDžEÅ/Vu[EuV[EǃEDž~uЋMMMM uȋMMMMuuiVu3؋EÃ_Vu3Vu3[EuV'[]>uEPVuu9uujPjHE܃( ut}uuuZuPj\GE܃MԉM؋MMMMMM|]MM} ufE܋E܍p[^_ÐU WVSU] t u mEPEPR EPEPS MM}EPuWuuu u}}.VuAF} t EPWu.E6SuF؃} tEPuuF E}t}m}uKSuE؃} twMM}uWuSuE؃} uFVuE} t,MM}uWuVuSE} uVˤSä؋M1Me[^_ÐUWVS}EPEPupc uu覽Vu'1؃u]Vu 1u؋UDž~uu;tuuJXe[^_ÐUWVS]uEPEPSbEPEPVbuu }ƾuuq}ƾeuu EuuEuu(E}|i~uu0uu|Su/Ѓt …} ] ]uuwE}}b~uu /uuSu /Ѓt …} ] ]uuE}uuB}#uu!uu~VuuqVMMM 1e[^_ÐUWVSu] uE33SVESVǢE~uVܥVW u]H EPEPEPuVuWSuPdB؃(} uS蜡؋UMM1Ue[^_UWVS}] SWURURURPSW蹽 u~QEPEPEPuuW艽uթ~VuS$UPsAMMMMC룐VuSTPIAV͠e[^_ÐUWVS}u UU t~VR~oEPEPuCEPEPEPuVWѼ$u~Su@؃u~Su@؃u} uV֨~ SV@؃} t'}uWVuSuY@؃} uߋÍe[^_ÐUWVS}u WPW-E u蚟EuEPEPuDVEPuS^uW袺E } t3EPVuuu\SESP?؃} uЁ} uÍe[^_ÐUWVS}EPEPu ]uW+u*uuRyuuRkSSR_EPEPEPuuuujqtuu諷SW.+tƅ}]믐]말e[^_Uu u螭P` ÐUWVSEU }uEuWRj&EpEPEPEPR} t_EPEPEPuWuVE CE+E;~uuV EMM } u9]|WuVE C9]}Ee[^_ÐU,WVS} UUWRWQEWuEE+؉]UJUEuWu؃ uuEuZuSuG؃SxE؃}~EW6EuuuQE}~"EHPuu5Puu詫E}u5uuu PuujP PSui uVE 2V>URURjPv}uVMIMPQu؃ tuSEV SjuEWң+]pW茪Ѓ}~EPEPuRuQEPEPuRK }(Su腪Sju,Puu SuuESSuPVu$VWuA EPEPEPVWeuubruPeL؃$VSWPWٲUUe[^_ÐUWVSUE u}to;uWPVaJUE EPEPEPuWVuu tSuPj8؃ } uS袗؁ u3ۋÍe[^_UWVSMU Eu H=uPR+UE qLM<}EE9E~EPEPEPQSuu#}9}}(EPEPEPuSuu7؃cEPEPEPuEPEPEPu uuuVuuV tSuP/7؃ } t}  } u}} uUS>СP}< u3ҋe[^_ÐU VSUE u P0cU3ۅtOErEPEPEPuu ub uVPSq؃} uÍe[^ÐUWVS}EjW衡K8؃+u-u 4u VWEPEPu W}t:uVW7N4 SA<uSFu(tM1MU e[^_ÐU(WVS]utu Egu @4EEPEPu]u葔EE},S4EV3EuN} PEȋEPEPEPQ}܉}  P lEPEPEPuuuuzuuuVtSPEEPl4؃ } tPE LE+E9| tSuuE؃ } tPML}9<E؍e[^_ÐUWVSuE ]}u3.u WPVSjPVWPVrSjPV|e[^_UVSuE ]u3-u PV(SjPVʚPVSjPV1e[^ÐU VSuE tbu P[/_ E} t;EPEPEPuOuFPtSuP2؃ 뿐 u3S&؋Íe[^ÐUVSu] EPEPuuSV؃NtLtH] EPEPEPuuuVSuPf2؃(} uS螑؋Íe[^ÐU WVS}E utbu VPR-^ E} t;EPEPEPu7VuGPtSuP1؃ 뾐 u3S؋Íe[^_ÐUWVSU t}u EPEPEPRujD} u EULE)jW謠WuuPSu FE+E;~Ё} t3EPEPEPu3ujUDPWu$iǍe[^_ÐUWVSUEtu rP/E u s/EEPEPuuďE} ttPEȋWEPEPEPQuEuuV` tSPu0؃ } tPML}9<| u3ۋÍe[^_ÐUuŢP+PY/ÐUWVS}3u WEEߋPEE= t6Vl+ÃSVQURURP6E}CSuoE EPEPuV+uuG~uuFjPUE}uu EEM} M}e[^_ÐU$WVS]} u }u]H@~ jj P,EUzSEWES,E] W,=p u;5pu]M9M}E]} t Lu4uܡPM M E tLP<3UU~EELuP up ;pP}G}  .E]} t LM MܡPu4u E tLP<3UU EELMP u p ':pPu}D} t /} u}pPuM4(E]LM MܡPu4u<tULMP u p q9pPu} t u} u }MM}u%} uu5pEo}t} tkuq9Et[]LM MܡPu4u  u p 8pPM}tu܉upPM EE}}I=LPU~E EtE= uB=LPUy EEtE= ú} uPu PuM4PM< u L MEe[^_ÐU}%ÐUMU tt~ RP(LÐPQiÐUWVSU} uuEEPEPEPR辫9]|cWuOE} tDMLE+9u1EPEPEPQsPu?Pu"E C9]}Ee[^_ÐUS]U u3uWj33uPWjV؃(EPEPuSuW9cEPEPuuuuSuW'P tfLE}; ʡPڡPˋ t+LE9EPʋ릋ˡP͐ u P Pƍe[^_ÐU VSE= u E qEu]VSuj } u } u]} t9EPEPu9 } tSPM ]Ee[^ÐUHWVS]S ESEuu ӨPEԃu EȋLE܋E3ۃ}uuCWuu藋 }tS4E؃9]%EE}uullEСLMЋEu܉uM؉ME@;uu9}|EPEPu MȋučDEMM3ۍuuCuuuي }t9]Gu3LEUEPEPSuRLEM PEE=LMuЉ E@PWuESGPuE؃9]|E GE@;߅}CPu4kEWEPuSukE} t:WEPuEPEPuۉuuuEE$} uơLMuЉ K{E̋u9u59]|u33EPEPjR uSVPPV^(}uSPVMe[^ÐUVSuVu SǼ } SVU؋Íe[^ÐU S]U EPEPEPRSEPEPRS(ub} uSEE]ÐUUE ;ÐUE u3ÐPu ÐUWVS}L4}S苎ءLP4 uƋǍe[^_UWVSEUuRu uqu}uRPu EU ]KL}} MEE9E~,EPEPEPuqVuu}9}}DEPEPEPupuuu uu S VuaEPEPEPupEPEPEPu|p uuuu uuu StVuP } t} } u0} u #} uuu u؃ ]V7Ё u P u3ҋe[^_U WVSE} ]u3huS边}USWLJ] pEPEPEPu`ouWVSuP؃(} uSH7؋Íe[^_U WVSU} Etwu PWWwE rEPEPEPunuuW$uWV tSuPy؃ } u u3 S6؋Íe[^_ÐUVS]u uuuS]PVS6e[^ÐU WVS]u$Vu Su uURURuPSu u1 0VuSu uEuuSu uu(Puu u}(}M,9e[^_ÐU WVS}Etu3iE uNEPEPEPumuuWu  uWu VSuP&؃ } uS^5؋Íe[^_ÐUWVS}u ]u3SWDPVSPVWAe[^_ÐU WVSU} Eu3wu PWfE rEPEPEPuluuWuWV SuPQ؃ } uS4؋Íe[^_ÐUVS]u uuSkPVS!e[^ÐUWVS]EPEPuEPEPuju u9Eu >u{EPEPuk 3ۃ 9]|Gu9E~1u uuu W]t VPSV C9]} u3ƍe[^_ÐUuuu ~PίUWVSM} UEuMEuPRW2UE IM䐋LM4uEE9E~EPEPEPQjSuu#u9u}(EPEPEPujSuul؃jEPEPEPujEPEPEPuxj }uuuW uuWutSuP؃ } t} } uuu uUS2СPu4 u3ҋe[^_ÐUVS]u uSHPVSPe[^ÐUS]S$P藫PS]ÐUVS]uu ESVTS蘳|ƍe[^ÐUWVS] uV:EV@VDEE ]Wuttu9+u|]u@WPu~uVSESV؃$uCSuujOPVujE$}u} u E u0EUMUMe[^_ÐU WVS}W&9u 9u9P+CS Wuuj$URMQu PuWuV؃ uuVPSjuPujU UM$e[^_ÐU4WVSM MEPU< u%LEPuuEMME]ESEPu8g UL<u#} u֋UL<u ETEPEPufuuuEu3uuu`EЃuu EPEPufVuuDESP6؃ } uS.EE 3uGEPVuRf 9}tVEPu=f MM܃ EPEPufVEPufuuuPuuIE؃0SP؃} uuSEԃ} ^MԉM%EЍe[^_ÐU@WVS} }E E EL4ẼE؉EE = tE]EPSuGeSEPu:e}uuE؃} u E+E;}+}Љ}VjC9]}VjUԉU t8EPEPudVuuj薅EVPL$} uuV5Euj(Eԃ0uuEuuGEċ}+}UU t?u=LE4uE=LUP<} uā} ]EPSucSEPucuusE؃ }tmUU t_EP}Wucuuu>ELU M}ʉM=LE P<}} u} UU9U} EE܍e[^_ÐElements of finite field exhaustedMMPDMAUWVSPM< uLU_}uuu EDMM uEPVub VEPusbjuuz3SP؃ } uWS} uEPEPWz 3MIMjjj9 9u uuVuh,hOZVjuu uPu u؃ VWu jPu SuuPVWu M E4Vu 2PjjjzEPWu jF(Wk29EWEe[^_U WVSUU }EPWu7a WEPuauuuu u SP؃} uS))VS } uV )e[^_ÐU WVSu]S1ES;EE tfW1+u|QW@8uVS\ESVW^;Suuu u0PVu uu} u EuL(EUMM 9e[^_UWVSEUuRu uuEU ]KL}} MEE9E~,EPEPEPu_Vuud}9}}DEPEPEPux_uuu uu S VuaEPEPEPu4_EPEPEPu _ uuuu 3 uuu StVuP } t} } u0} u #} uuu uU؃ ]V&Ё u P u3ҋe[^_UWVSMu3EPEPQ ^3ۋ}O UU쐐uEPu] uE} uSu W{؃} tuEPu] E-uSuu 8؃ Suu W؃FE+E;~ˋUU} TÍe[^_ÐUWVSUEu}tj;uWPu VdJUE EPEPEPu ]WVuu u$tSuP؃ } u u3 S$؋Íe[^_ÐUWVS}Muujj35u3,׻A;IMWRu uЃC9]}e[^_ÐElements of Z_p exhaustedMPGCDCUTWVS}uU}uE33}u6uus3Euu u E3uuj2}u6uu73Euu uF E3uuj2Y}u:uuu Euuu juuu jEPEPuu ubEPEPuu uL(uuu KE MIMuQy2uul2PSu EuuI,Euu;,Ejuu+juu+؃(u+SWu PU4L@PEG9} uuuu uh h&SWuu jE}tWjuu uVu+Pu$tWjuu uSuS+Pu$fEPEPEPSVu uuuSuEPuuVEEuNE ;uj޻E܃C;~} MM؍EPEPuSuuI2Pu j uPu j=؍EPEPuSuu (Vuj)EVSj)Vuj)E$Vuj)EURURuuuPuSuuu uuuu uPuu u$ PjPSu uuV>E]܋U؉U܋UU+]܉]}u}~UUEEe[^_ÐUWVS} EUCu 8EU uNu䐐LM4uEE9E~EPEPEPQ FSuu#u9u}(EPEPEPuESuu蠮؃hEPEPEPuEEPEPEPuE }uUU™uuWu ЃtSuR6؃ } t} } uuu uUSB СPu4 u3ҋe[^_ÐUEu3ÐjPu uFUWVS} uu33VWuSVWuUUUe[^_ÐU WVSU} EMMrؐEPEPEPuxDuSuW؃ SuWV؃} t S uÍe[^_U WVSUuEtntjuPVu jEazE EPEPEPuCuVu W tSuP肬؃ } u u3S ؋Íe[^_ÐUEPEPuu uEÐU WVSE}u3iEuN EPEPEPu4CuWuu jV Wuu VSuPƫ؃ } uS ؋Íe[^_ÐUWVSU 9]| 9]}}CLERjEjjǾVEjjj}u+ WWuj謻LM9 |uWu蚾 }C;|3WuujpLM9 |uWu^ +uuWjoPrEMVWujLM9 |uVu uVjPECEH;~u EEe[^_U$WVS] SuEPULE Ejj[EWEuuujWPu&ءL<~#SuVPjSWuj ELEUU9E}uuuEujEEPEPuR@ujECE+EH;~u`E UUEPEPu@uSuj`uP虨E$} uʋUJUML؃<uPM MM<tuuOEPj8E}~WuѻVP"Ve[^_ÐU VSuE t[ EEPEPEPuX?uuVЉUtEHESPR؃ } u u3 S؋Íe[^ÐUWVS]u }EPEPWVSu3(uWSjPuSj VPSjUMMMU e[^_ÐUWVSLM Mu uEPuVE}3ۃIL4;P4@;~Lj4uFСLP< CEH;~uu%E EPEPu=uE]KL<uPKEEE<tuSEPjEVP} ujVu u e[^_ÐU$WVS]u ĸES'E@P]Ejj=E EPEPu< EPEPu P\ tjP!VP PSe[^ÐU$WVS] EPEPu谣EPEPS袣u |Du |uuuuu } uuuu }Iuu |uuuuguX } uuuJuuuu=u, |uuuuu }uuuu脘E2uuuukPuuuuYPEUURuV]SusuuEuVSuX(uuj} tKuVSu/uuDPuE uVSuuuPWF Wue[^_UWVS] EPEPu贡SuSuS |VWWVe[^_ÐUEPEPuf }u }u31u~ up }ÐUS] EPEPuEPEPSuuFuu9PS ]ÐUS]S|SR]ÐUWVS}u EFEPEPWz }uuVu莹E uރ} u E3CEPEPu $ }uuSu8E uxۃt5} u-;+PuE+PuEËUMUMMe[^_ÐUUu E>EPEPRrEPEPuuRub ~ PugEEÐUSU] u SemuRV`EPEPREPEPSu,bu"b+؋Å}@ u uu*Puuu*P]ÐUUu ÐPLÐUS]u PS]ÐUWVSUuEEEPEPR: uka؃}uZEu j Wu)EURURuPQ juEu30uuu}jueE} j-襄EPEPWu%Qu襃j.肄9] |2j u莸EURURWPPE0PLC9] }υ~j+ }j--e[^_ÐUWVSEPEPuEPEPu/EPEPuu+u}+}$^;~Ju Ѓ|USu+PREEPuܫ}OFM 1M9e[^_ÐUUu E>EPEPRFEPEPuuOug_ } PucEEÐUEu3ÐjP4ÐUSEPEPuݛu_~ ]EuuPS]ÐUVSu] SVR|ދÍe[^ÐUVSu] SV.ދÍe[^ÐUUu3ÐEPEPRujuP|ÐUUu3ÐLÐUS]SOPj |jPPj]ÐU(SU] tu3EPEPR覚EPEPS蘚}uK}uuu6&j}u*EPEPEPuuuu&u{}u*EPEPEPuuuu%uKEPEPEPuuEPEPEPuuj(uu%uu%PS]ÐUS]u3u PS]UVS]STSTPȧjPLaPVMe[^ÐUVSvU}/u eU yu3 SVee[^ÐUWVSu} u3BWVSVȹSW迹W'\}VS؃SVe[^_ÐUUu3ÐL4[ÐUVSU] u 2u$EPEPRjEPEPS\}uO}u!uu`؃j}u"uu#uS_u}u"uu#uS_uEPEPEPuuIuur#Puuf#P}_؃$u3C}t+uStVSDVu9Euu#PS葌e[^ÐUUu jXqÐEPEPR&uF}}tj/~u.}UWVSu} ]uV<SPWVe[^_U$WVSE] uEEEu8LEPYEuԤEPLUxEPEPEPSgEPEPEPuWj$} tuu]EPEPEPu,uVSu EPSVuWuu#E}tuu`E} uMU MU MU e[^_ÐUWVSE UuRu,u}uRPvEU ]KLM<}EE9E~+EPEPEPQ-Vuuv}9}}؋Íe[^ÐU WVSE u3WE}O EPEPEPu]CSj uPW.$VSPo } uVƍe[^_ÐUVSuE u3!PVSVPzSPV؋Íe[^ÐU VSUE u3nuP^E rEPEPEPu$u u uVSuPn؃ } uS؋Íe[^ÐError RPPOWREAD: Digit was expected. Error RPPOWREAD: Exponent is too big. UWVS] Ejj! k؃^t {g#g}SgotH]3WSuhj؃ )t 6gMAMWShNhN|MU U :e[^_ÐU WVSUu Etu3\u PVK EzEPEPEPuXuVWSuPh؃(} uS@؋Íe[^_UWVSMU Eu H=uPRA+UE qLM<}EE9E~EPEPEPQSuu#}9}}(EPEPEPuSuu EEPEPuHuSVPJ} uV`ƍe[^_USE UUEEPEPuEPEPuuu0 SP{J؃} uS؋]UWVSu ]Su|ZSVsZURURURURURPWy,Vuuu*VuuuMMe[^_ÐUnexpected characterVLREADUS L(u>L)tDvHSPIK)u S,tPhoh%oË]UWVS}U U t-uVEPuuWNft C} u3ۋÍe[^_UVSUUj(sN} tPEPEPu/uC} t,u]j,5NVSuu} uj)Ne[^ÐUSE UUEEPEPuEPEPuuue SPCH؃} uS軧؋]USE UUEEPEPuPEPEPu@uuIm SPG؃} uSS؋]UWVS}u EM3ۅtqtmEM𐐐EPEPuEPEPuuuuVihÙڃ uuVW PSVWF؃ } uÍe[^_ÐUnexpected characterVREADUVS^IS"XuShqhq VSFH؃SWuSvMuV1fEƍe[^ÐUVSEE= t%u]VSuuK} ue[^ÐUS] EPEPSu0UR?uu&؃jbSU WVSu MU ܆MU MU MUPmE9}8+`@!?$sXttttttt ttttptttttttttttttttttttttttxpuPbEPHEP0E{PEfPERPE>PE*6j 6Ѣj U GC9]UM U܆M UM UM9MU e[^_USu3<t@:u~Ѓ]US=tЃ;u]ÐU=uÐUS]dKdS+]UWVS3kWZ >Ct~t WVVtPZ4G|h[^_ÐÐUEEEP0EPjjoo u+}u%jEPjUo @u}cj~pP`phcjEPjo jojOpP1pUWVS} 3GЃuWt9Wu?uDuWif;G EfGtsuxmEu3[^_Puw?n E|4EEU;uE[^_+ЉUEERPw n E}fO [^_ËGE]+؅Sjuu-Et+EH)GÉGW +Ћ};} Wf}t'fG@tWdu [^_Ë[^_]GE]+؅uWdP[^_ø[^_ÐUEގÐUWVS}E%ގuK%ގtGÃ+t-t%ގu[EG%ގtD؃0G؋Ёގu}t[^_Ë[^_k Ѓ03[^_UE Eu t fh huu3 f tÐUE Puha UEPu uG ÐU$EfEUUURjEEEPu EP UWVS}u EEEEEEؔԔEEEkExExǂǂǂǂ@Ex|Euuj%ViETEPHMU܃%uEEEEEEEEގt4E܋Ёގ}$uEEE MEE@EU܃4_-**# p+e210F3;9t7tx 6tq5tl!8teht [tcLt%lt%ElE}4YEE}?E},} E@EU܃]tuMEE܃Ex${~~}~~}}}}}}}}}}}}}}}}}}}}}@~}}}}}@~}~~~~~~}}}}}}}}}}}@~}}}}}fE}UE}B}tkEǀܒ:}tkEǀܒ$}tkEǀܒkEǀܒEkǂ9E}EkEU}Ekǂܒǂ9E}EkEU}}t!Ekǂܒǂ9E}NF}t!Ekǂܒǂ9E}'Ekǂܒǂ9E}EEkEUEEj%uPeEkU ЃЉUEP@EU}tpE}~VkExtxuEttEE@Etx9E}tEu3ҊFڅuEE؃}'ގtt=ԔuؔHyW!E%ގuGPWEގu ؔWu+pԔa%P@؃%}tIEގtkE ÃЉE3Fގu$u3F؃*u1j*u E3FEގu :EE%ގtkE ÃЉE3Fގu}uEÉ]lu3ҊFEhu$ Ehu3FE}Lu# E}Lu3FEt( Etk|PVuU%ߏ؃}tEhE/}tElE}tELEE%ގt&XtGt EtEl%ߏ؃nto=Ԕufcta[t\ؔHyWE%ގuGPWEގu ؔWu($[1c(itnt8suЋEHPEPWuuSu EF6EhuK}t!kEؔfǀ}uEPUؔf[luG}tkEؔǀ1}'EPUؔ}tkEؔǀ}EPUؔ}t(EHPuW|PuSu Et/"EPW|PuSur Et EEm=Ԕt}uE}2EEؔHyWE;uGPWE; ؔWu&tEE؃}'EtE؃}E}E}kExExot]ttAt8MTAEPT@ExEMXMX @ExE@Ext8t/M\QU\ @ExJE7tStJMdQUd`d B`@ExEt8t/MhAEh@ExEt7t.MlMl f@ExREBt5t,MpQUp @ExEExE9EE[^_ÐUWVS}EEEEEEEEE d|`x[$y]]]]]]}m]]]]]]d3[^_E'EEEEE ؔHyW؃+t4-t,0trGPW؃+t-t 0tPEEHEؔHyW؃0tGPW؃0q} ig}]ؔHyW@Ext>GPWExt%EXt ؔWP!EGtA?uujh$ܔP ܔ^_ÐUWVkE00tY6 tA?tujh&P ^_ÐUuḣ u9Mƀ̇/u ͇PÐUTh(u=tNh*u)t:h0EPjuEP EPEP}3øÐCCCPOSIX/usr/lib/locale/UxWVSE=6~&h"}t D[^_L[^_=}h"T[^_ËEu T[^_ËUNk ȁ??UΊMʉM]ډMԋM]̊E̋EÉUȋUЉUEMMEMˉM]֊]ۉ]ă~UEMEEăuɉMEEEE3E Ё?U?]EكFM?ًMMMU܋U#׉U#ljE#߉]E#ljE3t]o]AM%?E?UEEE*3t],]É]]UUUUEEt݉]]}]]Á c]NjU+׉UMȋ]MȉUUMȉ]܋]MȋEًыE؋EMM?UԋU#׉U#߉]MЋM#ωM#ljE]̋]]ۉEčCGPk  UUӉM]]ىEUUڋUM]]ىEEË]؋EU‹ỦMMщ]]EEӋ]UUڋMˋ]ًM] EË]EÉE]UڋM]]ˉEEMUUЉUEMM‰EU‰EEUЉUEȨ%E]؉]MẺEUEȨiE%?EU?M?]?UUM܋Mكk ]UӉEŰUЉM ]ċ]Ӌ]ȉEUUЉMMʋUыM]ˋ]EE؉UUЉMMڋU܉]]ӋE‹UЋEȉUMʋUMʉMU]ӋE܉UU‰MMȋE]ȋEEM]ˋ]ȉMEȉMEE3e?e?3} }]G |]NjeeE+}3ǁ~&h"}t D[^_L[^_iU‹U EM ڋUڋ}ut @EuuE[^_Vuu+ [^_GU}]EPu u8 ؋E~>E=~(h"]v (EEE=sh"EEEU4WVS}u [^_J u&juh{hxhpjEEEPEPEPjE EPEPjE ESD;tujEPjnE jEPj^E u[^_ËE[^_ÐD$Pt$Ð5\t$ t$  ÐL$;+WFÐL$)UWVS}\u3[^_Ëu3[^_ÃPWt[^_ÐUWV}E F8uG8=u^_ÊF8t?u ~=u^_3^_ËL$+)EÐUWV}fGt ^_Ãu W\<Gu'tfGDtEh ^_èDt,5`95dvf@@t P895dwGGfGt EW +ЉUuww HxGPW^_ÃtfO ^_GfGtfG^_ÐUPu u, ÐUu7uu u ÐUWVS}u3[^_ËE Pbu(x+EEatgrtSwt.%+EEat@rt,wt3[^_ÅtE;E-t"3tE  E hSu E}3[^_GtEfGE 8auG'E 8ru EEEfGE 8auujju < }3[^_GGG [^_ÐUW=`?t8f@t.9=dw7uh 3_Ë=`?uȃ?uj j_ÐUWVSd+`EjPeu3[^_Ëߋ5`95dv95dw`=t P=`Eãd[^_ÐUWEE EPE;tEPjW> _ÐUuI=WV|$ t$T$L$I|L:tAI|C:t8I|::t/I|1:t&I|(:tI|:tI|:t I| :t붋^_3^_ÐUWS]ESu8€t fSSPu  fC t5*h [_SPu  fC t [_Ë[_ÐL$+rÃNt@UE~> w9=uhr@EHȸ3U=uh2@E3ÐUE3Uu iuhËE HȸU 3ÐUu -uhËE HȸЋU!3ÐUu uhËE HȸUÐU$EEEEfEEEURPu ) UÐVt$T$ +9Ѓ#9urЃ#9uRЃ#uq9u6Ѓ#uU9uЃ#u9c*ut**but!*But*bw^ø^3^ÐVW3I|$ t$2OL$tMtGItAt>It8t5It/t,It&t#IttIttIt tItD$ _^ÐWV|$L$3ыϋt$+΋|$ ȃ3^_D$ÐL$+=ÐL$T$*=ÐT$R;T$Vt$ +#u|B#u_B#uBB#u%B#uBjBtbt Btb^D$ÐVT$t$ +#u|B#u_B#uBB#u%B#uBjBtbt Btb^D$ÐUW} }u_GЁufGfGtG9Gvu!oGW;?BWtPfGtOG fGE_ËGPWUPG fGE_W 2GUG fGE_ø_ÐZ"(rt3h␐UEʃ‰MUUEUЃ0ÐUVSu]{tB+C)CS=2Su jup+fC t [^ËC3[^u u66 E 3[^ÐU$WVS}uEEEEEDž<Dž\\DŽDŽ@\ |Dž`lhj%W6dL dP@dU%u h DžtDžXDžTDžPDžLEގt6kX EЉXdP@dUގuʃ}$udEDžxdDžxdHdU3e-0*# +1r0g.b2SW8H*6=524)-7"htHL 9ltDžxDžtxMxM@x@EDžL%ގt6kL EЉLdP@dUގuʃ}$t/E@tLPxP1LTdP@dU뵃xEEx$DeDeeeeeeeeeeeeeeeeLeeeeeeeeeeDDDeeeeeԲLeejeLeeL}}t/XDŽ*DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9``}t/XDŽ* DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`}`Džpdh}titt+XDŽ*DŽ* 9`}7)XDŽ* DŽ* 9`} X`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`8`-}titt+XDŽ*DŽ* 9`}7)XDŽ*DŽ* 9`} X`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`R`G}t/XDŽ*DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9``}titt+XDŽ*DŽ* 9`}7)XDŽ*DŽ* 9`} X`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`}`Džpdh}t/XDŽ*DŽ* 9`}`TtDŽ( DŽ( T9`}`PtDŽ( DŽ( P9`}`dhj%hh-d}trDž\`~O\u Dž<\t Dž<\@\9`<tE}}Dž\`f\ʼn|8 3$Է߸̸{hR<&EU U U U U U U U U U uU U bU RM M $7U U $U U U U \@\9`lF8VUuUEtF EE}utE+F4)EFE9Es~t V%FDt%uEPj U+R) t V=#fF t [^_ËE[^_EEEEEGGE txk$RxxIBxxxx xx*777777777xxxxxxxxxxxExxxxxxxxxxxxxxxxxxxxxxxxxxȾEȾxxx xxuxxxOEDžpEE}y}tH(EEt8/EبtU U MtU U MtEE؉]EЃ%EЍ؃0o}tHE@u&E PU E@uS(ÉE((P(8t EHEy㋅(HEsDžpEE}t JDžpEE}u,EبtU U MtVME E U7ptH(EEt"H(EEtEEEXtpt EE}tEEt%HUEkBHUAEE E EE'}%GEt%u+É8EU 49Ms"URVPS3[^_PSR/% EE E EM,}tH(EEt8/EبtU U MtU U MtEE؉]E}}EE=t؉E4 Ѓ%EЍ؃06UtEE4 @!tEEE4 4uE@uJ4K0<48 Kk 4+ʉ40 Ћ4K0Eب@ U+ӋM+ʉ4 MM E MgE@uE}tG}uE}t2H((UEE%='E HE UME%=E uK}uEuE}Gu܈E߈E ؈EۈE EuEEEU ‰EEEE}GuE҈EËEEPEPE~Puub]uEE艅(Eu5S"89E~((||0u H(E|9E|(+ЉU}E(HE}'E@uE}t2H((UEE%='E HE UME%=E u-}u'uEE؈Eۈ EuEEEU ‰EEEEEËEPEPE<~<Puu ؃}t7E؋U;~+;0t&EEE(E[Eبt)EEEE(E+tEEEE(E(~)t#M}AMCMAMH(pE0@E(H(pEu}~E@EE<}(%Dž(<<~ME+(E܉Eċ(H(y LE@E~ ptU}BUCUBU뻋E0@EE@uE}t2HUEE%='E HE UME%=E uD}u>uEE}Eu܈E߈i؈EۈXEuEEEU ‰EEEE}EuE҈EËE؉]E4uEب@uDEE E,4#UMK%U4uԋEب@t"U+ӋM+ʉ4~MM E؋EبX}NUXtFotxt7EE$EE EEEEPEPE@~Puu ؃}tEEE;tbEEبtEEE;t= tEEE;tC4UBU}u"Dž40E0@E}uEtE@EE艅0~!tCUBU0H0pߋ0~ E܉EāM؍Eƅ]thEH0y؉00 0UЃ0BJU4Uй 0EЈPHEЋ 0묍E9}]t Dž,- Dž,+EЋ,PHEЋE%ގt Dž,E Dž,eEЋ,PHEЍ+ЉUUāM؀PU@0W}t,H(؍EYE E ؍E2EبDu E؋EЉ4}t Dž|GE%u Dž|EЁގuB}$u|t4HTE@t4E@4E2k4 ЃЉ4G뒋EE߃@EE؃߃EM}dEЁގtaЉXGE%ގtC%ގkX EЉXE䃽uۃ}$uX D d?E@uE}tDEE E U]u}tDEE E UeؿE䈅؍E}t[}tEEEE7EبtEEEtEEEE+É8UEEEM;ETMU tHu&U؋+ЉUM+UM+ȉ4~3EVjh04쉅4֋4U 09Ms"URVPhu([^_PhR E}tPE̋U 49Ms URVPuu&[^_PuR E}tVEP49Us!EPVjuFu'[^_juPC EEEE4~3EVjh4쉅4֋4U 09Ms"URVPhu([^_PhR E8~IU 49MsURVPSGu$[^_PSRG EEfE܉4~3EVjh4쉅4֋4U 09Ms"URVPhu([^_PhR EE؀tPEȋU 49Ms URVPuEu&[^_PuRC EEEU;+Љ4~3EVjh4쉅4֋4U 09Ms&URVPh,[^_PhR EMMUjuuuu u'ÐUjuuuu uÐU WVS}E }uKt=u@EEvWj0P  Ƈ[^_ËE %u8EPu u iE@B E}t)$Uihr @B E}t}}3G؍GE~ ;v]+EuURuPEPVP E++ӉU~ U}tE~$PuR E;sE@0HE;rEEvENjހ>5|309]uE@1HEE}tuNK@9EUE[^_ÐUPWVS}GEM%E=uEPw7` ?U ?M_Ë؁?]% Eu uމU܍V Pk  EƉM]Ћ]ىuEȋEUċUڋUӋ]ĉM ]ًMȉuu܉EE΋uЉUUUӉUMЋ؋uMދu؉]]]ӉU]؋EuuEEEc#؉]ME܉EEE>E%?U?M?]?UU ڃk M]ى]uЋuE UȋUUȉM]]]ދuЉEEEU‰MM̉]]M܉uuMȋEUEEUMыMыM‰EUMMuuEEE%?EU?UM?M]-ދE΋UθHU#ЉU}C9]MΉE؉]θ?M#ȉMUEE}E[^_ËNjUMȋ]MȋuMȋEы?###uEk ΊUщŮ]ډMԋMˋ]؉uuދuˉMuމ]֊E؋EE[^_#ωM̋ȋUEӉE[^_ÐUE ]uEËEE5ÐUWVS}EE}GЃuWt9Wu?uDuWG EE U;n;fG9GfGuryu3[^_EVuw ؅|$];t7+EÉEVPw ؅}fO E U‹M 3[^_ËE U‹M 3[^_ËGE]+؅;sSuuO )GÉGW +Ћ};} Wg+u6GDt&uEE Pj u t WE[^_]GE]+؅qWLE J‹M 3U+Ћ[^_3[^_3[^_ÐUW=`9=dv"tf@t P9=dw_ÐUWVS]u[^_Ct;u6t3s}!SOs}fGtwGfGGG[^_ÐUWVS}Eu>`E8t)u]f@t P ؃>uu]E[^_fGu#tjPw 3[^_GutGt9GvWRufG t [^_3[^_ÐUW} GЃRBuDG9G PW3ҊU t_WUu_3E_ËЃu:3EEjEPwj u3E_fO _ËЃuWt9Wu?uDu Wu[fGD2WRHyW3EP fG t GPWUfG t_3E_ø_ÐUWVS}w_+މwfGDtG +Gy&G +ƉW +W};} Wu3[^_SVwT E|$E+u3[^_SVw0 E}fO [^_ÐUW}GЃt uh _ÃfGu W?G9Gu,fGDu$W +ЉG +G};} W3_ÐU0WVS]sfCt%CCS S CVVu4jj,EPVW|Eԅ~EPCt9EhGuGGW W GVt2!fOGUW GVtGu@fG[^_ÐUS]C +SyC[9~[U} uE E E URE u3ËU E3UЋEBÐUEp3ÐUju{ÐL$)ÐL$&,kÐUhEEPhTu } Eh3øÐL$6+rÃNtL$+ÐUWS]} Où k Ӄ0؅u[_ÐUWVSE}v3[^_Ã=,u20Ѓ,,ʃ 0$(E؋=(EuT7;r>;r:(;v  (9=u (G[^_ËNj?;w$;C,7E@Ep=j$P;t5 Et=ٍQUփE"++Ё UE;s3[^_ÉE=v'hE u3[^_ËEEuu+EP3[^_É5$0E+E$P;t$,EI3[^_É=(951=&UEt P(HH9 $uU WVS]t Ct SF+ƙEu Fta;t]tYE E9EvEEPSWc ;s)U;r+։E™ M[^_Ë[^_Ð׋|$D$L$ t uH3Ð׋Ƌ|$t$L$ L$ D$Ð׋|$D$L$ rD$L$ D$ÐV5lD$tlP Yt^ÐL$)T$lË֋t$L$:tJtA:tAt8:t8t/:t/t&:t&t:tt:tt :t t3ÍFÐT$#u^#uG#u0#u#uЄtBt BtBB+D$ÐL$)r T$t ÃNtL$T$ d*r T$tډ ÃNtL$+rÃNth(t$ t$ $̸0+s h Ðh(t$t$t$ $̸0,s hÐ(Ðh(t$ t$ ̸0+s h ÐL$L$T$0*ÐL$L$T$0*ÐL$L$T$0*ÐL$L$T$0*gÐL$L$0+KÐT$0*2Ð搹 ސL$T$%* Ð(ÃNuhÐ54I5tO6O6O 6O6LP6xP6P!6Q&6Q-6Q26Q86RA6:E:HL:XR:hY:`:g:Ln:dx:t~:(::::L:: ::4::H::L:::$:p::;l ;;X;h;;$;(;-;3;9;4=;@C;hH;N;$U;[;a;Tg;l;s;<z; ~; ; ;L ; ; ;;@;d;;l;;;;;;H;x;;X;;4< <l << <X"<(<D /< 5<d!;<(#A<#G<$N<,%W<&]<'b<)i<@*o<*y< +<+<.</<40<,3<3<t4<4<H9<9<$:<P:<p:<:<;<;<H<<l>< ?=?=?=@=@A =C =dD&=D-=H4=pH>=ID=II=`JO=JV=XK\=Ld=xMk=Ms=N}=O=O=P=`R=0S=S=S=U=U=V=tW=PX=Y=[=4]=<^=\^=^=`=xa=b> c >f>tg>h$>j+>tk2>pl9>4r@>sG>dtM>LvT>wY>w`>xg>tyn>0zu>Hz{>4{>|><~>@>>h>>l>>>H>>>p>>>p>\>x>? ??p???%?,?82?9???F?M?S?0\?`a?$i?<p?u?`{?@?@?T??8??<???<?\?? ????d??4??0@l @\@̸@8!@(@H1@,8@@@G@Q@Z@a@Dg@l@r@Hy@@@0@d@@$@L@@P@x@@4 @@@8@t@@@d@@@AL A AA< AP%A\)Ap/Ad5A;AAAGA@MATAD[AaAhA<lA`rAxAA(AA0AA A<AAA`AtAAAALAA AA8ApA A4B B$BBB$B+B 2B9B@BXGBMBTBTZB`B gBmB0tBDzBB BBD BlBB4BBBBBBBxB Bh B B BL B B B BC CxCC  C'C(.C5C<;CBCpICMCSCYC(`CHeCjCpCvC}C(CdCCD C C CD!C`!C!C"C#C#C$C$C$C%C&C 'CH'C'C(C8(CX(Dt( D(D)DL*D*#D$+(DP+-Dx+5D,,9D,?D-EDl-JD /ND/SD 0XD0]D1aD1fD,1kDD1pD`1uD1yD1}DH2Dl2D2D2D3D5D5DL6D6D6D7D,8D8D8D9DP:D:DX;Dt;D;D;E<EH< Ed<E<E=E=#E>*EH>0E>7E>=E@EEd@LE@SEAYEC_E4DhEEnEXFxE`GEHEXIEIEJEJEKELEMENEPETQERESETEUEVETXElXEXF0Y FLYFhYFY FY'FZ-FZ2F[8F8[=F[DFX\JF]QF]XF]_F^eFLalFarFxbwFtc~FLeFheFeFfFDfFfF$hFn G79 85q&5 1Z$.H+jt'!]6$J !5w%^_KLza N } dP@fff&h&QG!+ A j<h"2S58C7{-_k2+/4 U# >D K) m5\W?YU }?^Fz !%ph]( ZJ(9H/9Y!,Ћ0PpЌ0PpЍ`ԠCCCCCCC ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~. ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~.@(#)$Header: crt0.s 1.8 1991/09/18 22:00:07 $$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: setjmp.h 1.19 1992/10/15 21:40:18 $@(#)head:setjmp.h 1.9$Header: signal.h 1.13 1992/06/19 18:44:15 $@(#)head:signal.h 1.5$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: time.h 1.10 1992/01/11 01:47:15 $@(#)head:time.h 1.5$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: timer.h 1.5 1992/07/04 20:56:00 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: times.h 1.7 1990/07/29 22:53:53 $$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: param.h 1.18 1990/05/16 20:57:08 $$Header: mc_param.h 1.10 1989/11/15 09:29:49 $$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: ctype.h 1.11 1990/06/24 15:35:17 $@(#)head:ctype.h 1.9$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: ctype.h 1.11 1990/06/24 15:35:17 $@(#)head:ctype.h 1.9$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: malloc.h 1.9 1992/06/18 16:34:29 $@(#)head:malloc.h 1.4$Header: stdio.h 1.13 1991/01/17 18:06:51 $@(#)head:stdio.h 2.14$Header: types.h 1.22 1990/12/14 19:21:52 $$Header: _init_locale.c 1.4 1991/09/18 21:58:08 $@(#)libc-port:locale/_init_locale.c 1.0 AT&T-UP$Header: locale.h 1.15 1992/07/06 18:22:06 $@(#)head:locale.h 1.0 AT&T-UP$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7acomp: 2.0.0 (00048)$Header: _ppinit.c 1.1 1989/04/15 10:46:53 $acomp: 2.0.0 (00048)@(#)libc-port:gen/abort.c 1.12$Header: signal.h 1.13 1992/06/19 18:44:15 $@(#)head:signal.h 1.5$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/fputs.c 3.10$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)libc-port:stdio/stdiom.h 1.3acomp: 2.0.0 (00048)$Header: isspace.c 1.2 1991/09/18 21:57:13 $$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9acomp: 2.0.0 (00048)@(#)libc-port:gen/atoi.c 2.5$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9acomp: 2.0.0 (00048)@(#)libc-port:print/printf.c 1.10$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/scanf.c 1.8$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8acomp: 2.0.0 (00048)$Header: doscan.c 1.14 1992/06/26 22:10:12 $@(#)libc-port:stdio/doscan.c 2.18$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: unistd.h 1.10 1992/03/11 21:45:57 $@(#)head:unistd.h 1.5$Header: unistd.h 1.23 1992/07/04 20:56:19 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: limits.h 1.9 1992/01/11 02:01:09 $@(#)head:limits.h 1.3$Header: limits.h 1.22 1992/07/04 20:54:30 $$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9$Header: varargs.h 1.8 1992/06/19 17:56:44 $@(#)head:varargs.h 1.4$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)$Header: atof.c 1.10 1992/01/30 01:53:06 $@(#)libc-i386:libc-i386/gen/atof.c 1.4$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11acomp: 2.0.0 (00048)@(#)$Header: setjmp.s 1.4 1991/12/13 00:25:52 $$Header: _set_tab.c 1.6 1992/06/24 23:49:51 $@(#)libc-port:locale/_set_tab.c 1.0 AT&T-UP$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: locale.h 1.15 1992/07/06 18:22:06 $@(#)head:locale.h 1.0 AT&T-UP$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: fcntl.h 1.9 1992/03/11 21:29:48 $@(#)head:fcntl.h 1.8$Header: fcntl.h 1.17 1992/07/17 17:07:57 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)$Header: _locale.c 1.9 1992/04/23 00:51:49 $@(#)libc-port:locale/_locale.c $Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: stat.h 1.20 1992/07/04 20:55:21 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-m32:gen/ptod.c 1.7$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)$Header: ldexp.c 1.6 1991/09/09 22:28:55 $$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11acomp: 2.0.0 (00048)@(#)libc-port:stdio/system.c 1.9$Header: signal.h 1.13 1992/06/19 18:44:15 $@(#)head:signal.h 1.5$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)$Header: execl.s 1.3 1989/10/10 15:31:43 $@(#)$Header: execv.s 1.4 1989/10/10 15:31:57 $@(#)$Header: execve.s 1.3 1989/10/10 15:32:08 $@(#)$Header: exit.s 1.3 1989/10/10 15:32:19 $@(#)libc-port:gen/getenv.c 1.6acomp: 2.0.0 (00048)@(#)$Header: times.s 1.3 1989/10/10 15:34:48 $@(#)libc-port:stdio/filbuf.c 2.5$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/fopen.c 1.13$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: fcntl.h 1.9 1992/03/11 21:29:48 $@(#)head:fcntl.h 1.8$Header: fcntl.h 1.17 1992/07/17 17:07:57 $$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/findiop.c 1.6$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:gen/calloc.c 1.7$Header: stdlib.h 1.24 1992/07/15 20:44:42 $acomp: 2.0.0 (00048)@(#)$Header: memccpy.s 1.2 1989/10/10 15:31:32 $@(#)libc-port:print/fprintf.c 1.10$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)$Header: read.s 1.4 1992/01/08 22:14:22 $$Header: sigsetops.c 1.1 1992/01/08 21:55:29 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: param.h 1.20 1992/07/04 20:54:56 $$Header: mc_param.h 1.12 1992/07/04 20:46:36 $$Header: signal.h 1.52 1992/08/05 00:16:55 $$Header: errno.h 1.17 1992/07/04 20:54:11 $acomp: 2.0.0 (00048)@(#)libc-port:print/sprintf.c 1.9$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)$Header: strcmp.s 1.7 1992/05/31 00:42:09 $@(#)$Header: strncat.s 1.3 1989/10/10 15:32:56 $@(#)$Header: strncpy.s 1.2 1989/10/10 15:33:14 $@(#)$Header: open.s 1.3 1989/10/10 15:31:43 $@(#)$Header: stat.s 1.3 1989/10/10 15:33:55 $@(#)$Header: strcat.s 1.5 1992/01/09 23:21:37 $@(#)$Header: strcpy.s 1.4 1991/12/13 23:55:39 $@(#)libc-port:stdio/ungetc.c 2.7$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)$Header: vfork.s 1.3 1992/01/28 23:14:24 $$Header: doprnt.c 1.12 1992/05/27 22:27:50 $@(#)libc-port:print/doprnt.c 3.11$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: limits.h 1.9 1992/01/11 02:01:09 $@(#)head:limits.h 1.3$Header: limits.h 1.22 1992/07/04 20:54:30 $$Header: string.h 1.14 1992/03/12 22:56:06 $@(#)head:string.h 1.7$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9@(#)$Header: stdarg.h 1.8 1992/06/19 18:16:13 $ head:stdarg.h 1.8$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: nan.h 1.5 1992/03/11 21:31:54 $@(#)head:nan.h 1.12@(#)libc-port:print/print.h 1.8$Header: limits.h 1.22 1992/07/04 20:54:30 $acomp: 2.0.0 (00048)@(#)libc-i386:libc-i386/gen/ecvt.c 1.6$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11$Header: nan.h 1.5 1992/03/11 21:31:54 $@(#)head:nan.h 1.12$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)libc-i386:gen/dtop.c 1.1$Header: errno.h 1.6 1992/01/11 01:57:43 $@(#)head:errno.h 1.4$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: math.h 1.24 1992/05/30 20:14:48 $@(#)head:math.h 2.11$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22acomp: 2.0.0 (00048)@(#)libc-i386:gen/biglitpow.s 1.1@(#)$Header: frexp.c 1.5 1991/09/09 22:28:44 $$Header: nan.h 1.5 1992/03/11 21:31:54 $@(#)head:nan.h 1.12acomp: 2.0.0 (00048)@(#)libc-port:stdio/fwrite.c 3.12$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)libc-port:stdio/stdiom.h 1.3$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)libc-port:stdio/flsbuf.c 2.12$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $@(#)libc-port:stdio/stdiom.h 1.3$Header: errno.h 1.17 1992/07/04 20:54:11 $$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: statfs.h 1.9 1992/07/04 20:55:23 $acomp: 2.0.0 (00048)$Header: align_malloc.c 1.3 1992/07/03 01:27:08 $acomp: 2.0.0 (00048)@(#)$Header: close.s 1.3 1989/10/10 15:31:17 $@(#)libc-port:stdio/data.c 2.9$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $acomp: 2.0.0 (00048)@(#)$Header: fstatfs.s 1.3 1989/10/10 15:32:51 $@(#)libc-port:gen/isatty.c 1.7$Header: termio.h 1.27 1992/07/04 20:55:55 $acomp: 2.0.0 (00048)@(#)$Header: i386_data.s 1.3 1989/10/10 15:30:54 $@(#)$Header: ioctl.s 1.4 1992/01/08 22:13:46 $@(#)$Header: lseek.s 1.3 1989/10/10 15:31:00 $@(#)$Header: ltostr.c 1.3 1989/10/10 20:24:17 $acomp: 2.0.0 (00048)@(#)libc-port:gen/malloc.c 1.14$Header: stdlib.h 1.24 1992/07/15 20:44:42 $$Header: values.h 1.10 1992/02/19 20:14:28 $@(#)head:values.h 1.22$Header: assert.h 1.11 1992/03/11 21:27:17 $@(#)head:assert.h 1.6acomp: 2.0.0 (00048)@(#)$Header: memchr.s 1.2 1989/10/10 15:31:43 $@(#)$Header: memcpy.s 1.3 1989/10/10 15:31:56 $@(#)$Header: memset.s 1.4 1989/10/10 15:32:05 $@(#)$Header: strchr.s 1.2 1989/10/10 15:32:32 $@(#)$Header: strlen.s 1.5 1991/12/13 23:55:55 $@(#)$Header: wait.s 1.7 1992/01/08 22:14:34 $$Header: _loc_data.c 1.7 1992/06/24 23:47:55 $@(#)libc-port:locale/_loc_data.c 1.0 AT&T-UP$Header: stdio.h 1.25 1992/06/18 20:24:36 $@(#)head:stdio.h 2.14$Header: types.h 1.28 1992/07/04 20:56:13 $$Header: _locale.h 1.4 1991/09/18 21:58:17 $@(#)libc-port:locale/_locale.h 1.0 AT&T-UP$Header: ctype.h 1.15 1992/03/11 21:28:03 $@(#)head:ctype.h 1.9$Header: langinfo.h 1.7 1992/03/11 21:30:39 $@(#)langinfo.h 1.1 89/12/06 acomp: 2.0.0 (00048)@(#)$Header: write.s 1.4 1992/01/08 22:14:45 $@(#)$Header: sigaction.s 1.3 1991/09/18 22:00:28 $@(#)$Header: signal.s 1.11 1992/01/10 22:06:28 $@(#)$Header: kill.s 1.3 1989/10/10 15:30:46 $@(#)$Header: getpid.s 1.3 1989/10/10 15:30:03 $@(#)$Header: cerror.s 1.4 1992/01/08 22:13:17 $.file gcrt0.s.text<.data\.bss.comment0.filegmain.c.text P.data`.bss.comment0p .file#gfileio.c.text\Q.data`.bss.comment\"RR1<.file9ginterface.c.text.data` .bss.commentP?N`Zgl y 4 hprompt  4R d.fileHgstrtable.c.text .dataJ.bss.commentD .filetgparser.c.text t.data0F,.bss.commentH  yyprhsyyrhs yyr1yyr2&yydefactjyypactyypgotofyytableyycheck)d4yy_ec8yy_metayy_baseyy_defyy_nxtyy_chkZ>8Fyy_init|{.file~gAFUPGS.c.text|`.data.bssM|.filegAFUPIIR.c.text}|.data.bss\}.filegAFUPIIWS.c.text}'.data.bssk}.filegAFUPMPR.c.text L.data.bssz .filegAFUPRB.c.textl< .data.bssl.filegAFUPRICL.c.text .data.bss.filegAFUPRICS.c.text(.data.bss.filegAFUPRII.c.textU.data.bss.filegAFUPRL.c.textLL.data.bssL.filegAFUPRLS.c.text.data.bss.filegAFUPRRI.c.textl.data.bssl.filegAFUPRRS.c.text.data.bss.filegAFUPSF.c.text .data.bss.filegAFUPSFBA.c.textĎ .data.bssĎ.filegAFUPSFN.c.text .data.bss.filegAFUPSR.c.textĐ4.data.bss.Đ.filegAFUPVAR.c.textx.data.bss=.filegAFUPWRITE.c.textp .data.bssLp.file gAFUSPSFB.c.text T.data.bss[ .file)gAFWRITE.c.text`T.data.bssj`.file2gAIFAN.c.text.data.bssy.file;gAMPDMV.c.texth.data.bssh.fileDgAMPSAFP.c.text|0.data.bss|.fileMgAMSIGN.c.text$.data.bss.fileVgAMSIGNIR.c.textГ.data.bssГ.file_gAMUPBES.c.textp,.data.bssp.filehgAMUPBHT.c.text.data.bss.fileqgAMUPIIR.c.text|.data.bss.filezgAMUPIIWS.c.text,<.data.bss,.filegAMUPMPR.c.texthD.data.bssh.filegAMUPNT.c.text.data.bss.filegAMUPRBH.c.text .data.bss.filegAMUPRICS.c.text<.data.bss-.filegAMUPRICSW.c.text.data.bss<.filegAMUPRINCS.c.texth4.data.bssKh.filegAMUPRLS.c.text.data.bssZ.filegAMUPRRS.c.textL.data.bssiL.filegAMUPSR.c.textL,.data.bssxL.filegAMUPTR.c.textx.data.bssx.filegAMUPTR1.c.text.data.bss.filegAMUPVARIR.c.text.data.bss.filegANDWRITE.c.text8..data.bss8.filegANFAF.c.textȤ.data.bssȤ.filegANIIPE.c.textt.data.bsst.file gANPEDE.c.texthh.data.bssh.filegANPROD.c.textЩ.data.bssЩ.filegANREPE.c.text` .data.bss`.file%gANSUM.c.text.data.bss.file.gAREAD.c.text .data.bss.file7gASSPR.c.text .data.bss,.file@gAWRITE.c.texth.data.bss;.fileIgBEGINSACLIB.c.texto.data.bssJ.fileRgBITRAN.c.text.data.bssY.file]gBKSP.c.textķ.data.bss.comment\phķ.filefgCCONC.c.textܷ@.data.bsswܷ.fileogCINV.c.textP.data.bss.filexgCLEAR.c.textl .data.bssl.filegCLOCK.c.text,.data.bss.comment.filegCLOUT.c.textD.data.bss.filegCOMP.c.text@.data.bss.filegCOMP2.c.text<`.data.bss<.filegCOMP3.c.text,.data.bss.filegCOMP4.c.textȹ8.data.bssȹ.filegCONC.c.text8.data.bss.filegCOPYTO.c.text8(.data.bss 8.filegCPLEXN.c.text` .data.bss `.filegCREAD.c.text(0.data.bss.commentp+ (.filegCREADB.c.textX .data.bss.comment@: X.filegCSFPAR.c.textxT.data.bssI x.filegCSINT.c.text̻ .data.bssX ̻.filegCSSUB.c.text.data.bssg .filegCSUN.c.textT .data.bssv T.filegCTMI.c.text@4.data.bss @.filegCWRITE.c.textt0.data.bss.comment\p t.file"gDAND.c.text`.data.bss .file+gDEGCD.c.text.data.bss .file4gDGCD.c.text$.data.bss .file=gDIELOC.c.text.data.bss .fileHgDIGIT.c.text.data.bss.comment@ .fileQgDIIPREAD.c.textؿ%.data.bss ؿ.fileZgDIIPWRITE.c.text.data.bss .filecgDIPDEG.c.textl,.data.bss l.filelgDIPFP.c.text .data.bss .fileugDIPINS.c.text|(.data.bss* |.file~gDIRPREAD.c.text'.data.bss9 .filegDIRPWRITE.c.text#.data.bssH .filegDLOG2.c.text .data.bssW .filegDMPPRD.c.text.data.bssf .filegDMPSUM.c.textTt.data.bssu T.filegDMUPNR.c.text.data.bss .filegDNIMP.c.textPX.data.bss P.filegDNOT.c.text.data.bss .filegDOR.c.textd.data.bss .filegDPCC.c.text.data.bss .filegDPFP.c.text .data.bss .filegDPGEN.c.text.data.bss .filegDPR.c.textH .data.bss H.filegDQR.c.textH.data.bss H.filegDRAN.c.text X.data.bss .filegDRANN.c.textxH.data.bss x.filegDSQRTF.c.text.data.bss) .filegDVCMP.c.textDd.data.bss8 D.file gENDSACLIB.c.textt .data.bssG .file)gEQUAL.c.text.data.bssV .file2gEVEN.c.text(.data.bsse .file;gEXPF.c.text(.data.bsst .fileDgEXTENT.c.textT.data.bss .fileMgFILINE.c.textH.data.bss H.fileVgFIRST.c.textX.data.bss X.file_gFIRST2.c.texth8.data.bss h.filehgFIRST3.c.textH.data.bss .fileqgFIRST4.c.textd.data.bss .filezgFOURTH.c.textL.data.bss L.filegFREEARRAY.c.textd.data.bss.comment 0 d.filegFRESL.c.textt.data.bss t.filegFRLSM.c.text(.data.bss (.filegGC.c.text.data.bss gc_dummy.filegGCA2PTR.c.textX.data.bss( .filegGCAFREE.c.textd.data.bss7 .filegGCAGET.c.textL.data.bssF L.filegGCAMALLOC.c.texth .data.bssU h.filegGCGLOBAL.c.text .data.bssd .filegGCSI.c.text$J.data.bsss $.filegGDPGEN.c.text .data.bss .filegGETARRAY.c.textL.data.bss.comment<p .filegGETLIST.c.textHd.data.bss H.filegGREAD.c.text .data.bss .filegGWRITE.c.textLh.data.bss L.filegIABSF.c.text$.data.bss .filegIBCIND.c.textL.data.bss .file!gIBCOEF.c.text$L.data.bss $.file*gIBCPS.c.textpL.data.bss p.file3gICOMP.c.text .data.bss .file<gICRAND.c.text .data.bss .fileEgIDEGCD.c.textlx.data.bss' l.fileNgIDEQ.c.textt .data.bss6 .fileWgIDIF.c.textXJ.data.bssE X.file`gIDIPR2.c.texth0.data.bssT h.fileigIDP2.c.text.data.bssc .filergIDPR.c.text#.data.bssr .file{gIDQ.c.text .data.bss .filegIDQR.c.text.data.bss .filegIDREM.c.text .data.bss .filegIEGCD.c.texth.data.bss .filegIEQ.c.text4 ..data.bss 4.filegIEVEN.c.text@(.data.bss @.filegIEXP.c.texthd.data.bss h.filegIFACT.c.textX.data.bss .filegIFACTL.c.text$d.data.bss $.filegIFATL.c.text .data.bss.filegIFCL2.c.text.data.bss.filegIFLTA.c.textT .data.bss&T.filegIGCD.c.text.data.bss5.filegIGCDCF.c.textP.data.bssD.filegIHEGCD.c.text<.data.bssS<.filegIIC.c.text .data.bssb .file gILCM.c.text H.data.bssq .filegILCOMB.c.text `.data.bss .filegILOG2.c.textL X.data.bssL .file&gILPDS.c.text .data.bss .file/gILWRITE.c.text d.data.bss .file8gIMAX.c.text$.data.bss.fileAgIMIN.c.text@$.data.bss@.fileJgIMP2.c.textd4.data.bssd.fileSgIMPB.c.text.data.bss.file\gIMPDS.c.textl8.data.bssl.fileegINEG.c.text .data.bss.filengINFOSACLIB.c.text<L'.data.bss<.filewgINV.c.text8.data.bss%.filegIODD.c.text(.data.bss4.filegIORD2.c.text`.data.bssC.filegIPABS.c.textH0.data.bssRH.filegIPAFME.c.textx,.data.bssax.filegIPBEILV.c.text.data.bssp.filegIPBHT.c.textXP.data.bssX.filegIPBHTLV.c.text.data.bss.filegIPBHTMV.c.text4.data.bss4.filegIPBREI.c.text.data.bss.filegIPC.c.textl.data.bssl.filegIPCEVP.c.text .data.bss.filegIPCONST.c.text L.data.bss .filegIPCPP.c.textX8.data.bssX.filegIPCRA.c.text.data.bss.filegIPCSFB.c.textD .data.bssD .file gIPDER.c.text .data.bss .file gIPDIF.c.textd!.data.bss$d!.file gIPDMV.c.text(#.data.bss3(#.file" gIPDQR.c.text# .data.bssB#.file+ gIPDSCR.c.text$\.data.bssQ$.file4 gIPDWRITE.c.text,%t.data.bss`,%.file= gIPEMV.c.text&  .data.bsso&.fileF gIPEQ.c.text'.data.bss~'.fileO gIPEVAL.c.text).data.bss).fileX gIPEXP.c.text@*`.data.bss@*.filea gIPEXPREAD.c.text*l.data.bss*.filej gIPEXPREADR.c.text +t.data.bss +.files gIPFAC.c.text+'.data.bss+.file| gIPFACTREAD.c.textH.|.data.bssH..file gIPFCB.c.text/p.data.bss/.file gIPFLC.c.text40-.data.bss40.file gIPFRP.c.text,3.data.bss,3.file gIPFSD.c.text3 .data.bss3.file gIPFSFB.c.textt4`.data.bss#t4.file gIPGCDC.c.text4tP.data.bss24.file gIPGFCB.c.textH9p.data.bssAH9.file gIPGSUB.c.text9l.data.bssP9.file gIPHDMV.c.text$:,.data.bss_$:.file gIPIC.c.textP: .data.bssnP:.file gIPICPP.c.textp:<.data.bss}p:.file gIPICS.c.text:p.data.bss:.file gIPIHOM.c.text;.data.bss;.file gIPIISS.c.text; .data.bss;.file gIPIIWS.c.textH<$.data.bssH<.file gIPINT.c.textl>.data.bssl>.file gIPIP.c.text ?.data.bss ?.file gIPIPP.c.text? .data.bss?.file' gIPIPR.c.text? .data.bss?.file0 gIPIQ.c.text@.data.bss@.file9 gIPIQH.c.text@Al.data.bss@A.fileB gIPLCPP.c.textC.data.bss"C.fileK gIPLEV.c.textdD`.data.bss1dD.fileT gIPLRRI.c.textD@).data.bss@D.file] gIPMAXN.c.textHl.data.bssOH.filef gIPMONFACT.c.textpH.data.bss^pH.fileo gIPNEG.c.textI.data.bssmI.filex gIPNT.c.textI .data.bss|I.file gIPONE.c.text`J\.data.bss`J.file gIPOWER.c.textJ.data.bssJ.file gIPP2P.c.textXK.data.bssXK.file gIPPFAC2.c.textLx.data.bssL.file gIPPGSD.c.textxM\.data.bssxM.file gIPPNPRS.c.textM .data.bssM.file gIPPOWREAD.c.textN0.data.bssN.file gIPPP.c.textO$.data.bssO.file gIPPROD.c.textO .data.bssO.file gIPPSC.c.textP.data.bssP.file gIPPSR.c.text`R.data.bss!`R.file gIPPVED.c.text0S .data.bss00S.file gIPQ.c.textS(.data.bss?S.file gIPQR.c.textS.data.bssNS.file gIPRAN.c.textU .data.bss]U.file gIPRCH.c.textU .data.bsslU.file gIPRCHS.c.textV .data.bss{V.file gIPRCN1.c.texttW.data.bsstW.file# gIPRCNP.c.textPX4.data.bssPX.file, gIPREAD.c.textY).data.bssY.file5 gIPRES.c.text[.data.bss[.file> gIPRICL.c.text4].data.bss4].fileG gIPRIM.c.text<^ .data.bss<^.fileP gIPRIMO.c.text\^|.data.bss\^.fileY gIPRIMS.c.text^,.data.bss^.fileb gIPRIMU.c.text`t.data.bss`.filek gIPRIMW.c.textxa0.data.bssxa.filet gIPRIST.c.textbx .data.bss b.file} gIPROD.c.text c`#.data.bss/ c.file gIPROD2X2.c.textf .data.bss>f.file gIPROD3X2.c.texttgP .data.bssMtg.file gIPROD3X3.c.texth.data.bss\h.file gIPRODA.c.textj.data.bsskj.file gIPRPRS.c.texttk .data.bssztk.file gIPRRII.c.textplO.data.bsspl.file gIPRRLS.c.text4r.data.bss4r.file gIPRRRI.c.texts.data.bsss.file gIPRRS.c.textdt.data.bssdt.file gIPSCPP.c.textLv .data.bssLv.file gIPSF.c.textw .data.bssw.file gIPSFBA.c.textw .data.bssw.file gIPSFSD.c.textx .data.bssx.file gIPSIFI.c.textty .data.bssty.file gIPSIGN.c.text0z.data.bss0z.file gIPSMV.c.textHz.data.bssHz.file gIPSPRS.c.text4{t.data.bss.4{.file gIPSQRT.c.text|.data.bss=|.file( gIPSRM.c.text<~.data.bssL<~.file1 gIPSRMS.c.text@ .data.bss[@.file: gIPSRP.c.textl.data.bssj.fileC gIPSUB.c.texth.data.bssyh.fileL gIPSUM.c.textp.data.bss.fileU gIPSUMN.c.textl|.data.bssl.file^ gIPTERMREAD.c.text .data.bss.fileg gIPTPR.c.text.data.bss.filep gIPTR.c.textHP.data.bssH.filey gIPTR1.c.textL.data.bss.file gIPTR1LV.c.text.data.bss.file gIPTRAN.c.textp.data.bssp.file gIPTRLV.c.text.data.bss.file gIPTRMV.c.text .data.bss.file gIPTRUN.c.textp .data.bssp.file gIPVCHT.c.text\.data.bss-\.file gIPVDEG12.c.textx.data.bss<x.file gIPWRITE.c.text.data.bssK.file gIQ.c.text .data.bssZ.file gIQR.c.texth.data.bss.commentDi.file gIRAND.c.textp.data.bssxp.file gIREAD.c.texth.data.bssh.file gIREM.c.text .data.bss.file gIROOT.c.text .data.bss.file gISATOM.c.text .data.bss.file gISFPF.c.text=.data.bss.file gISFPIR.c.text .data.bss.file gISGCA.c.text .data.bss.file& gISIGNF.c.textH.data.bss.file/ gISLIST.c.text0.data.bss.file8 gISNIL.c.text.data.bss.fileA gISOBJECT.c.text00.data.bss0.fileJ gISPD.c.text`.data.bss,`.fileS gISPFAC2.c.text$.data.bss;$.file\ gISPSFB.c.text<T.data.bssJ<.filee gISPT.c.text .data.bssY.filen gISQRT.c.text` .data.bssh`.filew gISUM.c.text@F.data.bssw@.file gISZERO.c.text@.data.bss@.file gITRUNC.c.textT0.data.bssT.file gIUPBEI.c.text.data.bss.file gIUPBES.c.text8X.data.bss8.file gIUPBHT.c.text.data.bss.file gIUPBRE.c.text< .data.bss<.file gIUPCHT.c.text.data.bss.file gIUPFAC.c.text.data.bss.file gIUPFDS.c.text <!.data.bss .file gIUPIHT.c.text\H.data.bss \.file gIUPIIR.c.texth.data.bss.file gIUPNT.c.text x.data.bss+ .file gIUPQH.c.text0.data.bss:.file gIUPQHL.c.text@.data.bssI.file gIUPQS.c.textp.data.bssX.filegIUPRB.c.textd .data.bssgd.filegIUPRC.c.textl.data.bssvl.filegIUPRLP.c.text4L.data.bss4.file"gIUPSR.c.text .data.bss.file+gIUPTPR.c.text0<.data.bss0.file4gIUPTR.c.textl .data.bssl.file=gIUPTR1.c.text\p.data.bss\.fileFgIUPVAR.c.text̸l.data.bss̸.fileOgIUPVOI.c.text8.data.bss8.fileXgIUPVSI.c.text.data.bss.fileagIUPWRITE.c.textH.data.bssH.filejgIUSFPF.c.text,T.data.bss ,.filesgIUSFPF2.c.text.data.bss.file|gIWRITE.c.text.data.bss*.filegKARATSUBA.c.textD.data.bss9.filegLASTCELL.c.text,.data.bssH.filegLBIBMS.c.text@ .data.bssW.filegLBIBS.c.textD|.data.bssfD.filegLBIM.c.text .data.bssu.filegLCONC.c.text.data.bss.filegLDSMKB.c.textHT(.data.bssH.filegLDSSBR.c.text4.data.bss.filegLEINST.c.text`.data.bss.filegLELTI.c.text04.data.bss0.filegLENGTH.c.textd(.data.bssd.filegLEROT.c.text.data.bss.filegLETTER.c.text$(.data.bss$.filegLEXNEX.c.textL.data.bssL.filegLFS.c.textL.data.bss .file gLINS.c.textP(.data.bssP.filegLINSRT.c.textx.data.bss)x.filegLIST1.c.text<.data.bss8.file'gLIST10.c.text4p .data.bssG4.file0gLIST2.c.textd.data.bssV.file9gLIST3.c.text0.data.bsse.fileBgLIST4.c.text8<.data.bsst8.fileKgLIST5.c.texttD.data.bsst.fileVgLKAHEAD.c.text.data.bss.commentp.file_gLMERGE.c.text.data.bss.filehgLPERM.c.textd`.data.bssd.fileqgLREAD.c.text.data.bss.filezgLSRCH.c.textP.data.bss.filegLWRITE.c.textt.data.bss.filegMAIPDE.c.textL.data.bssL.filegMAIPDM.c.text.data.bss.filegMAIPHM.c.text.data.bss .filegMAIPP.c.text<.data.bss<.filegMARK.c.textP  .data.bss(P.filegMAX.c.text\.data.bss7\.filegMCPMV.c.textp .data.bssFp.filegMDCRA.c.textd<.data.bssUd.filegMDDIF.c.text.data.bssd.filegMDEXP.c.textd.data.bsss.filegMDHOM.c.text,.data.bss.filegMDINV.c.text@d.data.bss@.filegMDINVB.c.text.data.bss.filegMDLCRA.c.textD.data.bssD.file gMDNEG.c.text.data.bss.filegMDPROD.c.text<.data.bss.filegMDQ.c.text<$.data.bss<.file%gMDRAN.c.text`d.data.bss`.file.gMDSUM.c.text.data.bss.file7gMEMBER.c.textP.data.bss .file@gMIAIM.c.text(.data.bss(.fileIgMICINS.c.textl.data.bss'.fileRgMICS.c.text0|.data.bss60.file[gMIDCRA.c.text`.data.bssE.filedgMIDIF.c.text 0.data.bssT .filemgMIEXP.c.text<.data.bssc<.filevgMIHOM.c.text4.data.bssr.filegMIINV.c.texth.data.bss.filegMIN.c.text`.data.bss`.filegMINEG.c.textt.data.bsst.filegMINNCT.c.textP.data.bss.filegMIPDIF.c.text.data.bss.filegMIPFSM.c.text.data.bss.filegMIPHOM.c.textL.data.bssL.filegMIPIPR.c.text,.data.bss.filegMIPISE.c.text .data.bss .filegMIPMIP.c.text.data.bss.filegMIPMON.c.text88.data.bss8.filegMIPNEG.c.textp.data.bss&p.filegMIPPR.c.text (.data.bss5 .filegMIPRAN.c.text4 .data.bssD4.filegMIPROD.c.text.data.bssS.filegMIPSUM.c.text$x.data.bssb$.filegMIQ.c.text$.data.bssq.filegMIRAN.c.text(.data.bss.file!gMISUM.c.text4.data.bss.file*gMIUPQR.c.text .data.bss.file3gMIUPSE.c.text  .data.bss .file<gMMDDET.c.text.data.bss.fileEgMMDNSB.c.text.data.bss.fileNgMMPDMA.c.text,.data.bss,.fileWgMMPEV.c.text.data.bss.file`gMMPIQR.c.text .data.bss.fileigMPDIF.c.textT.data.bssT.filergMPEMV.c.text.data.bss.file{gMPEVAL.c.text .data.bss% .filegMPEXP.c.textd.data.bss4.filegMPGCDC.c.text 8O.data.bssC .filegMPHOM.c.textD.data.bssRD.filegMPINT.c.text.data.bssa.filegMPIQH.c.text.data.bssp.filegMPIQHL.c.text.data.bss.filegMPIQHS.c.textD(#.data.bssD.filegMPMDP.c.textl.data.bssl.filegMPMON.c.text8.data.bss.filegMPNEG.c.text4.data.bss4.filegMPPROD.c.text  .data.bss.filegMPPSR.c.text.data.bss.filegMPQ.c.textD.data.bss.filegMPQR.c.text.data.bss.filegMPRAN.c.text .data.bss.file gMPRES.c.text.data.bss.filegMPSPRS.c.textx.data.bss$x.filegMPSUM.c.text h .data.bss3 .file&gMPUC.c.texth  .data.bssBh .file/gMPUCPP.c.text D.data.bssQ .file8gMPUCS.c.text .data.bss` .fileAgMPUP.c.textL .data.bssoL .fileJgMPUPP.c.text $.data.bss~ .fileSgMPUQ.c.text .data.bss .file\gMUPBQP.c.text l.data.bss .fileegMUPDDF.c.text.data.bss.filengMUPDER.c.text.data.bss.filewgMUPEGC.c.textxt.data.bssx.filegMUPFBL.c.text4.data.bss.filegMUPFS.c.text x.data.bss .filegMUPGCD.c.text.data.bss.filegMUPHEG.c.text(.data.bss (.filegMUPRAN.c.text\.data.bss .filegMUPRC.c.text<.data.bss# <.filegMUPRES.c.text`.data.bss2 .filegMUPSFF.c.textp .data.bssA p.filegODD.c.text.data.bssP .filegORDER.c.textX.data.bss_ .filegOREAD.c.text(.data.bssn .filegOWRITE.c.text( .data.bss} (.filegPADV.c.textHh.data.bss H.filegPAIR.c.textl.data.bss .filegPARTN.c.text .data.bss .filegPARTR.c.text.data.bss .filegPARTSS.c.textT.data.bss .filegPBIN.c.text(<.data.bss (.file"gPCL.c.textd.data.bss d.file+gPCOEFF.c.textT.data.bss .file4gPCONST.c.textD P.data.bss!D .file=gPCPV.c.text @.data.bss! .fileFgPDBORD.c.text p.data.bss"! .fileOgPDEG.c.textD!.data.bss1!D!.fileXgPDEGSV.c.text`!t.data.bss@!`!.fileagPDEGV.c.text! .data.bssO!!.filejgPDLOG2.c.text".data.bss^!".filesgPDPV.c.text#.data.bssm!#.file|gPERMCY.c.text#|.data.bss|!#.filegPERMR.c.text$.data.bss!$.filegPFBRE.c.text$8.data.bss!$.filegPFDIP.c.text$.data.bss!$.filegPFDP.c.text%.data.bss!%.filegPHDQR.c.text&.data.bss!&.filegPICPV.c.text '<.data.bss! '.filegPINV.c.textH'.data.bss!H'.filegPLBCF.c.text'8.data.bss!'.filegPLDCF.c.text($.data.bss"(.filegPMDEG.c.text8( .data.bss"8(.filegPMON.c.textX(.data.bss!"X(.filegPMONSV.c.textt(8.data.bss0"t(.filegPMPMV.c.text(d.data.bss?"(.filegPNDQR.c.text)<.data.bssN").filegPORD.c.textL*D.data.bss]"L*.file gPPERMV.c.text*.data.bssl"*.filegPPLT.c.text$+,.data.bss{"$+.filegPRED.c.textP+(.data.bss"P+.file'gPRODUCT.c.textx+.data.bss"x+.file0gPRT.c.text,,X.data.bss",,.file9gPSDSV.c.text,.data.bss",.fileBgPTBCF.c.text-T.data.bss"-.fileKgPTMV.c.textl-.data.bss"l-.fileTgPTV.c.text /.data.bss" /.file]gPUFP.c.text/.data.bss"/.filefgPUNT.c.text 0l.data.bss# 0.fileogQREM.c.text0|.data.bss#0.filexgRED.c.text1.data.bss #1.filegRED2.c.text1.data.bss/#1.filegRED3.c.text,1.data.bss>#,1.filegRED4.c.textD1.data.bssM#D1.filegREDI.c.text`1,.data.bss\#`1.filegREM.c.text1 .data.bssk#1.filegRIB.c.text1 .data.bssz#1.filegRIL.c.textH2$.data.bss#H2.filegRILC.c.textl2P.data.bss#l2.filegRINEG.c.text28.data.bss#2.filegRINT.c.text2 .data.bss#2.filegRIPROD.c.text3.data.bss#3.filegRIRNP.c.text5T.data.bss#5.filegRISIGN.c.text5`.data.bss#5.filegRISUM.c.textL6T.data.bss#L6.filegRNABS.c.text6$.data.bss$6.filegRNBCR.c.text6  .data.bss$6.filegRNCEIL.c.text7\.data.bss$7.filegRNCOMP.c.text,8 .data.bss.$,8.file#gRNDEN.c.text8(.data.bss=$8.file,gRNDIF.c.text8.data.bssL$8.file5gRNDWRITE.c.text9P.data.bss[$9.file>gRNFCL2.c.textP:.data.bssj$P:.fileGgRNFLOR.c.text:\.data.bssy$:.filePgRNINT.c.textX;.data.bss$X;.fileYgRNINV.c.textt;T.data.bss$t;.filebgRNMAX.c.text;$.data.bss$;.filekgRNMIN.c.text;$.data.bss$;.filetgRNNEG.c.text<8.data.bss$<.file}gRNNUM.c.textH<.data.bss$H<.filegRNP2.c.textd<4.data.bss$d<.filegRNPROD.c.text<.data.bss$<.filegRNQ.c.text=$.data.bss%=.filegRNRAND.c.text=4.data.bss%=.filegRNREAD.c.text>D.data.bss%>.filegRNRED.c.textH>`.data.bss-%H>.filegRNSIGN.c.text> .data.bss<%>.filegRNSUM.c.text>T.data.bssK%>.filegRNWRITE.c.text@H.data.bssZ%@.filegRPAFME.c.textd@,.data.bssi%d@.filegRPBLGS.c.text@8.data.bssx%@.filegRPDIF.c.textA.data.bss%A.filegRPDMV.c.textC.data.bss%C.filegRPDWRITE.c.text4D.data.bss%4D.filegRPEMV.c.textE.data.bss%E.file gRPEXPREAD.c.textXFl.data.bss%XF.filegRPFACTREAD.c.textF.data.bss%F.filegRPFIP.c.textH.data.bss%H.file(gRPIMV.c.textXIx.data.bss%XI.file1gRPMAIP.c.textI@.data.bss%I.file:gRPNEG.c.textJ.data.bss&J.fileCgRPPOWREAD.c.textJ8.data.bss&J.fileLgRPPROD.c.textK .data.bss,&K.fileUgRPQR.c.textL.data.bss;&L.file^gRPRAN.c.textM .data.bssJ&M.fileggRPREAD.c.textN(+.data.bssY&N.filepgRPRNP.c.textP.data.bssh&P.fileygRPSUM.c.textTQp.data.bssw&TQ.filegRPTERMREAD.c.textR .data.bss&R.filegRPWRITE.c.textS.data.bss&S.filegRUPWRITE.c.textT.data.bss&T.filegSDIFF.c.textU.data.bss&U.filegSDR.c.textVD.data.bss&V.filegSECOND.c.textTX.data.bss&TX.filegSEQUAL.c.textlX.data.bss&lX.filegSFCCON.c.textX8.data.bss&X.filegSFCDIF.c.text0Y.data.bss&0Y.filegSFCFR.c.textLY.data.bss 'LY.filegSFCIP.c.texthY$.data.bss'hY.filegSFCMSQ.c.textYH.data.bss+'Y.filegSFCNEG.c.textY@.data.bss:'Y.filegSFCPR.c.textZ .data.bssI'Z.filegSFCQ.c.textZp.data.bssX'Z.file gSFCRP.c.text[.data.bssg'[.filegSFCS.c.text8[.data.bssv'8[.filegSFCSUM.c.text[t.data.bss'[.file$gSFIFI.c.textX\@.data.bss'X\.file-gSFIRST.c.text].data.bss'].file6gSFRABS.c.text]8.data.bss'].file?gSFRDIF.c.text].data.bss'].fileHgSFRLS.c.text^L&.data.bss'^.fileQgSFRNEG.c.textLa4.data.bss'La.fileZgSFRPR.c.texta .data.bss'a.filecgSFRQ.c.texthb.data.bss'hb.filelgSFRSUM.c.textdc.data.bss (dc.fileugSIGN.c.textLe.data.bss(Le.file~gSINTER.c.texthet.data.bss*(he.filegSLELTI.c.texte8.data.bss9(e.filegSMFMI.c.textf0.data.bssH(f.filegSMFMIP.c.textDf.data.bssW(Df.filegSRED.c.textf.data.bssf(f.filegSTATSACLIB.c.textfH1.data.bssu(f.filegSUBFROM.c.text+$o.textd'.data(H.bssܔ .commentlang(+0.filegptod.c_ptod\'.textD.datap.bss.comment .filegldexp.cldexp0'.text .datap.bss.comment4.filegsystem.csystem؟$.text؟ .datap.bss.comment0+pshellxshflg{.file gexecl.s.text.data.bss.comment0.filegexecv.s.textĠ.data.bss.comment40.file gexecve.s.textܠ.data.bss.commentd0.file*gexit.s.text .data.bss.comment0.file8ggetenv.cgetenvbA.nvmatch@b@0.text.data.bss.comment4.fileBgtimes.s.text.data.bss.comment0.fileNgfilbuf.c__filbuf$F.text.data.bss.comment(.file^gfopen.cfopenhRfreopenĢh!T+hgV.text.data.bss.comment<.filelgfindiop.c+Ph_b+$d.textP.data.bss.comment4.filezgcalloc.ccalloc@`7pcfreex r.text@H.data.bss.commentD d.filegmemccpy.s.texth.data.bss.comment 4.filegfprintf.cfprintf$u.textx.data.bss.comment T.filegread.s.texth.data.bss.comment0"0.filegsigsetops.csigvalid$L+̦$.+$+ $9,H$;,$?.textD.data.bss.comment`"$sigsinitsigs.filegsprintf.csprintfħ$>.textħ@.data.bss.comment#,.filegstrcmp.s.text.data.bss.comment$0.filegstrncat.s.textp.data.bss.comment$4,O),6,L.filegstrncpy.s.textX8.data.bss.comment%4.filegopen.s.text.data.bss.commentH%0.filegstat.s.text.data.bss.commentx%0.filegstrcat.s.text.data.bss.comment%0.filegstrcpy.s.text.data.bss.comment%0.filegungetc.cungetcT$ .textT.data.bss.comment&.filegvfork.s.text@ .data.bss.comment&,errRparentP.file7gdoprnt.cC,`$G#_dowrite$n%_doprnt $;$'.text`$.data.bss.comment&_blanks_zeroesuc_digslc_digslc_nan̈uc_nan҈lc_inf؈uc_inf܈.fileHgecvt.cecvt\b;fcvt|b=cvtb?.text\ .data.bss.comment)buf.fileTgdtop.c_dtopp%L.textp.data.bss.comment* .file^gbiglitpow.s.text .data.bss.comment+$.filejgfrexp.cfrexp'5b.text @.data.bss.comment+.filevgfwrite.cfwriteL.n.textL.data.bss.commenth,.filegflsbuf.c_cleanup4 7zfclosel$|fflush$~__flsbuf$/M,$__wrtchk$}W,$a,$ .text4".data.bss.comment\-L.filegalign_malloc.ck,(b_y, ,b.text(.data.bss.comment.H.filegclose.s.text.data.bss.comment.0.filegdata.c.text.data.bss.comment /.filegfstatfs.s.text.datah.bss.comment/4.filegisatty.cisatty$9.text<.datah.bss.comment/d.filegi386_data.s.text.datah.bss.comment\04.filegioctl.s.text.datal.bss.comment00.fileglseek.s.text0.datal.bss.comment00.filegltostr.c_ltostrDb1.textD4.datal.bss.comment0H.file gmalloc.cmallocx`Rfree ,realloc`.textx,..datal.bss.comment81allocendallocx alloct$allocp(allocs,.filegmemchr.s.text$.datal.bss4.comment 20.filegmemcpy.s.text(.datal.bss4.commentP20.file'gmemset.s.text4.datal.bss4.comment20.file0gsbrk.s.text$D.datal.bss4_curbrkl.file:gstrchr.s.texth`.datap.bss4.comment20.fileDgstrlen.s.text.datap.bss4.comment20.fileNgwait.s.text`L.datap.bss4.comment30.fileXg_loc_data.c.text.datap.bss4.comment@3.filebgwrite.s.text.data.bss4.comment50.fileogsigaction.s.textd.data.bss4.comment054_12ok,_16ok!.file}gsignal.s.text( .data.bss4.commentd54_12sigG_12okZ,Psigsw1.filegkill.s.text$.data.bss4.comment50.fileggetpid.s.text<.data.bss4.comment50.filegcerror.s.textD.data.bss4.comment50_startenviron\mainr_mcount sacMain ,4,err8__iob,nr_bound\F, OWRITE(,, OREADsetjmp,`F,lF -dF-D-hF,-yyparse08-L&signal8longjmpstrcmpstrlenstrcpyyyerror yynerrs8yychar<yylexyylval@B-(2N-)assign\(INVCOMPLIST1getref(call`*LIST2[-T)yyin0Fyyout4Ff-(u-'-&yytextDyylengH-2readh-d&-'SPACEB1LSPACEBPLENGTHdADVLP- 3-3-44- 5cmd_help,5strcatcmd_view5cmd_vars5.5.5FAIL4IAADVtOABSOACLOCKOADDTOOADV2xPADV3PADV4QAFCOMPQAFCRQAFDIFQAFDWRITERAFFINTIPIP ?IPIPP?IPIPR?IPIQ@IPIQH@AIPLCPPCIPLEVdDIPLRRIDIPMAXNH.pHIPNEGIIPNTIIPONE`JIPOWERJIPP2PXKIPPFAC2LIPPGSDxMIPPNPRSM.NIPPPOIPPRODOIPPSCPIPPSR`RIPPVED0SIPQSIPQRSIPRANUIPRCHUIPRCHSVIPRCN1tWIPRCNPPXIPREADYIPRES[IPRICL4]IPRIM<^IPRIMO\^IPRIMS^IPRIMU`IPRIMWxaIPRISTbIPROD cIPROD2X2fIPROD3X2tgIPROD3X3hIPRODAjIPRPRStkIPRRIIplIPRRLS4rIPRRRIsIPRRSdtIPSCPPLvIPSFwIPSFBAwIPSFSDxIPSIFItyIPSIGN0zIPSMVHzIPSPRS4{IPSQRT|IPSRM<~IPSRMS@IPSRPIPSUBhIPSUMIPSUMNl.IPTPRIPTRHIPTR1IPTR1LVIPTRANpIPTRLVIPTRMVIPTRUNpIPVCHT\IPVDEG12xIPWRITEIQIQRIRANDpIREADIREMIROOTISATOMISFPF8ISFPIRISGCAISIGNFISLISTISNILISOBJECT0ISPD`ISPFAC2$ISPSFB<ISPTISQRT`ISUM@ISZERO@ITRUNCTIUPBEIIUPBES8IUPBHTIUPBRE<IUPCHTIUPFACIUPFDS<IUPIHT\IUPIIRIUPNT IUPQHIUPQHLIUPQSIUPRBdIUPRCIUPRLP4IUPSRIUPTPR0IUPTRlIUPTR1\IUPVAR̸IUPVOI8IUPVSIIUPWRITEHIUSFPF,IUSFPF2IWRITE.LASTCELLLBIBMSLBIBSDLBIMLCONCLDSMKBHLDSSBRLEINSTLELTI0LEROTLETTER$LEXNEXLLFSLINSPLINSRTxLIST104LIST3LIST48LIST5tLKAHEADLMERGELPERMdLREADLSRCHLWRITEMAIPDELMAIPDM MAIPHMMAIPP<MARKPMAX\MCPMVpMDCRAdMDDIFMDEXPMDHOMMDINV@MDINVBMDLCRADMDNEGMDPRODMDQ<MDRAN`MDSUMMEMBERMIAIM(MICINSMICS0MIDCRAMIDIF MIEXP<MIHOMMIINVMIN`MINEGtMINNCTMIPDIFMIPFSMMIPHOMLMIPIPRMIPISE MIPMIPMIPMON8MIPNEGpMIPPR MIPRAN4MIPRODMIPSUM$MIQMIRANMISUMMIUPQRMIUPSE MMDDETMMDNSBMMPDMAXMMPEVMMPIQRMPDIFTMPEMVMPEVAL MPEXPMPGCDC0MPHOMDMPINTMPIQHMPIQHLMPIQHSDMPMDPlMPMONMPNEG4MPPRODMPPSRMPQMPQRMPRANMPRESMPSPRSxMPSUM MPUCh MPUCPP MPUCS MPUPL MPUPP MPUQ MUPBQP MUPDDFMUPDERMUPEGCxMUPFBLMUPFS MUPGCDMUPHEG(MUPRANMUPRC<MUPRESMUPSFFpODDORDERPADVHPAIRPARTNPARTRPARTSSPBIN(PCLdPCOEFFPCONSTD PCPV PDBORD PDEGD!PDEGSV`!PDEGV!PDLOG2"PDPV#PERMCY#PERMR$PFBRE$PFDIP$PFDP%PHDQR&PICPV 'PINVH'PLBCF'PLDCF(PMDEG8(PMONX(PMONSVt(PMPMV(PNDQR)PORDL*PPERMV*PPLT$+PREDP+PRODUCTx+PRT,,PSDSV,PTBCF-PTMVl-PTV /PUFP/PUNT 0QREM0RED1RED21RED3,1RED4D1REDI`1REM1RIB1RILH2RILCl2RINEG2RINT2RIPROD3RIRNP5RISIGN5RISUML6RNABS6RNBCR6RNCEIL7RNCOMP,8RNDEN8RNDIF8RNDWRITE9RNFCL2P:RNFLOR:RNINTX;RNINVt;RNMAX;RNMIN;RNNEG<RNNUMH<RNP2d<RNPROD<RNQ=RNRAND=RNREAD>RNREDH>RNSIGN>RNSUM>RNWRITE@RPAFMEd@RPBLGS@RPDIFARPDMVCRPDWRITE4DRPEMVE.XF.`GRPFIPHRPIMVXIRPMAIPIRPNEGJ.JRPPRODKRPQRLRPRANMRPREADNRPRNPPRPSUMTQ.RRPWRITESRUPWRITETSDIFFUSDRVSECONDTXSEQUALlXSFCCONXSFCDIF0YSFCFRLYSFCIPhYSFCMSQYSFCNEGYSFCPRZSFCQZSFCRP[SFCS8[SFCSUM[SFIFIX\SFIRST]SFRABS]SFRDIF]SFRLS^SFRNEGLaSFRPRaSFRQxbSFRSUMtcSIGNLeSINTERheSLELTIeSMFMIfSMFMIPDfSREDf/$hSUBFROM # # FUNCTION # The sed substitution expression is applied globally to every file. # The format of this expression is # /regular expression/replacement string/ # For more information see sed(1). # If option "-b" is set, the original files are renamed with the # extension ".bak", otherwise the original files are replaced. if ("$1" == "-b") then set backup set sedexp="$2" set names=3 else unset backup set sedexp="$1" set names=2 endif if ($#argv < $names) then echo "USAGE:" echo " subst [-b] " exit endif foreach i ($argv[$names-]) mv $i $i.bak sed -e "s${sedexp}g" $i.bak > $i if (! $?backup) rm $i.bak end saclib2.2.8/sysdep/archive/Solaris/bin/supdate0000664002275300236100000000035514017255270020457 0ustar wcbrownscs#!/bin/csh if ($#argv != 1) then echo "Usage: supdate " else rcp $1 jade:/usr/local/saclib/`pwd | sed 's/.*\/saclib2.1/saclib2.1/g'`/. rcp $1 crocus:/usr/local/saclib/`pwd | sed 's/.*\/saclib2.1/saclib2.1/g'`/. endif saclib2.2.8/sysdep/archive/Solaris/bin/mktexkwic0000664002275300236100000000242714017255270021022 0ustar wcbrownscs#! /bin/csh # USAGE: # mktexkwic [] [ []] # # FUNCTION # Creates a KWIC index from an input file which consists of one or more # blocks of the following format: # # # <0 or more lines of additional text beginning with at least one blank> # # The keywords will be taken from the text in the subject line and in the # optional subsequent indented text lines. "bin/mkkwic.sed" contains a # set of commands which remove irrelevant keywords like "the", "for", # etc. # # The output file consists of lines of the following format, sorted # alphabetically by keyword and subject: # COLUMN : 1 sc kc ll # # # Default values for input and output file, and ll are # "$saclib/doc/desc.doc", "$saclib/doc/guide/KWIC.tex", and 77, resp. if ($#argv < 1) then set infile=$saclib/doc/desc.doc else set fname=$1 endif if ($#argv < 2) then set outfile=$saclib/doc/guide/KWIC.tex else set outfile=$2 endif if ($#argv < 3) then set ll=77 else set ll=$3 endif gawk -f $saclib/bin/b2l.awk $infile |\ gawk -f $saclib/bin/mktexkwic1.awk - |\ sed -f $saclib/bin/mktexkwic.sed |\ sort -f |\ gawk >$outfile -f $saclib/bin/mktexkwic2.awk ll=$ll - saclib2.2.8/sysdep/archive/Solaris/bin/mktexkwic2.awk0000664002275300236100000000162714017255270021666 0ustar wcbrownscsBEGIN { printf("\\begin{description}\n");} { # FILE # mktexkwic2.awk - make a description list from lines of text. # # INPUTS # ll ... line length # # VARIABLES # kw ... current keyword # su ... last subject # col ... current column # Check if keyword has changed. if (kw != $1) { if (kw != "") printf(" \\end{description}\n"); printf("\\item[%s] \\ \\ \n",$1); printf(" \\begin{description}\n"); kw = $1; su = ""; } # Abort line if subject is the same as the last one. if (su == $2) next; printf(" \\item[%s] ",$2); col = length($2) + 10; # Print text doing line breaking and indentation. for (i=3;i<=NF;i++) if (col+length($i) > ll) { col = 4+length($i); printf("\n %s",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } END { printf(" \\end{description}\n\\end{description}\n");} saclib2.2.8/sysdep/archive/Solaris/bin/strip1st.awk0000664002275300236100000000045514017255270021365 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/Solaris/README0000664002275300236100000001112114017255270017170 0ustar wcbrownscs SPARC VERSION INSTALLATION INFORMATION ======================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) 1.2. System configuration ------------------------- Machine: Sun SPARC Operating system: SunOS Shell: csh C Compiler: cc 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/SPARC/install". (If you are not using 'csh' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your SACLIB root directory is "/usr/local/saclib" you would type: % /usr/local/saclib/sysdep/SPARC/install /usr/local/saclib Note that it might be a good idea to use the complete path for calling the install script as there might be some system command 'install' which might get executed instead of the SACLIB install script. First all system dependent files and scripts from the "SPARC" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.a" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. To finish the installation you need to add a line to your ".cshrc" and ".login" files which sets the shell variable '$saclib' to the path of the "saclib" directory. Following the example above, this line would look as follows: setenv saclib /usr/local/saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your 'path' variable, e.g. by adding a line similar to the following to your ".cshrc" file: set path=($path $saclib/bin) Note that from now on *all* accesses to SACLIB should only be done via the '$saclib' environment variable. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should log out, log in again, and check if the 'saclib' environment variable is set. Then the installation is complete. 3. Compiling ============ 3.1 Default compilation with mklib ---------------------------------- If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.a" and the corresponding object files are in "saclib/lib/obj". (Note that this library was already built by the install script.) 'deb' switches on the '-g' option of the compiler which includes debugging information in the object files. The library file will have the name "saclibd.a" and the corresponding object files are in "saclib/lib/objd". 'opt' switches on the '-O' option which produces optimized code. The library file will have the name "saclibo.a" and the corresponding object files are in "saclib/lib/objo". 'all' builds all three types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' and the makefiles first, which is done by issuing the commands 'mkproto' and 'mkmake'. 3.1 Using gcc instead of cc ---------------------------- If you want to use a different C compiler such as the Gnu C compiler (gcc) all you need to do is set the environment variable CC. This can be accomplished with the command (setenv CC=gcc). ANSI C type type declarations can be used if the variable __STDC__ is set. To see how this is done look in the file include/sacsys.h 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mkmake ... creates the makefiles for SACLIB. mklib ... compiles the library (uses the makefiles created by 'mkmake'). mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/Solaris/install0000664002275300236100000000331614017255270017710 0ustar wcbrownscs#!/bin/csh # USAGE # install # # FUNCTION # Copies all system dependent files to the directories where they belong, # compiles the library and creates the documentation files. set system=SPARC # Check if ($#argv != 1) then echo "USAGE:" echo " install " exit endif if (! -e $1/sysdep/$system/install) then echo "'$1/sysdep/$system/install' does not exist." echo "I assume you gave me an invalid path to the saclib root directory." echo "USAGE:" echo " install " exit endif if ($?saclib) then if ($saclib != $1) then echo Warning: '$saclib' exists "($saclib)" and is different from $1. echo " Make sure" '$saclib' is either set to $1 echo " or not set at all (check also '.cshrc')." exit endif endif # Set environment setenv saclib $1 set path=($saclib/bin $path) # Copy files echo "Copying files from '$saclib/sysdep/$system' ..." foreach i ($saclib/sysdep/$system/*) if (-d $i) cp $i/* $saclib/$i:t end rehash # Compile echo "Creating $saclib/include/sacproto.h ..." mkproto echo "Creating makefiles ..." mkmake echo "Compiling standard SACLIB ..." # setenv CC gcc mklib std # Make docs echo "Creating '$saclib/doc/desc.doc' ..." pushd >/dev/null $saclib/src mkdesc >$saclib/doc/desc.doc 8 79 *.c # echo "Creating '$saclib/doc/kwic.doc' ..." # mkkwic >$saclib/doc/kwic.doc # echo "Creating '$saclib/doc/spec.doc' ..." # mkspec >$saclib/doc/spec.doc *.c popd >/dev/null # Finished echo "The install script is done." echo "Now add" echo " setenv saclib $1" echo " set" 'path=($path $saclib/bin)' echo "to your '.login' and '.cshrc' files to make the installation complete." saclib2.2.8/sysdep/archive/Solaris/include/0000775002275300236100000000000014017255270017737 5ustar wcbrownscssaclib2.2.8/sysdep/archive/Solaris/include/sacsys.h0000664002275300236100000000142214017255270021414 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 1000 #define NPRIME_ 1000 #define NPFDS_ 5 #define NSMPRM_ 500 #define RHO_ 10 #define NPTR1_ 2001 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/amiga/0000775002275300236100000000000014017255270015756 5ustar wcbrownscssaclib2.2.8/sysdep/archive/amiga/src/0000775002275300236100000000000014017255270016545 5ustar wcbrownscssaclib2.2.8/sysdep/archive/amiga/src/CLOCK.c0000664002275300236100000000102314017255270017540 0ustar wcbrownscs/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in milliseconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; /* hide t; */ Step1: /* Get the system time. */ /* Ticks per millisec. = ticks * 1000 / ticks per sec. */ t = (int)clock() * 1000 / CLK_TCK; Return: /* Prepare for return. */ return(t); } saclib2.2.8/sysdep/archive/amiga/src/GC.c0000664002275300236100000000125714017255270017207 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { Word num_registers, top_of_stack, register_buff[40]; extern void GETREGSTR(); GETREGSTR(register_buff, &num_registers, &top_of_stack); GCSI(sizeof(Word),(char *)&top_of_stack); } saclib2.2.8/sysdep/archive/amiga/src/DPRNN.c0000664002275300236100000000237514017255270017601 0ustar wcbrownscs/*============================================================================ DPRNN(a,b; c1,c0) Digit product. Inputs a, b : nonnegative BETA-digits. Outputs c1, c0 : the unique nonnegative BETA-digits such that a * b = c1 * BETA + c0. Note: This program assumes that BETA = 2^29. ============================================================================*/ #include "saclib.h" void DPRNN(a,b, c1_,c0_) Word a,b, *c1_,*c0_; { BDigit a0,a1,b0,b1,c0,c1,d0,d1,dp,p0,p1,p10,p11,p2; const BDigit m15 = (1 << 15) - 1, m29 = (1 << 29) - 1, m30 = (1 << 30) - 1; Step1: /* Break apart the inputs. */ a0 = a & m15; a1 = a >> 15; b0 = b & m15; b1 = b >> 15; Step2: /* Multiply the parts. */ p0 = a0 * b0; p1 = a1 * b0 + a0 * b1; p2 = a1 * b1; Step3: /* Add the products in base 2^30. */ p10 = p1 & m15; p11 = p1 >> 15; d0 = p0 + (p10 << 15); dp = d0 >> 30; d0 = d0 & m30; d1 = p2 + p11 + dp; Step4: /* Convert to base 2^29. */ c0 = d0 & m29; dp = d0 >> 29; c1 = (d1 << 1) | dp; Return: /* Return c1 and c0. */ *c1_ = c1; *c0_ = c0; return; } saclib2.2.8/sysdep/archive/amiga/src/DQR.c0000664002275300236100000000262314017255270017342 0ustar wcbrownscs/*====================================================================== DQR(a1,a0,b; q,r) Digit quotient and remainder. Inputs a1, a0, b : BETA-integers with a1 * a0 >= 0 and abs(b) > abs(a1). Outputs q : a BETA-integer, the integral part of (a1 * BETA + a0) / b. r : a BETA-integer, (a1 * BETA + a0) - b * q. ======================================================================*/ #include "saclib.h" void DQR(a1,a0,b, q_,r_) Word a1,a0,b, *q_,*r_; { Word ap0,ap1,bp,i,q,qp,r; /* hide algorithm */ Step1: /* a1 = 0. */ if (a1 == 0) { QREM(a0,b,&q,&r); goto Return; } Step2: /* Compute absolute values. */ ap1 = ABS(a1); ap0 = ABS(a0); bp = ABS(b); Step3: /* Shift and subtract. */ qp = 0; for (i = 1; i <= ZETA; i++) { ap1 = ap1 + ap1; ap0 = ap0 + ap0; if (ap0 >= BETA) { ap0 = ap0 - BETA; ap1 = ap1 + 1; } qp = qp + qp; if (ap1 >= bp) { ap1 = ap1 - bp; qp = qp + 1; } } Step4: /* Compute signs. */ if (a1 < 0) { qp = -qp; ap1 = -ap1; } if (b < 0) qp = -qp; q = qp; r = ap1; Return: /* Prepare for return. */ *q_ = q; *r_ = r; return; } saclib2.2.8/sysdep/archive/amiga/src/DPR.c0000664002275300236100000000316014017255270017336 0ustar wcbrownscs/*============================================================================ DPR(a,b; c1,c0) Digit product. Inputs a, b : BETA-digits. Outputs c1, c0 : the unique BETA-digits such that a * b = c1 * BETA + c0, with c1 * c0 >= 0. Note: This program assumes that BETA = 2^29. ============================================================================*/ #include "saclib.h" void DPR(a,b, c1_,c0_) Word a,b, *c1_,*c0_; { BDigit a0,a1,ap,b0,b1,bp,c0,c1,d0,d1,dp,p0,p1,p10,p11,p2,s; const BDigit m15 = (1 << 15) - 1, m29 = (1 << 29) - 1, m30 = (1 << 30) - 1; Step1: /* Compute absolute values of inputs. */ s = 1; if (a < 0) { ap = -a; s = -s; } else ap = a; if (b < 0) { bp = -b; s = -s; } else bp = b; Step2: /* Break apart the inputs. */ a0 = ap & m15; a1 = ap >> 15; b0 = bp & m15; b1 = bp >> 15; Step3: /* Multiply the parts. */ p0 = a0 * b0; p1 = a1 * b0 + a0 * b1; p2 = a1 * b1; Step4: /* Add the products in base 2^30. */ p10 = p1 & m15; p11 = p1 >> 15; d0 = p0 + (p10 << 15); dp = d0 >> 30; d0 = d0 & m30; d1 = p2 + p11 + dp; Step5: /* Convert to base 2^29. */ c0 = d0 & m29; dp = d0 >> 29; c1 = (d1 << 1) | dp; Step6: /* Give correct signs to c1 and c0. */ if (s < 0) { c1 = -c1; c0 = -c0; } Return: /* Return c1 and c0. */ *c1_ = c1; *c0_ = c0; return; } saclib2.2.8/sysdep/archive/amiga/bin/0000775002275300236100000000000014017255270016526 5ustar wcbrownscssaclib2.2.8/sysdep/archive/amiga/bin/mklib0000664002275300236100000000462614017255270017557 0ustar wcbrownscs.key type .bra { .ket } ; USAGE: ; mklib ; ; FUNCTION ; Creates ".a" files in "SACLIB:lib/" depending on the argument: ; - 'std' causes a standard library to be built. The library file will have ; the name "saclib.lib" and the corresponding object files are in ; "OBJ:sac". ; - 'deb' switches on the '-s' and '-gs' options of the compiler which cause ; the inclusion of debugging information in the object files. The library ; file has the name "saclibd.lib" and the corresponding object files are ; in "OBJ:sacd". ; - 'opt' switches on the '-O' option which produces optimized code. The ; library file will have the name "saclibo.lib" and the corresponding object ; files are in "OBJ:saco". ; [THIS OPTION IS NOT SUPPORTED, YET.] ; - 'all' builds all three types of libraries. CC=dcc if "{type}" eq "std" if not exists OBJ:sac echo "'mklib' needs the directory 'OBJ:sac' for storing the '.o' files!" quit endif pushd SACLIB:src List >T:names.tmp (*.c|*.a) LFORMAT "%s" SORT $CC @T:names.tmp -v -S -ISACLIB:include -c -new -O OBJ:sac Join OBJ:sac/*.o AS T:saclib.lib Copy T:saclib.lib SACLIB:lib/saclib.lib Delete >NIL: T:saclib.lib T:names.tmp popd else if "{type}" eq "deb" if not exists OBJ:sacd echo "'mklib' needs the directory 'OBJ:sacd' for storing the '.o' files!" quit endif pushd SACLIB:src List >T:names.tmp (*.c|*.a) LFORMAT "%s" SORT $CC @T:names.tmp -v -S -s -gs -ISACLIB:include -c -new -O OBJ:sacd Join OBJ:sacd/*.o AS T:saclibd.lib Copy T:saclibd.lib SACLIB:lib/saclibd.lib Delete >NIL: T:saclibd.lib T:names.tmp popd else if "{type}" eq "all" if not exists OBJ:sac echo "'mklib' needs the directory 'OBJ:sac' for storing the '.o' files!" quit endif pushd SACLIB:src List >T:names.tmp (*.c|*.a) LFORMAT "%s" SORT $CC @T:names.tmp -v -S -ISACLIB:include -c -new -O OBJ:sac Join OBJ:sac/*.o AS T:saclib.lib Copy T:saclib.lib SACLIB:lib/saclib.lib Delete >NIL: T:saclib.lib if not exists OBJ:sacd echo "'mklib' needs the directory 'OBJ:sacd' for storing the '.o' files!" quit endif $CC @T:names.tmp -v -S -s -gs -ISACLIB:include -c -new -O OBJ:sacd Join OBJ:sacd/*.o AS T:saclibd.lib Copy T:saclibd.lib SACLIB:lib/saclibd.lib Delete >NIL: T:saclibd.lib T:names.tmp popd else echo "USAGE:" echo " mklib " Quit endif endif endif CC= echo "mklib done." saclib2.2.8/sysdep/archive/amiga/bin/mkproto.aux0000664002275300236100000000072414017255270020743 0ustar wcbrownscs; USAGE ; mkproto.aux ; ; FUNCTION ; Reads names of SACLIB source files from STDIN (for use with pipes) until ; an EOF is read. The files are processed by awk (script 'mkproto.awk') ; to extract the function prototypes. LAB loop Read fname IF $? EQ 1 VAL Skip End ENDIF IF "$fname" EQ "SACLIB:src/FAIL.c Skip BACK loop ENDIF IF "$fname" EQ "SACLIB:src/main.c Skip BACK loop ENDIF awk -f SACLIB:bin/mkproto.awk $fname fname= Skip BACK loop LAB End saclib2.2.8/sysdep/archive/amiga/bin/sdesc0000664002275300236100000000206414017255270017554 0ustar wcbrownscs.key pat/a,infile,outfile,sc,ll .bra { .ket } .def infile SACLIB:doc/desc.doc .def outfile * .def sc 8 .def ll 77 ; USAGE: ; sdesc [input file name] [output file name] [sc] [ll] ; ; FUNCTION ; Takes an an input file which consists of one or more blocks of the ; following format: ; ; ; <0 or more lines of additional text beginning with at least one blank> ; ; The text part of these blocks is searched for the pattern. If it is ; found, the block is displayed in the following format: ; ; COLUMN 1 sc ll ; ; <0 or more lines of additional text........> ; ; The default input file is "SACLIB:doc/desc.doc", the default output file ; is the console, default values for sc and ll are 8 and 77. ; BUG in ArpShell: without this line, the default value for {infile} is invalid! awk -f SACLIB:bin/b2l.awk {infile} | Search STDIN {pat} NONUM | awk >{outfile} -f SACLIB:bin/l2b.awk sc={sc} ll={ll} saclib2.2.8/sysdep/archive/amiga/bin/mkdesc.aux0000664002275300236100000000065314017255270020517 0ustar wcbrownscs.key sc,ll .bra { .ket } .def sc 8 .def ll 77 ; USAGE ; mkdesc.aux ; ; FUNCTION ; Reads names of SACLIB source files from STDIN (for use with pipes) until ; an EOF is read. The files are processed by awk (script 'mkdesc.awk') ; to extract the function description in the header. LAB loop Read fname IF $? EQ 1 VAL Skip End ENDIF awk -f SACLIB:bin/mkdesc.awk sc={sc} ll={ll} $fname fname= Skip BACK loop LAB End saclib2.2.8/sysdep/archive/amiga/bin/mkspec.aux0000664002275300236100000000057614017255270020537 0ustar wcbrownscs; USAGE ; mkspec.aux ; ; FUNCTION ; Reads names of SAC source files from STDIN (for use with pipes) until ; an EOF is read. The files are processed by awk to extract the function ; description in the header. LAB loop Read fname IF $? EQ 1 VAL Skip End ENDIF awk "/^\/\*====*===\$/,/^====*===\*\/\$/ {print}" $fname Delete T:gawk.* QUIET fname= Skip BACK loop LAB End saclib2.2.8/sysdep/archive/amiga/bin/mkproto.awk0000664002275300236100000000265214017255270020732 0ustar wcbrownscsBEGIN { FS = "("; in_function = 0; first_var = 0; } /^\/\*.*$/,/^.*\*\/$/ { next; } /^.*\(.*\)$/ { # Function declaration in_function = 1; first_var = 1; FS = " "; printf("extern %s\tP__((",$1); next; } /^.* .*$/ { # Outside function declaration if (in_function == 0) next; # Inside function declaration type = $1; semicolon = 0; i = 2; while (semicolon == 0) { # Parse variable declarations if (i > NF) { # end of line? getline; i = 1; } lastchar = substr($i,length($i),1); if (lastchar == ";") { # check for trailing semicolon semicolon = 1; s = substr($i,1,length($i)-1); # and remove it } else if (lastchar == ",") { # check for trailing comma s = substr($i,1,length($i)-1); # and remove it } else s = $i; nf = split(s,vars,","); # get variables for (j=1; j<=nf; j++) { # print them if (first_var == 1) { printf("%s %s",type,vars[j]); first_var = 0; } else printf(", %s %s",type,vars[j]); } i++; } } /^{/ { # End of function declaration if (in_function == 1) { in_function = 0; if (first_var == 1) printf("void));\n"); else printf("));\n"); } exit; } END { if (in_function == 1) printf("));\n"); } saclib2.2.8/sysdep/archive/amiga/bin/mkkwic.awk0000664002275300236100000000306114017255270020517 0ustar wcbrownscs { # INPUTS # sc ... starting column of text # kc ... column of keyword # ll ... line length # # VARIABLES # scol ... actual starting column of text # kcol ... actual column of keyword # $1 ... subject # t1 ... text to the left of the keyword # t2 ... text to the right of the keyword # $i ... keyword (i is the index of the keyword in the line) # sfmt ... format string for printing of the subject # # Adjust scol and kcol. scol = sc; kcol = kc; if (length($1) > scol-2) scol = length($1) + 2; if (scol > kcol-2) kcol = scol+2; t1len = kcol-scol-1; t1fmt = sprintf("%%%ds",t1len); # Loop through all keywords and create KWIC lines. for (i=2;i<=NF;i++) { # Format t1 s.t. the keyword is aligned on its column. t1 = ""; j = i-1; while ((j >= 2) && (length(t1)+length($j)+1 <= t1len)) { t1 = $j " " t1; j--; } if (length(t1) < t1len) if (j >= 2) { l = t1len-length(t1)-1; t1 = substr($j,length($j)-l+1,l) " " t1; } else { t1 = sprintf(t1fmt,t1); } # Format t2 s.t. the line ends at column ll. t2 = ""; j = i+1; if (length($i)+kcol < ll) { t2len = ll-length($i)-kcol-1; while ((j <= NF) && (length(t2)+length($j)+1 <= t2len)) { t2 = t2 " " $j; j++; } if ((length(t2) < t2len) && (j <= NF)) { l = t2len-length(t2)-1; t2 = t2 " " substr($j,1,l); } } # Print KWIC line. sfmt = sprintf("%%-%ds",scol-2); subj = sprintf(sfmt,$1); print $i,subj,t1,$i,t2; } } saclib2.2.8/sysdep/archive/amiga/bin/mktags.aux0000664002275300236100000000042714017255270020536 0ustar wcbrownscs; USAGE ; mktags.aux ; ; FUNCTION ; Reads names of files from STDIN (for use with pipes) until an EOF is ; read. The files are processed by ctags to create a tags file. LAB loop Read fname IF $? EQ 1 VAL Skip End ENDIF ctags -a $fname fname= Skip BACK loop LAB End saclib2.2.8/sysdep/archive/amiga/bin/l2b.awk0000664002275300236100000000246114017255270017714 0ustar wcbrownscs { # FILE # l2b.awk - format a line as a block of text. # # INPUTS # sc ... starting column of text # ll ... line length # # FUNCTION # Takes lines of text and formats them as follows: # COLUMN 1 sc ll # # <0 or more lines of additional text........> # # Where is the first word of the line. The text in the first # output line may start to the right of column 'sc' if has # more than 'sc-2' characters. Line breaking is done only at blanks - # if a single word has more than 'll-sc' characters will go beyond # column 'll'. # Compute format string for subject from sc and length of subject and # print subject. subject = $1; if (length(subject) > sc-2) { col = length(subject)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,subject); # Print text doing line breaking and indentation. if (sc > 1) fmt = sprintf("\n%%%ds%%s",sc-1); else fmt = sprintf("\n%s"); for (i=2;i<=NF;i++) if (col+length($i) > ll) { col = sc+length($i); printf(fmt," ",$i); } else { col += 1+length($i); printf(" %s",$i); } printf("\n"); } saclib2.2.8/sysdep/archive/amiga/bin/mktags0000664002275300236100000000042714017255270017742 0ustar wcbrownscs; USAGE: ; mktags ; ; FUNCTION ; Creates a tags file for SACLIB. pushd T: Delete >NIL: tags List SACLIB:src/*.c SORT LFORMAT "%s%s" | SACLIB:bin/mktags.aux List SACLIB:include/*.h SORT LFORMAT "%s%s" | SACLIB:bin/mktags.aux Copy tags SACLIB:src/tags Delete >NIL: tags popd saclib2.2.8/sysdep/archive/amiga/bin/mkdesc.awk0000664002275300236100000000164414017255270020505 0ustar wcbrownscs/^\/\*===*$/ { # Inputs # sc ... starting column of text # ll ... line length # Get function name getline; while (NF == 0) getline; i = index($0,"<- ")+3; if (i == 3) if (index($1,"") != 0) name = $2 else name = $1 else name = substr($0,i,length($0)-i+1); i = index(name,"("); if (i > 1) name = substr(name,1,i-1); # Compute text alignment from sc and length of function name if (length(name) > sc-2) { col = length(name)+1; fmt = "%s"; } else { col = sc-1; fmt = sprintf("%%-%ds",sc-2); } printf(fmt,name); # Print text doing line breaking and indentation. fmt = sprintf("\n%%%ds",sc-2); getline; while (NF == 0) getline; while (length($0) != 0) { for (i=1;i<=NF;i++) { if (col+length($i) > ll) { col = sc-1; printf(fmt," "); } col += 1+length($i); printf(" %s",$i); } getline; } printf("\n"); close(FILENAME); } saclib2.2.8/sysdep/archive/amiga/bin/mkproto0000664002275300236100000000046414017255270020150 0ustar wcbrownscs; USAGE: ; mkproto ; ; FUNCTION ; Creates the file "SACLIB:include/sacproto.h" from the files in ; "SACLIB:src". Echo >SACLIB:include/sacproto.h "extern void FAIL P__((char *algName,char *msg,...));" List SACLIB:src/*.c FILES SORT LFORMAT "%s%s" | SACLIB:bin/mkproto.aux >>SACLIB:include/sacproto.h saclib2.2.8/sysdep/archive/amiga/bin/mkdesc0000664002275300236100000000100614017255270017714 0ustar wcbrownscs.key pat,name,sc,ll .bra { .ket } .def pat SACLIB:src/*.c .def name SACLIB:doc/desc.doc .def sc 8 .def ll 79 ; USAGE: ; mkdesc [filename pattern] [output file] [starting column] [line length] ; ; FUNCTION ; Extracts the function descriptions from SACLIB source files and writes ; them to [output file]. ; Default values for pattern, filename, column, and length are ; "SACLIB:src/*.c", "SACLIB:doc/desc.doc", 8, and 79, resp. List {pat} FILES SORT LFORMAT "%s%s" | SACLIB:bin/mkdesc.aux >{name} {sc} {ll} saclib2.2.8/sysdep/archive/amiga/bin/mkkwic.sed0000664002275300236100000000023414017255270020507 0ustar wcbrownscs/^[0-9]\{1,\}.\{0,1\} / d /^[aA] / d /^[aA]nd / d /^[aA]t / d /^[bB]y / d /^[fF]or / d /^[iI]s / d /^[oO]f.\{0,1\} / d /^[oO]n / d /^[tT]he / d /^[tT]o / d saclib2.2.8/sysdep/archive/amiga/bin/sman0000664002275300236100000000024714017255270017412 0ustar wcbrownscs.key fun/a .bra { .ket } ; USAGE: ; sman ; ; FUNCTION ; Displays the SAC source file containing the given function. more SACLIB:src/{fun}.c saclib2.2.8/sysdep/archive/amiga/bin/b2l.awk0000664002275300236100000000076114017255270017715 0ustar wcbrownscs/^[^ ]/ { # FILE # b2l.awk - concatenates a block of text to a single line. # # FUNCTION # Takes an input file which consists of one or more blocks of the # following format: # # # <0 or more lines of additional text beginning with at least one blank> # # and outputs each of these block as a single line of text. if (subcnt != 0) print subject text; subject = $1; $1 = ""; text = $0; subcnt++; } /^ / {text = text $0} END {print subject text} saclib2.2.8/sysdep/archive/amiga/bin/mkspec0000664002275300236100000000051114017255270017730 0ustar wcbrownscs.key pat,outfile .bra { .ket } .def pat SACLIB:src/*.c .def outfile SACLIB:doc/spec.doc ; USAGE: ; mkspec [file name pattern] [output file name] ; ; FUNCTION ; Extracts the function descriptions from SAC source files and writes ; them to the output file. List {pat} SORT LFORMAT "%s%s" | SACLIB:bin/mkspec.aux >{outfile} saclib2.2.8/sysdep/archive/amiga/bin/mkkwic0000664002275300236100000000226114017255270017737 0ustar wcbrownscs.key infile,outfile,sc,kc,ll .bra { .ket } .def infile SACLIB:doc/desc.doc .def outfile SACLIB:doc/kwic.doc .def sc 8 .def kc 43 .def ll 77 ; USAGE: ; mkkwic [input file name] [output file name] [sc] [kc] [ll] ; ; FUNCTION ; Creates a KWIC index from an input file which consists of one or more ; blocks of the following format: ; ; ; <0 or more lines of additional text beginning with at least one blank> ; ; The keywords will be taken from the text in the subject line and in the ; optional subsequent indented text lines. "bin/mkkwic.sed" contains a ; set of commands which remove irrelevant keywords like "the", "for", ; etc. ; ; The output file consists of lines of the following format, sorted ; alphabetically by keyword and subject: ; COLUMN : 1 sc kc ll ; ; ; Default values for input and output file, sc, kc, and ll are ; "SACLIB:doc/desc.doc", "SACLIB:doc/kwic.doc", 8, 43, and 77, resp. awk -f SACLIB:bin/b2l.awk {infile} | awk -f SACLIB:bin/mkkwic.awk sc={sc} kc={kc} ll={ll} | sed -f SACLIB:bin/mkkwic.sed | sort | awk >{outfile} -f SACLIB:bin/strip1st.awk saclib2.2.8/sysdep/archive/amiga/bin/strip1st.awk0000664002275300236100000000045514017255270021027 0ustar wcbrownscs { # FILE # strip1st.awk - removes the first word from each line. # # FUNCTION # The first word and the first blank character after it are removed # from each line. The remainder is printed with blanks etc. exactly # as in the original file. print substr($0,length($1)+2); } saclib2.2.8/sysdep/archive/amiga/README0000664002275300236100000001160714017255270016643 0ustar wcbrownscs AMIGA VERSION INSTALLATION INFORMATION ====================================== 1. Introduction =============== 1.1. Where to look for help --------------------------- SACLIB Maintenance RISC-LINZ Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria E-Mail: saclib@risc.uni-linz.ac.at (Internet) or Andreas Neubacher E-Mail: aneubach@risc.uni-linz.ac.at (Internet) k318577@alijku11 (Bitnet) 1.2. System configuration ------------------------- This port was done using the following software: - AmigaOS 1.3 - ARP 1.3 shell and commands - DICE 2.06 C-Compiler - gawk, grep, make, sed from various FISH-Disks Note that this software is entirely in the public domain except for AmigaOS and DICE. A free version of DICE with reduced functionality is available in the FISH library. The machine used was an AMIGA 1000 with a MC68000 processor, 2.5 MB RAM and a harddisk. If you haven't got a harddisk you may run into trouble soon - I believe that you won't be able to compile the full library or use any of the tools provided. 2. Installing ============= If you are reading this file you will already have recreated the SACLIB directory tree from your distribution '.tar' file. This will be the location of the installed version of SACLIB. All you have to do is to simply execute the script "saclib/sysdep/amiga/install". (If you are not using the 'Arp Shell' you should first check if your shell can digest it - this should not be much of a problem as it is rather simple.) This installation script needs one parameter, namely the full path to the "saclib" directory. So if your harddisk is "dh0:" and your SAC root directory is "dh0:saclib" you would type: 1> execute dh0:saclib/sysdep/amiga/install dh0:saclib First all system dependent files and scripts from the "amiga" directory are copied to where they belong. Then the files - "saclib/include/sacproto.h" (which contains the prototypes for all functions in SACLIB), - "saclib/lib/saclib.lib" (the default version of the library), and - "saclib/doc/desc.doc" (which is used by the 'sdesc' script) are created. Note that for compiling you need to create the directories 'OBJ:sac' and 'OBJ:sacd', where 'OBJ:' can be assigned to any directory on your harddisk. These directories are used to store the '.o' files (about 260 kB for 'OBJ:sac' and 300 kB for 'OBJ:sacd'). To finish the installation you need to add a line to your "startup-sequence" which assigns the logical name "SACLIB:" to the "saclib" directory. Following the example above, this line would look as follows: Assign SAC: dh0:saclib Finally, if you want to use the scripts in "saclib/bin", you should also add this directory to your path by adding a line similar to the following to your "startup-sequence": Path SACLIB:bin add Note that from now on *all* accesses to SACLIB should only be done via the 'SACLIB:' assignment. For example we used it for adding the SACLIB 'bin' directory to the path. For making sure that all this was done correctly, you should reset your machine and check if 'SACLIB:' is assigned to the SACLIB root directory. Then the installation is complete. 3. Compiling ============ 3.1. You have DICE ------------------ Hopefully you also have "make", because I do not provide you with a DMakefile. So either you can just use my makefile or you have to write your own DMakefile. If you just need to recompile, use the command 'mklib' from "saclib/bin". This shell script takes one of the following parameters: 'std' causes a standard library to be built. The library file will have the name "saclib.lib" and the corresponding object files are in "OBJ:sac". (Note that this library was already built by the install script.) 'deb' switches on the '-s' and '-gs' options of the compiler which include debugging information and stack checking code in the object files. The library file will have the name "saclibd.lib" and the corresponding object files are in "OBJ:sacd". 'all' builds both types of libraries. If you want to recompile after having added files to "saclib/src", you need to recreate the file 'include/sacproto.h' first, which is done by issuing the command 'mkproto'. 3.2. You have some other C Compiler ----------------------------------- You will have to modify the 'mklib' script provided and perhaps also change some definitions in "saclib/include/sysdep.h". 4. Tools ======== The following shell scripts can be found in the directory "saclib/bin": sdesc ... displays the description of a SACLIB algorithm (uses "saclib/doc/desc.doc"). sman ... displays a SACLIB algorithm. mkproto ... creates the file 'include/sacproto.h'. mklib ... compiles the library. mkdesc ... creates the file "doc/desc.doc" from the files in "saclib/src". The headers of these scripts contain more information on their usage. saclib2.2.8/sysdep/archive/amiga/install0000664002275300236100000000172014017255270017347 0ustar wcbrownscs.key dir/a .bra { .ket } ; FILE ; install ; ; FUNCTION ; Copies all system dependent files to the directories where they belong ; and compiles the library. ; Check IF NOT EXISTS "{dir}/sysdep/amiga/install" echo "'{dir}' is not the SACLIB root directory!" quit ENDIF ; Set environment Assign SACLIB: "{dir}" Path SACLIB:bin add ; Copy files Echo "Copying files from '{dir}/sysdep/amiga." Copy SACLIB:sysdep/amiga/src SACLIB:src Copy SACLIB:sysdep/amiga/bin SACLIB:bin Copy SACLIB:sysdep/amiga/include SACLIB:include Copy SACLIB:sysdep/amiga/example SACLIB:example ; Compile echo "Creating 'SACLIB:include/sacproto.h' ..." mkproto echo "Compiling standard SACLIB ..." mklib std ; Make docs echo "Creating 'SACLIB:doc/desc.doc' ..." mkdesc ; Finished echo "The install script is done." echo "Now add" echo " Assign SACLIB: {dir}" echo " Path SACLIB:bin add" echo "to your 'startup-sequence' to make the installation complete." saclib2.2.8/sysdep/archive/amiga/include/0000775002275300236100000000000014017255270017401 5ustar wcbrownscssaclib2.2.8/sysdep/archive/amiga/include/sacsys.h0000664002275300236100000000151714017255270021063 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETA ((int)0x20000000) #define BETA1 ((int)0x1fffffff) /* BETA - 1 */ /* Default values of several global variables. */ #define NU_ ((int)50000) /* 200 K list space - 25000 list cells. */ #define NUp_ ((int)100) #define NPRIME_ ((int)500) #define NPFDS_ ((int)5) #define NSMPRM_ ((int)500) #define RHO_ ((int)10) #define NPTR1_ ((int)2001) /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif #endif saclib2.2.8/sysdep/archive/amiga/example/0000775002275300236100000000000014017255270017411 5ustar wcbrownscssaclib2.2.8/sysdep/archive/amiga/example/makefile0000664002275300236100000000074614017255270021120 0ustar wcbrownscs# ========================= # Makefile for the example # ========================= CFLAGS = -ISACLIB:include LDFLAGS = MLIB = OBJ:sac${EXTENSION}/main.o -l SACLIB:lib/saclib${EXTENSION}.lib LIB = -l SACLIB:lib/saclib${EXTENSION}.lib LIBD = -l SACLIB:lib/saclibd.lib all: ipfac init itime ipfac: ipfac.o ${CC} $(LDFLAGS) ipfac.o $(MLIB) -o ipfac init: init.o ${CC} $(LDFLAGS) init.o $(LIB) -o init itime: itime.o ${CC} $(LDFLAGS) itime.o $(MLIB) -o itime saclib2.2.8/sysdep/archive/README0000664002275300236100000001132714017255270015564 0ustar wcbrownscs HOW TO PORT SACLIB ================== 1. Introduction =============== This file briefly describes the things to do when porting SACLIB to a UN*X system on which the shell 'csh' is installed. Actually, it should not be too much work to port SACLIB to any system with a C compiler and the standard C libraries. The problem here is, that the shell scripts will not work without 'csh', which is not available on most non-UN*X systems. 2. Preliminaries ================ In general, the material in the "generic" directory should not need too many modifications to run on any given UN*X machine. It might also be helpful to check some of the other system dependent directories for differences to the generic version. In the following sections we assume that you copied the contents of the "generic" directory to a new system dependent directory called "foo" and we describe which modifications might be necessary to these generic files. 2. Source files =============== Check whether the timing function called in "foo/src/CLOCK.c" is available on your system and suitable for your purposes. The generic version uses the standard function "time()", which returns the system time in seconds. As "CLOCK()" is defined to return the time in milliseconds, you should try to find a timing function with a higher resolution. Check whether the hack used in "foo/src/GC.c" works for your machine's processor and compiler. "GC()" must guarantee that the values of all registered variables are pushed onto the stack before "GCSI()" is called. The generic version defines 16 registered dummy variables and initializes them by calling a dummy function, thus (hopefully) forcing the compiler to push all registers onto the stack. Check whether your compiler uses "varargs" or "stdarg" for handling functions with a variable number of arguments. If it uses "varargs", then rename "foo/src/FAIL_varargs.c" to "foo/src/FAIL.c", so that it will replace the default version of "FAIL.c", which uses "stdarg". Try to write assembly code versions of "DPR.c" and "DQR.c". Replacing these low-level functions by assembly code versions should result in a speedup of at least 3 for most SACLIB arithmetic functions. Check the definitions in "foo/include/sacsys.h": - "Word" should be typedef'd to the signed C type representing the wordsize of your machine's processor. In general, this will be "int". - "BETA" must be a power of 2 such that 2^6 <= BETA and 3*BETA fits into a Word. In general, BETA will be equal to 2^(bitsize of a Word - 3). - "BETA1" must be defined to be equal to BETA-1. - "NU_" must be defined to be 2 times the number of list cells in the SACLIB heap. Note that each list cell uses 2 Words, so the memory used for the heap array is 4*NU_*sizeof(Word). - See Section B.2 of the "SACLIB User's Guide" for a description of the remaining constants. In general, the generic values should be suitable for any machine. 3. Shell scripts ================ Note that all the shell scripts in "generic" are written for "csh". If you do not have this shell installed on your machine, more extensive modifications than the ones listed below may be necessary. Adjust the environment variable "CC" in "foo/bin/mklib". It must be set to the name of the command starting the C compiler. In general, this will be set to "cc". Check whether your systems's "ar" command accepts the parameter "s". If it does not, comment out the line containing "ar ts" in the file "foo/bin/mkmake" and uncomment the corresponding line containing "ranlib". If your system does not have "ranlib", either, then try to find some other way of building the library with correct symbol tables. Adjust the environment variable "system" in "foo/install". It must be set to the name of the new system dependent directory. In the example described here, this would be "foo". 4. Installing ============= Follow the instructions in "foo/README", keeping in mind that they were written under the assumption that a correctly ported version of SACLIB should be installed. If the instructions given are not valid for your port, please correct them. 5. In case of success (or of total failure) =========================================== If you have successfully ported SACLIB we would appreciate it if you could inform us by sending e-mail to saclib@risc.uni-linz.ac.at (Internet) or ordinary mail to SACLIB Maintenance Research Institute for Symbolic Computation Johannes Kepler University A-4040 Linz, Austria so that we can include your port in the SACLIB distribution. On the other hand, if you ran into troubles porting SACLIB and still want to have it on your system, tell us of your problem and we will see what we can do about it. (Satisfaction not guaranteed!) saclib2.2.8/sysdep/archive/linux.tar0000664002275300236100000003700014017255270016547 0ustar wcbrownscslinux/004275500221170022117000000000000704307126500130405ustar00saclibsaclib00002650041524linux/src/004275500221170022117000000000000704307124300136235ustar00saclibsaclib00002650041524linux/src/FPHAND.c010064000221170022117000000020310704141310200147020ustar00saclibsaclib00002650041524/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. This function is system dependent: Linux kernel v2.2 ======================================================================*/ #include "saclib.h" void FPHAND(i,sip,uap) int i; siginfo_t* sip; void* uap; { ucontext_t *p; Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ p = (ucontext_t*)uap; (p->uc_mcontext.fpregs)->cw |= (_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } linux/src/FPCATCH.c010064000221170022117000000024440704141152600150320ustar00saclibsaclib00002650041524/*====================================================================== FPCATCH() Floating-point catch. Side Effects This function: 1) Sets FPHAND as the exception handling funciton for floating- point exceptions. 2) Sets overflow, underflow, and divide-by-zero as errors which result in traps. 3) Sets FPFLAG, a global variable that indicates whether a floating-point error has occured, to zero --- i.e. no error. ======================================================================*/ #include "saclib.h" #include #include #include void FPCATCH() { fpu_control_t cw; struct sigaction *p; Step1: /* Set FPHAND as the handler for floating point exceptions. */ p = (struct sigaction *)malloc(sizeof(struct sigaction)); p->sa_handler = FPHAND; sigemptyset(&(p->sa_mask)); p->sa_flags = SA_ONESHOT | SA_SIGINFO; sigaction(SIGFPE,p,NULL); Step2: /* Set exceptions that actually cause traps. This must include overflow and underflow. */ _FPU_GETCW(cw); cw &= ~(_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM); _FPU_SETCW(cw); Step3: /* Set error flag to zero. */ FPFLAG = 0; Return: /* Prepare to return. */ return; } linux/src/CLOCK.c010064000221170022117000000010670704141155600146200ustar00saclibsaclib00002650041524/*====================================================================== t <- CLOCK() Clock. Outputs t : the system clock time in millisecconds. ======================================================================*/ #include "saclib.h" #include Word CLOCK() { Word t; struct rusage r; struct timeval v; Step1: /* Get the system time. */ getrusage(RUSAGE_SELF, &r); v = r.ru_utime; t = v.tv_sec * 1000 + v.tv_usec / 1000; Return: /* Prepare for return. */ return(t); } linux/src/GC.c010064000221170022117000000015530704141156600142570ustar00saclibsaclib00002650041524/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { static int gc_dummy(); Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } linux/src/FPHAND.c.debian010064000221170022117000000020130704307106200161320ustar00saclibsaclib00002650041524/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. ======================================================================*/ #include "saclib.h" #include #include #include void FPHAND(i,p) int i; struct sigcontext p; { Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ // p = (struct sigcontext *)uap; p.fpstate->cw |= (_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } linux/include/004275500221170022117000000000000704141215300144545ustar00saclibsaclib00002650041524linux/include/hfloats.h010064000221170022117000000036730704141215300162650ustar00saclibsaclib00002650041524/*=============================================== hfloats.h Header file for hardware floats routines. ===============================================*/ /* ----------------------------------------*/ /* Include */ /* ----------------------------------------*/ #include #include #include /* ----------------------------------------*/ /* Hardware Floats */ /* ----------------------------------------*/ /* DECstations: */ typedef struct { unsigned mant_l : 32; unsigned mant_h : 20; unsigned exp : 11; unsigned sign : 1; } ieee_rep; /* SPARCstations: typedef struct { unsigned sign : 1; unsigned exp : 11; unsigned mant_h : 20; unsigned mant_l : 32; } ieee_rep; */ typedef union { double num; ieee_rep rep; } ieee; #define BIAS 1023 #define MAXEXP 1023 #define MAXEXP1 1024 #define MINEXP -1022 #define MINEXP1 -1023 #define PREC 53 #define PREC1 52 /* ----------------------------------------*/ /* Rounding modes */ /* ----------------------------------------*/ /* DECstations: */ /* #define rounddown() swapRM(ROUND_TO_MINUS_INFINITY) */ /* #define roundup() swapRM(ROUND_TO_PLUS_INFINITY) */ /* Sun SPARCs: see also man ieee_flags and /usr/include/ieeefp.h */ /* #define rounddown() fpsetround(FP_RM) */ /* #define roundup() fpsetround(FP_RP) */ /* Linux */ #define rounddown() { fpu_control_t cw; _FPU_GETCW(cw); cw= (cw & ~0x0C00)|_FPU_RC_DOWN; _FPU_SETCW(cw); } #define roundup() { fpu_control_t cw; _FPU_GETCW(cw); cw= (cw & ~0x0C00)|_FPU_RC_UP; _FPU_SETCW(cw); } /* ----------------------------------------*/ /* Hardware intervals */ /* ----------------------------------------*/ typedef struct { double left, right; } interval; static interval izero = { 0.0, 0.0 }; static interval ione = { 1.0, 1.0 }; linux/README010064000221170022117000000015030704307121000136740ustar00saclibsaclib00002650041524Saclib2.1 for PC's runninx linux -------------------------------- 1. The src contains the system dependent source files you'll need. 2. The includes directory contains the hfloats.h appropriate to linux on PC's. 3. Comment out the "#define BIG_ENDIAN" in sacsys.h. This environment variable already exists in the linux C files. 4. You might want to make sure that bin/mklib doesn't contain any compiler flags that won't make sense on your system. Also, be sure to set the environment variable CC = gcc, or else change bin/mklib so that gcc (rather than cc) is the default value for CC. Note: Debian linux seems not to have the ucontext.h file required by FPHAND. I don't know if this is a version problem or what, but other linux's seem okay with it. Try using src/FPHAND.c.debian instead of src/FPHAND.c.saclib2.2.8/sysdep/macosX86/0000775002275300236100000000000014017255270014667 5ustar wcbrownscssaclib2.2.8/sysdep/macosX86/cleanup0000775002275300236100000000017714017255270016251 0ustar wcbrownscs#!/bin/bash echo "Removing any macosX86 system dependent files ..." 'rm' -f $saclib/src/GC.c 'rm' -f $saclib/include/sysdep.h saclib2.2.8/sysdep/macosX86/GC.c0000664002275300236100000000155414017255270015331 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" static int gc_dummy(); void GC(void) { Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/macosX86/sysdep.h0000664002275300236100000000016414017255270016350 0ustar wcbrownscs#ifndef _LITTLE_ENDIAN_ #define _LITTLE_ENDIAN_ #endif #undef _BIG_ENDIAN_ #define _MAC_OSX_ #define __WORDSIZE 32 saclib2.2.8/sysdep/macosX86/install0000775002275300236100000000017514017255270016266 0ustar wcbrownscs#!/bin/bash echo "Installing macosX86 system dependent files ..." 'cp' -f GC.c $saclib/src/ 'cp' -f sysdep.h $saclib/include saclib2.2.8/sysdep/README0000664002275300236100000000131714017255270014141 0ustar wcbrownscsSaclib 2.2 & higher system dependent files & configuration 0) System-dependent configuration is done by calling $saclib/bin/sconf, which in turn calls $saclib/bin/mksysdep.pl, which tries to diagnose the processor type and OS type and call the "install" script from the appropriate (we hope!) subdirectory of $saclib/sysdep. 2) To add a port, you need a subdirectory for the target system in $saclib/sysdep, and you need to modify $saclib/bin/sconf to recognize your target system and call the appropriate install. NOTE: The macosX86 port is for Mac OS X on x86 in 32-bit mode. Presumably, the port to 64-bit Mac OS X wouldn't be too hard given the 64-bit Linux on x86 port. saclib2.2.8/sysdep/macosX86_64/0000775002275300236100000000000014017255270015200 5ustar wcbrownscssaclib2.2.8/sysdep/macosX86_64/cleanup0000775002275300236100000000020214017255270016547 0ustar wcbrownscs#!/bin/bash echo "Removing any macosX86_64 system dependent files ..." 'rm' -f $saclib/src/GC.c 'rm' -f $saclib/include/sysdep.h saclib2.2.8/sysdep/macosX86_64/GC.c0000664002275300236100000000155414017255270015642 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" static int gc_dummy(); void GC(void) { Word top_of_stack; #define r(R) register int R = gc_dummy() r(r1); r(r2); r(r3); r(r4); r(r5); r(r6); r(r7); r(r8); r(r9); r(r10); r(r11); r(r12); r(r13); r(r14); r(r15); r(r16); r1 = gc_dummy(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16); GCSI(sizeof(Word),(char *)&top_of_stack); } static int gc_dummy() { return 1; } saclib2.2.8/sysdep/macosX86_64/sysdep.h0000664002275300236100000000016414017255270016661 0ustar wcbrownscs#ifndef _LITTLE_ENDIAN_ #define _LITTLE_ENDIAN_ #endif #undef _BIG_ENDIAN_ #define _MAC_OSX_ #define __WORDSIZE 64 saclib2.2.8/sysdep/macosX86_64/install0000775002275300236100000000020014017255270016564 0ustar wcbrownscs#!/bin/bash echo "Installing macosX86_64 system dependent files ..." 'cp' -f GC.c $saclib/src/ 'cp' -f sysdep.h $saclib/include saclib2.2.8/sysdep/solarisSparc/0000775002275300236100000000000014017255270015724 5ustar wcbrownscssaclib2.2.8/sysdep/solarisSparc/FPCATCH.c0000664002275300236100000000233714017255270017145 0ustar wcbrownscs/*====================================================================== FPCATCH() Floating-point catch. Side Effects This function: 1) Sets FPHAND as the exception handling funciton for floating- point exceptions. 2) Sets overflow, underflow, and divide-by-zero as errors which result in traps. 3) Sets FPFLAG, a global variable that indicates whether a floating-point error has occured, to zero --- i.e. no error. ======================================================================*/ #include "saclib.h" void FPCATCH() { struct sigaction *p; Step1: /* Set FPHAND as the handler for floating point exceptions. */ p = (struct sigaction *)malloc(sizeof(struct sigaction)); p->sa_handler = NULL; p->sa_sigaction = FPHAND; sigemptyset(&(p->sa_mask)); p->sa_flags = SA_SIGINFO; sigaction(SIGFPE,p,NULL); Step2: /* Set exceptions that actually cause traps. This must include overflow and underflow. */ fpsetmask(FP_X_OFL | FP_X_UFL | FP_X_DZ); Step3: /* Set error flag to zero. */ FPFLAG = 0; free(p); /* What does this do? Added 7/13/2001 to fix apparent memory leak!*/ Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/solarisSparc/flush.s0000664002275300236100000000066714017255270017242 0ustar wcbrownscs!Sparcstation SLC assembler routine to flush register windows. !This routine is coded as a leaf routine, !i.e. it does not get its own window. !Author: N.J.Nevin: 20 Nov 90 #include .seg "text" ! void ! flush_windows(void) .globl flush_windows flush_windows: ta ST_FLUSH_WINDOWS !call software trap to flush !register windows to stack jmpl %o7+8, %g0 !return to caller nop !delay slot saclib2.2.8/sysdep/solarisSparc/FPHAND.c0000664002275300236100000000205214017255270017027 0ustar wcbrownscs/*====================================================================== FPHAND(i,sip,uap) Floating-point handler. Inputs i,sip,uap: Look at the man pages for "sigaction". Side Effects This function is the exception handler for floating point exceptions. It sets the global flag FPFLAG to 1 to indicate error. Also, it turns off *all* floating-point traps, so no floating-point operation causes a trap. This function is system dependent: for SunOS 5.6. ======================================================================*/ #include "saclib.h" void FPHAND(i,sip,uap) int i; siginfo_t* sip; void* uap; { struct ucontext *p; Step1: /* Set floating-point state register mask for enabling traps. (bits 23 - 27 on this architecture) */ p = (struct ucontext*)uap; p->uc_mcontext.fpregs.fpu_fsr &= (~( (FP_X_INV | FP_X_OFL | FP_X_UFL | FP_X_DZ | FP_X_IMP) << 23) ); Step2: /* Set error flag. */ FPFLAG = 1; Return: /* Prepare to return. */ return; } saclib2.2.8/sysdep/solarisSparc/cleanup0000775002275300236100000000026114017255270017300 0ustar wcbrownscs#!/bin/bash echo "Removing any solarisSparc system dependent files ..." 'rm' -f $saclib/src/GC.c $saclib/src/flush.s $saclib/src/get_pointers.s 'rm' -f $saclib/include/sysdep.h saclib2.2.8/sysdep/solarisSparc/GC.c0000664002275300236100000000130214017255270016355 0ustar wcbrownscs/*====================================================================== GC() Garbage collection entry-point. This is a system- and compiler-dependent function which ensures that all registers get pushed onto the stack. This is necessary since the GC-proper GCSI() assumes that all GC roots are either located on the stack or in the global variables. ======================================================================*/ #include "saclib.h" void GC() { char *EACSTACK; /* Flush register windows to the stack. */ flush_windows(); /* Get top pointer to the top of the stack. */ EACSTACK = (char *) get_frame_ptr(); GCSI(sizeof(Word),EACSTACK); } saclib2.2.8/sysdep/solarisSparc/sysdep.h0000664002275300236100000000021614017255270017403 0ustar wcbrownscs#ifndef _BIG_ENDIAN_ #define _BIG_ENDIAN_ #endif #undef _LITTLE_ENDIAN_ #define _SPARC_SOLARIS_ #define __WORDSIZE 32 #include saclib2.2.8/sysdep/solarisSparc/install0000775002275300236100000000023214017255270017315 0ustar wcbrownscs#!/bin/bash echo "Installing solarisSparc system dependent files ..." 'cp' -f flush.s GC.c get_pointers.s $saclib/src/ 'cp' -f sysdep.h $saclib/include saclib2.2.8/sysdep/solarisSparc/get_pointers.s0000664002275300236100000000106414017255270020613 0ustar wcbrownscs!Sparcstation SLC assembler routines to get the current framepointer !and the current stackpointer. !These routines are coded as leaf routines, !i.e. they do not get their own windows. !Author: N.J.Nevin, 20 Nov 90 .seg "text" ! int ! *get_frame_ptr(void) .globl get_frame_ptr get_frame_ptr: jmpl %o7+8, %g0 !return to caller mov %fp, %o0 !return value is fp (delay slot) ! int ! *get_stack_ptr(void) .globl get_stack_ptr get_stack_ptr: jmpl %o7+8, %g0 !return to caller mov %sp, %o0 !return value is sp (delay slot) saclib2.2.8/sysdep/include/0000775002275300236100000000000014017255270014702 5ustar wcbrownscssaclib2.2.8/sysdep/include/hfloats.h0000664002275300236100000000376414017255270016525 0ustar wcbrownscs/*=============================================== hfloats.h Header file for hardware floats routines. ===============================================*/ /* ----------------------------------------*/ /* Include */ /* ----------------------------------------*/ #include #include "sysdep.h" #ifdef _SPARC_SOLARIS_ #include #endif #ifdef _X86_LINUX_ #include #include #endif #ifdef _MAC_OSX_ #include #endif #include "sysdep.h" /* ----------------------------------------*/ /* Hardware Floats */ /* ----------------------------------------*/ #ifdef _LITTLE_ENDIAN_ typedef struct { unsigned mant_l : 32; unsigned mant_h : 20; unsigned exp : 11; unsigned sign : 1; } ieee_rep; #endif #ifdef _BIG_ENDIAN_ /* SPARCstations: */ typedef struct { unsigned sign : 1; unsigned exp : 11; unsigned mant_h : 20; unsigned mant_l : 32; } ieee_rep; #endif typedef union { double num; ieee_rep rep; } ieee; #define BIAS 1023 #define MAXEXP 1023 #define MAXEXP1 1024 #define MINEXP -1022 #define MINEXP1 -1023 #define PREC 53 #define PREC1 52 /* ----------------------------------------*/ /* Rounding modes */ /* ----------------------------------------*/ /* Sun SPARCs: see also man ieee_flags and /usr/include/ieeefp.h */ #ifdef _SPARC_SOLARIS_ #define rounddown() fpsetround(FP_RM) #define roundup() fpsetround(FP_RP) #endif /* Linux */ #ifdef _X86_LINUX_ #define rounddown() fesetround(FE_DOWNWARD) #define roundup() fesetround(FE_UPWARD) #endif /* MAC OSX */ #ifdef _MAC_OSX_ #define rounddown() fesetround(FE_DOWNWARD) #define roundup() fesetround(FE_UPWARD) #endif /* ----------------------------------------*/ /* Hardware intervals */ /* ----------------------------------------*/ typedef struct { double left, right; } interval; /* static interval izero = { 0.0, 0.0 }; static interval ione = { 1.0, 1.0 }; */ saclib2.2.8/sysdep/include/sacsys.h0000664002275300236100000000252014017255270016357 0ustar wcbrownscs/******************************************************************\ FILE sacsys.h Header file containing system dependent definitions. \******************************************************************/ #ifndef SACSYS_H #define SACSYS_H /* SACLIB 'Word' is a C 'int'. */ typedef int Word; /* Words are 32 bits. */ #define BETALENGTH 29 /* BETA is 29 bits */ #define BETA 0x20000000 #define BETA1 0x1fffffff /* BETA - 1 */ #define BETA2 0x10000000 /* BETA / 2 */ /* Default values of several global variables. */ #define NU_ 1000000 /* 4 MB list space - 500000 list cells. */ #define NUp_ 20000 #define NSPRIME_ 500 #define NMPRIME_ 2000 #define NLPRIME_ 2000 #define NPFDS_ 5 #define RHO_ 10 #define NPTR1_ 2001 /* LARGE = dimension of fixed size arrays used in IUPBEIN and * IUPBRESN to hold the result of the polynomial evaluation. * SMALL = dimension of fixed size array used in IUPBEIN and * IUPBRESN to hold the evaluation point. */ #define LARGE 2000 #define SMALL 50 /* Does the compiler support function prototypes? */ #ifdef __STDC__ #define P__(A) A #else #define P__(A) () #endif /* Indicate that a function does not return. */ #ifndef __noreturn # ifdef __GNUC__ # define __noreturn __attribute__ ((noreturn)) # else # define __noreturn # endif #endif #endif saclib2.2.8/sysdep/include/saclib.h0000664002275300236100000000532714017255270016317 0ustar wcbrownscs/*=========================================================================== saclib.h Header file for SACLIB ===========================================================================*/ #ifndef SACLIB_H #define SACLIB_H #include "sacsys.h" #include "sactypes.h" #include "hfloats.h" #include /*------------------------------------------- Constants -------------------------------------------*/ #define NIL BETA #define GC_CHECK 0 #define GC_NO_CHECK 1 #define SAC_KEEPMEM 0 #define SAC_FREEMEM 1 /* FIXED = dimension of fixed size array used in IPROD to hold * the operands. FIXEDX2 / 2 > FIXED >= MAXCLASSICAL. */ #define FIXED 200 /* FIXEDX2 = dimension of fixed size array used in IPROD to hold * the result. FIXEDX2 > FIXED * 2. */ #define FIXEDX2 401 /* WORK is the dimension of the fixed size work array for KARATSUBA * it has to be >= 2(FIXED - a + 3 floor(log_2(FIXED - 3))), * where a = 2^(k - 1) + 3 * k * and k = ceiling(log_2(MAXCLASSICAL - 3)). */ #define WORK 400 /* If integers are of length <= MAXCLASSICAL * classical multiplication is used, * i.e. the Karatsuba algorithm is not invoked. * MAXCLASSICAL <= FIXED. * Also the Karatsuba algorithm KARATSUBA uses classical multiplication * for operands of length <= MAXCLASSICAL. * The Karatsuba algorithm requires MAXCLASSICAL >= 4. */ #define MAXCLASSICAL 14 /*------------------------------------------- Function Prototypes -------------------------------------------*/ #include "sacproto.h" /*------------------------------------------- Macros --------------------------------------------*/ #include "sacmacros.h" /*------------------------------------------- External Variables -------------------------------------------*/ /* List processing */ extern Word AVAIL; extern char *BACSTACK; extern Word GCC; extern Word GCCC; extern Word GCAC; extern Word GCGLOBALS; extern Word GCM; extern Word NU; extern Word RHO; extern Word *SPACE; extern Word *SPACEB; extern Word *SPACEB1; extern Word GCAAVAIL; extern GCArray *GCASPACE; extern GCArray *GCASPACEBp; extern Word NUp; extern Word BETAp; extern Word BETApp; /* Timing */ extern Word TAU; extern Word TAU0; extern Word TAU1; /* Integer arithmetic */ extern Word DELTA; extern Word EPSIL; extern Word ETA; extern Word RINC; extern Word RMULT; extern Word RTERM; extern Word TABP2[]; extern Word THETA; extern Word TMI[128]; extern Word ZETA; /* Miscellaneous */ extern BDigit *FFPLUS1; extern BDigit FFSIZE; extern Word NPFDS; extern Word SPRIME; extern Word NSPRIME; extern Word MPRIME; extern Word NMPRIME; extern Word LPRIME; extern Word NLPRIME; extern Word UZ210; extern Word NPTR1; extern Word GCAPTR1; /* Input/Output */ extern Word LASTCHAR; #endif saclib2.2.8/sysdep/include/sactypes.h0000664002275300236100000000054314017255270016710 0ustar wcbrownscs/*=============================================== sactypes.h Header file for SACLIB type definitions ===============================================*/ #ifndef SACTYPES_H #define SACTYPES_H #include "sacsys.h" typedef struct {Word next; Word flag; Word len; Word *array;} GCArray; #define BDigit Word #define DWord long long #endif saclib2.2.8/sysdep/include/sacproto.h0000664002275300236100000015534614017255270016723 0ustar wcbrownscsextern void FAIL P__((const char *algName, const char *msg,...)) __noreturn; extern void AADV P__((Word L, Word *a_, Word *Lp_)); extern Word ABS P__((Word a)); extern Word ACLOCK P__((void)); extern void ADDTO P__((Word *A, Word *B, Word n)); extern void ADV2 P__((Word L, Word *a_, Word *b_, Word *Lp_)); extern void ADV3 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *Lp_)); extern void ADV4 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_, Word *Lp_)); extern void ADV P__((Word L, Word *a_, Word *Lp_)); extern Word AFCOMP P__((Word M, Word I, Word a, Word b)); extern Word AFCR P__((Word A)); extern Word AFDIF P__((Word a, Word b)); extern void AFDWRITE P__((Word M, Word I, Word b, Word n)); extern Word AFFINT P__((Word M)); extern Word AFFRN P__((Word R)); extern Word AFGEN P__((void)); extern Word AFICR P__((Word A)); extern Word AFINV P__((Word M, Word a)); extern Word AFNEG P__((Word a)); extern Word AFPAFP P__((Word r, Word M, Word a, Word B)); extern Word AFPAFQ P__((Word r, Word M, Word A, Word b)); extern Word AFPCMV P__((Word r, Word M, Word A, Word B)); extern Word AFPCR P__((Word r, Word A)); extern Word AFPDIF P__((Word r, Word A, Word B)); extern Word AFPDMV P__((Word r, Word M, Word A)); extern Word AFPEMV P__((Word r, Word M, Word A, Word a)); extern Word AFPEV P__((Word r, Word M, Word A, Word i, Word a)); extern Word AFPFIP P__((Word r, Word A)); extern Word AFPFRP P__((Word r, Word A)); extern Word AFPHIIR P__((BDigit n, interval I, Word A, BDigit k)); extern void AFPHIP P__((interval I, Word A, interval **B_, BDigit *t_)); extern Word AFPICR P__((Word r, Word A)); extern Word AFPINT P__((Word r, Word M, Word A, Word b)); extern Word AFPME P__((Word r, Word M, Word A, Word b)); extern Word AFPMON P__((Word r, Word M, Word A)); extern Word AFPNEG P__((Word r, Word A)); extern Word AFPNIP P__((Word M, Word A)); extern Word AFPNORM P__((Word r, Word M, Word B)); extern Word AFPPR P__((Word r, Word M, Word A, Word B)); extern void AFPQR P__((Word r, Word M, Word A, Word B, Word *Q_, Word *R_)); extern Word AFPROD P__((Word P, Word a, Word b)); extern void AFPSIP P__((Word I, Word A, BDigit p, BDigit *B)); extern Word AFPSIR P__((BDigit p, Word I, Word B, Word J)); extern Word AFPSUM P__((Word r, Word A, Word B)); extern void AFPWRITE P__((Word r, Word A, Word V, Word v)); extern Word AFQ P__((Word M, Word a, Word b)); extern Word AFSIGN P__((Word M, Word I, Word a)); extern Word AFSUM P__((Word a, Word b)); extern Word AFUPBRI P__((Word M, Word I, Word L)); extern Word AFUPCSFB P__((Word M, Word A)); extern Word AFUPFAC P__((Word M, Word B)); extern void AFUPFMRC P__((Word Q1, Word Q1p, Word q1, Word C1, Word L1, Word Q2, Word Q2p, Word q2, Word C2, Word *L2_, Word *C_)); extern Word AFUPFRPT P__((Word M, Word A, Word B)); extern void AFUPGC1 P__((Word M, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern void AFUPGC P__((Word M, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word AFUPGS P__((Word M, Word A)); extern void AFUPHIBRI P__((Word M, Word I, Word B, Word *L_, BDigit *t_)); extern Word AFUPIIR P__((Word M, Word I, Word B, Word J)); extern void AFUPIIWS P__((Word M, Word I, Word A, Word L)); extern void AFUPMPR P__((Word M, Word I, Word B, Word J, Word L, Word *Js_, Word *j_)); extern void AFUPQR P__((Word M, Word A, Word B, Word *Q_, Word *R_)); extern Word AFUPRB P__((Word M, Word I, Word A)); extern Word AFUPRICL P__((Word M, Word I, Word A)); extern Word AFUPRICS P__((Word M, Word I, Word A)); extern Word AFUPRII P__((Word M, Word J, Word A, Word Ap, Word d, Word Lp)); extern Word AFUPRL P__((Word M, Word A)); extern void AFUPRLS P__((Word M, Word I, Word A1, Word A2, Word L1, Word L2, Word *Ls1_, Word *Ls2_)); extern Word AFUPRRI P__((Word M, Word I, Word A, Word B, Word J, Word s1, Word t1)); extern void AFUPRRS P__((Word M, Word I, Word A1, Word A2, Word I1, Word I2, Word *Is1_, Word *Is2_, Word *s_)); extern Word AFUPSFBA P__((Word M, Word A, Word B)); extern Word AFUPSF P__((Word M, Word A)); extern void AFUPSFN P__((Word M, Word B, Word *s_, Word *Bt_, Word *F_)); extern void AFUPSIBRI P__((Word A, Word I, Word B, BDigit p, Word *J_, Word *L_)); extern Word AFUPSR P__((Word M, Word I, Word A, Word c)); extern Word AFUPVAR P__((Word M, Word I, Word A)); extern void AFUPWRITE P__((Word A, Word vA, Word vc)); extern Word AFUSPSFB P__((Word M, Word A)); extern void AFWRITE P__((Word A, Word v)); extern void AGIBL P__((BDigit **A, BDigit *n_, BDigit *k_)); extern void AGICOPY P__((BDigit **A, BDigit **B)); extern void AGIDP2 P__((BDigit **A, BDigit k, BDigit **B)); extern BDigit **AGIGCD2 P__((BDigit **A, BDigit **B)); extern BDigit **AGIGCDAE P__((BDigit **A, BDigit **B)); extern BDigit **AGIGCDW P__((BDigit **A, BDigit **B)); extern void AGIMD P__((BDigit **A, BDigit **B, BDigit **C)); extern void AGIMP2 P__((BDigit **A, BDigit h, BDigit **B)); extern void AGIMU P__((BDigit **A, BDigit k, BDigit **B)); extern BDigit AGINC P__((BDigit **A, BDigit **B)); extern void AGINORM P__((BDigit **A, BDigit *B, BDigit *T1, BDigit *T2)); extern void AGIPROD P__((BDigit **A, BDigit **B, BDigit **C, BDigit *T1, BDigit *T2)); extern void AGIQHQ P__((BDigit **A, BDigit *q_, BDigit *h_)); extern void AGIRP P__((BDigit **A, BDigit **B, BDigit **T, BDigit *k_)); extern void AGIRSUM P__((BDigit **A, BDigit **B, BDigit k, BDigit **C)); extern void AGISUM P__((BDigit **A, BDigit **B, BDigit **C)); extern void AGITR P__((BDigit **A, BDigit n, BDigit k, BDigit **B)); extern void AGIWRITE P__((BDigit **A)); extern BDigit AGIZERO P__((BDigit **A)); extern BDigit AICOMP P__((BDigit *A, BDigit *B)); extern void AICOPY P__((BDigit *A, BDigit *B)); extern void AIDP2 P__((BDigit *A, BDigit k, BDigit *B)); extern void AIFAN P__((Word M, Word *mh_, Word *Mh_)); extern Word AII P__((BDigit *A)); extern void AIMP2 P__((BDigit *A, BDigit h, BDigit *B)); extern void AINQ P__((BDigit *A, BDigit *B, BDigit *Q, BDigit *R, BDigit *S, BDigit *T)); extern void AIPROD P__((BDigit *A, BDigit *B, BDigit *C)); extern void AIQR P__((BDigit *A, BDigit *B, BDigit *Q, BDigit *R, BDigit *T)); extern void AISUM P__((BDigit *A, BDigit *B, BDigit *C)); extern void AITR P__((BDigit *A, BDigit n, BDigit k, BDigit *B)); extern BDigit AITRS P__((BDigit *A, BDigit n, BDigit k)); extern void AIWRITE P__((BDigit *A)); extern BDigit AIZERO P__((BDigit *A)); extern Word ALSIL P__((Word A, Word L)); extern Word AMLM P__((BDigit **M, BDigit m, BDigit n)); extern Word AMPDMV P__((Word r, Word A)); extern Word AMPSAFP P__((Word r, Word A)); extern Word AMSIGN P__((Word M, Word I, Word b)); extern void AMSIGNIR P__((Word M, Word I, Word b, Word *s_, Word *J_)); extern Word AMUPBES P__((Word M, Word I, Word A, Word c)); extern Word AMUPBHT P__((Word A, Word k)); extern Word AMUPIIR P__((Word M, Word I, Word B, Word J)); extern void AMUPIIWS P__((Word M, Word I, Word A, Word L)); extern void AMUPMPR P__((Word M, Word I, Word B, Word J, Word L, Word *Js_, Word *j_)); extern Word AMUPNT P__((Word A)); extern void AMUPRBH P__((Word M, Word I, Word A, Word *b_, Word *B_)); extern Word AMUPRICS P__((Word M, Word I, Word A)); extern void AMUPRICSW P__((Word M, Word I, Word A, Word *L_, Word *Is_)); extern void AMUPRINCS P__((Word M, Word I, Word A, Word a, Word b, Word *L_, Word *Is_)); extern void AMUPRLS P__((Word M, Word I, Word A1, Word A2, Word L1, Word L2, Word *Ls1_, Word *Ls2_)); extern void AMUPRRS P__((Word M, Word I, Word A1, Word A2, Word I1, Word I2, Word *Is1_, Word *Is2_, Word *s_)); extern Word AMUPSR P__((Word M, Word I, Word A, Word c)); extern Word AMUPTR1 P__((Word A)); extern Word AMUPTR P__((Word A, Word h)); extern void AMUPVARIR P__((Word M, Word I, Word A, Word *n_, Word *J_)); extern void ANDWRITE P__((Word M, Word I, Word n)); extern void ANFAF P__((Word M, Word I, Word a, Word *N_, Word *J_)); extern void ANHI P__((interval I, Word a, interval *J_, BDigit *t_)); extern void ANIIPE P__((Word M, Word I, Word N, Word J, Word t, Word L, Word *S_, Word *k_, Word *K_)); extern void ANPEDE P__((Word A, Word B, Word *C_, Word *t_)); extern void ANPROD P__((Word A, Word I, Word B, Word J, Word *C_, Word *K_)); extern Word ANR P__((BDigit p, Word A, Word I)); extern Word ANREPE P__((Word M, Word A, Word B, Word t)); extern void ANSI P__((BDigit *I, Word a, BDigit *J)); extern void ANSUM P__((Word A, Word I, Word B, Word J, Word *C_, Word *K_)); extern Word AREAD P__((void)); extern void ARGSACLIB P__((int argc, char **argv, int *ac_, char ***av_)); extern void ARIE P__((Word A, Word n, Word I)); extern void ASSPR P__((Word A, Word *p_, Word *m_)); extern void AWCOPY P__((Word *A, BDigit n, Word *B)); extern void AWRITE P__((Word A)); extern Word BDGCD P__((Word a, Word b)); extern void BEGINSACLIB P__((Word *p)); extern Word BERNOULLINUM P__((BDigit n)); extern Word BERNOULLIPOL P__((BDigit n, Word L)); extern Word BITRAN P__((void)); extern void BKSP P__((void)); extern Word BRILBRI P__((Word I)); extern Word CCONC P__((Word L1, Word L2)); extern Word CHEBY P__((BDigit n)); extern Word CINV P__((Word L)); extern void CLEAR P__((Word *A, Word n)); extern Word CLOCK P__((void)); extern void CLOUT P__((Word L)); extern Word COMP2 P__((Word a, Word b, Word L)); extern Word COMP3 P__((Word a1, Word a2, Word a3, Word L)); extern Word COMP4 P__((Word a1, Word a2, Word a3, Word a4, Word L)); extern Word COMP P__((Word a, Word L)); extern Word CONC P__((Word L1, Word L2)); extern void COPYTO P__((Word *A, Word *B, Word n)); extern void CPLEXN P__((Word L, Word *I_, Word *M_)); extern Word CREADB P__((void)); extern Word CREAD P__((void)); extern BDigit CSFAM P__((BDigit n, BDigit *A)); extern Word CSFPAR P__((Word L)); extern Word CSFS P__((Word S)); extern Word CSINT P__((Word A, Word B)); extern Word CSSUB P__((Word A, Word B)); extern Word CSUN P__((Word A, Word B)); extern void CTMI P__((Word *A)); extern void CWRITE P__((Word C)); extern Word DAND P__((Word a, Word b)); extern void DDPCC P__((Word a1, Word a0, Word b1, Word b0, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern void DDRPCC P__((Word m, Word a1, Word a0, Word b1, Word b0, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern void DEGCD P__((Word a, Word b, Word *c_, Word *u_, Word *v_)); extern Word DGCD P__((Word a, Word b)); extern void DIELOC P__((void)); extern Word DIGIT P__((Word C)); extern Word DIIPREAD P__((Word V)); extern void DIIPWRITE P__((Word r, Word A, Word V)); extern Word DIPDEG P__((Word r, Word A)); extern Word DIPFP P__((Word r, Word A)); extern void DIPINS P__((Word a, Word d, Word A, Word *t_, Word *B_)); extern Word DIRPREAD P__((Word V)); extern void DIRPWRITE P__((Word r, Word A, Word V)); extern void DLINIT P__((BDigit p, BDigit n, BDigit **Fp, BDigit **Gp, BDigit **A, BDigit **B, BDigit **C)); extern BDigit DLINV P__((BDigit a)); extern BDigit DLNEG P__((BDigit a)); extern Word DLOG2 P__((Word a)); extern BDigit DLPROD P__((BDigit a, BDigit b)); extern BDigit DLSUM P__((BDigit a, BDigit b)); extern Word DMPPRD P__((Word r, Word m, Word A, Word B)); extern Word DMPSUM P__((Word r, Word m, Word A, Word B)); extern Word DMUPNR P__((Word p, Word A, Word B)); extern Word DNIMP P__((Word a, Word b)); extern Word DNOT P__((Word a)); extern Word DOR P__((Word a, Word b)); extern void DPCC P__((Word a, Word b, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern Word DPFP P__((Word r, Word A)); extern Word DPGEN P__((Word m, Word k)); extern void DPR P__((Word A, Word B, Word *c1_, Word *c0_)); extern void DPRNN P__((Word A, Word B, Word *c1_, Word *c0_)); extern void DQR P__((Word a1, Word a0, Word b, Word *q_, Word *r_)); extern Word DRAN P__((void)); extern Word DRANN P__((void)); extern void DRPCC P__((Word m, Word a, Word b, Word *u1_, Word *u2_, Word *v1_, Word *v2_)); extern Word DSMC P__((Word m, Word mp, Word u)); extern void DSQRTF P__((Word a, Word *b_, Word *t_)); extern Word DVCMP P__((Word d1, Word d2)); extern void ENDSACLIB P__((Word f)); extern Word EQUAL P__((Word a, Word b)); extern Word EVEN P__((Word a)); extern Word EXPF P__((Word a, Word b)); extern Word EXTENT P__((Word a)); extern BDigit FCOMP P__((BDigit *I, BDigit *J)); extern void FCOPY P__((Word *A, Word *B)); extern void FDIF P__((Word *A, Word *B, BDigit d, Word *C)); extern void FILINE P__((void)); extern void FIRST2 P__((Word L, Word *a_, Word *b_)); extern void FIRST3 P__((Word L, Word *a1_, Word *a2_, Word *a3_)); extern void FIRST4 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_)); extern void FIRST5 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_, Word *a5_)); extern void FIRST6 P__((Word L, Word *a1_, Word *a2_, Word *a3_, Word *a4_, Word *a5_, Word *a6_)); extern Word FIRST P__((Word L)); extern Word FLBRN P__((BDigit *F)); extern Word FOURTH P__((Word L)); extern void FPCATCH P__((void)); extern Word FPCHECK P__((void)); extern void FPROD1 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FPROD21 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FPROD2 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FPROD P__((Word *A, Word *B, BDigit d, Word *C)); extern void FQUOT P__((BDigit *A, BDigit *B, BDigit d, BDigit *C)); extern Word FRAPCR P__((Word **A)); extern Word **FRAPFMD P__((Word c, Word n)); extern void FRAPFREE P__((Word **A)); extern Word **FRAPGET P__((Word d, Word n)); extern Word **FRAPMON P__((Word p, Word *M, Word **A)); extern void FRAPREM P__((Word p, Word *M, Word **A, Word **B)); extern void FREEMATRIX P__((Word **A, Word n)); extern Word *FREINV P__((Word p, Word *M, Word *A)); extern void FREPROD P__((Word p, Word *M, Word *A, Word *B, Word *C)); extern void FRESL P__((Word n, Word *m_, Word *L_)); extern Word FRLSM P__((Word m, Word a)); extern Word **FRUPCR P__((Word A, Word n)); extern Word FRUPGCD P__((Word p, Word M, Word A, Word B)); extern void FSUM P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMDEOS1 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMDEOS2 P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMDESS P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMSEOS P__((Word *A, Word *B, BDigit d, Word *C)); extern void FSUMSESS P__((Word *A, Word *B, BDigit d, Word *C)); extern Word *GCA2PTR P__((Word A)); extern void GCAFREE P__((Word A)); extern Word GCAGET P__((Word A, Word i)); extern Word GCAMALLOC P__((Word s, Word f)); extern void GCASET P__((Word A, Word i, Word a)); extern Word GCATL P__((Word A, Word n)); extern void GC P__((void)); extern void GCGLOBAL P__((Word *p)); extern void GCSI P__((Word s, char *EACSTACK)); extern Word GDPGEN P__((Word m, Word k)); extern interval **GETAHIA P__((BDigit (n))); extern Word *GETARRAY P__((Word n)); extern interval *GETHIPARRAY P__((BDigit n)); extern Word **GETMATRIX P__((Word m, Word n)); extern BDigit **GIAGI P__((Word A)); extern Word GICONJ P__((Word A)); extern Word GIDIF P__((Word A, Word B)); extern Word GIFP P__((Word A1, Word A2)); extern Word GIFQA P__((Word a)); extern Word GIGCD P__((Word A, Word B)); extern BDigit GIHQ P__((Word a)); extern Word GIMS P__((Word a, Word b)); extern Word GINEG P__((Word A)); extern Word GINORM P__((Word A)); extern Word GINQ P__((Word a, Word b)); extern void GINQR P__((Word A, Word B, Word *Q_, Word *R_)); extern void GIPGEN P__((Word N, Word *L1_, Word *L2_)); extern Word GIPROD P__((Word A, Word B)); extern Word GIRP P__((Word a)); extern Word GISUM P__((Word A, Word B)); extern void GIWRITE P__((Word a)); extern Word GREAD P__((void)); extern void GWRITE P__((Word a)); extern BDigit HEXP P__((double a)); extern BDigit HIACC P__((interval I)); extern void HIDWRITE P__((interval I, BDigit k)); extern Word HILBRI P__((interval I)); extern void HIPBHT P__((BDigit n, interval A[], BDigit k, interval **B_, BDigit *t_)); extern interval *HIPCHT P__((BDigit n, interval A[])); extern interval *HIPCOPY P__((BDigit n, interval A[])); extern void HIPDWRITE P__((BDigit n, interval *A, BDigit k)); extern Word HIPFES P__((BDigit n, interval A[], double a)); extern interval HIPIEVAL P__((BDigit n, interval A[], interval I)); extern void HIPIR P__((BDigit n, interval A[], interval I, BDigit t, BDigit h, BDigit k, interval *J_, BDigit *j_)); extern void HIPLWRITE P__((BDigit n, interval *A)); extern interval *HIPNEGT P__((BDigit n, interval A[])); extern BDigit HIPPRB P__((BDigit n, interval *A)); extern interval HIPROD P__((interval I, interval J)); extern void HIPRRID P__((BDigit n, interval *A, Word *L_, BDigit *t_)); extern void HIPRRISD P__((BDigit n, interval *A, Word a, Word b, Word *L_, BDigit *t_)); extern interval *HIPRT P__((BDigit n, interval *A)); extern Word HIPSV P__((BDigit n, interval *A)); extern interval *HIPTR1 P__((BDigit n, interval A[])); extern void HIPVCHT P__((BDigit n, interval *A, BDigit *v_, BDigit *t_)); extern interval HIQUOT P__((interval I, interval J)); extern Word HISIGN P__((interval I)); extern interval HISUM P__((interval I, interval J)); extern BDigit HSIGN P__((double a)); extern Word IABSF P__((Word A)); extern Word IACOMPA P__((Word *A, Word m, Word *B, Word n)); extern BDigit *IAI P__((Word A)); extern Word IBCIND P__((Word A, Word n, Word k)); extern Word IBCOEF P__((Word n, Word k)); extern Word IBCOEFS P__((Word n)); extern Word IBCPS P__((Word n, Word k)); extern Word IBPPOL P__((Word A, Word a, Word k)); extern Word IBPPOS P__((Word A, Word a, Word b, Word e, Word k)); extern Word ICOMP P__((Word A, Word B)); extern Word ICRAND P__((Word n, Word s)); extern void IDEGCD P__((Word a, Word b, Word *c_, Word *u1_, Word *v1_, Word *u2_, Word *v2_)); extern Word IDENTMAT P__((Word n)); extern Word IDEQ P__((Word A, Word b)); extern void IDIFA P__((Word *A, Word m, Word *B, Word n, Word *k_)); extern Word IDIF P__((Word A, Word B)); extern Word IDIPR2 P__((Word A, Word B, Word a, Word b)); extern void IDLCOMB P__((Word *A, Word m, Word *B, Word n, Word u1, Word v1, Word u2, Word v2, Word s, Word t, Word *mp_, Word *np_)); extern Word IDP2 P__((Word A, Word k)); extern Word IDPR P__((Word A, Word b)); extern Word IDQ P__((Word A, Word b)); extern void IDQRA P__((Word *A, Word m, Word b, Word *Q, Word *k_, Word *r_)); extern void IDQR P__((Word A, Word b, Word *Q_, Word *r_)); extern Word IDREM P__((Word A, Word b)); extern void IEAS P__((Word *A1, Word m1, Word *A2, Word m2, Word *m1p_)); extern void IEEEDWRITE P__((ieee F, BDigit k)); extern Word IEEELBRN P__((double F)); extern void IEEENEIGH P__((ieee F, BDigit d, ieee *Fp_, BDigit *t_)); extern void IEEEROUND P__((ieee F, BDigit s, BDigit d, ieee *Fp_, BDigit *t_)); extern void IEEEWRITE P__((ieee F)); extern void IEGCD P__((Word a, Word b, Word *c_, Word *u1_, Word *v1_)); extern Word IEQ P__((Word A, Word B)); extern Word IEVEN P__((Word A)); extern Word IEXP P__((Word A, Word n)); extern Word IFACT P__((Word n)); extern Word IFACTL P__((Word n)); extern Word IFATL P__((Word *A, Word m, Word s)); extern void IF P__((Word I, BDigit p, BDigit d, BDigit *A)); extern void IFCL2 P__((Word a, Word *m_, Word *n_)); extern BDigit IFEC P__((Word I, BDigit p, BDigit *A)); extern void IFLTA P__((Word A, Word *B, Word b, Word **Bp_, Word *n_, Word *s_, Word *o_)); extern Word IGCD P__((Word A, Word B)); extern void IGCDCF P__((Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word IHDREM P__((Word *A, Word n, Word b)); extern void IHEAS P__((Word *A1, Word m1, Word *A2, Word m2, Word *V1, Word n1, Word *V2, Word n2, Word *mp_, Word *np_)); extern void IHEGCD P__((Word A, Word B, Word *C_, Word *V_)); extern void IHI P__((Word A, interval *I_, BDigit *u_)); extern Word IIC P__((Word A, Word Ap, Word I, Word L)); extern void IIEEE P__((Word A, BDigit d, ieee *F_, BDigit *u_)); extern void IIEEET P__((Word A, ieee *F_, BDigit *t_, BDigit *u_)); extern Word ILBRN P__((Word I)); extern Word ILCM P__((Word A, Word B)); extern Word ILCOMB P__((Word A, Word B, Word u, Word v)); extern Word ILOG2 P__((Word A)); extern Word ILOGB P__((Word A)); extern void ILPDS P__((Word n, Word a, Word b, Word *p_, Word *np_)); extern void ILSA P__((BDigit *A, BDigit n, BDigit k)); extern void ILWORD P__((Word *A, Word m, Word *B, Word n, Word *a_, Word *b_)); extern void ILWORDS P__((Word *A, Word m, Word *B, Word n, Word *a1_, Word *a0_, Word *b1_, Word *b0_)); extern void ILWRITE P__((Word L)); extern Word IMAX P__((Word a, Word b)); extern Word IMIN P__((Word a, Word b)); extern Word IMP2 P__((Word A, Word h)); extern void IMPBAA P__((Word *A, Word *B, Word m, Word n, Word s, Word t, Word h, Word *p_, Word *u_)); extern void IMPB P__((Word A, Word n, Word *B_, Word *t_)); extern void IMPDS P__((Word n, Word a, Word b, Word *p_, Word *q_)); extern void INEGA P__((Word *A, Word n)); extern Word INEG P__((Word A)); extern void INFOSACLIB P__((const char *s)); extern Word INQ P__((Word a, Word b)); extern void INQR P__((Word A, Word B, Word *Q_, Word *R_)); extern Word INSET P__((Word S, Word a)); extern Word INV P__((Word L)); extern BDigit *INVPERM P__((BDigit n, BDigit *A)); extern Word IODD P__((Word A)); extern Word IORD2 P__((Word A)); extern Word IPABS P__((Word r, Word A)); extern Word IPAFME P__((Word r, Word M, Word A, Word b)); extern Word IPBEILV P__((Word r, Word A, Word c, Word k, Word m)); extern Word IPBEZM P__((BDigit r, Word A, Word B)); extern Word IPBHT P__((Word r, Word A, Word i, Word k)); extern Word IPBHTLV P__((Word r, Word A, Word k)); extern Word IPBHTMV P__((Word r, Word A, Word k)); extern Word IPBREI P__((Word r, Word A, Word i, Word c)); extern void IPCA P__((BDigit r, Word A, BDigit *n_, BDigit *h_, BDigit *k_, BDigit *t_)); extern Word IPC P__((Word r, Word A)); extern void IPCEVP P__((Word r, Word A, Word *B_, Word *L_)); extern Word IPCONST P__((Word r, Word A)); extern void IPCPP P__((Word r, Word A, Word *C_, Word *Ab_)); extern Word IPCRA P__((Word M, Word m, Word mp, Word r, Word A, Word a)); extern Word IPCSFB P__((Word r, Word A)); extern Word IPDER P__((Word r, Word A, Word i)); extern Word IPDIF P__((Word r, Word A, Word B)); extern Word IPDMV P__((Word r, Word A)); extern void IPDQNR P__((Word r, Word A, Word m, Word *Q_, Word *R_)); extern void IPDQR P__((Word r, Word A, Word m, Word *Q_, Word *R_)); extern Word IPDSCRBEZ P__((Word r, Word A)); extern Word IPDSCR P__((Word r, Word A)); extern void IPDWRITE P__((Word r, Word A, Word V)); extern Word IPEMV P__((Word r, Word A, Word a)); extern Word IPEQ P__((Word r, Word A, Word B)); extern Word IPEVAL P__((Word r, Word A, Word i, Word a)); extern Word IPEXP P__((Word r, Word A, Word n)); extern void IPEXPREAD P__((Word r, Word V, Word *A_, Word *t_)); extern void IPEXPREADR P__((Word r, Word V, Word *A_, Word *t_)); extern void IPFAC P__((Word r, Word A, Word *s_, Word *c_, Word *L_)); extern void IPFACTREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word IPFCB P__((Word V)); extern Word IPFLC P__((Word r, Word M, Word I, Word A, Word L, Word D)); extern Word IPFRP P__((Word r, Word A)); extern Word IPFSD P__((Word r, Word A)); extern Word IPFSFB P__((Word r, Word A)); extern void IPGCDC P__((Word r, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word IPGFCB P__((Word r, Word A)); extern Word IPGSUB P__((Word r, Word A, Word s, Word L)); extern Word IPGTDRAN P__((BDigit r, BDigit k, BDigit n, Word q)); extern Word IPHDMV P__((Word r, Word A, Word k)); extern Word IPIC P__((Word r, Word A)); extern void IPICPP P__((Word r, Word A, Word *a_, Word *Ab_)); extern Word IPICS P__((Word r, Word A, Word c)); extern Word IPIHOM P__((Word r, Word D, Word A)); extern Word IPIIRB P__((Word A, Word I, Word t, Word k)); extern void IPIIS P__((Word A1, Word A2, Word I1, Word I2, Word t1, Word t2, Word *J1_, Word *J2_, Word *s_)); extern Word IPIISS P__((Word M, Word a, Word b, Word v1, Word v2)); extern void IPIIWS P__((Word A, Word L)); extern Word IPINT P__((Word r, Word A, Word b)); extern Word IPIP P__((Word r, Word a, Word B)); extern Word IPIPP P__((Word r, Word A)); extern Word IPIPR P__((Word r, Word D, Word A, Word B)); extern Word IPIQ P__((Word r, Word A, Word b)); extern void IPIQH P__((Word r, Word p, Word D, Word Ab, Word Bb, Word Sb, Word Tb, Word M, Word C, Word *A_, Word *B_)); extern void IPLCPP P__((Word r, Word A, Word *C_, Word *P_)); extern Word IPLEV P__((Word S, Word a)); extern Word IPLRRI P__((Word L)); extern Word IPLSEVAL P__((Word L, Word a)); extern Word IPLSILM P__((Word L1, Word L2)); extern Word IPMAXN P__((Word r, Word A)); extern void IPMONFACT P__((Word r, Word A, Word *L_, Word *Ap_)); extern Word IPNEG P__((Word r, Word A)); extern Word IPNT P__((Word r, Word A, Word i)); extern Word IPONE P__((Word r, Word A)); extern void IPOWER P__((Word A, Word L, Word *B_, Word *n_)); extern Word IPP2P P__((Word r, Word B, Word m)); extern Word IPPFAC2 P__((Word r, Word A)); extern Word IPPGSD P__((Word r, Word A)); extern Word IPPNPRS P__((Word A, Word B)); extern void IPPOWREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word IPPP P__((Word r, Word A)); extern Word IPPROD P__((Word r, Word A, Word B)); extern Word IPPSC P__((Word r, Word A, Word B)); extern Word IPPSR P__((Word r, Word A, Word B)); extern Word IPPVED P__((Word r, Word A)); extern Word IPQ P__((Word r, Word A, Word B)); extern void IPQR P__((Word r, Word A, Word B, Word *Q_, Word *R_)); extern Word IPRAN P__((Word r, Word k, Word q, Word N)); extern Word IPRCH P__((Word A, Word I, Word k)); extern Word IPRCHS P__((Word A, Word I, Word k)); extern Word IPRCN1 P__((Word A, Word I, Word s, Word k)); extern void IPRCNP P__((Word A, Word I, Word *sp_, Word *spp_, Word *J_)); extern void IPREAD P__((Word *r_, Word *A_)); extern Word IPRESBEZ P__((BDigit r, Word A, Word B)); extern Word IPRES P__((BDigit r, Word A, Word B)); extern Word IPRESPRS P__((BDigit r, Word A, Word B)); extern Word IPRICL P__((Word A)); extern Word IPRIM P__((Word A)); extern Word IPRIMO P__((Word A, Word Ap, Word I)); extern Word IPRIMS P__((Word A, Word Ap, Word I)); extern Word IPRIMU P__((Word A)); extern Word IPRIMW P__((Word A)); extern void IPRIP P__((Word A, Word *A1_, Word *A2_)); extern Word IPRIST P__((Word A)); extern Word IPRNME P__((Word r, Word A, Word b)); extern Word IPROD2X2 P__((Word A, Word B)); extern Word IPROD3X2 P__((Word A, Word B)); extern Word IPROD3X3 P__((Word A, Word B)); extern void IPRODA P__((Word *A, Word n1, Word *B, Word n2, Word *C)); extern void IPRODAP P__((Word *A, Word n1, Word *B, Word n2, Word *n3_)); extern Word IPROD P__((Word A, Word B)); extern Word IPRPRS P__((Word r, Word A, Word B)); extern Word IPRRID P__((Word A)); extern Word IPRRII P__((Word A, Word Ap, Word d, Word Lp)); extern Word IPRRIRDB P__((Word A, Word k)); extern Word IPRRIRSB P__((Word A, Word k)); extern Word IPRRIS P__((Word A)); extern Word IPRRISD P__((Word A, Word a, Word b)); extern Word IPRRISI P__((Word A, Word I)); extern Word IPRRISS P__((Word M, Word a, Word b, Word v1, Word v2, Word s)); extern void IPRRLS P__((Word A1, Word A2, Word L1, Word L2, Word *Ls1_, Word *Ls2_)); extern Word IPRRRI P__((Word A, Word B, Word I, Word s1, Word t1)); extern void IPRRS P__((Word A1, Word A2, Word I1, Word I2, Word *Is1_, Word *Is2_, Word *s_)); extern Word IPSBLSIL P__((Word A)); extern Word IPSBLSSIL P__((Word A)); extern void IPSCPP P__((Word r, Word A, Word *s_, Word *C_, Word *Ab_)); extern Word IPSFBA P__((Word r, Word A, Word B)); extern Word IPSF P__((Word r, Word A)); extern Word IPSFSD P__((Word r, Word A)); extern Word IPSIFI P__((Word A, Word I)); extern Word IPSIGN P__((Word r, Word A)); extern void IPSIP P__((Word A, BDigit p, Word *B)); extern Word IPSMV P__((Word r, Word A, Word B)); extern Word IPSPRS P__((Word r, Word A, Word B)); extern Word IPSQRT P__((Word r, Word A)); extern Word IPSRM P__((Word A, Word I)); extern Word IPSRMS P__((Word A, Word I)); extern void IPSRP P__((Word r, Word A, Word *a_, Word *Ab_)); extern Word IPSTDRAN P__((Word r, Word k, Word q, Word n)); extern Word IPSUB P__((Word r, Word A, Word i, Word B)); extern Word IPSUM P__((Word r, Word A, Word B)); extern Word IPSUMN P__((Word r, Word A)); extern void IPTERMREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word IPTPR P__((Word r, Word D, Word A, Word B)); extern Word IPTR1 P__((Word r, Word A, Word i)); extern Word IPTR1LV P__((Word r, Word A)); extern Word IPTRAN P__((Word r, Word A, Word T)); extern Word IPTR P__((Word r, Word A, Word i, Word h)); extern Word IPTRLV P__((Word r, Word A, Word h)); extern Word IPTRMV P__((Word r, Word A, Word h)); extern Word IPTRUN P__((Word r, Word D, Word A)); extern Word IPVCHT P__((Word A)); extern Word IPVCHTP P__((Word A)); extern void IPVDEG12 P__((Word r, Word A, Word *k_, Word *B_)); extern void IPWRITE P__((Word r, Word A, Word V)); extern Word IQ P__((Word A, Word B)); extern void IQRA P__((Word *A, Word m, Word *B, Word n, Word *Q, Word *mp_, Word *k_)); extern void IQR P__((Word A, Word B, Word *Q_, Word *R_)); extern Word IRAND P__((Word n)); extern Word IREAD P__((void)); extern Word IREM P__((Word A, Word B)); extern void IRLSA P__((Word *A, Word n, Word k, Word *np_)); extern void IROOT P__((Word A, Word n, Word *B_, Word *t_)); extern Word ISATOM P__((Word a)); extern Word ISCSELT P__((Word i, Word C)); extern void ISEM P__((Word A, BDigit *s_, BDigit *e_, BDigit *m1_, BDigit *m0_, BDigit *t_)); extern Word ISFPF P__((Word r, Word A)); extern Word ISFPIR P__((Word A, Word I, Word k)); extern Word ISGCA P__((Word a)); extern void ISI P__((Word I, BDigit p, BDigit *A)); extern Word ISIGNF P__((Word A)); extern void ISLCOMB P__((Word *A, Word m, Word *B, Word n, Word v, Word s, Word *mp_)); extern Word ISLIST P__((Word a)); extern Word ISMC P__((Word M, Word Mp, Word m, Word U)); extern Word ISNIL P__((Word a)); extern Word ISOBJECT P__((Word a)); extern void ISPD P__((Word n, Word *F_, Word *m_)); extern Word ISPFAC2 P__((Word r, Word A)); extern void ISPROD P__((Word *A, BDigit n1, Word *B, BDigit n2, Word *C)); extern Word ISPSFB P__((Word r, Word A)); extern Word ISPT P__((Word m, Word mp, Word F)); extern void ISQRT P__((Word A, Word *B_, Word *t_)); extern Word ISSUBSET P__((Word A, Word B)); extern Word ISUM P__((Word A, Word B)); extern Word ISZERO P__((Word a)); extern Word ITRUNC P__((Word A, Word n)); extern Word IUPBEI P__((Word A, Word c, Word k)); extern Word IUPBES P__((Word A, Word a)); extern Word IUPBHT P__((Word A, Word k)); extern void IUPBREA P__((Word A, Word *C, Word m, Word t, Word k, Word *B, Word M, Word *p_, Word *s_)); extern Word IUPBRE P__((Word A, Word a)); extern BDigit IUPBRES P__((Word A, Word a)); extern Word IUPBREV P__((Word A, Word a)); extern Word IUPCHT P__((Word A)); extern void IUPEFD P__((Word p, Word Q, Word C, Word M, Word L, Word G, Word D, Word d, Word *F_, Word *Cb_, Word *Gb_, Word *Mb_, Word *Ib_, Word *Db_)); extern Word IUPENF P__((Word A)); extern Word IUPEVAL P__((Word A, Word a)); extern void IUPFAC P__((Word A, Word *s_, Word *c_, Word *L_)); extern void IUPFCT P__((Word p, Word Q, Word Qp, Word q, Word C, Word M, Word L, Word G, Word D, Word e, Word d, Word k, Word *F_, Word *Cb_, Word *Mb_, Word *Lb_, Word *Gb_, Word *Db_)); extern void IUPFT2 P__((Word p, Word Q, Word Qp, Word q, Word A, Word B, Word *Ab_, Word *B1_, Word *B2_)); extern void IUPFT P__((Word p, Word Q, Word Qp, Word q, Word A, Word B, Word *Ab_, Word *Bb_)); extern void IUPHIP P__((Word A, interval **B_, BDigit *t_)); extern Word IUPHLEFD P__((Word p, Word F, Word C, Word E, Word G)); extern Word IUPIHT P__((Word A, Word n)); extern Word IUPIIR P__((Word A, Word I)); extern void IUPILHS P__((Word q, Word Q, Word Ab, Word Bb, Word Sb, Word Tb, Word C, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern Word IUPLB P__((Word A, Word k)); extern void IUPLHS P__((Word q, Word Q, Word Qpp, Word Ab, Word Bb, Word Sb, Word Tb, Word Ap, Word Bp, Word Yp, Word Zp, Word U, Word D, Word A, Word B, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern void IUPLHSL P__((Word q, Word Q, Word Qpp, Word Ab, Word Bb, Word Sb, Word Tb, Word Ap, Word Bp, Word Yp, Word Zp, Word U, Word D, Word A, Word B, Word *Qs_, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern Word IUPLRB P__((Word A)); extern Word IUPNT P__((Word A)); extern Word IUPPRB P__((Word A)); extern void IUPQH P__((Word p, Word Ab, Word Bb, Word Sb, Word Tb, Word M, Word C, Word *A_, Word *B_)); extern Word IUPQHL P__((Word p, Word F, Word M, Word C)); extern Word IUPQS P__((Word A)); extern Word IUPRB P__((Word A)); extern void IUPRC P__((Word A, Word B, Word *C_, Word *R_)); extern Word IUPRLP P__((Word A)); extern Word IUPRRAFE P__((Word A, Word E, Word k)); extern void IUPSQHL P__((Word p, Word Ab, Word Bb, Word Sb, Word Tb, Word Q, Word C, Word *A_, Word *B_, Word *S_, Word *T_)); extern void IUPSQHLL P__((Word p, Word q, Word A, Word C, Word *Ap_, Word *Bp_, Word *Sp_, Word *Tp_)); extern void IUPSR P__((Word A, Word B, Word *ab_, Word *bb_, Word *C_)); extern Word IUPSWN P__((Word A)); extern Word IUPTPR P__((Word n, Word A, Word B)); extern Word IUPTR1 P__((Word A)); extern Word IUPTR P__((Word A, Word h)); extern Word IUPVAR P__((Word A)); extern Word IUPVART P__((Word A)); extern Word IUPVOI P__((Word A, Word I)); extern Word IUPVSI P__((Word A, Word I)); extern void IUPWRITE P__((Word A, Word v)); extern Word IUSFPF2 P__((Word A)); extern Word IUSFPF P__((Word A)); extern void IUSFPMF P__((Word A, Word *p_, Word *F_, Word *C_, Word *L_)); extern void IWRITE P__((Word A)); extern void KARATSUBA P__((Word *A, Word n1, Word *B, Word n2, Word *C, Word *W)); extern Word LAST P__((Word L)); extern Word LASTCELL P__((Word L)); extern Word LBIBMS P__((Word L)); extern void LBIBS P__((Word L)); extern Word LBIM P__((Word L1, Word L2)); extern Word LBRIBRI P__((Word I)); extern void LBRIDWRITE P__((Word I, Word n)); extern void LBRIHI P__((Word I, interval *J_, BDigit *t_)); extern Word LBRIMID P__((Word I)); extern Word LBRINPROD P__((Word I, Word c)); extern Word LBRINSUM P__((Word I, Word c)); extern Word LBRIREAD P__((void)); extern void LBRISI P__((Word I, BDigit p, Word *J)); extern Word LBRIW P__((Word I)); extern void LBRIWRITE P__((Word I)); extern Word LBRN P__((BDigit k, Word a)); extern Word LBRNCOMP P__((Word A, Word B)); extern Word LBRNDIF P__((Word R, Word S)); extern void LBRNDWRITE P__((Word R, BDigit n)); extern void LBRNF P__((Word B, BDigit p, BDigit d, BDigit *A)); extern BDigit LBRNFEC P__((Word B, BDigit p, BDigit *A)); extern Word LBRNFIE P__((Word I, Word e)); extern void LBRNIEEE P__((Word A, BDigit d, ieee *F_, BDigit *u_)); extern void LBRNIEEEE P__((Word A, BDigit *t_, ieee *F_, BDigit *n_)); extern Word LBRNNEG P__((Word R)); extern Word LBRNP2PROD P__((Word r, Word k)); extern Word LBRNPROD P__((Word r, Word s)); extern Word LBRNREAD P__((void)); extern Word LBRNRN P__((Word A)); extern Word LBRNSIGN P__((Word A)); extern Word LBRNSUM P__((Word R, Word S)); extern void LBRNWRITE P__((Word A)); extern Word LCONC P__((Word L)); extern Word LCOPY P__((Word L)); extern Word LDELETE P__((Word e, Word L)); extern void LDSMKB P__((Word A, Word b, Word *xs_, Word *N_)); extern void LDSSBR P__((Word A, Word b, Word *xs_, Word *N_)); extern Word LEINST P__((Word A, Word i, Word a)); extern Word LELTI P__((Word A, Word i)); extern Word LENGTH P__((Word L)); extern Word LEROT P__((Word L, Word i, Word j)); extern Word LETTER P__((Word C)); extern Word LEXNEX P__((Word A)); extern BDigit LEXNEXT P__((BDigit n, BDigit m, BDigit *A)); extern void LEXNEXTC P__((Word n, Word k, Word *I, Word *t_)); extern Word LFML P__((Word L)); extern Word LFS P__((const char *s)); extern Word LGIE P__((Word L, Word I)); extern void LIBS P__((Word L)); extern void LINS P__((Word a, Word L)); extern Word LINSRT P__((Word a, Word A)); extern Word LIST10 P__((Word a1, Word a2, Word a3, Word a4, Word a5, Word a6, Word a7, Word a8, Word a9, Word a10)); extern Word LIST1 P__((Word a)); extern Word LIST2 P__((Word a, Word b)); extern Word LIST3 P__((Word a1, Word a2, Word a3)); extern Word LIST4 P__((Word a1, Word a2, Word a3, Word a4)); extern Word LIST5 P__((Word a1, Word a2, Word a3, Word a4, Word a5)); extern Word LIST6 P__((Word a1, Word a2, Word a3, Word a4, Word a5, Word a6)); extern Word LKAHEAD P__((void)); extern Word LLCOPY P__((Word L)); extern Word LLGIE P__((Word L, Word I)); extern void LLTGCA P__((Word L, Word *A_, Word *n_)); extern Word LMERGE P__((Word A, Word B)); extern void LPBSD P__((Word L)); extern Word LPERM P__((Word L, Word P)); extern Word LREAD P__((void)); extern void LSHIFT1 P__((Word *A, BDigit n)); extern Word LSICOMP P__((Word I, Word J)); extern Word LSIIT P__((Word I, Word J)); extern Word LSILW P__((Word I)); extern Word LSIM P__((Word a, Word b)); extern Word LSRCH P__((Word a, Word A)); extern void LWRITE P__((Word L)); extern Word MAIPDE P__((Word r, Word M)); extern Word MAIPDM P__((Word r, Word M)); extern Word MAIPDME P__((BDigit r, Word M)); extern Word MAIPHM P__((Word r, Word m, Word A)); extern Word MAIPP P__((Word r, Word A, Word B)); extern void MAPASSIGN P__((Word *A, Word *B)); extern Word *MAPCOPY P__((Word *A)); extern void MAPDIF P__((Word m, Word *A, Word *B, Word *C)); extern Word *MAPFMD P__((Word a, Word n)); extern Word *MAPFMUP P__((Word A)); extern Word *MAPFMUPS P__((Word A, Word k)); extern Word *MAPFV P__((Word n, Word *A)); extern Word *MAPGCD P__((BDigit p, Word *A, Word *B)); extern void MAPHOM P__((Word m, Word *A, Word *B)); extern void MAPIDIF P__((Word m, Word *A, Word *B)); extern void MAPMADD P__((Word m, Word *A, Word b, Word j, Word *C)); extern Word *MAPMON P__((BDigit p, BDigit *A)); extern void MAPMPV P__((Word *A, Word k)); extern void MAPPROD P__((Word m, Word *A, Word *B, Word *C)); extern void MAPQR P__((Word m, Word *A, Word *B, Word *Q)); extern void MAPRS P__((BDigit p, Word *A, Word *B)); extern void MAPSE P__((Word m, Word *A, Word *B, Word *S, Word *T, Word *C, Word *U, Word *V)); extern BDigit MAPSEV P__((BDigit *A, BDigit a)); extern void MAPSUM P__((Word m, Word *A, Word *B, Word *C)); extern void MAPTPR P__((Word m, Word n, Word *A, Word *B, Word *C)); extern void MARK P__((Word L)); extern Word MAX P__((Word a, Word b)); extern Word MCPMV P__((Word n, Word L)); extern Word MDCRA P__((Word m1, Word m2, Word mp1, Word a1, Word a2)); extern Word MDDIF P__((Word m, Word a, Word b)); extern Word MDEXP P__((Word m, Word a, Word n)); extern Word MDHOM P__((Word m, Word A)); extern Word MDINVB P__((Word a)); extern Word MDINV P__((Word m, Word a)); extern Word MDLCRA P__((Word m1, Word m2, Word L1, Word L2)); extern Word MDNEG P__((Word m, Word a)); extern Word MDPROD P__((Word m, Word a, Word b)); extern Word MDQ P__((Word m, Word a, Word b)); extern Word MDRAN P__((Word m)); extern Word MDSUM P__((Word m, Word a, Word b)); extern Word MEMBER P__((Word a, Word L)); extern Word MIAIM P__((Word A)); extern Word MICINS P__((Word A, Word V)); extern Word MICS P__((Word A)); extern Word MIDCRA P__((Word M, Word m, Word mp, Word A, Word a)); extern Word MIDIF P__((Word M, Word A, Word B)); extern Word MIEXP P__((Word M, Word A, Word N)); extern Word MIHOM P__((Word M, Word A)); extern Word MIINV P__((Word M, Word A)); extern Word MIN P__((Word a, Word b)); extern Word MINEG P__((Word M, Word A)); extern Word MINNCT P__((Word A)); extern Word MIPDIF P__((Word r, Word M, Word A, Word B)); extern Word MIPEMV P__((Word r, Word M, Word A, Word a)); extern Word MIPFSM P__((Word r, Word M, Word A)); extern Word MIPHOM P__((Word r, Word M, Word A)); extern Word MIPIPR P__((Word r, Word M, Word D, Word A, Word B)); extern void MIPISE P__((Word r, Word M, Word D, Word A, Word B, Word S, Word T, Word C, Word *U_, Word *V_)); extern Word MIPMIP P__((Word r, Word M, Word a, Word B)); extern Word MIPMON P__((Word r, Word M, Word A)); extern Word MIPNEG P__((Word r, Word M, Word A)); extern Word MIPPR P__((Word r, Word M, Word A, Word B)); extern Word MIPRAN P__((Word r, Word M, Word q, Word N)); extern Word MIPROD P__((Word M, Word A, Word B)); extern Word MIPSUM P__((Word r, Word M, Word A, Word B)); extern Word MIQ P__((Word M, Word A, Word B)); extern Word MIRAN P__((Word M)); extern Word MISUM P__((Word M, Word A, Word B)); extern void MIUPQR P__((Word M, Word A, Word B, Word *Q_, Word *R_)); extern void MIUPSE P__((Word M, Word A, Word B, Word S, Word T, Word C, Word *U_, Word *V_)); extern Word MMAMNSB P__((Word p, Word n, Word **M)); extern Word **MMAPBM P__((Word p, Word *A)); extern void MMAPDEFL P__((Word m, Word *A, Word c)); extern Word MMAPEVAL P__((Word m, Word *A, Word s)); extern Word *MMAPEXP P__((Word m, Word *A, Word n)); extern Word MMAPFS P__((Word p, Word *A, Word B, Word d)); extern Word *MMAPGCD P__((Word p, Word *A, Word *B)); extern void MMAPHEG P__((Word p, Word *A, Word *B, Word *C, Word *V)); extern void MMAPMADD P__((Word m, Word *A, Word b, Word j, Word *C)); extern void MMAPMDP P__((Word m, Word a, Word *A, Word *B)); extern Word *MMAPMON P__((Word m, Word *A)); extern void MMAPPROD P__((Word m, Word *A, Word *B, Word *C)); extern void MMAPQR P__((Word m, Word *A, Word *B, Word *Q)); extern void MMAPRC P__((Word p, Word *A, Word *B, Word *C, Word *r_)); extern void MMAPREM P__((Word m, Word *A, Word *B)); extern void MMAPSE P__((Word m, Word *A, Word *B, Word *S, Word *T, Word *C, Word *U, Word *V)); extern void MMAPTPR P__((Word m, Word n, Word *A, Word *B, Word *C)); extern void MMDAH P__((BDigit p, Word **A, BDigit n)); extern Word MMDAHCP P__((BDigit p, Word **A, BDigit n)); extern Word MMDDET P__((Word p, Word M)); extern Word MMPDDF P__((Word p, Word Ap)); extern Word MMPDMA P__((Word r, Word p, Word M)); extern void MMPEGC P__((Word p, Word A, Word B, Word *C_, Word *U_, Word *V_)); extern Word MMPEV P__((Word r, Word m, Word A, Word k, Word a)); extern Word MMPFBL P__((Word p, Word A, Word d)); extern Word MMPGCD P__((Word p, Word A, Word B)); extern void MMPIQR P__((Word r, Word M, Word D, Word A, Word B, Word *Q_, Word *R_)); extern BDigit MMUPIT P__((BDigit p, Word A)); extern Word MPDIF P__((Word r, Word m, Word A, Word B)); extern Word MPEMV P__((Word r, Word m, Word A, Word a)); extern Word MPEVAL P__((Word r, Word m, Word A, Word i, Word a)); extern Word MPEXP P__((Word r, Word m, Word A, Word n)); extern BDigit *MPFFAP1 P__((BDigit p, BDigit q, BDigit *A, BDigit *B)); extern BDigit *MPFFAP P__((BDigit p, BDigit *F, BDigit *G)); extern Word MPFFDP P__((BDigit p, BDigit n)); extern void MPFFDPGT P__((BDigit p, BDigit n, Word *F_, Word *G_, BDigit *A)); extern BDigit *MPFFEXP P__((BDigit p, BDigit *F, BDigit *A, BDigit e)); extern BDigit *MPFFGEN P__((BDigit p, BDigit *F)); extern BDigit *MPFFPROD P__((BDigit p, BDigit *F, BDigit *A, BDigit *B)); extern void MPGCDC P__((Word r, Word p, Word A, Word B, Word *C_, Word *Ab_, Word *Bb_)); extern Word MPHOM P__((Word r, Word m, Word A)); extern Word MPINT P__((Word p, Word B, Word b, Word bp, Word r, Word A, Word A1)); extern void MPIQH P__((Word r, Word p, Word D, Word Ab, Word Bb, Word Sb, Word Tb, Word M, Word Dp, Word C, Word *A_, Word *B_)); extern Word MPIQHL P__((Word r, Word p, Word F, Word M, Word D, Word C)); extern void MPIQHS P__((Word r, Word M, Word D, Word Ab, Word Bb, Word Sb, Word Tb, Word s, Word n, Word C, Word *A_, Word *B_, Word *S_, Word *T_, Word *Dp_)); extern Word MPMDP P__((Word r, Word m, Word a, Word B)); extern Word MPMON P__((Word r, Word m, Word A)); extern Word MPNEG P__((Word r, Word m, Word A)); extern Word MPPROD P__((Word r, Word m, Word A, Word B)); extern Word MPPSR P__((Word r, Word p, Word A, Word B)); extern Word MPQ P__((Word r, Word p, Word A, Word B)); extern void MPQR P__((Word r, Word p, Word A, Word B, Word *Q_, Word *R_)); extern Word MPRAN P__((Word r, Word m, Word q, Word N)); extern Word MPRES P__((Word r, Word p, Word A, Word B)); extern Word MPRESDB P__((BDigit r, BDigit p, Word A, Word B, Word D)); extern Word MPSPRS P__((Word r, Word p, Word A, Word B)); extern Word MPSUM P__((Word r, Word m, Word A, Word B)); extern Word MPUC P__((Word r, Word p, Word A)); extern void MPUCPP P__((Word r, Word p, Word A, Word *a_, Word *Ab_)); extern Word MPUCS P__((Word r, Word p, Word A, Word c)); extern Word MPUP P__((Word r, Word m, Word c, Word A)); extern Word MPUPP P__((Word r, Word p, Word A)); extern Word MPUQ P__((Word r, Word p, Word A, Word b)); extern void MRFMAP P__((Word *A, Word n, Word **M, Word r)); extern Word MUPDER P__((Word m, Word A)); extern void MUPEGC P__((Word p, Word A, Word B, Word *C_, Word *U_, Word *V_)); extern Word MUPFAC P__((Word p, Word A)); extern Word MUPFMAP P__((Word *A)); extern Word MUPFS P__((Word p, Word A, Word B, Word d)); extern Word MUPGCD P__((BDigit p, Word A, Word B)); extern void MUPHEG P__((Word p, Word A, Word B, Word *C_, Word *V_)); extern Word MUPRAN P__((Word p, Word n)); extern void MUPRC P__((Word p, Word A, Word B, Word *C_, Word *r_)); extern Word MUPRES P__((BDigit p, Word A, Word B)); extern Word MUPSFF P__((Word p, Word A)); extern BDigit NEXTSS P__((BDigit n, BDigit m, BDigit *A)); extern void NORMEFD P__((Word N, Word n, Word p, Word Q, Word B, Word L, Word G, Word C, Word d, Word N1, Word *F_, Word *Nb_, Word *Gb_, Word *Bb_, Word *Ib_, Word *Cb_, Word *Nb1_)); extern Word NORMFAC P__((Word M, Word A, Word N)); extern void NORMFCT P__((Word N, Word n, Word p, Word Q, Word Qp, Word q, Word B, Word L, Word T, Word G, Word C, Word e, Word d, Word k, Word N1, Word *F_, Word *Nb_, Word *Bb_, Word *Lb_, Word *Tb_, Word *Gb_, Word *Cb_, Word *Nb1_)); extern void NORMFCTS P__((Word N, Word p, Word Q, Word Qp, Word q, Word K, Word L, Word T, Word d, Word W0, Word N1, Word *F_, Word *Nb_, Word *Ib_)); extern Word NORMFL P__((Word L)); extern void NORMFT P__((Word N, Word p, Word Q, Word Qp, Word q, Word K, Word T, Word N1, Word *F_, Word *Nb_)); extern Word NORMHLEFD P__((Word N, Word n, Word p, Word F, Word C, Word G)); extern void NORMILHS P__((Word N, Word q, Word Q, Word Ap, Word B, Word S, Word T, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern void NORMLHS P__((Word q, Word Q, Word Qpp, Word Ab, Word Bb, Word Sb, Word Tb, Word Ap, Word Bp, Word Yp, Word Zp, Word U, Word D, Word A, Word B, Word *Qs_, Word *Y_, Word *Z_, Word *Us_, Word *As_, Word *Bs_)); extern void NORMMF P__((Word M, Word A, Word N, Word *p_, Word *F_, Word *C_, Word *L_)); extern Word NORMRL P__((Word F, Word L)); extern void NORMSQHL P__((Word N, Word p, Word q, Word F, Word *A_, Word *B_, Word *S_, Word *T_)); extern Word ODD P__((Word a)); extern Word ORDER P__((Word a)); extern Word OREAD P__((void)); extern void OWRITE P__((Word B)); extern void PADV P__((Word A, Word *e_, Word *a_, Word *Ap_)); extern Word PAIR P__((Word A, Word B)); extern Word PARTN P__((Word n, Word P)); extern Word PARTR P__((Word n)); extern Word PARTSS P__((Word p)); extern Word PBIN P__((Word a1, Word e1, Word a2, Word e2)); extern Word PCL P__((Word A)); extern Word PCOEFF P__((Word A, Word i)); extern Word PCONST P__((Word r, Word A)); extern Word PCPV P__((Word r, Word A, Word i, Word j)); extern Word PDBORD P__((Word A)); extern Word PDE P__((BDigit i, BDigit k, BDigit r, Word A)); extern Word PDEG P__((Word A)); extern Word PDEGSV P__((Word r, Word A, Word i)); extern Word PDEGV P__((Word r, Word A)); extern Word PDLOG2 P__((Word a)); extern Word PDPV P__((Word r, Word A, Word i, Word n)); extern BDigit PDVAR P__((BDigit r, BDigit i, Word A)); extern Word PERMCY P__((Word P)); extern Word PERMR P__((Word n)); extern Word PFBRE P__((Word r, Word a)); extern Word PFDIP P__((Word r, Word A)); extern Word PFDP P__((Word r, Word A)); extern BDigit *PFFAP1 P__((BDigit p, BDigit *A, BDigit *B)); extern BDigit *PFFAP P__((BDigit p, BDigit a)); extern BDigit PFFGEN P__((BDigit p)); extern Word PGCDE P__((BDigit i, BDigit r, Word A)); extern void PHDQR P__((Word a1, Word a0, Word b, Word *q_, Word *r_)); extern Word PHDREM P__((Word a1, Word a0, Word b)); extern Word PICPV P__((Word r, Word A, Word i, Word j)); extern Word PINV P__((Word r, Word A, Word k)); extern Word PLBCF P__((Word r, Word A)); extern Word PLDCF P__((Word A)); extern Word PMDEG P__((Word A)); extern Word PME P__((BDigit i, BDigit k, BDigit r, Word A)); extern Word PMON P__((Word a, Word e)); extern Word PMONSV P__((Word r, Word a, Word i, Word e)); extern Word PMPMV P__((Word A, Word k)); extern Word PMPSV P__((Word A, Word r, Word i, Word k)); extern void PNDQR P__((Word a1, Word a0, Word b, Word *q_, Word *r_)); extern BDigit PNM P__((BDigit r, Word A)); extern Word PORD P__((Word A)); extern Word PPERMV P__((Word r, Word A, Word P)); extern Word PPLT P__((Word e, Word a, Word A)); extern Word PRED P__((Word A)); extern void PRODUCT P__((Word *A, Word n1, Word *B, Word n2, Word *C)); extern Word PRT P__((Word A)); extern Word PSDSV P__((Word r, Word A, Word i, Word n)); extern Word PTBCF P__((Word r, Word A)); extern BDigit PTDEG P__((BDigit r, Word A)); extern Word PTMV P__((Word r, Word A)); extern void PTRADV2 P__((Word L, Word **a_, Word **b_, Word *Lp_)); extern void PTRADV P__((Word L, Word **a_, Word *Lp_)); extern Word PTRCF P__((Word A)); extern Word PTRCOMP P__((Word *p, Word L)); extern Word* PTRFIRST P__((Word L)); extern Word PTRLENGTH P__((Word L)); extern Word PTRLIST1 P__((Word *a)); extern Word PTRRED P__((Word L)); extern Word PTV P__((Word r, Word A, Word i)); extern Word PUFP P__((Word r, Word A)); extern Word PUNT P__((Word r, Word A)); extern void QREM P__((Word a, Word b, Word *q_, Word *r_)); extern Word RED2 P__((Word L)); extern Word RED3 P__((Word L)); extern Word RED4 P__((Word L)); extern Word RED P__((Word L)); extern Word REDI P__((Word A, Word i)); extern Word REM P__((Word a, Word b)); extern void RHI P__((Word a, Word b, interval *I_, BDigit *t_)); extern Word RIB P__((Word r, Word s)); extern void RIDWRITE P__((Word I, Word n)); extern Word RIL P__((Word I)); extern Word RILC P__((Word I, Word k)); extern Word RINEG P__((Word I)); extern Word RINT P__((Word I)); extern Word RIPROD P__((Word I, Word J)); extern Word RIRNP P__((Word I, Word c)); extern Word RISIGN P__((Word I)); extern Word RISUM P__((Word I, Word J)); extern void RIWRITE P__((Word I)); extern Word RMDUP P__((Word L)); extern Word RNABS P__((Word R)); extern void RNBCR P__((Word A, Word B, Word *M_, Word *N_, Word *k_)); extern Word RNCEIL P__((Word r)); extern Word RNCOMP P__((Word R, Word S)); extern void RNDDWRITE P__((Word R, Word n, Word t)); extern Word RNDEN P__((Word R)); extern Word RNDIF P__((Word R, Word S)); extern void RNDWRITE P__((Word R, Word n)); extern void RNFCL2 P__((Word a, Word *m_, Word *n_)); extern Word RNFLOR P__((Word r)); extern Word RNFMR P__((Word M, Word Mp, Word m, Word U)); extern Word RNFMRPP P__((Word M, Word Mp, Word m, Word p, Word U)); extern Word RNINT P__((Word A)); extern Word RNINV P__((Word R)); extern Word RNLBRN P__((Word A)); extern Word RNMAX P__((Word a, Word b)); extern Word RNMIN P__((Word a, Word b)); extern Word RNNEG P__((Word R)); extern Word RNNUM P__((Word R)); extern Word RNP2 P__((Word k)); extern Word RNPROD P__((Word R, Word S)); extern Word RNQ P__((Word R, Word S)); extern Word RNRAND P__((Word n)); extern Word RNREAD P__((void)); extern Word RNRED P__((Word A, Word B)); extern Word RNROUND P__((Word R)); extern Word RNSIGN P__((Word R)); extern Word RNSUM P__((Word R, Word S)); extern void RNWRITE P__((Word R)); extern Word RPAFME P__((Word r, Word M, Word A, Word b)); extern void RPBLGS P__((Word r, Word A, Word *a_, Word *b_, Word *s_)); extern Word RPDIF P__((Word r, Word A, Word B)); extern Word RPDMV P__((Word r, Word A)); extern void RPDWRITE P__((Word r, Word A, Word V)); extern Word RPEMV P__((Word r, Word A, Word b)); extern Word RPEV P__((Word r, Word A, Word i, Word a)); extern void RPEXPREAD P__((Word r, Word V, Word *A_, Word *t_)); extern void RPFACTREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word RPFIP P__((Word r, Word A)); extern Word RPIMV P__((Word r, Word A)); extern Word RPMAIP P__((Word r, Word A)); extern Word RPME P__((Word r, Word A, Word b)); extern Word RPNEG P__((Word r, Word A)); extern void RPPOWREAD P__((Word r, Word V, Word *A_, Word *t_)); extern Word RPPROD P__((Word r, Word A, Word B)); extern void RPQR P__((Word r, Word A, Word B, Word *Q_, Word *R_)); extern Word RPRAN P__((Word r, Word k, Word q, Word N)); extern void RPREAD P__((Word *r_, Word *A_)); extern Word RPRNP P__((Word r, Word a, Word B)); extern Word RPSUM P__((Word r, Word A, Word B)); extern void RPTERMREAD P__((Word r, Word V, Word *A_, Word *t_)); extern void RPWRITE P__((Word r, Word A, Word V)); extern void RSI P__((BDigit p, Word a, Word b, BDigit *I)); extern void RUPFMRC P__((Word M1, Word M1p, Word m1, Word C1, Word L1, Word M2, Word M2p, Word m2, Word C2, Word *L2_, Word *C_)); extern void RUPWRITE P__((Word A, Word v)); extern Word SDIFF P__((Word A, Word B)); extern void SDR P__((Word S, Word *A_, Word *I_)); extern Word SECOND P__((Word L)); extern Word SEQUAL P__((Word A, Word B)); extern Word SFCS P__((Word A)); extern void SFIRST P__((Word L, Word a)); extern Word SIAFEE P__((Word B, Word I, BDigit p)); extern void SICOPY P__((BDigit *A, BDigit *B)); extern void SIDWRITE P__((BDigit *I, BDigit k)); extern Word SIGN P__((Word a)); extern Word SILBRI P__((BDigit *I)); extern Word SINTER P__((Word A, Word B)); extern void SIPBHT P__((BDigit *A, BDigit k)); extern void SIPCOPY P__((BDigit *A, BDigit *B)); extern Word SIPES P__((Word *A, Word *a)); extern void SIPEVAL P__((BDigit *A, BDigit *I, BDigit *J)); extern Word SIPIIRMS P__((Word L, BDigit **C)); extern void SIPIIS P__((BDigit *A1, Word I1, BDigit t1, BDigit *A2, Word I2, BDigit t2, BDigit *J1_, BDigit *J2_, BDigit *s_)); extern Word SIPIR P__((Word *A, Word I, BDigit t, BDigit k)); extern void SIPNT P__((BDigit *A, BDigit *B)); extern Word SIPPRB P__((BDigit *A)); extern void SIPR P__((Word *A, Word *B)); extern void SIPROD P__((BDigit *I, BDigit *J, BDigit *K)); extern Word SIPRRID P__((BDigit *A)); extern Word SIPRRISD P__((BDigit *A, Word a, Word b)); extern BDigit SIPSIZE P__((BDigit *A)); extern void SIPTR1 P__((BDigit *A, BDigit *B)); extern BDigit SIPVCHT P__((BDigit *A)); extern void SIQUOT P__((BDigit *I, BDigit *J, BDigit *K)); extern BDigit SISIGN P__((Word *I)); extern void SISUM P__((BDigit *I, BDigit *J, BDigit *K)); extern Word SLBRNIM P__((Word a, Word b)); extern void SLELTI P__((Word A, Word i, Word a)); extern void SLIWE P__((Word I, Word *k_, Word *c_, Word *d_)); extern BDigit **SMDM P__((Word A, Word B, BDigit k, BDigit r)); extern Word SMFMI P__((Word M, Word A)); extern Word SMFMIP P__((Word r, Word M, Word A)); extern Word SNLBRN P__((Word a, BDigit k)); extern Word SPOWER P__((Word s, Word a)); extern void SRED P__((Word L, Word Lp)); extern void STATSACLIB P__((void)); extern void SUBFROM P__((Word *A, Word *B, Word n)); extern Word SUFFIX P__((Word L, Word b)); extern Word SUNION P__((Word A, Word B)); extern void SWRITE P__((const char *s)); extern Word TANGENTNUM P__((BDigit n)); extern Word THIRD P__((Word L)); extern Word TLIL P__((BDigit a, Word L)); extern Word TSVSLI P__((Word A, Word I)); extern Word USDIFF P__((Word A, Word B)); extern Word USINT P__((Word A, Word B)); extern Word USUN P__((Word A, Word B)); extern Word VAR P__((Word L)); extern Word VCOMP P__((Word U, Word V)); extern Word VIAZ P__((Word A, Word n)); extern Word VIDIF P__((Word A, Word B)); extern Word VIERED P__((Word U, Word V, Word i)); extern Word VILCOM P__((Word a, Word b, Word A, Word B)); extern Word VINEG P__((Word A)); extern Word VISPR P__((Word a, Word A)); extern Word VISUM P__((Word A, Word B)); extern void VIUT P__((Word U, Word V, Word i, Word *Up_, Word *Vp_)); extern Word VLREAD P__((void)); extern Word VLSRCH P__((Word v, Word V)); extern void VLWRITE P__((Word V)); extern Word VMAX P__((Word U, Word V)); extern Word VMIN P__((Word U, Word V)); extern Word VMPIP P__((Word r, Word m, Word A, Word B)); extern Word VREAD P__((void)); extern void VWRITE P__((Word v)); saclib2.2.8/sysdep/include/sacmacros.h0000664002275300236100000001017314017255270017030 0ustar wcbrownscs/*=========================================================================== sacmacros.h Header file for SACLIB macro definitions ===========================================================================*/ #ifndef SACMACROS_H #define SACMACROS_H #include "sacsys.h" #include "sactypes.h" /*--------------------------------------------------------------------------- The canonical saclib version number. ---------------------------------------------------------------------------*/ #define SACMAJVERS 2 #define SACMINVERS 2 #define SACREVVERS 7 /*--------------------------------------------------------------------------- Macros that are always defined. ---------------------------------------------------------------------------*/ #ifdef NO_SACLIB_MACROS #define FIRST(L) SPACEB1[(L)] #define GCAGET(A,i) (GCASPACEBp[(A)].array[(i)]) #define GCASET(A,i,a) (GCASPACEBp[(A)].array[(i)] = (a)) #define ISNIL(a) ((a) == NIL) #define ISZERO(a) ((a) == 0) #define RED(L) SPACEB[(L)] #define SFIRST(L,a) (SPACEB1[(L)] = (a)) #define SRED(L,Lp) (SPACEB[(L)] = (Lp)) #endif #define ILENGTH(A) (((A) < BETA) ? 1 : LENGTH(A)) #define ILOG2A(A,n) (((n)==0) ? 0 : ((n)-1)*ZETA + DLOG2((A)[(n)-1])) #define ISIGNA(A,n) ((n) == 0 ? 0 : (((A)[(n)-1] > 0) ? 1 : -1)) #define absm(a) (((a) >= 0) ? (a) : -(a)) #define maxm(a,b) (((a) > (b)) ? (a) : (b)) #define minm(a,b) (((a) < (b)) ? (a) : (b)) #define signm(a) ((a) > 0 ? 1 : ((a) < 0 ? -1 : 0)) /*--------------------------------------------------------------------------- Arrays. ---------------------------------------------------------------------------*/ #define FREEARRAY(A) free((A)) /*--------------------------------------------------------------------------- Array polynomials. ---------------------------------------------------------------------------*/ /* MAP coefficient */ #define MAPCF(A,e) (A[e]) /* MAP degree */ #define MAPDEG(A) (A[-1]) /* MAP free memory */ #define MAPFREE(A) FREEARRAY((A)-1) /* MAP get memory */ #define MAPGET(n) (GETARRAY((n)+2) + 1) /* MAP leading coefficient */ #define MAPLDCF(A) (MAPCF(A,MAPDEG(A))) /* MAP zero test */ #define MAPZERO(A) (MAPDEG(A) == 0 && MAPCF(A,0) == 0) /*--------------------------------------------------------------------------- Finite ring array polynomials. ---------------------------------------------------------------------------*/ /* FRAP degree */ #define FRAPDEG(A) (A[-1][0]) /* FRAP size---the size of the array */ #define FRAPSIZE(A) (A[-1][1]) /* FRAP coefficient */ #define FRAPCF(A,i) (A[i]) /* FRAP leading coefficient */ #define FRAPLDCF(A) (FRAPCF(A,FRAPDEG(A))) /* FRAP zero test */ #define FRAPZERO(A) (FRAPDEG(A) == 0 && MAPZERO(FRAPLDCF(A))) /*--------------------------------------------------------------------------- Matrices. ---------------------------------------------------------------------------*/ /* matrix element */ #define MATELT(M,i,j) (M[i][j]) #ifndef NO_SACLIB_MACROS /*--------------------------------------------------------------------------- List processing. ---------------------------------------------------------------------------*/ #define RED2(L) RED(RED(L)) #define SECOND(L) FIRST(RED(L)) /* Arithmetic */ #define ODD(a) ((a) & 1) #define EVEN(a) (!ODD(a)) #define DAND(a,b) ((a) & (b)) #define DOR(a,b) ((a) | (b)) #define DNOT(a) (~(a)) #define DNIMP(a,b) ((a) & ~(b)) #define MDSUM(m,a,b) (((a)+(b))%(m)) /*** * * The following macros give troubles w.r.t. side effects and therefore * are commented out for the time being. * ***/ /* #define ISATOM(a) (-BETA < (a) && (a) < BETA) #define ISLIST(a) ((BETA < (a) && (a) < BETAp && ((a) & 1)) || (a) == BETA) #define ISOBJECT(a) (ISATOM(a) || ISLIST(a)) #define ISGCA(a) (BETAp < (a) && (a) < BETApp) #define ADV(L,a,Lp) do {*(a)=FIRST(L); *(Lp)=RED(L);} while (0) #define QREM(a,b,q,r) do {*(q)=(a)/(b); *(r)=(a)%(b);} while (0) #define MDDIF(m,a,b) (((a)-(b)+(m))%(m)) #define MDNEG(m,a) ((a)==0?0:(m)-(a)) */ #endif /* NO_SACLIB_MACROS */ #endif /* SACMACROS_H */ saclib2.2.8/sysdep/CHANGELOG0000664002275300236100000001044714017255270014477 0ustar wcbrownscs------------------------------------------------------------ 2.2.7 - 2021-03-01 Changed * Version number bumped to 2.2.7. * Switched to git repo from bzr. * Now Saclib allows underscores in variable names (but not as the first character). ------------------------------------------------------------ revno: 15 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Tue 2018-01-30 11:40:42 -0500 message: Increased saclib version number to 2.2.7. ------------------------------------------------------------ revno: 14 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Tue 2018-01-30 11:32:00 -0500 message: added documentation pdf's ------------------------------------------------------------ revno: 13 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Thu 2018-01-25 16:13:14 -0500 message: Added check in ARGSACLIB for +N values that are out of the range [20000,1073741822]. Anything bigger than that is too big for Saclib to handle because Word is limited to 32-bits. ------------------------------------------------------------ revno: 12 committer: Chris Brown branch nick: saclib2.2.6 timestamp: Wed 2017-03-15 13:27:00 -0400 message: Lots of misc cleanups ------------------------------------------------------------ revno: 11 committer: Christopher W Brown branch nick: saclib2.2.6 timestamp: Sun 2014-02-09 19:23:09 -0500 message: Changed version number to Saclib 2.2.6. ------------------------------------------------------------ revno: 10 committer: Christopher W Brown branch nick: saclib2.2.5 timestamp: Sun 2014-02-09 11:36:02 -0500 message: Made a large number of changes to improve portability, fix a few bugs, and silence some compiler error messages. These came from Jerry James from RedHat, who was very kind to point out so many fixes. Also, added under version control the Mac OS X 64 sysdep files, which have been distributed for a while, but somehow missing from version control. ------------------------------------------------------------ revno: 9 committer: Christopher Brown branch nick: saclib2.2.4 timestamp: Thu 2010-04-22 11:03:35 -0400 message: Removed spurrious include of ucontext.h, which 64-bit macs don't like. ------------------------------------------------------------ revno: 8 committer: Christopher Brown branch nick: saclib timestamp: Wed 2010-04-21 13:31:57 -0400 message: Officially upped the version number of 2.2.4. ------------------------------------------------------------ revno: 7 committer: Christopher Brown branch nick: saclib timestamp: Wed 2010-04-21 13:26:53 -0400 message: Changed over all scripts to bash, and added mac OS X port. ------------------------------------------------------------ revno: 6 committer: Christopher Brown branch nick: saclib timestamp: Thu 2010-04-15 14:21:26 -0400 message: Fixed minor portability bug in FAIL.c ------------------------------------------------------------ revno: 5 committer: Christopher Brown branch nick: saclib timestamp: Thu 2010-04-15 13:15:01 -0400 message: Fixed a few bugs in the 32-bit version of the 64/32 code. ------------------------------------------------------------ revno: 4 committer: Christopher Brown branch nick: saclib timestamp: Thu 2010-04-15 12:46:34 -0400 message: This commit (saclib 2.2.3) finally includes a port to 64-bit linux. The primary issue addressed in the port is the few places in which pointer values are stored in saclib list nodes. This is now done sanely and portably. ------------------------------------------------------------ revno: 3 committer: Christopher Brown branch nick: saclib timestamp: Thu 2009-07-16 09:24:53 -0400 message: Minor changes to README. ------------------------------------------------------------ revno: 2 [merge] committer: Christopher Brown branch nick: saclib timestamp: Thu 2009-07-16 09:15:45 -0400 message: Merged changes. ------------------------------------------------------------ revno: 1 committer: Christopher Brown branch nick: saclib timestamp: Wed 2009-07-15 16:41:43 -0400 message: Initial commit. ------------------------------------------------------------ saclib2.2.8/sysdep/doc/0000775002275300236100000000000014017255270014024 5ustar wcbrownscssaclib2.2.8/sysdep/doc/maint_guide/0000775002275300236100000000000014017255270016311 5ustar wcbrownscssaclib2.2.8/sysdep/doc/maint_guide/maintain.aux0000664002275300236100000000101114017255270020621 0ustar wcbrownscs\relax \@writefile{toc}{\contentsline {section}{\numberline {1}Adding new functions}{1}} \@writefile{toc}{\contentsline {section}{\numberline {2}Modifying functions}{2}} \@writefile{toc}{\contentsline {section}{\numberline {3}Deleting functions}{2}} \@writefile{toc}{\contentsline {section}{\numberline {4}Revision control}{3}} \newlabel{section:rcs}{{4}{3}} \@writefile{toc}{\contentsline {section}{\numberline {5}Deleting revisions}{4}} \@writefile{toc}{\contentsline {section}{\numberline {6}Listing the changes}{5}} saclib2.2.8/sysdep/doc/maint_guide/maintain.dvi0000664002275300236100000003362014017255270020621 0ustar wcbrownscs; TeX output 2000.03.08:1308Fr(3)creates$saclib/include/sacproto.h,whichcontainsaprototypGeofeachfunctionUUinSA9CLIB."Stepb*(4)createsnewmakefilesinthedirectories$saclib/lib/objdand$saclib/-lib/objo."Stepv(5)makestheoptimizedlibrary$saclib/lib/saclibo.aandthedebuggingli-braryH$saclib/lib/saclibd.a.Alternatively*,mklib?opt(mklibdeb)makesonlytheoptimized0(debugging)library*.Undernormalcircumstances,youshouldtypGemklib?alltoUUmakebGothlibraries."StepUU(6)makestheinterfaceprogamisac."StepUU(7)createsthe le$saclib/doc/desc.doc,whichisusedbythescriptsdesc."EachUUofSteps(3){(7)maytakeaminuteortwoto nish. G-:q% cmsy6y)DepartmenÎtofComputerScience,UniversityofthePhilippines,QuezonCity1101,Philippines. K cmsy8hXCscmtt8Xmje@engg.upd.edu.phi*2M.XJ.EncarnacionffF2.MoQdifyingTfunctions2"BeforemoGdifyingaSA9CLIB le,youshould rstcheck-inthe lesothatthemoGdi ca- tionUUcanbGe\undone".SeeSection4fordetailsandanexample.!a󍍒3.`DeletingTfunctions"T*oUUdeletea le,sayOLDF.c,fromSA9CLIB,dothefollowing.*8(1)0IfUUOLDF.cdoGesnothaveUUanRCS le,thencheckitin.(SeeSection4.) 썍8(2)0EditXOLDF.csothat`[?removedfromlibrary]'Xisthe rstlineofthe leOLDF.c.8(3)0Check-inUUthemoGdi edOLDF.cwith !", cmsy10h!': cmti10state[isettodel.8(4)0rm?$saclib/src/OLDF.c8(5)0cd?$saclib/lib8(6)0ar?dsaclibd.aOLDF.o8(7)0ar?tssaclibd.a8(8)0ar?dsaclibo.aOLDF.o8(9)0ar?tssaclibo.a8(10)0rm?objo/OLDF.oobjd/OLDF.o8(11)0mkproto8(12)0mkmake8(13)0mkdesc8(14)0mkisac("NoteUUthatthelibrariesdonothaveUUtobGerecompiled,butisacshouldberemade. 2"Steps(6)and(8)deletethespGeci edob8ject lefromthespeci edlibrary*,andSteps(7)andUU(9)upGdatethesymboltableofthespeci edlibrary*."Ifyouaredeletingmorethanone le,thenSteps(6){(9)maybGeperformedonlyoncepbylistingallthe lestobGedeleted.F*orexample,ifyouaredeletingOLDF1.candOLDF2.c,UUthenyoumaydoinstead:*8(6)0ar?dsaclibd.aOLDF1.oOLDF2.o 썍8(7)0ar?tssaclibd.a8(8)0ar?dsaclibo.aOLDF1.oOLDF2.o8(9)0ar?tssaclibo.a("AsanalternativetoSteps(11),(12),andQ(13),youcanmanuallyremovethecorre-spGondingUUlinesinthe les*0$saclib/include/sacproto.h,0$saclib/lib/objd/makefile,0$saclib/lib/objo/makefile,UUand0$saclib/doc/desc.doc.(ThisQBalternativewillbGesomewhatquicker,butwillrequiremoreworkonyourpartandisUUpronetoerror. SAÎCLIBXMaintainer'sGuide3ffF4._RevisionTcon9trolݍ"I've1usedtheRevisionControlSystem(RCS)1forkeepingtrackofthechangesthatȍhaveUUbGeenmadetoSA9CLIB.^y ݍ"Thesscriptsciallowsyouto\check-in"arevision.Beforemakinganychangestoa  le,>~AtUUtheprompt>>,IwillnowtypGethedescriptionofIPFAC.c:>>?Integralpolynomialfactorization.>>?.~ThepGeriod`.'terminatestheinput. &(IfthebackspacekeydoGesnotworkwhiletheprompt(>>isactive,thenuseCTRL-hinstead.)QTheRCS( le$saclib/RCS/IPFAC.c,vwillKnowhavebGeencreated.AllfuturechangesthataremadetoIPFAC.candthatarerecordedUUusingsciwillbGestoredinthatRCS le. ݍ"AftermmakingmychangestoIPFAC.c,Imshouldnowcheck-inthechanges.T*odoso,ItypGeUUsci?IPFAC.calgoMark.Iwillthengetamessagelike:/usr/local/saclib/saclib2.1/RCS/IPFAC.c,v <--IPFAC.cnew?revision:1.2;previousrevision:1.1enter?logmessage,terminatedwithsingle'.'orendoffile:>>~Atuthe>>prompt,I$typGeinashortdescriptionofthechangesthatweremade.F*orexample,UUImighttypGe:>>?Introducedheuristicthatsearchesforavariableof>>?degree1or2sothatthepolynomialcanbefactored>>?byformula.~"IfTISmakefurtherchangestoIPFAC.c,forexample,ifIS xabuginIPFAC.c,thenI would2typGesci?IPFAC.cbugMark.NotethatI shouldnottypGesciIPFAC.cinitsaclibUUbGeforehand;thatcommandshouldonlybeissuedonceforeach le. ݍ"TheoIPFAC.cwillproGducethe leoIPFAC.c,whichwillcontaintheoriginalrevisionofIPFAC.c.Ingeneral,anyparticularrevisionofa lecanbGeretrievedinthiswaybygivingtheappropriaterevision3numbGer(inplaceof`1.1'intheexampleabove)asgivenintheoutputofslog.5.iyDeletingTrevisions9"In8somecases,youmaywanttodeletearevisionfromanRCS le.Atypicalexampleisthe+following.SuppGoseI+zhaveanewversionofIPFAC.cthatI+zwanttoputintoSA9CLIB.While7developingthenewversionofIPFAC.c,I7usedaheader lethatIwrote,andthisheader9 leis#includedbythenewIPFAC.c.NowIcheck-inthenewIPFAC.c,butIneglect7tochangethe#includestatement.TheerroneousnewIPFAC.cisnowrecordedin5]theRCS5U le$saclib/RCS/IPFAC.c,vasrevision?1.3,say*.WhatshouldI5Udo?Oneoption6wouldbGetosimply xIPFAC.candcheck-inthisnewrevisionasrevision?1.4.ThisRsolutionisnotsatisfactorybGecausethesillymistakeofnotchangingthe#includestatementUUwillbGerecorded."T*oUUdeletetheerroneousrevision,dothefollowing.r8(1)0cd?$saclib/RCSSAÎCLIBXMaintainer'sGuide5ffF8(2)0chmod?600IPFAC.c,v 8(3)0rcs?-u1.3IPFAC.c,v8(4)0rcs?-o1.3IPFAC.c,v8(5)0rcs?-l1.2IPFAC.c,v8(6)0chmod?444IPFAC.c,v"StepUU(2)changesthe lepGermissionssothatyoucanwritetotheRCS le."StepUU(3)unloGcksrevision1.3sothatyoucandeleteit."StepUU(4)outdates(deletes)revision1.3fromtheRCS le."Step8(5)loGcksrevision1.2.Y*ouwillnotbeabletocheck-in8laterrevisionsunlessthelastUUrevisionisloGckedUUbyyou."StepC(6)makesthe leonlyreadable,andnotwritable.ICdecidedtosetthesepGermis-sionsUUtoavoidUUinadvertentlychangingtheRCS les.+H6. ListingTthec9hanges"T*olistthechangesthathavebGeenmadetothecurrentversionofSA9CLIB,Iwrotethescriptslist,thattakesoneargumentchosenfromalgo,bug,del,new.F*orinstance,slist?newUUwilllistthenamesofallnew les."Finally*,c~whenanewversionnumbGerisgiventoSA9CLIB,don'tforgettomoGdify$saclib/src/external.c,UUwheretheversionnumbGerisde ned.AppQendix:Tquic9kreferencemkdescoCreatesUUthe le$saclib/doc/desc.doc.mklib?hlibi 3ڲRecompilesUUthelibraries$saclib/lib/saclib[do].a.WU]hlibiUUisoneofall,deb,opt.mkmakeoCreatesUUthe les$saclib/lib/obj[do]/makefile.mkprotorCreatesUUthe le$saclib/include/sacproto.h.sciUUh lename[ihstateihauthoriWU]ChecksUUinarevisionofh lename[imoGdi edbyhauthori.WU]hstate[iUUisoneofalgo,bug,embe,init,new,typo,spec.slistUUhtyp}'e[iListschanges.htype[iisoneofalgo,bug,del,new.slogUUh lename[i[hveri]WU]DisplaysUUrevisionhistoryofh lename[i.IftheoptionalargumenthveriWU]isUUgiven,displaysversionhveriofh lename[i.,; XCscmtt8 \> --- RCS log files\\ %% \verb|bin| \> \> --- shell scripts\\ %% \verb|doc| \> \> --- documentation\\ %% \> \verb|guide| \> --- \LaTeX\ sources\\ %% \verb|example| \> \> --- example programs\\ %% \verb|include| \> \> --- header files\\ %% \verb|isac| \> \> --- interface programs sources, header files, and executables\\ %% \verb|lib| \> \> --- the compiled libraries\\ %% \> \verb|objd| \> --- the debugging object files\\ %% \> \verb|objo| \> --- the optimized object files\\ %% \verb|pardep| \> \> --- parameter dependent sources\\ %% \> \verb|W_32_Z_29| \> --- sources that require 32-bit words, %% with $\verb|ZETA|=29$\\ %% \verb|src| \> \> --- the source files\\ %% \verb|sysdep| \> \> --- system dependent files\\ %% \verb|times| \> \> --- timings for various functions %% \end{tabbing} \section{Adding new functions} To add a new function, say {\tt NEWF.c}, to \SACLIB/, do the following. \begin{enumerate} \item[(1)] Put {\tt NEWF.c} in the directory {\tt \$saclib/src}. \item[(2)] Check-in {\tt NEWF.c} using the script {\tt sci}. \ (See Section~\ref{section:rcs}.) \item[(3)] {\tt mkproto} \item[(4)] {\tt mkmake} \item[(5)] {\tt mklib all} \item[(6)] {\tt mkisac} \item[(7)] {\tt mkdesc} \end{enumerate} I assume here that the environment variable {\tt saclib} has been properly set to the main directory of \SACLIB/, so that \verb|$saclib| is a shorthand for that directory. If you are adding more than one function, then do steps (1)~and~(2), in that order, for each new function. Steps (3)--(7) only need to be done after adding all the new functions. Steps (3), (4), (5), and~(6) should be done in that order. Step~(3) creates {\tt \$saclib/include/sacproto.h}, which contains a prototype of each function in \SACLIB/. Step~(4) creates new {\tt makefile}s in the directories {\tt \$saclib/lib/objd} and {\tt \$saclib/\-lib/objo}. Step~(5) {\tt make}s the optimized library {\tt \$saclib/lib/saclibo.a} and the debugging library {\tt \$saclib/lib/saclibd.a}. Alternatively, {\tt mklib opt} ({\tt mklib deb}) {\tt make}s only the optimized (debugging) library. Under normal circumstances, you should type {\tt mklib all} to {\tt make} both libraries. Step~(6) {\tt make}s the interface progam {\tt isac}. Step~(7) creates the file {\tt \$saclib/doc/desc.doc}, which is used by the script {\tt sdesc}. Each of Steps (3)--(7) may take a minute or two to finish. \section{Modifying functions} Before modifying a \SACLIB/ file, you should first check-in the file so that the modification can be ``undone''. See Section~\ref{section:rcs} for details and an example. \section{Deleting functions} To delete a file, say {\tt OLDF.c}, from \SACLIB/, do the following. \begin{itemize} \item[(1)] If {\tt OLDF.c} does not have an RCS file, then check it in. \ (See Section~\ref{section:rcs}.) \item[(2)] Edit {\tt OLDF.c} so that `{\tt [ removed from library ]}' is the first line of the file {\tt OLDF.c}. \item[(3)] Check-in the modified {\tt OLDF.c} with \argu{state} set to {\tt del}. \item[(4)] {\tt rm \$saclib/src/OLDF.c} \item[(5)] {\tt cd \$saclib/lib} \item[(6)] {\tt ar d saclibd.a OLDF.o} \item[(7)] {\tt ar ts saclibd.a} \item[(8)] {\tt ar d saclibo.a OLDF.o} \item[(9)] {\tt ar ts saclibo.a} \item[(10)] {\tt rm objo/OLDF.o objd/OLDF.o} \item[(11)] {\tt mkproto} \item[(12)] {\tt mkmake} \item[(13)] {\tt mkdesc} \item[(14)] {\tt mkisac} \end{itemize} Note that the libraries do not have to be recompiled, but {\tt isac} should be remade. Steps~(6) and~(8) delete the specified object file from the specified library, and Steps~(7) and~(9) update the symbol table of the specified library. If you are deleting more than one file, then Steps~(6)--(9) may be performed only once by listing all the files to be deleted. For example, if you are deleting {\tt OLDF1.c} and {\tt OLDF2.c}, then you may do instead: \begin{itemize} \item[(6)] {\tt ar d saclibd.a OLDF1.o OLDF2.o} \item[(7)] {\tt ar ts saclibd.a} \item[(8)] {\tt ar d saclibo.a OLDF1.o OLDF2.o} \item[(9)] {\tt ar ts saclibo.a} \end{itemize} As an alternative to Steps~(11), (12), and ~(13), you can manually remove the corresponding lines in the files \begin{itemize} \item[] \verb|$saclib/include/sacproto.h|, \item[] \verb|$saclib/lib/objd/makefile|, \item[] \verb|$saclib/lib/objo/makefile|, and \item[] \verb|$saclib/doc/desc.doc|. \end{itemize} This alternative will be somewhat quicker, but will require more work on your part and is prone to error. \section{Revision control} \label{section:rcs} I've used the Revision Control System (RCS) for keeping track of the changes that have been made to \SACLIB/.\footnote{The RCS system is available at {\tt ftp.cs.purdue.edu} in the directory {\tt pub/RCS}.} The script {\tt sci} allows you to ``check-in'' a revision. Before making any changes to a file, that file should first be checked in so that the original revision of the file can be retrieved. For example, suppose I want to make changes to the algorithm of {\tt IPFAC.c}. Before making the changes, I would {\tt cd} to {\tt \$saclib/src} and type {\tt sci IPFAC.c init saclib}. I will then get a message on the screen that looks like: \begin{verbatim} /usr/local/saclib/saclib2.1/RCS/IPFAC.c,v <-- IPFAC.c enter description, terminated with single '.' or end of file: NOTE: This is NOT the log message! >> \end{verbatim} At the prompt {\tt >>}, I will now type the description of {\tt IPFAC.c}: \begin{verbatim} >> Integral polynomial factorization. >> . \end{verbatim} The period `{\tt .}' terminates the input. \ (If the backspace key does not work while the prompt {\tt >>} is active, then use CTRL-h instead.) \ The RCS file {\tt \$saclib/RCS/IPFAC.c,v} will now have been created. All future changes that are made to {\tt IPFAC.c} and that are recorded using {\tt sci} will be stored in that RCS file. After making my changes to {\tt IPFAC.c}, I should now check-in the changes. To do so, I type {\tt sci IPFAC.c algo Mark}. I will then get a message like: \begin{verbatim} /usr/local/saclib/saclib2.1/RCS/IPFAC.c,v <-- IPFAC.c new revision: 1.2; previous revision: 1.1 enter log message, terminated with single '.' or end of file: >> \end{verbatim} At the {\tt >>} prompt, I type in a short description of the changes that were made. For example, I might type: \begin{verbatim} >> Introduced heuristic that searches for a variable of >> degree 1 or 2 so that the polynomial can be factored >> by formula. \end{verbatim} If I make further changes to {\tt IPFAC.c}, for example, if I fix a bug in {\tt IPFAC.c}, then I would type {\tt sci IPFAC.c bug Mark}. Note that I should not type {\tt sci IPFAC.c init saclib} beforehand; that command should only be issued once for each file. The general form of the {\tt sci} command is: {\tt sci} \argu{filename} \argu{state} \argu{author}. The argument \argu{filename} should include the extension (`{\tt .c}', for instance). The argument \argu{state} should be one of the following: \begin{tabbing} XX \= {\tt algooo} \= \kill \> {\tt algo} \> algorithm change\\ \> {\tt bug} \> bug fix\\ \> {\tt del} \> deleted from library\\ \> {\tt embe} \> embellishment\\ \> {\tt init} \> initial revision\\ \> {\tt new} \> new file\\ \> {\tt typo} \> typographical correction\\ \> {\tt spec} \> specification correction \end{tabbing} The argument \argu{author} should be the name of the person who made the change. The \SACLIB/ maintainer will be the only person checking in revisions, but \argu{author} should be the name of the person proposing the change (so you know whom to blame!). The revision history of a file can be viewed using the script {\tt slog}. For example, {\tt slog IPFAC.c} will produce something like: {\small \begin{verbatim} ============================================================================= IPFAC.c Integral polynomial factorization. ---------------------------- revision 1.2 locked by: saclib; date: 1995/08/11 09:40:49; author: Mark; state: algo; lines: +48 -17 Introduced heuristic that searches for a variable of degree 1 or 2 so that the polynomial can be factored by formula. ---------------------------- revision 1.1 date: 1995/08/11 09:35:37; author: saclib; state: init; Initial revision ============================================================================= \end{verbatim} } The original revision of {\tt IPFAC.c} can be retrieved by typing {\tt slog IPFAC.c 1.1}; this will cause the original revision of {\tt IPFAC.c} to printed on the screen. You can save the original revision of {\tt IPFAC.c} to a file by redirection: {\tt slog IPFAC.c 1.1 > oIPFAC.c} will produce the file {\tt oIPFAC.c}, which will contain the original revision of {\tt IPFAC.c}. In general, any particular revision of a file can be retrieved in this way by giving the appropriate revision number (in place of `{\tt 1.1}' in the example above) as given in the output of {\tt slog}. \section{Deleting revisions} In some cases, you may want to delete a revision from an RCS file. A typical example is the following. Suppose I have a new version of {\tt IPFAC.c} that I want to put into \SACLIB/. While developing the new version of {\tt IPFAC.c}, I used a header file that I wrote, and this header file is {\tt \#include}d by the new {\tt IPFAC.c}. Now I check-in the new {\tt IPFAC.c}, but I neglect to change the {\tt \#include} statement. The erroneous new {\tt IPFAC.c} is now recorded in the RCS file {\tt \$saclib/RCS/IPFAC.c,v} as {\tt revision 1.3}, say. What should I do? One option would be to simply fix {\tt IPFAC.c} and check-in this new revision as {\tt revision 1.4}. This solution is not satisfactory because the silly mistake of not changing the {\tt \#include} statement will be recorded. To delete the erroneous revision, do the following. \begin{itemize} \item[(1)] {\tt cd \$saclib/RCS} \item[(2)] {\tt chmod 600 IPFAC.c,v} \item[(3)] {\tt rcs -u1.3 IPFAC.c,v} \item[(4)] {\tt rcs -o1.3 IPFAC.c,v} \item[(5)] {\tt rcs -l1.2 IPFAC.c,v} \item[(6)] {\tt chmod 444 IPFAC.c,v} \end{itemize} Step~(2) changes the file permissions so that you can write to the RCS file. Step~(3) unlocks revision 1.3 so that you can delete it. Step~(4) outdates (deletes) revision 1.3 from the RCS file. Step~(5) locks revision 1.2. You will not be able to check-in later revisions unless the last revision is locked by you. Step~(6) makes the file only readable, and not writable. I decided to set these permissions to avoid inadvertently changing the RCS files. \section{Listing the changes} To list the changes that have been made to the current version of \SACLIB/, I wrote the script {\tt slist}, that takes one argument chosen from {\tt algo}, {\tt bug}, {\tt del}, {\tt new}. For instance, {\tt slist new} will list the names of all new files. Finally, when a new version number is given to \SACLIB/, don't forget to modify \verb|$saclib/src/external.c|, where the version number is defined. \section*{Appendix: quick reference} \medskip \begin{tabbing} XXXXXXXX \= \kill {\tt mkdesc} \> Creates the file \verb|$saclib/doc/desc.doc|. \\[1em] {\tt mklib \argu{lib}} \> Recompiles the libraries \verb|$saclib/lib/saclib[do].a|. \\ \> \argu{lib} is one of {\tt all}, {\tt deb}, {\tt opt}. \\[1em] {\tt mkmake} \> Creates the files \verb|$saclib/lib/obj[do]/makefile|. \\[1em] {\tt mkproto} \> Creates the file \verb|$saclib/include/sacproto.h|.\\[1em] {\tt sci} \argu{filename} \argu{state} \argu{author}\\ \> Checks in a revision of \argu{filename} modified by \argu{author}.\\ \> \argu{state} is one of {\tt algo}, {\tt bug}, {\tt embe}, {\tt init}, {\tt new}, {\tt typo}, {\tt spec}. \\[1em] {\tt slist} \argu{type} \> Lists changes. \argu{type} is one of {\tt algo}, {\tt bug}, {\tt del}, {\tt new}. \\[1em] {\tt slog} \argu{filename} [\argu{ver}]\\ \> Displays revision history of \argu{filename}. If the optional argument \argu{ver}\\ \> is given, displays version \argu{ver} of \argu{filename}. \end{tabbing} \end{document} saclib2.2.8/sysdep/doc/maint_guide/maintain.log0000664002275300236100000001003114017255270020607 0ustar wcbrownscsThis is TeX, Version 3.14159 (C version 6.1) (format=latex 96.10.29) 8 MAR 2000 13:08 **maintain (maintain.tex LaTeX2e <1996/06/01> Hyphenation patterns for english, german, loaded. (/usr/local/latex/texmf/tex/latex/base/latex209.def File: latex209.def 1996/05/21 v0.51 Standard LaTeX file Entering LaTeX 2.09 compatibility mode. \footheight=\dimen102 \@maxsep=\dimen103 \@dblmaxsep=\dimen104 \@cla=\count79 \@clb=\count80 \mscount=\count81 (/usr/local/latex/texmf/tex/latex/base/tracefnt.sty Package: tracefnt 1996/05/08 v3.0h Standard LaTeX package (font tracing) \tracingfonts=\count82 LaTeX Info: Redefining \selectfont on input line 139. ) \symbold=\mathgroup4 \symsans=\mathgroup5 \symtypewriter=\mathgroup6 \symitalic=\mathgroup7 \symsmallcaps=\mathgroup8 \symslanted=\mathgroup9 LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 307. LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 308. LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 309. LaTeX Font Info: Redeclaring math alphabet \mathit on input line 315. LaTeX Info: Redefining \em on input line 325. (/usr/local/latex/texmf/tex/latex/base/latexsym.sty Package: latexsym 1995/11/28 v2.2c Standard LaTeX package (lasy symbols) \symlasy=\mathgroup10 LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' (Font) U/lasy/m/n --> U/lasy/b/n on input line 86. ) LaTeX Font Info: Redeclaring math delimiter \lgroup on input line 389. LaTeX Font Info: Redeclaring math delimiter \rgroup on input line 391. LaTeX Font Info: Redeclaring math delimiter \bracevert on input line 393. (/usr/local/latex/texmf/tex/latex/config/latex209.cfg (/usr/local/latex/texmf/tex/latex/tools/rawfonts.sty Compatibility mode: package `' requested, but `rawfonts' provided. Package: rawfonts 1994/05/08 Low-level LaTeX 2.09 font compatibility (/usr/local/latex/texmf/tex/latex/tools/somedefs.sty Package: somedefs 1994/06/01 Toolkit for optional definitions ) LaTeX Font Info: Try loading font information for U+lasy on input line 36. (/usr/local/latex/texmf/tex/latex/base/Ulasy.fd File: Ulasy.fd 1995/11/28 v2.2cLaTeX symbol font definitions )))) Compatibility mode: loading maintain.sty rather than maintain.cls. (maintain.sty \@indentskip=\skip41 \smallindent=\skip42 \@footindent=\skip43 \@leftskip=\skip44 \c@part=\count83 \c@section=\count84 \c@subsection=\count85 \c@subsubsection=\count86 \c@paragraph=\count87 \c@subparagraph=\count88 \c@table=\count89 \c@figure=\count90 ) (maintain.aux) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 25. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 25. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 25. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 25. [1 ] [2] [3] [4] [5] (maintain.aux) ) Here is how much of TeX's memory you used: 559 strings out of 10910 5631 string characters out of 72284 51066 words of memory out of 262141 3438 multiletter control sequences out of 9500 25710 words of font info for 95 fonts, out of 150000 for 255 15 hyphenation exceptions out of 607 21i,9n,20p,299b,262s stack positions out of 300i,40n,60p,3000b,4000s Output written on maintain.dvi (5 pages, 14224 bytes). saclib2.2.8/sysdep/doc/maint_guide/maintain.sty0000664002275300236100000007126314017255270020663 0ustar wcbrownscs%% JSC style hacked by MJE on August 23, 1995. % CUP Journal JSC document style -- V1.00 Released 23 January 1992 % for LaTeX version 2.09 % Copyright (C) 1992 Cambridge University Press % % based on the original LaTeX ARTICLE DOCUMENT STYLE % Copyright (C) 1988, 1989 by Leslie Lamport % %% \typeout{Document Style `JSC journal style'. V1.00 Released 23 January 1992} % % Journals use two-sided printing. % \@twosidetrue % Defines twoside option. \@mparswitchtrue % Marginpars go on outside of page. % draft option % \def\ds@draft{\overfullrule 5pt} % Causes overfull hboxes to be marked. % \@options % **************************************** % * FONTS * % **************************************** % \lineskip 1pt \normallineskip 1pt \def\baselinestretch{1} \def\quarter@line{3pt} \def\half@line{6pt} \def\full@line{12pt} \def\@normalsize{\@setsize\normalsize{\full@line}\xpt\@xpt \abovedisplayskip \half@line plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip \quarter@line plus 1pt \belowdisplayshortskip \abovedisplayskip \let\@listi\@listI} \def\small{\@setsize\small{10pt}\ixpt\@ixpt \abovedisplayskip 5pt plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip 2.5pt plus 1pt \belowdisplayshortskip \abovedisplayskip \def\@listi{\leftmargin\leftmargini \topsep 10pt plus 1pt minus 1pt \parsep \z@ \itemsep \parsep}} \def\medium{\@setsize\medium{10pt}\viiipt\@viiipt \abovedisplayskip 5pt plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip 2.5pt plus 1pt \belowdisplayshortskip \abovedisplayskip \def\@listi{\leftmargin\leftmargini \topsep 10pt plus 1pt minus 1pt \parsep \z@ \itemsep \parsep}} \def\footnotesize{\@setsize\footnotesize{9pt}\viiipt\@viiipt \abovedisplayskip 4.5pt plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip \z@ plus 1pt \belowdisplayshortskip \abovedisplayskip \def\@listi{\leftmargin\leftmargini \topsep 9pt plus 1pt minus 1pt \parsep \z@ \itemsep \parsep}} \def\scriptsize{\@setsize\scriptsize{8pt}\viipt\@viipt} \def\tiny{\@setsize\tiny{6pt}\vpt\@vpt} \def\large{\@setsize\large{14pt}\xiipt\@xiipt} \def\Large{\@setsize\Large{16pt}\xivpt\@xivpt} \def\LARGE{\@setsize\LARGE{21pt}\xviipt\@xviipt} \def\huge{\@setsize\huge{25pt}\xxpt\@xxpt} \def\Huge{\@setsize\Huge{30pt}\xxvpt\@xxvpt} \normalsize % Choose the normalsize font. % **************************************** % * PAGE LAYOUT * % **************************************** % % All margin dimensions measured from a point one inch from top and side % of page. % % SIDE MARGINS: \oddsidemargin 2pc % Left margin on odd-numbered pages. \evensidemargin 2pc % Left margin on even-numbered pages. \marginparwidth 2.0cm % Width of marginal notes. \marginparsep 10pt % Horizontal space between outer margin and % marginal note % VERTICAL SPACING: % Top of page: \topmargin 3pc % Nominal distance from top of page to top of % box containing running head. \headheight 18pt % Height of box containing running head. \headsep 6pt % Space between running head and text. \topskip = 12pt % '\baselineskip' for first line of page. % Bottom of page: \footheight \full@line % Height of box containing running foot. \footskip 18pt % Distance from baseline of box containing foot % to baseline of last line of text. % DIMENSION OF TEXT: % \textheight = 47\baselineskip \advance\textheight by \topskip % Height of text (including footnotes and figures, % excluding running head and foot). \textwidth 32pc % Width of text line. % For two-column mode: \columnsep 10pt % Space between columns \columnseprule 0pt % Width of rule between columns. % % FOOTNOTES: % \footnotesep \half@line % Height of strut placed at the beginning of every % footnote = height of normal \footnotesize strut, % so no extra space between footnotes. \skip\footins \full@line plus \full@line minus 1pt % Space between last line of text and % top of first footnote. % FOR FLOATS ON A TEXT PAGE: % \floatsep 12pt plus \half@line minus 1pt % Space between adjacent floats moved % to top or bottom of text page. \textfloatsep 18pt plus \half@line minus 3pt % Space between main text and floats % at top or bottom of page. \intextsep 18pt plus \quarter@line minus 2pt % Space between in-text figures and text \@maxsep 18pt % The maximum of \floatsep, % \textfloatsep and \intextsep (minus % the stretch and shrink). % TWO-COLUMN FLOATS IN TWO-COLUMN MODE: \dblfloatsep 12pt plus \half@line minus 2pt % Same as \floatsep for double-column \dbltextfloatsep 18pt plus 4.5pt minus 3pt % \textfloatsep for double-column \@dblmaxsep 18pt % The maximum of \dblfloatsep and % \dbltexfloatsep. % FOR FLOATS ON A SEPARATE FLOAT PAGE OR COLUMN: \@fptop 0pt plus 0fil % Stretch at top of float page/column. (Must be % 0pt plus ...) \@fpsep \full@line plus 0fil % Space between floats on float page/column. \@fpbot 0pt plus 3fil % Stretch at bottom of float page/column. (Must be % 0pt plus ... ) % DOUBLE-COLUMN FLOATS IN TWO-COLUMN MODE. \@dblfptop 0pt plus 0fil % Stretch at top of float page. (Must be 0pt plus ...) \@dblfpsep \full@line plus 0fil % Space between floats on float page. \@dblfpbot 0pt plus 3fil % Stretch at bottom of float page. (Must be % 0pt plus ... ) % MARGINAL NOTES: \marginparpush 6pt % Minimum vertical separation between two marginal % notes. % **************************************** % * PARAGRAPHING * % **************************************** % \parskip \z@ plus .1pt % Extra vertical space between paragraphs. \parindent 1em % Width of paragraph indentation. \partopsep 0pt plus 1pt % Extra vertical space, in addition to % % The following page-breaking penalties are defined % \@lowpenalty 51 % Produced by \nopagebreak[1] or \nolinebreak[1] \@medpenalty 151 % Produced by \nopagebreak[2] or \nolinebreak[2] \@highpenalty 301 % Produced by \nopagebreak[3] or \nolinebreak[3] % \@beginparpenalty -\@lowpenalty % Before a list or paragraph environment. \@endparpenalty -\@lowpenalty % After a list or paragraph environment. \@itempenalty -\@lowpenalty % Between list items. % \clubpenalty=0 % 'Club line' at bottom of page is OK. \widowpenalty=10000 % 'Widow line' at top of page is not good. % **************************************** % * PARTS * % **************************************** % \def\part{\par \addvspace{4ex} \@afterindentfalse \secdef\@part\@spart} \def\@part[#1]#2{\ifnum \c@secnumdepth >\m@ne \refstepcounter{part} \addcontentsline{toc}{part}{Part \thepart: #1} \else \addcontentsline{toc}{part}{#1} \fi {\parindent 0pt \raggedright \ifnum \c@secnumdepth >\m@ne \large\rm PART \ifcase\thepart \or ONE \or TWO \or THREE \or FOUR \or FIVE \or SIX \or SEVEN \or EIGHT \or NINE \or TEN \else \fi \par \nobreak \fi \LARGE \rm #2 \markboth{}{}\par } \nobreak \vskip 3ex \@afterheading } % Heading for \part* command \def\@spart#1{% {\parindent 0pt \raggedright \LARGE \rm #1\par} \nobreak \vskip 3ex \@afterheading } % **************************************** % * SECTIONS * % **************************************** % \def\section{\@startsection{section}{1}{\z@} {18pt plus 6pt minus 3pt} {6pt plus 0pt minus 1pt} {\centering\normalsize\bf}} \def\subsection{\@startsection{subsection}{2}{\z@} {\full@line plus 6pt minus 3pt} {\full@line plus 3pt minus 1pt} {\centering\normalsize\sc}} \def\subsubsection{\@startsection{subsubsection}{3}{\z@} {\full@line plus 6pt minus 3pt} {\full@line plus 3pt minus 1pt} {\noindent\normalsize\sc}} \def\paragraph{\@startsection{paragraph}{4}{\z@} {\full@line plus 6pt minus 3pt} {\half@line plus 3pt minus 1pt} {\noindent\normalsize\rm}} \def\subparagraph{\@startsection{subparagraph}{4}{\parindent} {\half@line plus 3.25pt minus 1pt} {-0.5em} {\normalsize\sc}} % The value of the counter secnumdepth gives the depth of the % highest-level sectioning command that is to produce section numbers. % \setcounter{secnumdepth}{3} % % Changes to \@sect to achieve full points after numbers in section headings % \def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth \def\@svsec{} \else \refstepcounter{#1} \edef\@svsec{\csname the#1\endcsname.\hskip 0.5em}\fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} \endgroup \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi #7} \else \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname {#7}\addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi#7}} \fi \@xsect{#5}} % % APPENDIX % \def\appendix{\par \setcounter{section}{0} \setcounter{subsection}{0} \def\thesection{\Alph{section}}} % **************************************** % * SKIPS * % **************************************** % \newskip\@indentskip % General CUP indent \newskip\smallindent % para. indent \newskip\@footindent % footnote indent \newskip\@leftskip % for CUP float stuff \@indentskip=2pc \smallindent=1em \@footindent=\smallindent \@leftskip=1pc % **************************************** % * LISTS * % **************************************** % \leftmargini \@indentskip \leftmarginii 1.5pc \leftmarginiii 1.5pc \leftmarginiv 1.5pc \leftmarginv 1pc \leftmarginvi 1pc \leftmargin\leftmargini \labelsep 0.5em \labelwidth\leftmargini\advance\labelwidth-\labelsep % % label macros for Range-Left and Range-Right labels \def\makeRLlabel#1{\rlap{#1}\hss} \def\makeRRlabel#1{\hss\llap{#1}} % \def\@listI{\leftmargin\leftmargini \parsep \z@ plus 1pt minus 1pt \topsep \full@line plus 1pt minus 1pt \itemsep \z@ plus 1pt minus 1pt \let\makelabel\makeRRlabel} \let\@listi\@listI \@listi \def\@listii{\leftmargin\leftmarginii \labelwidth\leftmarginii\advance\labelwidth-\labelsep \topsep \half@line plus 1pt minus 1pt \parsep \z@ \itemsep \parsep \let\makelabel\makeRRlabel} \def\@listiii{\leftmargin\leftmarginiii \labelwidth\leftmarginiii\advance\labelwidth-\labelsep \topsep \half@line plus 1pt minus 1pt \parsep \z@ \partopsep \z@ \itemsep \parsep \let\makelabel\makeRRlabel} \def\@listiv{\leftmargin\leftmarginiv \labelwidth\leftmarginiv\advance\labelwidth-\labelsep \let\makelabel\makeRRlabel} \def\@listv{\leftmargin\leftmarginv \labelwidth\leftmarginv\advance\labelwidth-\labelsep \let\makelabel\makeRRlabel} \def\@listvi{\leftmargin\leftmarginvi \labelwidth\leftmarginvi\advance\labelwidth-\labelsep \let\makelabel\makeRRlabel} % % ENUMERATE \def\enumerate{\ifnum \@enumdepth >3 \@toodeep \else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth}% \list{\csname label\@enumctr\endcsname}% {\usecounter{\@enumctr}\let\makelabel\makeRRlabel}% \fi} \def\labelenumi{\theenumi} \def\theenumi{\arabic{enumi}} \def\labelenumii{(\theenumii)} \def\theenumii{\alph{enumii}} \def\p@enumii{\theenumi} \def\labelenumiii{\theenumiii} \def\theenumiii{\roman{enumiii}} \def\p@enumiii{\theenumi(\theenumii)} \def\labelenumiv{\theenumiv} \def\theenumiv{\Alph{enumiv}} \def\p@enumiv{\p@enumiii\theenumiii} % % ITEMIZE % \def\itemize{\ifnum \@itemdepth >3 \@toodeep \else \advance\@itemdepth \@ne \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% \list{\csname\@itemitem\endcsname}{\let\makelabel\makeRRlabel}% \fi} \def\labelitemi{\quad} \def\labelitemii{\bf --} \def\labelitemiii{$\ast$} \def\labelitemiv{$\cdot$} % % DESCRIPTION % \def\descriptionlabel#1{\hspace\labelsep \bf #1} \def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin \let\makelabel\descriptionlabel}} \let\enddescription\endlist % % Unlabelled run-in list %\def\unnumlabel#1{\rm #1} \def\unnum{\list{}{\labelwidth\z@ % \let\makelabel\unnumlabel \leftmargin \parindent \itemindent-\parindent }} \let\endunnum\endlist % % VERSE % \def\verse{\let\\=\@centercr \list{}{\itemsep\z@ \itemindent -\@indentskip \listparindent \itemindent \rightmargin\leftmargin \advance\leftmargin \@indentskip}\item[]} \let\endverse\endlist % % QUOTATION % \def\quotation{\list{}{\listparindent \smallindent \itemindent\listparindent \leftmargin2.5pc\rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]\small} \let\endquotation=\endlist % % QUOTE -- same as quotation except no paragraph indentation, % \def\quote{\list{}{\leftmargin2.5pc\rightmargin\leftmargin}\item[]\small} \let\endquote=\endlist % % **************************************** % * TITLE AND ABSTRACT * % **************************************** % \def\maketitle{\par \begingroup \def\thefootnote{\fnsymbol{footnote}} \def\@makefnmark{\hbox to 0pt{$^{\@thefnmark}$\hss}} \newpage \global\@topnum\z@ \@maketitle \thispagestyle{titlepage} \@thanks \endgroup \setcounter{footnote}{0} \let\maketitle\relax \let\@maketitle\relax \gdef\@thanks{} % \gdef\@author{}\gdef\@title{} \let\thanks\relax} \def\and{\end{author@tabular}\vskip .25em\par \begin{author@tabular}[t]{@{}c@{}}} \def\@maketitle{\newpage \vspace*{26pt} {\parindent 0pt \centering\sloppy {\Large \bf \@title \par} \vskip 14pt {\normalsize \begin{author@tabular}[t]{@{}c@{}}\@author \end{author@tabular}\par} \vskip 9pt {\small \@date} \par\noindent} \vspace{-10pt} } \def\abstract{\list{}{\leftmargin 2.5pc\rightmargin \leftmargin \parsep 0pt plus 1pt\listparindent 1em\labelsep \z@}% \item[]\medium\top@eightrule\ignorespaces} % SFB to remove space \def\endabstract{\bottom@eightrule\endlist\vspace{14pt}} % **************************************** % * PAGE STYLES * % **************************************** % \mark{{}{}} % Initializes TeX's marks \gdef\@author{\mbox{}} % SFB 0.02 \def\author{\@ifnextchar [{\@authortwo}{\@authorone}} \def\@authortwo[#1]#2{\gdef\@author{#2}\gdef\@shortauthor{#1}} \def\@authorone#1{\gdef\@author{#1}\gdef\@shortauthor{#1}} \def\shortauthor#1{\gdef\@shortauthor{#1}} \gdef\@shortauthor{\@author} \gdef\@title{\mbox{}} % SFB 0.02 \def\title{\@ifnextchar [{\@titletwo}{\@titleone}} \def\@titletwo[#1]#2{\gdef\@title{#2}\gdef\@shorttitle{#1}} \def\@titleone#1{\gdef\@title{#1}\gdef\@shorttitle{#1}} \def\shorttitle#1{\gdef\@shorttitle{#1}} \gdef\@shorttitle{\@title} \def\volume#1{\gdef\@volume{#1}} \gdef\@volume{11} \def\pagerange#1{\gdef\@pagerange{#1}} \gdef\@pagerange{1--000} \def\journal#1{\gdef\@journal{#1}} \gdef\@journal{{\it J. Symbolic Computation\/} (\number\year) {\bf \@volume}, \@pagerange} % \ps@empty and \ps@plain defined in LATEX.TEX \def\ps@headings{\let\@mkboth\markboth \def\@oddhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\hfill\footnotesize\rm \@shorttitle \hspace{3em}\thepage} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@oddfoot{} \def\@evenhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\footnotesize\rm\thepage\hspace{3em}\@shortauthor\hfill} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@evenfoot{} \def\sectionmark##1{\markboth{##1}{}} \def\subsectionmark##1{\markright{##1}} } % Definition of 'myheadings' page style. % \def\ps@myheadings{\let\@mkboth\@gobbletwo \def\@oddhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\hfill\footnotesize\rm\rightmark\hspace{3em}\thepage} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@oddfoot{} \def\@evenhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\footnotesize\rm\thepage\hspace{3em}\leftmark\hfill} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@evenfoot{} \def\sectionmark##1{} \def\subsectionmark##1{} } \def\ps@titlepage{\let\@mkboth\@gobbletwo \def\@oddhead{} \def\@oddfoot{} \def\@evenhead{} \def\@evenfoot{} \def\sectionmark##1{} \def\subsectionmark##1{} } % **************************************** % * OTHER ENVIRONMENTS * % **************************************** % % THEOREM % %\def\@thmcounter#1{\noexpand\thesection.\noexpand\arabic{#1}} %\@addtoreset{#1}{section} \def\@nthm#1#2{\@ifnextchar[{\@xnthm{#1}{#2}}{\@xnthm{#1}{#2}[section]}} \def\@begintheorem#1#2{\it \trivlist \item[\hskip \labelsep{\sc #1\ #2.}]} \def\@opargbegintheorem#1#2#3{\it \trivlist \item[\hskip \labelsep{\sc #1\ #2.\hspace{0.5em}(#3)}]} \def\@endtheorem{\endtrivlist} \def\proof{\rm \trivlist % \item[\hskip \labelsep{\sc Proof.\hspace{0.5em}}]} \item[\hskip \labelsep{\sc Proof.}]} \def\endproof{{\large$\Box$}\endtrivlist} \@namedef{proof*}{\rm \trivlist \item[\hskip \labelsep{\sc Proof.}]} \@namedef{endproof*}{\endtrivlist} % TITLEPAGE % \def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn \else \newpage \fi \thispagestyle{empty}\c@page\z@} \def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi} % ARRAY AND TABULAR % \arraycolsep 5pt % Half the space between columns in an array environment. \tabcolsep 6pt % Half the space between columns in a tabular environment. \arrayrulewidth .4pt % Width of rules in array and tabular environment. \doublerulesep 1.5pt % Space between adjacent rules in array or tabular env. %\renewcommand{\arraystretch}{1} \def\tabular{\def\@halignto{} \doublerulesep \z@ \def\hline{\noalign{\ifnum0=`}\fi \vskip 4.5pt \hrule \@height \arrayrulewidth \vskip 4.5pt \futurelet \@tempa\@xhline} \def\@xhline{\ifx\@tempa\hline \vskip -9pt \vskip \doublerulesep \fi \ifnum0=`{\fi}} \def\@arrayrule{\@addtopreamble{\hskip -.5\arrayrulewidth % \vrule \@width \arrayrulewidth \hskip .5\arrayrulewidth}} \@tabular } % TABBING % \tabbingsep \labelsep % Space used by the \'75ommand. (See LaTeX manual.) % MINIPAGE % \skip\@mpfootins = \skip\footins % FRAMEBOX % \fboxsep = 3pt % Space left between box and text by \fbox and \framebox. \fboxrule = \arrayrulewidth % Width of rules in box made by \fbox and \framebox. % **************************************** % * SECTIONS * % **************************************** % \newcounter{part} \newcounter {section} \newcounter {subsection}[section] \newcounter {subsubsection}[subsection] \newcounter {paragraph}[subsubsection] \newcounter {subparagraph}[paragraph] \def\thepart {\arabic{part}} \def\thesection {\arabic{section}} \def\thesubsection {\thesection.\arabic{subsection}} \def\thesubsubsection {\thesubsection.\arabic{subsubsection}} \def\theparagraph {\thesubsubsection.\arabic{paragraph}} \def\thesubparagraph {\theparagraph.\arabic{subparagraph}} % **************************************** % * TABLE OF CONTENTS, ETC. * % **************************************** % \def\@pnumwidth{1.55em} \def\@tocrmarg {2.55em} \def\@dotsep{4.5} \setcounter{tocdepth}{1} \def\@undottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else \vskip \z@ plus .2pt {\hangindent #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip \parindent #2\relax \@afterindenttrue \interlinepenalty\@M \leavevmode \@tempdima #3\relax #4\nobreak \hfill \nobreak \hbox to\@pnumwidth{\hfil\rm \ }\par}\fi} % TABLEOFCONTENTS % \def\tableofcontents{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \section*{Contents} \@starttoc{toc} \if@restonecol\twocolumn\fi \par\vspace{\full@line}} \def\l@part#1#2{\addpenalty{-\@highpenalty} \addvspace{2.25em plus 1pt} \begingroup \parindent \z@ \rightskip \@pnumwidth \parfillskip -\@pnumwidth {\normalsize\rm \leavevmode \hspace*{3pc} #1\hfil \hbox to\@pnumwidth{\hss \ }}\par \nobreak \global\@nobreaktrue \everypar{\global\@nobreakfalse\everypar{}}% \endgroup } \def\l@section#1#2{\addpenalty{\@secpenalty} \@tempdima 1.5em \begingroup \parindent \z@ \rightskip \@pnumwidth \parfillskip -\@pnumwidth \rm \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss \ }\par \endgroup } \def\l@subsection{\@undottedtocline{2}{1.5em}{2.3em}} \def\l@subsubsection{\@undottedtocline{3}{3.8em}{3.2em}} \def\l@paragraph{\@undottedtocline{4}{7.0em}{4.1em}} \def\l@subparagraph{\@undottedtocline{5}{10em}{5em}} % LIST OF FIGURES % \def\listoffigures{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \section*{List of Figures\@mkboth{List of Figures}{List of Figures}} \@starttoc{lof} \if@restonecol\twocolumn\fi } \def\l@figure{\@undottedtocline{1}{1.5em}{2.3em}} % LIST OF TABLES % \def\listoftables{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \section*{List of Tables\@mkboth{List of Tables}{List of Tables}} \@starttoc{lot} \if@restonecol\twocolumn\fi } \let\l@table\l@figure % **************************************** % * BIBLIOGRAPHY * % **************************************** % \def\@biblabel#1{#1} \def\thebibliography#1{\section*{References} \addcontentsline{toc}{section}{References} \list{}{\labelwidth\z@ % \leftmargin \@indentskip \leftmargin 1.5pc \itemindent-\leftmargin} \footnotesize \parindent\z@ \parskip\z@ plus .1pt\relax \def\newblock{\hskip .11em plus .33em minus .07em} \sloppy\clubpenalty4000\widowpenalty4000 \sfcode`\.=1000\relax} \let\endthebibliography=\endlist % **************************************** % * THE INDEX * % **************************************** % \newif\if@restonecol \def\theindex{\section*{Index} \addcontentsline{toc}{section}{Index} \footnotesize \parindent\z@ \parskip\z@ plus .1pt\relax \let\item\@idxitem} \def\@idxitem{\par\hangindent 1pc} \def\subitem {\par\hangindent 1pc \hspace*{1pc}} \def\subsubitem{\par\hangindent 1pc\hspace*{1pc}} \def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi} \def\indexspace{\par\vskip\baselineskip \relax} % **************************************** % * FOOTNOTES * % **************************************** % \def\footnoterule{\kern-3\p@ \hrule width .4\columnwidth height \z@ \kern 3\p@} \long\def\@makefntext#1{\parindent 1em\noindent \hbox to 1.5em{\hss$^{\@thefnmark}$}\hspace{0.5em}#1} %\long\def\@makefntext#1{\@setpar{\@@par\@tempdima \hsize % \advance\@tempdima-\@footindent % \parshape \@ne \@footindent \@tempdima}\par % \noindent \hbox to \z@{\hss$^{\@thefnmark}$\ }#1} % \renewcommand{\thefootnote}{\mbox{$\fnsymbol{footnote}$}} \@addtoreset{footnote}{page} \def\@fnsymbol#1{\ifcase#1\or \dagger\or \ddagger\or \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi\relax} % **************************************** % * FIGURES AND TABLES * % **************************************** % \setcounter{topnumber}{2} \def\topfraction{.9} \setcounter{bottomnumber}{1} \def\bottomfraction{.9} \setcounter{totalnumber}{3} \def\textfraction{.1} \def\floatpagefraction{.75} \setcounter{dbltopnumber}{2} \def\dbltopfraction{.9} \def\dblfloatpagefraction{.75} % \long\def\@makecaption#1#2{\vskip \half@line \ifwide@float \raggedright\sloppy #1. #2\par \else \raggedright\sloppy #1. #2\par \fi} % TABLE % \newcounter{table} \def\thetable{\@arabic\c@table} \def\fps@table{tbp} \def\ftype@table{1} \def\ext@table{lot} \def\fnum@table{Table \thetable} \def\table{\@float{table}} \let\endtable\end@float \@namedef{table*}{\@dblfloat{table}} \@namedef{endtable*}{\end@dblfloat} \def\fstyle@table{\footnotesize\rm} \def\fjust@table{\centering} \def\fcapjust@table{\centering\sloppy} \def\fcapsize@table{\normalsize\bf} \def\fcapstyle@table{\normalsize\rm} % % FIGURE % \newcounter{figure} \def\thefigure{\@arabic\c@figure} \def\fps@figure{tbp} \def\ftype@figure{2} \def\ext@figure{lof} \def\fnum@figure{Figure\ \thefigure} \def\figure{\@float{figure}} \let\endfigure\end@float \@namedef{figure*}{\@dblfloat{figure}} \@namedef{endfigure*}{\end@dblfloat} \def\fstyle@figure{\footnotesize\rm} \def\fjust@figure{\centering} \def\fcapjust@figure{\centering\sloppy} \def\fcapsize@figure{\footnotesize\bf} \def\fcapstyle@figure{\footnotesize\rm} % % stuff for different style float captions % \newif\ifwide@float \wide@floatfalse \long\def\@caption#1[#2]#3{\addcontentsline{\csname ext@#1\endcsname}{#1}% {\protect\numberline{\csname the#1\endcsname}% {\ignorespaces #2}}\par \begingroup \ifwide@float\@parboxrestore\else\@myparboxrestore\fi \@makecaption{\csname fcapjust@#1\endcsname \csname fcapsize@#1\endcsname \csname fnum@#1\endcsname}% {\csname fcapstyle@#1\endcsname \ignorespaces #3}\par \endgroup } \def\@xfloat#1[#2]{% \ifhmode \@bsphack\@floatpenalty-\@Mii \else \@floatpenalty-\@Miii\fi \def\@captype{#1}% \ifinner \@parmoderr\@floatpenalty\z@ \else \@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname \multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n \@tfor \@tempa :=#2\do {\if\@tempa h\advance\@tempcnta \@ne\fi \if\@tempa t\advance\@tempcnta \tw@\fi \if\@tempa b\advance\@tempcnta 4\relax\fi \if\@tempa p\advance\@tempcnta 8\relax\fi }\global\count\@currbox\@tempcnta}\@fltovf \fi \global\setbox\@currbox\vbox\bgroup \boxmaxdepth\z@ \csname fstyle@#1\endcsname \ifwide@float \hsize\textwidth \linewidth\textwidth \@parboxrestore \else \hsize\textwidth \linewidth\textwidth \@parboxrestore %\hsize\columnwidth \addtolength{\hsize}{-2pc} \@rightskip 2pc % \@myparboxrestore \fi \csname fjust@#1\endcsname } \def\@myarrayparboxrestore{\let\par\@@par \let\-\@dischyph \let\'\@acci \let\`\@accii \let\=\@acciii \parindent\z@ \everypar{}\linewidth\hsize \@totalleftmargin\z@ \leftskip\@leftskip \rightskip\@rightskip \parfillskip\@flushglue \lineskip\normallineskip \baselineskip\normalbaselineskip\sloppy } \def\@myparboxrestore{\@myarrayparboxrestore\let\\=\@normalcr} % % stuff for wide floats % \def\@dblfloat{\wide@floattrue\@float} \def\end@dblfloat{\if@twocolumn\egroup \ifnum\@floatpenalty <\z@ \@cons\@dbldeferlist\@currbox\fi \ifnum \@floatpenalty =-\@Mii \@esphack\fi\else\end@float\fi \wide@floatfalse } % **************************************** % * CUP specials * % **************************************** % \def\author@tabular{\def\@halignto{}\@authortable} \let\endauthor@tabular=\endtabular \def\author@tabularcr{{\ifnum0=`}\fi \@xtabularcr[4pt]\small\it\ignorespaces} \def\author@tabularcrnospace{{\ifnum0=`}\fi \@xtabularcr[-2pt]\small\it\ignorespaces} \def\@authortable{\leavevmode \hbox \bgroup $\let\@acol\@tabacol \let\@classz\@tabclassz \let\@classiv\@tabclassiv \let\\\author@tabularcr \let\nextaddress\author@tabularcrnospace \@tabarray} \def\long@rule{\par\noindent\rule{\textwidth}{\arrayrulewidth}\par\noindent} \def\short@rule{\par\noindent\rule{27pc}{\arrayrulewidth}\par\noindent} \def\top@eightrule{\par% \rule{27pc}{\arrayrulewidth}\vspace{4pt}\par\noindent} \def\bottom@eightrule{\par\noindent% \vspace{-1pt}\rule{27pc}{\arrayrulewidth}\par\noindent} \@addtoreset{equation}{section} \def\theequation{\thesection.\arabic{equation}} % **************************************** % * MISCELLANEOUS * % **************************************** % % DATE % \def\today{\number\day\ \ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December \fi \ \number\year} % **************************************** % * INITIALIZATION * % **************************************** % % Default initializations \ps@headings % `headings' page style \pagenumbering{arabic} % Arabic page numbers \onecolumn % Switch to \onecolumn and disable \twocolumn. \let\onecolumn=\relax \def\twocolumn{\typeout{Two column mode not available with CUP styles.}} % \flushbottom \frenchspacing saclib2.2.8/sysdep/doc/user_guide/0000775002275300236100000000000014017255270016157 5ustar wcbrownscssaclib2.2.8/sysdep/doc/user_guide/saclocal.log0000664002275300236100000001134214017255270020444 0ustar wcbrownscsThis is TeX, Version 3.14159 (C version 6.1) (format=latex 96.10.29) 8 JUL 1998 13:44 **saclocal.tex (saclocal.tex LaTeX2e <1996/06/01> Hyphenation patterns for english, german, loaded. (/usr/local/latex/texmf/tex/latex/base/latex209.def File: latex209.def 1996/05/21 v0.51 Standard LaTeX file Entering LaTeX 2.09 compatibility mode. \footheight=\dimen102 \@maxsep=\dimen103 \@dblmaxsep=\dimen104 \@cla=\count79 \@clb=\count80 \mscount=\count81 (/usr/local/latex/texmf/tex/latex/base/tracefnt.sty Package: tracefnt 1996/05/08 v3.0h Standard LaTeX package (font tracing) \tracingfonts=\count82 LaTeX Info: Redefining \selectfont on input line 139. ) \symbold=\mathgroup4 \symsans=\mathgroup5 \symtypewriter=\mathgroup6 \symitalic=\mathgroup7 \symsmallcaps=\mathgroup8 \symslanted=\mathgroup9 LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 307. LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 308. LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 309. LaTeX Font Info: Redeclaring math alphabet \mathit on input line 315. LaTeX Info: Redefining \em on input line 325. (/usr/local/latex/texmf/tex/latex/base/latexsym.sty Package: latexsym 1995/11/28 v2.2c Standard LaTeX package (lasy symbols) \symlasy=\mathgroup10 LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' (Font) U/lasy/m/n --> U/lasy/b/n on input line 86. ) LaTeX Font Info: Redeclaring math delimiter \lgroup on input line 389. LaTeX Font Info: Redeclaring math delimiter \rgroup on input line 391. LaTeX Font Info: Redeclaring math delimiter \bracevert on input line 393. (/usr/local/latex/texmf/tex/latex/config/latex209.cfg (/usr/local/latex/texmf/tex/latex/tools/rawfonts.sty Compatibility mode: package `' requested, but `rawfonts' provided. Package: rawfonts 1994/05/08 Low-level LaTeX 2.09 font compatibility (/usr/local/latex/texmf/tex/latex/tools/somedefs.sty Package: somedefs 1994/06/01 Toolkit for optional definitions ) LaTeX Font Info: Try loading font information for U+lasy on input line 36. (/usr/local/latex/texmf/tex/latex/base/Ulasy.fd File: Ulasy.fd 1995/11/28 v2.2cLaTeX symbol font definitions )))) (/usr/local/latex/texmf/tex/latex/base/article.cls Document Class: article 1996/05/26 v1.3r Standard LaTeX document class (/usr/local/latex/texmf/tex/latex/base/size10.clo File: size10.clo 1996/05/26 v1.3r Standard LaTeX file (size option) ) \c@part=\count83 \c@section=\count84 \c@subsection=\count85 \c@subsubsection=\count86 \c@paragraph=\count87 \c@subparagraph=\count88 \c@figure=\count89 \c@table=\count90 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 Compatibility mode: definition of \rm ignored. Compatibility mode: definition of \sf ignored. Compatibility mode: definition of \tt ignored. Compatibility mode: definition of \bf ignored. Compatibility mode: definition of \it ignored. Compatibility mode: definition of \sl ignored. Compatibility mode: definition of \sc ignored. LaTeX Info: Redefining \cal on input line 543. LaTeX Info: Redefining \mit on input line 544. \bibindent=\dimen105 ) (saclib.sty \arrow=\box26 \cell=\box27 \dline=\box28 ) (saclocal.aux) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: External font `cmex10' loaded for size (Font) <17.28> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 16. [1 ] [2] (saclocal.aux) ) Here is how much of TeX's memory you used: 594 strings out of 10910 5776 string characters out of 72284 49645 words of memory out of 262141 3465 multiletter control sequences out of 9500 26055 words of font info for 96 fonts, out of 150000 for 255 14 hyphenation exceptions out of 607 26i,6n,20p,310b,248s stack positions out of 300i,40n,60p,3000b,4000s Output written on saclocal.dvi (2 pages, 3884 bytes). saclib2.2.8/sysdep/doc/user_guide/saclib.sty0000664002275300236100000000371014017255270020156 0ustar wcbrownscs% SHORTHAND FOR FREQUENTLY USED EXPRESSIONS \newcommand{\saclib}{\mbox{\rm SACLIB}} \newcommand{\isac}{\mbox{\rm ISAC}} \newcommand{\Word}{{\tt Word}} \newcommand{\BDigit}{{\tt BDigit}} \newcommand{\GCArray}{{\tt GCArray}} \newcommand{\Wordptr}{{\tt (Word *)}} \newcommand{\NIL}{{\tt NIL}} \newcommand{\BETA}{{\tt BETA}} \newcommand{\BETAone}{{\tt BETA1}} \newcommand{\GAMMA}{{\tt GAMMA}} \newcommand{\SLOGV}{{\tt SLOGV}} \newcommand{\SLOGA}{{\tt SLOGA}} \newcommand{\SPACE}{{\tt SPACE}} \newcommand{\SPACEB}{{\tt SPACEB}} \newcommand{\SPACEBone}{{\tt SPACEB1}} \newcommand{\GCASPACE}{{\tt GCASPACE}} \newcommand{\GCASPACEBp}{{\tt GCASPACEBp}} \newcommand{\BETAp}{{\tt BETAp}} \newcommand{\BETApp}{{\tt BETApp}} \newcommand{\NU}{{\tt NU}} \newcommand{\NUp}{{\tt NUp}} \newcommand{\RHO}{{\tt RHO}} \newcommand{\AVAIL}{{\tt AVAIL}} \newcommand{\GCAAVAIL}{{\tt GCAAVAIL}} \newcommand{\GCGLOBALS}{{\tt GCGLOBALS}} \newcommand{\ttA}{{\tt A}} \newcommand{\tta}{{\tt a}} \newcommand{\ttD}{{\tt D}} \newcommand{\ttE}{{\tt E}} \newcommand{\ttI}{{\tt I}} \newcommand{\ttL}{{\tt L}} \newcommand{\ttN}{{\tt N}} \newcommand{\ttP}{{\tt P}} \newcommand{\ttR}{{\tt R}} \newcommand{\BbbZ}{{\bf Z}} \newcommand{\BbbQ}{{\bf Q}} \newcommand{\BbbD}{{\bf D}} \newcommand{\mod}{\,{\rm mod}\,} \newcommand{\sign}{\mbox{\rm sign}} \newcommand{\norm}{{\rm Norm}} \newcommand{\res}{{\rm res}} % LIST WITH USER-DEFINED INDENTATION \newenvironment{glists}[4]{ \begin{list}{}{ \setlength{\labelwidth}{#2} \setlength{\labelsep}{#3} \setlength{\leftmargin}{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \setlength{\parsep}{#4} \setlength{\topsep}{\parsep} \setlength{\itemsep}{\parsep} \setlength{\listparindent}{0in} } }{ \end{list} } \newcommand{\iteml}[1]{\item[\tt #1 \hfill]} % GRAPHICS \newsavebox{\arrow} \newsavebox{\cell} \newsavebox{\dline} \unitlength0.5pt \savebox{\dline}(0,0)[lb]{ \multiput( 0, 0)(3,0){5}{\line(1,0){1}} } saclib2.2.8/sysdep/doc/user_guide/saclib.lof0000664002275300236100000000144714017255270020124 0ustar wcbrownscs\addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \contentsline {figure}{\numberline {A.1}{\ignorespaces A sample program.}}{52} \contentsline {figure}{\numberline {A.2}{\ignorespaces Sample code using GCA handles.}}{53} \contentsline {figure}{\numberline {A.3}{\ignorespaces Declaring global variables.}}{54} \contentsline {figure}{\numberline {A.4}{\ignorespaces Sample code for initializing SACLIB by hand.}}{56} \addvspace {10\p@ } \addvspace {10\p@ } \contentsline {figure}{\numberline {C.1}{\ignorespaces The {\tt SPACE}\ array.}}{61} \contentsline {figure}{\numberline {C.2}{\ignorespaces The cell structure of the list ${\tt L}= (1,(9,6),8)$.}}{61} saclib2.2.8/sysdep/doc/user_guide/saclocal.aux0000664002275300236100000000103314017255270020454 0ustar wcbrownscs\relax \@writefile{toc}{\contentsline {section}{\numberline {1}Availability}{1}} \@writefile{toc}{\contentsline {section}{\numberline {2}Environment}{1}} \@writefile{toc}{\contentsline {section}{\numberline {3}Compiling and Linking}{1}} \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces A sample makefile.}}{2}} \newlabel{fMF}{{1}{2}} \@writefile{toc}{\contentsline {section}{\numberline {4}Additional Documentation, Tools, etc.}{2}} \@writefile{toc}{\contentsline {section}{\numberline {5}Where to Look for Help}{2}} saclib2.2.8/sysdep/doc/user_guide/saclocal.tex0000664002275300236100000000741014017255270020464 0ustar wcbrownscs\documentclass{article} \usepackage{saclib} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{ Addendum\\to the\\\saclib\ User's Guide\thanks{ \saclib\ version 1.0, ``Addendum'' version 1.0. } } \author{Andreas Neubacher} \date{June 26, 1992} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Availability} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \saclib\ is installed on \ldots in the directory ``{\tt\~{ }saclib/saclib}''. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Environment} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% It is recommended to define an environment variable ``{\tt \$saclib}'' containing the name of the \saclib\ directory. This can be done by adding the line \begin{verbatim} setenv saclib ~saclib/saclib \end{verbatim} to your ``{\tt .login}'' or ``{\tt .cshrc}'' file. \saclib\ header and library files should then only be accessed by using this variable. If the installation is moved to a different directory you will only have to change the definition of this variable. If you want to use the shell scripts provided with \saclib, the environment variable ``{\tt \$saclib}'' is required, and you also need \begin{verbatim} set path=($path $saclib/bin) \end{verbatim} in your ``{\tt .login}'' or ``{\tt .cshrc}'' file. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compiling and Linking} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \sloppy The compiled library is ``{\tt \$saclib/lib/saclib.a}'', an optimized version is ``{\tt \$saclib/lib/saclibo.a}'', a version compiled with the debug option is ``{\tt \$saclib/lib/saclibd.a}'', and the header files are in ``{\tt \$saclib/include}''. Figure \ref{fMF} shows what a makefile for linking with the standard library might look like. \begin{figure}[htb] \ \hrulefill\ \small \begin{verbatim} CFLAGS = -DNO_SACLIB_MACROS -I${saclib}/include LIB = ${saclib}/lib/saclib.a OBJS = example.o example: $(OBJS) ${CC} $(OBJS) $(LIB) -o example \end{verbatim} \ \hrulefill\ \normalsize \caption{A sample makefile.} \label{fMF} \end{figure} \fussy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Additional Documentation, Tools, etc.} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In ``{\tt \$saclib/example}'' you will find sample programs which are a bit more sophisticated than the ones given in the ``\saclib\ User's Guide''. They should be of help in learning how to work with \saclib. There are also two shell scripts which should facilitate searching for a certain algorithm and displaying \saclib\ functions: \begin{description} \item[sdesc] takes a regular expression in the style of {\tt grep} and lists all \saclib\ functions whose description matches the regular expression. \item[sman] takes a full \saclib\ function name and displays the corresponding source file. \end{description} Calling the scripts without parameters produces a usage message. For experimenting with \saclib\ functions interactively, use ``{\tt isac}'', which gives you a simple shell environment from which you can call all \saclib\ functions. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Where to Look for Help} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Apart from sending e-mail to the adresses given in Section 1.3 of the ``User's Guide'' you can also ask \ldots \end{document} saclib2.2.8/sysdep/doc/user_guide/cCFC.tex0000664002275300236100000003655114017255270017451 0ustar wcbrownscsThis chapter describes how the \saclib\ environment has to be set up for \saclib\ functions to work correctly. We will start with a quick introduction to the basics using a sample program in Section \ref{c:CFC s:SP}. In Section \ref{c:CFC s:MA} we describe the steps necessary for combining dynamic allocation with \saclib\ list processing. Special care has to be taken with \saclib\ data structures addressed by global variables. This is explained in Section \ref{c:CFC s:GV}. Finally, Section \ref{c:CFC s:IS} describes how \saclib\ can be initialized without using {\tt sacMain()}, and Section \ref{c:CFC s:EH} gives some information on error handling in \saclib. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{A Sample Program} \label{c:CFC s:SP} Figure \ref{f:sample} shows the basic layout of a program using \saclib\ functions. \begin{figure}[htb] \ \hrulefill\ \small \begin{verbatim} #include "saclib.h" int sacMain(argc, argv) int argc; char **argv; { Word I1,I2,I3,t; Word i,n; Step1: /* Input. */ SWRITE("Please enter the first integer: "); I1 = IREAD(); SWRITE("Please enter the second integer: "); I2 = IREAD(); SWRITE("How many iterations? "); n = GREAD(); Step2: /* Processing. */ t = CLOCK(); for (i=0; i Hyphenation patterns for english, german, loaded. (/usr/local/latex/texmf/tex/latex/base/latex209.def File: latex209.def 1996/05/21 v0.51 Standard LaTeX file Entering LaTeX 2.09 compatibility mode. \footheight=\dimen102 \@maxsep=\dimen103 \@dblmaxsep=\dimen104 \@cla=\count79 \@clb=\count80 \mscount=\count81 (/usr/local/latex/texmf/tex/latex/base/tracefnt.sty Package: tracefnt 1996/05/08 v3.0h Standard LaTeX package (font tracing) \tracingfonts=\count82 LaTeX Info: Redefining \selectfont on input line 139. ) \symbold=\mathgroup4 \symsans=\mathgroup5 \symtypewriter=\mathgroup6 \symitalic=\mathgroup7 \symsmallcaps=\mathgroup8 \symslanted=\mathgroup9 LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 307. LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 308. LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 309. LaTeX Font Info: Redeclaring math alphabet \mathit on input line 315. LaTeX Info: Redefining \em on input line 325. (/usr/local/latex/texmf/tex/latex/base/latexsym.sty Package: latexsym 1995/11/28 v2.2c Standard LaTeX package (lasy symbols) \symlasy=\mathgroup10 LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' (Font) U/lasy/m/n --> U/lasy/b/n on input line 86. ) LaTeX Font Info: Redeclaring math delimiter \lgroup on input line 389. LaTeX Font Info: Redeclaring math delimiter \rgroup on input line 391. LaTeX Font Info: Redeclaring math delimiter \bracevert on input line 393. (/usr/local/latex/texmf/tex/latex/config/latex209.cfg (/usr/local/latex/texmf/tex/latex/tools/rawfonts.sty Compatibility mode: package `' requested, but `rawfonts' provided. Package: rawfonts 1994/05/08 Low-level LaTeX 2.09 font compatibility (/usr/local/latex/texmf/tex/latex/tools/somedefs.sty Package: somedefs 1994/06/01 Toolkit for optional definitions ) LaTeX Font Info: Try loading font information for U+lasy on input line 36. (/usr/local/latex/texmf/tex/latex/base/Ulasy.fd File: Ulasy.fd 1995/11/28 v2.2cLaTeX symbol font definitions )))) (/usr/local/latex/texmf/tex/latex/base/report.cls Document Class: report 1996/05/26 v1.3r Standard LaTeX document class (/usr/local/latex/texmf/tex/latex/base/size10.clo File: size10.clo 1996/05/26 v1.3r Standard LaTeX file (size option) ) \c@part=\count83 \c@chapter=\count84 \c@section=\count85 \c@subsection=\count86 \c@subsubsection=\count87 \c@paragraph=\count88 \c@subparagraph=\count89 \c@figure=\count90 \c@table=\count91 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 Compatibility mode: definition of \rm ignored. Compatibility mode: definition of \sf ignored. Compatibility mode: definition of \tt ignored. Compatibility mode: definition of \bf ignored. Compatibility mode: definition of \it ignored. Compatibility mode: definition of \sl ignored. Compatibility mode: definition of \sc ignored. LaTeX Info: Redefining \cal on input line 620. LaTeX Info: Redefining \mit on input line 621. \bibindent=\dimen105 ) (saclib.sty \arrow=\box26 \cell=\box27 \dline=\box28 ) (makeidx.sty) (DinA4.sty) \@indexfile=\write3 Writing index file saclib.idx (saclib.aux) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: External font `cmex10' loaded for size (Font) <17.28> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 27. LaTeX Font Info: Try loading font information for OMS+cmr on input line 27. (/usr/local/latex/texmf/tex/latex/base/OMScmr.fd File: OMScmr.fd 1996/05/19 v2.4h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <9> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <9> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 27. [0 ] LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 34. [1 ] [0] (saclib.toc LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 2. [1 ] [2]) \tf@toc=\write4 [3] (saclib.lof) \tf@lof=\write5 [4 ] Chapter 1. (cI.tex [1 ] [2]) [3] Chapter 2. (cLP.tex [4 ] [5] [6] Overfull \hbox (6.23833pt too wide) in paragraph at lines 292--295 [][]\OT1/cmr/m/n/10 List of BETA-integers bub-ble sort. \OT1/cmr/m/it/10 Sorts a list of atoms into non-descending [] [7]) [8] Chapter 3. (cAsI.tex [9 ]) (cAsIA.tex [10] [11]) (cAsMA.tex [12]) (cAsRA.tex [13]) [14] Chapter 4. (cPAsI.tex Overfull \hbox (14.91335pt too wide) in paragraph at lines 21--27 \OT1/cmr/m/it/10 sen-ta-tion \OT1/cmtt/m/n/10 P \OT1/cmr/m/n/10 of a poly-no-mi al $\OML/cmm/m/it/10 p \OT1/cmr/m/n/10 = [][] \OML/cmm/m/it/10 p[]x[]$ \OT1/cmr /m/n/10 with $\OML/cmm/m/it/10 e[] > [] > e[]$\OT1/cmr/m/n/10 , $\OML/cmm/m/it/ 10 p[] \OMS/cmsy/m/n/10 2 \OT1/cmr/m/n/10 ([] (\OT1/cmr/bx/n/10 D\OT1/cmr/m/n/1 0 [\OML/cmm/m/it/10 x[]\OT1/cmr/m/n/10 ]) [])[\OML/cmm/m/it/10 x[]\OT1/cmr/m/n/ 10 ]$, [] Overfull \hbox (48.21544pt too wide) in paragraph at lines 48--53 []\OT1/cmr/m/n/10 The \OT1/cmr/m/it/10 sparse dis-tribu-tive rep-re-sen-ta-tion \OT1/cmtt/m/n/10 P \OT1/cmr/m/n/10 of such a poly-no-mial $\OML/cmm/m/it/10 p$ \OT1/cmr/m/n/10 is the list $(\OT1/cmtt/m/n/10 D[]\OML/cmm/m/it/10 ; \OT1/cmtt /m/n/10 E[]\OML/cmm/m/it/10 ; \OT1/cmtt/m/n/10 D[]\OML/cmm/m/it/10 ; \OT1/cmtt/ m/n/10 E[]\OML/cmm/m/it/10 ; [] ; \OT1/cmtt/m/n/10 D[]\OML/cmm/m/it/10 ; \OT1/c mtt/m/n/10 E[]\OT1/cmr/m/n/10 )$, [] Overfull \hbox (10.34651pt too wide) in paragraph at lines 48--53 \OT1/cmr/m/n/10 where $\OT1/cmtt/m/n/10 D[]$ \OT1/cmr/m/n/10 is the [] in-ter-n al rep-re-sen-ta-tion of $\OML/cmm/m/it/10 d[]$ \OT1/cmr/m/n/10 and $\OT1/cmtt/ m/n/10 E[]$ \OT1/cmr/m/n/10 is the list $(\OML/cmm/m/it/10 e[]; e[]; [] ; e[]\O T1/cmr/m/n/10 )$ [] [15 ] [16]) (cPAsPIO.tex [17] Underfull \hbox (badness 10000) in paragraph at lines 113--128 \OT1/cmr/m/n/10 For $\OML/cmm/m/it/10 r$\OT1/cmr/m/n/10 -variate re-cur-sive po ly-no-mi-als over $\OT1/cmr/bx/n/10 Q$ \OT1/cmr/m/n/10 the al-go-rithms \OT1/cm tt/m/n/10 RPREAD \OT1/cmr/m/n/10 and [] [18]) (cPAsDIPA.tex [19] Overfull \hbox (1.30998pt too wide) in paragraph at lines 10--12 [][]\OT1/cmr/m/n/10 Polynomial bi-no-mial. \OT1/cmr/m/it/10 Builds $\OML/cmm/m/ it/10 a[]x[] \OT1/cmr/m/n/10 + \OML/cmm/m/it/10 a[]x[]$ \OT1/cmr/m/it/10 from $ \OML/cmm/m/it/10 a[]; a[]; e[]$\OT1/cmr/m/it/10 , [] [20]) (cPAsIPA.tex [21] Overfull \hbox (2.75485pt too wide) in paragraph at lines 61--64 [][]\OT1/cmr/m/n/10 Integral poly-no-mial sub-sti-tu-tion. \OT1/cmr/m/it/10 Sub -sti-tutes an in-te-gral poly- [] Overfull \hbox (4.79852pt too wide) in paragraph at lines 87--89 [][]\OT1/cmr/m/n/10 Integral poly-no-mial bi-nary ra-tio-nal eval-u-a-tion, in- te-gral poly- [] [22] [23] Overfull \hbox (4.52579pt too wide) in paragraph at lines 231--234 [][]\OT1/cmr/m/n/10 Integral poly-no-mial trun-ca-tion. \OT1/cmr/m/it/10 Com-pu tes $\OML/cmm/m/it/10 p [] \OT1/cmr/m/n/10 (\OML/cmm/m/it/10 x[]; [] ; x[]\OT1/ cmr/m/n/10 )$ [] ) (cPAsMPA.tex [24]) (cPAsRPA.tex [25]) (cPAsMR.tex [26]) [27] Chapter 5. (cLA.tex [28 ] Overfull \hbox (13.29865pt too wide) in paragraph at lines 75--83 [][]\OT1/cmr/m/n/10 Linear dio-phan-tine sys-tem so-lu-tion, mod-i-fied Kan-nan and Bachem [] [29]) [30] Chapter 6. (cGCD.tex [31 ] [32] [33] Overfull \hbox (5.33914pt too wide) in paragraph at lines 314--318 [][]\OT1/cmr/m/n/10 Modular uni-vari-ate poly-no-mial great-est com-mon di-vi-s or. \OT1/cmr/m/it/10 Com- [] [34] [35]) [36] Chapter 7. (cPF.tex [37 ] Overfull \hbox (10.68768pt too wide) in paragraph at lines 82--85 [][]\OT1/cmr/m/n/10 Modular uni-vari-ate poly-no-mial factorization-Berlekamp a l-go-rithm. [] Overfull \hbox (15.60327pt too wide) in paragraph at lines 114--115 [][]\OT1/cmr/m/n/10 Integral poly-no-mial mod ideal quadratic Hensel [] Overfull \hbox (6.7976pt too wide) in paragraph at lines 151--152 [][]\OT1/cmr/m/n/10 Modular poly-no-mial mod ideal, quadratic [] Overfull \hbox (13.82599pt too wide) in paragraph at lines 154--156 [][]\OT1/cmr/m/n/10 Modular poly-no-mial mod ideal, quadratic Hensel lemma, [] [38] Overfull \hbox (5.39168pt too wide) in paragraph at lines 166--171 [][]\OT1/cmr/m/n/10 Modular poly-no-mial dis-tinct de-gree fac-tor-iza-tion. \O T1/cmr/m/it/10 Given a monic, [] ) [39] Chapter 8. (cRRC.tex [40 ] [41] [42]) [43] Chapter 9. (cAN.tex [44 ] [45] [46] [47] Overfull \hbox (9.71533pt too wide) in paragraph at lines 373--376 [][]\OT1/cmr/m/n/10 Algebraic mod-ule uni-vari-ate poly-no-mial bi-nary ho-mo-t h-etic trans- [] [48] Overfull \hbox (10.29866pt too wide) in paragraph at lines 441--444 [][]\OT1/cmr/m/n/10 Algebraic mod-ule uni-vari-ate poly-no-mial iso-lat-ing in- ter-vals weakly [] Overfull \hbox (2.79773pt too wide) in paragraph at lines 444--447 [][]\OT1/cmr/m/n/10 Algebraic mod-ule uni-vari-ate poly-no-mial real [] [49]) [50] Appendix A. (cCFC.tex [51 ] [52] [53] [54] [55]) [56] Appendix B. (cISAC.tex Overfull \hbox (27.82635pt too wide) in paragraph at lines 5--7 [] \OT1/cmr/m/n/10 is a small ex-per-i-men-tal in-ter-ac-tive in-ter-face to [] , al-low-ing sim-ple \OT1/cmtt/m/n/10 read--eval--write [] [57 ] [58] [59]) [60] Appendix C. (cNIWsGC.tex (fSPACE.tex) (fLIST.tex) [61 ]) [62] (cNIWsCGV.tex [63] [64]) [65] (saclib.ind [66 ] [67] [68] [69] [70] [71] [72]) (saclib.aux) ) Here is how much of TeX's memory you used: 857 strings out of 10910 7838 string characters out of 72284 57077 words of memory out of 262141 3569 multiletter control sequences out of 9500 29059 words of font info for 106 fonts, out of 150000 for 255 14 hyphenation exceptions out of 607 24i,11n,21p,321b,282s stack positions out of 300i,40n,60p,3000b,4000s Output written on saclib.dvi (79 pages, 266732 bytes). saclib2.2.8/sysdep/doc/user_guide/cPAsDIPA.tex0000664002275300236100000001231214017255270020164 0ustar wcbrownscs\begin{description} \item[Constructors:] \ \ \begin{description} \item[{\tt A <- PFBRE(r,a) }]\index{PFBRE} Polynomial from Base Ring Element. {\em Builds an r-variate polynomial from an element of some domain.} \item[{\tt A <- PMON(a,e) }]\index{PMON} Polynomial monomial. {\em Builds $a x^e$ from $a$ and $e$.} \item[{\tt A <- PBIN(a1,e1,a2,e2) }]\index{PBIN} Polynomial binomial. {\em Builds $a_1 x^{e_1} + a_2 x^{e_2}$ from $a_1, a_2, e_1$, and $e_2$.} \end{description} \item[Selectors:] \ \ \begin{description} \item[{\tt a <- PLDCF(A) }]\index{PLDCF} Polynomial leading coefficient. {\em Returns the leading coefficient w.r.t.\ the main variable.} \item[{\tt B <- PRED(A) }]\index{PRED} Polynomial reductum. {\em Returns the reductum (the polynomial minus its leading term) w.r.t.\ the main variable.} \item[{\tt a <- PLBCF(r,A) }]\index{PLBCF} Polynomial leading base coefficient. {\em Returns the coefficient of the term of the highest degree w.r.t.\ all variables (an element of the base domain).} \item[{\tt a <- PTBCF(r,A) }]\index{PTBCF} Polynomial trailing base coefficient. {\em Returns the coefficient of the term of the lowest degree w.r.t.\ all variables (an element of the base domain).} \end{description} \item[Information and Predicates:] \ \ \begin{description} \item[{\tt n <- PDEG(A) }]\index{PDEG} Polynomial degree. {\em Returns the degree of the argument w.r.t.\ the main variable.} \item[{\tt n <- PMDEG(A) }]\index{PMDEG} Polynomial modified degree. {\em Returns the degree of the argument, $-1$ if the argument is $0$.} \item[{\tt n <- PDEGSV(r,A,i) }]\index{PDEGSV} Polynomial degree, specified variable. {\em Returns the degree of the argument w.r.t.\ the i-th variable.} \item[{\tt V <- PDEGV(r,A) }]\index{PDEGV} Polynomial degree vector. {\em Returns a list $(d_1,\ldots,d_r)$ where $d_i$ is the degree of argument w.r.t.\ the i-th variable.} \item[{\tt b <- PCONST(r,A) }]\index{PCONST} Polynomial constant. {\em Tests whether the argument is a constant polynomial.} \item[{\tt b <- PUNT(r,A) }]\index{PUNT} Polynomial univariate test. {\em Tests whether the argument is a univariate polynomial.} \item[{\tt k <- PORD(A) }]\index{PORD} Polynomial order. {\em Returns the smallest exponent appearing in the argument polynomial (w.r.t.\ the main variable).} \end{description} \item[Transformation:] \ \ \begin{description} \item[{\tt B <- PSDSV(r,A,i,n) }]\index{PSDSV} Polynomial special decomposition, specified variable. {\em Computes $p(x_1, \ldots, x_i^{1/n}, \ldots, x_r)$ given $p, i, n$, and $r$.} \item[{\tt B <- PDPV(r,A,i,n) }]\index{PDPV} Polynomial division by power of variable. {\em Computes $x_i^{-n} p$ given $p, i$, and $n$.} \item[{\tt B <- PMPMV(A,k) }]\index{PMPMV} Polynomial multiplication by power of main variable. {\em Computes $x^n p$ given $p$ and $n$, with $x$ being the main variable of $p$.} \item[{\tt B <- PRT(A) }]\index{PRT} Polynomial reciprocal transformation. {\em Computes $x^n p(x^{-1})$ with $n = {\rm deg}(p)$.} \item[{\tt B <- PDBORD(A) }]\index{PDBORD} Polynomial divided by order. {\em Computes $x^{-n} p$ where $n$ is the order of $p$.} \end{description} \item[Conversion\footnotemark :] \ \ \footnotetext{ \rm See Section \ref{c:PA s:MR} for a description of the sparse distributive and the dense recursive representations. } \begin{description} \item[{\tt B <- PFDIP(r,A) }]\index{PFDIP} Polynomial from distributive polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the sparse distributive representation.} \item[{\tt B <- PFDP(r,A) }]\index{PFDP} Polynomial from dense polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the dense recursive representation.} \end{description} \item[Miscellaneous:] \ \ \begin{description} \item[{\tt B <- PINV(r,A,k) }]\index{PINV} Polynomial introduction of new variables. {\em Computes a polynomial in $R[y_1, \ldots, y_s, x_1, \ldots, x_r]$ from a polynomial in $R[x_1,\ldots,x_r]$.} \item[{\tt B <- PPERMV(r,A,P) }]\index{PPERMV} Polynomial permutation of variables. {\em Computes a polynomial in $R[x_{p_1}, \ldots, x_{p_r}]$ from a polynomial in $R[x_1, \ldots, x_r]$, where $(p_1, \ldots, p_r)$ is a permutation of $(1, \ldots, r)$.} \item[{\tt B <- PCPV(r,A,i,j) }]\index{PCPV} Polynomial cyclic permutation of variables. \item[{\tt B <- PICPV(r,A,i,j) }]\index{PICPV} Polynomial inverse cyclic permutation of variables. \item[{\tt B <- PTV(r,A,i) }]\index{PTV} Polynomial transpose variables. \item[{\tt B <- PTMV(r,A) }]\index{PTMV} Polynomial transpose main variables. \item[{\tt B <- PUFP(r,A) }]\index{PUFP} Polynomial, univariate, from polynomial. {\em Computes a univariate polynomial from an r-variate polynomial by substituting 0 for all variables except the main variable $x_r$.} \item[{\tt L <- PCL(A) }]\index{PCL} Polynomial coefficient list. {\em Returns a list $(p_n,\ldots,p_0)$ where $n$ is the degree of $p$ and the $p_i$ are the coefficients of $p$.} \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cPAsPIO.tex0000664002275300236100000002544514017255270020111 0ustar wcbrownscsIn this section we will describe the polynomial input and output routines that are available in \saclib. Before proceeding further, the reader should be familiar with the internal representations of polynomials which are discussed in Section \ref{c:PA s:I ss:D}. \subsection{Recursive polynomials over $\BbbZ$} The {\em external canonical representation} of sparse {\em recursive} polynomials over $\BbbZ$ is defined by the following rules. First of all, each polynomial is enclosed in parentheses. A term is represented by the coefficient immediately followed by the variable (no space nor '{\tt *}' in between). The coefficients $+1$ and $-1$ are suppressed unless the exponent of the variable is $0$ in which case the variable is suppressed. The caret '\verb@^@' is used to indicate exponentiation. Exponents with the value $1$ are suppressed and if a variable has the exponent $0$ then the variable is suppressed. These rules apply recursively to the coefficients which may themselves be polynomials. A few examples are in order. \begin{center} \begin{tabular}{|c|c|} \hline recursive polynomial & external canonical form \\ \hline & \\ $ -x^4 + 2x^3 - x + 3 $ & \verb@(-x^4+2x^3-x+3)@ \\ & \\ $ (x^2+1)y^3+(x+8)y-5 $ & \verb@((x^2+1)y^3+(x+8)y+(-5))@ \\ & \\ $ - (x^2-4)y^4 + y^2 - y - x$ & \verb@((-x^2+4)y^4+(1)y^2+(-1)y+(-x))@ \\ & \\ \hline \end{tabular} \end{center} \noindent Note that a constant polynomial in $r$ variables will be enclosed in $r$ sets of parentheses. For example, the constant polynomial $2$ in 3 variables will be represented in external canonical form as \verb@(((2)))@. The algorithm {\tt IPREAD} reads an $r$-variate recursive polynomial over $\BbbZ$ in external canonical form from the input stream. The polynomial that is read is stored in internal canonical form and the number of variables is also recorded. The variables are {\em not} stored. Integer coefficients may be of arbitrary length but exponents must be {\tt BETA}-digits. Since no sorting is performed on the terms, they must be given in order of descending degree. This is an important remark since almost all algorithms that manipulate polynomials require that the terms be ordered and violating this rule will undoubtedly cause incorrect results to be computed and may even crash the system. Another important remark is that terms whose coefficients are 0 should not be given as these terms will be stored and may cause problems, for example in equality testing. Although {\tt IPREAD} is happiest when a polynomial is given in external canonical form as exemplified by the previous examples, the user is allowed some freedom. An arbitrary number of spaces may interspersed between the coefficients, the variables, the exponents and the symbols '\verb@+@', '\verb@-@' and '\verb@^@'. Spaces may not be inserted within a variable nor within an integer. Coefficients with magnitude 1 as well as the exponents 0 and 1 may be explicitly given. Thus, for example, \verb@((x ^ 2+1) y^3+(1x+8) y^1-(5x^0) y^0)@ is perfectly valid and is equivalent to the second example given in the table above. Since {\tt IPREAD} was intended to be used mainly for reading output produced by previous computations, it is designed to be fast and, consequently, very little error checking is performed on the input. Among other things, {\tt IPREAD} does not check for consistency among the variables, e.g. \verb@((y)x^2+(z)y)@ will be accepted as valid input and would be identical to \verb@((u)v^2+(u)v)@ in internal representation. Also, {\tt IPREAD} does not check for consistency among terms, i.e. each term is processed separately and it is not checked whether all terms have the same number of recursive nestings. For example, \verb@(y^3+(x-1)y)@ will be accepted although the first term, \verb@y^3@, is a univariate polynomial whereas the second, \verb@(x-1)y@, is a bivariate polynomial. {\em It is therefore the responsibility of the user to see that polynomials are input properly.} The algorithm {\tt IPWRITE} takes as inputs an $r$-variate recursive polynomial \verb@A@ over $\BbbZ$ and a list \verb@V = (@$v_1,\ldots,v_r$\verb@)@ of $r$ variables and writes \verb@A@ to the output stream using the variables specified with $v_r$ as the main variable and $v_1$ as the most minor variable. The list \verb@V@ may be initialized using {\tt VLREAD} which reads a variable list from the input stream. For generating a list with a fixed number of variables one could also use an expression such as {\tt LIST3(LFS("X"),LFS("Y"),LFS("Z"))}. Here the functions {\tt LFS} is used for converting a C string to a SACLIB variable. It is possible to use the algorithm {\tt IUPWRITE} to write univariate recursive polynomials but this algorithm was intended mainly as a subroutine to be called by {\tt IPWRITE}, which also handles univariate polynomials, and the user need not even be aware of its existence. There is an additional set of input functions of which the top level function is {\tt IPEXPREAD}. The format accepted by this function is a bit more convenient as expressions may be of the form \verb@(3 X Y^2 + X)^3 - (Y X + Y) (X - 1)^2 + 5@. Note that {\tt IPEXPREAD} also takes a variable list as input and therefore can detect the order of the variables without requiring the recursive structure made explicit by parentheses. To be more precise, {\tt IPEXPREAD} accepts any polynomial expression built from integers and variables using +, -, blanks for multiplication, \^\ for exponentiation, and parenthesis for grouping. The expression may be terminated by any character not being part of the legal input set (e.g.\ a period, a semicolon, etc.). This terminating character is not removed from the input stream. The function {\tt IPEXPREADR} has the same specification as {\tt IPEXPREAD}, with the difference that it {\em does} remove the terminating character. \subsection{Recursive polynomials over $\BbbQ$} For $r$-variate recursive polynomials over $\BbbQ$ the algorithms {\tt RPREAD} and \linebreak {\tt RPWRITE} are the corresponding input and output routines. The situation for rational polynomials is essentially the same as that for integral polynomials with the exception that the base coefficients may be rational numbers. The same freedoms on valid input apply and an arbitrary number of spaces may be inserted before and after '\verb@/@'. If the denominator of a base coefficient is 1 then only the numerator is in the external canonical representation. As an example, the external canonical representation of $\frac{2}{7}x^3-65x^2+5x+\frac{12}{4}$ is \verb@(2/7x^3-65x^2+5x+12/4)@ which, among many other possible variations, may be input as \verb@(2/7x^ 3- 65 x^2 + 5/1x+12/ 4)@. It should be noted that the rational base coefficients are not reduced to lowest terms when converted to internal representation. Corresponding to {\tt IUPWRITE} is {\tt RUPWRITE} which, again, need not concern the user. For rational polynomials there are also input functions for reading polynomial expressions. Here the name of the top level function is {\tt RPEXPREAD}. The input format here is the same as in the integral case, except that numbers may be rational. \subsection{Distributive polynomials over $\BbbZ$} The external canonical representation of sparse {\em distributive} polynomials over $\BbbZ$ is as follows. The entire polynomial is enclosed in parentheses. Each term is made up of the integer coefficient followed by the variables having positive exponents with each variable separated from its corresponding exponent by a caret. The coefficient and each variable-exponent pair is separated by a single space. As was the case for recursive polynomials, coefficients and exponents with a magnitude of 1 are suppressed as are variables with exponent 0. For example, the polynomial $2x^3y^5-xy^3-4y+x+1$ will be expressed in external canonical form as \verb@( 2 x^3 y^5 - x y^3 -4 y + x +1 )@. The algorithms {\tt DIIPREAD} and {\tt DIIPWRITE} are the input and output routines for distributive polynomials over $\BbbZ$. {\tt DIIPREAD} takes as input a variable list \verb@V@ = \verb@(@$v_1,\ldots,v_r$\verb@)@ and reads a distributive polynomial in external canonical form from the input stream. The ordering of the variables in \verb@V@ is significant and the variables in each term of the polynomial that is read must appear in the same order that they appear in \verb@V@ and the terms must be ordered in descending degree in $v_r$. For example, if\space \verb@V@ = \verb@(x,y,z)@ then \verb@(4 z^5 - y^2 z^4 + 9 x y z)@ is valid but \verb@(4 z^5 + 9 y x z - y^2 z^4)@ is not for two reasons---first, \verb@y@ appears before \verb@x@ in the term \verb@9 y x z@ and second, the term \verb@9 y x z@ appears before \verb@- y^2 z^4@ which violates the rule that terms must appear in order of descending degree in \verb@z@. Additionally, if there are two terms with the same degree in $v_r$ then they should be ordered according to descending degree in $v_{r-1}$ and so on. Coefficients may be separated from the variables by an arbitrary number of spaces (including no space at all). Variables must be separated by at least one space if there is no exponent explicitly given, otherwise an arbitrary number of spaces may separate them. For example \verb@(4z^5 - y^2z^4 + 9x y z)@ is valid but \verb@(4z^5 - y^2z^4 + 9xyz)@ is not since \verb@xyz@ will be treated as a single variable. \subsection{Distributive polynomials over $\BbbQ$} Distributive polynomials over $\BbbQ$ may be read in and written out using the algorithms {\tt DIRPREAD} and {\tt DIRPWRITE}. The only difference between rational distributive polynomials and integral distributive polynomials is that the base coefficients may be rational numbers and not just integers. It should be clear after reading the preceding subsections what constitutes valid input and we will not discuss this matter further. \subsection{Conversion Between Recursive and Distributive\protect\newline Representation} Converting recursive polynomials to distributive polynomials can be achieved by using {\tt DIPFP} which, given a polynomial in recursive internal representation, computes an equivalent one in distributive internal representation. In the other direction, namely to convert from distributive to recursive representation, the algorithm {\tt PFDIP} is provided. Both {\tt DIPFP} and {\tt PFDIP} work for polynomials over either $\BbbZ$ or $\BbbQ$ but the number of variables must be specified. For example, if \verb@A@ is a polynomial over $\BbbQ$ in internal recursive representation and the user wants to display \verb@A@ in external distributive representation then the code \begin{center} \verb@DIRPWRITE(r,DIPFP(r,A),V);@ \end{center} where \verb@r@ is equal to the number of variables and \verb@V@ is a list of \verb@r@ variables, will suffice. \subsection{Polynomials over $\BbbZ_m$} The input and output routines for polynomials over $\BbbZ$ work equally well for polynomials over $\BbbZ_m$. saclib2.2.8/sysdep/doc/user_guide/saclib.ilg0000664002275300236100000000047614017255270020120 0ustar wcbrownscsThis is makeindex, portable version 2.12 [26-May-1993]. Scanning input file saclib.idx....done (691 entries accepted, 0 rejected). Sorting entries........done (7150 comparisons). Generating output file saclib.ind....done (748 lines written, 0 warnings). Output written in saclib.ind. Transcript written in saclib.ilg. saclib2.2.8/sysdep/doc/user_guide/cAsMA.tex0000664002275300236100000000532114017255270017626 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Modular Digit Arithmetic} \begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt c <- MDSUM(m,a,b) }]\index{MDSUM} Modular digit sum. \item[{\tt c <- MDDIF(m,a,b) }]\index{MDDIF} Modular digit difference. \item[{\tt b <- MDNEG(m,a) }]\index{MDNEG} Modular digit negative. \item[{\tt c <- MDPROD(m,a,b) }]\index{MDPROD} Modular digit product. \item[{\tt c <- MDQ(m,a,b) }]\index{MDQ} Modular digit quotient. \item[{\tt b <- MDINV(m,a) }]\index{MDINV} Modular digit inverse. \item[{\tt b <- MDEXP(m,a,n) }]\index{MDEXP} Modular digit exponentiation. \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt a <- MDCRA(m1,m2,mp1,a1,a2) }]\index{MDCRA} Modular digit chinese remainder algorithm. \item[{\tt L <- MDLCRA(m1,m2,L1,L2) }]\index{MDLCRA} Modular digit list chinese remainder algorithm. \item[{\tt b <- MDHOM(m,A) }]\index{MDHOM} Modular digit homomorphism. {\em Computes $n \mod m$.} \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt a <- MDRAN(m) }]\index{MDRAN} Modular digit, random. \end{description} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Modular Integer Arithmetic} \begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt C <- MISUM(M,A,B) }]\index{MISUM} Modular integer sum. \item[{\tt C <- MIDIF(M,A,B) }]\index{MIDIF} Modular integer difference. \item[{\tt B <- MINEG(M,A) }]\index{MINEG} Modular integer negation. \item[{\tt C <- MIPROD(M,A,B) }]\index{MIPROD} Modular integer product. \item[{\tt C <- MIQ(M,A,B) }]\index{MIQ} Modular integer quotient. \item[{\tt B <- MIINV(M,A) }]\index{MIINV} Modular integer inverse. \item[{\tt B <- MIEXP(M,A,N) }]\index{MIEXP} Modular integer exponentiation. \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt As <- MIDCRA(M,m,mp,A,a) }]\index{MIDCRA} Modular integer digit chinese remainder algorithm. \item[{\tt As <- MIHOM(M,A) }]\index{MIHOM} Modular integer homomorphism. {\em Computes $n \mod m$.} \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt R <- MIRAN(M) }]\index{MIRAN} Modular integer, random. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt B <- SMFMI(M,A) }]\index{SMFMI} Symmetric modular from modular integer. {\em Computes the isomorphism from $\BbbZ_m$ to $\{-\left\lfloor\frac{m}{2}\right\rfloor+1, \ldots, \left\lfloor\frac{m}{2}\right\rfloor\}$.} \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cAN.tex0000664002275300236100000005366414017255270017360 0ustar wcbrownscs\section{Mathematical Preliminaries} An algebraic number is a number that satisfies a rational polynomial equation. An algebraic number $\alpha$ is represented by an irreducible polynomial, $A(x)$, such that $A(\alpha) = 0$. A real algebraic number, is a real number that is also an algebraic number, and it is represented by an irreducible polynomial and an isolating interval to distinguish it from its real conjugates. The collection of algebraic numbers forms a field containing the real algebraic numbers as a subfield. Since $A(x)$ is irreducible, the extension field $Q(\alpha)$ obtained by adjoining $\alpha$ to the rational number field is isomorphic to $Q[x]/(A(x))$ and elements of $Q(\alpha)$ are represented by polynomials whose degrees are less than the degree of $A(x)$. If $\alpha$ is real then $Q(\alpha)$ is an ordered field and sign computations can be performed using the isolating interval for $\alpha$. \section{Purpose} The \saclib\ algebraic number arithmetic package provides algorithms for performing arithmetic with algebraic numbers, with elements of an algebraic number field, and with polynomials whose coefficients belong to an algebraic number field. There are algorithms for computing the gcd of two polynomials with algebraic number coefficients and for factoring a polynomial with algebraic number coefficients. Algorithms are also provided for performing sign computations in a real algebraic number field and for isolating the real roots of a polynomial with real algebraic number coefficients. \section{Methods and Algorithms} Algorithms for performing algebraic number arithmetic use resultant computations. Let $A(x) = \sum_{i=0}^ma_ix^i = a_m \prod_{i=1}^m(x-\alpha_i)$ be the integral minimal polynomial for $\alpha = \alpha_1$ and let $B(y) = \sum_{j=0}^n b_jy^j = b_n \prod_{j=1}^n (y - \beta_j)$ be the integral minimal polynomial for $\beta = \beta_1$. The minimal polynomial for $\alpha + \beta$ is a factor of $\res_x(A(x),B(y-x))$ and the minimal polynomial for $\alpha \cdot \beta$ is a factor of $\res_x(A(x),x^nB(y/x))$. If $\alpha$ and $\beta$ are real algebraic numbers, the particular factor can be found by using the isolating intervals for $\alpha$ and $\beta$. The algorithms {\tt ANSUM} and {\tt ANPROD} use these ideas to perform addition and multiplication in the field of real algebraic numbers. Subtraction and division can be performed by negating and adding and inverting and multiplying respectively. The minimal polynomial of $-\alpha$ is $A(-x)$ and the minimal polynomial of $1/\alpha$ is $x^mA(1/x)$. These operations are provided by the algorithms {\tt IUPNT} and {\tt PRT} in the polynomial arithmetic system. Let $Q(\alpha)$ be the extension field of the rationals obtained by adjoining the algebraic number $\alpha$. Arithmetic in $Q(\alpha)$ is performed using the isomorphism $Q(\alpha) \cong Q[x]/(A(x))$. Elements of $Q(\alpha)$ are represented by polynomials whose degrees are less than the degree of the minimal polynomial of $\alpha$ and addition and multiplication are performed using polynomial multiplication and addition modulo the minimal polynomial. Inverses of elements of $Q(\alpha)$ are calculated by using a resultant computation. If $B(x)$ is the polynomial representing $\beta = B(\alpha)$ and $R = \res(A(x),B(x))$, then there exist polynomials $S(x)$ and $T(x)$ such that $A(x)S(x) + B(x)T(x) = R$. Since the minimal polynomial $A(x)$ is irreducible, the resultant does not equal zero and $B(\alpha)^{-1} = T(\alpha)/R$. The algorithm {\tt AFINV} uses this approach to compute inverses of elements of $Q(\alpha)$. If $\alpha \in I$ is a real algebraic number, then the field $Q(\alpha)$ can be ordered. The algorithm {\tt AFSIGN} computes the sign of an element of $Q(\alpha)$. The sign of $\beta = B(\alpha)$ is determined by refining the isolating interval, $I$, for $\alpha$ until it can be shown that $B(y)$ does not contain any roots in $I$. If there are no roots of $B(y)$ in the isolating interval $I$, then the sign of $B(\alpha)$ is equal to the sign of $B(y)$ for any $y \in I$. The algorithm {\tt AFSIGN} uses this approach and Descartes' rule of signs to determine how much to refine $I$. \saclib\ provides algorithms for computing with polynomials whose coefficients belong to an algebraic field $Q(\alpha)$. Besides basic arithmetic, there are algorithms for polynomial gcd computation, factorization, and real root isolation. The algorithm {\tt AFUPGC} uses the monic PRS to compute the gcd of two univariate polynomials. The algorithms {\tt AFUPGS}, {\tt AFUPSF}, and {\tt AFUPSB} use this algorithm to compute greatest squarefree divisors, squarefree factorization, and a squarefree basis respectively. Algorithms are also provided to isolate the real roots of a polynomial whose coefficients belong to a real algebraic number field. Both the Collins-Loos algorithm ({\tt AFUPRICL}) and the coefficient sign variation method ({\tt AFUPRICS}) are provided. An algebraic number may arise as a solution of a polynomial with algebraic number coefficients. The norm can be used to find a defining polynomial with integral coefficients. Let $B(\alpha,y)$ be a polynomial with coefficients in $Q(\alpha)$. The norm of $B(\alpha,y)$ is the rational polynomial $\norm(B\alpha,y)) = \prod_{i=1}^m B(\alpha_i,y)$. The norm can be computed with the resultant computation $res_x(A(x),B(x,y))$ which produces a polynomial similar to the norm. The algorithm {\tt AFPNORM} uses this approach to compute the norm. The algorithm {\tt AFPNIP} returns the list of irreducible factors of the norm. If $\alpha$ is a real algebraic number, the isolating interval for $\alpha$ can be used to select the appropriate irreducible factor of the norm. This is done by the algorithm {\tt AFUPMPR}. As a special case, the minimal polynomial of $\beta = B(\alpha)$ can be computed by calculating the norm of the linear polynomial $y-B(\alpha)$. Since $y-B(\alpha)$ is irreducible the norm is a power of an irreducible polynomial, and the minimal polynomial can be obtained with a greatest squarefree divisor computation. The algorithm {\tt ANFAF} uses this approach to convert the representation of an element of an algebraic number field to its representation as an algebraic number. The algorithm {\tt AFUPFAC} uses the norm to factor a squarefree polynomial whose coefficients belong to an algebraic number field. Let $B^*(y) = \norm(B(\alpha,y))$, and let $\prod_{i=1}^t B^*_i(y)$ be the irreducible factorization of $B^*(y)$. Provided the norm is squarefree the irreducible factorization of $B(\alpha,y) = \prod_{i=1}^t\gcd(B(\alpha,y),B^*_i(y))$. If $B^*(y)$ is not squarefree, a translation, $B(\alpha,y-s\alpha)$, is computed whose norm is squarefree. The factorization of $B(\alpha,y)$ can be recovered from the factorization of the translated polynomial. \saclib\ also provides an algorithm for computing a primitive element of a multiple extension field. Let $\alpha$ and $\beta$ be algebraic numbers and consider the multiple extension field $Q(\alpha,\beta)$. The primitive element theorem states that there exists a primitive element $\gamma$ such that $Q(\alpha,\beta) = Q(\gamma)$. The algorithms {\tt ANPEDE} and {\tt ANREPE} provide a constructive version of this theorem. References: %\begin{thebibliography}{99} % %\bibitem{JJ} R. G. K. Loos: {\it Computing in Algebraic Extensions}, In ``Computer Algebra, Symbolic and Algebraic Computation'', pages 173--187. Jeremy R.\ Johnson: {\it Algorithms for polynomial real root isolation}. Technical Research Report OSU-CISRC-8/91-TR21, 1991. The Ohio State University, 2036 Neil Avenue Mall, Columbus, Ohio 43210, Phone: 614-292-5813. Barry Trager: {\it Algebraic Factoring and Rational Function Integration}, In ``SYMSAC '76: Proceedings of the 1976 ACM Symposium on Symbolic and Algebraic Computation'', pages 219--226. % %\end{thebibliography} \section{Definitions of Terms} \begin{description} \item[algebraic number]\index{number!algebraic}\index{algebraic!number} A solution of a rational polynomial equation. An algebraic number $\alpha$ is represented either by a rational minimal polynomial or an integral minimal polynomial. \item[algebraic integer]\index{integer!algebraic}\index{algebraic!integer} A solution of a monic integral polynomial equation. \item[real algebraic number]\index{number!real algebraic}\index{algebraic!number, real} A real number that is also an algebraic number. A real algebraic number is represented by an integral minimal polynomial and an acceptable isolating interval. \item[rational minimal polynomial]\index{polynomial!rational minimal} The rational minimal polynomial for an algebraic number $\alpha$ is the unique monic, irreducible rational polynomial $A(x)$ such that $A(\alpha) = 0$. \item[integral minimal polynomial]\index{polynomial!integral minimal} The integral minimal polynomial for an algebraic number $\alpha$ is the unique, positive, primitive, integral polynomial $A(x)$ such that $A(\alpha) = 0$. \item[acceptable isolating interval]\index{interval!isolating!acceptable} an isolating interval, $I$, for a real algebraic number $\alpha$, where $I$ is either a left-open and right-closed standard interval or a one-point interval. \item[algebraic field element]\index{algebraic!field element} an element of the extension field $Q(\alpha)$. $\beta \in Q(\alpha)$ is represented by a list $(r,B(y))$, where $\beta = rB(\alpha)$ and $r$ is a rational number and $B(y)$ is a primitive integral polynomial whose degree is less than the degree of the minimal polynomial of $\alpha$. \end{description} \section{Representation} There are several different representations for elements of $Q(\alpha)$. Let $A(x)$ be the integral minimal polynomial for an algebraic number $\alpha$ with $\deg(A(x)) = m$. An element $\beta$ of $Q(\alpha)$ can be uniquely represented by: \begin{enumerate} \item A rational polynomial, $B(x)$, whose degree is less than $m$ and such that $B(\alpha) = \beta$. \item A pair $(r,\overline{B}(x))$, where $r$ is a rational number, $\overline{B}(x)$ is a positive primitive integral polynomial, and $\beta = B(\alpha) = r \overline{B}(\alpha)$. \end{enumerate} The default representation is (2). The algorithm {\tt AFCR} converts representation (1) to (2), and the algorithm {\tt AFICR} converts representation (2) to (1). Let $Z[\alpha]$ denote the $Z$-module with basis $1,\alpha,\alpha^2,\ldots,\alpha^{m-1}$. Elements of $Z[\alpha]$ are represented by integral polynomials whose degree is less than $m$. If $\alpha$ is an algebraic integer, then $Z[\alpha]$ is a ring. If an algorithm does not require division or reduction by the minimal polynomial, operations in $Q(\alpha)$ can be replaced with operations in $Z[\alpha]$. When this is possible, efficiency is gained by using the integral representation $Z[\alpha]$. An important example is polynomial real root isolation. Let $P(\alpha,y)$ be a polynomial in $Q(\alpha)[y]$ and let $d$ be the greatest common divisor of the denominators of the coefficients of $P(\alpha,y)$. Then $dP(\alpha,y)$ is in $Z[\alpha,y]$ and has the same roots as $P(\alpha,y)$. Moreover, the coefficient sign variation method for real root isolation only uses operations which can be performed in $Z[\alpha]$. The name of algorithms which operate in $Z[\alpha]$ begin with the letters {\tt AM}. The algorithm ${\tt AMPSAFP}(r,P)$ computes a polynomial $\overline{P} \in Z[\alpha,X1,\ldots,Xr]$ which is similar to the polynomial $P \in Q(\alpha)[X1,\ldots,Xr]$. The algorithm {\tt AIFAN} computes an algebraic integer $\overline{\alpha}$ such that $Q(\alpha) = Q(\overline{\alpha})$. \section{Functions} \begin{description} \item[Algebraic Number Arithmetic] \ \ \begin{description} \item[{\tt ANIIPE(M,I,N,J,t,L; S,k,K) }]\index{ANIIPE} Algebraic number isolating interval for a primitive element \item[{\tt ANPROD(A,I,B,J; C,K) }]\index{ANPROD} Algebraic number product \item[{\tt ANSUM(A,I,B,J;C,K) }]\index{ANSUM} Algebraic number sum \item[{\tt ANPEDE(A,B;C,t) }]\index{ANPEDE} Algebraic number primitive element for a double extension \item[{\tt b <- ANREPE(M,A,B,t) }]\index{ANREPE} Algebraic number represent element of a primitive extension \end{description} \item[Algebraic Field Arithmetic] \ \ \begin{description} \item[{\tt c <- AFDIF(a,b) }]\index{AFDIF} Algebraic number field element difference \item[{\tt b <- AFINV(M,a) }]\index{AFINV} Algebraic number field element inverse \item[{\tt b <- AFNEG(a) }]\index{AFNEG} Algebraic number field negative \item[{\tt c <- AFPROD(P,a,b) }]\index{AFPROD} Algebraic number field element product \item[{\tt c <- AFQ(M,a,b) }]\index{AFQ} Algebraic number field quotient \item[{\tt c <- AFSUM(a,b) }]\index{AFSUM} Algebraic number field element sum \end{description} \item[Real Algebraic Number Sign and Order Computation] \ \ \begin{description} \item[{\tt t <- AFCOMP(M,I,a,b) }]\index{AFCOMP} Algebraic number field comparison \item[{\tt s <- AFSIGN(M,I,a) }]\index{AFSIGN} Algebraic number field sign \item[{\tt s <- AMSIGN(M,I,a) }]\index{AMSIGN} Algebraic module sign \item[{\tt AMSIGNIR(M,I,a;s,Is) }]\index{AMSIGNIR} Algebraic module sign, interval refinement \end{description} \item[Algebraic Polynomial Arithmetic] \ \ \begin{description} \item[{\tt C <- AFPAFP(r,M,a,B) }]\index{AFPAFP} Algebraic number field polynomial algebraic number field element product \item[{\tt C <- AFPAFQ(r,M,A,b) }]\index{AFPAFQ} Algebraic number field polynomial algebraic number field element quotient \item[{\tt C <- AFPDIF(r,A,B) }]\index{AFPDIF} Algebraic number field polynomial difference \item[{\tt Ap <- AFPMON(r,M,A) }]\index{AFPMON} Algebraic number field polynomial monic \item[{\tt B <- AFPNEG(r,A) }]\index{AFPNEG} Algebraic number field polynomial negative \item[{\tt C <- AFPPR(r,M,A,B) }]\index{AFPPR} Algebraic number field polynomial product \item[{\tt AFPQR(r,M,A,B; Q,R) }]\index{AFPQR} Algebraic number field polynomial quotient and remainder \item[{\tt C <- AFPSUM(r,A,B) }]\index{AFPSUM} Algebraic number field polynomial sum \end{description} \item[Algebraic Polynomial Differentiation and Integration] \ \ \begin{description} \item[{\tt B <- AFPDMV(r,M,A) }]\index{AFPDMV} Algebraic number field polynomial derivative, main variable \item[{\tt B <- AFPINT(r,M,A,b) }]\index{AFPINT} Algebraic number field polynomial integration \item[{\tt B <- AMPDMV(r,M,A) }]\index{AFPDMV} Algebraic module polynomial derivative, main variable \end{description} \item[Algebraic Polynomial Factorization] \ \ \begin{description} \item[{\tt F <- AFUPFAC(M,B) }]\index{AFUPFAC} Algebraic number field univariate polynomial factorization \item[{\tt L <- AFUPSF(M,A) }]\index{AFUPSF} Algebraic number field univariate polynomial squarefree factorization \end{description} \item[Algebraic Polynomial Greatest Common Divisors] \ \ \begin{description} \item[{\tt AFUPGC(M,A,B; C,Ab,Bb) }]\index{AFUPGC} Algebraic number field univariate polynomial greatest common divisor and cofactors \item[{\tt B <- AFUPGS(M,A) }]\index{AFUPGS} Algebraic number field polynomial greatest squarefree divisor \end{description} \item[Algebraic Polynomial Norm Computation] \ \ \begin{description} \item[{\tt L <- AFPNIP(M,A) }]\index{AFPNIP} Algebraic number field polynomial normalize to integral polynomial \item[{\tt Bs <- AFPNORM(r,M,B) }]\index{AFPNORM} Algebraic number field polynomial norm. \end{description} \item[Algebraic Polynomial Substitution and Evaluation] \ \ \begin{description} \item[{\tt C <- AFPCMV(r,M,A,B) }]\index{AFPCMV} Algebraic number field polynomial composition in main variable \item[{\tt B <- AFPEMV(r,M,A,a) }]\index{AFPEMV} Algebraic number field polynomial evaluation of main variable \item[{\tt B <- AFPEV(r,M,A,i,a) }]\index{AFPEV} Algebraic number field polynomial evaluation \item[{\tt B <- AFPME(r,M,A,b) }]\index{AFPME} Algebraic number field polynomial multiple evaluation \item[{\tt s <- AFUPSR(M,I,A,c) }]\index{AFUPSR} Algebraic number field univariate polynomial, sign at a rational point \item[{\tt s <- AMUPBES(M,I,A,c) }]\index{AMUPBES} Algebraic module univariate polynomial, binary rational evaluation of sign. \item[{\tt s <- AMUPSR(M,I,A,c) }]\index{AMUPSR} Algebraic module univariate polynomial, sign at a rational point \item[{\tt B <- IPAFME(r,M,A,b) }]\index{IPAFME} Integral polynomial, algebraic number field multiple evaluation \item[{\tt B <- RPAFME(r,M,A,b) }]\index{RPAFME} Rational polynomial, algebraic number field multiple evaluation \end{description} \item[Algebraic Polynomial Transformations] \ \ \begin{description} \item[{\tt B <- AMUPBHT(A,k) }]\index{AMUPBHT} Algebraic module univariate polynomial binary homothetic transformation \item[{\tt B <- AMUPNT(A) }]\index{AMUPNT} Algebraic module univariate polynomial negative transformation \item[{\tt B <- AMUPTR(A,h) }]\index{AMUPTR} Algebraic module univariate polynomial translation \item[{\tt B <- AMUPTR1(A) }]\index{AMUPTR1} Algebraic module univariate polynomial translation by 1 \end{description} \item[Real Algebraic Polynomial Real Root Isolation] \ \ \begin{description} \item[{\tt N <- AFUPBRI(M,I,L) }]\index{AFUPBRI} Algebraic number field univariate polynomial basis real root isolation \item[{\tt AFUPMPR(M,I,B,J,L; Js,j) }]\index{AFUPMPR} Algebraic number field polynomial minimal polynomial of a real root \item[{\tt b <- AFUPRB(M,I,A) }]\index{AFUPRB} Algebraic number field univariate polynomial root bound \item[{\tt L <- AFUPRICL(M,I,A) }]\index{AFUPRICL} Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm \item[{\tt L <- AFUPRICS(M,I,A) }]\index{AFUPRICS} Algebraic number field univariate polynomial real root isolation, coefficient sign variation method \item[{\tt a <- AFUPRL(M,A) }]\index{AFUPRL} Algebraic number field univariate polynomial, root of a linear polynomial \item[{\tt n <- AFUPVAR(M,I,A) }]\index{AFUPVAR} Algebraic number field univariate polynomial variations \item[{\tt AMUPMPR(M,I,B,J,L; Js,j) }]\index{AMUPMPR} Algebraic module univariate polynomial minimal polynomial of a real root \item[{\tt L <- AMUPRICS(M,I,A) }]\index{AMUPRICS} Algebraic module univariate polynomial real root isolation, coefficient sign variation method \item[{\tt AMUPRICSW(M,I,A;L,Is) }]\index{AMUPRICSW} Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals \item[{\tt AMUPRINCS(M,I,A,a,b;L,Is) }]\index{AMUPRINCS} Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method \item[{\tt AMUPVARIR(M,I,A; n,J) }]\index{AMUPVARIR} Algebraic module univariate polynomial variations, interval refinement \end{description} \item[Algebraic Polynomial Real Root Refinement] \ \ \begin{description} \item[{\tt Js <- AFUPIIR(M,I,B,J) }]\index{AFUPIIR} Algebraic number field polynomial isolating interval refinement \item[{\tt AFUPIIWS(M,I,A,L) }]\index{AFUPIIWS} Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint \item[{\tt AFUPRLS(M,I,A1,A2,L1,L2; Ls1,Ls2) }]\index{AFUPRLS} Algebraic number field univariate polynomial real root list separation \item[{\tt Js <- AFUPRRI(M,I,A,B,J,s1,t1) }]\index{AFUPRRI} Algebraic number field univariate polynomial relative real root isolation \item[{\tt AFUPRRS(M,I,A1,A2,I1,I2; Is1,Is2,s) }]\index{AFUPRRS} Algebraic number field univariate polynomial real root separation \item[{\tt Js <- AMUPIIR(M,I,B,J) }]\index{AMUPIIR} Algebraic module polynomial isolating interval refinement \item[{\tt AMUPIIWS(M,I,A,L) }]\index{AMUPIIWS} Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint \item[{\tt AMUPRLS(M,I,A1,A2,L1,L2; Ls1,Ls2) }]\index{AMUPRLS} Algebraic module univariate polynomial real root list separation \item[{\tt AMUPRRS(M,I,A1,A2,I1,I2; Is1,Is2,s) }]\index{AMUPRRS} Algebraic module univariate polynomial real root separation \end{description} \item[Conversion] \ \ \begin{description} \item[{\tt Ap <- AFCR(A) }]\index{AFCR} Algebraic number field element convert representation \item[{\tt a <- AFFINT(M) }]\index{AFFINT} Algebraic number field element from integer \item[{\tt a <- AFFRN(R) }]\index{AFFRN} Algebraic number field element from rational number \item[{\tt Ap <- AFICR(A) }]\index{AFICR} Algebraic number field element inverse convert representation \item[{\tt B <- AFPCR(r,A) }]\index{AFPCR} Algebraic number field polynomial convert representation \item[{\tt B <- AFPFIP(r,A) }]\index{AFPFIP} Algebraic number field polynomial from integral polynomial \item[{\tt B <- AFPFRP(r,A) }]\index{AFPFRP} Algebraic number field polynomial from rational polynomial \item[{\tt B <- AFPICR(r,A) }]\index{AFPICR} Algebraic number field polynomial inverse convert representation \item[{\tt AIFAN(M; mh,Mh) }]\index{AIFAN} Algebraic integer from algebraic number \item[{\tt B <- AMPSAFP(r,A) }]\index{AMPSAFP} Algebraic module polynomial similar to algebraic field polynomial \item[{\tt ANFAF(M,I,a; N,J) }]\index{ANFAF} Algebraic number from algebraic number field element \end{description} \item[Input/Output] \ \ \begin{description} \item[{\tt AFDWRITE(M,I,b,n) }]\index{AFDWRITE} Algebraic number field, decimal write \item[{\tt AFPWRITE(r,A,V,v) }]\index{AFPWRITE} Algebraic number field polynomial write \item[{\tt AFUPWRITE(A,vA,vc) }]\index{AFUPWRITE} Algebraic number field univariate polynomial write \item[{\tt AFWRITE(A,v) }]\index{AFWRITE} Algebraic field element write \item[{\tt ANDWRITE(M,I,n) }]\index{ANDWRITE} Algebraic number decimal write \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/KWIC.tex0000664002275300236100000062031514017255270017445 0ustar wcbrownscs\begin{description} \item[absolute] \ \ \begin{description} \item[ABS] Absolute value. \item[IABSF] Integer absolute value function. \item[IPABS] Integral polynomial absolute value. \item[RNABS] Rational number absolute value. \item[SFRABS] Single-precision floating-point real absolute value. \end{description} \item[adjoin] \ \ \begin{description} \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[VIAZ] Vector of integers, adjoin zeros. \end{description} \item[advance] \ \ \begin{description} \item[AADV] Arithmetic advance. \item[ADV] Advance. \item[ADV2] Advance 2. \item[ADV3] Advance 3. \item[ADV4] Advance 4. \end{description} \item[after] \ \ \begin{description} \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \end{description} \item[algebraic] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFDWRITE] Algebraic number field, decimal write. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFNEG] Algebraic number field negative. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPROD] Algebraic number field element product. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFQ] Algebraic number field quotient. \item[AFSIGN] Algebraic number field sign. \item[AFSUM] Algebraic number field element sum. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AFWRITE] Algebraic field element write. \item[AIFAN] Algebraic integer from algebraic number. \item[AIFAN] Algebraic integer from algebraic number. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMSIGN] Algebraic module sign. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[ANDWRITE] Algebraic number decimal write. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPROD] Algebraic number product. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[ANSUM] Algebraic number sum. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \end{description} \item[algorithm] \ \ \begin{description} \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRODK] Integer product, karatsuba algorithm. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \end{description} \item[allocation] \ \ \begin{description} \item[GCAMALLOC] Garbage collected array memory allocation. \end{description} \item[and] \ \ \begin{description} \item[DAND] Digit and. \end{description} \item[arguments] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \end{description} \item[arithmetic] \ \ \begin{description} \item[AADV] Arithmetic advance. \end{description} \item[array] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAGET] Garbage collected array get element. \item[GCAMALLOC] Garbage collected array memory allocation. \item[GCASET] Garbage collected array set element. \end{description} \item[assignment] \ \ \begin{description} \item[ASSPR] Assignment problem. \end{description} \item[associate] \ \ \begin{description} \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \end{description} \item[atom] \ \ \begin{description} \item[AREAD] Atom read. \item[AWRITE] Atom write. \item[ISATOM] Test for atom. \end{description} \item[augmentation] \ \ \begin{description} \item[IPSFBA] Integral polynomial squarefree basis augmentation. \end{description} \item[bachem] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \end{description} \item[backspace] \ \ \begin{description} \item[BKSP] Backspace. \end{description} \item[base] \ \ \begin{description} \item[DLOG2] Digit logarithm, base 2. \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[ILOG2] Integer logarithm, base 2. \item[PFBRE] Polynomial From Base Ring Element. \item[PLBCF] Polynomial leading base coefficient. \item[PTBCF] Polynomial trailing base coefficient. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[based] \ \ \begin{description} \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[basis] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[begin] \ \ \begin{description} \item[BEGINSACLIB] Begin SACLIB. \end{description} \item[berlekamp] \ \ \begin{description} \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \end{description} \item[beta] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[LBIM] List of BETA-integers merge. \end{description} \item[binary] \ \ \begin{description} \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[RNBCR] Rational number binary common representation. \end{description} \item[binomial] \ \ \begin{description} \item[IBCIND] Integer binomial coefficient induction. \item[IBCOEF] Integer binomial coefficient. \item[IBCPS] Integer binomial coefficient partial sum. \item[PBIN] Polynomial binomial. \end{description} \item[bisection] \ \ \begin{description} \item[RIB] Rational interval bisection. \end{description} \item[bit] \ \ \begin{description} \item[BITRAN] Bit, random. \end{description} \item[bound] \ \ \begin{description} \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IUPRB] Integral univariate polynomial root bound. \end{description} \item[bubble] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \end{description} \item[c] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \end{description} \item[calculation] \ \ \begin{description} \item[DPCC] Digit partial cosequence calculation. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \end{description} \item[cartesian] \ \ \begin{description} \item[CPLEXN] Cartesian product, lexicographically next. \end{description} \item[ceiling] \ \ \begin{description} \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[RNCEIL] Rational number, ceiling of. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \end{description} \item[cell] \ \ \begin{description} \item[LASTCELL] Last cell. \end{description} \item[character] \ \ \begin{description} \item[CLOUT] Character list out. \item[CREAD] Character read. \item[CREADB] Character read. \item[CWRITE] Character write. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[LKAHEAD] Character lookahead. \end{description} \item[characteristic] \ \ \begin{description} \item[CSFPAR] Characteristic set from partition. \item[CSINT] Characteristic set intersection. \item[CSSUB] Characteristic set subset. \item[CSUN] Characteristic set union. \item[SFCS] Set from characteristic set. \end{description} \item[chinese] \ \ \begin{description} \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \end{description} \item[choice] \ \ \begin{description} \item[IPCEVP] Integral polynomial, choice of evaluation points. \end{description} \item[circle] \ \ \begin{description} \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \end{description} \item[clock] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \item[CLOCK] Clock. \end{description} \item[coarsest] \ \ \begin{description} \item[IPCSFB] Integral polynomial coarsest squarefree basis. \end{description} \item[coefficient] \ \ \begin{description} \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[IBCIND] Integer binomial coefficient induction. \item[IBCOEF] Integer binomial coefficient. \item[IBCPS] Integer binomial coefficient partial sum. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[PCL] Polynomial coefficient list. \item[PLBCF] Polynomial leading base coefficient. \item[PLDCF] Polynomial leading coefficient. \item[PTBCF] Polynomial trailing base coefficient. \end{description} \item[coefficients] \ \ \begin{description} \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[cofactor] \ \ \begin{description} \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \end{description} \item[cofactors] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \end{description} \item[collected] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAGET] Garbage collected array get element. \item[GCAMALLOC] Garbage collected array memory allocation. \item[GCASET] Garbage collected array set element. \end{description} \item[collection] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \item[GC] Garbage collection entry-point. \item[GCSI] Garbage collection, system independent. \end{description} \item[collector] \ \ \begin{description} \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \end{description} \item[collins] \ \ \begin{description} \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \end{description} \item[column] \ \ \begin{description} \item[MICINS] Matrix of integers column insertion. \item[MICS] Matrix of integers column sort. \item[MINNCT] Matrix of integers, non-negative column transformation. \end{description} \item[combination] \ \ \begin{description} \item[ILCOMB] Integer linear combination. \item[VILCOM] Vector of integers linear combination. \end{description} \item[combine] \ \ \begin{description} \item[IPFLC] Integral polynomial factor list combine. \end{description} \item[command] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \end{description} \item[common] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[ILCM] Integer least common multiple. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[RNBCR] Rational number binary common representation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[comparison] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[DVCMP] Degree vector comparison. \item[ICOMP] Integer comparison. \item[RILC] Rational interval length comparison. \item[RNCOMP] Rational number comparison. \item[VCOMP] Vector comparison. \end{description} \item[complex] \ \ \begin{description} \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \end{description} \item[composition] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[COMP] Composition. \item[COMP2] Composition 2. \item[COMP3] Composition 3. \item[COMP4] Composition 4. \end{description} \item[concatenation] \ \ \begin{description} \item[CCONC] Constructive concatenation. \item[CONC] Concatenation. \item[LCONC] List concatenation. \end{description} \item[conjugation] \ \ \begin{description} \item[SFCCON] Single-precision floating-point complex conjugation. \end{description} \item[constant] \ \ \begin{description} \item[IPCONST] Integral polynomial constant. \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \end{description} \item[construction] \ \ \begin{description} \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \end{description} \item[constructive] \ \ \begin{description} \item[CCONC] Constructive concatenation. \item[CINV] Constructive inverse. \end{description} \item[content] \ \ \begin{description} \item[IPC] Integral polynomial content. \item[IPCPP] Integral polynomial content and primitive part. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \end{description} \item[contents] \ \ \begin{description} \item[IPLCPP] Integral polynomial list of contents and primitive parts. \end{description} \item[conversion] \ \ \begin{description} \item[IIC] Isolating interval conversion. \end{description} \item[convert] \ \ \begin{description} \item[AFCR] Algebraic number field element convert representation. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[GCA2PTR] Convert garbage collected array handle to C pointer. \end{description} \item[cosequence] \ \ \begin{description} \item[DPCC] Digit partial cosequence calculation. \end{description} \item[cyclic] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PERMCY] Permutation, cyclic. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \end{description} \item[deallocation] \ \ \begin{description} \item[GCAFREE] Garbage collected array memory deallocation. \end{description} \item[decimal] \ \ \begin{description} \item[AFDWRITE] Algebraic number field, decimal write. \item[ANDWRITE] Algebraic number decimal write. \item[RNDWRITE] Rational number decimal write. \end{description} \item[declare] \ \ \begin{description} \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \end{description} \item[decomposition] \ \ \begin{description} \item[PSDSV] Polynomial special decomposition, specified variable. \end{description} \item[default] \ \ \begin{description} \item[main] Default main routine. \end{description} \item[degree] \ \ \begin{description} \item[DIPDEG] Distributive polynomial degree. \item[DVCMP] Degree vector comparison. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[PDEG] Polynomial degree. \item[PDEGSV] Polynomial degree, specified variable. \item[PDEGV] Polynomial degree vector. \item[PMDEG] Polynomial modified degree. \end{description} \item[denominator] \ \ \begin{description} \item[RNDEN] Rational number denominator. \end{description} \item[dense] \ \ \begin{description} \item[DMPPRD] Dense modular polynomial product. \item[DMPSUM] Dense modular polynomial sum. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[DPFP] Dense polynomial from polynomial. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \end{description} \item[derivative] \ \ \begin{description} \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[IPDER] Integral polynomial derivative. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[MUPDER] Modular univariate polynomial derivative. \item[RPDMV] Rational polynomial derivative, main variable. \end{description} \item[determinant] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MMDDET] Matrix of modular digits determinant. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \end{description} \item[difference] \ \ \begin{description} \item[AFDIF] Algebraic number field element difference. \item[AFPDIF] Algebraic number field polynomial difference. \item[IDIF] Integer difference. \item[IPDIF] Integral polynomial difference. \item[MDDIF] Modular digit difference. \item[MIDIF] Modular integer difference. \item[MIPDIF] Modular integral polynomial difference. \item[MPDIF] Modular polynomial difference. \item[RNDIF] Rational number difference. \item[RPDIF] Rational polynomial difference. \item[SDIFF] Set difference. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFRDIF] Single-precision floating-point real difference. \item[USDIFF] Unordered set difference. \item[VIDIF] Vector of integers difference. \end{description} \item[digit] \ \ \begin{description} \item[DAND] Digit and. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[DIGIT] Digit. \item[DLOG2] Digit logarithm, base 2. \item[DNIMP] Digit non-implication. \item[DNOT] Digit not. \item[DOR] Digit or. \item[DPCC] Digit partial cosequence calculation. \item[DPGEN] Digit prime generator. \item[DPR] Digit product. \item[DQR] Digit quotient and remainder. \item[DRAN] Digit, random. \item[DRANN] Digit, random non-negative. \item[DSQRTF] Digit square root function. \item[GDPGEN] Gaussian digit prime generator. \item[IDIPR2] Integer digit inner product, length 2. \item[IDPR] Integer-digit product. \item[IDQ] Integer-digit quotient. \item[IDQR] Integer-digit quotient and remainder. \item[IDREM] Integer-digit remainder. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDDIF] Modular digit difference. \item[MDEXP] Modular digit exponentiation. \item[MDHOM] Modular digit homomorphism. \item[MDINV] Modular digit inverse. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MDNEG] Modular digit negative. \item[MDPROD] Modular digit product. \item[MDQ] Modular digit quotient. \item[MDRAN] Modular digit, random. \item[MDSUM] Modular digit sum. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MPMDP] Modular polynomial modular digit product. \item[REM] GAMMA-digit remainder. \end{description} \item[digits] \ \ \begin{description} \item[MMDDET] Matrix of modular digits determinant. \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[diophantine] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[discriminant] \ \ \begin{description} \item[IPDSCR] Integral polynomial discriminant. \end{description} \item[disjoint] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \end{description} \item[display] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \end{description} \item[distinct] \ \ \begin{description} \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[SDR] System of distinct representatives. \end{description} \item[distributive] \ \ \begin{description} \item[DIIPREAD] Distributive integral polynomial read. \item[DIIPWRITE] Distributive integral polynomial write. \item[DIPDEG] Distributive polynomial degree. \item[DIPFP] Distributive polynomial from polynomial. \item[DIPINS] Distributive polynomial, insert term. \item[DIRPREAD] Distributive rational polynomial read. \item[DIRPWRITE] Distributive rational polynomial write. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[PFDIP] Polynomial from distributive polynomial. \item[RPDWRITE] Rational Polynomial Distributive Write. \end{description} \item[divided] \ \ \begin{description} \item[PDBORD] Polynomial divided by order. \end{description} \item[division] \ \ \begin{description} \item[IDP2] Integer division by power of 2. \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[PDPV] Polynomial division by power of variable. \end{description} \item[divisior] \ \ \begin{description} \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \end{description} \item[divisor] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[ILPDS] Integer large prime divisor search. \item[IMPDS] Integer medium prime divisor search. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[divisors] \ \ \begin{description} \item[ISPD] Integer small prime divisors. \end{description} \item[double] \ \ \begin{description} \item[ANPEDE] [Algebraic number primitive element for a double extension. \end{description} \item[doubly] \ \ \begin{description} \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \end{description} \item[element] \ \ \begin{description} \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPROD] Algebraic number field element product. \item[AFSUM] Algebraic number field element sum. \item[AFWRITE] Algebraic field element write. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[GCAGET] Garbage collected array get element. \item[GCASET] Garbage collected array set element. \item[LEINST] List element insertion. \item[LELTI] List element. \item[LEROT] List element rotation. \item[LIST1] List, 1 element. \item[PFBRE] Polynomial From Base Ring Element. \item[SFIRST] Set first element. \item[SLELTI] Set list element. \item[VIERED] Vector of integers, element reduction. \end{description} \item[elements] \ \ \begin{description} \item[LIST10] List, 10 elements. \item[LIST2] List, 2 elements. \item[LIST3] List, 3 elements. \item[LIST4] List, 4 elements. \item[LIST5] List, 5 elements. \end{description} \item[empty] \ \ \begin{description} \item[ISLIST] Test for non-empty list. \item[ISNIL] Test for empty list. \end{description} \item[end] \ \ \begin{description} \item[ENDSACLIB] End saclib. \end{description} \item[entry] \ \ \begin{description} \item[GC] Garbage collection entry-point. \end{description} \item[equal] \ \ \begin{description} \item[EQUAL] Equal. \end{description} \item[equality] \ \ \begin{description} \item[SEQUAL] Set equality. \end{description} \item[equation] \ \ \begin{description} \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \end{description} \item[error] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \end{description} \item[evaluation] \ \ \begin{description} \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPCEVP] Integral polynomial, choice of evaluation points. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPEVAL] Integral polynomial evaluation. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[MMPEV] Matrix of modular polynomials evaluation. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPEVAL] Modular polynomial evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPEMV] Rational polynomial evaluation, main variable. \end{description} \item[even] \ \ \begin{description} \item[EVEN] EVEN. \item[IEVEN] Integer even. \end{description} \item[exact] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \end{description} \item[exponential] \ \ \begin{description} \item[EXPF] Exponential function. \end{description} \item[exponentiation] \ \ \begin{description} \item[IEXP] Integer exponentiation. \item[IPEXP] Integral polynomial exponentiation. \item[MDEXP] Modular digit exponentiation. \item[MIEXP] Modular integer exponentiation. \item[MPEXP] Modular polynomial exponentiation. \end{description} \item[expression] \ \ \begin{description} \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[RPEXPREAD] Rational polynomial expression read. \end{description} \item[extended] \ \ \begin{description} \item[DEGCD] Digit extended greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IHEGCD] Integer half-extended greatest common divisor. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \end{description} \item[extension] \ \ \begin{description} \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANREPE] Algebraic number represent element of a primitive extension. \end{description} \item[extent] \ \ \begin{description} \item[EXTENT] Extent. \end{description} \item[factor] \ \ \begin{description} \item[IPFACTREAD] Integral polynomial factor read. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPFLC] Integral polynomial factor list combine. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[RPFACTREAD] Rational polynomial factor read. \end{description} \item[factorial] \ \ \begin{description} \item[IFACTL] Integer factorial. \end{description} \item[factorization] \ \ \begin{description} \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[IFACT] Integer factorization. \item[IPFAC] Integral polynomial factorization. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[ISFPF] Integral squarefree polynomial factorization. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \end{description} \item[failure] \ \ \begin{description} \item[FAIL] Failure handler. \end{description} \item[fermat] \ \ \begin{description} \item[FRESL] Fermat residue list. \item[FRLSM] Fermat residue list, single modulus. \end{description} \item[field] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFDWRITE] Algebraic number field, decimal write. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFNEG] Algebraic number field negative. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPROD] Algebraic number field element product. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFQ] Algebraic number field quotient. \item[AFSIGN] Algebraic number field sign. \item[AFSUM] Algebraic number field element sum. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AFWRITE] Algebraic field element write. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[ANFAF] Algebraic number from algebraic number field element. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \end{description} \item[finest] \ \ \begin{description} \item[IPFSFB] Integral polynomial finest squarefree basis. \end{description} \item[first] \ \ \begin{description} \item[FIRST] First. \item[FIRST2] First 2. \item[FIRST3] First 3. \item[FIRST4] First 4. \item[SFIRST] Set first element. \end{description} \item[floating] \ \ \begin{description} \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[floor] \ \ \begin{description} \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RNFLOR] Rational number, floor of. \end{description} \item[flush] \ \ \begin{description} \item[FILINE] Flush the input stream line. \end{description} \item[fourth] \ \ \begin{description} \item[FOURTH] Fourth. \end{description} \item[from] \ \ \begin{description} \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AIFAN] Algebraic integer from algebraic number. \item[ANFAF] Algebraic number from algebraic number field element. \item[CSFPAR] Characteristic set from partition. \item[DIPFP] Distributive polynomial from polynomial. \item[DPFP] Dense polynomial from polynomial. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[LFS] List from String. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[PFBRE] Polynomial From Base Ring Element. \item[PFDIP] Polynomial from distributive polynomial. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PUFP] Polynomial, univariate, from polynomial. \item[RNINT] Rational number from integer. \item[RPFIP] Rational polynomial from integral polynomial. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCS] Set from characteristic set. \item[SFIFI] Single-precision floating-point interval from integer. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMIP] Symmetric modular from modular integral polynomial. \end{description} \item[function] \ \ \begin{description} \item[DSQRTF] Digit square root function. \item[EXPF] Exponential function. \item[IABSF] Integer absolute value function. \item[ISIGNF] Integer sign function. \end{description} \item[gamma] \ \ \begin{description} \item[GREAD] Gamma-integer read. \item[GWRITE] Gamma-integer write. \item[REM] GAMMA-digit remainder. \end{description} \item[garbage] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \item[GC] Garbage collection entry-point. \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAGET] Garbage collected array get element. \item[GCAMALLOC] Garbage collected array memory allocation. \item[GCASET] Garbage collected array set element. \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \item[GCSI] Garbage collection, system independent. \end{description} \item[gaussian] \ \ \begin{description} \item[GDPGEN] Gaussian digit prime generator. \end{description} \item[gca] \ \ \begin{description} \item[ISGCA] Test for GCA handle. \end{description} \item[gelfond] \ \ \begin{description} \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \end{description} \item[general] \ \ \begin{description} \item[IPGSUB] Integral polynomial general substitution. \end{description} \item[generator] \ \ \begin{description} \item[DPGEN] Digit prime generator. \item[GDPGEN] Gaussian digit prime generator. \end{description} \item[get] \ \ \begin{description} \item[GCAGET] Garbage collected array get element. \end{description} \item[global] \ \ \begin{description} \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \end{description} \item[greatest] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[half] \ \ \begin{description} \item[IHEGCD] Integer half-extended greatest common divisor. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \end{description} \item[handle] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[ISGCA] Test for GCA handle. \end{description} \item[handler] \ \ \begin{description} \item[FAIL] Failure handler. \end{description} \item[hensel] \ \ \begin{description} \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[high] \ \ \begin{description} \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \end{description} \item[higher] \ \ \begin{description} \item[IPHDMV] Integral polynomial higher derivative, main variable. \end{description} \item[homomorphism] \ \ \begin{description} \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MDHOM] Modular digit homomorphism. \item[MIHOM] Modular integer homomorphism. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MPHOM] Modular polynomial homomorphism. \end{description} \item[homothetic] \ \ \begin{description} \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \end{description} \item[ideal] \ \ \begin{description} \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[ideas] \ \ \begin{description} \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[identity] \ \ \begin{description} \item[MIAIM] Matrix of integers, adjoin identity matrix. \end{description} \item[imaginary] \ \ \begin{description} \item[SFCIP] Single-precision floating-point complex, imaginary part. \end{description} \item[implication] \ \ \begin{description} \item[DNIMP] Digit non-implication. \end{description} \item[in] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \end{description} \item[independent] \ \ \begin{description} \item[GCSI] Garbage collection, system independent. \end{description} \item[induction] \ \ \begin{description} \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[IBCIND] Integer binomial coefficient induction. \item[IPRRII] Integral polynomial real root isolation induction. \end{description} \item[information] \ \ \begin{description} \item[INFOSACLIB] Write out usage information for SACLIB. \end{description} \item[inner] \ \ \begin{description} \item[IDIPR2] Integer digit inner product, length 2. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[input] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \item[FILINE] Flush the input stream line. \end{description} \item[insert] \ \ \begin{description} \item[DIPINS] Distributive polynomial, insert term. \end{description} \item[insertion] \ \ \begin{description} \item[LEINST] List element insertion. \item[LINS] List insertion. \item[LINSRT] List insertion. \item[MICINS] Matrix of integers column insertion. \end{description} \item[integer] \ \ \begin{description} \item[AFFINT] Algebraic number field element from integer. \item[AIFAN] Algebraic integer from algebraic number. \item[GREAD] Gamma-integer read. \item[GWRITE] Gamma-integer write. \item[IABSF] Integer absolute value function. \item[IBCIND] Integer binomial coefficient induction. \item[IBCOEF] Integer binomial coefficient. \item[IBCPS] Integer binomial coefficient partial sum. \item[ICOMP] Integer comparison. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IDIF] Integer difference. \item[IDIPR2] Integer digit inner product, length 2. \item[IDP2] Integer division by power of 2. \item[IDPR] Integer-digit product. \item[IDQ] Integer-digit quotient. \item[IDQR] Integer-digit quotient and remainder. \item[IDREM] Integer-digit remainder. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IEVEN] Integer even. \item[IEXP] Integer exponentiation. \item[IFACT] Integer factorization. \item[IFACTL] Integer factorial. \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[ILCM] Integer least common multiple. \item[ILCOMB] Integer linear combination. \item[ILOG2] Integer logarithm, base 2. \item[ILPDS] Integer large prime divisor search. \item[ILWRITE] Integer list write. \item[IMAX] Integer maximum. \item[IMIN] Integer minimum. \item[IMP2] Integer multiplication by power of 2. \item[IMPDS] Integer medium prime divisor search. \item[INEG] Integer negation. \item[IODD] Integer odd. \item[IORD2] Integer, order of 2. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPIP] Integral polynomial integer product. \item[IPIPP] Integral polynomial integer primitive part. \item[IPIQ] Integral polynomial integer quotient. \item[IPOWER] Integer power. \item[IPROD] Integer product. \item[IPRODK] Integer product, karatsuba algorithm. \item[IQ] Integer quotient. \item[IQR] Integer quotient and remainder. \item[IRAND] Integer, random. \item[IREAD] Integer read. \item[IREM] Integer remainder. \item[IROOT] Integer root. \item[ISEG] Integer segmentation. \item[ISIGNF] Integer sign function. \item[ISPD] Integer small prime divisors. \item[ISPT] Integer selfridge primality test. \item[ISQRT] Integer square root. \item[ISSUM] Integer shifted sum. \item[ISUM] Integer sum. \item[ITRUNC] Integer truncation. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IWRITE] Integer write. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MIDIF] Modular integer difference. \item[MIEXP] Modular integer exponentiation. \item[MIHOM] Modular integer homomorphism. \item[MIINV] Modular integer inverse. \item[MINEG] Modular integer negation. \item[MIPROD] Modular integer product. \item[MIQ] Modular integer quotient. \item[MIRAN] Modular integer, random. \item[MISUM] Modular integer sum. \item[RNINT] Rational number from integer. \item[SFIFI] Single-precision floating-point interval from integer. \item[SMFMI] Symmetric modular from modular integer. \end{description} \item[integers] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[LBIM] List of BETA-integers merge. \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[MICINS] Matrix of integers column insertion. \item[MICS] Matrix of integers column sort. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[VIAZ] Vector of integers, adjoin zeros. \item[VIDIF] Vector of integers difference. \item[VIERED] Vector of integers, element reduction. \item[VILCOM] Vector of integers linear combination. \item[VINEG] Vector of integers negation. \item[VISPR] Vector of integers scalar product. \item[VISUM] Vector of integers sum. \item[VIUT] Vector of integers, unimodular transformation. \end{description} \item[integral] \ \ \begin{description} \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[DIIPREAD] Distributive integral polynomial read. \item[DIIPWRITE] Distributive integral polynomial write. \item[IPABS] Integral polynomial absolute value. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPC] Integral polynomial content. \item[IPCEVP] Integral polynomial, choice of evaluation points. \item[IPCONST] Integral polynomial constant. \item[IPCPP] Integral polynomial content and primitive part. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPDER] Integral polynomial derivative. \item[IPDIF] Integral polynomial difference. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPDSCR] Integral polynomial discriminant. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPEVAL] Integral polynomial evaluation. \item[IPEXP] Integral polynomial exponentiation. \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[IPFAC] Integral polynomial factorization. \item[IPFACTREAD] Integral polynomial factor read. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPFLC] Integral polynomial factor list combine. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IPGSUB] Integral polynomial general substitution. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPINT] Integral polynomial integration. \item[IPIP] Integral polynomial integer product. \item[IPIPP] Integral polynomial integer primitive part. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQ] Integral polynomial integer quotient. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPMAXN] Integral polynomial maximum norm. \item[IPNEG] Integral polynomial negative. \item[IPNT] Integral polynomial negative transformation. \item[IPONE] Integral polynomial one. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPPOWREAD] Integral polynomial power read. \item[IPPP] Integral polynomial primitive part. \item[IPPROD] Integral polynomial product. \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[IPPSR] Integral polynomial pseudo-remainder. \item[IPQ] Integral polynomial quotient. \item[IPQR] Integral polynomial quotient and remainder. \item[IPRAN] Integral polynomial, random. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPREAD] Integral polynomial read. \item[IPRES] Integral polynomial resultant. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIGN] Integral polynomial sign. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IPSUB] Integral polynomial substitution. \item[IPSUM] Integral polynomial sum. \item[IPSUMN] Integral polynomial sum norm. \item[IPTERMREAD] Integral polynomial term read. \item[IPTPR] Integral polynomial truncated product. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRAN] Integral polynomial translation. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[IPTRUN] Integral polynomial truncation. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IPWRITE] Integral polynomial write. \item[ISFPF] Integral squarefree polynomial factorization. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPNT] Integral univariate polynomial negative transformation. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[IUPTPR] Integral univariate polynomial truncated product. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[IUPWRITE] Integral univariate polynomial write. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MAIPP] Matrix of integral polynomials product. \item[MIPDIF] Modular integral polynomial difference. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIPNEG] Modular integral polynomial negation. \item[MIPPR] Modular integral polynomial product. \item[MIPRAN] Modular integral polynomial, random. \item[MIPSUM] Modular integral polynomial sum. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[SMFMIP] Symmetric modular from modular integral polynomial. \end{description} \item[integration] \ \ \begin{description} \item[AFPINT] Algebraic number field polynomial integration. \item[IPINT] Integral polynomial integration. \item[RPIMV] Rational polynomial integration, main variable. \end{description} \item[interpolation] \ \ \begin{description} \item[MPINT] Modular polynomial interpolation. \end{description} \item[intersection] \ \ \begin{description} \item[CSINT] Characteristic set intersection. \item[SINTER] Set intersection. \item[USINT] Unordered set intersection. \end{description} \item[interval] \ \ \begin{description} \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[IIC] Isolating interval conversion. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[RIB] Rational interval bisection. \item[RIL] Rational interval length. \item[RILC] Rational interval length comparison. \item[RINEG] Rational interval negation. \item[RINT] Rational interval normalizing transformation. \item[RIPROD] Rational interval product. \item[RIRNP] Rational interval rational number product. \item[RISIGN] Rational interval sign. \item[RISUM] Rational interval sum. \item[SFIFI] Single-precision floating-point interval from integer. \end{description} \item[intervals] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \end{description} \item[introduction] \ \ \begin{description} \item[PINV] Polynomial introduction of new variables. \end{description} \item[inverse] \ \ \begin{description} \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[CINV] Constructive inverse. \item[INV] Inverse. \item[MDINV] Modular digit inverse. \item[MIINV] Modular integer inverse. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[RNINV] Rational number inverse. \end{description} \item[isolating] \ \ \begin{description} \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[IIC] Isolating interval conversion. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \end{description} \item[isolation] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[iupqs] \ \ \begin{description} \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \end{description} \item[kannan] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \end{description} \item[karatsuba] \ \ \begin{description} \item[IPRODK] Integer product, karatsuba algorithm. \end{description} \item[large] \ \ \begin{description} \item[ILPDS] Integer large prime divisor search. \end{description} \item[last] \ \ \begin{description} \item[LASTCELL] Last cell. \end{description} \item[leading] \ \ \begin{description} \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRLV] Integral polynomial translation, leading variable. \item[PLBCF] Polynomial leading base coefficient. \item[PLDCF] Polynomial leading coefficient. \end{description} \item[least] \ \ \begin{description} \item[ILCM] Integer least common multiple. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[lemma] \ \ \begin{description} \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[length] \ \ \begin{description} \item[IDIPR2] Integer digit inner product, length 2. \item[LENGTH] Length. \item[RIL] Rational interval length. \item[RILC] Rational interval length comparison. \end{description} \item[letter] \ \ \begin{description} \item[LETTER] Letter. \end{description} \item[lexicographically] \ \ \begin{description} \item[CPLEXN] Cartesian product, lexicographically next. \item[LEXNEX] Lexicographically next. \end{description} \item[line] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \item[FILINE] Flush the input stream line. \end{description} \item[linear] \ \ \begin{description} \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[ILCOMB] Integer linear combination. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \item[VILCOM] Vector of integers linear combination. \end{description} \item[list] \ \ \begin{description} \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[CLOUT] Character list out. \item[FRESL] Fermat residue list. \item[FRLSM] Fermat residue list, single modulus. \item[ILWRITE] Integer list write. \item[IPFLC] Integral polynomial factor list combine. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRRLS] Integral polynomial real root list separation. \item[ISLIST] Test for non-empty list. \item[ISNIL] Test for empty list. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[LBIM] List of BETA-integers merge. \item[LCONC] List concatenation. \item[LEINST] List element insertion. \item[LELTI] List element. \item[LEROT] List element rotation. \item[LFS] List from String. \item[LINS] List insertion. \item[LINSRT] List insertion. \item[LIST1] List, 1 element. \item[LIST10] List, 10 elements. \item[LIST2] List, 2 elements. \item[LIST3] List, 3 elements. \item[LIST4] List, 4 elements. \item[LIST5] List, 5 elements. \item[LMERGE] List merge. \item[LPERM] List permute. \item[LREAD] List read. \item[LSRCH] List search. \item[LWRITE] List write. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[PCL] Polynomial coefficient list. \item[SLELTI] Set list element. \item[VLREAD] Variable list read. \item[VLSRCH] Variable list search. \item[VLWRITE] Variable list write. \end{description} \item[location] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \end{description} \item[logarithm] \ \ \begin{description} \item[DLOG2] Digit logarithm, base 2. \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[ILOG2] Integer logarithm, base 2. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \end{description} \item[lookahead] \ \ \begin{description} \item[LKAHEAD] Character lookahead. \end{description} \item[loos] \ \ \begin{description} \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \end{description} \item[lower] \ \ \begin{description} \item[SFRLS] Single-precision floating-point real number lower sum. \end{description} \item[lowest] \ \ \begin{description} \item[RNRED] Rational number reduction to lowest terms. \end{description} \item[main] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[main] Default main routine. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MPEMV] Modular polynomial evaluation of main variable. \item[PMPMV] Polynomial multiplication by power of main variable. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPIMV] Rational polynomial integration, main variable. \end{description} \item[mark] \ \ \begin{description} \item[MARK] Mark. \end{description} \item[matrix] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MAIPP] Matrix of integral polynomials product. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[MICINS] Matrix of integers column insertion. \item[MICS] Matrix of integers column sort. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[MMDDET] Matrix of modular digits determinant. \item[MMDNSB] Matrix of modular digits null-space basis. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPEV] Matrix of modular polynomials evaluation. \end{description} \item[max] \ \ \begin{description} \item[RNMAX] Rational number max. \end{description} \item[maximum] \ \ \begin{description} \item[IMAX] Integer maximum. \item[IPMAXN] Integral polynomial maximum norm. \item[MAX] Maximum. \item[VMAX] Vector maximum. \end{description} \item[medium] \ \ \begin{description} \item[IMPDS] Integer medium prime divisor search. \end{description} \item[membership] \ \ \begin{description} \item[MEMBER] Membership test. \end{description} \item[memory] \ \ \begin{description} \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAMALLOC] Garbage collected array memory allocation. \end{description} \item[merge] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIM] List of BETA-integers merge. \item[LMERGE] List merge. \end{description} \item[method] \ \ \begin{description} \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[min] \ \ \begin{description} \item[RNMIN] Rational number min. \end{description} \item[minimal] \ \ \begin{description} \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \end{description} \item[minimum] \ \ \begin{description} \item[IMIN] Integer minimum. \item[MIN] Minimum. \item[VMIN] Vector minimum. \end{description} \item[minus] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \end{description} \item[mod] \ \ \begin{description} \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[modified] \ \ \begin{description} \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[PMDEG] Polynomial modified degree. \end{description} \item[modular] \ \ \begin{description} \item[DMPPRD] Dense modular polynomial product. \item[DMPSUM] Dense modular polynomial sum. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDDIF] Modular digit difference. \item[MDEXP] Modular digit exponentiation. \item[MDHOM] Modular digit homomorphism. \item[MDINV] Modular digit inverse. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MDNEG] Modular digit negative. \item[MDPROD] Modular digit product. \item[MDQ] Modular digit quotient. \item[MDRAN] Modular digit, random. \item[MDSUM] Modular digit sum. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MIDIF] Modular integer difference. \item[MIEXP] Modular integer exponentiation. \item[MIHOM] Modular integer homomorphism. \item[MIINV] Modular integer inverse. \item[MINEG] Modular integer negation. \item[MIPDIF] Modular integral polynomial difference. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIPNEG] Modular integral polynomial negation. \item[MIPPR] Modular integral polynomial product. \item[MIPRAN] Modular integral polynomial, random. \item[MIPROD] Modular integer product. \item[MIPSUM] Modular integral polynomial sum. \item[MIQ] Modular integer quotient. \item[MIRAN] Modular integer, random. \item[MISUM] Modular integer sum. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[MMDDET] Matrix of modular digits determinant. \item[MMDNSB] Matrix of modular digits null-space basis. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPEV] Matrix of modular polynomials evaluation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPDIF] Modular polynomial difference. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPEVAL] Modular polynomial evaluation. \item[MPEXP] Modular polynomial exponentiation. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MPHOM] Modular polynomial homomorphism. \item[MPINT] Modular polynomial interpolation. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[MPMDP] Modular polynomial modular digit product. \item[MPMDP] Modular polynomial modular digit product. \item[MPMON] Modular polynomial monic. \item[MPNEG] Modular polynomial negative. \item[MPPROD] Modular polynomial product. \item[MPPSR] Modular polynomial pseudo-remainder. \item[MPQ] Modular polynomial quotient. \item[MPQR] Modular polynomial quotient and remainder. \item[MPRAN] Modular polynomial, random. \item[MPRES] Modular polynomial resultant. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[MPSUM] Modular polynomial sum. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \item[MPUP] Modular polynomial univariate product. \item[MPUPP] Modular polynomial univariate primitive part. \item[MPUQ] Modular polynomial univariate quotient. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPDER] Modular univariate polynomial derivative. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[MUPRAN] Modular univariate polynomial, random. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMIP] Symmetric modular from modular integral polynomial. \item[SMFMIP] Symmetric modular from modular integral polynomial. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[module] \ \ \begin{description} \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMSIGN] Algebraic module sign. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \end{description} \item[modulus] \ \ \begin{description} \item[FRLSM] Fermat residue list, single modulus. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \end{description} \item[monic] \ \ \begin{description} \item[AFPMON] Algebraic number field polynomial monic. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPMON] Modular polynomial monic. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \end{description} \item[monomial] \ \ \begin{description} \item[PMON] Polynomial monomial. \end{description} \item[multiple] \ \ \begin{description} \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[ILCM] Integer least common multiple. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[multiplication] \ \ \begin{description} \item[IMP2] Integer multiplication by power of 2. \item[PMPMV] Polynomial multiplication by power of main variable. \end{description} \item[natural] \ \ \begin{description} \item[DMUPNR] Dense modular univariate polynomial natural remainder. \end{description} \item[negation] \ \ \begin{description} \item[INEG] Integer negation. \item[MINEG] Modular integer negation. \item[MIPNEG] Modular integral polynomial negation. \item[RINEG] Rational interval negation. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFRNEG] Single-precision floating-point real negation. \item[VINEG] Vector of integers negation. \end{description} \item[negative] \ \ \begin{description} \item[AFNEG] Algebraic number field negative. \item[AFPNEG] Algebraic number field polynomial negative. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[DRANN] Digit, random non-negative. \item[IPNEG] Integral polynomial negative. \item[IPNT] Integral polynomial negative transformation. \item[IUPNT] Integral univariate polynomial negative transformation. \item[MDNEG] Modular digit negative. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[MPNEG] Modular polynomial negative. \item[RNNEG] Rational number negative. \item[RPNEG] Rational polynomial negative. \end{description} \item[new] \ \ \begin{description} \item[PINV] Polynomial introduction of new variables. \end{description} \item[newton] \ \ \begin{description} \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \end{description} \item[next] \ \ \begin{description} \item[CPLEXN] Cartesian product, lexicographically next. \item[LEXNEX] Lexicographically next. \item[PARTN] Partition, next. \end{description} \item[non] \ \ \begin{description} \item[DNIMP] Digit non-implication. \item[DRANN] Digit, random non-negative. \item[ISLIST] Test for non-empty list. \item[MINNCT] Matrix of integers, non-negative column transformation. \end{description} \item[norm] \ \ \begin{description} \item[AFPNORM] Algebraic number field polynomial norm. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[IPMAXN] Integral polynomial maximum norm. \item[IPSUMN] Integral polynomial sum norm. \end{description} \item[normalize] \ \ \begin{description} \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \end{description} \item[normalized] \ \ \begin{description} \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \end{description} \item[normalizing] \ \ \begin{description} \item[RINT] Rational interval normalizing transformation. \end{description} \item[not] \ \ \begin{description} \item[DNOT] Digit not. \end{description} \item[null] \ \ \begin{description} \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[number] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFDWRITE] Algebraic number field, decimal write. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFNEG] Algebraic number field negative. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPROD] Algebraic number field element product. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFQ] Algebraic number field quotient. \item[AFSIGN] Algebraic number field sign. \item[AFSUM] Algebraic number field element sum. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AIFAN] Algebraic integer from algebraic number. \item[ANDWRITE] Algebraic number decimal write. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANPROD] Algebraic number product. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[ANSUM] Algebraic number sum. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RIRNP] Rational interval rational number product. \item[RNABS] Rational number absolute value. \item[RNBCR] Rational number binary common representation. \item[RNCEIL] Rational number, ceiling of. \item[RNCOMP] Rational number comparison. \item[RNDEN] Rational number denominator. \item[RNDIF] Rational number difference. \item[RNDWRITE] Rational number decimal write. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RNFLOR] Rational number, floor of. \item[RNINT] Rational number from integer. \item[RNINV] Rational number inverse. \item[RNMAX] Rational number max. \item[RNMIN] Rational number min. \item[RNNEG] Rational number negative. \item[RNNUM] Rational number numerator. \item[RNP2] Rational number power of 2. \item[RNPROD] Rational number product. \item[RNQ] Rational number quotient. \item[RNRAND] Rational number, random. \item[RNREAD] Rational number read. \item[RNRED] Rational number reduction to lowest terms. \item[RNSIGN] Rational number sign. \item[RNSUM] Rational number sum. \item[RNWRITE] Rational number write. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPRNP] Rational polynomial rational number product. \item[SFRLS] Single-precision floating-point real number lower sum. \end{description} \item[numerator] \ \ \begin{description} \item[RNNUM] Rational number numerator. \end{description} \item[object] \ \ \begin{description} \item[ISOBJECT] Test for object. \item[OREAD] Object read. \item[OWRITE] Object write. \end{description} \item[odd] \ \ \begin{description} \item[IODD] Integer odd. \item[ODD] Odd. \end{description} \item[one] \ \ \begin{description} \item[IPONE] Integral polynomial one. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \end{description} \item[open] \ \ \begin{description} \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \end{description} \item[or] \ \ \begin{description} \item[DOR] Digit or. \end{description} \item[order] \ \ \begin{description} \item[IORD2] Integer, order of 2. \item[ORDER] Order. \item[PDBORD] Polynomial divided by order. \item[PORD] Polynomial order. \end{description} \item[out] \ \ \begin{description} \item[CLOUT] Character list out. \item[INFOSACLIB] Write out usage information for SACLIB. \end{description} \item[output] \ \ \begin{description} \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \end{description} \item[pair] \ \ \begin{description} \item[PAIR] Pair. \end{description} \item[part] \ \ \begin{description} \item[IPCPP] Integral polynomial content and primitive part. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPIPP] Integral polynomial integer primitive part. \item[IPPP] Integral polynomial primitive part. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUPP] Modular polynomial univariate primitive part. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCRP] Single-precision floating-point complex, real part. \end{description} \item[partial] \ \ \begin{description} \item[DPCC] Digit partial cosequence calculation. \item[IBCPS] Integer binomial coefficient partial sum. \end{description} \item[partition] \ \ \begin{description} \item[CSFPAR] Characteristic set from partition. \item[PARTN] Partition, next. \item[PARTR] Partition, random. \item[PARTSS] Partition sumset. \end{description} \item[parts] \ \ \begin{description} \item[IPLCPP] Integral polynomial list of contents and primitive parts. \end{description} \item[pcpv] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \end{description} \item[permutation] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PERMCY] Permutation, cyclic. \item[PERMR] Permutation, random. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PPERMV] Polynomial permutation of variables. \end{description} \item[permute] \ \ \begin{description} \item[LPERM] List permute. \end{description} \item[picpv] \ \ \begin{description} \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \end{description} \item[plane] \ \ \begin{description} \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \end{description} \item[point] \ \ \begin{description} \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[GC] Garbage collection entry-point. \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[pointer] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \end{description} \item[points] \ \ \begin{description} \item[IPCEVP] Integral polynomial, choice of evaluation points. \end{description} \item[polynomial] \ \ \begin{description} \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[DIIPREAD] Distributive integral polynomial read. \item[DIIPWRITE] Distributive integral polynomial write. \item[DIPDEG] Distributive polynomial degree. \item[DIPFP] Distributive polynomial from polynomial. \item[DIPFP] Distributive polynomial from polynomial. \item[DIPINS] Distributive polynomial, insert term. \item[DIRPREAD] Distributive rational polynomial read. \item[DIRPWRITE] Distributive rational polynomial write. \item[DMPPRD] Dense modular polynomial product. \item[DMPSUM] Dense modular polynomial sum. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[DPFP] Dense polynomial from polynomial. \item[DPFP] Dense polynomial from polynomial. \item[IPABS] Integral polynomial absolute value. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPC] Integral polynomial content. \item[IPCEVP] Integral polynomial, choice of evaluation points. \item[IPCONST] Integral polynomial constant. \item[IPCPP] Integral polynomial content and primitive part. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPDER] Integral polynomial derivative. \item[IPDIF] Integral polynomial difference. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPDSCR] Integral polynomial discriminant. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPEVAL] Integral polynomial evaluation. \item[IPEXP] Integral polynomial exponentiation. \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[IPFAC] Integral polynomial factorization. \item[IPFACTREAD] Integral polynomial factor read. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPFLC] Integral polynomial factor list combine. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IPGSUB] Integral polynomial general substitution. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPINT] Integral polynomial integration. \item[IPIP] Integral polynomial integer product. \item[IPIPP] Integral polynomial integer primitive part. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQ] Integral polynomial integer quotient. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPMAXN] Integral polynomial maximum norm. \item[IPNEG] Integral polynomial negative. \item[IPNT] Integral polynomial negative transformation. \item[IPONE] Integral polynomial one. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPPOWREAD] Integral polynomial power read. \item[IPPP] Integral polynomial primitive part. \item[IPPROD] Integral polynomial product. \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[IPPSR] Integral polynomial pseudo-remainder. \item[IPQ] Integral polynomial quotient. \item[IPQR] Integral polynomial quotient and remainder. \item[IPRAN] Integral polynomial, random. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPREAD] Integral polynomial read. \item[IPRES] Integral polynomial resultant. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIGN] Integral polynomial sign. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IPSUB] Integral polynomial substitution. \item[IPSUM] Integral polynomial sum. \item[IPSUMN] Integral polynomial sum norm. \item[IPTERMREAD] Integral polynomial term read. \item[IPTPR] Integral polynomial truncated product. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRAN] Integral polynomial translation. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[IPTRUN] Integral polynomial truncation. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IPWRITE] Integral polynomial write. \item[ISFPF] Integral squarefree polynomial factorization. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPNT] Integral univariate polynomial negative transformation. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[IUPTPR] Integral univariate polynomial truncated product. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[IUPWRITE] Integral univariate polynomial write. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MIPDIF] Modular integral polynomial difference. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIPNEG] Modular integral polynomial negation. \item[MIPPR] Modular integral polynomial product. \item[MIPRAN] Modular integral polynomial, random. \item[MIPSUM] Modular integral polynomial sum. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPDIF] Modular polynomial difference. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPEVAL] Modular polynomial evaluation. \item[MPEXP] Modular polynomial exponentiation. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MPHOM] Modular polynomial homomorphism. \item[MPINT] Modular polynomial interpolation. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[MPMDP] Modular polynomial modular digit product. \item[MPMON] Modular polynomial monic. \item[MPNEG] Modular polynomial negative. \item[MPPROD] Modular polynomial product. \item[MPPSR] Modular polynomial pseudo-remainder. \item[MPQ] Modular polynomial quotient. \item[MPQR] Modular polynomial quotient and remainder. \item[MPRAN] Modular polynomial, random. \item[MPRES] Modular polynomial resultant. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[MPSUM] Modular polynomial sum. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \item[MPUP] Modular polynomial univariate product. \item[MPUPP] Modular polynomial univariate primitive part. \item[MPUQ] Modular polynomial univariate quotient. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPDER] Modular univariate polynomial derivative. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[MUPRAN] Modular univariate polynomial, random. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \item[PBIN] Polynomial binomial. \item[PCL] Polynomial coefficient list. \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PDBORD] Polynomial divided by order. \item[PDEG] Polynomial degree. \item[PDEGSV] Polynomial degree, specified variable. \item[PDEGV] Polynomial degree vector. \item[PDPV] Polynomial division by power of variable. \item[PFBRE] Polynomial From Base Ring Element. \item[PFDIP] Polynomial from distributive polynomial. \item[PFDIP] Polynomial from distributive polynomial. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PINV] Polynomial introduction of new variables. \item[PLBCF] Polynomial leading base coefficient. \item[PLDCF] Polynomial leading coefficient. \item[PMDEG] Polynomial modified degree. \item[PMON] Polynomial monomial. \item[PMPMV] Polynomial multiplication by power of main variable. \item[PORD] Polynomial order. \item[PPERMV] Polynomial permutation of variables. \item[PRED] Polynomial reductum. \item[PRT] Polynomial reciprocal transformation. \item[PSDSV] Polynomial special decomposition, specified variable. \item[PTBCF] Polynomial trailing base coefficient. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PUFP] Polynomial, univariate, from polynomial. \item[PUFP] Polynomial, univariate, from polynomial. \item[PUNT] Polynomial univariate test. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[RPDIF] Rational polynomial difference. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPDWRITE] Rational Polynomial Distributive Write. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPEXPREAD] Rational polynomial expression read. \item[RPFACTREAD] Rational polynomial factor read. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPIMV] Rational polynomial integration, main variable. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[RPNEG] Rational polynomial negative. \item[RPPOWREAD] Rational polynomial power read. \item[RPPROD] Rational polynomial product. \item[RPQR] Rational polynomial quotient and remainder. \item[RPREAD] Rational polynomial read. \item[RPRNP] Rational polynomial rational number product. \item[RPSUM] Rational polynomial sum. \item[RPTERMREAD] Rational polynomial term read. \item[RPWRITE] Rational polynomial write. \item[RUPWRITE] Rational univariate polynomial write. \item[SMFMIP] Symmetric modular from modular integral polynomial. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[polynomials] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MAIPP] Matrix of integral polynomials product. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPEV] Matrix of modular polynomials evaluation. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \end{description} \item[power] \ \ \begin{description} \item[IDP2] Integer division by power of 2. \item[IMP2] Integer multiplication by power of 2. \item[IPOWER] Integer power. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPOWREAD] Integral polynomial power read. \item[PDPV] Polynomial division by power of variable. \item[PMPMV] Polynomial multiplication by power of main variable. \item[RNP2] Rational number power of 2. \item[RPPOWREAD] Rational polynomial power read. \end{description} \item[precision] \ \ \begin{description} \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[preparation] \ \ \begin{description} \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \end{description} \item[primality] \ \ \begin{description} \item[ISPT] Integer selfridge primality test. \end{description} \item[prime] \ \ \begin{description} \item[DPGEN] Digit prime generator. \item[GDPGEN] Gaussian digit prime generator. \item[ILPDS] Integer large prime divisor search. \item[IMPDS] Integer medium prime divisor search. \item[ISPD] Integer small prime divisors. \end{description} \item[primitive] \ \ \begin{description} \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[IPCPP] Integral polynomial content and primitive part. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPIPP] Integral polynomial integer primitive part. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPPP] Integral polynomial primitive part. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUPP] Modular polynomial univariate primitive part. \end{description} \item[principal] \ \ \begin{description} \item[IPPSC] Integral polynomial principal subresultant coefficients. \end{description} \item[problem] \ \ \begin{description} \item[ASSPR] Assignment problem. \end{description} \item[process] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \end{description} \item[product] \ \ \begin{description} \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPPR] Algebraic number field polynomial product. \item[AFPROD] Algebraic number field element product. \item[ANPROD] Algebraic number product. \item[CPLEXN] Cartesian product, lexicographically next. \item[DMPPRD] Dense modular polynomial product. \item[DPR] Digit product. \item[IDIPR2] Integer digit inner product, length 2. \item[IDPR] Integer-digit product. \item[IPIP] Integral polynomial integer product. \item[IPIPR] Integral polynomial mod ideal product. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPROD] Integral polynomial product. \item[IPROD] Integer product. \item[IPRODK] Integer product, karatsuba algorithm. \item[IPTPR] Integral polynomial truncated product. \item[IUPTPR] Integral univariate polynomial truncated product. \item[MAIPP] Matrix of integral polynomials product. \item[MDPROD] Modular digit product. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPPR] Modular integral polynomial product. \item[MIPROD] Modular integer product. \item[MPMDP] Modular polynomial modular digit product. \item[MPPROD] Modular polynomial product. \item[MPUP] Modular polynomial univariate product. \item[RIPROD] Rational interval product. \item[RIRNP] Rational interval rational number product. \item[RNPROD] Rational number product. \item[RPPROD] Rational polynomial product. \item[RPRNP] Rational polynomial rational number product. \item[SFCPR] Single-precision floating-point complex product. \item[SFRPR] Single-precision floating-point real product. \item[VISPR] Vector of integers scalar product. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[pseudo] \ \ \begin{description} \item[IPPSR] Integral polynomial pseudo-remainder. \item[MPPSR] Modular polynomial pseudo-remainder. \end{description} \item[ptv] \ \ \begin{description} \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \end{description} \item[q] \ \ \begin{description} \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \end{description} \item[quadratic] \ \ \begin{description} \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[quotient] \ \ \begin{description} \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFQ] Algebraic number field quotient. \item[DQR] Digit quotient and remainder. \item[IDQ] Integer-digit quotient. \item[IDQR] Integer-digit quotient and remainder. \item[IPIQ] Integral polynomial integer quotient. \item[IPQ] Integral polynomial quotient. \item[IPQR] Integral polynomial quotient and remainder. \item[IQ] Integer quotient. \item[IQR] Integer quotient and remainder. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MDQ] Modular digit quotient. \item[MIQ] Modular integer quotient. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPQ] Modular polynomial quotient. \item[MPQR] Modular polynomial quotient and remainder. \item[MPUQ] Modular polynomial univariate quotient. \item[QREM] Quotient and remainder. \item[RNQ] Rational number quotient. \item[RPQR] Rational polynomial quotient and remainder. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFRQ] Single-precision floating-point real quotient. \end{description} \item[random] \ \ \begin{description} \item[BITRAN] Bit, random. \item[DRAN] Digit, random. \item[DRANN] Digit, random non-negative. \item[IPRAN] Integral polynomial, random. \item[IRAND] Integer, random. \item[MDRAN] Modular digit, random. \item[MIPRAN] Modular integral polynomial, random. \item[MIRAN] Modular integer, random. \item[MPRAN] Modular polynomial, random. \item[MUPRAN] Modular univariate polynomial, random. \item[PARTR] Partition, random. \item[PERMR] Permutation, random. \item[RNRAND] Rational number, random. \end{description} \item[rational] \ \ \begin{description} \item[AFFRN] Algebraic number field element from rational number. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[DIRPREAD] Distributive rational polynomial read. \item[DIRPWRITE] Distributive rational polynomial write. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[RIB] Rational interval bisection. \item[RIL] Rational interval length. \item[RILC] Rational interval length comparison. \item[RINEG] Rational interval negation. \item[RINT] Rational interval normalizing transformation. \item[RIPROD] Rational interval product. \item[RIRNP] Rational interval rational number product. \item[RIRNP] Rational interval rational number product. \item[RISIGN] Rational interval sign. \item[RISUM] Rational interval sum. \item[RNABS] Rational number absolute value. \item[RNBCR] Rational number binary common representation. \item[RNCEIL] Rational number, ceiling of. \item[RNCOMP] Rational number comparison. \item[RNDEN] Rational number denominator. \item[RNDIF] Rational number difference. \item[RNDWRITE] Rational number decimal write. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RNFLOR] Rational number, floor of. \item[RNINT] Rational number from integer. \item[RNINV] Rational number inverse. \item[RNMAX] Rational number max. \item[RNMIN] Rational number min. \item[RNNEG] Rational number negative. \item[RNNUM] Rational number numerator. \item[RNP2] Rational number power of 2. \item[RNPROD] Rational number product. \item[RNQ] Rational number quotient. \item[RNRAND] Rational number, random. \item[RNREAD] Rational number read. \item[RNRED] Rational number reduction to lowest terms. \item[RNSIGN] Rational number sign. \item[RNSUM] Rational number sum. \item[RNWRITE] Rational number write. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[RPDIF] Rational polynomial difference. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPDWRITE] Rational Polynomial Distributive Write. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPEXPREAD] Rational polynomial expression read. \item[RPFACTREAD] Rational polynomial factor read. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPIMV] Rational polynomial integration, main variable. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[RPNEG] Rational polynomial negative. \item[RPPOWREAD] Rational polynomial power read. \item[RPPROD] Rational polynomial product. \item[RPQR] Rational polynomial quotient and remainder. \item[RPREAD] Rational polynomial read. \item[RPRNP] Rational polynomial rational number product. \item[RPRNP] Rational polynomial rational number product. \item[RPSUM] Rational polynomial sum. \item[RPTERMREAD] Rational polynomial term read. \item[RPWRITE] Rational polynomial write. \item[RUPWRITE] Rational univariate polynomial write. \end{description} \item[read] \ \ \begin{description} \item[AREAD] Atom read. \item[CREAD] Character read. \item[CREADB] Character read. \item[DIIPREAD] Distributive integral polynomial read. \item[DIRPREAD] Distributive rational polynomial read. \item[GREAD] Gamma-integer read. \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[IPFACTREAD] Integral polynomial factor read. \item[IPPOWREAD] Integral polynomial power read. \item[IPREAD] Integral polynomial read. \item[IPTERMREAD] Integral polynomial term read. \item[IREAD] Integer read. \item[LREAD] List read. \item[OREAD] Object read. \item[RNREAD] Rational number read. \item[RPEXPREAD] Rational polynomial expression read. \item[RPFACTREAD] Rational polynomial factor read. \item[RPPOWREAD] Rational polynomial power read. \item[RPREAD] Rational polynomial read. \item[RPTERMREAD] Rational polynomial term read. \item[VLREAD] Variable list read. \item[VREAD] Variable read. \end{description} \item[real] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[reciprocal] \ \ \begin{description} \item[PRT] Polynomial reciprocal transformation. \end{description} \item[reduced] \ \ \begin{description} \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \end{description} \item[reduction] \ \ \begin{description} \item[RNRED] Rational number reduction to lowest terms. \item[VIERED] Vector of integers, element reduction. \end{description} \item[reductum] \ \ \begin{description} \item[PRED] Polynomial reductum. \item[RED] Reductum 1. \item[RED2] Reductum 2. \item[RED3] Reductum 3. \item[RED4] Reductum 4. \item[REDI] Reductum. \item[SRED] Set reductum. \end{description} \item[refinement] \ \ \begin{description} \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \end{description} \item[relative] \ \ \begin{description} \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[IPRRRI] Integral polynomial relative real root isolation. \end{description} \item[remainder] \ \ \begin{description} \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[DQR] Digit quotient and remainder. \item[IDQR] Integer-digit quotient and remainder. \item[IDREM] Integer-digit remainder. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPPSR] Integral polynomial pseudo-remainder. \item[IPQR] Integral polynomial quotient and remainder. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IQR] Integer quotient and remainder. \item[IREM] Integer remainder. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPPSR] Modular polynomial pseudo-remainder. \item[MPQR] Modular polynomial quotient and remainder. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[QREM] Quotient and remainder. \item[REM] GAMMA-digit remainder. \item[RPQR] Rational polynomial quotient and remainder. \end{description} \item[remove] \ \ \begin{description} \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \end{description} \item[represent] \ \ \begin{description} \item[ANREPE] Algebraic number represent element of a primitive extension. \end{description} \item[representation] \ \ \begin{description} \item[AFCR] Algebraic number field element convert representation. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[RNBCR] Rational number binary common representation. \end{description} \item[representatives] \ \ \begin{description} \item[SDR] System of distinct representatives. \end{description} \item[residue] \ \ \begin{description} \item[FRESL] Fermat residue list. \item[FRLSM] Fermat residue list, single modulus. \end{description} \item[respect] \ \ \begin{description} \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \end{description} \item[result] \ \ \begin{description} \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \end{description} \item[resultant] \ \ \begin{description} \item[IPRES] Integral polynomial resultant. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[MPRES] Modular polynomial resultant. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \end{description} \item[ring] \ \ \begin{description} \item[PFBRE] Polynomial From Base Ring Element. \end{description} \item[root] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[DSQRTF] Digit square root function. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IROOT] Integer root. \item[ISQRT] Integer square root. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \end{description} \item[rosser] \ \ \begin{description} \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[rotation] \ \ \begin{description} \item[LEROT] List element rotation. \end{description} \item[routine] \ \ \begin{description} \item[main] Default main routine. \end{description} \item[saclib] \ \ \begin{description} \item[BEGINSACLIB] Begin SACLIB. \item[ENDSACLIB] End saclib. \item[INFOSACLIB] Write out usage information for SACLIB. \item[STATSACLIB] Statistics of saclib. \end{description} \item[scalar] \ \ \begin{description} \item[VISPR] Vector of integers scalar product. \end{description} \item[search] \ \ \begin{description} \item[ILPDS] Integer large prime divisor search. \item[IMPDS] Integer medium prime divisor search. \item[LSRCH] List search. \item[VLSRCH] Variable list search. \end{description} \item[second] \ \ \begin{description} \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[SECOND] Second. \end{description} \item[segmentation] \ \ \begin{description} \item[ISEG] Integer segmentation. \end{description} \item[selfridge] \ \ \begin{description} \item[ISPT] Integer selfridge primality test. \end{description} \item[semi] \ \ \begin{description} \item[IUPSR] Integral univariate polynomial semi-remainder. \end{description} \item[separation] \ \ \begin{description} \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRS] Integral polynomial real root separation. \end{description} \item[sequence] \ \ \begin{description} \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \end{description} \item[set] \ \ \begin{description} \item[CSFPAR] Characteristic set from partition. \item[CSINT] Characteristic set intersection. \item[CSSUB] Characteristic set subset. \item[CSUN] Characteristic set union. \item[GCASET] Garbage collected array set element. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[SDIFF] Set difference. \item[SEQUAL] Set equality. \item[SFCS] Set from characteristic set. \item[SFCS] Set from characteristic set. \item[SFIRST] Set first element. \item[SINTER] Set intersection. \item[SLELTI] Set list element. \item[SRED] Set reductum. \item[SUNION] Set union. \item[USDIFF] Unordered set difference. \item[USINT] Unordered set intersection. \item[USUN] Unordered set union. \end{description} \item[shifted] \ \ \begin{description} \item[ISSUM] Integer shifted sum. \end{description} \item[sign] \ \ \begin{description} \item[AFSIGN] Algebraic number field sign. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AMSIGN] Algebraic module sign. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[IPSIGN] Integral polynomial sign. \item[ISIGNF] Integer sign function. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[RISIGN] Rational interval sign. \item[RNSIGN] Rational number sign. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[SIGN] Sign. \end{description} \item[similar] \ \ \begin{description} \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \end{description} \item[similiar] \ \ \begin{description} \item[IPSRP] Integral polynomial similiar to rational polynomial. \end{description} \item[single] \ \ \begin{description} \item[FRLSM] Fermat residue list, single modulus. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[small] \ \ \begin{description} \item[ISPD] Integer small prime divisors. \end{description} \item[solution] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \end{description} \item[sort] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[MICS] Matrix of integers column sort. \end{description} \item[space] \ \ \begin{description} \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[special] \ \ \begin{description} \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[MUPFS] Modular univariate polynomial factorization, special. \item[PSDSV] Polynomial special decomposition, specified variable. \end{description} \item[specified] \ \ \begin{description} \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[PDEGSV] Polynomial degree, specified variable. \item[PSDSV] Polynomial special decomposition, specified variable. \end{description} \item[square] \ \ \begin{description} \item[DSQRTF] Digit square root function. \item[ISQRT] Integer square root. \end{description} \item[squared] \ \ \begin{description} \item[SFCMSQ] Single-precision floating-point complex modulus squared. \end{description} \item[squarefree] \ \ \begin{description} \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[ISFPF] Integral squarefree polynomial factorization. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \end{description} \item[standard] \ \ \begin{description} \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \end{description} \item[statistics] \ \ \begin{description} \item[STATSACLIB] Statistics of saclib. \end{description} \item[stream] \ \ \begin{description} \item[FILINE] Flush the input stream line. \end{description} \item[string] \ \ \begin{description} \item[LFS] List from String. \item[SWRITE] String write. \end{description} \item[strong] \ \ \begin{description} \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[strongly] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \end{description} \item[subresultant] \ \ \begin{description} \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \end{description} \item[subroutine] \ \ \begin{description} \item[IPICS] Integral polynomial integer content subroutine. \item[MPUCS] Modular polynomial univariate content subroutine. \end{description} \item[subset] \ \ \begin{description} \item[CSSUB] Characteristic set subset. \end{description} \item[substitution] \ \ \begin{description} \item[IPGSUB] Integral polynomial general substitution. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPSUB] Integral polynomial substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \end{description} \item[suffix] \ \ \begin{description} \item[SUFFIX] Suffix. \end{description} \item[sum] \ \ \begin{description} \item[AFPSUM] Algebraic number field polynomial sum. \item[AFSUM] Algebraic number field element sum. \item[ANSUM] Algebraic number sum. \item[DMPSUM] Dense modular polynomial sum. \item[IBCPS] Integer binomial coefficient partial sum. \item[IPSUM] Integral polynomial sum. \item[IPSUMN] Integral polynomial sum norm. \item[ISSUM] Integer shifted sum. \item[ISUM] Integer sum. \item[MDSUM] Modular digit sum. \item[MIPSUM] Modular integral polynomial sum. \item[MISUM] Modular integer sum. \item[MPSUM] Modular polynomial sum. \item[RISUM] Rational interval sum. \item[RNSUM] Rational number sum. \item[RPSUM] Rational polynomial sum. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRSUM] Single-precision floating-point real sum. \item[VISUM] Vector of integers sum. \end{description} \item[sumset] \ \ \begin{description} \item[PARTSS] Partition sumset. \end{description} \item[symmetric] \ \ \begin{description} \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMIP] Symmetric modular from modular integral polynomial. \end{description} \item[system] \ \ \begin{description} \item[GCSI] Garbage collection, system independent. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \item[SDR] System of distinct representatives. \end{description} \item[term] \ \ \begin{description} \item[DIPINS] Distributive polynomial, insert term. \item[IPTERMREAD] Integral polynomial term read. \item[RPTERMREAD] Rational polynomial term read. \end{description} \item[terminating] \ \ \begin{description} \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \end{description} \item[terms] \ \ \begin{description} \item[RNRED] Rational number reduction to lowest terms. \end{description} \item[test] \ \ \begin{description} \item[ISATOM] Test for atom. \item[ISGCA] Test for GCA handle. \item[ISLIST] Test for non-empty list. \item[ISNIL] Test for empty list. \item[ISOBJECT] Test for object. \item[ISPT] Integer selfridge primality test. \item[ISZERO] Test for zero. \item[MEMBER] Membership test. \item[PUNT] Polynomial univariate test. \end{description} \item[third] \ \ \begin{description} \item[THIRD] Third. \end{description} \item[time] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \end{description} \item[trailing] \ \ \begin{description} \item[PTBCF] Polynomial trailing base coefficient. \end{description} \item[transformation] \ \ \begin{description} \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPNT] Integral polynomial negative transformation. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPNT] Integral univariate polynomial negative transformation. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[PRT] Polynomial reciprocal transformation. \item[RINT] Rational interval normalizing transformation. \item[VIUT] Vector of integers, unimodular transformation. \end{description} \item[translation] \ \ \begin{description} \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRAN] Integral polynomial translation. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \end{description} \item[transpose] \ \ \begin{description} \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \end{description} \item[truncated] \ \ \begin{description} \item[IPTPR] Integral polynomial truncated product. \item[IUPTPR] Integral univariate polynomial truncated product. \end{description} \item[truncation] \ \ \begin{description} \item[IPTRUN] Integral polynomial truncation. \item[ITRUNC] Integer truncation. \end{description} \item[unimodular] \ \ \begin{description} \item[VIUT] Vector of integers, unimodular transformation. \end{description} \item[union] \ \ \begin{description} \item[CSUN] Characteristic set union. \item[SUNION] Set union. \item[USUN] Unordered set union. \end{description} \item[unit] \ \ \begin{description} \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \end{description} \item[univariate] \ \ \begin{description} \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPNT] Integral univariate polynomial negative transformation. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[IUPTPR] Integral univariate polynomial truncated product. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[IUPWRITE] Integral univariate polynomial write. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \item[MPUP] Modular polynomial univariate product. \item[MPUPP] Modular polynomial univariate primitive part. \item[MPUQ] Modular polynomial univariate quotient. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPDER] Modular univariate polynomial derivative. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[MUPRAN] Modular univariate polynomial, random. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \item[PUFP] Polynomial, univariate, from polynomial. \item[PUNT] Polynomial univariate test. \item[RUPWRITE] Rational univariate polynomial write. \end{description} \item[unordered] \ \ \begin{description} \item[USDIFF] Unordered set difference. \item[USINT] Unordered set intersection. \item[USUN] Unordered set union. \end{description} \item[usage] \ \ \begin{description} \item[INFOSACLIB] Write out usage information for SACLIB. \end{description} \item[uspensky] \ \ \begin{description} \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[value] \ \ \begin{description} \item[ABS] Absolute value. \item[IABSF] Integer absolute value function. \item[IPABS] Integral polynomial absolute value. \item[RNABS] Rational number absolute value. \item[SFRABS] Single-precision floating-point real absolute value. \end{description} \item[variable] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[PDEGSV] Polynomial degree, specified variable. \item[PDPV] Polynomial division by power of variable. \item[PMPMV] Polynomial multiplication by power of main variable. \item[PSDSV] Polynomial special decomposition, specified variable. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPIMV] Rational polynomial integration, main variable. \item[VLREAD] Variable list read. \item[VLSRCH] Variable list search. \item[VLWRITE] Variable list write. \item[VREAD] Variable read. \item[VWRITE] Variable write. \end{description} \item[variables] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PINV] Polynomial introduction of new variables. \item[PPERMV] Polynomial permutation of variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \end{description} \item[variation] \ \ \begin{description} \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \end{description} \item[variations] \ \ \begin{description} \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \end{description} \item[vector] \ \ \begin{description} \item[DVCMP] Degree vector comparison. \item[PDEGV] Polynomial degree vector. \item[VCOMP] Vector comparison. \item[VIAZ] Vector of integers, adjoin zeros. \item[VIDIF] Vector of integers difference. \item[VIERED] Vector of integers, element reduction. \item[VILCOM] Vector of integers linear combination. \item[VINEG] Vector of integers negation. \item[VISPR] Vector of integers scalar product. \item[VISUM] Vector of integers sum. \item[VIUT] Vector of integers, unimodular transformation. \item[VMAX] Vector maximum. \item[VMIN] Vector minimum. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[weakly] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \end{description} \item[with] \ \ \begin{description} \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \end{description} \item[write] \ \ \begin{description} \item[AFDWRITE] Algebraic number field, decimal write. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AFWRITE] Algebraic field element write. \item[ANDWRITE] Algebraic number decimal write. \item[AWRITE] Atom write. \item[CWRITE] Character write. \item[DIIPWRITE] Distributive integral polynomial write. \item[DIRPWRITE] Distributive rational polynomial write. \item[GWRITE] Gamma-integer write. \item[ILWRITE] Integer list write. \item[INFOSACLIB] Write out usage information for SACLIB. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[IPWRITE] Integral polynomial write. \item[IUPWRITE] Integral univariate polynomial write. \item[IWRITE] Integer write. \item[LWRITE] List write. \item[OWRITE] Object write. \item[RNDWRITE] Rational number decimal write. \item[RNWRITE] Rational number write. \item[RPDWRITE] Rational Polynomial Distributive Write. \item[RPWRITE] Rational polynomial write. \item[RUPWRITE] Rational univariate polynomial write. \item[SWRITE] String write. \item[VLWRITE] Variable list write. \item[VWRITE] Variable write. \end{description} \item[zero] \ \ \begin{description} \item[ISZERO] Test for zero. \end{description} \item[zeros] \ \ \begin{description} \item[VIAZ] Vector of integers, adjoin zeros. \end{description} \item[[algebraic] \ \ \begin{description} \item[ANPEDE] [Algebraic number primitive element for a double extension. \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cNIWsCGV.tex0000664002275300236100000001725514017255270020236 0ustar wcbrownscsThis section lists \saclib\ types, constants, and global variables. All types and constants are defined in ``saclib.h'', ``sactypes.h'', and ``sacsys.h''. External variables are defined in ``external.c'' and declared as {\tt external} in ``saclib.h''. The average user of \saclib\ functions should not find it neccessary to deal directly with any of these values (except for \Word, \BETA, and \NIL, which are also mentioned in other sections). If you modify any of the values listed below without knowing what you are doing, you may either crash \saclib\ or cause it to produce false results, so please take care! \medskip \noindent{\em Notation:} In the description below, {\em pointer} means a C pointer (i.e.\ an actual memory address) and {\em pointer to an array} means a C pointer to the first element of an array. {\em List handle} means a \saclib\ list handle (i.e.\ an integer \ttL\ with $\BETA \leq \ttL < \BETAp$ which is used as an index into the \SPACEB\ and \SPACEBone\ arrays), and {\em GCA handle} means a handle for a garbage collected array (i.e.\ an integer \ttA\ with $\BETAp \leq \ttA < \BETApp$ which is used as an index into the \GCASPACEBp\ array). {\em Cell} means a \saclib\ list cell (i.e.\ two consecutive \Word s in the \SPACE\ array, the first one of which has an odd index) and {\em GCA cell} means a \GCArray\ structure in the \GCASPACE\ array. \medskip In \saclib\ only two low-level data structures are typechecked by the C compiler\footnote{Lists, integers, polynomials, etc.\ are structures which are built at runtime. For these no type checking is done so that the programmer has to make sure that there are no conflicts.}. These two typedefs are: \begin{itemize} \item \Word\ \ldots\ the basic type which in most installations of \saclib\ will be the same as a C {\tt int}. \Word\ is defined in ``sysdep.h''. \item \GCArray\ \ldots\ a {\tt struct} containing information on garbage collected arrays. This is a \saclib\ internal data structure defined in ``sactypes.h''. \end{itemize} The following constants are defined in ``sacsys.h'' except for \NIL, which is defined in ``saclib.h'': \begin{itemize} \item \BETA\index{\BETA}\ \ldots\ a \Word, the value used to distinguish between atoms and lists. This is also the base for the internal representation of large integers. \BETA\ must be a power of $2$ such that $2^8 \leq \BETA$ and $3 * \BETA$ fits into a \Word. In most implementations where a \Word\ is a standard C {\tt int} with $n$ bits, the setting is $\BETA = 2^{n-3}$. \item \BETAone\ \ldots\ a \Word, $\BETAone = \BETA - 1$. \item \NIL\index{\NIL}\ \ldots\ a \Word, the empty list handle\footnote{ This is equal to \BETA. For historical reasons, in some \saclib\ functions \BETA\ is explicitly used instead of \NIL. }. \item {\tt NU\_, NUp\_, NPRIME\_, NSMPRM\_, NPFDS\_, RHO\_, NPTR1\_}\ \ldots\ \Word s, the initial values for the corresponding global variables. \end{itemize} The following flags are defined in ``saclib.h'': \begin{itemize} \item {\tt GC\_CHECK / GC\_NO\_CHECK}\ \ldots\ \Word s, used for telling the garbage collector whether an array allocated by {\tt GCAMALLOC()} will contain list or GCA handles (and thus cannot be ignored in the mark phase). \item {\tt SAC\_KEEPMEM / SAC\_FREEMEM}\ \ldots\ \Word s, used when calling {\tt ENDSACLIB()} directly for requesting memory allocated by {\tt GCAMALLOC()} to be kept / deallocated. \end{itemize} Below we give a list of the \saclib\ global variables as defined in ``external.c'': \begin{description} \item[List processing and garbage collection:] \ \ \begin{itemize} \item \AVAIL\ \ldots\ a \Word, the list handle of the free list. \item \GCGLOBALS\ \ldots\ a \Word, the list handle of the list of global variables. \item {\tt BACSTACK}\ \ldots\ a pointer to the beginning of the system stack. \item {\tt GCC}\ \ldots\ a \Word, the number of garbage collections. \item {\tt GCAC}\ \ldots\ a \Word, the number of GCA cells collected in all garbage collections. \item {\tt GCCC}\ \ldots\ a \Word, the number of cells collected in all garbage collections. \item {\tt GCM}\ \ldots\ a \Word, if {\tt GCM} is 1, a message is written to the output stream each time the garbage collector is called. \item \NU\ \ldots\ a \Word, one less than the size of the \SPACE\ array in \Word s, i.e.\ twice the number of cells in \SPACE. \item \RHO\ \ldots\ a \Word, the garbage collector aborts the program if no more than $\NU/\RHO$ cells were reclaimed. \item \SPACEB \ \ldots\ a pointer to an array of words, $\SPACEB = \SPACE - \BETA$. \item \SPACEBone \ \ldots\ a pointer to an array of words, $\SPACEBone = \SPACE - \BETAone$. \item \GCAAVAIL \ \ldots\ a \Word, the GCA handle of the free list of GCA cells. \item \GCASPACE \ \ldots\ a pointer to an array of \GCArray\ structures, the memory space for GCA cells. \item \GCASPACEBp \ \ldots\ a pointer to an array of \GCArray\ structures, $\GCASPACEBp = \GCASPACE - \BETAp$. \item \NUp \ \ldots\ a \Word, one less than the number of \GCArray\ structures in the \GCASPACE\ array. \item \BETAp \ \ldots\ a \Word, the bound used to distinguish between list and GCA handles. $\BETAp = \BETA + \NU + 1$. \item \BETApp \ \ldots\ a \Word, the upper bound on GCA GCA handles. $\BETApp = \BETAp + \NUp + 1$. \end{itemize} \item[Timing:] \ \ \begin{itemize} \item {\tt TAU}\ \ldots\ a \Word, the time (in milliseconds) spent for garbage collections. \item {\tt TAU0}\ \ldots\ a \Word, the system time (in milliseconds) just before \saclib\ initialization. \item {\tt TAU1}\ \ldots\ a \Word, the system time (in milliseconds) immediately after \saclib\ initialization. \end{itemize} \item[Integer arithmetic:] \ \ \begin{itemize} \item {\tt DELTA}\ \ldots\ a \Word, ${\tt DELTA} = 2^{\lfloor{\textstyle {\tt ZETA}/2}\rfloor}$. \item {\tt EPSIL}\ \ldots\ a \Word, ${\tt EPSIL} = 2^{\lceil{\textstyle {\tt ZETA}/2}\rceil} = \BETA/{\tt DELTA}$. \item {\tt ETA}\ \ldots\ a \Word, ${\tt ETA} = \lfloor\log_{10} \BETA \rfloor$. \item {\tt RINC}\ \ldots\ a \Word, the increment for the random number generator. \item {\tt RMULT}\ \ldots\ a \Word, the multiplier for the random number generator. \item {\tt RTERM}\ \ldots\ a \Word, the last value produced by the random number generator. \item {\tt TABP2}\ \ldots\ a pointer to an array of \Word s, ${\tt TABP2}[i] = 2^{i-1}$ for $1 \leq i \leq {\tt ZETA}$. \item {\tt THETA}\ \ldots\ a \Word, ${\tt THETA} = 10^{\tt ETA}$. \item {\tt UZ210}\ \ldots\ a \Word, the list handle of the list of units of ${\bf Z}_{210}$. \item {\tt ZETA}\ \ldots\ a \Word, ${\tt ZETA} = \log_2 {\tt BETA}$. \end{itemize} \item[Prime numbers:] \ \ \begin{itemize} \item {\tt NPFDS}\ \ldots\ a \Word, the number of primes used by the \saclib\ function {\tt IUPFDS}. \item {\tt NPRIME}\ \ldots\ a \Word\ controlling the number of primes in {\tt PRIME}. \item {\tt PRIME}\ \ldots\ a \Word, the list handle of the list of primes between $\BETA - {\tt NPRIME} * {\tt ZETA} * 7 / 5$ and \BETA. \item {\tt NSMPRM}\ \ldots\ a \Word, the upper bound on the size of primes in {\tt SMPRM}. \item {\tt SMPRM}\ \ldots\ a \Word, the list handle of the list of primes $< {\tt NSMPRM}$. \end{itemize} \item[Miscellaneous:] \ \ \begin{itemize} \item {\tt NPTR1}\ \ldots\ a \Word, the number of \Word s in the {\tt GCAPTR1} array. \item {\tt GCAPTR1}\ \ldots\ a \Word, the GCA handle of the array used by the function {\tt IUPTR1}. \end{itemize} \item[Input/Output:] \ \ \begin{itemize} \item {\tt LASTCHAR}\ \ldots\ a \Word, the last character read from the input stream. \end{itemize} \end{description} saclib2.2.8/sysdep/doc/user_guide/cRRC.tex0000664002275300236100000002435414017255270017502 0ustar wcbrownscs\section{Mathematical Preliminaries} Let $A(x)$ be a univariate polynomial with integer coefficients. % A real number $x_0$ with $A(x_0) = 0$ is called a {\em real root} of $A(x)$. % A real number $x_0$ is a root of $A(x)$ if and only if $A(x)$ is divisible by $(x-x_0)$, i.e. if there is a polynomial $B(x)$ with real coefficients such that $A(x) = (x-x_0)B(x)$. % For any real root $x_0$ of $A(x)$ there is a natural number $k$ such that $A(x)$ is divisible by $(x-x_0)^k$ but not by $(x-x_0)^{k+1}$. % This number $k$ is called the {\em multiplicity} of the root $x_0$ of $A(x)$. % Roots of multiplicity 1 are called {\em simple roots}. % An interval $I$ containing $x_0$ but no other real root of $A(x)$, is called an {\em isolating interval} for $x_0$. % For example, if $A(x) = x^2 - 2$, the interval $(-2,2)$ is not an isolating interval for a real root of $A(x)$, but $(0,1000)$ is. \section{Purpose} The \saclib\ real root calculation package solves non-linear equations in one variable: % It computes isolating intervals for the real roots of univariate integral polynomials along with the multiplicity of each root, and it refines the isolating intervals to any specified size. \section{Methods and Algorithms} For root isolation three methods are available. % The {\em coefficient sign variation method} (or: {\em modified Uspensky method}), is based on Descartes' rule of signs. % The {\em Collins-Loos method} is based on Rolle's theorem. % {\em Sturm's method} is based on Sturm sequences. Generally, the coefficient sign variation method is many times faster than the other two methods. For the coefficient sign variation method various main programs are provided to accommodate details of input and output specifications. For the refinement of isolating intervals to any specified precision a symbolic version of Newton's method is used. Given an arbitrary integral polynomial {\tt IPRCH} will calculate all its real roots to specified accuracy. % The multiplicity of each root is also computed. % The algorithm uses the coefficient sign variation method to isolate the roots from each other and then applies Newton's method to refine the isolating intervals to the desired width. Given a squarefree integral polynomial {\tt IPRIM} isolates all the real roots from each other. The roots inside a specified open interval are isolated by {\tt IPRIMO}. Both {\tt IPRIM} and {\tt IPRIMO} use the coefficient sign variation method. Other main algorithms which use this method are {\tt IPRIMS} and {\tt IPRIMW}. The Collins-Loos method is implemented in {\tt IPRICL}: % Given an arbitrary univariate integral polynomial {\tt IPRICL} produces a list of isolating intervals for its real roots. % These intervals have the additional property that the first derivative of $A$ is monotone on each of them. An implementation of Sturm's method is provided by {\tt IPRIST}: Given a squarefree univariate integral polynomial {\tt IPRIST} produces a list of isolating intervals for its real roots. Roots of different polynomials can be isolated from each other using the program {\tt IPLRRI}. Reference: %\begin{thebibliography}{99} % %\bibitem{JJ} Jeremy R.\ Johnson: {\it Algorithms for polynomial real root isolation}. Technical Research Report OSU-CISRC-8/91-TR21, 1991. The Ohio State University, 2036 Neil Avenue Mall, Columbus, Ohio 43210, Phone: 614-292-5813. % %\end{thebibliography} \section{Definitions of Terms} \begin{description} \item[binary rational number]\index{binary rational number} A rational number whose denominator is a power of 2. \item[interval]\index{interval} A list $I=(a,b)$ of rational numbers $a \leq b$. If $a = b$ the interval is called a one-point interval and it designates the set consisting of the number $a$. If $a < b$ it is not evident from the representation whether the endpoints are thought to be part of $I$ or not. Therefore the specifications of the algorithms have to state whether a particular interval is meant to be an open interval, a left-open and right closed interval, a left-closed and right open interval or a closed interval. \item[standard interval]\index{standard interval}\index{interval!standard} An interval whose endpoints are binary rational numbers $a$, $b$ such that $a = m / 2^k$, $b = (m+1) / 2^k$, $k$ and $m$ being positive or negative integers, or zero. \item[(weakly) isolating interval]\index{interval!isolating}\index{interval!isolating!weakly} An interval $I$ is called a (weakly) isolating interval for a simple real root $\alpha$ of the polynomial $A$ if $I$ contains $\alpha$ but no other root of $A$. \item[strongly isolating interval]\index{interval!isolating!strongly} An isolating interval for a root $\alpha$ of a polynomial $A$ is said to be strongly isolating, if the closure of $I$ is also an isolating interval for $\alpha$. \item[disjoint intervals]\index{disjoint intervals}\index{intervals!disjoint} Intervals are called disjoint if the sets they designate are disjoint. \item[strongly disjoint intervals]\index{intervals!disjoint!strongly} Disjoint intervals are called strongly disjoint if their closures are disjoint. \item[inflectionless isolating interval]\index{inflectionless isolating interval}\index{interval!isolating!inflectionless} An interval I with binary rational endpoints which is an isolating interval for a real root $x_0$ of $A(x)$ is called inflectionless if the derivative $A'(x)$ is monotone in $I$, i.e. if $A''(x)$ does not have a root in $I$ except possibly $x_0$. \item[inflectionless isolation list]\index{inflectionless isolation list} A list of inflectionless isolating intervals. \end{description} \section{Functions} \begin{description} \item[High Precision Calculation] \ \ \begin{description} \item[{\tt L <- IPRCH(A,I,k) }]\index{IPRCH} Integral polynomial real root calculation, high precision. Input: any polynomial. Output: all roots or all roots in an interval. \item[{\tt L <- IPRCHS(A,I,k) }]\index{IPRCHS} Integral polynomial real root calculation, high-precision special. Input: polynomial which does not have common roots with its first or second derivative. Output: all roots or all roots in an interval. \item[{\tt IPRCNP(A,I; sp,spp,J) }]\index{IPRCNP} Integral polynomial real root calculation, Newton method preparation. \item[{\tt J <- IPRCN1(A,I,s,k) }]\index{IPRCN1} Integral polynomial real root calculation, 1 root. \end{description} \item[Coefficient Sign Variation Method] \ \ \begin{description} \item[{\tt L <- IPRIM(A) }]\index{IPRIM} Integral polynomial real root isolation, modified Uspensky method. \item[{\tt L <- IPRIMO(A,Ap,I) }]\index{IPRIMO} Integral polynomial real root isolation, modified Uspensky method, open interval. \item[{\tt L <- IPRIMS(A,Ap,I) }]\index{IPRIMS} Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[{\tt L <- IPRIMU(A) }]\index{IPRIMU} Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[{\tt L <- IPRIMW(A) }]\index{IPRIMW} Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[{\tt L <- IPSRM(A,I) }]\index{IPSRM} Integral polynomial strong real root isolation, modified Uspensky method. Input: an integral polynomial without multiple roots and no roots in common with its second derivative. Output: an inflectionless isolation list for all roots or all roots in an interval. \item[{\tt L <- IPSRMS(A,I) }]\index{IPSRMS} Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[Rolle's Theorem] \ \ \begin{description} \item[{\tt L <- IPRICL(A) }]\index{IPRICL} Integral polynomial real root isolation, Collins-Loos algorithm. \end{description} \item[Sturm's method] \ \ \begin{description} \item[{\tt IPRIST}]\index{IPRIST} Integral polynomial real root isolation using a Sturm sequence. \end{description} \item[Special] \ \ \begin{description} \item[{\tt r <- IUPRLP(A) }]\index{IUPRLP} Integral univariate polynomial, root of a linear polynomial. \item[{\tt b <- IUPRB(A) }]\index{IUPRB} Integral univariate polynomial root bound. Input: a univariate integral polynomial $A$. Output: a binary rational number, power of 2, which is greater than the absolute value of any root of $A$. \item[{\tt M <- IPLRRI(L) }]\index{IPLRRI} Integral polynomial list real root isolation. Input: a list of integral polynomials without multiple roots and without common roots. Output: a list of strongly disjoint isolating intervals in ascending order for all the roots of all the input polynomials -- each interval is listed with the polynomial of which it isolates a root. \item[{\tt Is <- IUPIIR(A,I) }]\index{IUPIIR} Integral univariate polynomial isolating interval refinement. \end{description} \item[Low-Level Functions] \ \ \begin{description} \item[{\tt IPRRS(A1,A2,I1,I2; Is1,Is2,s) }]\index{IPRRS} Integral polynomial real root separation. \item[{\tt IPRRLS(A1,A2,L1,L2; Ls1,Ls2) }]\index{IPRRLS} Integral polynomial real root list separation. \item[{\tt L <- IPRRII(A,Ap,d,Lp) }]\index{IPRRII} Integral polynomial real root isolation induction. \item[{\tt Is <- IPRRRI(A,B,I,s1,t1) }]\index{IPRRRI} Integral polynomial relative real root isolation. \item[{\tt J <- IPSIFI(A,I) }]\index{IPSIFI} Integral polynomial standard isolating interval from isolating interval. \item[{\tt IPIIWS(A,L) }]\index{IPIIWS} Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[{\tt IPPNPRS}]\index{IPPNPRS} Integral polynomial primitive negative polynomial remainder sequence. \item[{\tt k <- IPVCHT(A) }]\index{IPVCHT} Integral polynomial variations after circle to half-plane transformation. \item[{\tt B <- IUPCHT(A) }]\index{IUPCHT} Integral univariate polynomial circle to half-plane transformation. \item[{\tt n <- IUPVAR(A) }]\index{IUPVAR} Integral univariate polynomial variations. \item[{\tt v <- IUPVOI(A,I) }]\index{IUPVOI} Integral univariate polynomial, variations for open interval. \item[{\tt v <- IUPVSI(A,I) }]\index{IUPVSI} Integral univariate polynomial, variations for standard interval. \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cPF.tex0000664002275300236100000001627114017255270017360 0ustar wcbrownscs\section{Mathematical Preliminaries} A non-constant polynomial $A(x_1,\ldots,x_r)$ in $R[x_1,\ldots,x_r]$, where $R$ is a unique factorization domain, is said to be {\em irreducible} if $A$ cannot be expressed as the product of two non-constant polynomials in $R[x_1,\ldots,x_r]$. % The problem of factoring a polynomial $A(x_1,\ldots,x_r)$ is that of finding distinct irreducible polynomials $A_i(x_1,\ldots,x_r)$ and integers $e_i$, $i = 1,\ldots,k$, such that $A = A_1^{e_1}\cdots A_k^{e_k}$. % Such an expression is called a {\em complete factorization}\index{factorization!complete} of $A$. % The polynomials $A_i$ are called the {\em irreducible factors} of $A$ and the integer $e_i$ is called the {\em multiplicity} of $A_i$. \section{Purpose} The \saclib\ polynomial factorization package provides factorization algorithms for $R = \BbbZ_p$, $p$ a single-precision prime and $r = 1$, and for $R = \BbbZ$ for $r \geq 1$. For $R = \BbbZ$ one obtains the sign, integer content and positive primitive irreducible factors of $A$, as well as the multiplicity of each irreducible factor. The integer content is not factored. For $R = \BbbZ_p$ the irreducible factors obtained are monic. \section{Methods and Algorithms} To factor an arbitrary univariate polynomial modulo a prime, one should first obtain a similar monic polynomial by using the algorithm {\tt MPMON}. Having done this, one then computes the squarefree factors of the monic polynomial by using the algorithm {\tt MUPSFF}. In order to factor each squarefree factor one would use {\tt MUPFBL}, which implements Berlekamp's algorithm. The irreducible factors returned by {\tt MUPFBL} are monic. For factoring a univariate integral polynomial, {\tt IUPFAC} first computes the squarefree factorization using the algorithm {\tt IPSF}. The squarefree factors are in turn factored using {\tt IUSFPF} which first computes a factorization modulo a prime and the modular factors thus obtained are then lifted by the quadratic version of the Hensel construction. {\tt IUPFAC} returns the sign, the integer content and a list of irreducible factors, with multiplicities, of the input polynomial. The irreducible factors returned by {\tt IUPFAC} are positive and primitive. Multivariate integral polynomials are factored by using {\tt IPFAC}. This algorithm first computes the content as well as the squarefree factors of the primitive part of the input polynomial and subsequently factors each of these separately. The factorization of a squarefree primitive polynomial is performed by the algorithm {\tt ISFPF} which implements a multivariate lifting technique based on the Hensel lemma. The lifting is done one variable at a time as opposed to lifting several variables simultaneously. If the polynomial $A$ to be factored has rational base coefficients then it must first be converted to an integral polynomial by multiplying $A$ by the least common multiple of the denominators of the base coefficients and then converting the polynomial thus obtained to integral representation. This can be achieved by using {\tt IPSRP} which computes the primitive and positive integral polynomial $A^{\prime}$ as well as the rational number $a$ such that $A = a A^{\prime}$. \section{Functions} \begin{description} \item[Factorization:] \ \ \begin{description} \item[{\tt IPFAC(r,A; s,c,L) }]\index{IPFAC} Integral polynomial factorization. {\em Factors $r$-variate polynomials over $\BbbZ$.} \item[{\tt IUPFAC(A; s,c,L) }]\index{IUPFAC} Integral univariate polynomial factorization. {\em Factors univariate polynomials over $\BbbZ$.} \item[{\tt L <- MUPFBL(p,A) }]\index{MUPFBL} Modular univariate polynomial factorization-Berlekamp algorithm. {\em Factors monic squarefree univariate polynomials over $\BbbZ_p$.} \end{description} % factorization \item[Auxiliary Functions for Factorization:] \ \ \begin{description} \item[{\tt IPCEVP(r,A; B,L) }]\index{IPCEVP} Integral polynomial, choice of evaluation points. {\em Given an integral polynomial $A$ that is squarefree in its main variable, computes integers that, when substituted for the minor variables, maintain the degree of $A$ in the main variable and its squarefreeness.} \item[{\tt b <- IPFCB(V) }]\index{IPFCB} Integral polynomial factor coefficient bound. {\em Given the degree vector of an integral polynomial $A$, computes an integer $b$ such the product of the infinity norms of any divisors of $A$ is less than or equal to $2^b$ times the infinity norm of $A$.} \item[{\tt Lp <- IPFLC(r,M,I,A,L,D) }]\index{IPFLC} Integral polynomial factor list combine. \item[{\tt B <- IPFSFB(r,A) }]\index{IPFSFB} Integral polynomial finest squarefree basis. \item[{\tt a <- IPGFCB(r,A) }]\index{IPGFCB} Integral polynomial Gelfond factor coefficient bound. \item[{\tt IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C; A,B) }]\index{IPIQH} Integral polynomial mod ideal quadratic Hensel lemma. \item[{\tt L <- ISFPF(r,A) }]\index{ISFPF} Integral squarefree polynomial factorization. {\em Given a positive, primitive integral polynomial $A$ that is squarefree with respect to the main variable, computes a list of the distinct positive irreducible factors of $A$.} \item[{\tt IUPFDS(A; p,F,C) }]\index{IUPFDS} Integral univariate polynomial factor degree set. \item[{\tt IUPQH(p,Ab,Bb,Sb,Tb,M,C; A,B) }]\index{IUPQH} Integral univariate polynomial quadratic Hensel lemma. \item[{\tt Fp <- IUPQHL(p,F,M,C) }]\index{IUPQHL} Integral univariate polynomial quadratic Hensel lemma, list. \item[{\tt L <- IUSFPF(A) }]\index{IUSFPF} Integral univariate squarefree polynomial factorization. {\em Given a univariate, positive, primitive, squarefree integral polynomial $A$, computes a list of the positive irreducible factors of $A$.} \item[{\tt M <- MCPMV(n,L) }]\index{MCPMV} Matrix of coefficients of polynomials, with respect to main variable. \item[{\tt MIPISE(r,M,D,A,B,S,T,C; U,V) }]\index{MIPISE} Modular integral polynomial mod ideal, solution of equation. \item[{\tt MIUPSE(M,A,B,S,T,C; U,V) }]\index{MIUPSE} Modular integral univariate polynomial, solution of equation. \item[{\tt MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C; A,B) }]\index{MPIQH} Modular polynomial mod ideal, quadratic Hensel lemma. \item[{\tt Fp <- MPIQHL(r,p,F,M,D,C) }]\index{MPIQHL} Modular polynomial mod ideal, quadratic Hensel lemma, list. \item[{\tt MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C; A,B,S,T,Dp) }]\index{MPIQHS} Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[{\tt Q <- MUPBQP(p,A) }]\index{MUPBQP} Modular univariate polynomial Berlekamp Q-polynomials construction. \item[{\tt L <- MUPDDF(p,A) }]\index{MUPDDF} Modular polynomial distinct degree factorization. {\em Given a monic, squarefree polynomial $A$ over $R = \BbbZ_p$, computes a list $((n_1,A_1)$, $\ldots$, $(n_k,A_k))$, where the $n_i$ are positive integers with $n_1 < \cdots < n_k$ and each $A_i$ is the product of all monic irreducible factors of $A$ of degree $n_i$.} \item[{\tt L <- MUPFS(p,A,B,d) }]\index{MUPFS} Modular univariate polynomial factorization, special. \end{description} % auxiliary functions \end{description} % programs saclib2.2.8/sysdep/doc/user_guide/cNIWsGC.tex0000664002275300236100000001350414017255270020101 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Implementation of Lists} When \saclib\ is initialised, the array \SPACE\ containing $\NU+1$ \Word s is allocated from the heap. This array is used as the memory space for list processing. Lists are built from {\em cells}, which are pairs of consecutive \Word s the first of which is at an odd position in the \SPACE\ array. {\em List handles} (``pointers'' to lists) are defined to be \BETA\ plus the index of the first cell of the list in the \SPACE\ array with the handle of the empty list being \NIL\ (which is equal to \BETA). Figure \ref{f:SPACE} shows the structure of the \SPACE\ array. \begin{figure}[htb] \input{fSPACE.tex} \caption{The \SPACE\ array.} \label{f:SPACE} \end{figure} The first \Word\ of each cell is used to store the handle of the next cell in the list (i.e.\ the value returned by {\tt RED()}), while the second \Word\ contains the data of the list element represented by the cell (i.e.\ the value returned by {\tt FIRST()}). Figure \ref{f:LIST} gives a graphical representation of the cell structure for a sample list. The arrows stand for list handles. \begin{figure}[htb] \input{fLIST.tex} \caption{The cell structure of the list $\ttL = (1,(9,6),8)$.} \label{f:LIST} \end{figure} As already mentioned in Chapter \ref{c:LP}, atoms are required to be integers $a$ with $-\BETA < a < \BETA$. This allows the garbage collector and other functions operating on objects to decide whether a variable of type \Word\ contains an atom or a list handle. Note that values less or equal $-\BETA$ are legal only during garbage collection while values greater than $\BETA + \NU$ are used for referencing other garbage collected structures. The \Word s of a cell adressed by a list handle \ttL\ are {\tt \SPACE[$\ttL-\BETA$]} and {\tt \SPACE[$\ttL-\BETA+1$]}. To simplify these computations, the C pointers \SPACEB\ and \SPACEBone\ are set to the memory addresses of {\tt \SPACE[$-\BETA$]} and {\tt \SPACE[$-\BETA+1$]}, respectively. This is used by the functions {\tt FIRST(L)}, which returns {\tt SPACEB1[L]}, and {\tt RED(L)}, which returns {\tt SPACEB[L]}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Implementation of GCA Handles} When \saclib\ is initialised, the array \GCASPACE\ containing $\NUp+1$ structures of type \GCArray\ is allocated. A {\em GCA handle} is defined to be \BETAp plus the index of the corresponding \GCArray\ structure in the \GCASPACE\ array, with the null handle being \NIL. The \GCArray\ structure contains the following fields: \begin{itemize} \item {\tt next}\ \ldots\ a \Word, used for linking empty \GCArray s to the \GCAAVAIL\ list and for marking (see Section \ref{cNIWsGCssGC}). \item {\tt flag}\ \ldots\ a \Word, set to one of {\tt GC\_CHECK} and {\tt GC\_NO\_CHECK} (see Section \ref{cNIWsGCssGC}). \item {\tt len}\ \ldots\ a \Word, the length of the array in \Word s. \item {\tt array}\ \ldots\ a C pointer to an array of \Word s of size {\tt len}. \end{itemize} When {\tt GCAMALLOC()(} is called, it takes the first \GCArray\ from the \GCAAVAIL\ list and initializes its fields. {\tt GCA2PTR()} simply returns the C pointer in the {\tt array} field. {\tt GCAFREE()} deallocates the memory addressed by the {\tt array} field, sets all fields to zero, and links the \GCArray\ to the beginning of the \GCAAVAIL\ list. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{The Garbage Collector} \label{cNIWsGCssGC} Garbage collection is invoked when {\tt COMP()} or {\tt GCAMALLOC()} call {\tt GC()} in the case of \AVAIL\ or \GCAAVAIL\ being \NIL. The garbage collector consists of two parts: \begin{itemize} \item The function {\tt GC()}\index{GC} is system dependent. It must ensure that the contents of all processor registers are pushed onto the stack and pass alignment information and the address of the end of the stack to {\tt GCSI()}. \item {\tt GCSI()}\index{GCSI} is the system independent part of the garbage collector. It uses a mark-and-sweep method for identifying unused cells: \begin{description} \item[Marking:] The processor registers, the system stack, and the variables and GCA arrays to which pointers are stored in the \GCGLOBALS\ list are searched for non-\NIL\ list and GCA handles. All the cells accessible from these handles are marked by a call to {\tt MARK()}. If a list handle is found, this function traverses the cells of the list, marking them by negating the contents of their first \Word. If the second \Word\ of a cell contains a list or GCA handle, {\tt MARK()} calls itself recursively on this handle. In case of a GCA handle, the GCA cell adressed by the handle is marked by negating the contents of its {\tt next} field. If the cell's {\tt flag} field is not set to {\tt GC\_NO\_CHECK}, the \Word s in the array pointed to by the {\tt array} field are searched for list or GCA handles with {\tt MARK()} calling itself recursively on valid handles. \item[Sweeping:] In the sweep step, the \AVAIL\ and \GCAAVAIL\ lists are built: Cells in \SPACE\ whose first \Word\ contains a positive value are linked to the \AVAIL\ list. If the first \Word\ of a cell contains a negative value, it is made positive again and the cell is not changed in any other way. Cells in \GCASPACE\ whose {\tt next} field contains a positive value are linked to the \GCAAVAIL\ list and the array pointed to by the {\tt array} field is deallocated. If the {\tt next} field contains a negative value, it is made positive again and the cell is not changed in any other way. \end{description} \end{itemize} If the \AVAIL\ list contains no more than $\NU/\RHO$ cells at the end of garbage collection, an error message is written to the output stream and the program is aborted. saclib2.2.8/sysdep/doc/user_guide/saclib.dvi0000664002275300236100000101075414017255270020130 0ustar wcbrownscs; TeX output 2000.03.09:1423CPWx>DtGGcmr17SAqCLIB1.17tUser'sGuide0XQ cmr121]jo cmr9cˤ cmsy9 1993Tb9yKurtG`odelInstitute,'`BrunoBucrhbSerger 2GeorgeE.CollinseMarkJ.Encarnaci on;[HoSonHong,JeremryR.Johnson WVernerKrandicrk3+RSvudigerLoosȬAnaM.MandacrheAndreasNeubacrherHerbSertVielhaberWMarcrh12,1993N-=Aacmr61TRISC{Linz"RepAortSeriesT:ec9hnicalReportNum9ber93-19(Researc9hInstituteforSymbAolic 9Computation,TJohannesKeplerUniv9ersity:,TA-4040Linz,Austria)*CyXK`y cmr10SACLIBgandshowshowtocallthem 9fromC.ThereisalsoabriefexplanationoftheinnerworkingsofthelistproGcessingand9garbageUUcollectionfacilitiesofSACLIB(G!. 'C9cNH cmbx12cCon8tents>919In9troQduction71 91.149WhatUUisSACLIB(G!?%................................191.249AbGoutUUthisGuide߁.................................291.349SACLIB\Maintenance*..............................2929ListTProQcessing*492.149MathematicalUUPreliminaries?N...........................492.249PurpGoseFȍ......................................492.349De nitionsUUofT*ermsTȍ...............................492.449F*unctions#1.....................................5939Arithmetic@1993.149IntroGduction....................................9493.1.1T9PurpGosec..................................9493.1.2T9De nitionsUUofT*ermsq...........................993.249IntegerUUArithmetic{................................1093.349MoGdularUUNumberArithmetic[..........................13493.3.1T9MoGdularUUDigitArithmetic"ō........................13493.3.2T9MoGdularUUIntegerArithmeticiۍ.......................1393.449RationalUUNumbGerArithmetic?F..........................14949P9olynomialTArithmeticZ1594.149IntroGduction....................................15494.1.1T9PurpGosec..................................15494.1.2T9De nitionsUUofT*ermsq...........................1594.249PolynomialUUInputandOutput..........................17494.2.1T9RecursiveUUpGolynomialsoverZ􍍑......................17494.2.2T9RecursiveUUpGolynomialsoverQT......................18494.2.3T9DistributiveUUpGolynomialsoverZp荍.....................19494.2.4T9DistributiveUUpGolynomialsoverQ....................19494.2.5T9ConversionUUBetweenRecursiveandDistributiveT9Representationm..............................19494.2.6T9PolynomialsUUoverZ 0ercmmi7m...........................1994.349DomainUUIndepGendentPolynomialArithmeticM8..................2094.449IntegralUUPolynomialArithmetic<.........................2194.549MoGdularUUPolynomialArithmetici䍍.........................2494.649RationalUUPolynomialArithmeticMs.........................2694.749MiscellaneousUURepresentationsJ..........................26494.7.1T9SparseUUDistributiveRepresentationJ...................26494.7.2T9DenseUURecursiveRepresentation捍....................27^i C959LinearTAlgebra&28 95.149MathematicalUUPreliminaries?N...........................2895.249PurpGoseFȍ......................................2895.349MethoGdsUUandAlgorithmsxA.............................2895.449F*unctions#1.....................................29969P9olynomialTGCDandResultants3196.149MathematicalUUPreliminaries?N...........................3196.249PurpGoseFȍ......................................3296.349De nitionsUUofT*ermsTȍ...............................3296.449MethoGdsUUandAlgorithmsxA.............................33496.4.1T9GCDUUComputations...........................33496.4.2T9Resultantsۍ.................................3396.549F*unctions#1.....................................34979P9olynomialTF actorization{3797.149MathematicalUUPreliminaries?N...........................3797.249PurpGoseFȍ......................................3797.349MethoGdsUUandAlgorithmsxA.............................3797.449F*unctions#1.....................................38989RealTRoQotCalculationZ4098.149MathematicalUUPreliminaries?N...........................4098.249PurpGoseFȍ......................................4098.349MethoGdsUUandAlgorithmsxA.............................4098.449De nitionsUUofT*ermsTȍ...............................4198.549F*unctions#1.....................................41999AlgebraicTNum9bQerArithmeticz4499.149MathematicalUUPreliminaries?N...........................4499.249PurpGoseFȍ......................................4499.349MethoGdsUUandAlgorithmsxA.............................4499.449De nitionsUUofT*ermsTȍ...............................4699.549Representationc..................................4699.649F*unctions#1.....................................479A9CallingTSACLIB,tF unctionsTfromCE519A.149AUUSampleProgram................................519A.249DynamicUUMemoryAlloGcationinSACLIB)F2....................519A.349DeclaringUUGlobalV*ariablestoSACLIB*.....................549A.449InitializingUUSACLIB+vbyUUHand ~..........................559A.549SACLIB\ErrorUUHandling퍍.............................559A.649Compilingڍ.....................................569B9ISAC4h:pAnTIn9teractiveInterfacetoSACLIB%{579B.149WhatUUisISAC?qS..................................579B.249SuppGortedUUSACLIB+vAlgorithmsFX.........................579B.349CommandUULineOptions.............................579B.449InterfaceUUF*unctionality..............................579B.549InterfaceUUGrammar................................58zii7C9C9NotesTontheIn9ternalW orkingsofSACLIBd61 9C.149Lists,UUGCAHandles,andGarbageCollection⍍.................6149C.1.1T9ImplementationUUofListsx$.........................6149C.1.2T9ImplementationUUofGCAHandles{....................6249C.1.3T9TheUUGarbageCollector..........................629C.249ConstantsUUandGlobalV*ariables͍.........................639IndexdV66AiiinC9cList T{ofFigures49A.149AUUsampleprogram.\................................52 9A.249SampleUUcoGdeusingGCAhandles.p........................539A.349DeclaringUUglobalvqariables.M............................549A.449SampleUUcoGdeforinitializingSACLIBbyhand..................569C.149TheUU$ cmmi10;(9;6);8).ML.................61:ivtC9iNq cmbx12iChapter 129cIn8tro duction:9AnaMandache,QAndreasNeubacherandHoGonHongalltoiledlonghoursediting9and_reformattingprograms.AndreasdeservesspGecialrecognition.Heinitiatedthewriting9ofthemanual,/wrotethreechaptersofthemanualandtwooftheappGendices,/anddidall9theqYrequiredsystemmaintenance.T*ofacilitateexpGerimentingwiththefunctionsinthe9library*,,HerbGertVielhaberimplementedISAC&,,theinteractiveshellforSACLIB(~.vHealso9wroteUUthecorrespGondingappendixofthemanual.9Besides$theabGove$itwouldbeunthinkqablenottomention,.collectively*,all$ofmyformer9doGctoralTLstudents, whocontributedtothedevelopmentoftheSAC2algorithmsandthe9research>onwhichtheywerefoundedoverapGeriod>of26years.jCDuringthelast20ofthose9yearsRGudigerLooswasafrequentcollabGorator.Heproposedcreationofan"ALgorithm9DEScription[?language"forSAC1,DthepredecessorofSAC2,DandwroteanALDES-to-F*ortran9translator.9ThisoinitialversionofSACLIBoisjustthebGeginningofwhatistocome.sW*eknowhow9toRimproveseveraloftheprogramsinthecurrentsystemandwewilldoitforsubsequent9versions.Some5basicfunctionalitiesarelargelyundevelopGedinthecurrrentsystem(e.g.1|C9linearalgebra)buttheywillbGesuppliedinsubsequentversions.Somemoreadvqanced 9functionalitiesT(e.g.qpGolynomialcomplexrootsandquanti erelimination)arenearlyready9and<#willbGeforthcomingsoon.iaAlsoweexpectthatusersofthesystemwillwriteprograms9basedUUontheoneswedistributeando erthemtootherusers.MTGeorgeUUE.Collins!č91.23 VAbs3outffthisGuide9Theʈmaingoalinwritingthisguidewastoenablethereadertoquicklydiscoverwhether9SACLIB5yprovidesMafunctionforagivenproblem.ThestructureofthepapGershouldfacilitate9searchingUUforafunctioninthefollowingway:9'9EveryZchapterdealswithfunctionsopGeratingoveracertaindomain(lists,[numbGers,'9pGolynomials,etc.)or~Dwithfunctionssolvingcertainproblems(GCD}computation,'9factorization,UUrealroGotcalculation,etc.).9'9SomechaptersaresplitintosectionscoveringmorespGeci ctopics(integerarithmetic,'9rationalUUnumbGerarithmetic,integralpGolynomialarithmetic,etc.)9'9Insideasection,functionsaredividedintovqariousareas(basicarithmetic,predicates,'9input/output,UUetc.).9'9InsideUtheseareas,bUcloselyrelatedfunctions(afunctionanditsinverse,functions'9solvingessentiallythesameproblem,afunctionanditsauxiliaryroutines,etc.)`qare'9groupGed.9Thispartitioningwasdoneonacompletelysub8jectivebasis. 8Theintentionalways9wasthattheneophyteusershouldbGeabletopinpointadesiredfunctionbyusingsimple9heuristics.ThisCapproachmaycertainlyfailinsomecases,?butwithatmost50functions9pGersectionbrowsingthemsequentiallyshouldalwayssucceedinanacceptableamountof9time.9Anotherrathersub8jectivelydesignedfeatureisthefunctiondescriptions.QAThelistswere9generatedautomaticallyfromtheheadersoftheSACLIB,3source les.SF*orsomefunctions9additionalUUremarkswereaddedin!': cmti10emphasize}'dtypGestyle.9Readers.whowant.touseSACLIB+MfunctionsintheirC.programsshouldreadAppGendix9A,rwhich:describGeshowinitializationandcleanuparedone,rwhich leshavetobGe#included,9etc.A!detailed!descriptionoftheinput/outputspGeci cationsofagivenfunctioncanbe9found inthecommentbloGckatthebGeginningofthecorrespondingsource le.gReadthe9\AddendumUUtotheSACLIB+vUser'sGuide"forinformationonhowtoaccessthese.9ThoseVwhowantVtoknowmoreabGouttheinnerworkingsofSACLIB-shouldreferto9AppGendixo6Cwhichgivesanoverviewoftheinternalrepresentationoflists,thegarbage9collector94andtheconstantsandglobalvqariablesusedinternally*.Descriptionsofthehighlevel9datastructuresusedforimplementingtheelementsofdomainslikeintegers,8pGolynomials,9etc.UUcanbGefoundatthebeginningsofthecorrespondingsections.!č91.33 VSACLIBl8Maintenance9The recommendedway forrepGortingproblemswithSACLIB+ 2issendinge-mailtothemain-9tenanceUUaccount'9saclib@risc.uni-linz.ac.at9orUUmailto2C9SACLIB?Maintenance 9Research?InstituteforSymbolicComputation9Johannes?KeplerUniversity94020?Linz9Austria9MessagesUUwhichmightinterestagreateraudienceshouldbGesenttothemailinglist'9saclib-l@risc.uni-linz.ac.at9ThisUUlistcanbGesubscribedbysendingamessagewiththebody'9subscribGeUUsaclib-l< rstname>9toUUlistserv@risc.uni-linz.ac.at. 9NotenthatSACLIB+isnotsoldforpro t^ٓRcmr71|s.ThereforedonotexpGectpromptserviceand9extensivesuppGort.SnNevertheless,ZSACLIB,Eiscontinuouslymaintainedandextended,Zsodo9notUUhesitategettingincontactwithus.97ffl) J= "5-:1L|{Ycmr8SAÎCLIB1mainÎtenanceXisspAnUUintegerasuchthatBETA <aAUUtermdenotingbGothatomsandlists.9compQositionO8ofUUanob8jectlandalist(l1|s;l2;:::;lnq~)UUisthelist(l2`;l1|s;l2;:::;lnq~).9reductumCof+alist(l1|s;l2;:::;lnq~)+isthelist(l2|s;l3;:::;lnq~).cThe+reductumoftheemptylist '9isUUunde ned.9concatenationXofUUlists(l1|s;l2;:::;lnq~)UUand(m1|s;m2;:::;mk됲)UUisthelist(l1|s;:::;'9lnq~;m1|s;:::;mk됲).9in9verse6 ѲofUUalist(l1|s;l2;:::;lnq~)UUisthelist(ln;ln O!cmsy71;:::;l1|s).9length2ofUUalist(l1|s;l2;:::;lnq~)UUisn.qThelengthoftheemptylistis0.9exten9t2TheUUnumbGerofcellsusedbyanob8ject.qMoreprecisely:39=9EXTENT\(a)=0UUifaisanatom.39=9EXTENT\(NIL)=0.39=9EXTENT\(L)=1 +EXTENT (l1|s)+EXTENT((l2|s;:::;lnq~)),;where4Listhenon-emptylist=9(l1|s;l2;:::;lnq~).9order.TheUUdepthofanob8ject.qMoreprecisely:39=9ORDERWy(a)=0UUifaisanatom.39=9ORDERWy(NIL)=1.39=9ORDERWy(L)Q=MAX(ORDER?(l1|s)֪+1;ORDER꙲((l2;:::;lnq~))),}0whereBListhenon-empty=9listUU(l1|s;l2;:::;lnq~).9sideTe ectsIѲWhen afunctionmoGdi esthecontent ofoneormorecellsoftheinputlist(s),'9itUUissaidtocausesidee e}'cts.qThisisalwaysUUnotedinthefunctionspGeci cations.9destructiv9eJXAnUUopGerationonlistscausingsidee ectsiscalleddestructive.9(unordered)Tseta5AnUU(unordered)listofatoms.!č92.43 VFfunctions9Constructors:'9M?<-COMP(a,L)zȲCompGosition.qPr}'e xesanobjecttoalist.'9M?<-COMP2(a,b,L)CompGositionUU2.qPr}'e xes2objectstoalist.'9M?<-COMP3(a1,a2,a3,L)CompGositionUU3.qPr}'e xes3objectstoalist.'9M?<-COMP4(a1,a2,a3,a4,L)CompGositionUU4.qPr}'e xes4objectstoalist.'9L?<-LIST1(a)u˲List,UU1element.qBuildsalistfr}'omoneobject.'9L?<-LIST2(a,b)9ŲList,UU2elements.qBuildsalistfr}'om2objects.'9L?<-LIST3(a1,a2,a3)yList,UU3elements.qBuildsalistfr}'om3objects.'9L?<-LIST4(a1,a2,a3,a4)9List,UU4elements.qBuildsalistfr}'om4objects.'9L?<-LIST5(a1,a2,a3,a4,a5)List,UU5elements.qBuildsalistfr}'om5objects.'9L?<-LIST10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)9qList,10elements.6Builds/alist=9fr}'om10objects.9Selectors:'9ADV(L;?a,Lp)pyβAdvqance.qR}'eturnsthe rstelementandthereductumofalist.5C'9ADV2(L;?a,b,Lp)9ŲAdvqanceh2.[xR}'eturnsVUthe rst2elementsandthe2ndreductumof =9alist.'9ADV3(L;?a1,a2,a3,Lp)yAdvqance D3.`R}'eturnscthe rst3elementsandthe3rdreduc-=9tumofalist.'9ADV4(L;?a1,a2,a3,a4,Lp)9Advqance4.#R}'eturnsthe rst4elementsandthe4th=9r}'eductumofalist.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.'9a?<-FIRST(L)u˲First.qR}'eturnsthe rstelementofalist.'9FIRST2(L;?a,b)zȲFirstUU2.qR}'eturnsthe rst2elementsofalist.'9FIRST3(L;?a1,a2,a3)9FirstUU3.qR}'eturnsthe rst3elementsofalist.'9FIRST4(L;?a1,a2,a3,a4)FirstUU4.qR}'eturnsthe rst4elementsofalist.'9a?<-SECOND(L)zȲSecond.qR}'eturnsthe2ndelementofalist.'9a?<-THIRD(L)u˲Third.qR}'eturnsthe3rdelementofalist.'9a?<-FOURTH(L)zȲF*ourth.qR}'eturnsthe4thelementofalist.'9Lp?<-LASTCELL(L)LastUUcell.qR}'eturnsthelisthandleofthelastcellofalist.'9a?<-LELTI(A,i)9ŲListUUelement.qR}'eturnsthei-thelementofalist.'9Lp?<-RED(L)pyβReductum.qR}'eturnsthereductumofalist.'9Lp?<-RED2(L)u˲ReductumUU2.qR}'eturnsthe2ndreductumofalist.'9M?<-RED3(L)pyβReductumUU3.qR}'eturnsthe3rdreductumofalist.'9M?<-RED4(L)pyβReductumUU4.qR}'eturnsthe4threductumofalist.'9B?<-REDI(A,i)zȲReductum.qR}'eturnsthei-threductumofalist.9InformationTandPredicates:'9t?<-ISOBJECT(a)y²T*estW\forob8ject.T;estsAwhetherthear}'gumentrepresentsanobject.'9t?<-ISATOM(a)zȲT*estUUforatom.qT;estswhetherthear}'gumentrepresentsanatom.'9t?<-ISLIST(a)zȲT*estUUforlist.qT;estswhetherthear}'gumentrepresentsalist.'9t?<-ISNIL(L)u˲T*estAforemptylist.T;estswhetherthear}'gumentrepresentstheempty =9list.'9t?<-EQUAL(a,b)9ŲEqual.qT;estswhethertwoobje}'ctsareequal.'9t?<-MEMBER(a,L)y²MembGershipXtest.{uT;estsdwhetheranobje}'ctisanelementofa=9list.'9i?<-LSRCH(a,A)9ŲListUUsearch.qR}'eturnstheindexofanobjectinalist.'9n?<-EXTENT(a)zȲExtent.'9n?<-LENGTH(L)zȲLength.'9n?<-ORDER(a)u˲Order.9Concatenation:'9L?<-CCONC(L1,L2)ConstructiveUUconcatenation.qBuildsalist(l1|s;:::;lm; =9lm+1;:::;lnq~)fr}'omlists(l1|s;:::;lm)and(lm+1;:::;lnq~).'9L?<-CONC(L1,L2)y²Concatenation.qConc}'atenatestwolistsdestructively.'9M?<-LCONC(L)u˲List?concatenation.(Conc}'atenatestheelementsofalistoflistsde-=9structively.9In9version:6C'9M?<-CINV(L)pyβConstructiveHinverse.Buildsײalistc}'ontainingtheelementsofthe =9ar}'gumentininverseorder.'9M?<-INV(L)k9ѲInverse.qInvertsalistdestructively.9Insertion:'9LINS(a,L)`ײListUUinsertion.qInsertsanobje}'ctafterthe rstelementofalist.'9L?<-LEINST(A,i,a)List|elementinsertion.?Inserts anobje}'ctafterthei-thelement =9ofalist.'9Lp?<-SUFFIX(L,b)Sux.qApp}'endsanobjectafterthelastelementofalist.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.9Com9binatorial:'9M?<-LEROT(L,i,j)Listd:elementrotation.wR}'otatessomeconsecutiveelementsofa =9list.'9Lp?<-LPERM(L,P)y²ListUUpGermute.qPermutestheelementsofalist.'9Pp?<-PERMCY(P)9ŲPermutation,UUcyclic.qR}'otatesalisttotheleft.'9L?<-PERMR(n)u˲Permutation,random.?Builds alistofthe rstninte}'gersinrandom=9or}'der.'9B?<-LEXNEX(A)zȲLexicographicallyzHnext.Computesthelexic}'ographicalsuccessorof=9ap}'ermutation.9SetTOpQerations:'9b?<-SEQUAL(A,B)y²SetVequality*.u_T;estswhethertwosetsr}'epresentedasunor}'dered =9r}'edundantlistsar}'eequal.'9C?<-SDIFF(A,B)9ŲSetUUdi erence.'9B?<-SFCS(A)pyβSetUUfromcharacteristicset.'9C?<-SINTER(A,B)y²SetUUintersection.'9C?<-SUNION(A,B)y²SetUUunion.'9C?<-USDIFF(A,B)y²UnorderedUUsetdi erence.'9C?<-USINT(A,B)9ŲUnorderedUUsetintersection.'9C?<-USUN(A,B)zȲUnorderedUUsetunion.9Sorting:'9M?<-LBIBMS(L)zȲListyofBET*A-integersbubble-mergesort.4Sortsalistofatoms =9intonon-desc}'endingorder.'9LBIBS(L)[yڲList8ofBET*A-integersbubblesort.Sorts8alistofatomsintonon-desc}'ending=9or}'der.'9L?<-LBIM(L1,L2)y²ListUUofBET*A-integersmerge.qMer}'gestwosortedlistsofatoms.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.'9C?<-LMERGE(A,B)y²Listmerge.Constructively@9mer}'gestwolistsavoidingduplicate=9elements.9Input/Output:'9A?<-AREAD()pyβAtomUUread.'9AWRITE(A)`ײAtomUUwrite.'9L?<-LREAD()pyβListUUread.7$C'9LWRITE(L)`ײListUUwrite.'9B?<-OREAD()pyβOb8jectUUread.'9OWRITE(B)`ײOb8jectUUwrite.9Miscellaneous:'9C?<-PAIR(A,B)zȲPair.qBuildsalistbyinterle}'avingtheelementsoftwolists.'9SFIRST(L,a)k9ѲSetUU rstelement.qSetsthe rstelementofalist.'9SLELTI(A,i,a)u˲SetUUlistelement.qSetsthei-thelementofalist.'9SRED(L,Lp)eԲSetUUreductum.qSetsther}'eductumofalist.8 ҦC9iChapter 329cArithmetic:93.13 VIntros3duction95N cmbx123.1.17yPurp`oseuT9TheSACLIB, arithmeticpackqagessuppGortcomputationswithintegers,moGdularnumbGers, 9andUUrationalnumbGersUUwhosesizesareonlyboundedbytheamountofmemoryavqailable.獍93.1.27yDe nitionsofTerms9in9teger5wIntegersUUtobGeenteredintoSACLIB+vmustbGeofthefollowingexternalform.ڠ39=9orڠ39=9+or39=9,'9wherejdesignatesanynon-emptywordoverthealphabGet0;1;:::;9(. '9Note'thatthereisnoblankbGetween'theoptionalsignandthedigitsequence;also'9notethatleadingzerosareallowed.Inputsofthisformareinterpretedintheusual'9wayUUasdecimalnumbGers.mP'9SACLIBOC{outputsthec}'anonical[:externalr}'epresentationofintegers.]>Thisistheinteger'9inUUexternalformwithbGothpositivesignandleadingzerosdigitssupressed.'9TheUUinternalr}'epresentationIofanumbGern2Zisde nedasfollows:ڠ39=9IfUUBETA <norЍ39=9=,'9whereandareexternalformsofrelativelyprimeintegers'9NandzDG,suchthatD5>0.(Notethatnoblanksarepermittedimmediatelybeforeand'9aftersthe=.&InputsofthisformareinterpretedintheusualwayasrationalnumbGers'9withUUnumeratorNlpanddenominatorDG.荍'9SACLIBOoutputsi;thec}'anonical5externalr}'epresentationi;ofrationalnumbGersi;r/^2AQ.xIf'9r52Z,4the,canonicalexternalrepresentationofrsisthecanonicalexternalrepresenta-'9tionHoftheintegerrG.mOtherwisethereareuniqueintegersN_andDsuchthatr5= KNK&fe*]D C/,'9D0T>71,nandigcdi(N;DG)=1.2Theicanonicalexternalrepresentationofrinthiscaseis'9thecanonicalexternalrepresentationoftheintegerNfollowedby=followedbythe'9canonicalUUexternalrepresentationoftheintegerDG.'9TheUUinternalr}'epresentationRofanumbGerr52Qisde nedasfollows:Ѝ39=9IfUUr5=0thenRistheBETA-digit0.Ѝ39=9Otherwise,0,UUandgcdUW(n;d)=1.9ceiling3TofUUanumbGerUUrristhesmallestintegernsuchthatr5n.9 oQor*+ofUUanumbGerUUrristhelargestintegernsuchthatnrG.9pQositiv9e:@nUUispGositiveif0,respectively.'9t?<-IEVEN(A)u˲IntegerUUeven.qT;estswhetherthear}'gumentiseven.'9t?<-IODD(A)pyβIntegerUUoGdd.qT;estswhetherthear}'gumentisodd.9ExpQonen9tiation:'9B?<-IEXP(A,n)zȲIntegerUUexpGonentiation.'9IROOT(A,n;?B,t)9ŲIntegerUUroGot.'9ISQRT(A;?B,t)u˲IntegerUUsquareroGot.'9DSQRTF(a;?b,t)zȲDigitUUsquareroGotfunction.'9IPOWER(A,L;?B,n)y²Integer%pGower.6Ifithear}'gumentcanbeexpressedasb^nq~,*such=9inte}'gersbandnarecomputed.9GreatestTCommonDivisor:'9C?<-IGCD(A,B)zȲIntegerUUgreatestcommondivisor.'9c?<-DGCD(a,b)zȲDigitUUgreatestcommondivisor.'9IGCDCF(A,B;?C,Ab,Bb)yIntegerUUgreatestcommondivisorandcofactors.'9IEGCD(a,b;?c,u1,v1)9IntegerUUextendedgreatestcommondivisoralgorithm.'9DEGCD(a,b;?c,u,v)DigitUUextendedgreatestcommondivisor.'9IDEGCD(a,b;?c,u1,v1,u2,v2)Integerdoublyextendedgreatestcommondivisor=9algorithm.'9IHEGCD(A,B;?C,V)y²IntegerUUhalf-extendedgreatestcommondivisor.'9C?<-ILCM(A,B)zȲIntegerUUleastcommonmultiple.9F actorization:'9F?<-IFACT(n)u˲IntegerUUfactorization.'9s?<-ISPT(m,mp,F)Integer-selfridgeprimalitytest.OR}'eturnsA1iftheargumentis=9prime,-1ifitisnotprime,and0iftheprimalityc}'ouldnotbedetermined.'9ILPDS(n,a,b;?p,np)IntegerUUlargeprimedivisorsearch.'9IMPDS(n,a,b;?p,q)IntegerUUmediumprimedivisorsearch.'9ISPD(n;?F,m)pyβIntegerUUsmallprimedivisors.9PrimeTNum9bQerGeneration:'9L?<-DPGEN(m,k)9ŲDigitUUprimegenerator.9RandomTNum9bQerGeneration:'9A?<-IRAND(n)u˲Integer,UUrandom.'9a?<-DRAN()k9ѲDigit,UUrandom.'9a?<-DRANN()pyβDigit,UUrandomnon-negative.A11 ﮠC9Com9binatorial:|'9A?<-IFACTL(n)zȲIntegerUUfactorial.IH'9A?<-IBCOEF(n,k)y²IntegerUUbinomialcoGecient.qR}'eturns`.: n⍍ mke`I.pd'9B?<-IBCIND(A,n,k)IntegerbinomialcoGecientinduction.PR}'eturns6`5Vpnƍ /kw+81ן`)ygiven =9n,kP,and`.: n⍍ mke`I.ׇ'9A?<-IBCPS(n,k)9ŲIntegerUUbinomialcoGecientpartialsum.qR}'eturnsPލ""k%""i=0A`Z썑#9n0$P1i):`/3{.II9BinaryTArithmetic:'9n?<-ILOG2(A)u˲Integer^logarithm,base2.R}'eturns1+(the oorofthebase2 =9lo}'garithmoftheargument).|'9n?<-DLOG2(a)u˲DigitUUlogarithm,base2.'9IFCL2(a;?m,n)u˲Integer, oGorJandceiling,logarithm,base2.4R}'eturnsϪthe oorand=9thec}'eilingofthebase2logarithmoftheargument.'9B?<-IMP2(A,h)zȲInteger multiplicationbypGowerof2.YXMultipliesPwthear}'gumentbya=9non-ne}'gativepowerof2.'9B?<-IDP2(A,k)zȲIntegerBdivisionbypGowerof2.:gDividesnqthear}'gumentbyanon-=9ne}'gativepowerof2.'9B?<-ITRUNC(A,n)y²IntegerW/truncation.wTDividesthear}'gumentbyapositiveornega-=9tivep}'owerof2.'9n?<-IORD2(a)u˲Integer,orderޒof2. R}'eturns*thelargestnsuchthat2^n dividesthe=9ar}'gument.|9BoQolean:'9c?<-DAND(a,b)zȲDigitUUand.qR}'eturnsthebit-wise^oftwodigits.|'9c?<-DOR(a,b)u˲DigitUUor.qR}'eturnsthebit-wise_oftwodigits.'9b?<-DNOT(a)pyβDigitUUnot.qR}'eturnsthebit-wise:ofadigit.'9c?<-DNIMP(a,b)9ŲDigitnon-implication.8R}'eturnsthebit-wise:(a5)b)ofdigitsa=9andb.|9Input/Output:'9A?<-IREAD()pyβIntegerUUread.|'9IWRITE(A)`ײIntegerUUwrite.'9ILWRITE(L)eԲIntegerUUlistwrite.qWritesalistofinte}'gersintheform=9(n1|s;n2;:::;nk됲)totheoutputstr}'eam.|9AuxiliaryTF unctions:'9C?<-ISSUM(n,L)9ŲInteger shiftedsum.OComputes=Pލk%i=0ٵCiTLBETAT@\pin$ױgiven=nandthe=9CiTL.|'9ISEG(A,n;?A1,A0)y²IntegerHJsegmentation.Splitscaninte}'gerataBETA-digitboundary.'9C?<-IDIPR2(A,B,a,b)yIntegerdigitinnerproGduct, length2.(kComputeskAaY+Bqb=9forinte}'gersA;BXandBETA-digitsa;b.'9C?<-ILCOMB(A,B,u,v)yInteger~linearcombination.N*Computes1Aac3+Bqbforinte}'gers=9A;BXandBETA-digitsa;bwithAa8+Bqb0.'9DPCC(a1,a2;?u,up,v,vp)DigitUUpartialcosequencecalculation.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.A12 `C93.33 VMos3dularffNumberArithmetic93.3.17yMo`dularDigitArithmeticuT9BasicTArithmetic:'9c?<-MDSUM(m,a,b)MoGdularUUdigitsum.'9c?<-MDDIF(m,a,b)MoGdularUUdigitdi erence.'9b?<-MDNEG(m,a)9ŲMoGdularUUdigitnegative.'9c?<-MDPROD(m,a,b)MoGdularUUdigitproduct.'9c?<-MDQ(m,a,b)9ŲMoGdularUUdigitquotient.'9b?<-MDINV(m,a)9ŲMoGdularUUdigitinverse.'9b?<-MDEXP(m,a,n)MoGdularUUdigitexponentiation.9ChineseTRemainderAlgorithm:'9a?<-MDCRA(m1,m2,mp1,a1,a2)9MoGdularUUdigitchineseremainderalgorithm.'9L?<-MDLCRA(m1,m2,L1,L2)yMoGdularUUdigitlistchineseremainderalgorithm.'9b?<-MDHOM(m,A)9ŲMoGdularUUdigithomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9a?<-MDRAN(m)u˲MoGdularUUdigit,random.693.3.27yMo`dularIntegerArithmeticuT9BasicTArithmetic:'9C?<-MISUM(M,A,B)MoGdularUUintegersum.'9C?<-MIDIF(M,A,B)MoGdularUUintegerdi erence.'9B?<-MINEG(M,A)9ŲMoGdularUUintegernegation.'9C?<-MIPROD(M,A,B)MoGdularUUintegerproduct.'9C?<-MIQ(M,A,B)9ŲMoGdularUUintegerquotient.'9B?<-MIINV(M,A)9ŲMoGdularUUintegerinverse.'9B?<-MIEXP(M,A,N)MoGdularUUintegerexponentiation.9ChineseTRemainderAlgorithm:'9As?<-MIDCRA(M,m,mp,A,a)yMoGdularUUintegerdigitchineseremainderalgorithm.'9As?<-MIHOM(M,A)y²MoGdularUUintegerhomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9R?<-MIRAN(M)u˲MoGdularUUinteger,random.9Con9version:'9B?<-SMFMI(M,A)9ŲSymmetric7moGdularfrommodularinteger./Computestheisomor- =9phismfr}'omZm ,tofb m&fe2⍟bQ+81;:::;b m&fe2⍟bqg.A13 C93.43 VRationalffNumbs3erArithmetic9BasicTArithmetic:'9T?<-RNSUM(R,S)9ŲRationalUUnumbGersum.'9T?<-RNDIF(R,S)9ŲRationalUUnumbGerdi erence.'9S?<-RNNEG(R)u˲RationalUUnumbGernegative.'9T?<-RNPROD(R,S)y²RationalUUnumbGerproduct.'9T?<-RNQ(R,S)u˲RationalUUnumbGerquotient.'9S?<-RNINV(R)u˲RationalUUnumbGerinverse.'9s?<-RNSIGN(R)zȲRationalUUnumbGersign.'9S?<-RNABS(R)u˲RationalUUnumbGerabsolutevqalue.'9t?<-RNCOMP(R,S)y²RationalUUnumbGercomparison.'9c?<-RNMIN(a,b)9ŲRationalUUnumbGermin.'9c?<-RNMAX(a,b)9ŲRationalUUnumbGermax.9Constructors:'9R?<-RNINT(A)u˲RationalUUnumbGerfrominteger.qR}'eturns n&fe~z1givenanintegern.'9R?<-RNRED(A,B)9ŲRationaldnumbGerreductiontolowestterms.P"R}'eturns j=nj=&fe~cd given7 two =9inte}'gersnanddwithd6=0.9Selectors:'9a?<-RNNUM(R)u˲RationalUUnumbGernumerator.'9b?<-RNDEN(R)u˲RationalUUnumbGerdenominator.9RandomTNum9bQerGeneration:'9R?<-RNRAND(n)zȲRationalUUnumbGer,random.9Input/Output:'9R?<-RNREAD()u˲RationalUUnumbGerread.'9RNWRITE(R)eԲRationalUUnumbGerwrite.'9RNDWRITE(R,n)u˲RationalHInumbGerdecimalwrite.JAppr}'oximatesslarationalnumber =9byade}'cimalfractionwithagivenaccuracyandwritestheapproximationtothe=9outputstr}'eam.9Miscellaneous:'9a?<-RNCEIL(r)zȲRationalUUnumbGer,ceilingof.'9a?<-RNFLOR(r)zȲRationalUUnumbGer, oorof.'9RNBCR(A,B;?M,N,k)RationalUUnumbGerbinarycommonrepresentation.'9RNFCL2(a;?m,n)zȲRationalUUnumbGer oorandceilingoflogarithm,base2.'9r?<-RNP2(k)pyβRationalUUnumbGerpowerof2.qComputes2^n egivenaGAMMA-digitn.A14̠C9iChapter 429cP8olynomial T{Arithmetic:94.13 VIntros3duction94.1.17yPurp`oseuT9The ;SACLIB-BpGolynomial ;arithmeticpackqagesprovidefunctionsdoingcomputationswith 9multivqariateUUpGolynomialsoverdomainsimplementedbytheSACLIB+varithmeticpackqages.9Except.forthefunctionslistedinSection4.7andvqariousconversion.functions,6Qonlythe9sp}'arserecursiveUUrepresentationisused.694.1.27yDe nitionsofTerms9sparseTrecursiv9erepresentationApGolynomial墵p2D[x1|s;:::;xrm]isinterpretedasanel-'9ementof(::: UO(D[x1|s]):::)[xrm],forsomedomainD.TheSACLIB*#sp}'arserecursiverepre-'9sentation8PofapGolynomialp=Pލ USn% USi=1tJpiTLx^eO \cmmi5i፴r &with8e1C>:::8>enq~,qǵpid2(::: UO(D[x1|s]):::)[xr71],'9andUUpid6=0isde nedrecursivelyasfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.39=9Ifr!}>`0,#thenPisthelist(e1|s;P1;:::;enq~;Pn)wheretheeiNͲareBETA-digitsand=9eachUUPiistherepresentationofpiTL.9sparseTdistributiv9erepresentationβA^pGolynomialp2D[x1|s;:::;xrm]isinterpretedas'9pԲ=Pލin%ii=1diTLx^eivC,#whereadi/ 2D,di/ 6=0,andax^ei standsforxWei;Zcmr51O1 (xWei;2O2ҷ(xWei;rrwith'9ei;j '0.+F*urthermore, {weassumethate19>e2>:::#>enq~, {where觵ek/>eiei;3^|O.'9The8sp}'arse8distributiverepresentation8PofsuchapGolynomialpisthelist(D1|s;E1;D2;E2;:::;Dnq~;En),'9where8Di/istheSACLIB)cinternalrepresentationofdi/andEiisthelist(ei;r ;ei;r71b;:::;ei;1 )'9withUUei;j MbGeingBETA-digits.'9AsUUalwaysinSACLIB(G!,P=0ifp=0.9denseTrecursiv9erepresentation㵲ApGolynomialdpHظ2D[x1|s;:::;xrm]isinterpretedasan'9elementvof(::: UO(D[x1|s]):::)[xrm],DforvsomedomainD.Thedense!r}'ecursiverepresentation'9PofapGolynomialp=Pލ USn% USi=0tJpiTLx^ir.withpid2(::: UO(D[x1|s]):::)[xr71]isde nedrecursively'9asUUfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.A15C39=9Ifɵr>vٲ0,&thenPisthelist(n;Pnq~;Pn1;:::;P0|s)wherethenisaBETA-digitand =9eachUUPiistherepresentationofpiTL.9pQolynomialJPIfthistermappGearsintheparameterspeci cationsofafunction,thisdenotes'9a6pGolynomialinthesparserecursiverepresentation.gOtherwise,=itisusedtodenotea'9pGolynomialUUinarbitraryrepresentation.9baseTdomain,baseringu'IfUUpisanelementofD[x1|s;:::;xrm],Disitsbasedomain.9in9tegralTpQolynomialt³AUUpGolynomialwhosebasedomainisZ.9moQdularTpolynomialxo#AipGolynomialwhosebasedomainisZm ,withmaprimepositive'9BETA-digit.9moQdularTin9tegralpolynomialA pGolynomialMwhosebasedomainisZm :withmapositive'9integer.9rationalTpQolynomialuf?AUUpGolynomialwhosebasedomainisQ.9mainTv\rariableW6JofUUapGolynomialinD[x1|s;:::;xrm]isxr.9degree3The9degreeofapGolynomialw.r.t.agivenvqariableisthehighestpower9ofthisvqari-'9able#appGearingwithnon-zerocoecientinthepolynomial.aMIfnovqariableisspeci ed,'9theUUdegreeiscomputedw.r.t.themainvqariable.9order.TheUUorderofapGolynomialp=Pލ USn% USi=0tJpiTLx^irisUUthesmallestk0suchthatpk6=0.9constan9tTpQolynomialx|AUUpGolynomialofdegree0ineveryvqariable.9leadingTtermROofǦapGolynomialisapolynomialequaltothetermofhighestdegreew.r.t.'9theUUmainvqariable.9reductumCofUUapGolynomialisthepolynomialminusitsleadingterm.9leadingTcoQecien9tlbThe#cleadingcoGecientofapolynomialisthecoecientofitsleading'9term.9leadingTbasecoQecien9tAndelementofthebasedomainequaltothecoGecientofthe'9leadingUpGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9trailingTbasecoQecien9tZ$AnelementofthebasedomainequaltothecoGecientofthe'9smallest\pGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9monicTpQolynomiallAUUpGolynomial,theleadingcoecientofwhichis1.9pQositiv9eTpolynomialu[AUUpGolynomial,theleadingbasecoecientofwhichispGositive.9sign'Anxintegerequalto1iftheleadingbasecoGecientofthepGolynomialispositive,1'9otherwise.9absoluteTv\ralueZofUUapGolynomialpisthepositivepolynomialq.suchthatp=sign7(p)8q[ٲ.9con9tent8qof apGolynomialpisequaltotheabsolutevqalueofthegreatestcommondivisorof'9theUUcoGecientsofp.9in9tegerTcontent_ ۲ofanintegralpGolynomialisanintegerequaltothepGositivegreatest'9commonUUdivisoroftheintegercoGecientsofeachpGowerproGductofthepolynomial.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.A16-C9squarefreeTpQolynomialݵApGolynomialpissquarefreeifeachfactoroccursonlyonce.,In '9otherwords,iifp1=p:e1l1 2bp~ekk hisacompletefactorizationofptheneachoftheei7Jis'9equalUUto1.N9squarefreeTfactorizationQ@Theysquarefreefactorizationofpisp:e1l1 2bp~ekk awhere1je1<'95<ek\andeachofthepiisapGositivesquarefreepGolynomialofpositivedegree.@DNote'9thatUUifpissquarefreethenp^1Ȳisthesquarefreefactorizationofp.9v\rariableT(name)b;Azlist(c1|s;:::;ck됲),wheretheciAareCcharacters.:Example:_thename'9"fubar"UUwouldbGerepresentedbythecharacterlist('f','u','b','a','r').9listTofv\rariables_|RAA&listA,(n1|s;:::;nrm)givingthenamesofthecorrespGondingvqariablesofan'9rG-vqariateUUpolynomialforinputandoutput. 􍍑94.23 VPolynomialffInputandOutput9In thissectionwewilldescribGethepolynomialinputandoutputroutinesthatareavqailable9inKSACLIB).RBeforeKproGceedingfurther, thereadershouldbefamiliarwiththeinternal9representationsUUofpGolynomialswhicharediscussedinSection4.1.2.f94.2.17yRecursivep`olynomialsoverZuT9Theexternalʊc}'anonicalrepresentationofsparser}'ecursivepGolynomialsoverZisde nedby9thefollowingrules.DFirstofall,eachpGolynomialisenclosedinparentheses.DA͝termisrepre-9sentedbythecoGecientimmediatelyfollowedbythevqariable(nospacenor'*'inbGetween).9ThecoGecients+1and1aresuppressedunlesstheexponentofthevqariableis0inwhich9casethevqariableissuppressed.PMThecaret'^'isusedtoindicateexpGonentiation.Exponents9withthevqalue1aresuppressedandifavariablehastheexpGonent0thenthevariable9issuppressed.ʀTheserulesapplyrecursivelytothecoGecientswhichmaythemselvesbGe9pGolynomials.qAUUfewexamplesareinorder.?%?L͉ff)hfdͤ fffdrecursiveUUpGolynomial ffSexternalUUcanonicalform# ffff)h͟ ffy_ ff(5 ff ͤ ff6fdx^4S+82x^3x+36 ff^(-x^4+2x^3-x+3)/̵ ff͟ ffy_ ff(5 ffͤ ff͟fd(x^2S+81)y[ٟ^3,+(x+8)y5 ff((x^2+1)y^3+(x+8)y+(-5)),ß ff͟ ffy_ ff(5 ffͤ fffd(x^2S84)y[ٟ^4,+y[ٟ^2yx ff^((-x^2+4)y^4+(1)y^2+(-1)y+(-x))͟ ff͟ ffy_ ff(5 ffff)h9NoteOthataconstantpGolynomialinr2lvqariableswillbeenclosedinr2lsetsofparentheses.NpF*or 9example,>Qthe8constantpGolynomial2in3vqariableswillberepresentedinexternalcanonical9formUUas(((2))).9The݇algorithmIPREADireadsanrG-vqariaterecursivepolynomialover݇Zinexternalcanon-9ical=formfromtheinputstream.OThepGolynomialthatisreadisstoredininternalcanonical9formandthenumbGerofvqariablesisalsorecorded.OThevariablesarenotstored.OInteger9coGecientsmaybGeofarbitrarylengthbutexponentsmustbGeBETA-digits.]Sincenosort-9ingPispGerformedontheterms,theymustbegiveninorderofdescendingdegree.иThisis9an>2impGortantremarksincealmostallalgorithmsthatmanipulatepolynomialsrequirethat9thejEtermsbGeorderedandviolatingthisrulewillundoubtedlycauseincorrectresultstobe9computedD)andmayevencrashthesystem.lAnotherimpGortantremarkisthattermswhose9coGecientsare0shouldnotbegivenasthesetermswillbestoredandmaycauseproblems,9forUUexampleinequalitytesting.9Although IPREADishappiestwhenapGolynomialisgiveninexternalcanonicalform9asexempli edbythepreviousexamples,theuserisallowedsomefreedom.AnarbitraryA17=ΠC9numbGer)ofspacesmayinterspGersedbetween)thecoecients,Ethevqariables,theexpGonents 9and=thesymbGols'+',B'-'and'^'.MSpacesmaynotbGeinsertedwithinavqariablenorwithinan9integer.F!CoGecientswithmagnitude1aswellastheexponents0and1maybGeexplicitly9given.Thus,forxexample,((x?^2+1)y^3+(1x+8)y^1-(5x^0)y^0)ispGerfectlyvqalid9andUUisequivqalenttothesecondexamplegiveninthetableabGove.9SincebIPREADbwasintendedtobGeusedmainlyforreadingoutputproducedbyprevious9computations,iitisdesignedtobGefastand,consequently*,verylittleerrorcheckingispGer-9formedontheinput. Amongotherthings,BIPREADdoGesnotcheckforconsistencyamong9the%vqariables,Ye.g.8((y)x^2+(z)y)willbGeacceptedasvalidinputandwouldbGeidentical9to((u)v^2+(u)v)ininternalrepresentation.Also,1IPREADdoGesnotcheckforconsistency9amongterms, Ji.e.[eachtermisproGcessedseparatelyanditisnotcheckedwhetherallterms9have~thesamenumbGer~ofrecursivenestings.gF*orexample,B(y^3+(x-1)y)willbeaccepted9althoughYthe rstterm,y^3,isYaunivqariatepGolynomialwhereasthesecond,(x-1)y,isYa9bivqariatepGolynomial.It7 isther}'efore7 ther}'esponsibility7 oftheusertose}'ethatpolynomials9ar}'einputproperly.9Theo~algorithmIPWRITEoxtakesasinputsanrG-vqariaterecursivepGolynomialAoxoverZand9aXlistV?=(v1|s;:::;vrm)XofrvqariablesandwritesAXtotheoutputstreamusingthevariables9spGeci edwithvr dEasthemainvqariableandv1 sasthemostminorvariable. UThelistV9maykbGeinitializedusingVLREADkewhichreadsavqariablelistfromtheinputstream.F*or9generatingByalistwitha xednumbGerByofvqariablesonecouldalsouseanexpressionsuch9asLIST3(LFS("X"),LFS("Y"),LFS("Z")).IHerethefunctionsLFSxisusedforconverting9a7pC76stringtoaSACLIBvqariable.ItispGossibletousethealgorithmIUPWRITEtowrite9univqariaterecursivepGolynomialsbutthisalgorithmwasintendedmainlyasasubroutine9toHbGecalledbyIPWRITE,whichalsohandlesunivqariatepGolynomials,Kandtheuserneednot9evenUUbGeawareofitsexistence.9TherezlisanadditionalsetofinputfunctionsofwhichthetoplevelfunctionisIPEXPREAD.9TheformatacceptedbythisfunctionisabitmoreconvenientasexpressionsmaybGeofthe9form(3?XY^2+X)^3-(YX+Y)(X-1)^2+5.fNotethatIPEXPREADalsotakesa9vqariableYlistasinputandthereforecandetecttheorderofthevariableswithoutrequiring9theUUrecursivestructuremadeexplicitbyparentheses.9T*o$bGemoreprecise, IPEXPREADacceptsanypolynomialexpressionbuiltfromintegers9andvqariablesusing+,>-,blanksformultiplication,>^forexpGonentiation,>andparenthesisfor9grouping.*TheexpressionmaybGeterminatedbyanycharacternotbGeingpartofthelegal9input+set(e.g.apGeriod,&a+semicolon,etc.).^dThisterminatingcharacterisnotremovedfrom9theUUinputstream.9ThetfunctionIPEXPREADRthasthesamespGeci cationasIPEXPREAD,withthedi erence9thatUUitdo}'esremoveUUtheterminatingcharacter.694.2.27yRecursivep`olynomialsoverQuT9F*or )9rG-vqariaterecursivepolynomialsover )9QthealgorithmsRPREAD &and9RPWRITEJ̲areJthecorrespGondinginputandoutputroutines.nEThesituationforrationalpoly-9nomials(isessentiallythesameasthatforintegralpGolynomialswiththeexceptionthatthe9base6coGecientsmaybGerationalnumbGers.kThesamefreedomsonvqalidinputapplyand9an>arbitrarynumbGer>ofspacesmaybeinsertedbeforeandafter'/'..Ifthedenominator9of}abasecoGecientis1thenonlythenumeratorisintheexternalcanonicalrepresen-9tation.ymustappGearinthesameorderthattheyappearinVandthetermsmustbeorderedin9descending'degreeinvrm.5F*orexample,×ifV=(x,y,z)then(4?z^5-y^2z^4+9xyz)9is:vqalidbut(4?z^5+9yxz-y^2z^4):isnotfortwo:reasons| rst,?yappGearsbefore9xintheterm9?yxzandsecond,֖theterm9?yxzappGearsbefore-?y^2z^4which9violatestherulethattermsmustappGearinorderofdescendingdegreeinz.Additionally*,9if"therearetwo"termswiththesamedegreeinvrQIJthentheyshouldbGeorderedaccording9todescendingdegreeinvr71Tandsoon.qCoGecientsmaybGeseparatedfromthevqariables9bytanarbitrarynumbGerofspaces(includingnospaceatall).gV*ariablesmustbGeseparated9by atleastonespaceifthereisnoexpGonentexplicitlygiven,otherwiseanarbitrarynum-9bGerofspacesmayseparatethem.F*orexample(4z^5?-y^2z^4+9xyz)isvqalidbut9(4z^5?-y^2z^4+9xyz)UUisnotsincexyzwillbGetreatedasasinglevqariable.694.2.47yDistributivep`olynomialsoverQ9DistributivepGolynomialsoverQmaybGereadinandwrittenoutusingthealgorithms9DIRPREADXuandXDIRPWRITE.Theonlydi erencebGetweenXrationaldistributivepolynomials9andPintegraldistributivepGolynomialsisthatthebasecoecientsmaybGerationalnumbGers9andnotjustintegers.ItshouldbGeclearafterreadingtheprecedingsubsectionswhat9constitutesUUvqalidinputandwewillnotdiscussthismatterfurther.694.2.57yConversionBetweenRecursiveandDistributive7yRepresentation9Converting recursivepGolynomialstodistributivepGolynomialscanbeachievedbyusing9DIPFPwhich,given5apGolynomialinrecursiveinternalrepresentation,computesanequiv-9alentoneindistributiveinternalrepresentation.YIntheotherdirection,namelytoconvert9from)Kdistributivetorecursiverepresentation,2thealgorithmPFDIP)?isprovided.cBothDIPFP9and˪PFDIPˌworkforpGolynomialsovereitherZorQbutthenumbGerofvqariablesmustbGe9spGeci ed.j=F*or>example,C=ifA>isapolynomialover>Qininternalrecursiverepresentationand9theUUuserwantsUUtodisplayAinexternaldistributiverepresentationthenthecoGdeDIRPWRITE(r,DIPFP(r,A),V);9whereUUrisequaltothenumbGerUUofvqariablesandVisalistofrvariables,willsuce.694.2.67yPolynomialsoverZ2cmmi8m9The6inputandoutputroutinesforpGolynomialsover6ZworkequallywellforpGolynomials 9overUUZm.A19hC94.33 VDomainffIndeps3endentPolynomialArithmetic9Constructors:'9A?<-PFBRE(r,a)9ŲPolynomial'fromBaseRingElement.NBuilds3$anr-variatep}'olyno- =9mialfr}'omanelementofsomedomain.'9A?<-PMON(a,e)zȲPolynomialUUmonomial.qBuildsax^e2fr}'omaande.'9A?<-PBIN(a1,e1,a2,e2)Polynomial8binomial.Builds8a1|sx^e12k+a2x^e2 fr}'oma1;a2;e1,=9ande2|s.9Selectors:'9a?<-PLDCF(A)u˲PolynomialպleadingcoGecient.G>R}'eturnstheleadingcoecientw.r.t.=9themainvariable.'9B?<-PRED(A)pyβPolynomialreductum.`R}'eturnsythereductum(thepolynomialminus=9itsle}'adingterm)w.r.t.themainvariable.'9a?<-PLBCF(r,A)9ŲPolynomial~leadingbasecoGecient.GR}'eturns "thecoecientofthe=9termofthehighestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).'9a?<-PTBCF(r,A)9ŲPolynomial3trailingbasecoGecient.@R}'eturns thecoecientofthe=9termofthelowestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).9InformationTandPredicates:'9n?<-PDEG(A)pyβPolynomialdegree.yR}'eturns.thedegreeoftheargumentw.r.t.the=9mainvariable.'9n?<-PMDEG(A)u˲Polynomial6qmoGdi eddegree.R}'eturnscthedegreeoftheargument,=91ifthear}'gumentis0.'9n?<-PDEGSV(r,A,i)Polynomialdegree,/spGeci edvqariable.}R}'eturns4thedegreeof=9thear}'gumentw.r.t.thei-thvariable.'9V?<-PDEGV(r,A)9ŲPolynomialvtdegreevector.#R}'eturns_alist(d1|s;:::;drm)wherediis=9thede}'greeofargumentw.r.t.thei-thvariable.'9b?<-PCONST(r,A)y²Polynomialdconstant./T;ests"whetherthear}'gumentisaconstant=9p}'olynomial.'9b?<-PUNT(r,A)zȲPolynomialunivqariatetest.wT;estsPwhetherthear}'gumentisauni-=9variatep}'olynomial.'9k?<-PORD(A)pyβPolynomialp7order.mR}'eturns(thesmallestexponentappearinginthe=9ar}'gumentpolynomial(w.r.t.themainvariable).9T ransformation:'9B?<-PSDSV(r,A,i,n)9PolynomialspGecialdecomposition,speci edvqariable.&Com- c=9putesp(x1|s;:::;x:1=nZi յ;:::;xrm)givenp;i;n,andrG.'9B?<-PDPV(r,A,i,n)PolynomialdivisionbypGowerofvqariable.ComputesӴx䍷ni p=9givenp;i,andn.'9B?<-PMPMV(A,k)9ŲPolynomial multiplicationbypGowerofmainvqariable.Computes=9x^nq~pgivenpandn,withxb}'eingthemainvariableofp.'9B?<-PRT(A)k9ѲPolynomial!reciproGcaltransformation.*Computesx^nq~p(x^1 t)withnz==9degL](p).'9B?<-PDBORD(A)zȲPolynomial>dividedbyorder.DjComputesx^n pwher}'enistheorder=9ofp.A20{GC9Con9version^1|s:'9B?<-PFDIP(r,A)9ŲPolynomialdfromdistributivepGolynomial.![Computesap}'olynomial =9inthesp}'arserecursiverepresentationfromapolynomialinthesparsedistributive=9r}'epresentation.'9B?<-PFDP(r,A)zȲPolynomialfromdensepGolynomial.UComputesDap}'olynomialinthe=9sp}'arserecursiverepresentationfromapolynomialinthedenserecursiverepre-=9sentation.9Miscellaneous:'9B?<-PINV(r,A,k)y²PolynomialintroGductionofnewvqariables.GComputesap}'olyno-=9mialinRDz[y1|s;:::;ysF:;x1;:::;xrm]fr}'omapolynomialinRDz[x1|s;:::;xrm].'9B?<-PPERMV(r,A,P)PolynomialpGermutationofvqariables.PComputes82ap}'olynomial=9inCRDz[xp1r;:::;xpr ]fr}'omapolynomialinRDz[x1|s;:::;xrm],lwhere(p1|s;:::;prm)isa=9p}'ermutationof(1;:::;rG).'9B?<-PCPV(r,A,i,j)PolynomialUUcyclicpGermutationofvqariables.'9B?<-PICPV(r,A,i,j)9PolynomialUUinversecyclicpGermutationofvqariables.'9B?<-PTV(r,A,i)9ŲPolynomialUUtranspGosevqariables.'9B?<-PTMV(r,A)zȲPolynomialUUtranspGosemainvqariables.'9B?<-PUFP(r,A)zȲPolynomial,univqariate,fromxpGolynomial.1ComputesZaunivariate=9p}'olynomial0Mfromanr-variatepolynomialbysubstituting0forallvariablesexcept=9themainvariablexrm.'9L?<-PCL(A)k9ѲPolynomialcoGecientlist.ۺR}'eturnsalist(pnq~;:::;p0|s)wherenisthe=9de}'greeofpandthepi3ar}'ethecoecientsofp.!č94.43 VIntegralffPolynomialArithmetic9BasicTarithmetic:'9C?<-IPSUM(r,A,B)IntegralUUpGolynomialsum.'9C?<-IPDIF(r,A,B)IntegralUUpGolynomialdi erence.'9B?<-IPNEG(r,A)9ŲIntegralUUpGolynomialnegative.'9C?<-IPPROD(r,A,B)IntegralUUpGolynomialproduct.'9C?<-IPIP(r,a,B)y²IntegralpGolynomialintegerproGduct.ComputesGc&pgivenan=9inte}'gercandanintegralpolynomialp.'9C?<-IPP2P(r,B,m)IntegralUUpGolynomialpowerUUof2product.'9IPQR(r,A,B;?Q,R)y²IntegralUUpGolynomialquotientandremainder.'9C?<-IPQ(r,A,B)9ŲIntegralUUpGolynomialquotient.'9C?<-IPIQ(r,A,b)y²Integral[pGolynomialintegerquotient.Computesp=cgivenan=9inte}'gralpolynomialpandanintegerc.'9C?<-IPPSR(r,A,B)IntegralUUpGolynomialpseudo-remainder.'9IUPSR(A,B;?ab,bb,C)9IntegralUUunivqariatepGolynomialsemi-remainder.'9B?<-IPEXP(r,A,n)IntegralUUpGolynomialexponentiation.'9s?<-IPSIGN(r,A)y²IntegralUUpGolynomialsign.'9B?<-IPABS(r,A)9ŲIntegralUUpGolynomialabsolutevqalue.9X-ffl) J= "5-:1LSeeXSection4.7foradescriptionofthesparsedistributivÎeandthedenserecursiverepresentations.A21C9Di eren9tiationTandIntegration:؞'9B?<-IPDMV(r,A)9ŲIntegralUUpGolynomialderivqative,mainvqariable.؞'9B?<-IPDER(r,A,i)Integral/pGolynomialderivqative.e3Computesq1thederivativeofthe =9ar}'gumentw.r.t.thei-thvariable.'9B?<-IPHDMV(r,A,k)IntegralEZpGolynomialhigherderivqative,[mainvqariable.ACom-=9putesthek-thderivativeofthear}'gumentw.r.t.themainvariable.'9B?<-IPINT(r,A,b)Integral6pGolynomialintegration.jComputes theinte}'gral ofthe=9ar}'gumentw.r.t.themainvariable.؞9SubstitutionTandEv\raluation:'9C?<-IPSMV(r,A,B)Integral pGolynomialsubstitutionformainvqariable.YSubstitutes=9aninte}'gralpolynomialforthemainvariableofanintegralpolynomial.؞'9C?<-IPSUB(r,A,i,B)9Integral8pGolynomialsubstitution.Substitutes8aninte}'gral8poly-=9nomialforthei-thvariableofaninte}'gralpolynomial.'9C?<-IPGSUB(r,A,s,L)yIntegralpGolynomialgeneralsubstitution..Substitutes`anin-=9te}'gralpolynomialsforallvariablesofanintegralpolynomial.'9B?<-IUPQS(A)u˲IntegralUUunivqariatepGolynomialquotientsubstitution.'9B?<-IPEMV(r,A,a)Integral{~pGolynomialevqaluationofmainvariable.ASubstitutesa=9c}'onstantforthemainvariableofanintegralpolynomial.'9B?<-IPEVAL(r,A,i,a)yIntegralpGolynomialevqaluation.Substitutesac}'onstantfor=9thei-thvariableofaninte}'gralpolynomial.'9b?<-IUPBEI(A,c,m)Integral4univqariatepGolynomialbinaryrationalevaluation,;in-=9tegerUUoutput.'9s?<-IUPBES(A,a)y²IntegralLpunivqariatepGolynomialbinaryrationalevaluationofsign.'9b?<-IUPBRE(A,a)y²IntegralUUunivqariatepGolynomialbinaryrationalevaluation.'9B?<-IPBEILV(r,A,c,k,m)9IntegralpGolynomialbinaryrationalevqaluation,integral=9pGolynomialUUresult,leadingvqariable.'9B?<-IPBREI(r,A,i,c)yIntegral8pGolynomialbinaryrationalevqaluation,qintegralpGoly-=9nomialUUresult.؞9T ransformation:'9B?<-IPTRMV(r,A,h)IntegralYpGolynomialtranslation, mainvqariable. Computes=9p(x8+h)givenpandh,wher}'existhemainvariableofp.؞'9B?<-IPTRAN(r,A,T)IntegralpGolynomialtranslation.?Computes 7p(x1Բ+ at1|s;:::;xry+=9trm)givenpandthetiTL.'9B?<-IPBHT(r,A,i,k)9IntegralUUpGolynomialbinaryhomothetictransformation.'9B?<-IPBHTLV(r,A,k)9IntegralpGolynomialbinaryhomothetictransformation,lead-=9ingUUvqariable.'9B?<-IPBHTMV(r,A,k)9IntegralzrpGolynomialbinaryhomothetictransformation,9main=9vqariable.'9B?<-IUPBHT(A,k)y²IntegralunivqariatepGolynomialbinaryhomothetictransforma-=9tion.'9B?<-IUPIHT(A,n)y²IntegralDunivqariatepGolynomialintegerhomothetictransforma-=9tion.'9B?<-IPNT(r,A,i)y²IntegralUUpGolynomialnegativetransformation.'9B?<-IUPNT(A)u˲IntegralUUunivqariatepGolynomialnegativetransformation.A22/C'9B?<-IPTR(r,A,i,h)IntegralUUpGolynomialtranslation,speci edvqariable.ꍍ'9B?<-IUPTR(A,h)9ŲIntegralUUunivqariatepGolynomialtranslation.'9B?<-IPTR1(r,A,i)IntegralbpGolynomialtranslationby1,espGeci edvqariable.speci- =9 edUUvqariable.'9B?<-IPTRLV(r,A)y²IntegralUUpGolynomialtranslation,leadingvqariable.'9B?<-IPTR1LV(r,A)IntegralUUpGolynomialtranslationby1,leadingvqariable.'9B?<-IUPTR1(A)zȲIntegralUUunivqariatepGolynomialtranslationby1.ꍍ9Predicates:'9t?<-IPCONST(r,A)Integral"pGolynomialconstant.`T;estsewhetherthear}'gumentisa=9c}'onstant.ꍍ'9t?<-IPONE(r,A)9ŲIntegralUUpGolynomialone.qT;estswhetherthear}'gumentis1.9RandomTP9olynomialGeneration:'9A?<-IPRAN(r,k,q,N)9IntegralUUpGolynomial,random.9Con9version:'9IPSRP(r,A;?a,Ab)y²IntegralpGolynomialsimiliartorationalpolynomial.Givena=9r}'ationalpolynomialq[,computesarationalnumbercandanintegralpolynomial=9pwithcp=q[.ꍍ'9B?<-IPFRP(r,A)9ŲIntegralpGolynomialfromrationalpolynomial.Computes)anin-=9te}'gral>=polynomialfromarationalpolynomialwhosebasecoecientsareintegers.9Input/Output:'9IPREAD(;?r,A)u˲IntegralUUpGolynomialread.ꍍ'9IPEXPREAD(r,V;?A,t)9IntegralUUpGolynomialexpressionread.'9IPWRITE(r,A,V)zȲIntegralUUpGolynomialwrite.'9IPDWRITE(r,A,V)9ŲIntegralBPolynomialDistributiveW*rite.FWritesQaninte}'gralQrecur-=9sivep}'olynomialindistributiveform.ꍍ9Con9tentsTandPrimitiv9eParts:'9IPICPP(r,A;?a,Ab)IntegralUUpGolynomialintegercontentandprimitivepart.ꍍ'9c?<-IPIC(r,A)zȲIntegralUUpGolynomialintegercontent.'9Ab?<-IPIPP(r,A)y²IntegralUUpGolynomialintegerprimitivepart.'9d?<-IPICS(r,A,c)IntegralUUpGolynomialintegercontentsubroutine.'9IPSCPP(r,A;?s,C,Ab)9IntegralpGolynomialsign,#content,andprimitivepart.]0Com-=9putesxthesign,c}'ontentandprimitivepartoftheargumentw.r.t.themainvari-=9able.'9IPCPP(r,A;?C,Ab)y²IntegralUUpGolynomialcontentandprimitivepart.'9C?<-IPC(r,A)u˲IntegralUUpGolynomialcontent.'9Ab?<-IPPP(r,A)9ŲIntegralUUpGolynomialprimitivepart.'9IPLCPP(r,A;?C,P)y²IntegralUUpGolynomiallistofcontentsandprimitiveparts.ꍍ9P9olynomialTNorms:'9b?<-IPSUMN(r,A)y²IntegralUUpGolynomialsumnorm.ꍍ'9b?<-IPMAXN(r,A)y²IntegralUUpGolynomialmaximumnorm.A23lC9ChineseTRemainderAlgorithm:'9As?<-IPCRA(M,m,mp,r,A,a)IntegralUUpGolynomialchineseremainderalgorithm.9SquarefreeTF actorization:'9L?<-IPSF(r,A)zȲIntegralUUpGolynomialsquarefreefactorization.'9L?<-IPFSD(r,A)9ŲIntegralUUpGolynomialfactorization,secondderivqative.'9L?<-IPSFSD(r,A)y²IntegralUUsquarefreefactorization,secondderivqative.9ComputationsTinIdeals:'9B?<-IPTRUN(r,D,A)Integral8pGolynomialtruncation.Computes8pmod(x:d1l1ҵ;:::;x^dr፴ri) =9givenpandthediTL.'9C?<-IPTPR(r,D,A,B)9IntegralUUpGolynomialtruncatedproduct.qComputespqmod=9(x:d1l1ҵ;:::;x^dr፴ri)givenp;q[,andthediTL.'9B?<-IPIHOM(r,D,A)IntegralDpGolynomialmodidealhomomorphism. ?Computes=9pmoGd U=9(x:d1l1ҵ;:::;x㍴dr,r 0ncmsy51Ír718)givenanr-variatep}'olynomialpandthediTL.'9C?<-IPIPR(r,D,A,B)9IntegralUUpGolynomialmodidealproduct.qComputespqmod=9(x:d1l1ҵ;:::;x㍴dr,r1Ír718)givenr-variatep}'olynomialspandqandthediTL.'9C?<-IUPTPR(n,A,B)IntegralgGunivqariatepGolynomialtruncatedproduct.Computes =9pqmoGdصx^n egivenunivariatep}'olynomialspandqandaBETA-digitn. o94.53 VMos3dularffPolynomialArithmetic9NotethatthefunctionswhosenamesbGeginwithMI|arebaseduponmodularintegerarith-9metic,~hwhilev1thosebGeginningwithMPv(andMUParebasedupGonmodulardigitarithmetic9withUUaprimemoGdulus^2|s.>w9BasicTarithmetic:'9C?<-MIPSUM(r,M,A,B)yMoGdularUUintegralpolynomialsum.'9C?<-MPSUM(r,m,A,B)9MoGdularUUpolynomialsum.'9C?<-MIPDIF(r,M,A,B)yMoGdularUUintegralpolynomialdi erence.'9C?<-MPDIF(r,m,A,B)9MoGdularUUpolynomialdi erence.'9B?<-MIPNEG(r,M,A)MoGdularUUintegralpolynomialnegation.'9B?<-MPNEG(r,m,A)MoGdularUUpolynomialnegative.'9C?<-MIPPR(r,M,A,B)9MoGdularUUintegralpolynomialproduct.'9C?<-MPPROD(r,m,A,B)yMoGdularUUpolynomialproduct.'9B?<-MPUP(r,m,c,A)MoGdularUUpolynomialunivqariateproduct.'9C?<-MPMDP(r,p,a,B)9MoGdularUUpolynomialmodulardigitproduct.'9C?<-MIPIPR(r,M,D,A,B)MoGdularUUintegralpolynomialmodidealproduct.'9MIUPQR(M,A,B;?Q,R)MoGdularintegralunivqariatepolynomialquotientandremain-=9der.'9MPQR(r,p,A,B;?Q,R)MoGdularUUpolynomialquotientandremainder.'9C?<-MPQ(r,p,A,B)MoGdularUUpolynomialquotient.'9C?<-MPUQ(r,p,A,b)MoGdularUUpolynomialunivqariatequotient.9Qffl) J= "5-:2LSeeXSection3.3fordetailsonmoandB =PލQn%Qi=0:HbiTLx^ir/,thentheSylvestermatrixofAandB-isthe9(m8+n)(m+n)UUsquarematrixC{0.IfM8istheSylvestermatrixof9AIandBq,Kthenfor0ijYSdi >}wherediisas9inUUthepreviousde nition.9Ther}'educedPRSkisobtainedbysettingAi>=prem(Ai2 ;Ai1)=c:i*+1;Zimy,n:whereci>=9ldcfh(Ai2 )UUandid=deg꧟qƴxrB(Ai3)8deg\oqƴxrm (Ai2)UUfor3in,UUwith3C=0.9Althoughitisnotimmediatelyclearfromthede nitions,NabGothsubresultantPRSsas9wellUUasthereducedPRScanbGeshowntobGe,infact,PRSs.9F*orunivqariatepGolynomialsovera eldwemayde newhatisknownasthenatur}'alPRS9de nedHbyAid=Ai2UȵQiTLAi1 ,°Jt(Ai)werefertotheGCDz4ofAandBwewillmeantheGCDz4de ned9byUUthealgorithmsandthiswillbGedenotedbygcdUW(A;Bq).9Algorithms(arealsoavqailableforthecomputationofresultantsofrG-vqariatepolynomials9overRR߲=ZorR=ZpR.Thepackqagealsoprovidesalgorithmsforcomputingthesubresultant9PRS',and'7thereducedPRSforrG-vqariatepolynomialsover'7R߲=ZandthesubresultantPRS9forUUrG-vqariatepolynomialsoverUUR߲=ZpR.96.33 VDe nitionsffofTferms9coarsestTsquarefreebasis5If,A=(A1|s;:::;Anq~)isalistofrG-vqariatepolynomials,4acoars-'9estsquarefreebasisforAisalistB=/(B1|s;:::;Bm)ofpairwiserelativelyprime'9squarefreerG-vqariatepolynomialssuchthateachAi4EinAcanbGeexpressedastheprod-'9uctUUofpGowersUUofelementsofBq.H9discriminan9tQIfkAisanrG-vqariatepolynomialofdegreeninitsmainvqariable,밵n2,'9the?discriminantofAisthe(r1)-vqariatepGolynomialequaltothequotientof'9(1)^n(n1)=2"ɲres/C(A;A^09)Hwhendividedbya,whereA^0{isthederivqativeofAwithrespGect'9toUUitsmainvqariableandaistheleadingcoGecientofA.9 nestTsquarefreebasisA< nestsquarefreebasisBK=(B1|s;:::;Bm)foralistAofrG-'9vqariateZpGolynomialsisacoarsestsquarefreebasisforAwiththeadditionalcondition'9thatUUeachBiisirreducible.9cofactors?If_C{istheGCD9oftwo_pGolynomialsAandBiвthenthecofactorsofAandBq,'9respGectively*,UUareA=C qandBq=C.9ffl) J= "5-:1Lprem(FdAogreatestsquarefreedivisorofapGolynomialAisasquare-'9free+pGolynomialCGthatdividesAandissuchthatanyothersquarefreepGolynomial'9thatUUdividesAalsodividesC.9primitiv9eTpartZTheprimitivepartofapGolynomialAistheabsolutevqalueofA=cwhere'9cUUisthecontentUUofA.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.9squarefreeTfactorizationQ@The<]squarefreefactorizationofAisA=A:e1l1 2bA~ekk Dzwhere<]1'9e1C<8׵<ekandÎeachoftheAiڲisapGositivesquarefreepGolynomialofpositivedegree.'9NoteUUthatifAissquarefreethenA^1ȲisthesquarefreefactorizationofA.9squarefreeTpQolynomialݵAcpGolynomialcAissquarefreeifeachfactoroccursonlyonce.!In'9otherZwords,\]ifAx=A:e1l1 2bA~ekk _isZacompletefactorizationofAtheneachoftheeiAis'9equalUUto1.9univ\rariateTcon9tentn IfAisanrG-vqariatepolynomial,Q|r^hK2,thentheunivqariatecontent'9ofAisaunivqariatepGolynomialinthemostminorvariableequaltotheGCDwofthe'9coGecientsUUofA,whereAisconsideredasanelementof(RDz[x1|s])[x2;:::;xrm].9univ\rariateTprimitiv9epartGivenD.anrG-vqariatepolynomialA,Gr52,theD.univqariateprim-'9itiveLpartofAistherG-vqariatepolynomialA=a,IwhereaistheunivqariatecontentLof'9A.!č96.43 VMethos3dsffandAlgorithms9Injthissectionwebrie ydiscussthemainalgorithmsthatmightbGeofinteresttotheuser9andUUgiveasketchofthemathematicalideasbGehindthesealgorithms.696.4.17yGCDComputationsuT9T*otcomputetheGCDIoftwotunivqariatepGolynomialsovertRg=ݠZpR,&aMPGCDC5proceeds9recursivelyJuntilitarrivesatunivqariatepGolynomialswhereuponMUPGCD*iscalled.FnTheGCD9computedUUismonic.9T*obobtaintheGCD>oftwobrG-vqariateintegralpolynomialsAandB_Ӳonewouldusethe9algorithm IPGCDCwhichalsocomputesthecofactorsofAandBq.InthisalgorithmmoGd-9ularZhomomorphismsandChineseremainderingareusedtoreducetheproblemtoGCD9computationsUUofrG-vqariatepolynomialsoverUUR߲=ZpR,whichissolvedbyMPGCDC.96.4.27yResultantsuT9Using4thealgorithmsuggestedbythede nitionoftheresultant,lnamelytoconstructthe9SylvesterUUmatrixandcomputeitsdeterminant,isnotthemostecientwaytoproGceed.A33")נC9Instead,MUPRESJ#computesJbtheresultantoftwounivqariatepGolynomialsAandBӲover 9R߲=ZpbyUUcomputingthenaturalPRSofAandBƲandbyusingtheidentityK{res>G(A;Bq)=(1)q\" yȴn1  2Y t i=2Rbc㍴di1 Ƿdi+1i&؟\#Ocdn1፴n!9whereUUcid=ldcfc(AiTL),di=deg(AiTL),j=Pލ USk+B2% USi=1'didi+1ɤandA1|s;:::;AnӲisthenaturalPRS.9F*orpcalculatingtheresultantofrG-vqariatepolynomialsoverpR&=ZpR,N6MPRESOp}'olynomialAoverR߲=Z,Oncomputesthepositiveandprimitivegreatestsquare-=9fr}'eedivisoroftheprimitivep}'artofA.'9L?<-IPSF(r,A)zȲIntegralunivqariatepolynomialextendedgreatestcommon =9divisor. ComputestheGCDICoftwounivariatep}'olynomialsAandBfover=9R߲=Zp39aswelltheunivariatep}'olynomialsUandVsuchthatAUO+8BqV=C.'9MUPHEG(p,A,B;?C,V)MoGdular4univqariatepolynomialhalf-extendedgreatestcom-=9monm$divisor.ComputestheGCDɵC`oftwounivariatep}'olynomialsAandB*@over=9R1/=hZpbasÌwelltheunivariatep}'olynomialVpsuchthatAUr+[fBqVVL=Czforsome=9U.A36%_ C9iChapter 729cP8olynomial T{Factorization:97.13 VMathematicalffPreliminaries9Anon-constantpGolynomialA(x1|s;:::;xrm)inRDz[x1;:::;xrm],٣whereR}isauniquefactorization 9domain,issaidtobGeirr}'educibleifAcannotbeexpressedastheproductoftwonon-constant9pGolynomials+inRDz[x1|s;:::;xrm].5dTheproblemoffactoringapolynomialA(x1|s;:::;xrm)isthatof9 ndingFdistinctirreduciblepGolynomialsAiTL(x1|s;:::;xrm)andintegersei,|޵i=1;:::;kP,suchFthat9A=A:e1l1 2bA~ekkj. Suchaanexpressioniscalledac}'ompletefactorizationofA.ThepGolynomials9AiareUUcalledtheirr}'educiblefactorsUUofAandtheintegereiiscalledthemultiplicityofAiTL.!č97.23 VPurps3ose9TheCSACLIB)y4pGolynomialCfactorizationpackqageprovidesfactorizationalgorithmsforR߲=ZpR,9p[asingle-precisionprimeandrE=1,?andforR=ZforrE1.F*orR=Zoneobtains9theqsign,5wintegercontentandpGositiveprimitiveirreduciblefactorsofA,5waswellasthe9multiplicityBofeachirreduciblefactor.kTheintegercontentisnotfactored.kF*orR߲=Zp/the9irreducibleUUfactorsobtainedaremonic.!č97.33 VMethos3dsffandAlgorithms9T*obfactoranarbitraryunivqariatepGolynomialmoduloaprime,$oneshould rstobtaina9similarmonicpGolynomialbyusingthealgorithmMPMON.Havingdonethis,wonethencom-9putesR-thesquarefreefactorsofthemonicpGolynomialbyusingthealgorithmMUPSFF.In9orderɞtofactoreachsquarefreefactoronewoulduseMUPFBL,whichimplementsBerlekqamp's9algorithm.qTheUUirreduciblefactorsreturnedbyMUPFBLaremonic.9F*orfactoringaunivqariateintegralpGolynomial,IUPFACI rstcomputesthesquarefree9factorizationusingthealgorithmIPSF.Thesquarefreefactorsareinturnfactoredusing9IUSFPFffwhichfj rstcomputesafactorizationmoGduloaprimeandthemodularfactorsthus9obtainedEarethenliftedbythequadraticversionoftheHenselconstruction.:IUPFACreturns9theQsign,Rtheintegercontentandalistofirreduciblefactors,Rwithmultiplicities,Roftheinput9pGolynomial.qTheUUirreduciblefactorsreturnedbyIUPFACarepositiveandprimitive.9MultivqariateƜintegralpGolynomialsarefactoredbyusingIPFAC.Thisalgorithm rstcom-9putesthecontentaswellasthesquarefreefactorsoftheprimitivepartoftheinputpGoly-9nomialIandsubsequentlyfactorseachoftheseseparately*.mThefactorizationofasquarefree9primitivepGolynomialisperformedbythealgorithmISFPF֨whichimplementsamultivqariate9lifting{techniquebasedontheHensellemma.9Theliftingisdoneonevqariableatatimeas9oppGosedUUtoliftingseveralvqariablessimultaneously*.A37&fC9If7thepGolynomialAtobefactoredhasrationalbasecoecientsthenitmust rstbGe 9convertedMPtoanintegralpGolynomialbymultiplyingAbytheleastcommonmultipleofthe9denominators` ofthebasecoGecientsandthenconvertingthepGolynomialthusobtainedto9integralrepresentation.RThiscanbGeachievedbyusingIPSRPwhichcomputestheprimitive9andUUpGositiveintegralpGolynomialA^0#aswellastherationalnumbGerasuchthatA=aA^09.!č97.43 VFfunctions9F actorization:'9IPFAC(r,A;?s,c,L)Integral^$pGolynomialfactorization.3F;actorsr-variatep}'olynomi-=9alsoverZ.'9IUPFAC(A;?s,c,L)y²IntegralunivqariatepGolynomialfactorization._QF;actors`univariate=9p}'olynomialsoverZ.'9L?<-MUPFBL(p,A)y²MoGdular8univqariatepolynomialfactorization-Berlekqampalgorithm.=9F;actorsmonicsquar}'efreeunivariatep}'olynomialsoverZpR.9AuxiliaryTF unctionsforFactorization:'9IPCEVP(r,A;?B,L)y²IntegralpGolynomial,#choiceofevqaluationpGoints.]GivenZaninte- =9gr}'al\polynomialAthatissquarefreeinitsmainvariable,gcomputesintegersthat,=9whensubstitute}'dfortheminorvariables,DmaintainthedegreeofAinthemain=9variableanditssquar}'efreeness.'9b?<-IPFCB(V)u˲IntegralspGolynomialfactorcoecientbound.͈Given thede}'gree vec-=9tor*Sofaninte}'gral*SpolynomialA,Ocomputesanintegerbsuchtheproductofthe=9in nity normsofanydivisorsofAislessthanore}'qualto2^bPtimesthein nity=9normofA.'9Lp?<-IPFLC(r,M,I,A,L,D)yIntegralUUpGolynomialfactorlistcombine.'9B?<-IPFSFB(r,A)y²IntegralUUpGolynomial nestsquarefreebasis.'9a?<-IPGFCB(r,A)y²IntegralUUpGolynomialGelfondfactorcoecientbound.'9IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C;?A,B)޹Integral8pGolynomialmodidealquadraticHensel=9lemma.'9L?<-ISFPF(r,A)9ŲIntegralsquarefreepGolynomialfactorization.o2Given#ap}'ositive,=9primitiveinte}'gralpolynomialAthatissquarefreewithrespecttothemainvari-=9able,c}'omputesalistofthedistinctpositiveirreduciblefactorsofA.'9IUPFDS(A;?p,F,C)y²IntegralUUunivqariatepGolynomialfactordegreeset.'9IUPQH(p,Ab,Bb,Sb,Tb,M,C;?A,B)ɹIntegral%univqariatepGolynomialquadraticHensel=9lemma.'9Fp?<-IUPQHL(p,F,M,C)IntegralunivqariatepGolynomialquadraticHensellemma,=9list.'9L?<-IUSFPF(A)zȲIntegralQunivqariatesquarefreepGolynomialfactorization.fGiven{a=9univariate,qp}'ositive,primitive,squarefreeintegralpolynomialA,qcomputesalist=9ofthep}'ositiveirreduciblefactorsofA.'9M?<-MCPMV(n,L)9ŲMatrix>ofcoGecientsofpolynomials,ywithrespecttomainvqari-=9able.'9MIPISE(r,M,D,A,B,S,T,C;?U,V)yMoGdular}integralpolynomialmodideal,solution=9ofUUequation.'9MIUPSE(M,A,B,S,T,C;?U,V)yMoGdularUintegralunivqariatepolynomial,solutionof=9equation.A38't۠C'9MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C;?A,B)yMoGdular8polynomialmodideal,qquadratic =9HenselUUlemma.'9Fp?<-MPIQHL(r,p,F,M,D,C)MoGdular8polynomialmodideal,qquadraticHensellemma,=9list.'9MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C;?A,B,S,T,Dp)9qMoGdularSpolynomialmodideal,=9quadraticUUHensellemmaonasinglevqariable.'9Q?<-MUPBQP(p,A)y²MoGdularunivqariatepolynomialBerlekqampQ-polynomialscon-=9struction.'9L?<-MUPDDF(p,A)y²MoGdular8polynomialdistinctdegreefactorization.Given8amonic,=9squar}'efreepolynomialAoverRy=eZpR,vcomputesalist((n1|s;A1),v:::,v(nk됵;Ak)),=9wher}'ethenijarepositiveintegerswithn1P<)R<)nkandeachAijistheproduct=9ofallmonicirr}'educiblefactorsofAofde}'greeniTL.'9L?<-MUPFS(p,A,B,d)9MoGdularUUunivqariatepolynomialfactorization,special.A39(ؠC9iChapter 829cReal T{Ro otCalculation:98.13 VMathematicalffPreliminaries9Let׵A(x)bGeaunivqariatepolynomialwithintegercoecients. MAqrealnumbGerx0 ]Jwith 9A(x0|s)9=0iscalledar}'ealhrootofA(x).ArealnumbGerx0DvisarootofA(x)ifandonlyif9A(x)isdivisibleby(x}x0|s),i.e.lifthereisapGolynomialBq(x)withrealcoecientssuch9that A(x)'I=(x_Zx0|s)Bq(x).F*oranyrealroGotx0 ofA(x)thereisanaturalnumbGerkߣsuch9that A(x)isdivisibleby(xθx0|s)^kKbut notby(xθx0|s)^k+B+1 .This numbGerk^Riscalledthe9multiplicityroftheroGotx0ofA(x).Rootsofmultiplicityr1arecalledsimpler}'oots.An9intervqalIșcontainingx0|*butnootherrealroGotofA(x),iscalledanisolatingE#intervalforx0|s.9F*orexample, ifA(x)=x^22,theintervqal(2;2)isnotanisolatingintervqalforarealroGot9ofUUA(x),but(0;1000)is.!č98.23 VPurps3ose9TheSACLIB,realroGotcalculationpackqagesolvesnon-linearequationsinonevqariable:FIt9computes!OisolatingintervqalsfortherealroGotsofunivariateintegralpGolynomialsalongwith9theUUmultiplicityofeachroGot,anditre nestheisolatingintervqalstoanyspGeci edsize.!č98.33 VMethos3dsffandAlgorithms9F*orroGotisolationthreemethodsareavqailable./uThec}'oecientsignvariationmetho}'d(or:9mo}'di edUspenskymethod),is-basedonDescartes'ruleofsigns.OOTheCollins-L}'oosmethod9isUUbasedonRolle'stheorem.qSturm'smetho}'disbasedonSturmsequences.9Generally*,&theIcoGecientsignvqariationmethodismanytimesfasterthantheothertwo9methoGds.F*orhthecoecientsignvqariationmethodvqariousmainprogramsareprovidedto9accommoGdateUUdetailsofinputandoutputspeci cations.9F*orXthere nementofisolatingintervqalstoanyspGeci edprecisionasymbGolicversionof9Newton'sUUmethoGdisused.9GivenanarbitraryintegralpGolynomialIPRCH willcalculateallitsrealrootstospeci ed9accuracy*.FTheӣmultiplicityofeachroGotisalsocomputed.FThealgorithmusesthecoecient9sign^vqariationmethoGdtoisolatetherootsfromeachotherandthenappliesNewton'smethod9toUUre netheisolatingintervqalstothedesiredwidth.9GivenlasquarefreeintegralpGolynomialIPRIMXisolatesalltherealrootsfromeachother.9TheroGotsinsideaspeci edopenintervqalareisolatedbyIPRIMO.BothIPRIMandIPRIMO9usethecoGecientsignvqariationmethod.LOthermainalgorithmswhichusethismethod9areUUIPRIMSandIPRIMW.A40)C9TheCollins-LoGosmethodisimplementedinIPRICL:Givenanarbitraryunivqariatein- 9tegralpGolynomialIPRICLgproducesalistofisolatingintervqalsforitsrealroots.>These9intervqalsJhavetheadditionalpropGertythatthe rstderivqativeofAismonotoneoneachof9them.9AneimplementationofSturm'smethoGdisprovidedbyIPRIST:Givenasquarefreeuni-9vqariateUUintegralpGolynomialIPRISTproducesalistofisolatingintervqalsforitsrealroots.9RoGotsWofdi erentpolynomialscanbeisolatedfromeachotherusingtheprogramIPLRRI.9Reference:[QJeremy(hR.Johnson:Algorithmsjforp}'olynomialrealrootisolation.bT*echnical9ResearchcRepGortOSU-CISRC-8/91-TR21,\&1991. NTheOhioStateUniversity*,\&2036Neil9AvenueUUMall,Columbus,Ohio43210,Phone:q614-292-5813.!č98.43 VDe nitionsffofTferms9binaryTrationaln9umbQerWAUUrationalnumbGerUUwhosedenominatorisapowerUUof2.9in9terv\ral9/;AlistunivqariatepGolynomial,Fvariationsforstandardinterval.A43,C9iChapter 929cAlgebraic T{Num8b erArithmetic:99.13 VMathematicalffPreliminaries9AnalgebraicnumbGerisanumberthatsatis esarationalpolynomialequation./Analgebraic 9numbGerԫ %isrepresentedbyanirreduciblepGolynomial,A(x),suchԫthatA( z)Q=0.AԊreal9algebraicTnumbGer,!isarealnumbGerthatisalsoanalgebraicnumbGer,!anditisrepresentedby9anirreduciblepGolynomialandanisolatingintervqaltodistinguishitfromitsrealconjugates.9ThecollectionofalgebraicnumbGersformsa eldcontainingtherealalgebraicnumbGersasa9sub eld.o]SinceNA(x)isirreducible,Otheextension eldQ( z)obtainedbyadjoining Wtothe9rationalbnumbGer eldisisomorphictoQ[x]=(A(x))andelementsofQ( z)arerepresented9by/pGolynomialswhosedegreesarelessthanthedegreeofA(x).eIf 8isrealthenQ( z)isan9orderedUU eldandsigncomputationscanbGeperformedusingtheisolatingintervqalfor z.!č99.23 VPurps3ose9Then`SACLIB)Όalgebraicn`numbGerarithmeticpackqageprovidesalgorithmsforpGerformingarith-9meticvwithalgebraicnumbGers,>withvelementsofanalgebraicnumbGer eld,>andwithpoly-9nomials AwhosecoGecientsbelongtoanalgebraicnumber A eld.Therearealgorithmsfor9computingOthegcdoftwoOpGolynomialswithalgebraicnumberOcoecientsOandforfactoring9a pGolynomialwithalgebraicnumber coecients.YAlgorithms arealsoprovidedforperform-9ingsigncomputationsinarealalgebraicnumbGer eldandforisolatingtherealrootsofa9pGolynomialUUwithrealalgebraicnumberUUcoecients.!č99.33 VMethos3dsffandAlgorithms9AlgorithmsI0forpGerformingalgebraicnumberI0arithmeticuseresultantcomputations.MYLet9A(x)C=Pލ Ѿm% Ѿi=0aiTLx^iϲ=am CCQލ m% i=1 )[(xj i)bGetheintegralminimalpolynomialfor L=C 1oand9letdBq(y[ٲ)=Pލ USn% USjg=0Vbj6y^jY=bn&Qލn%jg=1䞲(yX j6)dbGetheintegralminimalpolynomialfor N4= 1|s.!The9minimalpGolynomialfor 爐+* 3isafactorofres2x(A(x);Bq(yBx))andtheminimalpGolynomial9for' k Cisafactorofresg`xpD(A(x);x^nq~Bq(y[=x)).:LetBq^U(y[ٲ)=Norm(Bq( z;y)),ٜandletQލ ,wt% ,wi=1KnB^q;ZiU(y)9bGe\theirreduciblefactorizationofBq^U(y[ٲ).Providedthenormissquarefreetheirreducible9factorization~ofBq( z;y[ٲ)o=Qލ zt% zi=1qgcd+s(B( z;y[ٲ);B^;ZiU(y[ٲ)).BIf~B^(y[ٲ)~isnotsquarefree,atransla-9tion,7oBq( z;yI!s ),is/computedwhosenormissquarefree.eRThefactorizationofBq( z;y[ٲ)can9bGeUUrecoveredfromthefactorizationofthetranslatedpGolynomial.9SACLIBFalsoqprovidesanalgorithmforcomputingaprimitiveelementofamultiple9extension eld.XLet and bGealgebraicnumbers andconsiderthemultipleextension eld9Q( z; ).^]Theprimitiveelementtheoremstatesthatthereexistsaprimitiveelement Psuch9that,VQ( z; )=Q( 8).dThealgorithmsANPEDE,LandANREPEprovideaconstructiveversionof9thisUUtheorem.9References:IR.G.K.LoGos:ComputingJinAlgebr}'aicExtensions,In\ComputerAlgebra,9SymbGolicUUandAlgebraicComputation",pages173{187.9JeremyʨR.Johnson:\mAlgorithmsforp}'olynomialrealrootisolation.T*echnicalʨResearch9RepGortDOSU-CISRC-8/91-TR21,H1991.lCTheOhioStateUniversity*,H2036NeilAvenueMall,9Columbus,UUOhio43210,Phone:q614-292-5813.A45.ȳC9BarryT*rager:Algebr}'aicF;actoringandRationalF;unctionIntegration,nIn\SYMSAC'76: 9ProGceedingsVofthe1976ACM1SymposiumonSymbolicandAlgebraicComputation",pages9219{226. 099.43 VDe nitionsffofTferms9algebraicTn9umbQerjRA^solution^ofarationalpGolynomialequation.lAnalgebraicnumber^ '9isиrepresentedeitherbyarationalminimalpGolynomialoranintegralminimalpGoly-'9nomial. 9algebraicTin9tegerfHAUUsolutionofamonicintegralpGolynomialequation.9realTalgebraicn9umbQerAArealRnumbGerthatisalsoanalgebraicnumbGer.ZqAArealalgebraic '9numbGer visrepresentedbyanintegralminimalpGolynomialandanacceptableisolating'9intervqal. 9rationalTminimalpQolynomial.ThezrationalminimalpGolynomialforanalgebraicnumber'9 ^ϲisUUtheuniquemonic,irreduciblerationalpGolynomialA(x)suchthatA( z)=0.9in9tegralTminimalpQolynomialRTheQintegralminimalpGolynomialforanalgebraicnumbGer'9 ^ϲisUUtheunique,pGositive,primitive,integralpGolynomialA(x)suchthatA( z)=0.9acceptableTisolatingin9terv\ralOnanisolatingintervqal,jI,forarealalgebraicnumbGer z,'9whereҵIiseitheraleft-opGenandright-closedstandardintervqaloraone-pGointintervqal.9algebraicT eldelemen9tanNrelementoftheextension eldQ( z).o{ N42Q( )Nrisrepresented'9byalist(r;Bq(y[ٲ)),#where N4=rGB( z)andrisarationalnumbGerandB(y[ٲ)isaprimitive'9integralpGolynomialwhosedegreeislessthanthedegreeoftheminimalpolynomial'9ofUU z. 099.53 VRepresentation9Thereareseveraldi erentrepresentationsforelementsofQ( z).LetA(x)bGetheintegral9minimalpGolynomialforanalgebraicnumber Zwithdego(A(x))=m.RAnelement ~ofQ( z)9canUUbGeuniquelyrepresentedby:r1.'9AUUrationalpGolynomial,Bq(x),whosedegreeislessthanmandsuchthatB( z)= .r2.'9Awpairؙ(r;}fe9B (x)),jwhererisarationalnumbGer,}fe9B (x)ؙisapGositiveprimitiveintegral'9pGolynomial,UUand N4=Bq( z)=r}fe9B]V( z).9Theݖdefaultrepresentationis(2). ThealgorithmAFCRrconvertsrepresentation(1)to(2),9andUUthealgorithmAFICRconvertsUUrepresentation(2)to(1).9LetXZ[ z]denotetheZ-moGdulewithbasis1; z; ^2;:::; ^m1މ. iElementsXofZ[ ]are9representedWbyintegralpGolynomialswhosedegreeislessthanm. KIf Ѳisanalgebraic9integer,?thenZ[ z]isaring.IfanalgorithmdoGesnotrequiredivisionorreductionbythe9minimalpGolynomial,0operationsinQ( z)canbereplacedwithoperationsinZ[ z].When9thisispGossible,CeciencyisgainedbyusingtheintegralrepresentationZ[ z].PAnimpGortant9exampleispGolynomialrealrootisolation.nRLetPc( z;y[ٲ)beapolynomialinQ( z)[y[ٲ]andlet9d0bGethegreatestcommondivisorofthedenominatorsofthecoecientsofPc( z;y[ٲ).YThen9dPc( z;y[ٲ)hisinZ[ ;y[ٲ]andhasthesameroGotsasPc( ;y[ٲ).Moreover,cthehcoGecientsign9vqariationRmethoGdforrealrootisolationonlyusesoperationswhichcanbeperformedin9Z[ z].9ThenameofalgorithmswhichopGerateinZ[ z]beginwiththelettersAM.Thealgorithm9AMPSAFP2޲(r;Pc)ҰcomputesapGolynomial}feP9Ѹ2Z[ z;X1;:::;XrG]Ұwhichissimilartothepoly-9nomialO P*2Q( z)[X1;:::;XrG].oThealgorithmAIFANOcomputesanalgebraicinteger~feog ]such9thatUUQ( z)=Q(~feog o).A46/C99.63 VFfunctions9AlgebraicTNum9bQerArithmetic'9ANIIPE(M,I,N,J,t,L;?S,k,K)Algebraic5numbGerisolatingintervqalforaprimitive =9element'9ANPROD(A,I,B,J;?C,K)yAlgebraicUUnumbGerproduct'9ANSUM(A,I,B,J;C,K)AlgebraicUUnumbGersum'9ANPEDE(A,B;C,t)9ŲAlgebraicUUnumbGerprimitiveelementforadoubleextension'9b?<-ANREPE(M,A,B,t)yAlgebraic}numbGerrepresentelementofaprimitiveexten-=9sion9AlgebraicTFieldArithmetic'9c?<-AFDIF(a,b)9ŲAlgebraicUUnumbGer eldelementdi erence'9b?<-AFINV(M,a)9ŲAlgebraicUUnumbGer eldelementinverse'9b?<-AFNEG(a)u˲AlgebraicUUnumbGer eldnegative'9c?<-AFPROD(P,a,b)AlgebraicUUnumbGer eldelementproGduct'9c?<-AFQ(M,a,b)9ŲAlgebraicUUnumbGer eldquotient'9c?<-AFSUM(a,b)9ŲAlgebraicUUnumbGer eldelementsum9RealTAlgebraicNum9bQerSignandOrderComputation'9t?<-AFCOMP(M,I,a,b)yAlgebraicUUnumbGer eldcomparison'9s?<-AFSIGN(M,I,a)AlgebraicUUnumbGer eldsign'9s?<-AMSIGN(M,I,a)AlgebraicUUmoGdulesign'9AMSIGNIR(M,I,a;s,Is)yAlgebraicUUmoGdulesign,intervqalre nement9AlgebraicTP9olynomialArithmetic'9C?<-AFPAFP(r,M,a,B)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld =9elementUUproGduct'9C?<-AFPAFQ(r,M,A,b)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld=9elementUUquotient'9C?<-AFPDIF(r,A,B)AlgebraicUUnumbGer eldpolynomialdi erence'9Ap?<-AFPMON(r,M,A)9AlgebraicUUnumbGer eldpolynomialmonic'9B?<-AFPNEG(r,A)y²AlgebraicUUnumbGer eldpolynomialnegative'9C?<-AFPPR(r,M,A,B)9AlgebraicUUnumbGer eldpolynomialproduct'9AFPQR(r,M,A,B;?Q,R)9AlgebraicUUnumbGer eldpolynomialquotientandremainder'9C?<-AFPSUM(r,A,B)AlgebraicUUnumbGer eldpolynomialsum9AlgebraicTP9olynomialDi erentiationandIntegration'9B?<-AFPDMV(r,M,A)AlgebraicUUnumbGer eldpolynomialderivqative,mainvariable'9B?<-AFPINT(r,M,A,b)yAlgebraicUUnumbGer eldpolynomialintegration'9B?<-AMPDMV(r,M,A)AlgebraicUUmoGdulepolynomialderivqative,mainvariable9AlgebraicTP9olynomialF actorization'9F?<-AFUPFAC(M,B)AlgebraicUUnumbGer eldunivqariatepolynomialfactorizationA470=C'9L?<-AFUPSF(M,A)y²Algebraic:^numbGer eldunivqariatepolynomialsquarefreefactor- =9ization9AlgebraicTP9olynomialGreatestCommonDivisors'9AFUPGC(M,A,B;?C,Ab,Bb)Algebraic2&numbGer eldunivqariatepolynomialgreatest=9commonUUdivisorandcofactors'9B?<-AFUPGS(M,A)y²AlgebraicUUnumbGer eldpolynomialgreatestsquarefreedivisor9AlgebraicTP9olynomialNormComputation'9L?<-AFPNIP(M,A)y²Algebraic+numbGer eldpolynomialnormalizetointegralpoly-=9nomial'9Bs?<-AFPNORM(r,M,B)yAlgebraicUUnumbGer eldpolynomialnorm.9AlgebraicTP9olynomialSubstitutionandEv\raluation'9C?<-AFPCMV(r,M,A,B)yAlgebraicY1numbGer eldpolynomialcompositioninmain=9vqariable'9B?<-AFPEMV(r,M,A,a)yAlgebraicnumbGer eldpolynomialevqaluationofmainvari-=9able'9B?<-AFPEV(r,M,A,i,a)AlgebraicUUnumbGer eldpolynomialevqaluation'9B?<-AFPME(r,M,A,b)9AlgebraicUUnumbGer eldpolynomialmultipleevqaluation'9s?<-AFUPSR(M,I,A,c)yAlgebraic|numbGer eldunivqariatepolynomial,$signatara-=9tionalUUpGoint'9s?<-AMUPBES(M,I,A,c)Algebraic moGduleunivqariatepolynomial,<binaryrational=9evqaluationUUofsign.'9s?<-AMUPSR(M,I,A,c)yAlgebraic:imoGduleunivqariatepolynomial,?signatarational=9pGoint'9B?<-IPAFME(r,M,A,b)yIntegralpGolynomial,*malgebraicnumbGer eldmultipleevqalu-=9ation'9B?<-RPAFME(r,M,A,b)yRationalzpGolynomial,5algebraicnumberz eldmultipleevqal-=9uation9AlgebraicTP9olynomialT ransformations'9B?<-AMUPBHT(A,k)Algebraic8moGduleunivqariatepolynomialbinaryhomothetictrans-=9formation'9B?<-AMUPNT(A)zȲAlgebraicUUmoGduleunivqariatepolynomialnegativetransformation'9B?<-AMUPTR(A,h)y²AlgebraicUUmoGduleunivqariatepolynomialtranslation'9B?<-AMUPTR1(A)9ŲAlgebraicUUmoGduleunivqariatepolynomialtranslationby19RealTAlgebraicP9olynomialRealRoQotIsolation'9N?<-AFUPBRI(M,I,L)9Algebraic%numbGer eldunivqariatepolynomialbasisrealroot=9isolation'9AFUPMPR(M,I,B,J,L;?Js,j)yAlgebraicnumbGer eldpolynomialminimalpolyno-=9mialUUofarealroGot'9b?<-AFUPRB(M,I,A)AlgebraicUUnumbGer eldunivqariatepolynomialrootbound'9L?<-AFUPRICL(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso-=9lation,UUCollins-LoGosalgorithmA4815C'9L?<-AFUPRICS(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso- =9lation,UUcoGecientsignvqariationmethod'9a?<-AFUPRL(M,A)y²Algebraic- numbGer eldunivqariatepolynomial,brootofalinear=9pGolynomial'9n?<-AFUPVAR(M,I,A)9AlgebraicUUnumbGer eldunivqariatepolynomialvqariations'9AMUPMPR(M,I,B,J,L;?Js,j)yAlgebraicW moGduleunivqariatepolynomialminimalpoly-=9nomialUUofarealroGot'9L?<-AMUPRICS(M,I,A)yAlgebraicmoGduleunivqariatepolynomialrealrootisolation,=9coGecientUUsignvqariationmethod'9AMUPRICSW(M,I,A;L,Is)AlgebraicmoGduleunivqariatepolynomialrealrootisola-=9tion,UUcoGecientsignvqariationmethod,weaklydisjointintervqals'9AMUPRINCS(M,I,A,a,b;L,Is)AlgebraicmoGduleunivqariatepolynomialrootisola-=9tion,UUnormalizedcoGecientsignvqariationmethod'9AMUPVARIR(M,I,A;?n,J)Algebraic>moGduleunivqariatepolynomialvqariations,Binter-=9vqalUUre nement9AlgebraicTP9olynomialRealRoQotRe nement'9Js?<-AFUPIIR(M,I,B,J)AlgebraicnumbGer eldpolynomialisolatingintervqalre- =9 nement'9AFUPIIWS(M,I,A,L)Algebraicf9numbGer eldunivqariatepolynomialisolatinginter-=9vqalsUUweaklydisjointtostronglydisjoint'9AFUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹AlgebraicnumbGer eldunivqariatepolyno-=9mialUUrealroGotlistseparation'9Js?<-AFUPRRI(M,I,A,B,J,s1,t1)Algebraic~numbGer eldunivqariatepolynomial=9relativeUUrealroGotisolation'9AFUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicnumbGer eldunivqariatepoly-=9nomialUUrealroGotseparation'9Js?<-AMUPIIR(M,I,B,J)Algebraic^=moGdulepolynomialisolatingintervqalre ne-=9ment'9AMUPIIWS(M,I,A,L)Algebraic8moGduleunivqariatepolynomialisolatingintervqalsweakly=9disjointUUtostronglydisjoint'9AMUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹Algebraic8moGduleunivqariatepolynomialreal=9roGotUUlistseparation'9AMUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicmoGduleunivqariatepolynomial=9realUUroGotseparation9Con9version'9Ap?<-AFCR(A)u˲AlgebraicUUnumbGer eldelementconvertrepresentation'9a?<-AFFINT(M)zȲAlgebraicUUnumbGer eldelementfrominteger'9a?<-AFFRN(R)u˲AlgebraicUUnumbGer eldelementfromrationalnumbGer'9Ap?<-AFICR(A)zȲAlgebraicUUnumbGer eldelementinverseconvertrepresentation'9B?<-AFPCR(r,A)9ŲAlgebraicUUnumbGer eldpolynomialconvertrepresentation'9B?<-AFPFIP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromintegralpolynomial'9B?<-AFPFRP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromrationalpolynomial'9B?<-AFPICR(r,A)y²AlgebraicHnumbGer eldpolynomialinverseconvertrepresenta- =9tionA492 }C'9AIFAN(M;?mh,Mh)9ŲAlgebraicUUintegerfromalgebraicnumbGer'9B?<-AMPSAFP(r,A)Algebraic}moGdulepolynomialsimilartoalgebraic eldpolyno- =9mial'9ANFAF(M,I,a;?N,J)AlgebraicUUnumbGerfromalgebraicnumbGer eldelement9Input/Output'9AFDWRITE(M,I,b,n)AlgebraicUUnumbGer eld,decimalwrite'9AFPWRITE(r,A,V,v)AlgebraicUUnumbGer eldpolynomialwrite'9AFUPWRITE(A,vA,vc)AlgebraicUUnumbGer eldunivqariatepolynomialwrite'9AFWRITE(A,v)pyβAlgebraicUU eldelementwrite'9ANDWRITE(M,I,n)9ŲAlgebraicUUnumbGerdecimalwriteA503C9iAppendix A29cCalling T{GDtHGcmr17GSAYCLIBgW$cFunctions T{from9C49ThischapterdescribGeshowtheSACLIB*&environmenthastobGesetupforSACLIB*&functions 9toUworkcorrectly*.sOWeUwillstartwithaquickintroGductiontothebasicsusingasample9programinSectionA.1.InSectionA.2wedescribGethestepsnecessaryforcombining9dynamicalloGcationwithSACLIB*Wlistprocessing.;SpecialcarehastobetakenwithSACLIB9datastructuresaddressedbyglobalvqariables.мThisisexplainedinSectionA.3.Finally*,9SectionA.4describGeshowSACLIB*c`canbGeinitializedwithoutusingsacMain(),andSection9A.5UUgivessomeinformationonerrorhandlinginSACLIB(G!.!č9A.17ByAffSampleProgram9FigureUUA.1showsthebasiclayoutofaprogramusingSACLIB+vfunctions.9Note%3thattheonlythingwhichisdi erentfromordinaryC%'programsarethe#include9"saclib.h"ܲstatementandthefactthatthemainroutineiscalledsacMaininsteadofmain.9OneimpGortantpointisthattheargcandargvvqariablespassedtosacMainwillnot9contain allcommandlineparameters.Parametersstartingwith\+"are lteredoutand9usedforinitializingsomeSACLIB-globalvqariables.VInformationontheseparametersis9writtenUUoutwhenaprogramiscalledwiththeparameter\+h".9InSectionA.4wegivesomemoredetailsontheinitializationsdonebGeforesacMainis9called.9A.27ByDynamicffMemoryAllos3cationinSACLIB9WhenHoneneedstor}'andomly(asoppGosedtosequentially)accesselementsinadatastructure,9onemayprefertousearraysinsteadoflists.7IfthesizeandthenumbGerofthesearraysis9determinedatruntime,theyhavetobGedynamicallyallocated.W`F*urthermore,onemayneed9toUUmixthemwithlists,inwhichcasethegarbagecollectormustbGeabletohandlethem.9TheQconceptoftheGCAQc(GarbageCollectedArray)handleprovidesthiskindofdynamic9dataUUstructure.9Neverthelessitisrecommendedto rstcheckwhetheritmightbGepossibletoreformulate9the0algorithmsothatlistscanbGeusedinsteadofarrays.BInmanycasesoneusesarraysonly9bGecause {oneismorefamiliarwiththem,talthoughlistsmaybebettersuitedtotheproblem9atUUhand.9ThehfollowingfunctionsaretobGeusedforinitializingGCA39=9GCEff&fǫCHECKe...WThiswillcausethegarbagecollectortocheckthecontentsofthe=9arrayUUforlistorGCAhandles.>39=9GCEff&fǫNOEff&fCHECKm...Withthissetting,thegarbagecollectorwillignorethecontents=9ofthearray*.$Therefore,ߤGCEff&fǫNOEff&fCHECKvshouldonlybGeusedifitisguaranteed=9thatthearraywillnevercontainlistorGCAhandles(e.g.ifitisusedtostore=9BETA-digits).'9If^youarenotsurewhichonetochoGose,HuseGCEff&fǫCHECK,asinappropriateuseof'9GCEff&fǫNOEff&fCHECKUUmaycausetheprogramtocrash.9GCASET(A,i,a)Wy̲setsp!thei-thelementofthearrayreferencedbytheGCAphandleAtothe'9vqalueUUa.qHere,acanbGeanyWord.9a?<-GCAGET(A,i)g9òreturns^_thevqalueofthei-thelementofthearrayreferencedbythe'9GCAUUhandleA.A525*C9FigureUUA.2showshowthemechanismofGCAhandlesisused.I9Hff4. 4.4.4Word,A,L,I,i;4.4.4.9Step2: s,/*Herewedosomeallocation.*/4L=NIL;4do{=ySWRITE("Enteraninteger(0toquit):");I=IREAD();=yA=GCAMALLOC(10,GC_CHECK);=yfor(i=0;i<10;i++)FGCASET(A,i,IDPR(I,i+1));=yL=COMP(A,L);4}4until(ISZERO(I));4.4.4.OGffp\FigureUUA.2:qSamplecoGdeusingGCAhandles.99The6UcoGdeinsidethedo/untilloopreadsanintegerI,allocatesanarrayAof10Words, 9storesothevqalueI8(i+1)3atpGositioniinthearrayusingGCASET(),vandthenappendsa9newUUelementcontainingtheGCAhandleofthearrayAtothebGeginningofthelistL.9Alwaysn\remembGerthatGCAn"handlesmustbGeusedwheneveryouwanttostorereferences9toHSACLIB.$\structuresH(i.e.lists)indynamicallyalloGcatedmemory*.=Usingthestandard9UNIX=functionTmalloc()maycrashyourprogramsometimeafteragarbagecollectionor9atUUleastcausesomestrangebugs.9F*urthermore,GCA~handlesarealsoimplementedinsuchawaythattheycanbGeused9as{inputtolistproGcessingfunctionsinplaceswhereob8jectsareregardedasdata.E.g.9intheCOMP()function,aGCAȢhandlecanbGeusedasthe rstargument(theelementto9bGeUappendedtothelist)butnotasthesecondargument(thelistbeingappendedto).9Nevertheless)notethatthefunctionsLWRITE(),?EXTENT(),^andORDER()arenotde ned9forUUlistscontainingGCAhandles.9ThereEaretwoEmorefunctionstakingGCA6handlesasinput.%It isnotr}'ecommended to9c}'allthesefunctionsdirectly.qDzTheyUUarelistedhereonlyforcompleteness.9p?<-GCA2PTR(A)aƲgives0accesstothearrayreferencedbyaGCA!handle.%YIttakesaGCA'9handleSasinputandreturnsaCCpGointertothearrayofWordsalloGcatedbyaprevious'9callPtoGCAMALLOC().p=ThisCp}'ointermustnotbeusedasinputtoSACLIB,functions'9or'stor}'edinSACLIB+Ajlists.JRather,VitcanbGeusedtoaddresstheelementsofthearray'9directly*.'9Notesthatthisisnottherecommendedwaysofaccessingarrayelements.̿Ifyouover-'9writethevqariablecontainingtheGCAQhandle(e.g.anoptimizingcompilermight'9removeVitifitisnotusedanymore),youVcanstillaccessthearrayusingtheC8pGointer,'9butUUthegarbagecollectorwillfreethealloGcatedmemorythenexttimeitisinvoked.9GCAFREE(A)Gղcan8bGeusedtoexplicitlyfreethememoryallocatedbyGCAMALLOC().hIttakes'9aUUGCAhandleasinputwhichbGecomesinvqalidafterthecall.A5365C'9Y*ouf7shouldconsidercallingGCAFREE()onlyincaseswhereyouaresureyouwillnot '9need(thememoryreferencedbyaGCAhandleanymoreandwanttodealloGcateit'9immediatelyinsteadofputtingthiso untilthenextgarbagecollectionoruntilthe'9SACLIBOcleanup.!č9A.37ByDeclaringffGlobalVfariablestoSACLIB9Ifyouareusingglobalvqariables,arrays,orstructurescontainingSACLIB.OBlistorGCA9handles*otherthanthosede nedwithinSACLIB+F(in\external.c"),2youhavetomakethem9visibleUUtothegarbagecollector.qThisisdonebythefunctionGCGLOBAL().9FigureUUA.3showshowthesemacrosareused:UI9Hff9#include"saclib.h" 9Word!GL=NIL;9Word!GA=NIL;9char!buffer[81];9int%̰flag;9intsacMain(argc,argv)4intargc;4char**argv;9{.../*Variabledeclarations.*/9Step1: s,/*Declareglobalvariables.*/4GCGLOBAL(&GL);4GCGLOBAL(&GA);9Step2: s,/*Initializeglobalvariables.*/4GA=GCAMALLOC(10,GC_CHECK);4.4.4.OGffŲFigureUUA.3:qDeclaringglobalvqariables.99First0twoglobalvqariablesGLandGAoftypGeWord,kaglobalarraybufferof81characters,9andUUaglobalvqariableflagoftypGeintaredeclared.9TheNvqariablesGL(andGAaredeclaredtothegarbagecollectorbycallstoGCGLOBAL()9b}'eforetheyareinitialized.Notethatforthevqariablesbufferandflagthisisnotneces-9saryJbGecausetheywillnotholdSACLIB+`listorGCA?handlesatanytimeduringprogram9execution.9Calling GCGLOBAL onapGointertoaglobalvqariabletellsthegarbagecollectornottofree9cells5orarraysreferencedbythecorrespGondingvqariable.fY*oushouldbecarefulaboutnot9missinganyglobalvqariableswhichoughttobGedeclared:?whiledeclaringtoomuchdoesnot9reallyUUmatter,declaringtoGolittlewillcauseweirdbugsandcrashes...A547BݠC9A.47ByInitializingffSACLIB>HbyffHand9IfnitisdesiredtohavencompletecontrolovercommandlineparametersorifSACLIB*isused 9onlyVaspartofsomebiggerapplication,WWthenthenecessaryinitializationscanalsobGedone9directlyUUwithoutusingsacMain().9ThereUUarethreefunctionswhichareofinterest:9ARGSACLIB(argc,argv;ac,av)doGesrargumentprocessingforSACLIB*commandlineargu-'9ments.bThese&muststartwitha\+"andareusedtosetvqariousglobalvariables.bThe'9argument\+h"causesausagemessagetobGeprinted(byINFOSACLIB()).Thenthe'9programUUisabGorted.'9ARGSACLIBtakes.theargcandargvparametersofmain()asinput.TRItreturnsthe'9numbGerc!ofnon-SACLIB)Tcommandlineargumentsinacandapointertoanarray'9ofnon-SACLIB*commandlineargumentsinav. gThismeansthattheoutputof'9ARGSACLIB()issimilartoargcandargvwiththeexceptionthatallargumentsstart-'9ingUUwith\+"haveUUbGeenremoved.9BEGINSACLIB(p)\ɲinitializessSACLIB-bysalloGcatingmemory*, settingthevqaluesofvarious'9global2vqariables,9etc.f>ItmustbGepassedtheaddressofavariableloGcatedonthestack'9bGeforeanyvqariablecontainingSACLIB+'jstructuressuchaslistsorGCAhandles.^EOne'9vqariableUUwhichful llsthisrequirementisargc,forexample.9ENDSACLIB(f)R9ϲfreesthememoryalloGcatedbyBEGINSACLIB().ItmustbGepassedoneof'9theUUfollowingvqalues(whichareconstantsde nedin\saclib.h"):39=9SACEff&fǫFREEMEMֲ..._ThiswillcauseittoalsofreeallremainingmemoryalloGcated=9byUUGCAMALLOC().39=9SACEff&fǫKEEPMEM3...1ThiswillcauseitnottofreetheremainingmemoryalloGcatedby=9GCAMALLOC().]Nevertheless,#allMGCA=handlesbGecomeinvqalidafterENDSACLIB()=9hasbGeencalled,qsothememorycanonlybeaccessedbyCpointerswhichwere=9initializedkbycallstoGCA2PTR()b}'eforekcallingENDSACLIB().HF*urthermore, if=9anyofthearrayscontainslistorGCAhandles, thesewillalsobGecomeinvqalid, so=9keepingWthealloGcatedmemoryonlymakessensewhenthearrayscontainBETA-=9orUUGAMMA-digits.=9DealloGcationR\thenhastobedonebythestandardUNIXRfunctionfree(),(because=9GCAFREE()UUonlyworkswhentheSACLIB+venvironmentisvqalid.9FigureA.4givesanexampleofhowtheSACLIB,environmentcanbGeinitialized,Cused,9andUUremovedinsideafunction.9ThefunctionsymbolicEff&fǫcomputation()inthisexampleencapsulatesSACLIB*Maspartof9somefbiggerapplicationwhosemainroutineismain()insteadofsacMain().F*romStep29on`theSACLIB+*environment`isinitializedandanySACLIB+*functionmaybGeused.^Outside9theareaenclosedbyBEGINSACLIB?/ENDSACLIB,callstoSACLIB+functionsmaycrashthe9program.!č9A.57BySACLIBp[ErrorffHandling9SACLIB7Xfunctions,donotcheck,whethertheparameterspassedtothemarecorrectand9ful lltheirinputspGeci cations.Callingafunctionwithinvqalidinputswillmostprobably9causeUUtheprogramtocrashinsteadofabGortinginacontrolledway*.9Nevertheless,there_aresituationswhereSACLIB)functionsmayfailandexittheprogram9cleanlyٖwithanerrormessage.F*orexample,:thisisthecasewhenaninputfunctions9discoversUUasyntaxerror.A558LCiX-9Hff9#include"saclib.h" 9voidsymbolic_computation()9{4WordXstack;9Step1: s,/*InitialiseSACLIB.*/4BEGINSACLIB(&stack);9Step2: s,/*UseSACLIB.*/4.4.4.9Step3: s,/*RemoveSACLIB.*/4ENDSACLIB(SAC_FREEMEM);9}OGffTiFigureUUA.4:qSamplecoGdeforinitializingSACLIBbyhand.9AlljEerrorhandling(i.e.writingamessageandabGortingtheprogram)isdonebythe 9functionCFAIL().IfsomemoresophisticatederrorproGcessingisdesired,thesimplestway9isUUtoreplaceitbyacustomwrittenfunction.!č9A.67ByCompiling9TheSACLIB*header lesmustbGevisibletothecompilerandthecompiledSACLIB*library9must4bGelinked.cHowthisisdoneisexplainedinthe\AddendumtotheSACLIB-4User's9Guide",UUwhichshouldbGesuppliedbythepGersoninstallingSACLIB(G!.9A9{pGoint9worthmentioningisthefactthatseveralSACLIB+dfunctionsarealsode nedas9macros.uBydefault,themacroversionsareused,butthereisaconstantforswitchingon9theCfunctionversions:NOEff&fǫSACLIBEff&fMACROSswitcheso allmacrosexceptforFIRST,RED,9SFIRST,SRED,ISNIL,GCASET,GCAGET.TheseelementarylistandGCA²functionsarealways9de nedUUasmacros.9IfUUyouwanttousethisconstant,youmustaddthestatement'9#define?NOEff&fǫSACLIBEff&fMACROS9b}'eforeUUyouincludethe le\saclib.h". 9Alternatively*,,you"canusethe\-D"optionoftheCcompiler(seethe\Addendumto9theUUSACLIB+vUser'sUUGuide"formoreinformation).A569]NC9iAppendix B29GISAYCDLc: pAn T{In8teractiveInterface9to T{GSAYCLIB:9B.16WhatffisISAC&j?9ISAC(Jis8asmallexpGerimentalinteractiveinterfacetoSACLIB'*,qallowingsimpleread--eval--write 9cyclesUUofinteraction.9Thesystemisdesignedandimplementedinthemoststraightforwardway*, sothatits9sourcecoGdecanbeusedasanexampleoratutorialforthosewhowanttoquicklywrite9aninteractivetestenvironmentfortheirSACLIB.basedfunctionsorintendtodevelop9professionalUUinterfacestoSACLIB(G!. $9B.26Supps3ortedffSACLIB>HAlgorithms9AlltheSACLIB,libraryalgorithmsandmacrosareaccessible.,kNILandBETAareavqailable9asUUconstants. $9B.36CommandffLineOptions9ISAC(atakes thestandardSACLIB+ commandlineoptionsforinitializingvqariousglobalvari-9ables.qInUUorderto ndoutwhatisavqailable,issuethecommandM9isac?+h $9B.46InterfaceffFfunctionality9AnEnISAC 'PsessionEnconsistsofoneormorestatements.BEveryEnstatementmustendwitha9semicolonUU`;'.qAstatementcanbGeoneofthethreekinds:9'9commandP9'9call9'9assignment9TheUUcommandssuppGortedinthisversionare:N8,9quit;:F*orUUquittingthesession.p,9vars;:F*ordisplayingthecontentsofthevqariables.V*aluesare :displayedUUininternalSACLIB+vformat.A57:eYC,9help?[ algName]?;:F*ordisplayingageneralhelporanalgorithm.23Forexam- :ple,inordertodisplaythealgorithmIPRODݲ,issuethethe:command: help?IPROD;p,9view?algName;:F*orUUdisplayinganalgorithmwiththeeditorvi(1).,9save?fileName;:F*orsavingthecurrentstateofthesession(i.e.Uthevqariable :binding)UUtoa le.,9restore?fileName;:F*orUUrestoringthestateofasessionfroma le.N89AccallcstatementisacalltoanyproGceduresorfunctionsintheSACLIB)rlibrary*.!GForcexample,-IPFAC(r,A;?s,c,F);-IPWRITE(r,IPSUM(r,A,B),V);9AnUUassignmentstatementisoftheform:-var?:=expression;9F*orUUexample,-A?:=IPROD(a,ISUM(b,c));-a?:=2*3+4;-a?:=3%2;!č9B.56InterfaceffGrammar9Belowקwegiveacontext-freegrammarforasession.W*ehavefollowedthefollowingcon-9ventions:9'9UppGer-caseUUstringsandquotedstringsdenotetokens,9'9Lower-caseUUstringsdenotenon-terminals.9session89:?statement89|?sessionstatement89;9statement89:?command';'89|?proc_call';'89|?assignment';'89;9command89:?IDENT89|?IDENTCMDARGS89;9proc_call89:?IDENT'('proc_arg_star')'89;9assignment89:?IDENT':='exprA58;lРC89; 9proc_arg_star89:?val_star89|?val_star';'ref_star89;9val_star89:?/*empty*/89|?val_plus89;9val_plus89:?expr89|?val_plus','expr89;9ref_star89:?/*empty*/89|?ref_plus89;9ref_plus89:?ref89|?ref_plus','ref89;9ref89:?IDENT9expr89:?expr'+'expr89|?expr'-'expr89|?expr'*'expr89|?expr'/'expr89|?expr'%'expr89|?'+'expr89|?'-'expr89|?'('expr')'89|?func_call89|?atom89;9func_call89:?IDENT'('func_arg_star')'89;9func_arg_star89:?val_star89;9atom89:?IDENT89|?INTEGERA59<sC89;A60=wC9iAppendix C29cNotes T{ontheIn8ternalWorkings9of T{GSAYCLIB:9C.16Lists,ffGCAHandles,andGarbageCollection9C.1.1:yImplementationofListsuT9When*CSACLIB+FRis*Cinitialised,2thearraySPACEcontainingNU+1WordsisalloGcatedfromthe 9heap.ewThis0farrayisusedasthememoryspaceforlistproGcessing.Listsarebuiltfromc}'ells,9whicharepairsofconsecutiveWordsthe rstofwhichisatanoGddpositionintheSPACE9array*.BList;handlesb(\pGointers"tolists)arede nedtobGeBETAplustheindexofthe rstcell9ofthelistintheSPACEarraywiththehandleoftheemptylistbGeingNIL(whichisequal9toUUBETA).FigureC.1showsthestructureoftheSPACEarray*.`~99.SPACE.32fdGO line10QVV*eSfeiʟfeifefefeiʎtfefefefefefe932fdй32fd932fdӹ32fd932fd932fdй32fd932fdӹ32fd932fdع< lcircle10p9pp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdSfeKʟfeKfefefeKʎfefefe-fe8卍9V*alueUUofthe T9SACLIB Ǎ9listUUhandle:qBETA+j0y135tfe32v32fe32Ήfe|932fe32Ήfe32fefe32932feǍ|cellfe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe3232fe32Ήfe932fe32Ήfe32feΆfe32932feǍcellKNU-3KNU-1fe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe32 32fe32--Ήfe&932fe32--Ήfe/32fe<fe325932feǍ&cell FigureUUC.1:qTheSPACEarray*.r9The rstWordofeachcellisusedtostorethehandleofthenextcellinthelist(i.e.9thevqaluereturnedbyRED()),RwhilethesecondWordcontainsthedataofthelistelement9representedbythecell(i.e.thevqaluereturnedbyFIRST()).FigureC.2givesagraphical9representationUUofthecellstructureforasamplelist.qThearrowsstandforlisthandles.L~9L"fe"9?ppp32fd932fd32fd932fd 32fd32fd932fd32fd932fd 32fd!ӎfe(ʟfe(fefefe(ʎ6feJ932fdK32fdM932fdN32fdP932fdJ932fdK32fdM932fdN32fdP932fdQpVp[pQpVp[p[32fd]932fd^32fd`932fda32fd[32fd]932fd^32fd`932fda32fdbӎfe(ʟfe(fefefe(ʎwfe932fd32fd932fd32fd932fd932fd32fd932fd32fd932fdpppppp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe932fd͹32fd932fdй32fd932fd932fd͹32fd932fdй32fd932fdӹpعpݹpӹpعpݹpݹ32fd932fd32fd932fd32fdݹ32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe 932fd32fd932fd32fd932fd 932fd32fd932fd32fd932fdpppppp32fd 932fd!32fd#932fd$32fd32fd 932fd!32fd#932fd$32fd%ӎfe(ʟfe(fefefe(ʎ:feN932fdO32fdQ932fdR32fdT932fdN932fdO32fdQ932fdR32fdT932fdUpZp_p,9q,fe,932fd7cfec9?m9qmfem932fd7fe9?9qfe932fd7&fe&9?㍑=19YNIL㍒8㍒99(YNIL㍒A69qfe92fddfe96V>FigureUUC.2:qThecellstructureofthelistL=(1;(9;6);8).9AspalreadymentionedinChapter2,vatomsarerequiredtobGeintegersawithBETA<9a7w]C9tothememoryaddressesofSPACE[BETA]andSPACE[BETA+1],respGectively*.AThisis 9usedqbythefunctionsFIRST(L),whichreturnsSPACEB1[L],andRED(L),whichreturns9SPACEB[L].9C.1.2:yImplementationofGCAHandlesuT9When'SACLIB.Vis'initialised, [thearrayGCASPACEcontainingNUp+!k1structuresoftypGe9GCArray<>isalloGcated.&A<GCAh!handleisde nedtobeBETApplustheindexofthecorre-9spGondingUUGCArraystructureintheGCASPACEarray*,withthenullhandlebGeingNIL.9TheUUGCArraystructurecontainsthefollowing elds:Cy9'9nextoʲ...taWord,usedforlinkingemptyGCArraystotheGCAAVAILlistandformarking'9(seeUUSectionC.1.3).!9'9flagUU...aWord,settooneofGCEff&fǫCHECKandGCEff&fNOEff&fCHECK(seeSectionC.1.3).9'9lenUU...aWord,thelengthofthearrayinWords.9'9arrayUU...aCpGointertoanarrayofWordsofsizelen.9When9GCAMALLOC()(iscalled,rittakesthe rstGCArrayfromtheGCAAVAILlistand 9initializesUUits elds.9GCA2PTR()UUsimplyreturnstheCpGointerinthearray eld.9GCAFREE()iSdealloGcatesthememoryaddressedbythearray eld,nRsetsall eldstozero,9andUUlinkstheGCArraytothebGeginningoftheGCAAVAILlist.9C.1.3:yTheGarbageCollectoruT9Garbage]Xcollectionisinvoked]XwhenCOMP()orGCAMALLOC()callGC()inthecaseofAVAIL9orUUGCAAVAILbGeingNIL.ThegarbagecollectorconsistsoftwoUUparts:9'9The'functionGC()issystemdepGendent. T=Itmustensurethatthecontentsofall'9proGcessor registersarepushedontothestackandpassalignmentinformationandthe'9addressUUoftheendofthestacktoGCSI().!9'9GCSI()visthesystemindepGendentpartofthegarbagecollector.ժItusesamark-and-'9sweepUUmethoGdforidentifyingunusedcells:'9Marking:ZTheproGcessorregisters,Wthesystemstack,andthevqariablesandGCA=9arraysItowhichpGointersarestoredintheGCGLOBALSlistaresearchedfornon-=9NIL listandGCAhandles.AAllthecellsaccessiblefromthesehandlesaremarked=9byUUacalltoMARK(). ލ=9If̓alisthandleisfound,thisfunctiontraverses̓thecellsofthelist,markingthem=9bynegatingthecontentsoftheir rstWord.\IfthesecondWordofacellcontains=9aUUlistorGCAhandle,MARK()callsitselfrecursivelyonthishandle.=9InCcaseofaGCAChandle,ZtheGCAcelladressedbythehandleismarkedby=9negating~thecontents~ofitsnext eld. AIfthecell'sflag eldisnotsetto=9GCEff&fǫNOEff&fCHECK,theWordsinthearraypGointedtobythearray eldaresearched=9forUUlistorGCAhandleswithMARK()callingitselfrecursivelyonvqalidhandles.!'9Sw9eeping:^:InUUthesweepstep,theAVAILandGCAAVAILlistsarebuilt:=9Cells~inSPACEwhose rstWordcontainsapGositivevqaluearelinkedtotheAVAIL=9list.[If/the rstWordofacellcontainsanegativevqalue, jitismadepGositiveagain=9andUUthecellisnotchangedinanyotherway*.=9CellsinGCASPACEwhosenext eldcontainsapGositivevqaluearelinkedtothe=9GCAAVAILlistandthearraypGointedtobythearray eldisdealloGcated.Ifthe=9next4Ų eldcontainsanegativevqalue,;HitismadepGositiveagainandthecellisnot=9changedUUinanyotherway*.A62?C9IfmtheAVAILlistcontainsnomorethanNU g=RHOdcellsattheendofgarbagecollection,an 9errorUUmessageiswrittentotheoutputstreamandtheprogramisabGorted.!9C.26ConstantsffandGlobalVfariables9This+sectionlistsSACLIB,R"typGes,constants,and+globalvqariables.HAlltypGesandconstants9areqde nedin\saclib.h",?8\sactypGes.h",andq\sacsys.h".Externalvqariablesarede nedin9\external.c"UUanddeclaredasexternalin\saclib.h".9Thei%averageuserofSACLIB-functionsshouldnot nditneccessarytodealdirectly9withanyofthesevqalues(exceptforWord,hBETA,andNIL,whicharealsomentionedinother9sections).CXIfyoumoGdifyanyofthevqalueslistedbGelowwithoutknowingwhatyouaredoing,9youUUmayeithercrashSACLIB+vorcauseittoproGducefalseresults,sopleasetakecare![9Notation:r,InՈthedescriptionbGelow,5p}'ointermeansaC%pointer(i.e.anactualmemory9address)®andp}'ointertoanarray®meansaC‘pGointertothe rstelementofanarray*.List9handleVmeansaSACLIB-Blisthandle(i.e.anintegerLwithBETAĸtL "5-:2LThis٠isequaltoSBETA.FJorhistoricalreasons,ڲinsomeSAÎCLIB%functionsSBETAisexplicitlyusedinsteadofXSNIL.A63@C9BelowUUwegivealistoftheSACLIB+vglobalvqariablesasde nedin\external.c":}9ListTproQcessingandgarbagecollection:ԍ39=9AVAILUU...aWord,thelisthandleofthefreelist.ԍ39=9GCGLOBALSUU...aWord,thelisthandleofthelistofglobalvqariables.39=9BACSTACKUU...apGointertothebeginningofthesystemstack.39=9GCCUU...aWord,thenumbGerofgarbagecollections.39=9GCACUU...aWord,thenumbGerofGCAcellscollectedinallgarbagecollections.39=9GCCCUU...aWord,thenumbGerofcellscollectedinallgarbagecollections.39=9GCMN...?aWord,OifGCMNis1,amessageiswrittentotheoutputstreameachtime =9theUUgarbagecollectoriscalled.39=9NU...9eaWord,onelessthanthesizeoftheSPACEarrayinWords,i.e.twicethe=9numbGerUUofcellsinSPACE.39=9RHOT...taWord,!thegarbagecollectorabGortstheprogramifnomorethanNU JN=RHO=9cellsUUwerereclaimed.39=9SPACEBUU...apGointertoanarrayofwords,SPACEB%[=SPACE?8BETA8Բ.39=9SPACEB1UU...apGointertoanarrayofwords,SPACEB1*X=SPACE?8BETA1xѲ.39=9GCAAVAILUU...aWord,theGCAhandleofthefreelistofGCAcells.39=9GCASPACE #...apGointertoanarrayofGCArraystructures,thememoryspacefor=9GCAUUcells.39=9GCASPACEBpݲ...tapGointertoanarrayofGCArraystructures,&GCASPACEBp>ٲ==9GCASPACEir8BETApxѲ.39=9NUp,...aWord, onelessthanthenumbGerofGCArraystructuresintheGCASPACE=9array*.39=9BETApM...aWord,*thebGoundusedtodistinguishbetweenlistandGCA@handles.=9BETApZ@=BETA+8NU+81.39=9BETApp7...EaWord,=theuppGerboundonGCA7GCAhandles.gBETApp&=BETApu+=9NUpO2̲+81.ԍ9Timing:39=9TAUUU...aWord,thetime(inmilliseconds)spGentforgarbagecollections.ԍ39=9TAU0ł...p,aWord,thesystemtime(inmilliseconds)justbGeforeSACLIB,|initial-=9ization.39=9TAU1Y...aWord,thesystemtime(inmilliseconds)immediatelyafterSACLIB=9initialization.ԍ9In9tegerTarithmetic:ќ39=9DELTAUU...aWord,DELTA \^=2^bZETA=2c&L.ќ39=9EPSILUU...aWord,EPSIL \^=2^dZETA=2e)d=BETA =DELTA?.39=9ETAUU...aWord,ETAd=blog ꬟qƱ10:BETA,.c.39=9RINCUU...aWord,theincrementfortherandomnumbGergenerator.39=9RMULTUU...aWord,themultiplierfortherandomnumbGergenerator.39=9RTERMUU...aWord,thelastvqalueproGducedbytherandomnumbGergenerator.39=9TABP2UU...apGointertoanarrayofWords,TABP2F[i]=2^i1for1iZETA .39=9THETAUU...aWord,THETA \^=10^fCscmtt8fETA .A64A=C39=9UZ210UU...aWord,thelisthandleofthelistofunitsofZ210 uY.39=9ZETAUU...aWord,ZETAa=logğqƱ2BETA*Ӳ.9PrimeTn9umbQers:39=9NPFDSUU...aWord,thenumbGerofprimesusedbytheSACLIB+vfunctionIUPFDS.39=9NPRIMEUU...aWordcontrollingthenumbGerofprimesinPRIME.39=9PRIMEp...+aWord,wKthelisthandleofthelistofprimesbGetweenBETArJNPRIME$ =9ZETATrɸ87=5UUandBETA.39=9NSMPRMUU...aWord,theuppGerboundonthesizeofprimesinSMPRM.39=9SMPRMUU...aWord,thelisthandleofthelistofprimes<NSMPRM"G.9Miscellaneous:39=9NPTR1UU...aWord,thenumbGerofWordsintheGCAPTR1array*.39=9GCAPTR1I[...aWord,KtheGCAIXhandleofthearrayusedbythefunctionIUPTR1.9Input/Output:39=9LASTCHARUU...aWord,thelastcharacterreadfromtheinputstream.A65BʱCG9cIndex.卍G9BETA,UU63 9NIL,UU4,639AADV,UU6,129absoluteUUvqalue"9ofUUapGolynomial,169ADV,UU59ADV2,UU69ADV3,UU69ADV4,UU69AFCOMP*,UU479AFCR,UU499AFDIF,UU479AFDWRITE,UU509AFFINT,UU499AFFRN,UU499AFICR,UU499AFINV,UU479AFNEG,UU479AFP*AFP,UU479AFP*AFQ,UU479AFPCMV,UU489AFPCR,UU499AFPDIF,UU479AFPDMV,UU479AFPEMV,UU489AFPEV,UU489AFPFIP*,UU499AFPFRP*,UU499AFPICR,UU499AFPINT,UU479AFPME,UU489AFPMON,UU479AFPNEG,UU479AFPNIP*,UU489AFPNORM,UU489AFPPR,UU479AFPQR,UU479AFPROD,UU479AFPSUM,UU479AFPWRITE,UU509AFQ,UU479AFSIGN,UU479AFSUM,UU479AFUPBRI,UU48GAFUPFAC,UU47 AFUPGC,UU48AFUPGS,UU48AFUPIGIR,UU49AFUPIGIWS,UU49AFUPMPR,UU48AFUPRB,UU48AFUPRICL,UU48AFUPRICS,UU49AFUPRL,UU49AFUPRLS,UU49AFUPRRI,UU49AFUPRRS,UU49AFUPSF,UU48AFUPSR,UU48AFUPVAR,UU49AFUPWRITE,UU50AFWRITE,UU50AIFAN,UU50algebraic eldUUelement,46integer,UU46numbGer,UU46numbGer,UUreal,46AMPSAFP*,UU50AMSIGN,UU47AMSIGNIR,UU47AMUPBES,UU48AMUPBHT,UU48AMUPIGIR,UU49AMUPIGIWS,UU49AMUPMPR,UU49AMUPNT,UU48AMUPRICS,UU49AMUPRICSW,UU49AMUPRINCS,UU49AMUPRLS,UU49AMUPRRS,UU49AMUPSR,UU48AMUPTR,UU48AMUPTR1,UU48AMUPVARIR,UU49ANDWRITE,UU50ANFAF,UU50ANIGIPE,UU47A66CC9ANPEDE,UU47 9ANPROD,UU479ANREPE,UU479ANSUM,UU479AREAD,UU79ARGSACLIB,UU559atom,UU49AWRITE,UU79baseUUdomain,169baseUUring,169basis"9coarsestUUsquarefree,32"9 nestUUsquarefree,329BEGINSACLIB,UU559binaryUUrationalnumbGer,UU419CCONC,UU69ceiling,UU109cell,UU49CINV,UU79coGecient"9leading,UU16"9leadingUUbase,16"9trailingUUbase,169cofactors,UU329COMP*,UU59COMP2,UU59COMP3,UU59COMP4,UU59compGosition,UU59CONC,UU69concatenation,UU59constantUUpGolynomial,169content,UU16,33"9integer,UU16"9univqariate,UU339DAND,UU129DEGCD,UU119degree,UU169denseUUrecursiverepresentation,159destructive,UU59DGCD,UU119digit,UU9"9BETA-,UU9"9GAMMA-,UU9"9moGdular,UU99DIGIPREAD,UU269DIGIPWRITE,UU279DIPDEG,UU279DIPFP*,UU269DIPINS,UU279DIRPREAD,UU27DIRPWRITE,UU27 discriminant,UU32disjointUUintervqals,41DLOG2,UU12DMPPRD,UU27DMPSUM,UU27DMUPNR,UU27DNIMP*,UU12DNOT,UU12DOR,UU12DPCC,UU12DPFP*,UU27DPGEN,UU11DPR,UU10DQR,UU10DRAN,UU11DRANN,UU11DSQR*TF,UU11elementofUUalist,4ENDSACLIB,UU55EQUAL,UU6EXTENT,UU6extent,UU5factorizationcomplete,UU37squarefree,UU17,33FIRST,UU6FIRST2,UU6FIRST3,UU6FIRST4,UU6 oGor,UU10FOUR*TH,UU6GC,UU62GCffCHECK,UU52GCffNOffCHECK,UU52GCA2PTR,UU53GCAFREE,UU53GCAGET,UU52GCAMALLOC,UU52GCASET,UU52GCSI,UU62handleofUUaGCA,51ofUUalist,4IABSF,UU11IBCIND,UU12IBCOEF,UU12IBCPS,UU12ICOMP*,UU11A67DQC9IDEGCD,UU11 9IDIF,UU109IDIPR2,UU129IDP2,UU129IDPR,UU109IDQ,UU109IDQR,UU109IDREM,UU119IEGCD,UU119IEVEN,UU119IEXP*,UU119IFACT,UU119IFACTL,UU129IFCL2,UU129IGCD,UU119IGCDCF,UU119IHEGCD,UU119ILCM,UU119ILCOMB,UU129ILOG2,UU129ILPDS,UU119ILWRITE,UU129IMAX,UU119IMIN,UU119IMP2,UU129IMPDS,UU119INEG,UU109in ectionlessUUisolatingintervqal,419in ectionlessUUisolationlist,419integer,UU9"9BETA-,UU9"9GAMMA-,UU9"9algebraic,UU46"9moGdular,UU99integerUUcontent,169integralUUpGolynomial,169intervqal,UU41"9isolating,UU41,9acceptable,UU46,9in ectionless,UU41,9strongly*,UU41,9weakly*,UU41"9standard,UU419intervqals"9disjoint,UU41,9strongly*,UU419INV,UU79inverse"9ofUUalist,59IODD,UU119IORD2,UU129IP*ABS,UU219IP*AFME,UU489IPBEILV,UU22IPBHT,UU22 IPBHTLV,UU22IPBHTMV,UU22IPBREI,UU22IPC,UU23,34IPCEVP*,UU38IPCONST,UU23IPCPP*,UU23,34IPCRA,UU24IPCSFB,UU35IPDER,UU22IPDIF,UU21IPDMV,UU22IPDSCR,UU35IPDWRITE,UU23IPEMV,UU22IPEVAL,UU22IPEXP*,UU21IPEXPREAD,UU23IPFAC,UU38IPFCB,UU38IPFLC,UU38IPFRP*,UU23IPFSD,UU24IPFSFB,UU35,38IPGCDC,UU34IPGFCB,UU38IPGSUB,UU22IPHDMV,UU22IPIC,UU23IPICPP*,UU23IPICS,UU23IPIHOM,UU24IPIGIWS,UU42IPINT,UU22IPIP*,UU21IPIPP*,UU23IPIPR,UU24IPIQ,UU21IPIQH,UU38IPLCPP*,UU23,34IPLRRI,UU42IPMAXN,UU23IPNEG,UU21IPNT,UU22IPONE,UU23IPOWER,UU11IPP2P*,UU21IPPGSD,UU35IPPNPRS,UU42IPPP*,UU23,34IPPROD,UU21IPPSC,UU35IPPSR,UU21A68EC9IPQ,UU21 9IPQR,UU219IPRAN,UU239IPRCH,UU419IPRCHS,UU419IPRCN1,UU419IPRCNP*,UU419IPREAD,UU239IPRES,UU359IPRICL,UU429IPRIM,UU429IPRIMO,UU429IPRIMS,UU429IPRIMU,UU429IPRIMW,UU429IPRIST,UU429IPROD,UU109IPRODK,UU109IPRPRS,UU369IPRRIGI,UU429IPRRLS,UU429IPRRRI,UU429IPRRS,UU429IPSCPP*,UU23,349IPSF,UU24,359IPSFBA,UU359IPSFSD,UU249IPSIFI,UU429IPSIGN,UU219IPSMV,UU229IPSPRS,UU369IPSRM,UU429IPSRMS,UU429IPSRP*,UU239IPSUB,UU229IPSUM,UU219IPSUMN,UU239IPTPR,UU249IPTR,UU239IPTR1,UU239IPTR1LV,UU239IPTRAN,UU229IPTRLV,UU239IPTRMV,UU229IPTRUN,UU249IPVCHT,UU429IPWRITE,UU239IQ,UU109IQR,UU109IRAND,UU119IREAD,UU129IREM,UU109IROOT,UU119ISA*TOM,UU6ISEG,UU12 ISFPF,UU38ISIGNF,UU11ISLIST,UU6ISNIL,UU6ISOBJECT,UU6ISPD,UU11ISPSFB,UU35ISPT,UU11ISQR*T,UU11ISSUM,UU12ISUM,UU10ITRUNC,UU12IUPBEI,UU22IUPBES,UU22IUPBHT,UU22IUPBRE,UU22IUPCHT,UU43IUPFAC,UU38IUPFDS,UU38IUPIHT,UU22IUPIGIR,UU42IUPNT,UU22IUPQH,UU38IUPQHL,UU38IUPQS,UU22IUPRB,UU42IUPRC,UU35IUPRLP*,UU42IUPSR,UU21IUPTPR,UU24IUPTR,UU23IUPTR1,UU23IUPVAR,UU43IUPVOI,UU43IUPVSI,UU43IUSFPF,UU38IWRITE,UU12LASTCELL,UU6LBIBMS,UU7LBIBS,UU7LBIM,UU7LCONC,UU6LDSMKB,UU29LDSSBR,UU29leadingUUbasecoGecient,16leadingUUcoGecient,16leadingUUterm,16LEINST,UU7LEL*TI,UU6LENGTH,UU6lengthofUUalist,5A69FĠC9LEROT,UU7 9LEXNEX,UU79LINS,UU79LINSR*T,UU79list,UU4"9empty*,UU4"9ofUUcharacters,17"9ofUUvqariables,179LIST1,UU59LIST10,UU59LIST2,UU59LIST3,UU59LIST4,UU59LIST5,UU59LMERGE,UU79LPERM,UU79LREAD,UU79LSRCH,UU69LWRITE,UU89mainUUvqariable,169MAIPDE,UU299MAIPDM,UU299MAIPHM,UU309MAIPP*,UU299MCPMV,UU389MDCRA,UU139MDDIF,UU139MDEXP*,UU139MDHOM,UU139MDINV,UU139MDLCRA,UU139MDNEG,UU139MDPROD,UU139MDQ,UU139MDRAN,UU139MDSUM,UU139MEMBER,UU69MIAIM,UU309MICINS,UU309MICS,UU309MIDCRA,UU139MIDIF,UU139MIEXP*,UU139MIHOM,UU139MIGINV,UU139MINEG,UU139MINNCT,UU309MIPDIF,UU249MIPFSM,UU259MIPHOM,UU259MIPIPR,UU249MIPISE,UU389MIPNEG,UU24MIPPR,UU24 MIPRAN,UU25MIPROD,UU13MIPSUM,UU24MIQ,UU13MIRAN,UU13MISUM,UU13MIUPQR,UU24MIUPSE,UU38MMDDET,UU29MMDNSB,UU29MMPDMA,UU29MMPEV,UU30MMPIQR,UU25moGdulardigit,UU9integer,UU9integralUUpGolynomial,16pGolynomial,UU16symmetric,UU9monicUUpGolynomial,16MPDIF,UU24MPEMV,UU25MPEVAL,UU25MPEXP*,UU25MPGCDC,UU34MPHOM,UU25MPINT,UU25MPIQH,UU39MPIQHL,UU39MPIQHS,UU39MPMDP*,UU24MPMON,UU25MPNEG,UU24MPPROD,UU24MPPSR,UU25MPQ,UU24MPQR,UU24MPRAN,UU25MPRES,UU35MPSPRS,UU36MPSUM,UU24MPUC,UU25,34MPUCPP*,UU25,34MPUCS,UU25,34MPUP*,UU24MPUPP*,UU25,34MPUQ,UU24MUPBQP*,UU39MUPDDF,UU39MUPDER,UU25MUPEGC,UU36MUPFBL,UU38MUPFS,UU39A70GC9MUPGCD,UU35 9MUPHEG,UU369MUPRAN,UU259MUPRC,UU359MUPRES,UU359MUPSFF,UU25,359name"9ofUUavqariable,179negative,UU109non-negative,UU109non-pGositive,UU109numbGer"9algebraic,UU46"9rational,UU10"9realUUalgebraic,469ob8ject,UU59ORDER,UU69order"9ofUUalist,5"9ofUUapGolynomial,169OREAD,UU89OWRITE,UU89P*AIR,UU89PBIN,UU209PCL,UU219PCONST,UU209PCPV,UU219PDBORD,UU209PDEG,UU209PDEGSV,UU209PDEGV,UU209PDPV,UU209PERMCY,UU79PERMR,UU79PFBRE,UU209PFDIP*,UU21,269PFDP*,UU21,279PICPV,UU219PINV,UU219PLBCF,UU209PLDCF,UU209PMDEG,UU209PMON,UU209PMPMV,UU209pGolynomial,UU16"9constant,UU16"9denseUUrecursiverepresentation,15"9integral,UU16"9integralUUminimal,46"9moGdular,UU16"9moGdularUUintegral,16monic,UU16 pGositive,UU16primitive,UU16,33rational,UU16rationalUUminimal,46sparsehdistributiverepresentation,115sparseUUrecursiverepresentation,15squarefree,UU17,33PORD,UU20pGositive,UU10pGositiveUUpolynomial,16PPERMV,UU21PRED,UU20primitiveUUpart,33univqariate,UU33primitiveUUpGolynomial,16,33PR*T,UU20PSDSV,UU20PTBCF,UU20PTMV,UU21PTV,UU21PUFP*,UU21PUNT,UU20rationalnumbGer,UU10pGolynomial,UU16RED,UU6RED2,UU6RED3,UU6RED4,UU6REDI,UU6reductumofUUalist,5ofUUapGolynomial,16RNABS,UU14RNBCR,UU14RNCEIL,UU14RNCOMP*,UU14RNDEN,UU14RNDIF,UU14RNDWRITE,UU14RNFCL2,UU14RNFLOR,UU14RNINT,UU14RNINV,UU14RNMAX,UU14RNMIN,UU14RNNEG,UU14RNNUM,UU14RNP2,UU14RNPROD,UU14RNQ,UU14RNRAND,UU14A71HOC9RNREAD,UU14 9RNRED,UU149RNSIGN,UU149RNSUM,UU149RNWRITE,UU149RP*AFME,UU489RPBLGS,UU269RPDIF,UU269RPDMV,UU269RPDWRITE,UU269RPEMV,UU269RPEXPREAD,UU269RPFIP*,UU269RPIMV,UU269RPMAIP*,UU269RPNEG,UU269RPPROD,UU269RPQR,UU269RPREAD,UU269RPRNP*,UU269RPSUM,UU269RPWRITE,UU269SACffFREEMEM,UU559SDIFF,UU79SECOND,UU69SEQUAL,UU79set"9unordered,UU59SFCS,UU79SFIRST,UU89sideUUe ects,59sign"9ofUUapGolynomial,169SINTER,UU79SLEL*TI,UU89SMFMI,UU139SMFMIP*,UU259sparseUUdistributiverepresentation,159sparseUUrecursiverepresentation,159squarefree"9basis,9coarsest,UU32,9 nest,UU32"9divisor,UUgreatest,33"9factorization,UU17,33"9pGolynomial,UU17,339SRED,UU89standardUUintervqal,419SUFFIX,UU79SUNION,UU79term"9leading,UU16THIRD,UU6 trailingUUbasecoGecient,16univqariateUUcontent,33univqariateUUprimitivepart,33USDIFF,UU7USINT,UU7USUN,UU7vqariablelistUUof,17main,UU16name,UU17VIAZ,UU29VIDIF,UU29VIERED,UU29VILCOM,UU29VINEG,UU29VISPR,UU30VISUM,UU30VIUT,UU30A72.;IOiNq cmbx12fCscmtt8cNH cmbx12SCscmtt8GDtHGcmr17>DtGGcmr17 cmmi10 0ercmmi7O \cmmi5K`y cmr10ٓRcmr7Zcmr5< lcircle10O line10u cmex10saclib2.2.8/sysdep/doc/user_guide/cISAC.tex0000664002275300236100000001023214017255270017561 0ustar wcbrownscs%---------------------------------------------- \section{What is \isac?} %---------------------------------------------- \isac\ is a small experimental interactive interface to \saclib, allowing simple {\tt read--eval--write} cycles of interaction. The system is designed and implemented in the most straightforward way, so that its source code can be used as an example or a tutorial for those who want to quickly write an interactive test environment for their \saclib\ based functions or intend to develop professional interfaces to \saclib. %---------------------------------------------- \section{Supported \saclib\ Algorithms} %---------------------------------------------- All the \saclib\ library algorithms and macros are accessible. \NIL\ and \BETA\ are available as constants. %---------------------------------------------- \section{Command Line Options} %---------------------------------------------- \isac\ takes the standard \saclib\ command line options for initializing various global variables. In order to find out what is available, issue the command \begin{verbatim} isac +h \end{verbatim} %---------------------------------------------- \section{Interface Functionality} %---------------------------------------------- An \isac\ session consists of one or more statements. Every statement must end with a semicolon `\verb:;:'. A statement can be one of the three kinds: \begin{itemize} \item command \item call \item assignment \end{itemize} % The commands supported in this version are: \begin{glists}{3em}{10em}{1em}{1ex} \iteml{quit;} For quitting the session. \iteml{vars;} For displaying the contents of the variables. Values are displayed in internal \saclib\ format. \iteml{help \mbox{[}algName\mbox{]};} For displaying a general help or an algorithm. For example, in order to display the algorithm \mbox{\tt IPROD}, issue the the command: \verb: help IPROD;: \iteml{view algName;} For displaying an algorithm with the editor vi(1). \iteml{save fileName;} For saving the current state of the session (i.e. the variable binding) to a file. \iteml{restore fileName;} For restoring the state of a session from a file. \end{glists} % A call statement is a call to any procedures or functions in the \saclib\ library. For example, \begin{verbatim} IPFAC(r,A; s,c,F); IPWRITE(r,IPSUM(r,A,B),V); \end{verbatim} % An assignment statement is of the form: \begin{verbatim} var := expression; \end{verbatim} % For example, \begin{verbatim} A := IPROD(a,ISUM(b,c)); a := 2 * 3 + 4; a := 3 % 2; \end{verbatim} %---------------------------------------------- \section{Interface Grammar} %---------------------------------------------- Below we give a context-free grammar for a session. We have followed the following conventions: \begin{itemize} \item Upper-case strings and quoted strings denote tokens, \item Lower-case strings denote non-terminals. \end{itemize} \begin{verbatim} session : statement | session statement ; statement : command ';' | proc_call ';' | assignment ';' ; command : IDENT | IDENT CMDARGS ; proc_call : IDENT '(' proc_arg_star ')' ; assignment : IDENT ':=' expr ; proc_arg_star : val_star | val_star ';' ref_star ; val_star : /* empty */ | val_plus ; val_plus : expr | val_plus ',' expr ; ref_star : /* empty */ | ref_plus ; ref_plus : ref | ref_plus ',' ref ; ref : IDENT expr : expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | expr '%' expr | '+' expr | '-' expr | '(' expr ')' | func_call | atom ; func_call : IDENT '(' func_arg_star ')' ; func_arg_star : val_star ; atom : IDENT | INTEGER ; \end{verbatim} saclib2.2.8/sysdep/doc/user_guide/saclib.tex0000664002275300236100000001546214017255270020146 0ustar wcbrownscs\documentclass{report} \usepackage{saclib} \usepackage{makeidx} \makeindex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{ \saclib\ 1.1 User's Guide\thanks{ RISC--Linz Report Series Technical Report Number 93-19 (Research Institute for Symbolic Computation, Johannes Kepler University, A-4040 Linz, Austria) } \\\bigskip \small \copyright\ 1993 by Kurt G\"{o}del Institute } \author{ Bruno Buchberger \and George E.\ Collins \and Mark J.\ Encarnaci\'{o}n \and Hoon Hong \and Jeremy R.\ Johnson \and Werner Krandick \and R\"{u}diger Loos \and Ana M. Mandache \and Andreas Neubacher \and Herbert Vielhaber } \date{March 12, 1993} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \vfill \begin{center} \saclib\ \copyright\ 1993 by Kurt G\"{o}del Institute \end{center} \bigskip The \saclib\ system source code and User's Guide are made available free of charge by the Kurt Goedel Institute on behalf of the \saclib\ Group. Persons or institutions receiving it are pledged not to distribute it to others. Instead, individuals wishing to acquire the system should obtain it by ftp directly from the Kurt Goedel Institute, informing the Institute of the acquisition. Thereby the \saclib\ Group will know who has the system and be able to inform all users of any corrections or newer versions. Users are kindly asked to cite their use of the system in any resulting publications or in any application packages built upon \saclib. Neither \saclib\ nor any part thereof may be incorporated in any commercial software product without the consent of the authors. Users developing non-commercial application packages are kindly asked to inform us. Requests or proposals for changes or additions to the system will be welcomed and given consideration. \saclib\ is offered without warranty of any kind, either expressed or implied. However reports of bugs or problems are encouraged. \vfill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{abstract} This paper lists most of the algorithms provided by \saclib\ and shows how to call them from C. There is also a brief explanation of the inner workings of the list processing and garbage collection facilities of \saclib. \end{abstract} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \pagenumbering{roman} \tableofcontents \clearpage \listoffigures \clearpage \pagenumbering{arabic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:I} \input{cI.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{List Processing} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:LP} \input{cLP.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Arithmetic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:A} \section{Introduction} \label{c:A s:I} \input{cAsI.tex} \section{Integer Arithmetic} \label{c:A s:IA} \input{cAsIA.tex} \section{Modular Number Arithmetic} \label{c:A s:MA} \input{cAsMA.tex} \section{Rational Number Arithmetic} \label{c:A s:RA} \input{cAsRA.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Polynomial Arithmetic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:PA} \section{Introduction} \label{c:PA s:I} \input{cPAsI.tex} \section{Polynomial Input and Output} \label{cPAsPIO.tex} \input{cPAsPIO.tex} \section{Domain Independent Polynomial Arithmetic} \label{c:PA s:DIPA} \input{cPAsDIPA.tex} \section{Integral Polynomial Arithmetic} \label{c:PA s:IPA} \input{cPAsIPA.tex} \section{Modular Polynomial Arithmetic} \label{c:PA s:MPA} \input{cPAsMPA.tex} \section{Rational Polynomial Arithmetic} \label{c:PA s:RPA} \input{cPAsRPA.tex} \section{Miscellaneous Representations} \label{c:PA s:MR} \input{cPAsMR.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Linear Algebra} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:LA} \input{cLA.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Polynomial GCD and Resultants} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:GCD} \input{cGCD.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Polynomial Factorization} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:PF} \input{cPF.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Real Root Calculation} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:RRC} \input{cRRC.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Algebraic Number Arithmetic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:AN} \input{cAN.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \appendix \clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Calling \saclib\ Functions from C} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:CFC} \input{cCFC.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{\isac: An Interactive Interface to \saclib} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:ISAC} \input{cISAC.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Notes on the Internal Workings of \saclib} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:NIW} \section{Lists, GCA Handles, and Garbage Collection} \label{c:NIW s:GC} \input{cNIWsGC.tex} \section{Constants and Global Variables} \label{c:NIW s:CGV} \input{cNIWsCGV.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Here we should have an extensive bibliography of Symbolic Algebraic % Computation literature. Any volunteers? % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The index. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \addcontentsline{toc}{chapter}{Index} \printindex \end{document} saclib2.2.8/sysdep/doc/user_guide/cLA.tex0000664002275300236100000001533714017255270017351 0ustar wcbrownscs\section{Mathematical Preliminaries} A {\em matrix} $A$ of {\em order $m \times n$} over a domain $D$ is a rectangular array of elements of $D$ of the form $$A = \left[ \begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & & & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{array} \right]$$ which we will sometimes denote by $A = (a_{ij})$. If $A$ has order $n \times n$ then we say that $A$ is a {\em square} matrix. When appropriate, we will denote a matrix $A$ by $A_{m \times n}$ to indicate that the order of $A$ is $m \times n$. If $A$ is a square matrix then the {\em determinant} of $A$, denoted $\det(A)$, is defined to be $\det(A) = \sum \epsilon(\sigma)a_{\sigma(1),1}\cdots a_{\sigma(n),n}$, the sum being taken over all permutations $\sigma$ of $\{1,\ldots,n\}$ with $\epsilon(\sigma)$ equal to the sign\footnote{If $\sigma$ is the product of $m$ transpositions, then the {\em sign} of $\sigma$ is $\epsilon(\sigma) = (-1)^m$.} of $\sigma$. An {\em m-vector $V$} is a matrix of order $m \times 1$ and will be denoted by $V = (v_i)$. If $A$ is a matrix of order $m \times n$, $b$ is an $m$-vector and $x$ is an $n$-vector then the equation $Ax = b$ can be viewed as representing the system of linear equations $\sum_{j=1}^n a_{ij}x_j = b_i$, $i = 1,\ldots,m$. If a solution to the system $Ax = b$ exists then we say that the system is {\em consistent}. The {\em null space} of a matrix $A_{m \times n}$ is the set of all $n$-vectors $x$ that satisfy $Ax = 0$. A {\em basis} $B$ for the null-space of $A$ is a set of $n$-vectors such that each element of the null-space can be expressed as a linear combination of elements of $B$. \section{Purpose} The \saclib\ linear algebra package provides algorithms for solving systems of linear diophantine equations, for computing null-space bases, for computing determinants and for matrix multiplication. \section{Methods and Algorithms} To solve a system of linear diophantine equations one may use either of the two algorithms {\tt LDSMKB} and {\tt LDSSBR}. Both algorithms take as inputs a matrix $A_{m \times n}$ and an $m$-vector $b$, with $A$ represented column-wise, i.e.\ $A$ is a list of $n$ columns each of which is a list of $m$ integers. Either algorithm returns an $n$-vector $x^*$ and a list $N$ where $x^*$ is a particular solution of the system of linear diophantine equations $Ax = b$ and $N$ is a list of $n$-vectors that form a basis for the null space of $A$. In case the system $Ax = b$ is not consistent, both $x^*$ and $N$ are null lists. {\tt LDSMKB} implements a modification of the Kannan-Bachem algorithm while {\tt LDSSBR} implements an algorithm based on ideas of Rosser. Determinants of matrices over $\BbbZ[x_1,\ldots,x_r]$ may be computed by using either {\tt MAIPDE} or {\tt MAIPDM}. {\tt MAIPDE} implements an algorithm which is based on exact division while {\tt MAIPDM} is based on modular homomorphisms and Chinese remaindering. {\tt MMDDET} computes determinants of matrices over $\BbbZ_p$ while {\tt MMPDMA}, which is based on evaluation homomorphisms and interpolation, computes determinants of matrices over $\BbbZ_p[x_1,\ldots,x_r]$. \section{Functions} \begin{description} \item[Systems of linear equations:] \ \ \begin{description} \item[{\tt LDSMKB(A,b; xs,N) }]\index{LDSMKB} Linear diophantine system solution, modified Kannan and Bachem algorithm. {\em Given an integral matrix $A_{m \times n}$, represented column-wise, and an integral $m$-vector $b$, uses a modification of the Kannan and Bachem algorithm to compute $x^*$ and $N$ where $x^*$ is a particular solution of the system of linear equations $Ax = b$ and $N$ is a list of vectors which form a basis for the solution module of $Ax = 0$. If $Ax = b$ is not consistent then both $x^*$ and $N$ are null lists.} \item[{\tt LDSSBR(A,b; xs,N) }]\index{LDSSBR} Linear diophantine system solution, based on Rosser ideas. {\em Similar to {\rm LDSMKB} but the computations are performed using an algorithm based on ideas of Rosser.} \item[{\tt B <- MMDNSB(p,M) }]\index{MMDNSB} Matrix of modular digits null-space basis. {\em Given a matrix $A_{m \times n}$ over $\BbbZ _p$, represented row-wise, computes a list $B = (B_1,\ldots,b_r)$ of $m$-vectors representing a basis for the null-space of $A$.} \end{description} % systems of linear equations \item[Determinants:] \ \ \begin{description} \item[{\tt D <- MAIPDE(r,M) }]\index{MAIPDE} Matrix of integral polynomials determinant, exact division algorithm. {\em Given a square matrix $A$ over $\BbbZ$ computes $\det(A)$.} \item[{\tt D <- MAIPDM(r,M) }]\index{MAIPDM} Matrix of integral polynomials determinant, modular algorithm. {\em Similar to {\tt MAIPDE} but uses an algorithm based on modular homomorphisms and Chinese remaindering.} \item[{\tt d <- MMDDET(p,M) }]\index{MMDDET} Matrix of modular digits determinant. {\em Given a square matrix $A$ over $\BbbZ _p$, computes $\det(M)$.} \item[{\tt D <- MMPDMA(r,p,M) }]\index{MMPDMA} Matrix of modular polynomials determinant, modular algorithm. {\em Given a matrix $M$ over $\BbbZ _p[x_1,\ldots,x_r]$, computes $\det(M)$ using a method based on evaluation homomorphisms and interpolation.} \end{description} % determinants \item[Matrix arithmetic:] \ \ \begin{description} \item[{\tt C <- MAIPP(r,A,B) }]\index{MAIPP} Matrix of integral polynomials product. \end{description} % matrix arithmetic \item[Vector computations:] \ \ \begin{description} \item[{\tt B <- VIAZ(A,n) }]\index{VIAZ} Vector of integers, adjoin zeros. \item[{\tt C <- VIDIF(A,B) }]\index{VIDIF} Vector of integers difference. \item[{\tt W <- VIERED(U,V,i) }]\index{VIERED} Vector of integers, element reduction. \item[{\tt C <- VILCOM(a,b,A,B) }]\index{VILCOM} Vector of integers linear combination. \item[{\tt B <- VINEG(A) }]\index{VINEG} Vector of integers negation. \item[{\tt C <- VISPR(a,A) }]\index{VISPR} Vector of integers scalar product. \item[{\tt C <- VISUM(A,B) }]\index{VISUM} Vector of integers sum. \item[{\tt VIUT(U,V,i; Up,Vp) }]\index{VIUT} Vector of integers, unimodular transformation. \end{description} % vector computations \item[Miscellaneous functions:] \ \ \begin{description} \item[{\tt B <- MAIPHM(r,m,A) }]\index{MAIPHM} Matrix of integral polynomials homomorphism. \item[{\tt B <- MIAIM(A) }]\index{MIAIM} Matrix of integers, adjoin identity matrix. \item[{\tt B <- MICINS(A,V) }]\index{MICINS} Matrix of integers column insertion. \item[{\tt B <- MICS(A) }]\index{MICS} Matrix of integers column sort. \item[{\tt B <- MINNCT(A) }]\index{MINNCT} Matrix of integers, non-negative column transformation. \item[{\tt B <- MMPEV(r,m,A,k,a) }]\index{MMPEV} Matrix of modular polynomials evaluation. \end{description} % miscellaneous functions \end{description} % functions saclib2.2.8/sysdep/doc/user_guide/sackwic.tex0000664002275300236100000000216514017255270020331 0ustar wcbrownscs\documentclass{article} \usepackage{saclib} \newcommand{\desclabel}[1]{\hspace\labelsep \bf #1} \renewenvironment{description}{ \begin{list}{}{ \labelwidth 0 pt \itemindent-\leftmargin \renewcommand{\makelabel}{\desclabel} \topsep 0 pt \parsep 0 pt \itemsep \parsep } }{\end{list}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{ A KWIC Index to \saclib\ Functions } \author{ Andreas Neubacher\thanks{ With the help of one {\tt csh} script, three {\tt awk} scripts, and one {\tt sed} script. } } \date{March 12, 1993} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{abstract} This paper solely consists of an automatically generated ``KeyWord In Context'' index of all functions provided by \saclib. \end{abstract} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \small \input{KWIC.tex} \normalsize \end{document} saclib2.2.8/sysdep/doc/user_guide/cGCD.tex0000664002275300236100000004557114017255270017455 0ustar wcbrownscs\section{Mathematical Preliminaries} Given polynomials $A$ and $B$ in $R[x_1,\ldots,x_r]$, $R$ a unique factorization domain, a {\em greatest common divisor} (GCD) of $A$ and $B$ is a polynomial $C$ in $R[x_1,\ldots,x_r]$ such that $C$ divides both $A$ and $B$ and such that any other divisor of both $A$ and $B$ also divides $C$. GCDs of more than two polynomials are defined in a similar way. GCDs are not unique since any unit multiple of a GCD is itself a GCD. Polynomials $A$ and $B$ are {\em relatively prime} if $1$ is a GCD of $A$ and $B$. If $A = \sum_{i=0}^m{a_ix_r^i}$ and $B = \sum_{i=0}^n{b_ix_r^i}$, then the {\em Sylvester matrix} of $A$ and $B$ is the $(m+n) \times (m+n)$ square matrix $$ \left( \begin{array}{ccccccccccccc} a_m & a_{m-1} & \cdots & & & & \cdots & a_0 & 0 & \cdots & 0 \\ 0 & a_m & \cdots & & & & \cdots & a_1 & a_0 & \cdots & 0 \\ \vdots & & \ddots & & & & & & & \ddots & \vdots \\ 0 & \cdots & 0 & a_m & \cdots & & & & \cdots & a_1 & a_0 \\ b_n & b_{n-1} & \cdots & & & \cdots & b_0 & 0 & \cdots & \cdots & 0 \\ 0 & b_n & \cdots & & & \cdots & b_1 & b_0 & 0 & \cdots & 0 \\ \vdots & & \ddots & & & & & & \ddots & & \vdots \\ \vdots & & & \ddots & & & & & & \ddots & \vdots \\ 0 & \cdots & \cdots & 0 & b_n & \cdots & & & \cdots & b_1 & b_0 \end{array} \right) $$ in which there are $n$ rows of $A$ coefficients and $m$ rows of $B$ coefficients. The {\em resultant} of two polynomials $A$ and $B$, denoted by ${\rm res}(A,B)$, is the determinant of the Sylvester matrix of $A$ and $B$. The resultant will be an element of $R[x_1,\ldots,x_{r-1}]$ if $A$ and $B$ are elements of $R[x_1,\ldots,x_r]$. From a classic result we know that $A$ and $B$ are relatively prime just in case their resultant is nonzero. Let ${\rm deg}_{x_r}(A) = m$ and ${\rm deg}_{x_r}(B) = n$, with $m \geq n >0$. If $M$ is the Sylvester matrix of $A$ and $B$, then for $0 \leq i \leq j < n$ define $M_{ij}$ to be the matrix obtained by deleting from $M$ the last $j$ rows of the $A$ coefficients, the last $j$ rows of the $B$ coefficients and the last $2j+1$ columns except column $m+n-i-j$. The {\em $j$-th subresultant} of $A$ and $B$ is the polynomial $S_j(x_r) = \sum_{i=0}^{j}{\rm det}(M_{ij})x_r^i$ for $0 \leq j < n$. Note that $S_0$ is simply ${\rm res}(A,B)$. The {\em $k$-th principal subresultant coefficient} of $A$ and $B$ is the coefficient of $x_r^k$ in $S_k$ (which may be 0). $A$ and $B$ are {\em similar}, denoted $A \sim B$, if there exist $a$ and $b$, elements of $R[x_1,\ldots,x_{r-1}]$, such that $aA = bB$. % If $A$ and $B$ are nonzero and ${\rm deg}_{x_r}(A) \geq {\rm deg}_{x_r}(B)$ then a {\em polynomial remainder sequence} (PRS) of $A$ and $B$ is a sequence $A_1, \ldots, A_n$ of nonzero polynomials such that $A_1 = A$, $A_2 = B$, $A_i \sim {\rm prem}(A_{i-2},A_{i-1})$, for $i = 3,\ldots,n$, and ${\rm deg}_{x_r}(A_n) = 0$.\footnote{prem$(F,G)$ denotes the pseudo-remainder of $F$ when pseudo-divided by $G$ with respect to the main variable $x_r$.} Since there are many polynomials similar to a given one, there are many different PRSs $A_1, A_2, \ldots, A_n$ corresponding to $A$ and $B$. The {\em Euclidean} PRS is obtained by setting $A_i = {\rm prem}(A_{i-2},A_{i-1})$ for $i = 3,\ldots,n$. The {\em primitive} PRS is obtained by setting $A_i = {\rm prem}(A_{i-2}, A_{i-1})/g_i$, where $g_i$ is the content of ${\rm prem}(A_{i-2}, A_{i-1})$. In other words, we set $A_i$ to be equal to the primitive part of ${\rm prem}(A_{i-2}, A_{i-1})$. The {\em subresultant} PRS {\em of the first kind} is obtained by setting $A_i = S_{d_{i-1}-1}$ where $d_i$ is the degree of the $i$-th element of any PRS of $A$ and $B$. [For each $i$, $d_i$ is invariant over the set of PRSs of $A$ and $B$.] The {\em subresultant} PRS {\em of the second kind} is obtained by setting $A_i = S_{d_i}$ where $d_i$ is as in the previous definition. The {\em reduced} PRS is obtained by setting $A_i = {\rm prem}(A_{i-2}, A_{i-1}) / c_i^{\delta_i+1}$, where $c_i = {\rm ldcf}(A_{i-2})$ and $\delta_i = {\rm deg}_{x_r}(A_{i-3})-{\rm deg}_{x_r}(A_{i-2})$ for $3 \leq i \leq n$, with $\delta_3 = 0$. Although it is not immediately clear from the definitions, both subresultant PRSs as well as the reduced PRS can be shown to be, in fact, PRSs. For univariate polynomials over a field we may define what is known as the {\em natural} PRS defined by $A_i = A_{i-2} - Q_iA_{i-1}$, ${\rm deg}(A_i) < {\rm deg}(A_{i-1})$, for $i = 3,\ldots,n$. That is, we take $A_i$ to be the remainder obtained from dividing $A_{i-2}$ by $A_{i-1}$. \section{Purpose} The \saclib\ polynomial GCD and resultant package provides algorithms for the calculation of GCDs of $r$-variate polynomials over $R = \BbbZ$ or $R = \BbbZ_p$. Since GCDs are not unique, we will need to specify a canonical form in which to express the results of the computations. Over $R = \BbbZ$, the positive GCD is computed while over $R = \BbbZ_p$ it is the monic GCD that is computed. Henceforth, if we refer to {\em the} GCD of $A$ and $B$ we will mean the GCD defined by the algorithms and this will be denoted by ${\rm gcd}(A,B)$. Algorithms are also available for the computation of resultants of $r$-variate polynomials over $R = \BbbZ$ or $R = \BbbZ_p$. The package also provides algorithms for computing the subresultant PRS and the reduced PRS for $r$-variate polynomials over $R = \BbbZ$ and the subresultant PRS for $r$-variate polynomials over $R = \BbbZ_p$. \section{Definitions of Terms} \begin{description} \item[coarsest squarefree basis]\index{basis!coarsest squarefree}\index{squarefree!basis!coarsest} If $A = (A_1,\ldots,A_n)$ is a list of $r$-variate polynomials, a coarsest squarefree basis for $A$ is a list $B = (B_1,\ldots,B_m)$ of pairwise relatively prime squarefree $r$-variate polynomials such that each $A_i$ in $A$ can be expressed as the product of powers of elements of $B$. \item[discriminant]\index{discriminant} If $A$ is an $r$-variate polynomial of degree $n$ in its main variable, $n \geq 2$, the discriminant of $A$ is the $(r-1)$-variate polynomial equal to the quotient of $(-1)^{n(n-1)/2}{\rm res}(A,A^\prime)$ when divided by $a$, where $A^\prime$ is the derivative of $A$ with respect to its main variable and $a$ is the leading coefficient of $A$. \item[finest squarefree basis]\index{basis!finest squarefree}\index{squarefree!basis!finest} A finest squarefree basis $B = (B_1, \ldots, B_m)$ for a list $A$ of $r$-variate polynomials is a coarsest squarefree basis for $A$ with the additional condition that each $B_i$ is irreducible. \item[cofactors]\index{cofactors} If $C$ is the GCD of two polynomials $A$ and $B$ then the cofactors of $A$ and $B$, respectively, are $A/C$ and $B/C$. \item[content]\index{content} The content of a polynomial $A$ in $r$ variables is a polynomial in $r-1$ variables equal to the absolute value of the greatest common divisor of the coefficients of $A$. \item[greatest squarefree divisor]\index{squarefree!divisor, greatest} A greatest squarefree divisor of a polynomial $A$ is a squarefree polynomial $C$ that divides $A$ and is such that any other squarefree polynomial that divides $A$ also divides $C$. \item[primitive part]\index{primitive part} The primitive part of a polynomial $A$ is the absolute value of $A/c$ where $c$ is the content of $A$. \item[primitive polynomial]\index{primitive polynomial}\index{polynomial!primitive} A polynomial, the content of which is $1$. \item[squarefree factorization]\index{factorization!squarefree}\index{squarefree!factorization} The squarefree factorization of $A$ is $A = A_1^{e_1}\cdots A_k^{e_k}$ where $1 \leq e_1 < \cdots < e_k$ and each of the $A_i$ is a positive squarefree polynomial of positive degree. Note that if $A$ is squarefree then $A^1$ is the squarefree factorization of $A$. \item[squarefree polynomial]\index{polynomial!squarefree}\index{squarefree!polynomial} A polynomial $A$ is squarefree if each factor occurs only once. In other words, if $A = A_1^{e_1}\cdots A_k^{e_k}$ is a complete factorization of $A$ then each of the $e_i$ is equal to $1$. \item[univariate content]\index{univariate content}\index{content!univariate} If $A$ is an $r$-variate polynomial, $r \geq 2$, then the univariate content of $A$ is a univariate polynomial in the most minor variable equal to the GCD of the coefficients of $A$, where $A$ is considered as an element of $(R[x_1])[x_2,\ldots,x_r]$. \item[univariate primitive part]\index{univariate primitive part}\index{primitive part!univariate} Given an $r$-variate polynomial $A$, $r \geq 2$, the univariate primitive part of $A$ is the $r$-variate polynomial $A/a$, where $a$ is the univariate content of $A$. \end{description} \section{Methods and Algorithms} In this section we briefly discuss the main algorithms that might be of interest to the user and give a sketch of the mathematical ideas behind these algorithms. \subsection{GCD Computations} To compute the GCD of two univariate polynomials over $R =\BbbZ_p$, the algorithm {\tt MUPGCD} may be used. Making use of the fact that if $A_1,\ldots,A_n$ is a PRS of two polynomials $A$ and $B$ then ${\rm gcd}(A,B) \sim A_n$, this algorithm simply computes the natural PRS of the two input polynomials and returns the monic GCD. The GCD and cofactors of two $r$-variate polynomials over $\BbbZ_p$ are computed by {\tt MPGCDC} which employs evaluation homomorphisms and interpolation to reduce the problem to that of computing the GCDs of $(r-1)$-variate polynomials over $R = \BbbZ_p$. {\tt MPGCDC} proceeds recursively until it arrives at univariate polynomials whereupon {\tt MUPGCD} is called. The GCD computed is monic. To obtain the GCD of two $r$-variate integral polynomials $A$ and $B$ one would use the algorithm {\tt IPGCDC} which also computes the cofactors of $A$ and $B$. In this algorithm modular homomorphisms and Chinese remaindering are used to reduce the problem to GCD computations of $r$-variate polynomials over $R = \BbbZ_p$, which is solved by {\tt MPGCDC}. \subsection{Resultants} Using the algorithm suggested by the definition of the resultant, namely to construct the Sylvester matrix and compute its determinant, is not the most efficient way to proceed. Instead, {\tt MUPRES} computes the resultant of two univariate polynomials $A$ and $B$ over $R= \BbbZ_p$ by computing the natural PRS of $A$ and $B$ and by using the identity % $${\rm res}(A,B) = (-1)^\nu \left[ \prod_{i=2}^{n-1}c_i^{d_{i-1}-d_{i+1}}\right]c_n^{d_{n-1}}$$ % where $c_i = {\rm ldcf}(A_i)$, $d_i = {\rm deg}(A_i)$, $\nu = \sum_{i=1}^{k-2}d_id_{i+1}$ and $A_1,\ldots,A_n$ is the natural PRS. For calculating the resultant of $r$-variate polynomials over $R = \BbbZ_p$, {\tt MPRES} makes use of evaluation homomorphisms and interpolation to recursively reduce the problem to the calculation of resultants of univariate polynomials over $R = \BbbZ_p$ which can be done by {\tt MUPRES}. {\tt IPRES} computes the resultant of $r$-variate polynomials over $R = \BbbZ$ by applying modular homomorphisms and Chinese remaindering to simplify the problem to resultant computations over $R = \BbbZ_p$, computations which are performed by {\tt MPRES}. \section{Functions} \begin{description} \item[Integral polynomial GCDs:] \ \ \begin{description} \item[{\tt C <- IPC(r,A) }]\index{IPC} Integral polynomial content. {\em Given an $r$-variate polynomial $A$ over $R = \BbbZ$, computes the $(r-1)$-variate polynomial equal to the content of $A$.} \item[{\tt IPCPP(r,A; C,Ab) }]\index{IPCPP} Integral polynomial content and primitive part. {\em Computes the content and the primitive part of a given polynomial over $R = \BbbZ$.} \item[{\tt IPGCDC(r,A,B; C,Ab,Bb) }]\index{IPGCDC} Integral polynomial greatest common divisor and cofactors. {\em Given two $r$-variate polynomials $A$ and $B$ over $R = \BbbZ$, computes the GCD and the cofactors of $A$ and $B$.} \item[{\tt IPLCPP(r,A; C,P) }]\index{IPLCPP} Integral polynomial list of contents and primitive parts. {\em Given a list $(A_1,\ldots,A_n)$ of $r$-variate polynomials over $R = \BbbZ$, computes two lists, one consisting of the contents of the $A_i$ that have positive degree in at least one variable and another consisting of the primitive parts of the $A_i$ that that have positive degree in the main variable.} \item[{\tt Ab <- IPPP(r,A) }]\index{IPPP} Integral polynomial primitive part. {\em Given a polynomial $A$ over $R = \BbbZ$, computes the primitive part of $A$.} \item[{\tt IPSCPP(r,A; s,C,Ab) }]\index{IPSCPP} Integral polynomial sign, content, and primitive part. {\em Computes the sign, the content and the primitive part of a given polynomial over $R = \BbbZ$.} \end{description} \item[Modular Polynomial GCDs:] \ \ \begin{description} \item[{\tt MPGCDC(r,p,A,B; C,Ab,Bb) }]\index{MPGCDC} Modular polynomial greatest common divisor and cofactors. {\em Computes the GCD and cofactors of two given polynomials over $R = \BbbZ_p$.} \item[{\tt c <- MPUC(r,p,A) }]\index{MPUC} Modular polynomial univariate content. {\em Computes the univariate content of an $r$-variate polynomial, $r \geq 2$, over $R = \BbbZ_p$.} \item[{\tt MPUCPP(r,p,A; a,Ab) }]\index{MPUCPP} Modular polynomial univariate content and primitive part. {\em Giver an $r$-variate polynomial $A$, $r \geq 2$, computes the univariate content $a$ of $A$ and the univariate primitive part $A/a$.} \item[{\tt d <- MPUCS(r,p,A,c) }]\index{MPUCS} Modular polynomial univariate content subroutine. \item[{\tt Ab <- MPUPP(r,p,A) }]\index{MPUPP} Modular polynomial univariate primitive part. {Given $A$, an $r$-variate polynomial over $R = \BbbZ_p$, $r \geq 2$, computes the univariate primitive part of $A$.} \item[{\tt C <- MUPGCD(p,A,B) }]\index{MUPGCD} Modular univariate polynomial greatest common divisor. {\em Computes the GCD of two given univariate polynomials over $R = \BbbZ_p$.} \item[{\tt L <- MUPSFF(p,A) }]\index{MUPSFF} Modular univariate polynomial squarefree factorization. {\em Computes the squarefree factorization of a given univariate polynomial over $R = \BbbZ_p$.} \end{description} \item[Squarefree basis:] \ \ \begin{description} \item[{\tt B <- IPCSFB(r,A) }]\index{IPCSFB} Integral polynomial coarsest squarefree basis. {\em Given a list $A$ of positive and primitive $r$-variate polynomials over $R = \BbbZ$, each of which is of positive degree in the main variable, computes a coarsest squarefree basis for $A$.} \item[{\tt B <- IPFSFB(r,A) }]\index{IPFSFB} Integral polynomial finest squarefree basis. {\em Given a list $A$ of positive and primitive $r$-variate polynomials over $R = \BbbZ$, each of which is of positive degree in the main variable, computes a finest squarefree basis for $A$.} \item[{\tt B <- IPPGSD(r,A) }]\index{IPPGSD} Integral polynomial primitive greatest squarefree divisor. {\em Given a polynomial $A$ over $R = \BbbZ$, computes the positive and primitive greatest squarefree divisor of the primitive part of $A$.} \item[{\tt L <- IPSF(r,A) }]\index{IPSF} Integral polynomial squarefree factorization. {\em Given a primitive polynomial $A$, of positive degree in the main variable, computes the squarefree factorization of $A$.} \item[{\tt Bs <- IPSFBA(r,A,B) }]\index{IPSFBA} Integral polynomial squarefree basis augmentation. \item[{\tt B <- ISPSFB(r,A) }]\index{ISPSFB} Integral squarefree polynomial squarefree basis. \end{description} \item[Resultants:] \ \ \begin{description} \item[{\tt B <- IPDSCR(r,A) }]\index{IPDSCR} Integral polynomial discriminant. {\em Computes the discriminant of an $r$-variate polynomial over $R = \BbbZ$, the degree of which is greater than or equal to $2$ in its main variable.} \item[{\tt P <- IPPSC(r,A,B) }]\index{IPPSC} Integral polynomial principal subresultant coefficients. {\em Computes a list of the non-zero principal subresultant coefficients of two given $r$-variate polynomials over $R = \BbbZ$ each of which is of positive degree in the main variable.} \item[{\tt C <- IPRES(r,A,B) }]\index{IPRES} Integral polynomial resultant. {\em Given two $r$-variate polynomials over $R = \BbbZ$, each of which is of positive degree in the main variable, computes the $(r-1)$-variate polynomial over $R = \BbbZ$ equal to their resultant.} \item[{\tt IUPRC(A,B; C,R) }]\index{IUPRC} Integral univariate polynomial resultant and cofactor. {\em Given two univariate polynomials $A$ and $B$ over $R = \BbbZ$, where both $A$ and $B$ are of positive degree, computes ${\rm res}(A,B)$ and the univariate polynomial $C$ over $R = \BbbZ$ such that for some $D$, $AD + BC = {\rm res}(A,B)$ and ${\rm deg}(C) < {\rm deg}(A)$.} \item[{\tt C <- MPRES(r,p,A,B) }]\index{MPRES} Modular polynomial resultant. {\em Given two $r$-variate polynomials over $R = \BbbZ_p$, each of which is of positive degree in the main variable, computes the $(r-1)$-variate polynomial over $R = \BbbZ_p$ equal to their resultant.} \item[{\tt MUPRC(p,A,B; C,r) }]\index{MUPRC} Modular univariate polynomial resultant and cofactor. {\em Given two univariate polynomials $A$ and $B$ over $R = \BbbZ_p$, where both $A$ and $B$ are of positive degree, computes ${\rm res}(A,B)$ and the univariate polynomial $C$ over $R = \BbbZ_p$ such that for some $D$, $AD + BC = {\rm res}(A,B)$ and ${\rm deg}(C) < {\rm deg}(A)$.} \item[{\tt c <- MUPRES(p,A,B) }]\index{MUPRES} Modular univariate polynomial resultant. {\em Computes the resultant of two given univariate polynomials over $R = \BbbZ_p$, each of which is of positive degree in the main variable.} \end{description} \item[Polynomial Remainder Sequences:] \ \ \begin{description} \item[{\tt S <- IPRPRS(r,A,B) }]\index{IPRPRS} Integral polynomial reduced polynomial remainder sequence. {\em Computes a list representing the reduced polynomial remainder sequence of two given nonzero $r$-variate polynomials over $R = \BbbZ$.} \item[{\tt S <- IPSPRS(r,A,B) }]\index{IPSPRS} Integral polynomial subresultant polynomial remainder sequence. {\em Computes a list representing the subresultant polynomial remainder sequence of the first kind of two given nonzero $r$-variate polynomials over $R = \BbbZ$.} \item[{\tt S <- MPSPRS(r,p,A,B) }]\index{MPSPRS} Modular polynomial subresultant polynomial remainder sequence.{\em Computes a list representing the subresultant polynomial remainder sequence of the first kind of two given nonzero $r$-variate polynomials over $R = \BbbZ_p$.} \end{description} \item[Extended GCDs:] \ \ \begin{description} \item[{\tt MUPEGC(p,A,B; C,U,V) }]\index{MUPEGC} Modular univariate polynomial extended greatest common divisor. {\em Computes the GCD $C$ of two univariate polynomials $A$ and $B$ over $R = \BbbZ_p$ as well the univariate polynomials $U$ and $V$ such that $AU+BV=C$.} \item[{\tt MUPHEG(p,A,B; C,V) }]\index{MUPHEG} Modular univariate polynomial half-extended greatest common divisor.{\em Computes the GCD $C$ of two univariate polynomials $A$ and $B$ over $R = \BbbZ_p$ as well the univariate polynomial $V$ such that $AU+BV=C$ for some $U$.} \end{description} \end{description} % programs saclib2.2.8/sysdep/doc/user_guide/cPAsMR.tex0000664002275300236100000000502414017255270017767 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Sparse Distributive Representation} \begin{description} \item[Conversion\footnotemark :] \ \ \footnotetext{ See Section \ref{c:PA s:I} for a description of the sparse recursive representation. } \begin{description} \item[{\tt B <- DIPFP(r,A) }]\index{DIPFP} Distributive polynomial from polynomial. {\em Computes a polynomial in sparse distributive representation from a polynomial in the sparse recursive representation.} \item[{\tt B <- PFDIP(r,A) }]\index{PFDIP} Polynomial from distributive polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the sparse distributive representation.} \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt A <- DIIPREAD(V) }]\index{DIIPREAD} Distributive integral polynomial read. \item[{\tt DIIPWRITE(r,A,V) }]\index{DIIPWRITE} Distributive integral polynomial write. \item[{\tt A <- DIRPREAD(V) }]\index{DIRPREAD} Distributive rational polynomial read. \item[{\tt DIRPWRITE(r,A,V) }]\index{DIRPWRITE} Distributive rational polynomial write. \end{description} \item[Miscellaneous:] \ \ \begin{description} \item[{\tt n <- DIPDEG(r,A) }]\index{DIPDEG} Distributive polynomial degree. \item[{\tt DIPINS(a,d,A; t,B) }]\index{DIPINS} Distributive polynomial, insert term. \end{description} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Dense Recursive Representation} \begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- DMPPRD(r,m,A,B) }]\index{DMPPRD} Dense modular polynomial product. \item[{\tt C <- DMPSUM(r,m,A,B) }]\index{DMPSUM} Dense modular polynomial sum. \item[{\tt C <- DMUPNR(p,A,B) }]\index{DMUPNR} Dense modular univariate polynomial natural remainder. \end{description} \item[Conversion\footnotemark :] \ \ \footnotetext{ See Section \ref{c:PA s:I} for a description of the sparse recursive representation. } \begin{description} \item[{\tt B <- DPFP(r,A) }]\index{DPFP} Dense polynomial from polynomial. {\em Computes a polynomial in dense recursive representation from a polynomial in the sparse recursive representation.} \item[{\tt B <- PFDP(r,A) }]\index{PFDP} Polynomial from dense polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the dense recursive representation.} \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cPAsMPA.tex0000664002275300236100000001045214017255270020067 0ustar wcbrownscsNote that the functions whose names begin with MI are based upon modular integer arithmetic, while those beginning with MP and MUP are based upon modular digit arithmetic with a prime modulus\footnote{ See Section \ref{c:A s:MA} for details on modular digit and integer arithmetic. }. \begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- MIPSUM(r,M,A,B) }]\index{MIPSUM} Modular integral polynomial sum. \item[{\tt C <- MPSUM(r,m,A,B) }]\index{MPSUM} Modular polynomial sum. \item[{\tt C <- MIPDIF(r,M,A,B) }]\index{MIPDIF} Modular integral polynomial difference. \item[{\tt C <- MPDIF(r,m,A,B) }]\index{MPDIF} Modular polynomial difference. \item[{\tt B <- MIPNEG(r,M,A) }]\index{MIPNEG} Modular integral polynomial negation. \item[{\tt B <- MPNEG(r,m,A) }]\index{MPNEG} Modular polynomial negative. \item[{\tt C <- MIPPR(r,M,A,B) }]\index{MIPPR} Modular integral polynomial product. \item[{\tt C <- MPPROD(r,m,A,B) }]\index{MPPROD} Modular polynomial product. \item[{\tt B <- MPUP(r,m,c,A) }]\index{MPUP} Modular polynomial univariate product. \item[{\tt C <- MPMDP(r,p,a,B) }]\index{MPMDP} Modular polynomial modular digit product. \item[{\tt C <- MIPIPR(r,M,D,A,B) }]\index{MIPIPR} Modular integral polynomial mod ideal product. \item[{\tt MIUPQR(M,A,B; Q,R) }]\index{MIUPQR} Modular integral univariate polynomial quotient and remainder. \item[{\tt MPQR(r,p,A,B; Q,R) }]\index{MPQR} Modular polynomial quotient and remainder. \item[{\tt C <- MPQ(r,p,A,B) }]\index{MPQ} Modular polynomial quotient. \item[{\tt C <- MPUQ(r,p,A,b) }]\index{MPUQ} Modular polynomial univariate quotient. \item[{\tt C <- MPPSR(r,p,A,B) }]\index{MPPSR} Modular polynomial pseudo-remainder. \item[{\tt MMPIQR(r,M,D,A,B; Q,R) }]\index{MMPIQR} Modular monic polynomial mod ideal quotient and remainder. \item[{\tt B <- MPEXP(r,m,A,n) }]\index{MPEXP} Modular polynomial exponentiation. \end{description} \item[Differentiation and Integration:] \ \ \begin{description} \item[{\tt B <- MUPDER(m,A) }]\index{MUPDER} Modular univariate polynomial derivative. \end{description} \item[Contents and Primitive Parts:] \ \ \begin{description} \item[{\tt MPUCPP(r,p,A; a,Ab) }]\index{MPUCPP} Modular polynomial univariate content and primitive part. \item[{\tt c <- MPUC(r,p,A) }]\index{MPUC} Modular polynomial univariate content. \item[{\tt Ab <- MPUPP(r,p,A) }]\index{MPUPP} Modular polynomial univariate primitive part. \item[{\tt d <- MPUCS(r,p,A,c) }]\index{MPUCS} Modular polynomial univariate content subroutine. \end{description} \item[Evaluation:] \ \ \begin{description} \item[{\tt B <- MPEMV(r,m,A,a) }]\index{MPEMV} Modular polynomial evaluation of main variable. \item[{\tt B <- MPEVAL(r,m,A,i,a) }]\index{MPEVAL} Modular polynomial evaluation. \end{description} \item[Transformation:] \ \ \begin{description} \item[{\tt Ap <- MPMON(r,p,A) }]\index{MPMON} Modular polynomial monic. {\em Computes the monic polynomial similar to a given modular polynomial.} \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt As <- MPINT(p,B,b,bp,r,A,A1) }]\index{MPINT} Modular polynomial interpolation. \item[{\tt B <- MIPHOM(r,M,A) }]\index{MIPHOM} Modular integral polynomial homomorphism. {\em Computes the homomorphism from $\BbbZ[x_1,\ldots,x_r]$ to $\BbbZ_m[x_1,\ldots,x_r]$.} \item[{\tt B <- MPHOM(r,m,A) }]\index{MPHOM} Modular polynomial homomorphism. \end{description} \item[Squarefree Factorization:] \ \ \begin{description} \item[{\tt L <- MUPSFF(p,A) }]\index{MUPSFF} Modular univariate polynomial squarefree factorization. \end{description} \item[Random Polynomial Generation:] \ \ \begin{description} \item[{\tt A <- MIPRAN(r,M,q,N) }]\index{MIPRAN} Modular integral polynomial, random. \item[{\tt A <- MPRAN(r,m,q,N) }]\index{MPRAN} Modular polynomial, random. \item[{\tt A <- MUPRAN(p,n) }]\index{MUPRAN} Modular univariate polynomial, random. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt B <- MIPFSM(r,M,A) }]\index{MIPFSM} Modular integral polynomial from symmetric modular. \item[{\tt B <- SMFMIP(r,M,A) }]\index{SMFMIP} Symmetric modular from modular integral polynomial. \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cAsIA.tex0000664002275300236100000001710114017255270017621 0ustar wcbrownscs\begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt C <- ISUM(A,B) }]\index{ISUM} Integer sum. \item[{\tt C <- IDIF(A,B) }]\index{IDIF} Integer difference. \item[{\tt B <- INEG(A) }]\index{INEG} Integer negation. \item[{\tt C <- IPROD(A,B) }]\index{IPROD} Integer product. \item[{\tt C <- IDPR(A,b) }]\index{IDPR} Integer-digit product. \item[{\tt DPR(a,b; c,d) }]\index{DPR} Digit Product. \item[{\tt C <- IPRODK(A,B) }]\index{IPRODK} Integer product, Karatsuba algorithm. \item[{\tt C <- IQ(A,B) }]\index{IQ} Integer quotient. \item[{\tt C <- IDQ(A,b) }]\index{IDQ} Integer-digit quotient. \item[{\tt IQR(A,B; Q,R) }]\index{IQR} Integer quotient and remainder. \item[{\tt IDQR(A,b; Q,r) }]\index{IDQR} Integer-digit quotient and remainder. \item[{\tt DQR(a1,a0,b; q,r) }]\index{DQR} Digit quotient and remainder. \item[{\tt C <- IREM(A,B) }]\index{IREM} Integer remainder. \item[{\tt r <- IDREM(A,b) }]\index{IDREM} Integer-digit remainder. \item[{\tt c <- IMAX(a,b) }]\index{IMAX} Integer maximum. {\em Returns the greater of two integers.} \item[{\tt c <- IMIN(a,b) }]\index{IMIN} Integer minimum. {\em Returns the smaller of two integers.} \item[{\tt s <- ISIGNF(A) }]\index{ISIGNF} Integer sign function. \item[{\tt B <- IABSF(A) }]\index{IABSF} Integer absolute value function. \item[{\tt s <- ICOMP(A,B) }]\index{ICOMP} Integer comparison. {\em Compares two integers and returns $-1, 0,$ and $+1$ in case of $<, =,$ and $>$, respectively.} \item[{\tt t <- IEVEN(A) }]\index{IEVEN} Integer even. {\em Tests whether the argument is even.} \item[{\tt t <- IODD(A) }]\index{IODD} Integer odd. {\em Tests whether the argument is odd.} \end{description} \item[Exponentiation:] \ \ \begin{description} \item[{\tt B <- IEXP(A,n) }]\index{IEXP} Integer exponentiation. \item[{\tt IROOT(A,n; B,t) }]\index{IROOT} Integer root. \item[{\tt ISQRT(A; B,t) }]\index{ISQRT} Integer square root. \item[{\tt DSQRTF(a; b,t) }]\index{DSQRTF} Digit square root function. \item[{\tt IPOWER(A,L; B,n) }]\index{IPOWER} Integer power. {\em If the argument can be expressed as $b^n$, such integers $b$ and $n$ are computed.} \end{description} \item[Greatest Common Divisor:] \ \ \begin{description} \item[{\tt C <- IGCD(A,B) }]\index{IGCD} Integer greatest common divisor. \item[{\tt c <- DGCD(a,b) }]\index{DGCD} Digit greatest common divisor. \item[{\tt IGCDCF(A,B; C,Ab,Bb) }]\index{IGCDCF} Integer greatest common divisor and cofactors. \item[{\tt IEGCD(a,b; c,u1,v1) }]\index{IEGCD} Integer extended greatest common divisor algorithm. \item[{\tt DEGCD(a,b; c,u,v) }]\index{DEGCD} Digit extended greatest common divisor. \item[{\tt IDEGCD(a,b; c,u1,v1,u2,v2) }]\index{IDEGCD} Integer doubly extended greatest common divisor algorithm. \item[{\tt IHEGCD(A,B; C,V) }]\index{IHEGCD} Integer half-extended greatest common divisor. \item[{\tt C <- ILCM(A,B) }]\index{ILCM} Integer least common multiple. \end{description} \item[Factorization:] \ \ \begin{description} \item[{\tt F <- IFACT(n) }]\index{IFACT} Integer factorization. \item[{\tt s <- ISPT(m,mp,F) }]\index{ISPT} Integer selfridge primality test. {\em Returns 1 if the argument is prime, -1 if it is not prime, and 0 if the primality could not be determined.} \item[{\tt ILPDS(n,a,b; p,np) }]\index{ILPDS} Integer large prime divisor search. \item[{\tt IMPDS(n,a,b; p,q) }]\index{IMPDS} Integer medium prime divisor search. \item[{\tt ISPD(n; F,m) }]\index{ISPD} Integer small prime divisors. \end{description} \item[Prime Number Generation:] \ \ \begin{description} \item[{\tt L <- DPGEN(m,k) }]\index{DPGEN} Digit prime generator. \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt A <- IRAND(n) }]\index{IRAND} Integer, random. \item[{\tt a <- DRAN() }]\index{DRAN} Digit, random. \item[{\tt a <- DRANN() }]\index{DRANN} Digit, random non-negative. \end{description} \item[Combinatorial:] \ \ \begin{description} \item[{\tt A <- IFACTL(n) }]\index{IFACTL} Integer factorial. \item[{\tt A <- IBCOEF(n,k) }]\index{IBCOEF} Integer binomial coefficient. {\em Returns $\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{k}$}\right)$.} \item[{\tt B <- IBCIND(A,n,k) }]\index{IBCIND} Integer binomial coefficient induction. {\em Returns $\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{k+1}$}\right)$ given $n$, $k$, and $\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{k}$}\right)$.} \item[{\tt A <- IBCPS(n,k) }]\index{IBCPS} Integer binomial coefficient partial sum. {\em Returns $\sum_{i=0}^k\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{i}$}\right)$.} \end{description} \item[Binary Arithmetic:] \ \ \begin{description} \item[{\tt n <- ILOG2(A) }]\index{ILOG2} Integer logarithm, base 2. {\em Returns 1 + (the floor of the base 2 logarithm of the argument).} \item[{\tt n <- DLOG2(a) }]\index{DLOG2} Digit logarithm, base 2. \item[{\tt IFCL2(a; m,n) }]\index{IFCL2} Integer, floor and ceiling, logarithm, base 2. {\em Returns the floor and the ceiling of the base 2 logarithm of the argument.} \item[{\tt B <- IMP2(A,h) }]\index{IMP2} Integer multiplication by power of 2. {\em Multiplies the argument by a non-negative power of 2.} \item[{\tt B <- IDP2(A,k) }]\index{IDP2} Integer division by power of 2. {\em Divides the argument by a non-negative power of 2.} \item[{\tt B <- ITRUNC(A,n) }]\index{ITRUNC} Integer truncation. {\em Divides the argument by a positive or negative power of 2.} \item[{\tt n <- IORD2(a) }]\index{IORD2} Integer, order of 2. {\em Returns the largest $n$ such that $2^n$ divides the argument.} \end{description} \item[Boolean:] \ \ \begin{description} \item[{\tt c <- DAND(a,b) }]\index{DAND} Digit and. {\em Returns the bit-wise $\wedge$ of two digits.} \item[{\tt c <- DOR(a,b) }]\index{DOR} Digit or. {\em Returns the bit-wise $\vee$ of two digits.} \item[{\tt b <- DNOT(a) }]\index{DNOT} Digit not. {\em Returns the bit-wise $\neg$ of a digit.} \item[{\tt c <- DNIMP(a,b) }]\index{DNIMP} Digit non-implication. {\em Returns the bit-wise $\neg(a \Rightarrow b)$ of digits $a$ and $b$.} \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt A <- IREAD() }]\index{IREAD} Integer read. \item[{\tt IWRITE(A) }]\index{IWRITE} Integer write. \item[{\tt ILWRITE(L) }]\index{ILWRITE} Integer list write. {\em Writes a list of integers in the form \\$(n_1,n_2,\ldots,n_k)$ to the output stream.} \end{description} \item[Auxiliary Functions:] \ \ \begin{description} \item[{\tt C <- ISSUM(n,L) }]\index{ISSUM} Integer shifted sum. {\em Computes $\sum_{i=0}^k C_i \BETA^{in}$ given $n$ and the $C_i$.} \item[{\tt ISEG(A,n; A1,A0) }]\index{ISEG} Integer segmentation. {\em Splits an integer at a \BETA-digit boundary.} \item[{\tt C <- IDIPR2(A,B,a,b) }]\index{IDIPR2} Integer digit inner product, length 2. {\em Computes $Aa + Bb$ for integers $A, B$ and \BETA-digits $a, b$.} \item[{\tt C <- ILCOMB(A,B,u,v) }]\index{ILCOMB} Integer linear combination. {\em Computes $Aa + Bb$ for integers $A, B$ and \BETA-digits $a, b$ with $Aa + Bb \geq 0$.} \item[{\tt DPCC(a1,a2; u,up,v,vp) }]\index{DPCC} Digit partial cosequence calculation. \item[{\tt AADV(L; a,Lp) }]\index{AADV} Arithmetic advance. {\em Returns the first element and the reductum of a non-empty list, returns 0 as the first element if the list is empty.} \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/template.tex0000664002275300236100000000151014017255270020511 0ustar wcbrownscs\documentstyle[saclib]{report} \begin{document} \chapter{Foo} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Mathematical Preliminaries} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Purpose} The \saclib\ Foo package ... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Methods and Algorithms} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Definitions of Terms} \begin{description} \item[foofoo]\index{foofoo} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Functions} \begin{description} \item[Boo] \ \ \begin{description} \item[{\tt FUBAR}]\index{FUBAR} \end{description} \end{description} \end{document} saclib2.2.8/sysdep/doc/user_guide/cPAsRPA.tex0000664002275300236100000000362114017255270020074 0ustar wcbrownscs\begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- RPSUM(r,A,B) }]\index{RPSUM} Rational polynomial sum. \item[{\tt C <- RPDIF(r,A,B) }]\index{RPDIF} Rational polynomial difference. \item[{\tt B <- RPNEG(r,A) }]\index{RPNEG} Rational polynomial negative. \item[{\tt C <- RPPROD(r,A,B) }]\index{RPPROD} Rational polynomial product. \item[{\tt C <- RPRNP(r,a,B) }]\index{RPRNP} Rational polynomial rational number product. \item[{\tt RPQR(r,A,B; Q,R) }]\index{RPQR} Rational polynomial quotient and remainder. \end{description} \item[Differentiation and Integration:] \ \ \begin{description} \item[{\tt B <- RPDMV(r,A) }]\index{RPDMV} Rational polynomial derivative, main variable. \item[{\tt B <- RPIMV(r,A) }]\index{RPIMV} Rational polynomial integration, main variable. \end{description} \item[Evaluation:] \ \ \begin{description} \item[{\tt C <- RPEMV(r,A,b) }]\index{RPEMV} Rational polynomial evaluation, main variable. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt B <- RPFIP(r,A) }]\index{RPFIP} Rational polynomial from integral polynomial. \item[{\tt B <- RPMAIP(r,A) }]\index{RPMAIP} Rational polynomial monic associate of integral polynomial. \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt RPREAD(; r,A) }]\index{RPREAD} Rational polynomial read. \item[{\tt RPEXPREAD(r,V; A,t) }]\index{RPEXPREAD} Rational polynomial expression read. \item[{\tt RPWRITE(r,A,V) }]\index{RPWRITE} Rational polynomial write. \item[{\tt RPDWRITE(r,A,V) }]\index{RPDWRITE} Rational Polynomial Distributive Write. \end{description} \item[Normalization:] \ \ \begin{description} \item[{\tt RPBLGS(r,A; a,b,s) }]\index{RPBLGS} Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cI.tex0000664002275300236100000001632514017255270017243 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{What is \saclib?} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:I s:W} \saclib\ is a library of C programs for computer algebra derived from the SAC2 system. Hoon Hong was the main instigator. Sometime early in 1990 he proposed to translate SAC2 (which was written in the ALDES language) into C instead of Fortran (as it had been since 1976), and he quickly wrote the required translator. The results were rewarding in several ways. Hoon Hong, myself and Jeremy Johnson, working together at Ohio State University, observed a speedup by a factor of about two in most applications and the powerful debugging facilities associated with C became available. Later that year Hoon finished his doctorate and moved to RISC, where Bruno Buchberger was writing a book on Gr\"{o}bner bases and working on a set of programs to go with it. He found that SAC2 was the only computer algebra system in which he could write these programs without an unacceptable sacrifice in computational efficiency. It became apparent that for similar reasons other researchers would benefit greatly from the availability of a library of C programs derived from SAC2. Subsequently Bruno did much to promote and facilitate the preparation of the library for distribution. Although the translated programs were correct, they needed to be reformatted for user consumption, a users guide was required, and we had compulsions to make some minor improvements. Jeremy Johnson made many recent improvements to the algebraic number algorithms and wrote the corresponding chapter of this Guide, among other things. Werner Krandick made improvements to the polynomial real root algorithms and wrote the corresponding chapter. Mark Encarnaci\'{o}n wrote three chapters of the Guide and also converted the polynomial input and output algorithms to modern notation from the original "Fortran notation". Ana Mandache, Andreas Neubacher and Hoon Hong all toiled long hours editing and reformatting programs. Andreas deserves special recognition. He initiated the writing of the manual, wrote three chapters of the manual and two of the appendices, and did all the required system maintenance. To facilitate experimenting with the functions in the library, Herbert Vielhaber implemented \isac, the interactive shell for \saclib. He also wrote the corresponding appendix of the manual. Besides the above it would be unthinkable not to mention, collectively, all of my former doctoral students, who contributed to the development of the SAC2 algorithms and the research on which they were founded over a period of 26 years. During the last 20 of those years R\"{u}diger Loos was a frequent collaborator. He proposed creation of an "ALgorithm DEScription language" for SAC1, the predecessor of SAC2, and wrote an ALDES-to-Fortran translator. This initial version of SACLIB is just the beginning of what is to come. We know how to improve several of the programs in the current system and we will do it for subsequent versions. Some basic functionalities are largely undeveloped in the currrent system (e.g. linear algebra) but they will be supplied in subsequent versions. Some more advanced functionalities (e.g. polynomial complex roots and quantifier elimination) are nearly ready and will be forthcoming soon. Also we expect that users of the system will write programs based on the ones we distribute and offer them to other users. \begin{flushright} George E.\ Collins \end{flushright} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{About this Guide} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:I s:A} The main goal in writing this guide was to enable the reader to quickly discover whether \saclib\ provides a function for a given problem. The structure of the paper should facilitate searching for a function in the following way: \begin{itemize} \item Every chapter deals with functions operating over a certain domain (lists, numbers, polynomials, etc.) or with functions solving certain problems (GCD computation, factorization, real root calculation, etc.). \item Some chapters are split into sections covering more specific topics (integer arithmetic, rational number arithmetic, integral polynomial arithmetic, etc.) \item Inside a section, functions are divided into various areas (basic arithmetic, predicates, input/output, etc.). \item Inside these areas, closely related functions (a function and its inverse, functions solving essentially the same problem, a function and its auxiliary routines, etc.) are grouped. \end{itemize} This partitioning was done on a completely subjective basis. The intention always was that the neophyte user should be able to pinpoint a desired function by using simple heuristics. This approach may certainly fail in some cases, but with at most 50 functions per section browsing them sequentially should always succeed in an acceptable amount of time. Another rather subjectively designed feature is the function descriptions. The lists were generated automatically from the headers of the \saclib\ source files. For some functions additional remarks were added in {\em emphasized} type style. Readers who want to use \saclib\ functions in their C programs should read Appendix \ref{c:CFC}, which describes how initialization and cleanup are done, which files have to be {\tt \#include}d, etc. A detailed description of the input/output specifications of a given function can be found in the comment block at the beginning of the corresponding source file. Read the ``Addendum to the \saclib\ User's Guide'' for information on how to access these. Those who want to know more about the inner workings of \saclib\ should refer to Appendix \ref{c:NIW} which gives an overview of the internal representation of lists, the garbage collector and the constants and global variables used internally. Descriptions of the high level data structures used for implementing the elements of domains like integers, polynomials, etc.\ can be found at the beginnings of the corresponding sections. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\saclib\ Maintenance} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The recommended way for reporting problems with \saclib\ is sending e-mail to the maintenance account \begin{quote} {\tt saclib@risc.uni-linz.ac.at} \end{quote} or mail to \begin{verbatim} SACLIB Maintenance Research Institute for Symbolic Computation Johannes Kepler University 4020 Linz Austria \end{verbatim} Messages which might interest a greater audience should be sent to the mailing list \begin{quote} {\tt saclib-l@risc.uni-linz.ac.at} \end{quote} This list can be subscribed by sending a message with the body \begin{quote} subscribe saclib-l $<$first name$>$ $<$last name$>$ \end{quote} to {\tt listserv@risc.uni-linz.ac.at}. Note that \saclib\ is not sold for profit\footnote{ \saclib\ maintenance is sponsored by the Research Institute for Symbolic Computation. }. Therefore do not expect prompt service and extensive support. Nevertheless, \saclib\ is continuously maintained and extended, so do not hesitate getting in contact with us. saclib2.2.8/sysdep/doc/user_guide/cAsRA.tex0000664002275300236100000000502614017255270017635 0ustar wcbrownscs\begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt T <- RNSUM(R,S) }]\index{RNSUM} Rational number sum. \item[{\tt T <- RNDIF(R,S) }]\index{RNDIF} Rational number difference. \item[{\tt S <- RNNEG(R) }]\index{RNNEG} Rational number negative. \item[{\tt T <- RNPROD(R,S) }]\index{RNPROD} Rational number product. \item[{\tt T <- RNQ(R,S) }]\index{RNQ} Rational number quotient. \item[{\tt S <- RNINV(R) }]\index{RNINV} Rational number inverse. \item[{\tt s <- RNSIGN(R) }]\index{RNSIGN} Rational number sign. \item[{\tt S <- RNABS(R) }]\index{RNABS} Rational number absolute value. \item[{\tt t <- RNCOMP(R,S) }]\index{RNCOMP} Rational number comparison. \item[{\tt c <- RNMIN(a,b) }]\index{RNMIN} Rational number min. \item[{\tt c <- RNMAX(a,b) }]\index{RNMAX} Rational number max. \end{description} \item[Constructors:] \ \ \begin{description} \item[{\tt R <- RNINT(A) }]\index{RNINT} Rational number from integer. {\em Returns $\frac{n}{1}$ given an integer $n$.} \item[{\tt R <- RNRED(A,B) }]\index{RNRED} Rational number reduction to lowest terms. {\em Returns $\frac{n}{d}$ given two integers $n$ and $d$ with $d \neq 0$.} \end{description} \item[Selectors:] \ \ \begin{description} \item[{\tt a <- RNNUM(R) }]\index{RNNUM} Rational number numerator. \item[{\tt b <- RNDEN(R) }]\index{RNDEN} Rational number denominator. \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt R <- RNRAND(n) }]\index{RNRAND} Rational number, random. \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt R <- RNREAD() }]\index{RNREAD} Rational number read. \item[{\tt RNWRITE(R) }]\index{RNWRITE} Rational number write. \item[{\tt RNDWRITE(R,n) }]\index{RNDWRITE} Rational number decimal write. {\em Approximates a rational number by a decimal fraction with a given accuracy and writes the approximation to the output stream.} \end{description} \item[Miscellaneous:] \ \ \begin{description} \item[{\tt a <- RNCEIL(r) }]\index{RNCEIL} Rational number, ceiling of. \item[{\tt a <- RNFLOR(r) }]\index{RNFLOR} Rational number, floor of. \item[{\tt RNBCR(A,B; M,N,k) }]\index{RNBCR} Rational number binary common representation. \item[{\tt RNFCL2(a; m,n) }]\index{RNFCL2} Rational number floor and ceiling of logarithm, base 2. \item[{\tt r <- RNP2(k) }]\index{RNP2} Rational number power of 2. {\em Computes $2^n$ given a \GAMMA-digit $n$.} \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/cAsI.tex0000664002275300236100000001136114017255270017522 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Purpose} \label{c:A s:I ss:P} The \saclib\ arithmetic packages support computations with integers, modular numbers, and rational numbers whose sizes are only bounded by the amount of memory available. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Definitions of Terms} \label{c:A s:I ss:D} \begin{description} \item[integer]\index{integer} Integers to be entered into \saclib\ must be of the following {\em external form}. \begin{itemize} \item $<$digit sequence$>$ or \item $+<$digit sequence$>$ or \item $-<$digit sequence$>$ , \end{itemize} where $<$digit sequence$>$ designates any non-empty word over the alphabet ${0,1,...,9}$. Note that there is no blank between the optional sign and the digit sequence; also note that leading zeros are allowed. Inputs of this form are interpreted in the usual way as decimal numbers. \saclib\ outputs the {\em canonical external representation} of integers. This is the integer in external form with both positive sign and leading zeros digits supressed. The {\em internal representation} \ttI\ of a number $n \in \BbbZ$ is defined as follows: \begin{itemize} \item If $-\BETA < n < \BETA$ then \ttI\ is the atom whose value is $n$. \item If $n \leq -\BETA$ or $\BETA \leq n$ then \ttI\ is the list $(d_0,d_1,\ldots,d_k)$ with $d_k \neq 0$, $d_i \leq 0$ if $n < 0$ and $0 \leq d_i$ if $0 < n$ for $0 \leq i \leq k$, and $n = \sum_{i=0}^k d_i \BETA^i$. \end{itemize} \item[digit, \BETA-digit, \BETA-integer]\index{digit}\index{digit!\BETA-}\index{integer!\BETA-} An atom $n$ with $-\BETA < n < \BETA$. \item[\GAMMA-digit, \GAMMA-integer]\index{digit!\GAMMA-}\index{integer!\GAMMA-} An atom $n$ with $-\gamma < n < \gamma$, where $\gamma$ is the largest integer which fits into a \Word\footnote{ See Section \ref{c:NIW s:CGV} for details on the type \Word. }. (E.g.\ if the size of a \Word\ is $32$ bits, then $\gamma = 2^{31}-1$.) \item[modular digit]\index{digit!modular}\index{modular!digit} An atom $n$ with $0 \leq n < m$, where $m$ is a positive \BETA-digit. \item[modular integer]\index{integer!modular}\index{modular!integer} An integer $n$ with $0 \leq n < m$, where $m$ is a positive integer. \item[symmetric modular]\index{modular!symmetric} An integer $n$ with $-\left\lfloor\frac{m}{2}\right\rfloor+1 \leq n \leq \left\lfloor\frac{m}{2}\right\rfloor$, where $m$ is a positive integer. In the input/output specifications of the corresponding algorithms these are denoted as elements of {\tt Z'\_M}, as opposed to the notation {\tt Z\_M}, which is used for (non-symmetric) modular integers. \item[rational number]\index{number!rational}\index{rational!number} Rational numbers to be entered into \saclib\ must be of the following {\em external form}. \begin{itemize} \item $<$integer $N>$ or \item $<$integer $N>/<$integer $D>$ , \end{itemize} where $<$integer $N>$ and $<$integer $D>$ are external forms of relatively prime integers $N$ and $D$, such that $D > 0$. Note that no blanks are permitted immediately before and after the $/$. Inputs of this form are interpreted in the usual way as rational numbers with numerator $N$ and denominator $D$. \saclib\ outputs the {\em canonical external representation} of rational numbers $r \in \BbbQ$. If $r \in \BbbZ$, the canonical external representation of $r$ is the canonical external representation of the integer $r$. Otherwise there are unique integers $N$ and $D$ such that $r = \frac{N}{D}$, $D > 1$, and $\gcd(N,D) = 1$. The canonical external representation of $r$ in this case is the canonical external representation of the integer $N$ followed by $/$ followed by the canonical external representation of the integer $D$. The {\em internal representation} \ttR\ of a number $r \in \BbbQ$ is defined as follows: \begin{itemize} \item If $r = 0$ then \ttR\ is the \BETA-digit 0. \item Otherwise, \ttR\ is the list $(\ttN,\ttD)$, where \ttN\ and \ttD\ are the internal representations of the numerator and the denominator of $r$, i.e.\ the unique integers $n$ and $d$ such that $r = \frac{n}{d}$, $d > 0$, and $\gcd(n,d) = 1$. \end{itemize} \item[ceiling]\index{ceiling} of a number $r$ is the smallest integer $n$ such that $r \leq n$. \item[floor]\index{floor} of a number $r$ is the largest integer $n$ such that $n \leq r$. \item[positive]\index{positive} $n$ is positive if $0 < n$. \item[non-negative]\index{non-negative} $n$ is non-negative if $0 \leq n$. \item[non-positive]\index{non-positive} $n$ is non-positive if $n \leq 0$. \item[negative]\index{negative} $n$ is negative if $n < 0$. \end{description} saclib2.2.8/sysdep/doc/user_guide/cCFCsH.tex0000664002275300236100000000342114017255270017732 0ustar wcbrownscs\section{GCA Handles for Hackers} GCA handles can also be applied to C structures, but as they are interpreted as arrays by \saclib\ you must make sure that all fields lie on a \Word\ boundary. Figure \ref{f:GCA2} gives an example. \begin{figure}[htb] \ \hrulefill\ \small \begin{verbatim} . . . struct poly { Word p; /* the polynomial */ Word v; /* the list of variable names */ int r; /* the number of variables */ }; #define poly_words (sizeof(struct poly)+sizeof(Word))/sizeof(Word) . . . struct poly *ptrP; Word P, L; . . . Step2: /* Here we do some allocation. */ L = NIL; do { P = GCAMALLOC(poly_words,GC_CHECK); ptrP = (struct poly *)GCA2PTR(P); SWRITE("Enter a polynomial (0 to quit): "); IPREAD(&(ptrP->r),&(ptrP->p),&(ptrP->v)); L = COMP(P,L); } until (ISZERO(ptrP->p)); . . . \end{verbatim} \ \hrulefill\ \normalsize \caption{Sample code using GCA handles for C structures.} \label{f:GCA2} \end{figure} First a structure {\tt poly} is defined which contains the polynomial itself, the list of variable names to be used for output, and the number of variables. Then we define a constant giving size of this structure in \Word s (rounding up in case the size in bytes might not be an even multiple of the size of a \Word). Inside the loop, an instance of this structure is allocated. Then a polynomial and the accompanying information are read and stored in the corresponding fields of the structure. Finally a new element containing the GCA handle {\tt P} of the structure is appended to the beginning of the list \ttL. saclib2.2.8/sysdep/doc/user_guide/fLIST.tex0000664002275300236100000000232514017255270017624 0ustar wcbrownscs\unitlength0.5pt \begin{picture}(700,80) \savebox{\cell}(0,0)[b]{ \multiput(-35, 15)(10,0){3}{\circle*{2}} \put(-15, 00){\usebox{\dline}} \put(-15, 30){\usebox{\dline}} \put( 0, 0){\framebox(80,30){}} \put( 40, 0){\line(0,1){ 30}} \put( 80, 00){\usebox{\dline}} \put( 80, 30){\usebox{\dline}} \multiput( 95, 15)(10,0){3}{\circle*{2}} } \savebox{\arrow}(0,0)[b]{ \put( 0, 0){\circle*{4}} \put( 0, 0){\line(0,1){ 30}} \put( 0, 30){\line(1,0){110}} \put(110, 30){\vector(0,-1){ 15}} } \put( 40, 50){\begin{picture}(20,30) \put( 0, 20){\makebox(0,0)[b]{\ttL}} \put( 0, 15){\vector(0,-1){ 15}} \end{picture}} \put( 40, 20){\begin{picture}(600,100) \multiput(0,0)(130, 0){5}{\usebox{\cell}} \multiput(20,15)(130, 0){2}{\usebox{\arrow}} \put(410,15){\usebox{\arrow}} \put( 60,15){\makebox(0,0){1}} \put(280,15){\makebox(0,0){\NIL}} \put(320,15){\makebox(0,0){8}} \put(450,15){\makebox(0,0){9}} \put(540,15){\makebox(0,0){\NIL}} \put(580,15){\makebox(0,0){6}} \put(190, 15){\begin{picture}(200,30) \put( 0, 0){\circle*{4}} \put( 0, 0){\line(0,-1){ 30}} \put( 0,-30){\line(1,0){200}} \put(200,-30){\vector(0,1){ 15}} \end{picture}} \end{picture}} \end{picture} saclib2.2.8/sysdep/doc/user_guide/saclib.pdf0000664002275300236100000162575714017255270020136 0ustar wcbrownscs%PDF-1.5 %쏢 5 0 obj <> stream xWn[7k7ˤ<..;Nc.=CRCj p8sd ϓwGyzw2ӻ畭_N|zM6kgc6oWl:)ɧisUFdc.K6A=V[CՔN=8mSR9%gljz^FozSwMp֫h}>o|V@Du-~/Ožp B} S.$S)xGB?&%%O|f<=QbgZmH d&E_\ƻ H~Z#sr%7Rg"T&v8S\]/'M\F{,wY]:8NЃ'qh%GmMV+= KǦH b}bQ?V'}hd)j"厓=ͳGi[ZO社)b3og&9l5^b0g,j#1hrq{LnT9DŢaW(]8i*b 3 e&c|0}V5_Q(\5znrT:2Vr|Atd?M0ft?zauwtmݲ=ŃE/%~SC_8gcy$\\/^^ܶNg-rJUvmL eaϲ^v3Y]|JĺŸh$pQ ^gIMʁ5 c[q;D<Agڠx0ZCxC 0x_:(klfn*@۷JE_u*(PxCC>l>%sVb> stream xZKs3bo"cJYfNvHQDTt_O70m`J_ݘ;)Nҿۋ~w7rwsBݽvQD]oZw΃PvMRXoC:~BK觿5~So_. mm$ .pW8饣E(^;צYkB hS/r01? hA: vaPB:fVLLOA8oo"t:*t}Rz:-svwG@|(a1-\V6A+if< _F݄}N<FJy;#Un6˗3Swec䡖ձ_օPuRW?cByc :.\AfN|5ϣk3w2݋h?)${.@8=tu縧 J/LtV5{LtdvҨ,$X7?}oNOʔ$ST";(d*arKh$h| :GGWqU %% PP_.+"oc`Â׳\zk*۝PtМyi1Iw!Rn@oh {,yM$SD0 BʏZ }7[*sગU+÷y1tN*UX P3Kֺ=*˶ T;Н.vNT¢W>ۡ ~UwsUBx|1 cTKrGh\DHsHd߀`qZRntf?}2O %yeҒS+Tr"@#ǙZ~l|wiNBU[*'([Vj:Ep7\|C߼y2X<}$ZL"IΞ&8Oolxrj= M. ~E6|!،T=_e87O'i:V'JE㐔vAvwd5SV uK0oh#dCW-@󸡃9fDzJ#k^ޔFwh,,@>EU.`wqm i, =TY;YXdMB3m/x̦UX5SeE(]ƨ_]q[P! n nMƸ6ALm.d9+yZi.26HBe_EgH_W*RJ:^F;5|_ 4g]fL .`/VuVV+UBU"a4u\™zBU4,E6OwU! @z`]oj@Icú|*bJz۳.6zV'as0" 46IQ$W%Yըu*=qy}>~z=B܎k<6EDdk(% 6 ]` ` 9O3OCm|/ $Nf<:.c>w- kkDuTtzpI^腳`UamNrֻ8lP UC:jy._^Sc7+ bypui3n!4_N`4cIIՙ7dW8 yfto%}fҰd+[+ѥ}9G/NhZ01G9@Ƴ*2~~@ijH*5?z^{s ]Hbuƌ|hH(kZz@OwL]fWtQvÈ7GõOуt"z0@zg8"{TTn{Zr^aR &וrE찚_SO(נ:*IַrT}.WB`z4m dd㋚0}vƇΟ0n@B-/ʌoZق.GaU.1%jwHh5H4XV%}" .deҰC؆!l6+zܩ2-H%L3 2Se=Ak?%ꤱٰ@O*NaC&% 2gJY7ex֫;!?n hOT(/cZ24t7/-)z o\_( };`rl}endstream endobj 22 0 obj 2602 endobj 30 0 obj <> stream xUKs1 W9%ul0\1ڤ ǿGw9009US;mgg^>n0vu; tI'aoԑvnY]\/{}ߔyT0F\$uUZ"*vC 1P׃R5FALA} ׈nKbtJS`ՃpHBΘv)ZuSx]#C5x'6:+r`!՚<%Ƹ: ?<(=6 &l`ތnfYmKA3h*P|31a/yEGu0y̺Ep%MQN}q# !.tP]VqrJL3iijô !61+Ov߈s}KA.s_JLD:,3ZĈ#Jw<kP koYAb)x9Bb11& <1lʷpN(Jeƨc™J9]*Kk"'3o+ؘ >M4<:\Э7Oi8}U7|XCO5Ad3[IkH۪|$H&G¹-&5+'%")%cM'%vF)Q>l mҺM>kOXx[gm~34L/Zs3jk~=Ք=>עftbLU` Δ[6[{3,>}endstream endobj 31 0 obj 783 endobj 37 0 obj <> stream xYzThŻs Nba/٬^.nuOwϱKcku)van ]EAs2 4>4! C6).nD־E \ؙ=r(=SAKr5ctMMTDK;,c-7+JgEE*x& 2R}Enz?'-]OWGQ$2OV iWF^1ɹ%ݎ0UX0aLܖ9<:TCX83yKfRv2r ũӠצ5/qQ!S `m}&d7V({/;$Qw>t0֏+ .qyg)25Edq.Pȓ#)P2I6 θ<гmO~t%`W ,ަu6$ ZY Z&w?),40",{h^ۃyrm"Åݓ6 mawn:;'G`z.'ƿ^Ԝ @\wNLLkq}G9%e>#`ӗ9hca]bCשqgys˘u%9s6qր iU2=s@ڝnUQܟ?paWKH81.TD~' /`57JMOiohi}с"*|GԠ^?h#_+3=}QYpAFF"LEDgM2dG5L):}dsvQȩˁExWTW6m%_v7u20v[?)5X6l4/U2W: wXEaZZCl΋Kas-d@Qendstream endobj 38 0 obj 2414 endobj 46 0 obj <> stream x\KsOG̑4'$z*9rؕX֮Z43l3;,ƃǯnyZd'>Y|,lyy? @,]ry57,776jvBʚ՚*.t/3ͭ/k2劵̢+[4Vk6gפK$:6(_kk9m/0*BS1hl(*ˤzkl 5-#VWiC0 _9QpB1W{9/+x;f^LD<'U9Z;o!$燷LKc.I{m:trc*83ˬcO Z~õWεڲ,,$ JkHOq/rȈZ'9(;dBHPvƖZWׯGn7~{\3;!-7.6,"F2IGUJ\,%3%Kgh3g|uջPwFHIcm>)! T'L2E{Q9/q!V-#kUmH]s:pv.mĕw+FyשJ*6?DRfXTYA.U^kprp_B1^˨uˋ؈_~p\' %ұ<֨< p %ojAZQЩg~z&.CU>v k*zhC$&p:G>ώon$Co$ ORW2h2śbY!P9AsN jڵdu gd)I5Z/NGk~0\h}EǥnWP̢" Pz5E:k{$EvqwZO|*p0p$tfDQr9r&j8rLd|㹎@X>G=N4y4+Z, 6'i/dI[dEr;) sL PMKL´怞z> $n*Vc>q}>8Cp3R0qgeLV[>LwH{By'U(f9 қ=7V+;ˎ83h⭊+^=lB6 0vEy[KչbG O NU'sVV;[Lj߆U£uaI^yʒ}*0?:,Eci-pmiLRTes:DDʬ_ip")ADcj,rt&\ jv.=3`ZC^<[C\jV!V(t5WC 1N .+|;*KtFP C&!8TɫNn?463sB-PIϩtɂXI$E>?'[8HNм䪅c*q0Bm/qFmc&~1'0< 1!EhG54? tkQF QKقclDkG D8BӢJ2j 'W  Aj%?U"g OсhGK:y)싥Vh7AKrQ!p8MFr)9DjЙm 3HI_D EOK_}RK) FI;ôToQwqUJ+$}Yz$ǟH9>֍ d?}]`8rwnA4Dd84fK/7Y:ih~VɴR朓r5vaѡd^| e$߬ a):-)#r(SuBi(S9:(~V!<}K"h7%[_ߙCnq%Y;65]1ڶ"| a-N9ire.1as̎A140ΎIy3C.H&'82.mN摣:WmJh$^0╡>#C ߬#(aGtءMo?".$: m/r8YJ 6ʵ(әMgkqR< P4a; iCZy'F7BI }~Lj;2z/,MHY!_{?V Lendstream endobj 47 0 obj 2557 endobj 51 0 obj <> stream xWKo9ϯ[b*BH=8<ђ~>eww=LBF,B}jw\ PxJEPvk{2.,(ܭ$tI> stream xM6 :R`2=$iigm[C_ٙݤ٤I}AJ([ln&i Km,4.ӛ75+(yVMY_7h!&YY߬~3'm%vdوY̻2f$(DM7 mKOF" AXP$?6O;+ReO+(VȜj.K QzǙ]Вk*{.r$B+K(.TJN>jl6c â"cϠ')p,iqC>07 qx.8҄w|1@xgbG|J1RU+_.uC ,W }y֛#R: +'#~a5:9yQxb/NyU}m9tO^Wɟr$=z"[k>@ׁ Γy'c~Dkt>];~Zh(-*:j6Ypf=Y7hp;[>B쵗 %3gO'Rnj7ϲS c˨r?x_].'E1=ہ=X],jܼ5:Zk)86 D]c Vݜkɬm*χ>qI\ |C6ɼn *7KeeoE¦~N[? H <3ja̧w,X> stream x=ɒqwOovAѴeY"l$@  $R8םU/kɞ7 ZrWjW }zzGxU۫_?6_`Փʗ*MGsڜWO}7j6yOY9u7zS'}Gh==gQ~A4 1&?O~[㶘%Փ=zw< -ϧ7Vf)xsp83hL>*z oamtv1xzR&3>c\ILvOQyߪvuV}ḇmM66 {ٜdBpcp Lʦl \t6^ >i¥} [AtvJӯLZPo)eԙ`6*&8}=W϶76[M>fO7m]Luo:X |ldr>f)Dr0),p`#\ËV}Qp![w/Ϗ[E(S6 w*ħH#b-n|=?opyU%:M=;Pe.pxZ[6| ;KMc&X0LlU(6Y*?+΁]USoA$k2a pTܳK3`GOH 7G ;A33rqW;_J4U;* k_gLȟh8 evnB3<(1Y@Rg/[$N;1!/n8;ix@;Gt&+F\)(Sd.FR/\ AT.@Lg` ,߆[DZiPgtECx }ymQrUhhIN߰^ X~M [4`:rO |y[=".vq/ߓ5Sm'7ABc٭Ε ߖofxق '^@"u2D6/+J<!#>zQP}SL~Nxr F`NPk`y0.CH`Q-GppE3͐!mݝ7Me"Mȱ["4AaZg{YvCTdA\(12"vJN^Nh֋]3s|5>[P@ ey@F{G9$ϼt[=UttvwpNF'H[g@3&LV9؆["h#@VQBؓY9U 9LA`~]-fg(l,؍ƌz:E-3VZ5>JN9fҕD܎lwlgܵ½@\JRєܻ] -1>Wn!,?|,2T^þgD@^&.okT=nvkYɇ)ͪXUHF cʆNJw Acxwk!ue/ /?\3tQoiNY:|Wm`ޭqk౏.} pYw$a`'2.vX-5?b» z[Bc(hca)'n.wukT,$-WYPۗ"2Ev ɠ$wXHgH>|":waMDhPdſRp*d Z. NDO$v3Q]4` t 1D jA!|@0Q ݰLkN! < KZT5/)DTOI4̙33G** L !ˆ&"B h~U噌 }舁pV'rc_>4I`"J?izZ(gO5Jz] ۔dr>9ȹX`EN|W3F2̭5Fq}]H qBrUA mTg$C`SZԦ(B8V$*Q9Q@ρ0r61fdO򒜋,V R 뵊c\>E%Mwe ՞3ӷetB0IjwNhWf {IH=pc`s9%+esJubNzEqgv]?Qt >DNk&tZM^ow9\e^0_" qX"u腰+gj2y3F7@*.| r'Yt{V8>seR!4Sb`㤗S-8:z=a)wyOe7:t5!4k(E_,n1xGE#KD䳶Gy0]%lp!tITdAޟv[P@FQ gF/2<2g{L\L$3_ 'ڢ\c1'P0K؆Mrx?.sc2?P> >K;:k2ĽNWP@:Lv XewY I7Uyl=̜YvO-,Un pxMcqt; {4{REJ^w.'׸7I2ep$4 &Gz\cq{H48OңŌFd{fh0:Nz]|h OW.ռR4'f:aJDNM&Tk3{wajnᤈ Kd*BlE>V  Ʀ8ǚ= +.{,lbDQ1Ɍ{zÜm -U=B_tiLpo[Z:ug@kn찀B<\|=pH$]PFL₇0I++9&b*cA̲`:c%),Gİ{9]t1auֱ](߰@dh# 3Hrpv Nϲ /Jrݾ{zz_E!M [IZ;d8[(`rvDdXWԲp@H\k"1a;KeA-8? P>#p?ݝ[is^[75u]\ɧzq:6bhquQY,4y956+^@\1= F!S 2bW "sc+3`:2c-8Ũl|CEUL#6γoco8"M ^qmH`G,b=U쨅Eビ{~|-K*(3j r}#ea!_{HN_] C6^B]R+WȰ})iW«w-J!ZTҲ%ݣe>W:: #0wT.9AAY'\$.T4ŵ eyb"鱧dЪeCaa1$vAOhRrmC*Xub{ ϺCZҎTHAIP}i<.m|1~4SS9sڶSNkЦspH4KG} .X>Ha 皒95֐ X|$ )50jl#iS}"+w5Yj50[qiX}XkX"s gpmfc+>šB>,n5}4|lUak()*~W챷/Mrqd+ y r#S] @@7{ ۲Qk}\,E\$swrDYO}z!{® = KY5կsbV9.Ӈ{KBWYZENKWXv.N]}e0-xc9Y.&etr!,dдzZS.0[#ޠ/nr01 *w }%OZ3s UI=z [oLasgmD^> 5ҲIm|\e&Nj5ێX#L 0`g^{" #m sur}{i`ܗ%DmJ/<|t2y n9'13_e[ ?{އm,q r~x2c bJE U9[2YTrvjEo56B/K-q8EG)C:mBS ^pAs1-t&گ;5u,=a_M9bOUri,Lp[Y`XЏz1~ Y?aǰ>mtµQ 8Q{g>׆}N~צuȏH8ȡ-Oy Dp! ;(ؓФ>j8C>ׇz0xȖ{#'<7{jxЦBE?.Ϳ˂ 0b?`hˍi+KU *.9aѶKAt`hJKD}X }F]$u9yH] 劝"+xZ?yD-x Sls3hnĜ!M,d*=lAEƩ-;\2ɣ5endstream endobj 66 0 obj 6595 endobj 70 0 obj <> stream x=rGrwz" Ѫ}3e4H I(ɬ;kF <٬%+x&y&Ogwggx>Ktʙ/Ypy B,Z;mNo|*O8!>iVi0&zKqp)B#2 ÿ8^-=1ǔ)8$J"*;V6,|Z絍e#: $ yz+w,"K^@ؒn^g)=tuyQyK(/:v;AWȅ|IDuOPE"13h936F~c5eW¦Bi]bS6HHHǂ~_>%}GIWىTh h:@&: vahҤHؖx9#. uȲ▖nߟ](@-Yo-WEGy~//y7#Q9E)QW_x& ЌXOTȧ+#PIރQp pj|C~/wFdOiЙEemʂa ݅%LK"ZH?90P׀XѺ@s*X98p2B^Uw]x8< d SW|]z'yqbd[3|Ҙpp Pru9q=TͥZ/_m j(epМ"`@Jj뒱SnWHi@jeB@'QK{*'&U&@5k/ iQ<=&S딙D Ec6iDef\`JocVM%>HU\/ |Q~~v̠~8ʼ섲Z648O׿lk56yt pR٢ߙjJaE%:c̈<䛓3)q6m9eGyh1e>teVǼҸ͈|Ke=ML)مU.XG{p0>i!gi>5hauPkדvđX@ƃ̱.<:P\75 '[& Y[Ql@r쩯h@ "3G`Nwқ~ WQHL`C[xPm'4q*[&/4%Q]^ŁFPqY\p@A 5izbwn6j\0.9D|5ҫ{'RͦzH{D MIyu(/YLg*#T1;0R "9F2 UY:I*"mʆHOe۶Wy]p#4#!9nϩ.VtKk ->%:uqv^_U:rІJuMP_>4 `۵L;xwG<艠/v¬ʧe5OK1B't桙)2j*-D\TГu !+,&ѭ'=GȘ0<0XS(sN5S DlalQ,ۀJL ~q͑B]TyS#g%FH -qK nli20͉^#4*4UD|F3c:Jj?AӼD|31'L@O=L*y{f8/?M̬A^W@xv88d4V)gԼ;P풸I9&' 7sE\{a&ٜ,*N/=ɓBS]O$U` IS3ۊK>S\ܒVtE+UrnwjҒ)30v#p5]I$Nv!2|y0Okm -&f"*^#oĤMC>f\ɢ7YS}g1(F]`2# %sE9g'uwv|9Hm g*=N/؂20-( s`ұ e 5"UZz^1ꬿ-L%Wl̎X|8h]e33{GLzڳ4kw׌I\] \یn!Z>*o%I?MӬa$w鮄v1he8ARtZLCb7+gɰ 3g۶x9 #]f`R;k2M/&NЌv,@Zj3]2'Lt~Z4E_N@cm&8&\E T"20DIǴ!i%{ICF<и#n3SEb W$Wx3lV J IK` 24\ɶ4GJ$@&%^%(An>}huL^ ސYJ)墔 `rZq_ΐEqX~Kvl]ʭYK*n>㈨+a||Ԅ\-!dS}~SyV y[28S(07Eqbf]~z?e1C=r붋w>*y; #1a $)_rt~ݦIԢ+fLgơ`|$z"%iF! a;:DxlTYȹ2Q[n b3aV,f3<]ePsPo]x¦vV#q`gpT~)P`ڄwJ3|RԚe9gCap#ҋ*Xoi%o_3 krեPzA.{D' Uc@3t! GLLZ&}Qci:wDd%~]s ]lm'UZ`bSA#bb R/*7[\4{Hyٍ0)FRBD^kFTn𥴳JAIg :&fz9귾>ݳ} 2kzc( ݩO{GRx!;dL=&tB1UE,'l8lXƺΣa^_vƘ)yjI}/?ވoxfLMr}9Ծh=+練sQ4pD.}RtLȑB(U;Mtj/+w3AdnV3 U(*+ [>ffOҔ ]x*5bQL~Ř)_`A4҈h4K!NTk)f~s( M|+U\^U.o/G |GBg`7/* x*Ə]/G6XK8_(P=5][{eQUo.qT\^ IV gi:z`+O ޟH_r}Ʒb7.O4'j+WLmDN$ "1KLe.O'4\!JBzZ>O2 FPg1`ȯM#K]>5Ԋ!s+9+c\VmwpN9"rw`E>XNJ$0l)|$u9K.!>JNU1F) qs$a&#҈!-t buS`͌Hj!KW_I4Kymi4leOdͯ)2k1T(eQLWv~βlKd-Žw3GkNpOz.v w!rN"к@nW%T?T~hlҴ[3rCv?F JL~ V=O!uΓ[;m}dEѼN'[Nm~CM`>wZP:K˽+aOV3qTm 镙5m#4IJ}=wj.,.R4 ڶX>mI뜔FeVFE@ }b?$(/ oϘP49J}y %=]`a(5 B Itz8&Q~q > stream xYIo\E8FLEB!DHb8l-87]^ Juu_U=8ŋ}7.p?rxC`JE)opfN֗˃=HV۰|^RTꯙj\[iUn2VJǻpe wT,p6ۥn/b 'kS2 ˌaC5fN1PXPjyTD4$x<>POוz?-*ȭIʷ{]qRq D}ߦ u^tnj} $:q#]}LIZK /M E/ʑJ2ka#>TYP+8O=oV<49ΜJ9g8fgpHTH̙q'qV8k]:fQ#@vj3.=[J)=K7dR2͖bMiB9J:;iW1cB='I0*m+RLRXVf/N`~DUjʛ~|äenjw0I}>1FSn Z?,#ҜJD U(4\[ U|v/g h*Xޱ6UUôT`Zy\(%Zm5>.7+`^C)Զ ;^6 Z8HWODK 蒺Īe/1:{CTޮ="z]#ϥd9-%Dގ0}Jezޫf3v4b Me,yc :Rm;i-<ҹ" qL)?Zm0IWRu%1 Fmѽ#5NɰNLlyO6+WY[R+̴: fn~"Cp&s2wBX;3*x/| Q[õ̬)l}3[LtB](, M0Acba(3\,|IraRC)! ^p5NqLj%X_nX8z]XOci{戀DJ_t<ժD[(dvFt&;,@Va3h@ӓ8*o @]"Բ `M6Q؊5 y̚m/%P'9l=J0aFnŏt l$47Y\]!" ҒvB픅dRw=ڱɫ?M3 X>F{nAQxWc~^/ޡ}^ᗅ93 ؁t-bqA:#8<f_,2>#aѩ"p ۰Aa$OwN@IGHK8-3q^#Cցh<7V<idh?PŬ$)idY0sܗ%^өBqa`ǒLߤJ`i bBRmuGը$Ok"8$\EImfk3j螘׸ث0slsTy11?&tGٳLEE> stream x\KsΙ\Ly'@"'N)Ǽ9((&EIҿO73 0$U.4F?~ovb;A/o~w?7g2\>*@Lւ]|{;o'?icvg_p~RH= tn '጗C@f{C@*qLwaů?O y/C }=hI"E:w8DR/ϑZiNj 6yF=5_8B*{zRɹLiIKܛĭ5J*i}武%#;V>&ZgopҌ|ּdcnqx:2N2߈?`B^;Kio/3ڠl!@k8&+toP/PП!8%+-,~@YG%9.""I79mڰqz'm^gWB+ɹ% oQ<#8'Cm+>"EHXrJ'|EƞwlJ>//| ]U0FȾ󓳋ExBOҪ)KA|+wA &?Y&1PUDZ(xS&+!t:4Esڟ8QmJj8RϬ(y kXPgFgm"hbѦڢNԲDM>Q?R~ߤCe(sWN"tЇ=~z0= EWdO~ K*qxāC2v}jyp qWoUsu s |BQASIv>rD6mFsN6 O CLD_:3LjI#"wH4OzƍMBȮkMv|@G$.@M4:E[KqU)) zQIVE}b8z5G$3)ŴN cd6:a؜";QYhKp@Ag7z$?loE@8`A!vƍI|uU/oJLK =}2rSޒэUܨᛛsEPn>8 B-ʞ@c.!;#hfqҫkZ]& wL#,誾;7Q/ǟU>3L1GP%v;~V pj&I0#HΖL׭mǠ9UZ Xƃ1էFUu*QN֮sqݑR>9F_ۚ&ÇŇj,ZΑ#>ՈoSCI9+*":/ @4&8AEfIy8Bu3 Eә$1#W ʀNiĸ~UZ$K:`$a#;`\֓0fNF{Dv{?CO*|DȂ9%9:M!Z~JGr+p2"F4.hT$9 ZXQ^QxI XYz+K3kYD+#c._oN Eؘij(P/ѴUFiq/fҴT$" Н_p rĦ0 #tMm!>T#0˅`,G騎53cQͱS~\6"fRG)֋z~Ty5@9spw;~|@hh&b}bPK~䶪3,҇dGD`jhU ֧5"2꣕i2BNakc +YMidH C@{Cn#B,G.T!(_K1|Ѓ]`4+)Ѵƈ)lvZܘIYgʻ~ y"Gv܍Jopԡ<.Isvm./l[v㊕.yC'dL'}? Zn]5Z/Wu l9ﰼea-[q 673]n#S` /+YQ#"v%QLeXIG +qWEJL&B 13xHgT D&G 2ABs (9_1H!kx4Dͩչ|n!@nKTp,؈%e`Q1 [PCω֏fD<;;U\e۸=h렜%J~wpl͒ׄkJ|#Q iY GP8' +{M_*?G1vC #MԨ"k=ro|:wNUW]ԟ.BtH9{9G #E#.k2kF>g=EV:p@5N8VDfOw,=sTWRraz"0MmM\Cl_0,юd6(-8u&ѩzyJN2+k,1RVxu@=gwjT+2ٳ(⍅rkΐcL8î:Ej'՝VK-ٙ=ekԅU1g,$)Mm#. V^J̟/ϖ盕[iJ,Ӌ/ΨgÙ N2zw{*77g_;&yO@#m!4L'zAh{sde9C ")'E)QF25K20|* AٔQRHșy,䜵"ަd9nٵ Vga4h0s؊W|DWy;GP@}}lU1!3sK4n~<Ɯb/ 1yR.9dU!g endstream endobj 87 0 obj 4366 endobj 93 0 obj <> stream x\IsYVU8A7v;>xKURb9)ɖߧ̼G'J|Lup勉wgWg^Rg9N~΂35gWw>==WZ[™. o/6`ݿ֨,] `yRNH^>A9К5!?gJS|WntwWtކE'~zEN֣/?ν{:R_yGw_[Rp]4Ń44koLY;Q.`l}M7PE@7aގ~SQU#ЖQ6HhE%.8g;U*BcdSNk(GKqc#X<#䌨'm -"{tӲEk[NFj@WH|~Ű|>m:T:.3E4##aZ(\06UFYOYӘ Gb."o_؉%/c:󊶬ϒ/uw}cnIJ{/(/,9.4PjѥFYF$8ۚDB*Zvԩ^=dFvZx6ö_76V*(lZy2qwvkP ιzЂ7˽E >jᧂQuko`:.Zvɏv?Ou6sK\`4bΦ5jY2sgeXNkbr=!EXk.V-Um\5J[zhichj)r)I󅾅 YԒ8UhGH^c$c(kyǑ#5&__ ^!X&r6:fc!z%dDTY?!h]%hl~5K6Œi4sP۾$9K5vx9[]QuTGMTۤV@ePM|{-F G96Cpyf8J-%h$WmD'=IYq.aT3Ďީi[v#TvVOΙss2ZK2X0v$-ဪ ]c` "Q^y!479Xߖ+IH"R<[HAnp-]$@7Ŵlqc)$un!ߤcaLKv@dzkdh/Wܽ!QVJt|64!/JaL(: .#.+|jЄ-&LBƤ;TW"sUν͗t=*U_Mi΄HBY[ qt\-Gq ,*'@$y+RFCݷ`]dDI~b$T6`\rerr^s917K%f֢Lfb%eC@ȧl-EVZW $rŴ0Uœ} u~f^coAc<2Ղ.5sDZND83:$Za_FR 5ؓ^ɫ?oSeڴ' K[iȱ&[%UtBK=R=C>7ƨ' ѯ$܁腴=ihhc6XQ`|h67%>bBvz'흢$SrAXG;׼4uk&`$kjˮ= VZ&KvWɎjL%=`j5/dgǪFUdr)jO0[aBA[oB@hYϊF!k|Wa(YgL&8W!LB}CiHK\vK q]w0SeuO{:e ԖуVߠ[m-Ln9Sj}ܺŽ!`S䌧84]MJ}l&m uyQB/߹gR $Km(999Vk/, ?N K!b|o+Bq"tI([|1ݾ7]ޟ8b{-A Ka?gTJ3_gqsҐR)զҿ$ebs''ْv3v_N=#;[N5'.3mFil5*g.4‚&-] }(nπZ|ټ{_`y1r oK)c8⑁0S8@ ρJ>a̢=2P] [j'*L- ]lhrdNi1z۩ex>0$mxG2|Tt[Ch`! 773 d  Jt4U-t{lOŲzSҭY^EEĥRr{FO%M /&En C@oeO5qL22;l!Ӈ0ŧZƇYܬ-w58Q1QNÌhC_9*x_e/lj¾k_2'0+̯X֪O /iCrk@(TDZ(Wf_Hvmc[9U(K&f ؖGf 5*waRcoOj;`\T%,n"@1%anC!nP^v&?$Bh ;sO%.b`->Zę{O򐥟.ID ȵ(79眦SC_ )+LUOF4-NS 5ĕJf)uiAfL ZmWY8O6h[=脠g{*> stream x][sݶ~GǣiX\؉8$v:cיȗ8w %^$g AۉFk>:c{L^;dzK`.4*w/ғr'l;렑vWg;W?`=>x?904VQ]l/q- Zo`/Dc_ύnHp:_Fmmv˸vtC#S-Nq*jXx|ndT6$KjsDK)j[aMÅ0H#)Xl_PBUm%l!!G`-x<! H.$g0w Os.0r@+ P|G@r`7کƹY5%:9uAsA#b7Cv!"͸rr[fEZ 2""Ad?i#ƣai&,0ch,2Qp5Ǝ)p𰇈 N( 4Bږv/ɶ"eU`ǷґG89{c+\)v?,*+3o#uV!+7D⼷摸G]ꖘgVNWu7lYw2(пC,CeOrADAGq$5^t+h*GD(׾<:,w4gQH[C|K,,S';AP;#%vHm09 Eo`y}E$7/ݵ/=#紅8ȁg}D`_^"'y26H|^~pí=2mT.Gh^A1D`XnsLy;ᛘReqh!ߤ-D:cM%W 0q<#.]%x00 هBSq.&<>ԳDh)@='1>i1ӿŏFAEcAOs7u525-֭I::nU =XXe銑Q2sQ x{(F@;? vډ?#b^\ N$'S&}E..gΧX JR3tLd7Uz?G.=teLGU= YDjc"l17&r~ϕkT`RJ-OmȐG6R\C>u4*_rL k'ioꅩ2™v'IX}f2dZYU)*"Ш7I JrS8_2r= ^_)SXZmυmOf+jI/2r]=sO0:sDRyw56'M }}\.=S>뼹g s޿6s>37WƼ~vjF=pTzt #*ظ49#V$[n\ 3jϧэm-{ZC_:։h,J0y7OI!:%ֲ:@|zfK:vJgDAD m k tц@@/ۭ_Ϙ O2zY^~n~Y4tDAb!@ッ 2(0[-sVy8)j"7j`M% x:W, DX[Y.e@Q\GC҇:~JΉ 6f;eAJꅷoGӥz&ݤi.'TiqX.$bx2IR&KsBG^ 2-U=ҳjnfR퇜E/8xz#-* TT\&l*RTBoA5p@Y*Z k풼S~E+G‡Nw>f+]X) Xu8d>-s|16#Rzhw\\GZMH8凫qf ?C%ݳuN$\,nE(3WیTVtokt?H U!.PPGgx@Q"/C(Ąү` +Eл:2ᔾ1ȢYaQF{:''wQ 2|Ek TR\\y&@lof\#T(MG4c.y9(Ԣz;H ɍ+ שk@_ (Žq'Tl.CGT84je6vCP.9Kpfkozw+a;p FCAhM&~tjE T#lZӡFє2hkTآnΡTXܢz$s',}oEE0l8~٤\dI,)8*0(Y  8 ?:a6L @E ȬP85ζTvAZr.f&f8Y{tLrrD8~ݓB`e=^HVQx4NO~)(*_$_fŷƤ>4ܤpNRw?9Wmj*1@-W4܊; Bqm&b N s&=$C諫PB <~D 7E]lw0Z3hHUwE;mcAckD[>8|XQ>[4ککPmw]#ۍA%&FF)8!FlrƧ5j|ӖKl\ SG:]ЀFxv*S'LxSp>^:D> c#kTVVlaqe8 W ꑐРyr L]@}-k'2S@d1C@4\L< :4L 75Ns'"$sʇ-sh*/0NKNdVܖ#LQҀB*}cypy-?w endstream endobj 101 0 obj 3878 endobj 105 0 obj <> stream x\Y~ 8xۼ /+ɖU$yX ȗ}Hv&{fGAjpdX ɧvz}ꄇ?nN\N0I|rfݩrV^ܜ{so{Rla锶3UrY*+-VmӵJ,3t|vVAq7Og )Rmخ:dv9thRSis* +crH#KNs"% `.^'LKEI3 ~/v %fÌ?1ԗ^2TP FlrR &JDU$^&z/N!ā,rn1Z~SZ:8o~O]*mt/?~'MX0: TD`Y<*|:y^Y?ߐ1k'\peWse(~tCB_i!wW]e_{5Nng{HǬ; ΛI;C*1kB"1 Ŏ?q'$5\tF&{Q>^c߇MVNs+L[ qb16 0͆#щK{杻ڑlV=g5U.޹;?&3́3&o6h>d4L&3oN'J魛Evc]"馞;1/dAgчES!XAҤ LiNu]*il3up3X&M|M.ME *vR+-Q|Sǎ0,ˆ=[B"Ch$['2:%‹f,};ܥ^5*;!K1Y'_O"'t!֪Ӎu h!f ,B{1Km%#CH)pHHfUrj@K43ZS,a?S'/F:y/JG-ߦ&EnSa.ԙXL3ZWl>賶6XVΏ4fB&C#=J4AWu}Hn fT!%ǣGޯLt ~ g0h} f],EH$>n9-fTW*bV) .PLxW.]e[q_PpRGlw$}J!B5`qj5+?$_P6vɓd Yi^<Q0i# GW1>]Mm|\4sX{k50rę/*D] ~)Bxq8b{9_\| lendstream endobj 106 0 obj 3619 endobj 110 0 obj <> stream xWQo7 ~7#QjM$%QҬC=ifiWߏxvl 4%6Bʧ~_g^ps}?s unNRm}|=vBqj"ffhJ>]\ ֳaNs3˟$)$T`)$|٦(ѹhnʚ(0/kfOۘ|e6 )+zeˎ̫vvcZ@2tޛj-z1aD; ԑ\D !E㏶ZM^\ '-l0rLpڄ]V :KPlY%[| %=$]ǔm xQ yz4:+g4̀D."bTWT.idK}<9M{" ZCM=Om u%ɡ!]@c#m aq/;]`Y 1{'{)8K/vxH [d:Z6QT7ѥz)t<|\JODO(OM)~sфXc~ uIED3i$2]-]Emp6Ǔܽ U<&GdEBRS;sڗ)ݵd͕E^zerROOO'GhF<|AV?,^!O0J`S׺y;{JhSNeMv@~oՃf!lj+mѲt9E>XGendstream endobj 111 0 obj 1051 endobj 115 0 obj <> stream x\IǕsi?nU@Kd@IJ#6b[{d*6!*eGF}n'&O㛋w^_ݳ.d+,qrM nl vwus]Ĥu₩h/?J:R gV]~>o~OtQ7 9 MU5AA6(<Q@NAPlg$2eiCoeJp:dp)B.M0$+ֱ Idƻ/U }$R} [zSCDBg|6-h*6pܐIXFF˗mәrr>f*_*?YAҚje-?qNxሾ(&R{X6y :A%ԣncҭDr [Ɏyˎ)TQ4$ qpSSca*oujKHHc8-7H̨SH ༨pkH'>: Ig g@Z:+m޻I2\ A,J 'b&OaԾ&3WdӕgmKQL/"/  W&c8dN4pL٫^]uI*M d] m" :7vf }u9){i,,q1pZg@%UZU%sڗh&nz m#U+ȈZX`O2ۆ}" k\ԨwJRINW-NO:}r߰96s٫$MA7 -j INt~c` uP>OI0_[zA{rIF(-͞Ѕ G"/n0vH)t@WM{bѤzSl܂yAfNJ& Th>o<[ ó$F\WQ" D8m%#$+MhU{.\`P!aoْe@0f)cRF' P~ڑ NfM ,vf5qe󄕏UỼ#E+FòmF: xJR8CO,0$r̂Ak@nc(E &EgbXvf *C o͍c`A"e(@4٩>vCx%7|px4ElQI>@gL)9L`7>dS(Ab(-nGr`jQ*)[6HC(TQ6j$aT9 H=RpV$m 0<ɱK|~ L齘A ~WaD#%AgG6S.Zt2 #xy B.:h\b3 bu2jC,ҍ ?X5u~$!_\b5Z|!,YR*,Jަ3i7͈yNb^5,oDo]>ZajrRd|ەg& XmI\gX9Mdr##*}A7e q25դ_1LↂW78*f¬HcᏬmc2b/?v}Ж=‘ZP1rJ4}51lTF4mbA*m$ǥ>lOY`@`h90J+W 0(tZ6م&Bt2 ylpA6݈7eq$m* NC.:yhݰ(wۢV܃XFo%}-`X;E& 5UrqJVtR0FrHKEb;6yGfE#7Kv?a_la!Uzwhs8*uf "(qUY$Iင{Y(O?oRxMyMy fVE"8«FSؾ!4n9-樆)jAWniFf; ih.C'ݸ׃=t) Ъ.oғEV&m SUUi9fc4$g[&ƣGY)ěpg\)rc5pAp  |mB,g=VTKYEGs8[= e }9|wtH,/[aR2tŚJ%֋;=fAt)M~IK6#&w:u&:#˓gzd_m4g$h$F8L 8 wlvgْ@S}ӫb6‚8mce4#mS +{wy+lER@uz HlE$P5;ׇ6gF|k-NkLRxM_z',1v,$Ք \s c=`C$ǜ6VIiMJ{۰JrF[k ]`m~Z{yH3ag@ BL}7&epȱG{;X {o{~,VUq ے.GP Y21QL,Zrc"g$?_+=xO"RHvUV4AFΌ֐mɡdcv4M>lo=Vf8ۚA|aJqIAk6G][U{!`2g󍼒k40:w4+~j2{F> 2.T_ͱe&`N\;L`bnZvyƂ2<3M@f-Fney5.ՖwȦՖݽK%{1nшD n>'P{{q_ĝ`Gi#9w`u$QՓsUvlt*!pvtk]UVg3#(GդjSe[X;Sq74h0$Ƥ,DlDGoq8SY'fg5pNiJl!a8:wyxvh{_< r]cOe#NmMӅ4tQ["6~D4ӢeCOB=,Y,br^-O;;Es'h|\Y Ϧ̡y `cS39P 9>[LZOmθyzѭoI GGYRKD]d_7'[VzSUu32(h7O^l8-qj*,TJHnR/b9Ч2ӝx ,CgiڹCxD>ɼssƒ3Z4M▃G]vrm> a~ww#]Ϟ*4o%?/JnP}SUe\LWIګy;>te/.itM0_o =CΝH`e:孷]_P:' l\"Kѐd_3;ZG>-ol >Wxt_4x]n8+W+Y Zc7ͽU4u-+eJRT?m}LwEbDXUqbǥHZ_`j_,ϛ$:# |!tmPGP iDˢxϏ&6]<M|-t4Qc\8E;ӄ4iwlsp X3CDX;C}I~z~'Ezͻ+mY]/`æ '[?pPMu񠜦Ң,u,}N`4p 04i j)ӯ6⍏t$iF;yר:Q)0# s[w%Su}ME#3%?( 4~/AxWl/eC}R?\BeypZWwzq̰^uam9h^̀x~6Cj-;%=fMSn*nPBdéRх]ĕ{pYO* tW,y~FT#VO̩4c8L d;Rİendstream endobj 116 0 obj 5353 endobj 122 0 obj <> stream x\Iu@{rH:$,@b# RYˬ̪Y08Q[;A~⟟/.d׫ׇϟcV8D9<") ۃuJ %!j?^hiC}JK157_2AA: by__j9H+K U.VyOAi v65+`sZ{c^C!(&m߄A萷?}}yerNxۗp6{ -yUMb]>[HTLY?,V|Ҙ,N_>NG  )5km|ߦ0yB+)$|'1F@kllORP_Sb5F/:EAb6ɷV7ɕZ'9zK{6FO"7.5K}|=O%b;\I9@m$2(/1O'2ȖG*@$-B&1FԆUh$NC,ʷ 3AfG>r:嗜/a&is)m[7!iszQ熦[%6i'3/[UxQElvF BKɢq?[{]`fPvfVGp[ʍ ccbUa2oF:ƽs2_zhZ3oʃ'pЯ Cdӗ;N$w$1v:p1БuJQ-%LDxt1&`RV`m  {>Ug{?čmė@3r5IWZ2 ^;9GuICkZr%";A =+ՄZ٨&%kUM~%hD IffQ9 w 8a+"U&DEH\p@ֶ ti}.~zO, #YAPqQ > bgIؙF 5Ϗ; (< Bۍp6p3ӂ@<.ZhDePbډU "X [9JS=&M y8)`)2ȅlu-\/3Teu"q aYhGR]`E=qځ g,U"X- LcṉL`\V82xuɃK~J:91Lq`@gs opqu`}0 iKLu:ǵm=$Mı90LHZJÄ.p镖ca!tZO{+SCqck;@K cgPtpץTtC,=߁eʩ'W'.TCHNU"J:_Z;=[eXlXtUR"TKҺ {}K.AQ<F*'n*,9 c1e)l䶼Z6@g$Vcv9}T|qoا*V9 6T9K٠UD6wփa1 s~{Rif<;+E ܔGe =~F+X(s0(+1dp3h#;5,=V̶?+tg y)߶q ;;Qs2oj|H)ɥ0: My(4'#Ls?#|[,&g"RpX>!uffGRķ%i%K  QUvy֚ B65T,d{&p.F -\MdRٶMNtA$Ν^,̱j\M%.=O,+{ C-8'"p(gFLl ِf^C", ;!7DQ&;h*ruJO2@~\j m/ {|{EZпx 69Qa0֍(QQ" ֖GOPq0g!=ʉ8:#e”kR@D\[, I%7^(x3 ՋK&2#ǎ(XyGG ܿצ@{Bn8y6]폷% 1Kdۂ r1vUHbLe<\|2|(X,Nt6 _U@V&MLew@P% ܙjj,9P)*6dk߯)}tDOE'"ܸJV,1)X#7[szj}L-)4ÊX4Ϋ&&Mz؆VBm3fn%‘߼[iGWݥFwҽde@ idxΘf$7䰗jqVݡJ`])s v{hI=UvҕiY6}7j|l4ah .Dm60XBBf}Uk'P,>jXGPhlL>¢V[K: ]KݖN} 3俳6V@;GYJXӥ'!c6ѿ3Rͫn^g !6NkSfId>#J-$L ٤vr+W:d}MȬ/l)mWN"67n)Zw,. ߉ufIx'ia.GTԦ]HCJo7"=x? Cs`"#7KUEf-9GLdgm{ۢ 1bbw섾 )G)Hp릫6{}M[̞jk[-C'mVXw޾o[90- rYTs-{!s4Us@qQJ0^IK8[x`$\I,`YPI .sN5\Cܤ~5-Mgز7Qy>qv/tF\\|n..?Un`iKYV]͚q5.̤j{WQY v 4)4Y>ŠL/ng1 tWK{FtLY&_,ϛO0 W_{啥R"s፬ ݑL[~8.#/-?YvRd5]^s,ݢմ\ |.+?Gs2h&yUg8/BM0ր7|WmRz=1+uF̋=OG.qpCSYF+H#>_1[ag7b }DH>Ӈؑ}쏧)Bnh<}+&}6i2,Uqݔ38dOQJ\F~~B'LE\n DuY6 83Hf;c~&Np QG9v[N~z_zYıFB,SVt|ᖅ}Ӧ2=;]J_3Pxl6@':ZkrRUjoOj7xȎx|x$dߘ ElbTiv7; ˦)W 8t;qas$>${>AysX㙦eJSE镢!f A^H2endstream endobj 123 0 obj 4746 endobj 127 0 obj <> stream x\Yoγ~< V,*B YcKd%_"lLht`bŪu3qOpg?{rwz6;8lgSbvj/|IgҎh3SwT?N 1~p#^i?CߴʰQ}Ҁ_AjK#^_C`oN)#`K >$LwBp3pBKo+Zج PZWNH|RsW wKʹ[Z]6^ >#0F>yXQ¨l]4p*~d>n d$C$ aӈR`1tW%ˁ'V%\tL(tVd1_l3ƽ-$턥 "(%4d:Ig"4HYɳ/x:(ejgHDžts+28" q}OזyIIWa /Lʙ߂4['t@MX^ ^ͦ *x<:>?nwy wu(я)ZӅлl. ArFl 9RxWN7a$.d_ a)"޾E,{BNr&2o(wӠn۟I?&7oLp Gņ=29rJh ;k,KG'P3+MfDMz Zf)xlT l igL,YV2a!w~µUia ,eֆ1͙Vβt79pIl罵6HZLfYԂq~)kDP1kL7z ш Q'/|:5frI~L/ Q}BQ1lwhul]R;|pnY~Deni2PQVG ĩ(T he#R$jǛD}աnjwӺg82կ]]kI&QRyJ0@ ?x*#˝z ,ݭpvsn'F$EUvwg Vp)-mWGٍI-am'"ך{Ր卒z=(:KgΠ#dE(:2)d-/ a V9ˆ_7Fn8 z M(ܑ mI8Ҳ y!ؕ T;. ЌeH]o%&Ucmmq̶!;_3wtJJ^ l ֥+. 9l!jZXR"mhq? qWo=}ka]l/P|RbG+ S:sIP'Wz+eٚ,cNp: ='|w c Uȳ}Nz4Xw r9٣/= lZ þSQpM!Y^6ruwy,WRI Q8:Fo ]hm3jehU,þ@m\@uk9PXY(W(?< [kKM܏M/ 3tTh6 ((zʊY8 b|%֟~Ҥ[I'iLn[ԢmYazA|6BW AW~ps'mdf0Q@\^HkG"gxa%x5XN>Տly`g!ᾦXǏo}L,?ՏEo$-osr"L^WXV?w Vx^JkΪ, x_GBʕ*ȔUBC䋺*a8jV_5cR })B+' ;YsN7:6O8&.d&(nUR ϫHrQaxLc*7긿4K Q*aqlఠ}P?ٲ׍FQB_\9rM*tw S}P*mEA.* |VC Wd)I/7x2@(-LR%Pl܂c7qN7.qƉ>080F@W65[wegV#=ڎz)\#+19}Zv͋M vԱ"׫9bۆ/3_Pl*iSd1dAAi>lk:. C.uCwy $(6uQQV=^ɨȊlj'o8)wA-EWSTV;op~ ~Sc<-$aT6cXEƵ&}ꡏB/|N=ӡZx#qm[bg%Z%o=4}3 0IO7(B((#=ل`{8s<ō{2'E󖋜ԑ;6|06CrC0 x7A3< >=(3_S]]\#m3V'h yU>/5ā6Fs'fll(͞6oQs#p4f7_56jq_{厍?TW*XpȘv"hs(ǣ㽟{endstream endobj 128 0 obj 3545 endobj 132 0 obj <> stream x\K$qo('. rA92оW>Hj@U!BuW ;THd~ىA_~{b7dnyj!:ٽ7Howk{?:A imܿZ[u sG'߿g~e.ӳVW631ʸk(ݼUQ!B:VJmd!'kζڔPGGk7(~sud ?^TՊFla"WV&OAj3}H)]aU%i#0^#6Uh5樅IeE0H(ֻL~' i 3T"hv0DL^fC*w$MLM1;D$2+ܺ)oRqwP jǷZXߗ~Wڎ`ܣ'R`ix hI]ZUtuXUC0fuO%CwS i:|OڵҺ'E,FϤJ\񿮰kcS ~ZEJ\&rB )E e5# l`yˌdߗf=24CdTE{؁.N @-$h SokNF1F'eOJ{芦kTuvMS),vv4*tK,,Zcc*. xתqx-kSܮ_Τ'R |44Ïq?Orȝ`1X%@* 6/cX6!XdɖicX5?ˣ ;.0ŧy2R̹/}ɲN`ɴL<]MYɋ .sK4k/E*zS3j}\}iNVT3[Zn͙j'|PLi &^nĒo%)|Vgm<3oĜ˜^o܄ZtVG!ٲy˜y~ Vfti`^Z+b&6q_[Y &SGò`ш'=,i9;}֐&(GeFqFVP`/3dri# Av=z\6F( ;5IQLwP]2{Z4 (Nש&|cx9vi 313ә^(jU6eQ2[6+M iYٳ-2-yrBs+y<ݦ Y$!(ivw T8E2ZCO ŕ! xC pt4:&n{zj,30ҩً],+a )L8[rz˸=jx/`A l}"bOB (X'1yQpo[Aΐ qS!wvaI}iP 2k&?PKQjgAWl89p-.19ag{rn`ЫNV'sv qk0(F LߜDkĠV(sXQy<`%`x3gD0]D~C."tUvDFġ)XĚcqhas NG*, PZR-%SS 9njtc idF 3i'Hq,{'&>W-U%G 4>D+d#)D+ I_Qd+2PMZ?OS 2|Et #Rx À<(|-ZM@3v!|6G646_J AQqa֪^H_nH1mfe?.Sz:e>=n#kq[R.Sgk X-"=߁o&{UV/q^X26jȚcw/v5/d;n(`pHM.`'jQ Sh)4ǴmʱRg,L3}ĠYFn=4ѱn- yaK >fVG;+WϘ׍eL"y :`Άx&EUX-V)>ho!K# 4) mt?7NSofFep*Nv-{unvy).Ǔ_Y~˞߱g^~(Y~ⓩQam3ϳU.|\tIm ƙ*Q諮φ0$;N & 1&ZG)KZiӧ iVίZcLq3©'/UTv1\nCxWqt|>)Rs-U%[VNz2[e$S +eh;ٹ#l@@,㮃$Z1^* E:3]Ž9rrۚĩ 0̼$&fJX/ji=@e't:&f*PZ=CR RRQɷ.C9-VV`΢SZ#ur n.|B!9u.HdC`C9j_Mj]1%Ȁ>x]M]#5`/>ԋw2Q?ʚ*z3}@nTg|Tݟ3r&_AGJ 5.%+4Rv}K X<_#?)qQNGiz",JH-rop5hi/ϠO'i{ˏxzojRޒnQj rɦU nÉCsq˦HJhum rtolt yt өf%ک"R$+8z{9endstream endobj 133 0 obj 4911 endobj 137 0 obj <> stream x[YsCy%&FL"ۻ^lgm+TyQeY>ߧqLwHڒ*?jhϯF hdW>O{WyM89k hڪ"[4!}bstGK)r]+XsE:"q$ Xߞ,Q jOjR0|m{L{GZ笐RO 6@A{v @վ tX[[oNHBʷo2soѷn_'6&xhv7'z5VAʬ J.E!)RvSч>#˪>;ʼnφ៫^4@=RWyAQhtw*{-M^ۉb/Z~:_y%A{<Hs:r[Na%\s Üqy-arTqԀk$N'g%KKe|X*(>RDK1J}fQs*4r$_1kǕJ|6+2@Xc÷liRaIh:F_Q*EibXLKXe-Uvw y7:T%ˡj aڌrš 0!/SPO2l=m^ Go@dH(^#O']hPvEP9[Ð7l28Y]X:L,ͨ8ƣ@]4p#jFbN#%&̰{ҕC [F[Ev0&ܾ)'Tm1kѪlpSb5;9jӍŗN iIZ)s0.ѓ4ɮvQPY̽V}$=_NX^Mm j I7y UxIT:"*f FmzK{d,"L$$S!9i;fZ禙G7ŨF@txGZ |@*?5ƲS@׾A%t]ȳ!8/ih1]L%Xm\niIާ|χQHvu#u8Rh+iYg4د3׬f8guFuwWU=8 RguKo57zw;KBh W\>OVVmx-~* J]IuKկi^Qkӄ5jfIZsړu%X_{ۯ] ħ☸u5CUϼ?S׾u{m/Tvwt۪jѬ֮%Ûb7ᚫmk[[ նtLTӄuךzz#k+tNBzxwkyfZ; $vTXV.4OYwȍ$;jF7>JLaKc1nR2x9!6NH7|m` -/-hIsfo[IZ1Ӫ]'Vu/hkˏqJ!sA9q\h1y$"]&C6[pD>[ť=B&9(A9 G*o9/ٌ$4"+ dNNIC07NH S1= @$^)עh pf>У" pcF2RdCy/qż M y$BH-. l,ɂ(rb =_ӻw'" 4UBl]܄endstream endobj 138 0 obj 2462 endobj 142 0 obj <> stream x[Ys9~XޠkLI)`f`Gİ>`laR*6c6xBNI2Sy_5Ӎ]оK۳=ԝV#&(yu^!ɘ8,im?s0Zgս!W˓oQЄ.8p&Jtk,c{;[C#>r4R=kĂSk.Cg }t$I[ =3!oBDT@ͣf0?D'by~<QNXSlX2Dlqtz}>>G>~> XVug{9αtXO2`g0XX XD Xo#Q`jI{EE Đfg{Yk1*-Y 8EQiD@䢢KS(ֈYk -.5zJߍϻ_7J'by#t*8gC(_ ŸAg= GF7J}V<QUa.egq3`m{:q#Lo dJEJ%祯oKiARH6ʉIڂkB 'btHKy) ެTVN& 'g{?X\zv!6QO$̚Y K&}z>QoIW[Iۭ[?7 L h86S14ٮ>^ 1Pzsg6_CjZ]Cj&ƙ^~9Sg@=~;ȒrXu$3|U?4?&bq+3q4={=PQV/}ޛbG?e[;:D[["彲@!$b"]ѼՇt4)Կ'Ie!)ɴ0W5ecK (-̤E})X)-_! !j'V xjAI'8噣Q'po u:Q.5"@vVm"Sn4j֤G0e.h,~!2""G{1&Ww:e"]ѲsA=Z~}S Hc*ibzmyؑEURrC^kc>]/jl._ΐ̽Aga_Ӝ~\ի2X=#MyFÑbP`yGݓ/= ںObjU< 3hqXQ5U84[W/5!ؤ胺?zx˯F^! byH"Y0n*@ 5!1ˑ% #af Va^Yp()P} fY_Cb^Xy6as$\ dF) ) ϜpWH8N+j/Jux}BG5} Hendstream endobj 143 0 obj 2984 endobj 147 0 obj <> stream x]YqN^o %y?o97ЙDfzP&ʹK4WݳT,n 4]]]{UAt _/ qxy x+ DrKyl p/.O:X鏿ga\d' S@*9=Kw'mg<4DIwW݃c:$pL살pտ~{R |o3Q=;Lǟҳ&%AFS M_OsE) @QHeO> V T|8)>J8 i:m"TXy8|=v8 EuU:p\חZvVcmTޏ`D4ˆS嫼ez4%YEki* YlAl@=Rl!-Fk7d'JĞQ!CO>M(<%82Jb &Bt QBSa;~tB fxpʯ2PW4%wHV{3kmqܙ­S\DGxDPO[߾cc,KoB;dT:+yҢ>K~]*Yå5`V/>O}9kmQ9p{8N4>!=5=;35'NČtnCȇ,xa~Lm@( Lh@ɒyuzuĮFIjRUm [8AO\Bxˆ ٠ Quڀ48Y7 `l B颔(\ >a`31-焺hߠ[L'7) 6eXKGzrz#t=֫̍ "L=N45/|~.rD 7MÈhI$nS Έ!}^ GZ?{.54,[!.w7r>A׊hnvlMOkBVx %dah?0U|bUKe!6)v$xh:m ¿\kQz: &7> J|O$E碥pVҒC\2ిyHP%gdp$U:`?/!EIZƴ(6^'(zfIM=ٖ93S+tegǥ8*0aNRp]2\HMn/?˾jpEzFd8pNéL;׆z3NpW4 y"thE_LQ1c̣mt-D m%ԪHq kT/`~ `YLAO.M(qT0Cck Cz^C͗VW_|3GIY.s/fZ3;U$UjKqx .0'[RXش=e~h%#t&>f+Hmswi4j>_[ /oΚ!uqY=$]I ݩ0|ɒt U\p.gwͨw]1:C'BD9cK(Zd >]` &q=JOslDe% 4PȜԝТ͇P: ea֔!TLh 15Ew1@Q%]DG1?Wdoďߴ, 3^ Q$!s­J f9toW‘{$b JUgG6ߔ sf^דF/IhU&Wj:L3+:;SqΔ˚P!v ZTfRɹZ.DF< M^M(ڠi&C<5/:T`WQzJDd͜%VԦvd|*DϰOX#BS:`D5;˧q@^v0P]mbyb>v^|H䋁nTM SaJ|eIԏ`h~UOȇ?+6ŧ [@Rn\*E ;Loؘ+@Pb+@?0QtI(|_>O%@Q\_RlyJZMv7ۺ f0|^Qjey^OktFWzǛ@[{ 7,8mTͫ(6;jnU[w'SJ-RKFi pGCx$ #S;ҪpuLWYVEg;<̵J,V["phiLPc4dKE`WkĴwϪ.`.mу˳K%TBef ǕMrbe=󻵟n΢ϳ B˥zȭ3Ḿ~y-R!_]j;sfۇf/'y6tz|'uek~oyd`EQ M@cmFa12NE΅xvd55j}]^sn 07([db' cJNwtIFdlTJe]EͨgAȼB!v;9U@L茊qx4yLh" \z-=ȡ1Լ.[@k|Fa6' e?ȃ)ku1]xjA__f]#Z_ۘ:U6bupvU٘` Krؓ!3iaa[d+J|(CGm;[BT6c%MFN,luc)X4jab43ަq- ihqċv=BPeG8MJO4KxTmfk;VS~nu6[^aB|j0O9e Ixendstream endobj 148 0 obj 5570 endobj 156 0 obj <> stream x]IGCx;AK̉ KX6 KAzYˬ̪8 |P&+oޒ_^A^ o'?zz'2j˫On@٫8DIR^Iz^_ݾ|`&柦s4F>KFC'1G\` u9}𙶭e«C1n6>Ql A;;Zqlh3`HIG)Cqʩ'XUG+(+ʹr!:нIuښ?F\,dNӤN)qfOvyx~lMH!.uAk=S+/>tMRo!F ZE/.H3tѪϮ5L0u~XVTr32,WT58}Sj=x~bd&$MFl4qiE@-g㯹F4yEOO U/4^BBҎ $Pk'72/V95OI*i\$hl̮.8 ZL Ebv/6ԡ3Z̡aT P}Pq5G_Ev#yIpf r.Y {ǔ8ӫ-NĂ(`w6KhD7He\"شh=|MY$ iJ46 WIVx<rٳkb1ea9%SULii % $޳A{TY*B<%U>vPАy|A̩P|ߞ=jЭU4# MΥ8ԉ=YpYwu<uć1FdvʎތIO"P5+߆rENEWH5;&=Z=R[b(o&$YR-$L{,ٯ$ (!i"+VXo޶`3P 3j})OSG\w4QħJD$.N&hmi:Tk0ݩfυvL743s((Y ѹ!`Q҅Ba~nF?le#_oT 4ad.wst]3nrzzҧ/CeemϮJ(_oiu|lT`K5&WOFDuIըn.NWXĀR.z}gHĖf-=A5 /ӈ;1m.3 P،ԍ,uF~+ƘVp |m-14eʨ}.j/vz؟&֣کx< =7%}Ci:apB/wY'XOβ_,6$ caCZجCZSc iQiS")vaG } YW?[/g+DUD8kdR|ےffnaБC۩C%݂|6I75%12Kg~TWgmxӄRdrSH*X %{gE/aV܇'an&EittJ'K^nn>i^sR~iL5N5c+S55XҼ9\ xMsuM$"(Q5=Ws5Dι#$.!% Τ*e7DUM4QrDQLܖ0!VEtaѫ}7xLWӼMU|QP8]y,i'OP2?uHz#ܿc\b=)=q,,c#!RV:x([66SY7ə43yb7D(*XL.qe9C?9,;5!vksGr #tј[s2 '|p))#+3lr:>k_~j\!zWҽ*+8ι{ N/ &Kav=&[XR#\^ϯH7hld'{?\e`-98ND C9=p.:){.hچ ܑJ'b C0")זS谕J?Z Sa; DNW.弳N5Pʀ/[]Dx:rEy6WA 2&H5[)ҏE>n%ͭ/II%( pʂMF4F=/!ԣ+5zX=L4@*t}d' ӯӺKM+mY1՟98h8xIՍJ/N>GCշwoa@GuPܾI{B2?4$㹕1Yٌ먻OVkd n&aHy(Lendstream endobj 157 0 obj 5124 endobj 161 0 obj <> stream x]Iq &tӪ}(Q:DdъB4Z:_*Z%MH0M~FbjpQE(.JD @{0)=O秵71uc{E"&haAীgJ4MA&S7̇h50_-pewf{ 0ol6il{HM{6IMfÐJf&Oc[!])kkl]P8uvuBMx:0`SkL ~5y,NFjD6\][iZ~-\R.iْ9%f d$e#u&O]]p٪!K([BJ7iKv7xr޷n^"TDEvJx :!%cT2%H`Ի%c/*Z\z-PB!-`g@yNunjQ&i;CKj;1FX8j8q;jL!,DDH Kr/'*Jw "9 3'9WK#zy!@LL::p=$=uҦ19ZK̚+2kGi@Zh (&x%V~$ɘ_k0B9Ugbb?6c,xa4Jm*ŀ YhAь~sFbT*V7ChA]3Y ozdr@TEUE0:^N)r>{J &H)&Ǖ*'0~84&$x' oV`^J;?|hbtD2E4"(VP(y3A jjZ>@+nʆ : NI+cFHd.#YYwV֪C[ 6Pvk,n_٘Ʃ1N/BC%EJݩ*|9wipfu}(?9Xc 0@QȊF ]ZM˰0F|w`d*-ZMqNV<'$8؞^#$025EXҰ(-E `鋃I 4xҫáP pf#nƻ3\aNY&M̈\~R1NC,T6$+8@Ӫ>Pn^Ƚ}twzw8bn{?X\=-ֆZ]QX TY$!y:9}qJ+VUBk etKl=*E)j Xf@JUi Hf i_?=R(BaM1ܚj=杴?Y(`s39l^gTG‚ـ_%O\Iȭ0q: r2`FK|5sK\N$A<Β؉[WTځ/4&!Ϥ1hAvAnCr*)i . ہ!ʮg~vU Qz4Xɀ\`` +{{(R Bdm[L)Y 8zmB˳NAm$d%̱/ɭ7 wAy (M6uY;aL +'ӌRx<)Q,mzIP`ײlM<"1,@!AR7 ܜgZ52kj78;1:՜p{xS6"qqBHW0iA!UYt'v]ʃHޗ),soQ~c3&Ҧ07R3 ]QJ}@ZN0ۏ $JHd@JWV )LZ9d h{i8Q7+Aa ̭rD@}J=&zۻG6CoWW8 a P "`?;mb>UaD|pDE4ǮyaVͲn' OIiLlY{E7Y`) cYUltXxtX78G:aY0PN ΞP :K3=skPz$G15(yؖ1 ! =fM(Y<3BKbhZۍ"K$§63=azIz%yz7yhS[cϡ=Nf pGrH+3Aus9Fvl=q,pt,;ݙzJ]~fCctF7"~CISF t1J׸GhE5od_y2*7<-va +Đ;7-|u_x!?$lCWQэB F;%1eK<Xo$wvytw}"Tˣܑ=_5nL/A0Wg®*h l,6ʼQvp>q~@5ӹH6XM0 wQx!LC{A&)=qRi ?9O -B&7/PgUlCy;ǭVo[E+ ǀFXbFFvѤs[u}3 h* Hta H`6!N#%50<Ҭ],tH(Ff/cn[%jw/TMErrbS:ktHwF&n#wc!{e/nGdu[u󲒓ڢY&0Hj[[̜ ?4L|<: 8@E+nY#N5RB199o;ክ(\Ʈhv^Jz޺) a_s\͜7>=$Z6R4u3PNf:Q6MrD}>BdtRߤ.6^:x0)e u_0>V'ÛZn{{'}tgܿ˟._H8^j%-n} UgCDBVx D. (Ƥx;8 52הmz5ɨK8#DRAy2R'oMJoI9 'ò8.L>[|B3YZ7׌ qe}X??NEyƅMRpm*X[Vu`,HޓfCX0BC6E" ںrp༆>4fCT}A8zknȤ$FdLLv xfZ}\1}VYn(5;]!F[T( |WPOSu[{!6_\.6ҥL*F/p+VkDވrmϡ >Wnm̦z 0lWUûYK7F:gY$)KY7됲l-N)zx+כA稌w ^i.( v1Ѡ;3a8fqpV7g*IzOwdmpڪv 0۝9gUfT,ܱBfti(o[Ehۧ c ]BeP.]A+;xh\u,^@nf%mWx\wx38=MQݍ.բN ҡqlq]]rcaa* &bm27;-ɒ3y5jwE= z Rr>o3i-0Pw@!t<8BGٿ0IVt-;0`Ằk8^$,W-nW_TEDf@E>h0*P !%t>ڊt]b IGLfR6gs:J%;Oy+QF$j= kFeFVX?\&[?#%tԨ\J #+.Ll3POWRygO֟ا\lѕeWH2m7u]=_Fٛ⹐@6q1QfKe_)A+B[nΠ(| 70nQs'Ew\L-N,hq4A-ВigU'phm{:)l yA:] C 3kU\c̸Z{&/ij_EfN}54Zv颐'(E:#U܏Wo5rCry-w9j0 tR"*jѶş+U^=6`>PQތtXLlΧ%c=\FF\J_lr?HOEÎx]0BH CZVGih,P¼g2E- s/걁Rn |zw\W{,^*G̺Hl#'( !bHjKED w>&K w7ro|ݩmNqf?RazIE^@4UkLXfBYjt믧x@ޡ־~a_əxV,pxU.w.E nz֌B҆-̇6x3G=Oc?n[][l|_3dsكK|ivhl)3Դ8/;GlHIԏzzSbVб2J9t9Vb3@WpRN,>5EL̼{8x ]pvk}̃m-eG+p+y~\`'u78^meOKjϠ:մc)b^՜UqNv@pcW {sVu‹;G ; D6X@YX_2"J#ѩE݋=&^+]7nvцզQ2y8CEDZO(ҷLM"x]9P<4CCcN'yrnWfUsYR85F%jcj Z"_+KNNI;tE4s56{?E֍l9ws:!Oq9>xRo˱w o5[[g]k'LӍ]n}G=,R3ZTLՄ ̰W`}='w?#I'{EwoE$(, D ݡZ`/S7hIJG n^vTO_zjyFMLQL='}c8F*L }yM0&% *6B]ԥd?ݓ\?Qendstream endobj 162 0 obj 7711 endobj 166 0 obj <> stream x=ْ]qy S~s}I*#NR4%E.h_n砱9t08X}wby~ q xYOoҗqN9sy")/[k__<ŕ1ZVxx~" Wx7Nxp{Z{Or;{o4~YA!ѱ_(0{4 L aT}p?w+)S:%*-Ovѭ/~'Hӻn-*jWkߗ$.ؠw !rh^D4EMCP%c(gWvSD7|G70N|<JZA~b1~b ؉=q/ѨeHct.-w}"q{rI)(t|W"Ӻgg ;];(g J2(8'g5a.ƕ:K >ʋPMhHҹA>.)b22T?F $r"fX< :9m;2 @r|SYP K+Qu (4tF8LM6I&,X2@mNrzp* Obcc:lLw$ql~}P'ğFI8?]@jYvd>bڮtdqtm=qBFDIؔNd_686cO.:5?x3""|ki1AMkmŢ; 8iY;`A=O+:EE&k-Z}nDiXU815A;RDVǟץ)l!*CH wrYZv!t=l{zmak KuhRkeWx%sy0Tup(hmd sU_ϟ |9tM/{|8b]EzTNvJNӀ{$l52c3 wJ8bkW S.Uz4ސUi٤QtI("*ɛ|hfPUPͪ'2EpՈM.#Sd ˡv j]9lr:yl]x'tLo Cy2Mdp~TLqQ%`5,N?)J,"~ 2lj`wtmQ &v}6>)1j&${wW-kr͗ z):VFvw@o BSA+2` Q|mr? hc לPUUbhhlLz] ';n^J-C%Y,-.܉^dmWUrSUfU8e+z$k$A L) ψN(Wށ>emZܾV)ݢzš4w띧Jxӭ9c"[&B}*Ywʹ\p kP^vt_w$'S%i=έy W,} -^mPBPɡ`2fPc*^e92s#;(!˫H*,p (.IIh1Bz~I`nV}kZ2P s@1D~ow!mmƓ,;`33z =;ÙO/I{E)-qJռ.bFѠs0EU &F+!pX37KLgb?=?^{g6 =1~"%EQ\ZE c,54)2@_ tW@ j'1dumSHWBf0{ pB1j=0!v3@FVY"^%DQن.FMNʫSJqgy/xiۈ&w:ٗ aR]E*m~.><.,T/iiW%3 7qvfcw)l-SKU( ϯJm !&&\t,hfyD#O;'΁VB -=4kTډ~zBK'x^tsH9Z{ @~percz U[\с{:e#9& X0@'rLK-@ZŰKЁ)Zfi1lo@yfz ,Uwz3HP#QQ% TIzm+u)BZw!Bs4 t՞3{([|_QșxwǩbQ5e |ƀL+9 e><]Sfh\.QMAZͷ碪9 XQ\Y'% X9s\poX x+h@+M4Am\}Ѧ;`Z|Q,HC5=})ЅuG^89hbDT _-ps50CXb@*m9+(`3 0w#MD&ꪜXN3]6Lwao: Ddu@-/$2ыI<)BkC Rk c)y Y7Ce\mF@Jq!ކN""b:BpG?Ca#7Od,c!Ļ1_.̅}|PIL]D.( IZIɊk$&#<GmK&]]tufbR#-δ?XoL+p{7n 7<-ĐD?",ybc([**SG.+Fҗ7Ի-:WȹNH󅩫xHJf<В!l2Im:;)xEތaI* XaԒem%F=⧦сdOI)ym=>!AOö3ii^aP0+A(/X@0~ňirOb$9 Z`b{ș֋:Aw$OG¨NM-F B, 5Q{1b`C&Vs8%֋q$͓bJnO HϓNn œn{%QfPt7eZvrΖab+bgRwU 1*0,4R5Ħ+)v]sl[q#??YiMmlW3A܏D/jblUT(&pqZǽCBZ(S=7q9#u臣;'s;Mc$۬䈰h7aP5U2RÝ wT׹8`TbǞ?uhP(qW!{=#gHh-3?HC_قt!T\pHrsNa]eh|uIwUƛJr\[rԣdXu@p+^mYw`Os%K k{.$t ^6QZ!7mZжWT-Irw!ty9}Vcd!*+1u&d'5sQB(s#tluv\CihaGĴI3;Ovl7| !i'd}P&IkyP>>h5)j2a ~z( \ /'UPvLR 4gMkQxSLw W.?ybܜϥxvUukXMrQz,ùmWXmd8zTpĺ+h|^jE1BoHjaE*&~xFbΡK)ZN hM aR$nx"ݧU+Ɲ`!/8Ĕ6%WR up~2˵r;\ʫ u55V =crΑeаl˶ȴUϲ3s8 v-Bӊё҅'%/LKg݋L 4_ :W5Qk Ms8Up=ο_W!*pd'u:m|ȉdjuP6RT]'uZDsF59z&6? Ty t,&-}V7մ{XQZHYL_!ըҮO } 3wSk:9߀h==랾Y8ܱS *7C*pbHa-T|5"3,FfiVdRV.RkU˴x$eV­3F[kX0Z rbcQY9J"?|;oB GE2v=P#[E*smG^5QtNc2D޼ %}W K-]1\H2XE(}c*Mrrcx93?@R(ox~$IRJ9qq| O0P߇hWgcPSL %~8(ut϶DcdԜu1X.{ju36 Z;$^,A5>5PLֲQҒ\w4dUN;D]czi0JmXq\0rc 5}y2m9իPYp'*䳈ro\+%`bϏtQc봅TV0,9 AuX&r])a/ >Gtu^r&<^< zH2BǺ]PA`Ğv3l';1O E*FJpEFjX֗1mj&AdbA }:r VX-{,Ds ?be2ؓ+kG'ߡ'>ZY=G7+@"C+/Ś .1݄R.7yJjn.~}aa/v!.ՋחZc<;෗˟ `7a]G9`@\UkO+hbգuzFc߂TG&Jܣ@srDFfVWl'n.o5lGwn./PZ@Z~X`_]Ŀc/f N=kn#)<J^q E:}%x4=PNOZ:TO|:3]ןBW[kg_]'r:§ԟj-͝k7r].EsK/T`74DDn^;_>c[vK;wrx+ڨ;8p Uo^1/gQJ_3b4<'a9ˢ >e\[ַ٬_ta2]h)Db&)WL gkihjk$y- wUs+_d1ˆl*ḋAn^Xt}pƚKB6I' ]iA> stream x=Yq~f}NyM   V ZNKDkxWULW_3-O=}T}w$.f'呻x|w" Tb ƈ܋o o'̅u .'e?M[ g;\򹺼BӃf][ ;O/DhN?O Ë7jqJ9;yaOo৘qE|[O7;y|Kڠ«eIz 6Z9,SZ,6 qX_:Vu8@?iEpCR])Xi5ݐS;9=YNmanidmZn9x᧍21&hڈf~(2Z)ln6؉9ݯRIfe$L,{yÖaC՜K`!k0aV|u8 uqJIot캸/{UZ 6Kc" 8Q@p55moظU 6g&9Zd31s$@OlBVz.h95ߜM/W P;>?!nᡂKڍш@z bwq-:=2>dzM'QMyr-KIzCT#cYb&]= Żx/3{ w'uAcAh!ANlSF\f2Woث5ӤA4 /I"&0`'0j T|!5^7X pAB`%7fлhj̚DDXCD a`AG1e؝zK%mQ%J6>a$FS՗ Ѩד)#'!.k]* t 7\bwb (WEA^*t" <m^+V1{LL\m^e).VWh Е ;RjL&je ]eGRݙaY7T'9xI.(h]]YxI +5QF|˩&e 2VSk4oq4Hnd1mcEP$A"DUɇ7Im˸Iz ]* 2i|ٹpQ ; n Y8]Sprt.2w#ew=iGGRŭvX԰?qsrf7:7TojlhƂ#&SDSԣ,N\, &^:3߆hIgkgC{RgvԼ*WM׍"0ܱlmDN18PD#rϑCyW'ԘT2gqf$p!{LU52MۛWkS^$Yfq^ŧk"KN_q4ĭ0f*A-S˜r2.|=j=[P \I}e~0||.?} WBNjĵOm_xv=r{Gx4C uQ25i$̦H(׆ϯ#D\X=F3s5]m{>MQF$. (Z6ry &ڞL5h܂bX{a1!4y?FY}ПMUrfY 3)D5^u ?feM Ĝ o}9i phbx,EA/NhHdO\N\Ū :~ YZ?zS/!0<%e{9@ZصHM.- xO`Vuh9L$ZT-!;IqR1Z#:ă:^R,AS +晼sC+.gO[ZD*8L^X0'4aE[UdvddLF]',fA/6\9ˁ$+݂ >Euj a7lm}5ieGl r:jũkp# +\mYi0ݴFM&yHIU-$i %z9x5 bC/1jJD:`30[ސgyK.V&o*vB; <0&uLcܱ-nhfb"j'ՄnΛq0X>_Dt?\/ȚI4`̲4y̓$F+ DK`FsYZ ? Q;p 2x1qA˩0""lzIw,#e*,ő+npLKe[zv&$p ف ASC[@GuY۬fo 0c\pr#}*SnfVʙw R})YQʎأ[$%IPL̼"L~Vn@"̎- &LҪAKW4j@nIƿ9W5Y*]^RvX{Nz<-z{XKca^b^AO(Wk0+k`Ut桇9P ,Nuu hr9Dm1oӡ`'kQNҖpx1A#3}>pYq[biJY8|SjONGT*;J O&6a=)ڒK*n9~:} W@.W!^eTgaM(h*D%VùLʣiscnԨ㬟I[}h3 }@hD#e4F:(AuQP+?-c <<$ N%N*%W{ TSrbbh0v|V.0ېn?O{Ehނ+ÛXiN֓C,ӽ4c˓Q%^9D`[@sƊ 5, ]庶ʔ$e3qQo_ -KQs=Jrny&mg24aKY2s߬~7'| 0֏~1{;5Q4|:(p{~50}#jB蕨 j9jZ&Jhؑf$8t5ie*++qNa\Lj-Kzwjz︇)Y6D Ð wTT,Lܩw^4ZޖTjObGgSyea#v|wuUfG)~S^u8@B\jG}m/OQo|Acε9QFYVW>(>xX.b3vZڑۉ=4K!tvyEBX&MbxJ!L]o8/y!u.6f]I[n/*7N.C_JQE۔65TK¦ B(aYɬXXk\Sdjqp I}\XuQR<Fa:fVayq&a16׵ vawΉTɗ烣z_FC#u݇L|VCNf-Hz7mHG5W=/ەuoSX nQ[|,֔ri:Hۅt<[83]A__m~է^cUG.#g')'Wz^]m 3H=j̶8kBuɹF^ζa)^6ц+yѮFy-CΝzX\f }qbDji9,I@oPC9ҡ@DRxsbқ%J,,Rqfn#]Թ8Q:<3㭎:<=ӆH~t"1W S&Ρ^S{hs[LsmgiŖv5hmm,۴znN3nZ?Ε6N˜fkxxS)0?y:I ֝HrS {`5<ɼ`L~nGXRonG~O|Hk;] AJk<tOss_[g#L5DÏХ $61#ts ض1iRp-G3Q!aUe6NT%kF~hA_غ"8ҍ ŻCp"Y.j۠M/ ú}m*pľd? E|5[h(=uM$^BכoEXAu>ր h*I2F LSli#pz1vMC4Ϻ](),~rXuW AܮMQ-qw2$|*2|"}}Q5&TM8QUp?2|~{5G1wA]ywSsiH.#odԬn/Lo('ntmT$VFSȵ ;M9WAwCw l}6$ ްH$vѿNҰFϔ*|Kd#3 aTD_A/֕Z( @|Pհ5&YD1Cd٥y,kt;t a37Q ԁƫKvmRe:`]Q>fniԃN`:8W3~imMSsd&Lf^NUxl 񺞦SL!  uc|躀_}5tW~ u6;6~~+ABvT9ݴ:fZ8'yu\2+1qCRϒ HS&ƇրIdc?1 qoLF T\Xl›4UT86޳tmOP]]wM^b"a+t]m|l|lWPVeRwy 8 za?|O?;{endstream endobj 172 0 obj 7402 endobj 178 0 obj <> stream x]˖PjYf|,#h#{AlE 3Hd=G A$7".6bA?z/GbW'WFA6W//&Azq^Oz뭹W>j跑R*3D\'h跲K}:0&S^\jo' IB: }&]0m_39(X켷C\Y- .zG]fp:l7v>Gj8B83U[g y{Tl?J5lߤ/*_>-|3wZ:j:oş~K۬6qN9C۬\/~ڈIS59bpIoS sW% And՟bctcuiuz`V5Z%| !gys)QHh!XP GX`TjE{H zYՍ@_ܸrPD>囬g£ύҺe,c!zW8?)KJVX5BBY%ID1 XΧp Er2$~O$AjJ]D}Vu,sqXV2r4Jf$Uz&C&U0R>Q8 N Qh_!gն7 ᘕJ7+W4}T^)S=)DOpcT/NA}ֈxZ:h0W熄W;RJ/(׺\ZKa3֬t|\wt"ڴw\و ,AkFiEwNKsң,q1io ޒT%X5M_dz>X,7 J }k([ Y1 R@cqU`#տ]Lf:㙌i&qQ;K&)~y77{_9WX#_Ue6'y6_΢6`*@&E" {u(3䓑&9"_ށ% o7&*$n3 \(Kx2^g{ه2'b._\p KDYֽJDE-gFe+p#p@csn,w1Fy{Y1iaUU\eyȬg";`u4Fmb7 ц}mɋ֣ <!NFW|ֈȗ;gN>n)LX&?.4D[4a(q^-FL¦#,q;L ߳+C 9X/kֈK_Lλ' QC(ԉ*I/ZaHM#%CpNKXD\@X!Ȳ_S's({_KWl(JiL"ҌDݯhot`93̥l,&+5W;{+si&( ;5ul5>oә3gNwq K/5ZD>&L'Zji`|B{;Oŋsȃ8cte1 ~Q!dM]GH?_kjP7"5unh1'[5B^-:CTL9늉*Ȃ d:|z%Vꄎpgi5YN#udh  `q9Eм9KiO$јOW9m.Wib̡ɴ vf=4+|tqѦ~-`8b{: <ԓ dpZa*5&XWmX"`;t`_VO peœWY;N؇^/q&N`D{ ]W@1L\.!ѩ ;`nO9k"I7ɦ|N:' ~i GO!bgM6c$+ULwP7yb9wt`c\aJl+I<"vf|UDDy%[tg쿖&4K o$`bx*u!r^qx\pL;Ǵg_V6~@dk 69.Shs]F軸ةNCF1P ?;Ž}<?_ћfF[-.LT4#-S^klՅwVQ}KlCzgvtbئݮ#깕urE;T]d:N3>GQ%[^li\@>J %LJ[̩Rg'/EWM}GYE/ /-Ѐ?}x)p'S NWx]C r %> NA֍2o|rѯXڔGM-)`!Ϧ0LxYE Rz q #, ͽ U{-V%%,yp6e |m&!Ǹnq.n" &2(c)-C85c'gV^Mc.$~ۖ uD)ŸxI@-{*{іCY>B=wl`?9C#=y (M'(ͥL1Vy˸Jk-W CDCr_<d8F3s5*tFv0:㇐DKwau~㌏Eș^LuuP^f)|r:"N/[]^6ZF78hz9b2J#{j%4aؒfC2c/~^Do381,P9H7jBK;YqjF< 6ي{!oRHؚ5koҝpӜ~ea"ۣ-]_ jO#^f?k;i<@ې_J$z@d-YE%\/&Te_R0'$9@N_v"ծ@7E{ *ES>EB~:23Bπ|auȧ 2hooq/1pcR}rMq&aFP}AmxG4(R|LC[Oϻ`| +&Akk1 GaBjJ8fL a6'[x۠;P@ČfbtpmO^?5EH:橷O /;%j6{+Z^ mjXSd"znK55Ёcz!,Y3`vvȖ'-`za62؝XuT^痣Zjt}qʇ4t# 9nb"ve0o> stream x]I%>֎7k]־}l`33 0ӳ`ffRRUTo SKITa%:_џӋ#zzÑL??g/V@USάNr\']9^8z蔐c5ZtQ z}V4JM>sz*'\.z,gmg+9_>^H儊yL%ә^TσlNʩ<lY8Kzk:1~:>~1|_8>;B|0xx1WcB\08ńwz7q}:mzq@/ X;%T>2a52V$# tXwt1[OX{1JlcEOi~hY -ANU6`T-q~k'ՀG7v1NZ՟e@UL(HDObuPiD E=B&(SxH"QSe:NeA 9]D+B$s`0|™]U$0Vn,ctLC삌=){RB~SNxǁCHaG+%*Ű~2 U&SK}Ti I괆d-q>NK!0^֪=G^Og Ɉ@LOZEI:13کjLm8%1࿌#d*$3ʯA .I$2 +"AYa'XؒUgP,rY3E8h'9k73Z.l#-y68}[a­yjzϸjvᝁQ V/3ZtsGN}Vo%,4+d\gT꼹 pv2F*F֡q9Jۑŀ Xl2z:1+#v&3+XDn$ fZ`'Iē~W9 c&fØla# ~~ynUn-\T¦& +5(o^aɘ`A@¤L*bA1, ^IYRBՃ#+0]î(Z6]mq BUanjةԁō{8:0>r355R qV/{ S8O0{^5 ƭu8HAN឴RH߃Z؅oN3)j3VWP>D*1S"*cYHf%;5&y 'fTȄd.?N*edoy[1 3: #wa|7KRe^ێpݨPT%/Qht+j>o{x UrO"hvq$B)=uYBfK>orw2.nKZKLYNhVk(&-*3@L&W1!LW HC&%4 2.lPzXPwz0cLzғΞ܇N(_ٖVI }{)/9vMKTxJU։sPNl~9lZ܂>r><RN6]]s;:_2֩ :֭?9I2ti8bĝEdp$2OI+h!%݃gIqIbKMƬI-8/y y^l TUҿgaJ UVwcWMiEG><ӌ:rIr>j(煮O*Ұ*| D>8# 3tN())zHzjhBw 8u`r%zRօ&)šylICGx+cgҌ C{kC?0fk:HC$gdw= 5uR3`wy \zp ~M~9l۬5v,Xb Un"ՍFNl])tƻ*(NWŬ\ (ÊBfAvFhk93ï.bJJHXcV):1tÄ=J'3Μ~bgR~t5JMģc}RH% ]&2qeƐ{:)LM'EI)IR2S֌v` ܁ԧ_ mCϼ(7 -er]-;"ې5̡}scw50m0k6 +aT{^nur&;Vn`V^9C[Uo!pksa3CE7`ӫHw_](fl;1&&[7:"Ðel&|{=q5`-tl槳w-3c+P.7d{Ν @䩕=ϗ7zae&uB8ArZTԡҶL3Fӯf:q_Y6%񊿢dT \)PMNͷ/ކ?Axѩz'Df}iUʍ/l5C{>,qqw8r5\|96!?z6RҨe/*>.Uj)2ޭ+kc6Bܽ-l*¦{3.޻s 3w`~GHs[=;Exo6B #$~r6DTqߨ-4b_XhDM[7M<8q.qҖXG(s5,({Rd‚v2!8nKFZz\'d;pYn+a5;o+);%>'-mESK6`x\fiqٗrV~SRSaKl`}ݛu(u%.\,2)}P`Ѧq_SiaVwP=Kο{Tl*F*}t^ڶ/.,X{rvG:d8OPJT ̈>8Pk7gw3$[siW/v[aGPH>9 ]YE]fHC|`O'IyO&tR4Q\ybI6t WtL 2QA}\Q_Җ/>O-ُ2mvl_ޠ-;)rmKg: `]3I]" ~̿ %. +BA,_bA|k5";!}4 jD9e: GSMMs}|8RĢ5zb-/ `?o/CՊcX0DcsJyQOS%%v Ǽ|(B/GQ)TR >z+yy۠Wj -KVPnmP֨0½endstream endobj 184 0 obj 4618 endobj 188 0 obj <> stream x]Ks3bˊwb/qhI)$јp;@  H6~/ޜ}߼p&7~:S鏛׋7ǗXA&˳'5֛7gB q=hlߝ_(2(\ AZ}O5 AҷZh\LW^YݵfATv֑Z3Zoajm 6xNͷI+Ɵ& :ي+Dɲjn䃨Iʿ.o|0"X7* O~‚ΘퟰUŖ.}=KLJ?~Wn5>K;࠹!AI"Y:萧ʠHRzvf&,+!'+V`sۛ  whͬ1< ªGe !YK'H7X#YlZ.kHP>lsnPL yk/DeqIAo 9s6B>\&їU e6Ju_喙BsMc Oz_WA =R_R"gM1 ) GIr[pd7cWxetr GoТp~xש6VA]Y#oǻiK̪|e%:"g&FgH5poBԲG)OǣvCgHhӦQ^ͫ קSԣxþ=6rڼ|_V]T$u (K+[WZCCލ2`Sk|@{`jҡ&_lho542$d>XBCi%0 Bp;Y~ZcbgvHQ7`-j\ؖ!pp Zt&Ɂ `[O*X zN&X^%|Dkzz\B( F`*fqwy ~H*uOK`=U¿%PEyS;k@* &,:w !/φ=/Bǚ>qH0WoRC9';Xklv1\8i{8 Q&s ]=&*AS+67k \|_ԢcP(f9|~ޕF}4Z"3a H C`̌;VFGF= EzDŠ;oUc#E 3fYM~ B$Q [zM9ڧt} p@N2ٗ:ZljkU3pNjw|ځq \I{9[ |tq5(_RI"4uAmw&D'B,BX? PJJwI5U4 tGJ }{Vq4c30QM@9,2ƻ؅6!XI Q'*MM0CAPIx$}VWդP*fw[D3BBJQyЇ9rr&Nvq <7f9|_Y5[>cS&_<~\G/Y,5e1kUC's-c8ȼk? S(_n0{fV5ʂ{q$C.깵kI=Uk8ܺEJUmK2>Kv0-kH}׽:ޓ PnƯ~ U|/Y<7Y^P_c<.y_rd|rbdMW AeB9XםlE6b#4xdK\!vO}2vN/٧mS,vH'σhNmu3z .+|'?`lskd w;;O֧7Zo23.Ak?zMmd$>'~hq`Ao_yئʦ_*+Db@F}ɬU?R'g_' endstream endobj 189 0 obj 3950 endobj 193 0 obj <> stream x\Y~J7#Y%h +JJ.\Au;i\K$WTzXhc38_{qu={ ?}|⇧gHݩgNo)0nݩgW'}=_hQj9"vOR Oơ7NΆgūaxs Ov>!ϗ9O(duB!?=3ݙ/8+9{>)%Mx4\ƱᖛcYIi-/CF{?{0<}6_Hbbi׊ ;{r׎cX  )xIնH%a:E6-er#t/nFڈzRV^1dFJfs?{7׊i)=Y>/٫d Ȇ4Oy# ] |HSkǢ4:I6Z wD DDͅ9f;kޒۣW>-:&N@ҕrӻJZ } mLxFnø'3FNngQHs^A),{3)DLy#qYr\RK.ǎvzo\`^ko̰`L=[TRE9p KCY; wj[x.r$.ȝ@'|Bd>H냀 KcE2\$]˼k-TxyhJѦ:HPcFD!tb@2 Lp #%TA\3*H=5#n%f ke9'$m KN!֎ިx&rGW7+aH?TQ?ԑD[)Q T{ƭiQ,uEsmn\ o46q^B*_n&$zz$xG?~F<$ud8vEgi=G:==˹ԓp#)}+:c{sqs7cDޛc1ofu<ϴ?dBż%Qe™ 0%j<+e;(%Qr +qb] *u}%x^`+$ZIz=tB-C5!*L;Dq;hK#CX&UM0o mYaGL"YljaøL312$7ACJMhp5n-ZB)<~: 4M BE>s\PkXy5]%%Q<. [&/=+vPkmm %(%X|xƝ*5SȐ\[i#>t bOeJeufzhM&K|<% [KQV,?Y;6)aWRLwŮ9S$ys`Ȃ 9U}4  Z/vKi?k.וU- Yv Y_m۳lf4(ӮT,g5}ZwJb @ 1G(:^^ۍw0+ٷO37r##vTlen /Ǚ:W!p 9}(UҀަ`?JuN%c&Ue%V0 =LkHd]n>D\3U["V<Њ|0coo|<`b7yZ4RuQo70~M*Bޜ<;f C{9Hy%Sb =X ; U8٘Q)MAO+ ﻺ]kC047m> stream x]IwΙsy;ɲىdQ''%IV;W 4f$fV|\ W~=?~͑X=>zu$/WhMtʙG\HoWkԫG?<ވF im\?g~}J X4Z+a 5hh`?!T*Jǩ' \ң 18;f%R(}z5\E]ۉ5CP 8ZȻ{Il 31/idn`=|NFpRBg}W̎Yfv_00w5C4*yCg|b4 lnBigC2JZ>cԜT;dA y~4=IMd7l$ Y&L|ԡr" q.m0u ϊ0n3?QZ4Agt 4"-c xP7UCB_(9\Nu(B L ; -4Q7!"8f|f=C0 y\&dwyw -Qy,*:!Xڇz~{>8z.1w}`V D(p00;#I*Fg&UQ=Nr+P5G= z& @҃ՖW],f\O`VFX[\( ʂEmml2 #ޙN`'Pk%m; yMpz yaX;F=;[x{.#\ll<|m G8yoAg)0'`>OJz DI7%^#G I 9WK2nls4xGp"t0J#$")Ĩ&7w+!x'Mν8)i-FܶMG9INI&!%Akd11^k|53|yCvjp~6$|cڬې 6q4ƩR&F7,E󞜜Oi@tj!xxU<:H`28mq/c.Ξ]nH-k;X'pn$۰_A1w9z3bɆId H<>`cI0eFڵ_k3_׆k0; ;̴lw]GulؑQ ӚO ƕ|K'VbɹM"` ܕz%a4n}cHrLKm\iӌ4ZMziWp"dj-c;<*4VMQSw&x qWFtqEqBjJ&S :-<ٍ ՗["7S ( &w7.JEVTw ;U.3q`>oβ]]!uҾ!t"FybT%Y +JόSn%0.&D}@_[rC:IbK&ELU8{1b zA0Ƅ\B]aJA0N]=[f:+Z W*?)3yKo(\Q{ڞiηy_M'J&T! 8;Y\HNc.DuRQ$Rl5.x~[envP\C&hMɀտSѮWRG~. ;J.A`"əqFh>ZPCEt3nڣLM5W02xI/x)nMnr۹a5m]|! /R㛈e${3LKd JVj1t!\Sa 1sX5S=Ɖ r;R /V.&=.܃@R3 y:icv|۾B#`bJ$:CnW&ؐ{N`!p%#Bd.%u '(.-N֖J r/KpZt߁jA87TzK\y;ӴZ0:jXج&IiRu?ZJi% %8?C\ N auhN]TL"BoT.;џ_Rٙ bCVD -3~Kh|79kKaB=Rzh:Ɛ#Sט ]ÝiΆJ=ɖ SLT'T%en|{bu G [4/wo"|2/7ټp6p?3lԾ]Y,=R]9D:uOVrMYر,ͥem6[ҾD!H^zR ٮVDJؠC٨>G΅7wڨTֿwq1W ;|V`D8ݦEy^ q<rxp ꊦ`7aĘuрީҗ7F=tV<Μe-1Ef_]nn3O=EsxewR0ՠc/~w֥!)-[j ms ޫ< `u9"0K+t0N铤rU >S\Ƌxa1zTUx*!/YG}c?'-7홳 e1I %[Snq'_p|I{09 M`*?*ӲXiG,=6c`i/,(鐮WТSPBtE:!G>K 8'~ַyanf0D.4>rJE#&y:-0 @Ӫcza]Ϛj׮t˪-+4t;?6endstream endobj 199 0 obj 4071 endobj 205 0 obj <> stream x\Ks3bU" sd)rlv *z0VEi> Wb%ic\>g^rf/-V8 k2==|nQVy\>bJ z_:vȯ'i+cǽs2!?GcoGpaʞExV xᖛn,L'RZ˸ /P,T( &mߩk_hNk6m@l_dLF( bs j΀tUqPRuUH-U WoW(%)k `l[B$hL ,Hk::e kf#-W5梾C=J+b Nt"Hb=Z7@C\KA8*|ޑ\hK~lïH ) {:ru(<ǡ;TZYu4 0B$ ^s໬ӻN?yv{ "yڌ.k D|<"Z$`t^%EΑ[ b#&ЙbƎF)0i]hf`y'SҒ(ivCm)FyֹnB%zIO9vש"F&M&%fc4>OFE8 8P4 iPϩ:x"&}|R͘ڣπ/j;@/W L\t i#q yЖ`aVȣXHa#1|HxMJI iވj~!!iݦ_.-5\sQ,oPyȢ2-wgwv` U#E/&$ D\mvSMqwV;om:O,6oUW/: ڹ)ֹm F y$Ȁqoԁv=ւA'EH#1Ho&ݣԲլ2+z=kI BZiVҌC6P42 UᛞZ"QVMm _7SyLS| %}ZSQ.& GE&2ns6)8k\5ԩ">F;??:t%D_~՜A-w}w !Z߆:e֠u)@E  q%D juQnU@h/_N><ɧ〓NTE5*6 R_ח-!6+12#J~R傂2%jAg @z. lĴۙopoVfPmۨ/*4 GIۗ)mjݰT< :ZUV]h!nǒa Wǡ ))\IFZAޜAq+~W9qwk:w+=Ma?r*݇ܘ#RzDG1oP޴eJ[7)kJumdr ,oNKʻR+3m-}O2㍫wϩ?bjNcD;X3g ua'Ϛvڦ pe7M]^H]+h `0\]glx/)g&nM9=fN}p't:td#wƟg)XJ?migW @㦾 #n vV'ez;)w |ra(D>>mUխGCh}V`"+*fܳpдvw8 VO|^pcR/}wzWԤ?Ii5Lȧ>.{XCFPd)rWendstream endobj 206 0 obj 2768 endobj 210 0 obj <> stream x\Ys~T7l;}8y,%e`Ty )RrHQHn`fspT,=p h4Oz_FVNj^BT~.XIhT{H=e\#WWNj_k\+6k\ILUupZza7GlV6ZSO%A;],Ang&rml-h6qC'};cffoIm-ЇQ(퍩?PO mO3,8/7|C. r.߻f*6)gp3ltݿZ?$zaP`>vؔEϕ1ƷJ3.YPdK#LAU BKt"(RC 4%49`Ш}c,WVSqVa]3.eiO[7?wzߖw|>16!D^VFX~XBTZ6cy  04D.4[oCP}?vXrh13qvsc)M UȱWp!cjx\%Lm]Mn?[M+ƄS% r,`~>t.o>a@9`j2Ǿq5ASq`@@xp&i/mP֯{j1QoynK&)"~#bKekMcZdeT;9~CGjLckUvܓ{rK0waI\?rIIæ o#8%=8 -o:gƾFg+Wߨ$_v yM~>RH`los>P $cPfTua.;9Io}2Ip6Ѯ#0©"s*g^ߴ;u7L8N1`aJM ^3r&lOR˔ RQ"u:=9wl<5:i#GʺFfywwz{SB~;D,T^]Vd'w0ʸך}P꾉΂95uúvSnj/GŅ>|YZ;x> 0 [*7ϟ_ lrKX@;K17˭N0(7:Y)+^9f^ڲ3t9~=mtX/::wҷDw9opvP0q$J-I'TBn|l$0ȂYBV9Єs儊S0{Ar6wZA9(˭-r kxf;g2w 0pm3J2Rpn 8lF8Bw|MhUc)ðVK!LnO\ֻe0 "ݚAjC!qbe1 ,d52- KY"&B-ӯd`j) @h<@ӂ)T2eEƽ\+(NR+;` [] W]"EV(x b)LG¶`t%֪ Vn/\,jN$`l a.c{.6HwH `x 8:Tvr ΐ b#.G/ =M!#Ԁ]v ׉7lv+拚U]ƁX6g_HMW74Af rt43S&;Yr2 sHRI HLSZ -$A+cL)9 \wlDƦ7hC:Z<<܎?^i¼ }ұQekaW'U5Ϻ(Q;0{Q%7).x|QVʿa4@%i@g)TiN`q;d/̈́P}/IMZUSkPt;Pvqpk&wmVv4vG Q_aĘNu#5=y dʮH2y2Vݾ;,yȃ%bx9A#Ϙ@}W$'ޟ^niX| cAQtDޣO 7V๵G 52X-p<R4QQRM!%M#:8Lɔl?HhSHUW tʷ,amz%ؑD`wGXDd >߅)40\^,m|d5" 3LR9h=J>:t6ɇdaPŴh?<8g/23&=F)a*ٜOYS sU7t4׌*ի>;x-endstream endobj 211 0 obj 3331 endobj 215 0 obj <> stream xZMsﯘlʃ$ɒ]IE)Z''$W+Zʿ4fgEұ)&QIUFu7?tRP'ӿr߽ { ])gMYI Cu|?By]Pugÿ'eyγw,fTl'*OErw4Pָ:u{1Qjq5?zm4Xȗr[1:Ak+VYiT\䱓^Ni&FyMl鯶 ߿2%sJNOURy&fZdEԑ=>Vf, i𞬂dY"Lo(D\=<iEE|C^i8ƊS9D̮9$`W_Tn nQ>ʹ'8'~LZxM> stream x]K$qۄ#|c]apئ8a$re ݳ;( Hd~냚A:CFM!p|)L:ir^ۓM^:㧷'=>ѳV(d|GMݿ)9}|s<~\J1.[tή Y Gz!mKLLU|{cu 1|Y/ŘOD5^7<`2Pr1v9MK!۰`}{n V5IUy?ӳ&Tk!ORꈻFO096V.`=3dbYC0p91 ):z8>@Y[ JdU\)DhtoD+Q_ݒ˲S; jZ圉jaX3#i2boHrJ!y BJjܹ ^(f٤N0IDnMPLErYbf1& L?rVlI_auo[չu>*{FA 1ZZxp"ox >gzto^ŗ+tvd~,J`WH\#VW/Gj$efNyDm]hzk̷[z21]ຘ}!O$*PS&F]rIZm\X`4O$o'g`fӀ;eNvjh}H9-#Yu$(Pv^ sWc%+>X]4y&C+l'-6+i8&(sUzJC;jAϺ!+!@Ll.UFp[|d1ZNjx |u :%`%Ơ݄M5?2˸#aXS:Jn>eiOze+P{8DHK؝Z(ts2sr _2X ^*0 b ™h/SuI'rmugf;f]@*^,\d/gT':HQ2R(alj9ҳҋ#Hx T;Sk'A@ ޷RO{{qcq>Dw;?Ϟ]5תt+l&I<啳v&aō b97Rz[Eb: T/nܤG:|ބWzo'V)zl`W<0Hvf|/ߞOYL rE51k8٘),{Zb1ǯ9nax8R̲{FB)a^@:3AQPEvF3ZXé旌~u#Tz!OsE糛tW.$ y2^H4;4 5S8\/ ^[s1 \y"s!0I-B`oŻ~Wk(!^lF/_e8Gp)kݸA?%UgV ^Y,zb7dQM!*" T˗Z([k&@ m\0{ݧ^ 4*Q̀QNX9/ҔFC*g_$ʀM՗[mn7A|[a)vP䀋󳔟 'Xƅ;eAg<9?3sc뢁Ef_|;[$9I̵/ V8[Ȥ($roLZumb>zqsyYSf+#nCLEl f/̅|9n)%p{|deVw*[ʙE26N7Nv*z5RB~Q͝J<5,9:.Rd8 ouIO #a2?Lk?o4_ӔsdAH۬T.%2}G `"`"X˘ SDj&rB+"01SsuIkXGم̻2֢Rjv!ul1wa4lCE/.Dνw'YRk5y7 *<ǁ % tCWEeiѥ!9,0Zqʨt ;RsN;qr0?~uk>+&y4(X P|=/K/.܁&*)<ᙦR}鲑Wcz4Sԇ%(ڏhn9|Z`y)\0niˁ_džşpFşZĢ꣝oG 9ԌcFevov`~i:\׊6=۵ӆY.u uQtћuz6@UUW\ܦ; C9Z9ϨaMa\&I Qʣs9[dS{YftE֏Tcx\I2KI3aKHGZŕӑ@ _ m}I.(DnkCޓwy͉* ݨ DZć{"Sa :)Httْ3Ӫ-NG(bRJacCmy"0۰>|ߵ25 #l.],gk7QJ Osњ7ݞ/z=gOW\# :r3})D=f겹]wwqՐWU0-&gځosɽkV{TpGdl}Nw RO]J e.Νx67ߕ(f׳0v Ģs%:l盲ƶa]2KbK}5*$Ve-PJwnTf2sӎYA>; f}0pbl,ox_( ܕlBfÖx⣍OZíΓ'%Qm4;GUի (]K_CjE6:Bm5MLD7bRIЀ uΏ@5l/<L82qcTW=>]$tcdMEJ_9x ՛A^O4373Ne+K8W"{t43O7+o6sM\dXTGno4[Qnn ni+eI ot0ҝȣE93 ⰸ &uY_Y!M~/ᮘ "S#YC-ݲ[ϑޒzUfKo%(¼ز_H4 Nu~Wj<*U;!sQ:' N˹*|"ќmF.aio,3xck_5?RxI͛H,~Yo62]F1PjpA`x}i aO9ӸwǦޒ;Yl7]#ifvf)MR*| o\%F>Qb8EݻrY%F;kbkRh77)鈃w^^o^|2[:hӂk,8,YeߺJryսgw)&1T֞tH(<Ϲ"FCh@q=A%)] YGc},HQ0R$[&A,rLR)939-K4y#zym)2!X4MJlI>jLN67M-9!Iy⒂-s*,p"!M?MR.> stream x]Yq`}u`Zu@(Ě`Xŵ E;+뚞% Ѭ#+/yw&~g׷wxg٣ h 䙟F]|gL3c%g7|8߲Iiټgm0~VJ7If6Z%-6zaI Jnޜ[򛗱sl,%ti7ߓi.Ή繗3"i/d̷+L:|}.8.'8,3J*lt&;4'zCLt6No/vװbwWA';gImVla&Ɩ=4fFH6Lxz=Hy]dӺ#z NdbPT/)&G%t&jFI'lŽZ̤^C{lozp;7Ʈ~SFy^94?W >1#K6Ͻj2|7Dʕuϳ`;p+r|@/I$n.7Lɂ`Z(ou}m}uoaN$@E3@$m𚂂G,`TmJDQ^3!&θ26M u~7ߓƝATsBn ƼBLl( Lc^CG5S1 ["|[ dpڇxh.(֫4B`tq"q>(^kahsS =K^;VFeQ ?ˏOq~|Jp [Ď<_`7=,ڝ@ؗS 6l_v $p)?wSplF=Y3˚c=o1jʍwd[R#"Ԋc еfZ)j+)s6L?/h2r)8%u6%d>bSxCCݱ#h5zkZg{x_#֛ISԯ[Ӊ짝ր4mwD#}u-[,]H+i"Cב-pV{-8fMEV#Or8Kt|`p`AqLW =ѧQ~.jL^6 o W( 0$vK;uƏ)g |R*a&u3+0ERxrQ- =^t(¦i^>P'l%V t(de=i5v ܣNHP@rwJ k"plhS[T JMז0mt$]&񻍋t -G:J"i2N4YG6ٓ8%팪Q/v`SRr5zKZ*LEJYG3/DoYi2&$ado Q1dmO@j~{d-ZITFbr0Ё@L(nݹ@V k"B$:rv}vZ ]7g|plac+AKn+"Ⱦ)TɊXXK)N~Ft|8״Ż8U*GGЙYmi1A`!>X3.]йRY'JmF\/[paQD8߉qDV~^%@[W50WxPS"'|- HCƔZޫ8u+ԜaV$=}.`'чawfh{B4h'cӭjNR]\jn5kҿ􍶷U (`&>y0Pq$ @D^QsF$sV?0w4{RkN35(4fL1hJ[k-Оb"?#1"NyfTUÚXU0 UK0OƱU@ZǬev7SU4c*DVy@뷄|!Tt魴^Npc | ._4y;a0d2}L;kDPJzacl0AU4 K %XLm|%A졳[a*4GI1ٯ5=*<@nISa@6c 7Y8K^3MHlda/|/Py]A u.\hj*=4 iH|J/6"e1QWōN5\i{JUfī M/ށiRr$G}(]l"!gE͌ cͮ_/ţLr,kB8 Wȭ%"P#M0CGY0M$.ț²6&SbsQy=eRRg2)kcjKQ׵yQ<ʼn%ԱCs0,/.[4`7Tޖ6" CYCե$ rHٺYWzb)RbSA) k h񵰍/̷%Ij,q2ִ4ú=l#': t.9"lc[QOp ATh" Yu [yE輦I_nc0~kF2!ֳd(v>üD㼙HhC]0XY:(xP `{表𷺯j+1gaBR[؄{50loɇ70t~x|Wvq9F{"em)Ϸy> 9zB*Slߑ3Tp> @g*ZL&\w&HRm5HbF#1IK"ctKLAڢ}߲[5YQ56>[M?Wq2O/'[b@of]Oۣ!>=oAXҊ*WʊqG.| ێL!ï01A5QIuu}ΗtA{tf lնgI@@u'9 i! @d]M**XγܻԚ)gx?ۖMT9?a]ʌ IMtAJ*#1H2TQTJY}Č*#DA$eV.,x+ ͽu}U6!t .LȃX~w{eNel6UUr \ Xˊnu\B9IU 1avLg[xWwo E1pLMׇOqA MStEtwǎclbޙ3tKϢʁ0O|ZząttdMكUU5 ZӪSozYQd8]ׁq(CUҪ/Zior/>>w?xPI:SMM ʂ?ODl<ui{Ss:N1Qp!22 Gv|Nu}[-[4Gu>>ڟO9/׉1xqI5̦>N+?W,qdQ䨖_gȰJ:Q`6}HFP}50uƤG&b5X>MKdjw>D\ɀwAI;qmBT,t6ݷ9#}̠__*_hĚGf]~9kD8IۋI_3(мf~G[[!Ҧ*#wz;!Tjvʰ\N̽_I<Ԟ˰VЇ4^T/=ǘuJWP-X9W_wj%\x񻎥 GF4Kc陇QyY:6Ri-:d *9ƫaG+_eOhA >= 94rǼj^șO07.y!ݞi!LnhR=O~3=sM5ڣ8y?.e9e{/";٢&?(=?#Ѕ1̉d泍9陏+<ÕZa_;`W )oկT!T}[Mjtv)}8S4[s$*7vht}$J5}tJ&_+qoIt3dhO껄B/7^3s;H:i[wu|ſURv#Xj C >䊚&nƯl?K_tV{N([S'חKtI "Ioze•czӎY-p:}?7p_Cx̿l9wJqwj1\2 eF;X(?pVX͈R{F]SFNgTF?sAu.ݥÈZ?!.YsVb_nr7-8^>O[_F'$}LTj#19HW䊚+LO}J4bW።xiKE/ŃYtrendstream endobj 232 0 obj 6301 endobj 236 0 obj <> stream xXKo9ϯc6v \iY)hrQBBv3Y S0Lx0V\ϯg=]=͌W3Y?` UyFUY)*!UJ&ph(U?锶uY)L}8ԿifxQgI>eL}1__.D@Rc8N,㹓 yÙ2rSxsYVݼR3 x+p 9,z)a¨‹,Q h뛤 Y'Q*vº80M`V; ]Cj4h־># Y*)&ò>j.K/R/񨌗"^~Wd.Q -XIʂĹ.rqf L}aFۉ7kE5\1ivl)tlvHX{Iҍe|M2IEAf[ {AL$ ([qnN5*oI:K&@BxUy\BQWhXK7nfAssz9e28#W Zpv0)j mG͊Vh{nE}E+g7JM6&@uMhجc>..drwn,R7!BAhۂ0F UO{y_(U0ai+s%V?aGM=Iޤ_bĒ8%eĮ뉮Fba̹.i9&pHpQYF0jTO 9vJ$FtSF%_9tvQS'-v FMqԺ jyE=)cw)@r ^2\Ndw>u2&%ݪ(6VhCS%]f?U]j T,0,!T~.[PP'kHם$ɰyaf?}d כ''xs2}bƚ{ ŶI}}Ag0eG/L+tm~hѵ}1mC2,RGߨ,S@+׽Y#]|8n |?B\EިQ2 ޘ?1?Zƿ/-endstream endobj 237 0 obj 1147 endobj 241 0 obj <> stream x]I%UW8q+}:S<7HoO6X{znnŠuҟ@h/??6?JѳJ {~{sg(c8i=[k=2h1 #z84%mPxUڷB 'd~i7٢OӣW"NN 92hT;z!d^gLPFg11M _i0)Ӯmx!*,q-Q+m\jxfVJ70|;e3 > 6&0?DMoJM ]0vuv=IwkJVΆ ]Oq%CUrNU[b_dBrڜQ'p-njDP* 'sC8Z[\UFyEÇ£oJiTރS9O,%>S/FdR*8 f >]{ J$&-d GXG s/& @;{xiy у&bD#M~I&SN[p9?>zL#H?kP_#-OF-=OF"8v;(`[Ĥg.H7"6ZNHBI`u1yF*p~815,4'ķ8 xM6!MAE:Aaӆ%?Z~ʻ AC{He􈦪_Rb˖dȬ?)-pBb;jv&H-dM1-EªYW1R"UX"F`F2@ t?3BZU&=PS?˲!]pᙶq F=eL3o[~㹪Y){`S}xzi<at̊UZ'(Gw c̀ڎO@>!X'.x~|4\A,Wʮ43,aƑM|Ĩ-qo* {d(n 7 NOF$jWHI(W$~mtR )N/q~:|QՠRl=VKпmd$0kG9MҲU=[mX79W a^ :nBU%n( fz> az} ]SSPwS)ԨcKSXg;V7&,\V)\L7DW -BVjpV[(YZ_^ }` X<9/]_!@R2FL-/-J o4<$&QP U:},S%9'E-q$"5t| LGJ)JFjI9sH/Yܲ~ADwQoQK\!p:VAFq!>b MAZZp.(8oq9q^ItGg2X6n?G'+rΧ΂Z bb󥭮+R\ciz;Fx#dK wzFN#" it+q+%` D%@ˤ[tⵉgAS&t|y_/}T92;`\_92Q[M…$(.WYruGmY{x;s^)Cnhy^u|٫节20al7)TlxAG_%\*Yb<-ׅ2?G,Bk)C'Uc•yM.҅fFbV5D8&G^A)UKV*L{NX"ajש:gC'ʫ#k9FB Ir/bkMQO؛%SexQEba5zlo9b?ͷ9soj\)2oي6{ AwJJ&g7 ,{G3L༭f [Z2eT4kPcܤ4SmUtU}̒)M2CGH{{>HV)-W֛BS6q f4w(;M"bG fdB fVWXiyR-kIr5?s\j認zP.փ. Om=(-RZ=bP6{ߒ@B='>$4K厹u"@SfJv#':Δ֦$7cؙCz|2HC6ht-RjSΣZ3a S*j*SV9MuŔb\ϣ BaجԥqfI&ҾapCc'mJ-鵴ݯtlU*&c԰?* ݌vaq3DfDۡQB$P.Ws:;x7JtLWi0Xr_GڄL.$qzx㔢h `Kb㠱^A|xڢ9PydkM m]Y:K?)C6$.eeZqwsE5vrX1Id8|'pDZ X $]m puixhFb5L `>7T%m|9pN]MIE"説G 0s3\/?СDV%gޡk +}*-% oi/-PAu`W Z|Ux &|MkxąI(RI2NIbst;khԅo>aP^a% +"<ʞ%2%2u>C/>5+SJ,Tӝ|IO\Ya]%^rJB+^;:SA)/ }*)183%vqۿHFgƍE`]WyŀvړoTӕnǼyC&P41A{h7rԈc1Wi[U,Hb:\E EʚmKluѬOH}Nŝ2׋FM}hmR}ha]d y3O60?HJ){Y70)Nl쁈^j A{#A!|>'Q;'8lWJkDtkB@ڟ^(UoCendstream endobj 242 0 obj 6194 endobj 246 0 obj <> stream x=I&U O_TZb#v}faz^3z- ?<7ث|!N^E}lB#-_pMn A~>>/hF8G5f*џ c0V(佌e+B>_X$蠭3I`:E ǃ1ZM6Zw]󏀖rßmg$_R5CT h X}jDn0A>pz}#=JA[DmNN6&xQ٤"VޝgGO|K|[ UЋ^}ҟ1㗁-#0nTTUie[MHdWn`) zϨ+ F\y!`=G'm43.m{%j?Vyt lXnXs7,l1J3;Q1jǀڏ a{Vv C[J9r B+`IQgіF[1)H&j2=q(.W^1wp[!oB!oT'f+ 28Pzˁ )gd|$M=Kg9&!aA򱤸٨BW؁F@Y E$8}|9KTgQeP0(ǠYJxmґZ #^H)I]%ɐD_=)p֝ cR쮂]KDOA (Ob"{$`:ج#H!  jAD\ *lXJGXoy~v+%Eʑn?&9I`[Ɋhq4HѫOV3# #݅P7;3ҫ/M"T`}a yR~LtwiLktaN|42i Q DE:=c9KXWv5<JTSZsMe.;`ΚhX 1Xgfϙ;-œ|la@Pw^ _3h}q*u8MF IZC,(VϓC& ,D}J1 oxL"a,$me鑍V:=p9XXw4fg 3 y !#hűwڒNfm- l~0l l&oschwwc*HfoIx: C:+1Jzw $=)icN f,@׺qZheNK qPl?sܛ?hd5FRZF  YO͞`cPw}% OOZIe}LP>ؙvMV 7@ȁ|,ؐ `+;F= l n2Ա%".&M#l=HMm`Vy&Ѕ lسў%HG@afxRd_z)¥Ď`ǟ aWTσn>DP,-VPR!I';9i^r~d ǘ˅M1zZ?AiC*W50|j#BB6 9Y(/^kWQ7nUU\ʝ:vV'I$N{wS >E,@x֑ *@JǕ>uJ\!hNcţx 1_1٪Sz5Xo͖p7ʹK #`p@pXtx6H=f́AjvZ8~ 0?F|Es[fGXsCJA4};qmQVYW me&r C@ <(%0Ŋ<:"O+ACvSw %*R<<_,Bk˵{>0W6| kP=G:O>+W2J }_8K-76k%~Ώ;);T -o+[_-,NbV=}2 7wiBeFxܨH9s೏h^8$V:c 0s᧹ O!.rQvv9fc`T /LIXUD\je٧Kfͽǵ#*pw)X6EX4ͲV!2h~HE%K᪷1mh+O?:/n@7"uCc]c7Dpi x9&lM٠֪;L)= UMH)61"X8Ku ^_5W ~aݬHӳӺh>ňMJFq=PN5"gvmEUO#*0*?mub._dq\bHÂn"5eP+pE#7Bl{&>,tЈԕ .6sipZRCN/9|**NV@xTߘTyl^Q*B|XOJǀFhMn9f'E7} T ?=X*mWUDSco 6αDK,1*@}_stxNЬUPu 82?|ocg7lA`iG~F*7ku6<K3=#@\bI{̮GD'E0I&J::}iNH h[ZbK`wWW~+o O~EyBh= `P@W$mF5>1ZjǗWs Z[Xr*5f`C*s時erd}>l}d -l~kJ.`.ӷ-Z*Ӹsx:axk`W!d|֩KCY@RXwcHRm5՚O|joqbi>p#'K}L$]؆-%rYkkddvm-iՌa' V6ܴ:l,k>3/9Kmj`&8GLoYR֞M/!5zi)C \zZF7e~ZTt\4p <ع/Mr2*PSu'V),5gps#U<͹Gr*u_!>*qMbex cȜsg.-$g\UhŔC/L?) e)&Xeijn&B0eТxYRhnMNWu*h: o=Ư`۷ʁ< .9tc̸ AXۀuyeG>G5)2"@M. g?e#- "~0P;$8 l\jJU-}ޭWmVҊ74~}?ӛFGps Q?3jxgDE8L~igk[EoA4gw *bt&^ݘrKoRV7~h[1tkqDy9(IPrUk W9XһMu{4^q41kk _ 'bE ?"t_jniu{S;^{SI\sC<'г7TwM8C[%!ˌ[,'b(6X@cnيdƢ Î);u_p:R/Ȝ7u2ǹ}_&촷0{u`U[7Q؜+.0 [2JPAF9/qaF͝bڹGq,{S-.^sÿ,)ϻf2V0\ tKM`vɾװN"EK"tAľnJ 6E:/E(TbIZ-@T ؍WĮ3qr3R!GWJ~ȣwv"vToajK>'b7QG궳?"S[`&J(`*ɨN⍃m|"ǕP{*j|GIJR,q-*^>F)8X_eXnHksbf|:@[Ғ c7b0Ԣ eGiհ·*O+m:]&cbÓxkwU˨Iˣ>Қ0F:,6";tj\:"I"ȬػvZ2`\i8RgM5JM &6H)exhԮv atbGW(L~tqK8¨U޲pXzVK:dXIAEoQEc' oh9Hܻ똤& *I{}P{?~A;e4au XRM.5{49'/j_de Zb+5C,bee+,)\%[~6FٗR; l ^@8ƥD\ʹ\ Wo}Хoz^ ^2pa8ܒJD3\t|1r.b ~Ch@r=04hCq>wG]N' zuzJp )*A~o"ڙ1̖?߁gk<,e.fnwQV Vq`EtCk@+0~gx;<“ 9}"FPG'endstream endobj 247 0 obj 8637 endobj 251 0 obj <> stream x]IuvTVIUo`{a)SvJM,/A"wt |,WM43|g 1 A^?Ow=/_^_ hu3O|ߔM 5O^?峇WbR8/>Z[sST1\@ VhVZ)/O+7jc'1_~EYoCPJG=^W*C?gFrG=یVZʋɉEZ+hBJs${mTB$=_+t`>$cOrڜ_a)D!S\df,u.YOg"'3Q!wC+b`;Qy|)\&UEv7`o'm.XT 6NWj0tAIV%g} CGr0|?>+]ϹE2ު:<W&3 zeLVY=.!,B6*.R.WX>lbMZjbdi--vcw S` ɿTKJZTc #gqlwNH}GmnEeXx,:qlLU&9R p>f]UV͈ /rgٱ F`-w~x=hn9юax|ms%QYTCe*qy1wym4a:4J1voRnJ`A]&zcÃ"4jY V]}W` ,lM Zh;@y yZ' 8X,pNIO9U; %jU2Ztac2C&dc{wyդ|BۛT  awޤdzLJIaNX7kM_b]U&(ωE4nXZ GW}ћޕ6f"ɩW%^n-pw Ѹg2* R4}1TǺTRR޿.jbzoجX2 XUs"NNEdZJ{d~R 1)=Ŕ!r7P|-Z#{A\9ɞegjS_B 9;`7̷`9cT2G5{-=1FWMv$>UgYgtDP@T23sy omg~ *x׉I G-d8aSx|ea~C],@۾o*2QLR|h h qɅH{yW[&{}nVw9GN~F41T E&hWνEke{N o[؏J6/4உpN&9sٚk;(<$l 䑒f HKί[B2E ^MIG0ϯ)Oqz%}kcʲ灧l|TlWIg?I:aX[fmC/W<-)md&ԄTTEFzT xB0ǭqDUtp9Ty >q)3ņ/> zRNܸv#$XQWð;gF:Ig@%4Ik\U/ .%g`L'13=Y#Gfw.wߗ74LցD>/μ=Tڴj9 /B[w3}J2cya\~ܐ<\rj:q{l'}^6V|'$`uBJ,Kͱ8-6;g98!aC#pM8O% =E^;z׮Nz^=@۞WE|miaL GG]O5J)972|pQ9> EdkOɊf!;ʽH@J9 詑6F3Hy/ρppJ(jx]|g XIgqWpmS09MF94991wrj#)02R+>)XqĒ#G@ʩ- 9/5xwqWvHxP@澒|{-*!*` Z/-Ɗ)VZu~~Mb'hB Lל@Uqbm5ruzf[ QLrc:ӤUTz"לi툞DՁ:$XRGNWM {=ZJst pGΕJ!4޵ΏR˯k 6-# ';0Zۄ>*7`eˣ4uҷaqɺɨntmy^y*7#UE.^P{/X/k;ЫkDգ-B}xtC%DpȩWaa^|¯' _-IMC||s ǒy~m9Onу7(PL."v&')#fB-'c׆ 6/ Ah`\R#DY Y.Vv;g||9:>F>`~:hFqOAo8un*>:յPK_]ItY[m{t7=Ǧ<ސM9"GВŒ^ѝ{6o{K1qIZ9A&%ߓz `EҧH}$mnYH<;+`y&j "e삲wFU7S3n'6'\)U&᱅xAvƩԟ"ڀRҥi@@IauDŽ%dɧC;U0-EQJ%YѱFZmwSrik DUw+|:bntm{SF<Y~'ܣ@ٛ22s|x2bO W* f=q"4,SpX \)''VWRk`9L@ i♉ 8TDPu8Ra)+=4Χ\3?2/iTL -ὀۏfXGGz%^{GGӜI2;U:]JOH)7!3b1I,׹*o:us ıv#szP6 *;?#A;.smy;Uq/#\qM~_iZM> ͝ye27De,k0W57-1g!>tkkp^OSaDE0`G9w2):ҧO"Mc9MM=/@BjON N<.qقF/)Dn>/!Tqkٝ 1.[~t> Ϸq(TZ&;6M Uu+Zwk{No_,^]^ќ%vѹh?._KI8}ĆQbm-}5X@MN^ $J#zX`wCumӿk~Q ZC$NrP4ɚTU}16*t VmWCcXC_J{* ";.mK>&V9pD=<5O$kdu+oFVK)}ms*t4`;M!NBWK8J>Ѐ`sTsP @(1.JsN],th9n?-/PhN,sJrz-%\s=[C'xw*ʈ[LmsѬЌ}TuvO!OVs5%ժش݉dW_@~x M3`[]J+%n[q;8ǵE_bqBS0Pۖ_&؟QM[y[qIup > c|6{th?~3s$24})(K:a ~̜NnT\&tG$1j2xSGG "kJ[ I:Ǒ澤k02dqTtn':C֔dG,ҵ4 <PU5nA*ih`/`> stream x]Iqw/K?k}fB9b̡LJr6K$gYB_ ~KXl˗ P?܈IS~oo>7(&mчWh AҳFpURW9pOZ{/؛ϳ16pbt oC`?Gz]|t}dmk>c_zgVy||k P6EvtR @#o XrwKZj38E5f~=1WtsI9y8Ɉ3AAK'R렃;D[}ĘيhkzCwu戙DrO tt.B)]H5Bsk#o1~BF z&4$&d ?E2-QXHk3I?2Δ䑼ĭ,~ΜйO"Dk 5`^=1BQ~FM4V(4:3H}e-D72dVQI4"`3 )N8O+/jsʎ6WPȋYq+{̕tU^/z(%?9BYp h֑m[oѹ#maO^ZއKIX!DJ+b&XkL Aϭ4z=Nq3 wbI/Z ͇s#ڠ!DZފps$q^^H_ t{P²EX27vR`u @>Hd*}^fq$E ~!%wCyY A5\WMh\A.ifRDsc'eI"L4hۗ^Jݤ|>%o$iו͐Vv2l'gz 8ۭl9$β: F1ja!e(%*پKb.CEͪJX04GKjCڨQAQGZde-}kf/tA+W}n2]+Vdj(l?Օk*v6h49$4y,N5 nnqMWz o "N2}V7Pf0'MoGWP+,t.tmhv4'ge^!zg<͜@9;kU!O[ XS\Qp('&*Cg~*n@,%c`BCVRY ߤxr:D*w$GNOw IQzE$DH Ab7rY ]ʋeĀe#L Vǩ!FyuLBjJGQ:_3mON*% "eui+=_??o5QUQ\:rfS2*^KJ%=׫-|o&ZAY%Y)D9Gl&>$fR Q$%{RFO :jz~װޱ' % x # odVN2k8my7[MR1$y$0COL/ f0,)a+6,TPjzz3^+m!'-L:9NJQ~OE<( DXURȌ"45Ao#ĹҪ)p4Z_@Tq^oS˳[[w]Sm$pXfAgqR) -_sai~XgyRzOŚ!^gzeS"!hҭ!zn7]->&PN!(b0aJ֎/I4u# 3}(X&t=cQ:|Kۧ@iaYM}|cr$R_d >-lNo {Щ]^ ЦSo ʡo+e-M.Z7هŹAˊ՟5)LakL'\:×rBD3$Pq}cj-Y:R0T{] 0" 5%-hw|<]5hyUAm*lgnGexWtkoJ3 XJ8.m˥?JAt*|jc.p ~i=)mn[*L/8w끸c:x3IՐwl|&t8S]Dr*nDG)N@ttgn[V(vb\} S|DG'l,(\hp+Z]kFW/H@er3_Մ1$UyȑMEl[-D-$\&܊O;!ҝK[mw҉# B+H\ ޤ#ØDxHH+/*q7D9*ot{ZUR{е٢RKncy}-Q~ wϾ\_-cMmgS=gx5l}tJ΃<)|ت :=yiPtSi}#r<%:ޖ~;9zrIx؍^S^q6{Vv4V EX:}0+@daZe:LPmu:Mir҄6q"r:G\AC1>u%?,{ttuF}v7Kǯ==;zp-Y].ea?&vFaqК zoQM,ľT!xamI!6{zv xxQ͇! Ŧ3s/Mh6g*ǦKD0}*vKrшr熦$j*x39&2{] R|Mb]g~N@N6$k =&;R@=M'ZE S%*"ieEx$TDt_eĴJK# :\N-Og@=k0*` 0ZJzsn +V^hAF[t|!Sxiɹ$>[X%xY2+3t랱Q=NaYw 6D&N!Z+{X4>0hPt~w+Ϧk:`fWE*P|1^$퀊j0+$W#64|(,El/\=^ ޲H/gn~0W7V6w߹({BxzdɽsLx??uo4E][S3DZ\h2]N6^$;|.?EejXݪXJ?jTWTNefݒgWk4w='Q6;>)7w 轿&IzOflƟ\A^]A)L<${pߛU,gJEZAd!єje%"{EUrfIyeB9G?!4b=!lT7G#օb*gOHendstream endobj 257 0 obj 6241 endobj 261 0 obj <> stream x]I%qy 7.h9hHʐa49ҁU9 %C"Ȭzar%݈Nͣ߼HܼzL{S4&v)gn|ߔ7RNp7O<3wwEc==5N? O??|>=ͧOXwc>Pbt?XӟER~w|gԷ6`hy:Hn8Fko{tZ7؛coΚZUu-w6ơ?ccE(/h@!%^wi04= ~ K ޔy9ouPo0SZN{0^*w6*b.ӕVaKaKAPiچN_xzyAM5xћtn$&<7VS{y ;R!g,R Il-m?=>~ک;E>P Foާyx,65qދWMY&r>R* I\];)09l](knMidl˾΀ֿO} ͭZ[Rke6u`т; (y`6ĭAtyJ uBvQGϳu?N xn=nDXꥵgBXm'!wB:.hW(wCl+Zeh qiJlk,Sl#$`Y!EPoZ~i`xM{mqjKjj7fn 3|$N; Pތ5ľy~y?*HA>Fd^C?4 Y`Sхa{?ʪoZ\ȁ_X<!YFGa:)X ]9V;i5SVg+_kJ.ٔw+&l_^#$W\Z12rrq:D.ig#<>,9fvI9i3N u=s/S 7GRh,3yi C[ښ?M\t  N0=ODXSsTPsf^ϒq6*01=ZЩװD ; l"SoW971]Mo6L`q6e޴/n?U0cHy゙VXrtGyմ@+9gTRhIcr8$ӕR,%SP}u`+wBA3I&X>:w#i*2-P$f '#:TѼRGC* fs]:/fKWT@"aKTȏzNo@[B!:)s&1A#H./_Jkw$?Ֆd8QƯ6rV&sm,ÃPXn1&o,%ο|YQFp5 bre̔+/Ώ };_cJnz*6e[.x>WEJ1}7K)9RX79#̥K.C /8n&1:%7PV̡a;jk Shk0|%NR̜Xjasw8=i/ 07uB %{Xs4/$U~NaR \T,d%/)8k&XK!Ջ[i2yBS5.-Y:Ɋ<ڋu%DEuW"{,<@]p[/]:% QeUiɲt.U\Fnd󒠘@󲈤4(t+!M0 !#/@_k]\R(WvPjMAT@07w]udتgc SM^a ZZߘ$G*SlzqYLbhHf{7fߴ6;yWj Ueu0+ACԚ1_ٺl y.k;e,rtƵ SG0MSr،rN 19I^($ǂjDi5nV,5k6NJE>մxSMu=DAzuXxЇ ]x9 UnYЧE7;*.Ozl~ ;g#zywޅ+~ [M2;}C00yM"eXds1r3hu(C4܈J-D ߒ0gV=?>*ZiT!Rە Ј8~XM <Ƥ;W=û O7>h"gG) x[BG;oFI\&gJTkT[Ԯuǩ]Zʙo *i.T_b=|}@PrK֋Aa;V?@FpWYK5mJו"\u`QAJξk^su;>Ugq2g`[$fO@pmXtQc9ֹֹVmR+8U0J7lLtbGM0 T:4Jn @N1L҄<-H,cڈO @Np noC塟<bjJ\!ǔ>#)Q<]aGGG>R[@#~2a!?M! ~g˜j[Emdu^y*,h}W "`x=GaVY%1cSXؗ&kYu,W^Պ6+`2{0\zBVX*2R> nK8Q~w^Qˆw7WOgմʟr00v1:'^Y1g닕o2eA#/eKtrf̡]˝o< Pz찚ZrL0옽3ȿe"JVn+|tso"ynzvI}&endstream endobj 262 0 obj 5617 endobj 266 0 obj <> stream xݛIs|wV&kCdUE ku%V+N> ҘO8tR<9Vt)|;&es*JE(uژn^Ym֐a"{z)Vh՝!gU>e֘ߗf&;,FݖY^(}ұ 4R6P?_rpy)L)KktBhiYӭCt>X%1,+uBWQi1`Jai2GbɷdeDߵzxQL#eޖ񜟘517h,)bMTagZ]JcI]@ q^ű_FP9qVOG (!&[ S.[=Ħ0%15^kMK}ҧ4cNCJr|<Š)AEFX7]e\jK;٨w~aKj՚^( ^]C[yCHH;ifUJ"]ѐf7"X]Okɡ̞ԁm ФB,.+"&PԦSy*j&uOHݶ_9{sנ.6ls5X)UW!G"­ꍠC4LWl2܊X-KAO )←, Zr" 2aj4I^M7Z$eQ;rXȚ瘛 ɇWUm7 6s6Hzn,P* X%qxIA#T8# g?N_Pݯƞ;@pܝOWZq'E8!().".[E8s6 9=̩:3 =*tFAc+Yu#\]gHkiFM]T'̮a6Š#("eڠ}LJDf|(pg,F-^#љN߰~p>_r\OQ( a&=8Rп4|VfJ8\ydÒvW}ǼCicczvLYDFQk(˜,yˌ Ec<7q'agZ o4y@TN7I&)Mdx"i?C>4Y!H3o&I|iB%f縊4)~:ip i"Pt=ilmJmDzfFD} &_pt&`$"GVws+/O^5|DcDRl1QtST*LpWl 5fAO[7={(`WAwQe卻1{6XڇS^!FnwV Z~/Z~8wHLx'w< Dv Ly'-ԃs>R.3 @1%/}{@DWc/r,D ®/?rf`C k>#k}ڌ=>lj%d*Q95C߹rK磣5k~2Pmq K(*XY>V:DV>^g`rqQA9=h݊r˨4;YU2+#&2 |)Vw;gbłƬ#-]@a,w.0!m~pf9d=0s> ;C7^= | SQEwe:kƚp' #ʟJІۺ쎹OwOw݆KfQAoqMpv$T ڛyPypcmlqjx揃gyYDWg??c9un ϣϨVU1̻U윰~u?%~CKFvh''M/H#rFQ Q:Me ?&/5Fc Pw/ޜendstream endobj 267 0 obj 2574 endobj 271 0 obj <> stream x]Ks$2|{߶1,Çb'lJŲpjF/Ɩ~3@UT7&*P@>|~'&O˷gnn3IsKN9vқr$&cٗ/Ĥu^z:6w;zA*B)a?_ho'%u0}^|cUO.Zkz-f0o q>([o+`"┸@yԓvV^BIEڥU6C?Kesyx>粧ZL8Բ~>B-W>jh`J{ UMQ@\ZhL*(xS687͗l Q JC,R`K528ʌ.jW9!9+ʳB5:y`-1@+gCһ8E Ur >?P^M k*BVio8 QER(:u'pAB"J*6\y؃18@ P>& teIZkAzX/b(LUwD''8$!-3$8`r *OQz |?H}@J}ܹ)zQH@$+'T}Lkaw;Irȥ0|j}F Ae>U#-J^S̠f}>G)gqSWBH@5eLr[6"Gf3݃M.N $)ƛgQBjWR@ik㮊 G2Uz(.;I ;J#[_.m,o+ W8!y͆'r8F ˆ)}!Z&l¼ tAn)"@\mʍ%3$+J0H0u  $+(\s+;xxE5UD-b. OH*Ya, KmTFk ",ud&D他!Gl<;竕s&)w/AEVH'Ymp.C ǐ\I)~/qii @cg([~ llNwiu~ f3I/F+>Դ)Z _édpSS8[Ĥ-B5ȸiszEtxxx1ޅ<(DVzxkEU^[.n}Xcop1MFCfCfi4aN!(S︠5˼<{S0Mu~>ETuAWJ sTVq_ ǚ%MH"` IP2ruE%;ɔ1ܺy}1O&+DL+m\{%`HetNʸk`[7JG$aB5<+~:x59qh(v]e ^)k-EY.%q)k97R #A$dRF)Xj6\o:A0r±W)EVG _S6LP28zt.@@ 'gtpa#_\S'NO1YAHhl r$ e[Hv޵O c4m*dmx@XHa#VcZ%AoCȬd\p=Sr1j`pߖ([dNaDwcA<.@`̝iiG Pe qSmia̬}-0N}} ȣ'! XK *̖>t$ёjPA8zjcD<nKDŶa7‚цS1 ֫LL- P񜑉<ۜ]>٫oQwa[槷PR=e(OSIKOuUѬ>2([GX1<`N&vA U"zP+j  OS SD;AqAI>m+&fl4jԉȝFrMB@tU~g䝽1X- bvZUMI"R"R Ȗ&w:˛ ٩HZ2 jYet"#='h._ DZ:;Dbe'r^E7EYAٕL k.lɢP[08C?Yz%AwygT;xe)MiX\cXrM#9Qh7eHCJmt᫸Co-_5Q3,I?KK砐K( B/X!|fVmb&Ã!Ҳ ,4q+>n6/a`ODnkCXC zSl@E@Gz Wt_,??]~~|$ֳ]^` 6Ոy}S`L&^B#8ӹ( tقr:&!4)@u!jتq_;/GO6}n#Ңa(ymV]qK W}0T gUR:cs;)6u!@;fgMVU`[X|3;=q/`ඒFYRnj:ʆ8pd*?Pd{lR-͆?_~~-SkHw8P *nnBQ{gu} 4klC^`O4a}Uڱ 0@Z?J%Ħ]HZǯ t2}9REWuvsܖJs nmm?IA]؊Vm Aۼsq#M qn̄li%v(uT1^ʖcE"͵0s)i#0iS𞺻cs9!CX˰t4BW]X"/L4 Z@a5(m^wAˆ5~sc[]D:=uۄG=X@w>$g4vA7:dƛݤF֕Z/??κ+w@A[=luo8]x*dؔ<ƀyagþ[<^: g.Et4o]ƴwCN=w@}ge6$1NF`"NOhʏzBb2W;)ޔAw!T-|\2M|HZ~(&u+daFX\L?j뎙G8Dwzƥrkѥ d eI-5vjtTJ0%~d}oRxLb+7FY,"Uqu VOD%۱C&ĵJKM1Ygn:tke?: a,x~^ɯnMs/2>9J Vz߫6Ǔ_33=y ~CG y_is["1Nv J`8+fN e5meriYe6=рG΂*F=ʇ\ m{_7M~ڏNOCwT7i&Gpitxx!gZ}&;]yUdW0]И\//eŅߑ[ 7pm \'kkaL,pjmiߌ]u&H[Dti]iέM=% [0)'p1g5-Zkvua>vt$Yf)|x " Y;!*+۞Vq@i7dF/U.'endstream endobj 272 0 obj 5844 endobj 276 0 obj <> stream x]Ys~WLq' %Unjrk9Bӧv{X8Xwy ybי.6ҺyУmD|+њփr`p8# c=pwl73Kh`p͑9륟fɗ n0bM?a8sE Y}d>hO\Pf`/R2y6&R+'bQ$Gb4%γ,eY!Vye܂##}&Y%(6_dX)d+GGj&WlQzNjxJ} 'i 6篕ǮQ/h( ^iX{$Kxte45\^۴\(~ZVpߕ D\\I_:Qisc+!x:TzCw}Іw=X cZJe-E׉҆L{i ԧ0a<6UBo1پL-)-L2 OVZ9"5jD<6#iUkyQd$R xvGPWdLG Q1,)V@iImC|ab#VGI__+G{ ]F=hmR 7σ8`-VK4"KF1i6( oFIDbub Q?_ppͺTyBH!ܨDJ$B'H Ov@fXG-zG0뭀3Iq+(k9sgnwϋ}-8@UJ??gO- Y9$ eTW)ԩ8a~h= fi t_P=>wHt+p~o s䥅ETФ /@=GJÛIP$064a"ޒ(o4Ӥ\NȤ8el=b0!/*@挈nKC$gӿ&+gN 8Mc)3Kidc`  y0"a &bc[S`'Wgƫ&H;%)Dlm!Y,3nN1uaˆs+7a"+!e!u<Ε ]ߝ UDg17q@%NjA`={H2[%A nGp| pF*u܂έQ\8Sp#g7K(7? MP4~HSSh>4-UioзL,iɢy ˿[a)yr{4|6y33c3cN5?5CX YOPZ)~S |I )Ni$8k| G$ΌSQLAVrhmy:\p=kLĝ:`pN_kia@d*,/PC^U,|6A) ƍ]E떎08bv>~+yw8(|!$#m&n/]Ny6Y+T㛴BcCg0wH'wOW|s8C$vTtll NaY픳ʀ5&a^o p u 8by{?+$J8Upآ>h 8k \IHhrUKb| Ҝ,Ẍ́O _ѯ6Hr_Ԇ%7~ՌJ(s"fNc`=70Op1(/][Yxa)Bde@tѝڽ";n걱qʣX~#7ONS2b-Ґ!*;>M<`غ,T&!*z* PysTN r8fU,،K6ʃz(̔( G W`4k}1 & /+t0;sϨ#+z͟![E`{-Tʛ9O'8:}'vr&ʾL_ bO,: X@ @eV*'@¥rsU}> FNb[A7*HPb(rj{l':?2]`-/A=5h5V>f 0\^I4-NwK3,.ͺRhVV ͧU 'k͋Ϸ7)uDGCQTF~!IO0Jq?MiH͵=v.UϚ)g Vyq0Ca8ʅE&Z$ bKs,. *>H:<7* _രs<6;Q[*jSXqRjn,-<WT O~UL7>\mLoTy]-kE헡+I+yZcYUgϮfV΃2!r0ĵkD+㶛\i3{D!y7BE+ʪ\x6V]GM>vPmH:\8F% Qu8 M;~JPnWmơlYDBP3]9Wx" 9.L ګrBv1BP)\N.kiŒ@/ѰqRcc&,AaE)F`gQ)'S8'j9sz_CW)/dYS_OzWWpUCoS4Mq|l87%Xo$cwuv,?Egs06T 9ֽr+ݻG]׸F̜Njc$_)܏~9|<Û+_OX' w~P)Kjp^oS9Y^4b*pS+}\m h*1;\ӻ駵lֆbz~JsR5)7Iظ | L˯r|{7o 5kbCfoZ5 w4"{c'Uk1 1T'y4+MwPn*,p+%8.u'`%vb %LعB0joUvWk9s:h=ڰxarRP'.G4zoa0N/56I̟-r7C'n}4@kOhk ?8B.JHqwόw^ z$tL{r֫dhѲb*iZ"fbH" :N {1b:]+d  oqTv 9!q/„\Q B 7XW;2K$W+-D~(~j{"XS W*8*:XP8I5tOTсܿbYA3SZ._3(%iG[@Q4L)O0r!&6N(]G]领d.wKps!'$Z ڻgMn%fxP ۧʂCn2poӿu 8mSeQ^6[@LC,ޫލn5 8!+_"XA,"P#Ĭe{#V(j)y[׼q/q ZP( UrsryCNI?nT˨jvMU#!8z8ҝ`p-2j Z'.`:0qU$vZWm.EW\,t<|v5waw` nn)eGby0| !|:Qp[p oC7˗^(noǑE]'<0"4q{ uiY)?R0վ3/bu\=yYxk(䣾l }TTl6샇IoҬ9P!qy( ~NH-M͠ې F62SZ[Q^+}R+m+ uC5꧟H_z Jendstream endobj 277 0 obj 5331 endobj 281 0 obj <> stream xYr\-oVq`g,D*Kb6HlL)s۸!)RBWP+JOՋzq\N_O *lpuYci")iuoq]!WYy4K\ W,WYP d!!'K S|X,Znl۬#鐐=~]H.e9)vrV*@ƮnlT>Z>AoMLLp#.#Ok ' }>ڸ98GƧƚvJlhWHC>XK*1L%s]Q؜;/]XMh;τ䝔uԙu:iۘ*]s\ctӥ \Ar!Ed`ca%ګLT}uU 7nxթX4WwC4K3bv;nСbMHPX&4~nNlwzЛ2&b{ Ø˦ZΏZfe&'&!tMLFls%`i[B-M]rhuugxf/dCrrI%]H2 9e-iAi7sO V?-*r$-^~^7a W ]rӱ8':w -xA5q^WkVeQ|sBb\1S[oF=Gsvw2[^>.$niQgR)rv-NPlL*\|%vzn)-吝"?&ˡ x/,a]/ 3dOu;"Oc,peit*s=ACqL^¢dn/+ qPBv*)y`3t _}\hv-{gx˽4vpDW K/%ObOU k_7bw%Y%_zh;ǕnZ [°Uu s%C13>ܧh&>\'PʊR.{JQz:ubx+Lhp5JmCs 6fw~^ϡTE q*Q!т/xd'WR}ucדEBN.ȓ'pIUџ+P >t;`JM.M&LW֔-<+xrQ Liû!bd2[NC JiFN>}2g_`)l=f꠸]SfڝIf&єB: +N0ZrqtRV,ڛ Cvˋ X ^V+N.K̇v;XRdL`X\%/Ei7U0.Qq#Je~iIe\.ɚ!r<'lL8>+syzdn[P|SӅqsen5 "!*I,l z 1b1E<_Dv_Ph+xm9o&<ܚJQT)(g|:9b 1c([B SP{U5eDHkYh6,o?YG_mendstream endobj 282 0 obj 2142 endobj 286 0 obj <> stream x][q3K߰o֓w1O|( [I&W*2S6óK8!p6c YoxNzwa !L!p$A#4-Kfm3_,-[Gx 3s:Ś9J >IyT6L.7eyW&w*y!V|@2 3u\)[.)+hIv.EA//P{ ?70NXm(PQ߈gw(q?_:;9Fce ;E]cA<^:!qWby*!=I(-*/C:2&-{E_Ѡ]5ߛK@*ikۯYDź|.3 *ȱ>F +9r܊?o ]ćI+!&(jo̥zhd$[ݔ"y-AhA 5Z+i)lWj_hd;4vH~JuK6Nh#Xe+H=@,*مBrܸl764EOӪ N6(N6jd$@O4MeBR6?6>TFQ6Rn)$iX;&T4D#tDΡefkTJI.CFá:mQ1ƹ.Ta,,;*k4:2)֦Ly4Ӱ@„)L0Gu<&xh^iH6bpц`e Q4ր|WG?Ut03G,iHg )]RTV=**sjn?R*ìبb36#^0JL1}(D_b Cuq+[0 .~o$ !V=bk7G!0SGa׫ǟjQ;Bo\ Q Ij?~ر5s8r*U|ݴglj|pC{ n'yV^ C+ojvQC(萀8f_42"M6N$n9c4d`Y1 GL4w1Ƃ-(o-0gh^ R*KF1""C4* rڕ l >N;AJU [CӶt=rcY&NY֤Q'wKXGa TƉ] YUit2VTC 4ߜ(&b "D5mujx#^[kzI[ZұݏbQfcP% !JiƸҌF V PR{Qk j\.K.+|":D&I2ÛkW9*F4{W(= NX?5Zu (7Z}E-IXcgqQ>5ʎ#ǿd48a'Ф7g:)PV&n&Hu)ȅ߻'JmE.Ě ZtfrybvV-Q݁Ɔ iP ׇfue  c F=hJ ?DLVߎdȄl\,iO3*'MmS9'Y$~$TX+_vW4JJ V4l?k>hNv(YXWҨ|)9=B<4LO0&m1;(jN'o)7Pљ~Pi=",aIMs"V.{& ٝQ`1~T쮣g bhOQ xR>)CTnjl8AԹzaa I'ʕҼ* :ixS 6Bz=$y&gyyN vD=ʙ nuP ͊ߊFI__^9 [R܂L pd xv-" lb3h kA=mCicÌ5 vhvS,m<л](A6j Uh:D5xK\OE^>+ⅮcmF͐v_kW&˞&q sqȮsmG,K" H!۟Oos[6{6˙Fqy7g o>|d$}:vy$<Xi8:6p1ZGMm!Dj'nא Ph563QbX%'*Xru v-<[s4:EP//: %ڭϖCXk!OE҉mbHSߍ=t* ƏB1Te]NIsQ&eWZ]UY3rř:Y>n; nmԬR+tgMMFna.OV̧rnm͛ j]%j\I|wahM 2@6}[vLf<a+)Se65dn0 g $p֧Y+D*< s,ON\X 5 }6˩%^T_)P8)q7 BS?ZY M5UB[ P%p#X(M"\FQx5[wԠ;,ỷ=Furu#m8Z66*Ukl`c`PtKZFU5_<~K/;r~QgsKzZCum sbkI5ʖR)8% @bP@W7vF$j?]Qy.m̙q7jUo;BZX'Ži;p>򝾦(q֝􄩯~V:9Fn2R[OeHˋ1Nb $@@lmwn[H6eGh[<"i-VĞ2M^;aK.rܐ_i`vdOLS qoTe낙6M5t eSҰOx-nZ?Ȑ6tJn]|BcGIeLT!P!c̢MnwZp^K(VHDd Omj҃ ..֭ )ԜPX~E?N,?{Y HY,M]sy{tjݔ׽Rdf Q ac"%4+(u`5 u+Csa%9'<+rZC;! //"aWT~5L@T49RmԎtq;DBmC.]k \ɒ퀅OMTRyMˠN$Ƅɛ R27{ Ǹ#j 䫌kT!3|;PpOgz|N+G<م7h{*6KgF덍 8l=UІ!_mP;KaNh欶eq#Uڝ3FjZ>wE^vφA1#~<ǝ_ zaC46N'$AF8t~kXpH:F=C:uv#<.a|6Ϡ:M"Yy,8vce m9c{dãf0☦,l O!xqS :tQgU[)=™\"w{̍Ms׽5y^;X_V*{l U'#.~ blp $!h=W߬?\~PrM`vBx36fy3 &,W]ͷѥ}7ݩ]Fz-B@| {zOܟ%> stream x]Iq3Z]Kx[^(Sq^YYP-HѲ]U ho&Cx!&y!O;>xG^@8ExNRB#9Ii/ד;:<ZGxqy6uxzy:sbi6Xk땯̞_ }8Rc,AGHڛ_jo'%Л4Chℇg+"tW; `/)K 4&eAǷAY;׫KHc4-7F߇_ŽPht@ K$at⯖hԚ7by??1jf1>KG9 -],S&z m( -[*Q߾e<|ˈddS'Nwښ/e xz H=瞵oa&ܙT1x[֢WdTmB՚9_ Ge8J9EsJ7RD}xH%/3s{iZ=$.Yd%9jΜ=4IYj> 5X)g#oZeM 5x1Z"s8ig{*4961q Iȩ,mpUD-g. _<80tFbbeB'=K-\=5 ̝(>6 tgwQϿf"r<2h .yS)ּCFʟfGr 4k9 v0N&v"nP]k+n]ăȬ5(TIECMTT44Dꑿ])z6?br,sEi3O$Fhae)qinL'Zh*i7]-#>є-|!53`ENʦHeҝNTSLXFm &LkgEۢ(X#ōƀV"zM+/*xLLaLL!y2&SaK"D\.%OAf:4sLvfr?S\@˾%_+H4jwNvb`'-k6A> 7\H"u]ye 63(vnX_c- !-V:ptEJDyf@?\#JLR>=hnQv$trB+|rҵZHAB}m{ ]=_;k M,ǁ᥂ :v{I}.FV#/ j^NH[2o+- 421Z?kkWHncƷJ!'z6;VY%}ͽ {sa&6VSip~}gQv'صzTȕshEjx ^X5''oS喐+WL-=Scp Pȶ<"e.#t2Z{3jy<>>ޛu1-#9M0sq[qB4c5(P FӇ/ƮCK"tBWS=k I]L2Z}R ?Tx1D2I!D$kLIg EsZpR4o K!BʴOӦ{l).i%>^V AB= BZd 1JE/|8YMSSuw k5;d 9oe5hFHkR;UTGH1c2YAOZv7fV7ymŮ׀]c D-:=LLxA+3 Fu`M^p+}ز2<D=,?[aҧc\ȿc!Inт; ?0Mfe鄭HǛ!?,ZFအ't 3@T}ou9"\$&HA-\/G<2i:,'G[IN^he[YĈQ _G0rّ#z)|~`'J{`4/hC*Ͳп7<:QWs?iF}S~pk J3+W Vi@vRFқe9 ,3Ql@:5AfcႣh Kbd?[6`*1"|哎qO\t,KVoY <0XGo`*|sX7xo<-4 ɁiXqk03!DJrR۞CPL= = S T,Z&(@n Uͤe~Q #ȇzM 9ZFLt1ڬ q_{h]ն=E 1&̰sx*k\ƑUQ vȓL:ª:U8G#&SP6%@8>/qek ~6 &r&7T1du!J*Q+V[As$wI[0QF N Saf.@ڒ 3>naf >oU¬>P>`iemGI,PP HEBøj:s<|N8:02Tpt%i^Cs$W'}{gDK 450Ah#X}&Rq3eQ =z9 G/Z#,}3E z9~rh@mŃT&E%'+s/V&X^׉0x?<|;w?]1OqO JX)>>cn`W~b@!|OG9B+*W+;+u=% \3jeā)F|kձ>]4ȌzGASXQ:Qʤ v>3Fg-(wUaa<<.8 yZ`T2mV^*9΃)Z޸Rzq3u0x!/e9:yE&ۦ}$wf(qm%NՀ 'b06$4bV<  Q%թ.l2|jw Pb ,eCxH<4^B#|N襄RdRRyߔSͦ>4 @#lViFہN͜! wfiLaIc_v)CR@/qr>cSͱZ3 7%T{4,x'Z!QӘS闳 K/Qi蠌f),-EG4`vWkOib3\C7J h3[{0_fe J+b8]ܻ6N[<_'D;d> I+jxvcѶ ԼIF[/%;z+nnvR,˥a2֎l*12x\z`)Kp omDA՗RJaSF=r=>rKe嚗m6 f [{:?)`lbwGEp)X+wealXLNY7ݨ g'tۚƤk^ֆK`,AR? p7U?2]8m5wEu('d-4k!4VڏXUl,n"UoT\!"ӋQhǧ >Xۚ$Xɧ0lÚ?-!ʁ^ks &CD=hPRu(]GFEw+ܖP\]*_5ڻ7r( oocy{11_uIASbMc,+}b&ݜmM=+%8jԊׄg?wx@YG`c𬂑Pr\MWgʸ={Rę1hiC޷"rrVMFk|MP>1SәJ6E!UkoG~Yk2/G dž(;2.ÊꛓA#VY=/P{^rkNxVnW}>u(mǁET=>fh6Q'.:m>u\!ۉe\v?2,?rC]s]5~uYʖ~^$0s;,"moe Y+.BG9Wy7gv媆_u'A^fwenc/'L|/}<~ic~xwiq-_Mt &BGQ"8~=›mFuM-KgWp!:)ZwXRxMjjc:8~q vjf|Vh8H Pz҃xR~D!96Y<wR:u'}:::o|h[(n~?Sk#X &2!^5+s@-.ou߮8$^Év.>ALhŚ}[\I0JYm/Y.u)m2|If٢ª.%\p3>p ].첍F+Zߊ0AGPE - [ !G?_X5p|㠧*utʼS8pɗDvKǦgOp ӕҾcD]}r+(;!mp]E{'Q X.8a yV/> stream x\IsR *r}qr]qE.yDه8YdǢPK?n3ob\*8{4_7O[=?{}?WדէW@ wVW|Lǭ^+\]ݜk%ZK;_?=gi#R($_?Gɹ|>[s:/Zޜ8Hkf=R+x/Pߞ{Yc1r猗7al\>4%y-g4/012 _8#:̻_c󿯾֎.PZ]rl(~Rh^bꬔ{c7'VBHzl@($uLX BvJJ3` ]*;fC X*K:0[[aY[Nx"7ȠM05Z;$t$6"v d䷑S |drܺqAi=Jȃiz qQ5=2,@8u4GX|R%0n,d*):s,%H:&O?@IfS$i7<'86exED}Og{Vk;-(ux&wTc*LJo{ O[,2a 칌2@{#"BC4uMA`cKG02-lτ:2kwJߗcwpHP觜O44?M,Mq)ZM u E*ȶRGȱҒ_ %Ag*$R׀:"آCN:r3vt[M^%.$հj 㺘S~Kx1> .]8-:لᛸN[:7yJ e]nc .J&*[v3z`/%(d )" ;L/7k&oM& Zn=Hxi`7Dc1KXVW`dZVW`DgN?Z%j/7/ÀJ2aF@Ū&LtA-pAs !"-U^v LJ`+ ֠m׬9a"ͷDxf)*HwX|6[i!nHpMQ0rtJ+-(Em%ӎȉקTd~'w1]GjRc5)7 ;& [Yq*Q* ԋRn!*IU6@V;7hqg*L5vU! `.2QGH!H 롁,q6J:Np9do?=GM+!n;&&x+v:i&k kl/ڄxoSzAqɴl"lb#rF؏F ~SuW ]IT ƀt˰l@]H. Ja`" n;>N8s OLȊS:9xIIAd)^hΰmYO &~PwRHp]r P *{7։"¯fD1`NpCz Eb9C%H3L >Fb[{B, N. 1\ơz ]\7?@X6!3ڃAq+EZ=Ae`4Նm(Jl~Xl$H4=)_!ǡ_F梯A.eI%(F(pQ0ck)ż27QOG Z[XVeF͆pV4cs?Mꧩg,*͚ `IӴaA\.n%G5:Wհtq+q$|r!ivWavPnOSzoKF0b Lˬv6av{V0MB_HXӫGA$*7hNk;-caa|E #x85-Do㤄.ΩaH?XYQZbsuvAQlbz4I JVY+1Y 0criDIyHӎv ! _VPU;ϛ TG=|ev0QMrDyx苔CZhUI(S7wb] 6̳큅zg"Z7rQK\Rxs,ҧ\xw$$9_>J5Kp!xriIscsB]Bg"̸3@J~9M 7vu$?brnx&ܱÊ_,y\\)Q{!i^'[$53d#&LCz |(2!ox^WںؿZ:W}ng`yGo}lW띷Ka.vmbg:l8quiRlOM^2~JeB lrbe!ц cGkhgT Wz;76|{KQ˕$BVJ]1<"߯ ?Sendstream endobj 297 0 obj 3905 endobj 301 0 obj <> stream xVMo1 ϯ1#uBbSB(S.jiݥ-TW( 5 ήldfĂّbT ս ( CH_gD%'#E0g/E[zj{Q,~us/CMŬQ^c h0F)Sbc|D|>m0?i 2endstream endobj 302 0 obj 699 endobj 306 0 obj <> stream x]KqgY[ۮ#<RH4)O @,)${YՏꪞpfuUVV+31A>_o=7O~|"y{ F9n_>oʛ퍍a0ܿz;1h0Kn ?^*}~KCLC|}3%cU7}rON;[)~-2y!#-֔Ok&X^`#߳igU/Zyխci<ҡXqܚv\]*cJD,C8.FM7ps!Hf)BI=CSCTߥÒZ0V 3x;e38p/mٚ٘u ;<2 $ao@P078[8MhO L2.J{Yn:˒DpMo@N B޿^i6ؤyB!?0lRr[87hIxP?Tۊkv>,G, >4O=&!nDIad&jjV= A3;];R a:K_K6H hUMZ-X-Hq޶8P>@g`@3pV+̧Es6ȅo3Tt#-$~̔eHd 7"[<4p6>fZ35\ta?޲&ttC\<'2$Î) mKx|dFZ9_ 9~Y`E@\]ȐAA{.8%]LZÚnL:?PbneO7Ļ|`Gz1ldK)EוbbKY2LkG"lYƙM"s?ELҧ8l# 9s곕%k(u1.f᏷j 1f`o( 6fR>ȘKlD\a:R"7HFۊ."_,Fu= ֔[d^>!tm5؉$nf^M4{y :a ;?Z.QW|QSH{[|۲ʽ̫sY])>"oqi0c<6K`|AOlgsf{'EP 9:B'kE=Hs* +W9 C,eD[oh9_N+8ɱ\AnɧCxx߄;FP.zFJmb}1ђv=0KP2Hhyt$3gqDB>n0pFPVĴ1N7w 9fFH1J0:#Tör!{? f LUhZq+1y,o<)mJ@48= ~dh-"[ϲOBџAPR!6HW2k*Z^2^*¿^ j:V%>=!WFZmH51/e9;ob)'[|DzXnEye16]+v8/=Goӳh9;UEAU00OwAĐYEoJO%.TBʽ0]U7dBZRqIx(QQ͖6EzyJJ-EX[&p6+"(q_\MX*t3"ȡT3:sujv! چ(VR]@ە>OGGs ^r|$B\ў>Ԫם@ZfѥqoNC1յȂT(E rqF~c҂{P-!)4 ~Рݗě֕gЖsXժ/r=@3%:9ּ_UxzRZ3wj>n~.`!}/J@JfʧC2x?QȧPdJHIGERAŕE:$0W6=il)(Xiv^eҍлnis>~= ڤ<{7Ɲ ߛE=Ԟ%cI*n?SGTZ?Zfy՝&bNR 3#X d( wfƎѷէ2'HJ^>%aAkXa6-JД3N `  eǾKڢjj3n`!/\VT:23^yYsZFұI./W@ٻoE&.HR^ da6.#:7c7r[*R@̑> ;tl1hZ$!]q+ Iڛ4+_e2 5I{+Q斶L5] ͣÁNоhwLjִ_EAx1S!l$Rj+n&\$)ېxx*M#;2‰NC6땥 1j+SS[o:5 35Lr !FU%NI˼s~qNgCDh:PN\܍4tE)?/*߀gGl:0LnR?RVzTd}a1gjeƵ]EDCqh[K[M'&*r o^ns0Hg) E5K@`J)ꔺYEVKDh $ 88:ʯ/8XVTAp;ܑ@(E$(›+hEqʘIzq4 _PZXwe%#R hW <6ҁ*;Ni} 1Yz-t3HX-9&4n(FjB3ܓ8+==<*[?E}WUIxF>fJէނe#f5:=M }‚ǃ ܞD:KՆθ5^1DܝYdOcrL^?IcY螈1l"ښ?|}ܟ,|c*3 n2BR$M-EBendstream endobj 307 0 obj 6032 endobj 311 0 obj <> stream x=ْGD̛ :x;]060 y^<Ȗ-%f~~9Yɵ1Jy+3O}˯$G?}쯞~$?˫r/Upy '_>7bRFx_N8ᅻFL"Dc޿Q~27֊([#a+ڛxEt4B +vyXg?imMO1zi=ZGk}M oߤ8{t77rx1NޖoW }EyZ!{}hW|3>4p}ZSp'Wvk?WD ۖʆJ uWӧK^_F(vu7utگ yu%, " mC_.Il\PalLv ִrG*D0-܌P߭xl=h8Z[/Vxu+%`J a/GZ\KZez aG1Ɋqg572©bR`Ajplƅw_FR~%$8=&@~823;p9{76#|cFZW샜>cd #'Ԁ\Tq`Ipa*."bjށV-P1=OO{۴Z-|$ڕȜvP.r:>HLNϧ%hԙB'mix.AO6> <_):iC%J8!ƛW8@ʸC➄ nrF: %&m&"=6 GAMBfE#<_QĞPaa%.OJ/F'bK剜q]na pqZ=zc.P*(%G}+z>o".QW]x!8NmqʧLsL_DA 2AX] Q- -ߍ?48 əU%l5 g.>;)_owfhT\t .g+ A7yp݃]GC󭃓/Wfs:f@EXsFgl2a.4v,Mbʙ? k# 6p]iLlІ;@aMH%o"{BJMjĚׇ }hx4K2 6?umdƀMQ&9ȃG|y٘:`OhdlӤa7qCpF6);g(vt/kF[2TMJ$e`\#:EDB&2NQgՐ"h}j5w?Ն\+8M{+L\[|3t Lʢu߿֔,ʸ~Z dcHjw?=؂*IRuÜit0]n%)fLP6gGtxX<.Ekh{hyO*7i"<\=!'1KL0 _JVJhXFDX3?| 4ε[0,@?mFO+̓F rDX]dqRut^6S;G1=՝nNtfUʤ! >I¤a6NbprC5H8{Ya~T}%\sd&u Bq Ι5%c@8$E4J;W_AX }0   ɷ#oU,(@R%`o?:uV_߶ x}Sx9ZqrR#,A/”p9EYTk;I\4IP]j*R{HzBʁv^s88Yf6|l|.iY |cAtU7Gr^V|N5eߤ`K3BnH~r7Iy _( V -p\!qȿcZW:tt$FĞ^:/a} sz_F" n'V `x#j G| c3N:΋jT} S68=b4ΪyNSB3= %r0D(*SF8<[`ۓ zy1P s+~GP&D?-?aJv #%M! J4`fےW4O#N va X dv]I pV +qڟu(M$0pz"\_rS#z6QДFޑ9uWiJޙΗ@f=^f;#Csj7M@ZDّ̜3O)F-g^fX`F\';sd _v#OÜVƁ^^&>3d" @ܳl Y[By,נFyi*Do;!urj{$QK.B*7txGB256[K5A 0^{u0u 4/ vue9wtXZTS')bݟ/PE;0u 'I ]G(b`-v$kd uh`wұJ, v^R,Y[j4iUBLbʕ[H ?oq~:?SpFPhMVj>1 d U*Nd+ʑeU1*9Aʀ+I[PR|<V;r@p* 9Wy89V{D⹫$4C2sY1g<)\ ]zPҼch''*8iqR9w;PL*F8i"fKc '3fiͿW)Ɇé*Kkyf9afъټ.<p /S@%Dr˴."?znY܊'k婊1BLT[N U>@;cuWcLU& Y;*q]`()[Pp_$C=(j1n Xғ?/WRcO.a3:d.̸?l?Xʎ?5IaY sb\@Y(yuJɽ6&qNII1FJIRҠ0p1̀vPPlY*,C|o ;ph^fqge'訤r4"`B3G=N;Ӕ٠11J;4f0@1'8Ud|M>¨Plvorec^=VļiooK~d3y?>paQܬ^ۇnAϘLռVu_Fiã~`T3U"2Cp^3}amW:K_CfKLRٶ`0)_װ/{[ +򇛓hbP+}*Vfά6(}P $\Dr H&p6F2ä\eai#Pf9>gG軤C)gUXe¹U=(O:xnYH(A:|47$CiVSVYȻ*%*-NL[ь F1Թ#uN)x8N,e,[M$7^TL6WgVɾ]/*Z^J8|:^GTyg-O`.gUٻN*A(Y\rR4M G.>N+lH䢸HmLa]T*DžX?sfK"jrb\\ yt9f6|ֹ^/ Ь# =v}l)FN7MZ2&i}bxhx`&Xv|Z}:/:9w/ &s{z3&k G,G >( ni7|&bȑĠ07e(4SԱ,zPL ]gSLmvּ\ 68굪Sy%SgWhuW,qSFy9.z@1zMSУfuM ^7D;Hb0 ,5X9\:_9XQy7hy[J2LZBXD}TyDK7)5+'"*Q;q`v2qCG eԨ>F ) $#gG*o|V!~iRPOlj|eUI/I4O;t'5cmZv& L/0{Yy"[_ Y:'STwiN29o^t8^LaZiR.٧LDC2L =bjF:-arXxBx=hz[_ΉxɌjeö +XERN;4=Xqf1Kdg:LSeՊ@N:Ǿ"82{$g N Io{Ub%< ZIdHgU[#P8\BKF&T ~k ]TM䷏?Yb5!64&TM nZRDۨ z C5.`WlO߈%i53Zo0f?9lRtP@i&XF6пї!nucP@1],߮E6Q4 )&>Y1Q{1ǞK6@Nx;"҄hr˰e9Hu3:U!,vAH^(w^2&-nL?H*mY̹)!Tz{C&SpUlXHC 1nЀi_{nt0I6svFy-'1XRI,sX~?8 0 U'U*rrRT0i{$F HD#&P(U2alJ]%CVP 2}%>'c'" ` kQ1h`\v߰P+8R[gFg9`;U<\gNqSJyRx (KM2S@ [DXqO´BygC ;٭oFe׃ nǎx=RАG GG_,>3N!./ù Kqpqmf^;rǭCWS`Ղ1Rql,+Vg5hzy=l+R- 32ȸrU~Ubo읆:5~ؔ$pcU*_+u"Bɡ#@*"<6@R86M(`X JHwbew^a<"ǒXw׻*A[>I"N;Ӏ\vx%ֻT]WCwfAt{(w/ۼ鲎zeuk彽.e":@}uk"]w],LicI½()rs[2=%~e~-$&3sZHqEBuWb$1l@~}uu ͆ʫ.4~̙;3_jM[%ڜ5 SBKy7}4¥!,6zπr\`-0t*KR贅{V[z*5Bme//@!|ȃ,V61m=qpuyѱ&^,"F>; WzBev3 y}U!EO=pSOQX,9A 8(]Ed(bfP3X!-A1\p1;3:d⇽.W+QHߘK-"a,=.[VǷNJFx;{=o!\Cn,Pxs N-4us 0r$?*\'zю#[D"iFY:pՑ2:9PD!a&}g?z{CMB?9^Dr]Z$n\.j+ϓ}w,.`XHM =rmh3$;ny^srfd`kQ".6gZBv'[`+|hWORb^c;§apL*9CF2sTLDB@z}Is}zy1lwe-p7n_R#uDG!kE(X퇾()J4(QXh,#B.Ɩ>fEY4 A` T T/u"t˜Q|(DD:@`pUQH VՇ&va9qt(Mҭ4v~Wu"&l2;܄H @L Jo1ۏ!z}8CA+"K\p֧ Bw;zqZ>~MX߼~tf.FՎdbF9JIc}{c w|_:^`n-<Ϙq 밫e IנL[ sDkpQ7q$v+b_<+a!6]}#MS(JD.utّJV~~gUR4bؠ*lc9_}džEʭ|PE9 ]mg@k訹|>^8vڿi0 .:Q'a IM&:@i͑]~䁔2I_&өIբ*K?/]jj'0Z‡2BrH\q~c|ÝV2 ەvm)3XhzX.Hl\a{ +CY}Ky-G&O KԣOR[y\,_nNo k꫈E1>V0^BpBz UVnf o=M4e"Q}V6/F *WX(_;]ohLyUru8W.a 3zL*!Nh^Et/Eq)Z_a״})|KU Nw#nau8x:kR< m;OQ4 }[46Vuv-6JKgsJ?aݔs 09^O:|b*M258L_₎ D^5ˎ8_fH orw^G#8n4 _5]Lٌ;_6 rG=ƆeRH!8+$!31aN + =|}ˢNj 춵!㌅Yxc\ 6YS~R/:| 1w>a2ޓ|O_Ļm9<fs!#6UsoP`BČs74T%>MwAQG'7rwD,Mn9|b\Uw$H[(;xW*as{W(ju4*AE{EPgu2wSux(Aϩ'%eQ>xjönq3ǺqX&{/ōY,')e1,}ٟ3 _m994*OgA#{2äD6HS @ݬNx ݌S1Y4ŏg{2i3|5^i̻pϴ>#|K8|s̀(*\hL̈́.޻)QnLtצ y$QӑKz;^d5ranюijҜj&Fg0X`le:D8'R_endstream endobj 312 0 obj 9189 endobj 316 0 obj <> stream x]Y$7rs[o(tdÆ]c%5C\0=;w 2ɬꮚ5Х&8? w> {}ㅌ<(؅!XeEzSb#9Hiv o.J Ja٥4aJšj.7n}aewKB[?)iY$s88Tz"z q %hcOe7?}wi81Kb qA 39j;).CK]l"R$l |[Y\-*JiΩB;ؿH .th;wvfwoo?8o"(YrĴuf=vZ~I ^Xm"D>Op^!E4Q0 vg+~ V*l50"h=b 6vԝğ{7l矟-hWCzwEJcZpxbupቀ3o%>3A^ǽLx]@yeaD9 Ead"i * GΉx\}Z ς("&Ѹ^ I x,7 bx. cJ3+p.s8pN,@Q`d *?7GHo"y |>o ͓Ap߀?Dtڛ1 ;FA {Jc"'Y"7yAq7!+'RoyN!*Kon'3uH>5^m|~" @ОRPy4بhX:i aڃ_x;H__Y<5h̺tIP,)#*M]+2R()@S&OQDP28NgGQU4VGFAID{CyC؁% }N(UqMȑI3rF_VSk Q4om4gBxS/v WPd# F7l:B$f\hY"ȲV=jiC֤aW*{SSeѦv 7CnA?H jYHS*PEUSSSHsIZ󘸑zęS?Аh;t]P$Zhxes,c;ف;^&7%XU(0tĎi"[<;3b _LԶT9PY29d>)ZIgD9J5_hu}ogufe^bz9WMh?J䥵~DqBs8$ WV&U6eQ0{>c AY;WRN|H\[ȿ;#Z"ZPrz͈~уk)ΓKia`g'Ż=r8IxZ8OBuNV*  lPL!rMy?SkDɝ_PX|NgW}4S5g#e, m?xlKʅhQ~A"f 5.SiQEWu|۝3]VWţE6VT sq 1&GΪc7igRZ)yr L1JK6nvT/érҙ 3Q1A/$o?~*HesI;`HD"X'o)h<2>\~p2)s'Pu0BBO dѮUriUjZPC/^?ŵ L50̧uCI !d]P٨imR#X&=RZb/l PStoUap'A֬J<)ؘXưų_MQ~hjp71?M )umƉ hQ:Lc2"0H|gh^͈{;ʁBS RiTo-`ɋ/ 2|fbR%ga<SY=2T?FpA NS ԡudIz&A5/-7?3Y\HAr+C 35Nz\B#qEA%' @fKخJbQ g^|?[]e6uBu N; M ހy$BV9iSrlLB2OKEJR6 "&>fDoUؓe&PkICDK/8Am`]N=5y'ժ18Ȏ)cm&qyޥɠqP3obȃM@5\i1筝G,*IӒCX_ōCl?1uřؕlT y8I5ARyTx+kj26VU q"8m ,[:}|Bu@ 9m3%x%qG4Y/n{'F=9K_{&SښgS5(QGDi}C2!Pۋ7$vbt͆(EMeVpWL<$C%im%0詬ji4ZLX'>u0iߓg>7Xsͭ5.L(7ht&Y^Gz*=sJO(8a\U[zo/sX hEV XSg<ݶ)2߼TGOd}NרK\#B"ixѢ\VnW~5OUțRו~Hvʆ̖9( Y}ʜ+ez\ ][Pqb~" QfHG'.*l }& n BKFr:n&a !k֔;_Vov|SZ ާoFlcfWRu[.좭26i,A09Y*+$[Bؘw:JӲ8-ݐ+f h& &DF~ȍepV!hEG_8.AUSl)Yb9r m2Wl*[}Ye}RL r/@kS&@w25]W#Qpΰ{ݓ@C|R-FIz!l hu@#4ҝl(PKXfF ~Ke#Q!杏yGrjq@==ӛc -)&2QҔ)FD*OZ,f: ]@2/⍲fJac\xW|CORt@4e3Ctv_gVJܫn1*ӟgQfszWIJ3/ekS_)4 BeD=Zh9\~d=u|0df-,>lX-`S4JyELԬbrX^~J iH4فt"PD9xU.mROLK !3¢Z {1ȟt!.Ra!Uc]S# F=_aA\1A|_x= giq-☶j%`gY-ʆ^WQ~w+BEe}k rfѣ8^HNIe\)[ݨ}x}H~ rU6~iN4>׼w)ٸ Z)SC+#&Ozj_Qdh ?dF!\2+)vh=P,mtk 6IKDD9Tg8T=mV!c铔+*23΋tڪ51LƵ&@ȡf/qP4 Qe j$=Ldf} ._(RwwgGtuuz!ONʧx?V,q᫴ VGi18Is,#->-Aᳮ#* 2$?tfm*_(= B{Yo LQ;kQT뎛EB%ڪ+&5L+Uh㶆c 7ZeZV8D031>/iZ)Aw:0@rY[ OCM 3t\g6`yD/ q>v$%}MwL;DtTB"P~p%BKnˆRe2KMٲ SQ:Pxew'JǭN|~UD詠lY7¹nhЎX: ¦(3]PD4=MAIڏ :Dvb߼Trfk.H@}H+o:U7 t<3]FaQ/kڢ-4+'QݝsoFV7Dծ>[>:(i郊Hq`M|<oM{YS[#OOc uX2j6bk~W,mW3i *S ]~ *%!tƝ10]1Pmi[ʴxP@F(;$!2-ls8?z~/`mgkPcZ֫Eƺt! a>]\xTGU(`X ǗÍpPŔV ?9dʐ4jnGq0%fYJaIu_6DO% >nȀtr !;} ,'p[@9,4:BI"Sr 婽r%ΞUĒmQEbhF,j=/Kd7'*\Qe6wLΟ!Z /S{#JmzSF.40@063-~F6TؐCus"'_"뱳 W!BtV &d P͖>TXP‹)E6e0A4?( `FF" !D~'w~r)E}G~ Zb+S8weiV25 L+-5yE%y>E)oCPoQ7E Ag(/^"S1W3!Pb!~Va e3BU~yLQendstream endobj 317 0 obj 7000 endobj 321 0 obj <> stream x\IwD~5LK c&&oI T/hl2χ(֮J؄yzy屙<,$}^NO@ DH''olb5aFM)&'?n:p)Kf58^M ^96WֿǕSwq.Vh?Jp'O<|\K-g2=9䋟a'a&J*`(\o< ^|cek?d++8΄Æ$iI4S FO-8L۴ E hA$0%\{mj/KK nt:"U%lMRp<0d!g}'KSqL8 S=ዊ/E5~ZQ4mv_Mg",^5i?W_qXzLj Qt 'eF a?;eRs(kZ9S(Э9g\Mqi)Q煑ʦ45TJڼA ZPҘȑcR9~G 3(D9 5+ETI@ҌpVE]WRk?]q';09UPi7wzub".6/P50y"9.,,>[/yE(ha&#&K}}z d-=x{?^"hn {d˃yr"HK]i>Xf,^UO̚6g80|-,$@`B{ mkv52 MU?uy?p|YK[;=E$V?U~x8Fd_2E$>$}H%u_nDӶfː ]P^go 9!Rp7F"*KW]Wx? 3tU"+Oܽ_HkW70$#m o20֦Mqk۸kנE%ٕlMƅqb21U)?̨b r 2'M3d~ޤ [˳QV~oĢ^ &W9z s>^c.{Yϐvn C6!. a u~inp(5UZ<P|]35a!岳@\um!{:6_ ~#]ؒ 4|oEFcoܕ-!>\ZA,e]'uާĠh6QyL q 緷Z2t{)+dl0\4BEWZ3]c*i5gI`<< `Yn]FCu`EAL/|SdQ|i4f+m*\Lv@eYK♱w ݫ(r2ؤ"j Vk=\|\eA֊}0 0>w d!xGL$0+~n8d.:4taN:UA@%mNe㕟Xwf%9 9Y jDCyCY,pDOP.D_p]ίuBȊYvuBoV.`!Cw8WWHg˻%Ol.'lwSA)WL^lbhKIy[djIҶ]C YE}vβVY46IxH]2ߝ)u(\Q|{]M.SOG}Oh 5~I9ȧv hA\z܉Z999߶-wқ$E b1m-rwLs୧!0cpej$ ߍ=MNg\mlpgRd6yuoni>d|\+vG}owg3|]/i_+h1Z7ѪV0X? IlcE3>@V7 퓶{n<𥴭}f-Ng~N-& z|58h4ԛ{,tz?=/זA~* _[iՕPӺ2󽉺#u%a)E~9Hgܞ$͵}gQAbŕxbOhIƭ*T 8YZ݃{O'zےcv|ś?ʽrw~c-g;1/E\yǵ8e?Hh8lSUZEn0e:q}YE:ZPjݝW0@ j*mPTM;z;,Ni>مĿ>N*]2D׽_b~&ĵy/T73fapPjCf>ߞ)+yendstream endobj 322 0 obj 2555 endobj 326 0 obj <> stream x\Ks #Sa~Tr{-ۻdse[DKkUm~}`7[ӣii-Ԣ$+ĊO/∯N>U|_zu()VBƝ_Ypju|~zcaVkEym\V͜Rq| ]ˎqs=?(u֟m󿏿HEx7}|1xlupWЬr:ToY/^q8_5!T:_R'IW7 eMa-Z+|-=\adp;nq@PF9LAr#}!?Gm˱pH ) .}+yNo ک)rHdH!NS5/X&m : :,lbwZq/1Wг`d 45iDB9-x %Vle^:؀&B!6iQQ#zrG *q@z` P%fR+lQ(z<#y/(&vC (y;_cv[ Vf빀mbp¨@IAIp.a|. 3 9 )?:pҊ6TX+D[]G𚶚>2#u._;GBP{|.y^L(+}vm[z!s 8AP!QAݨ,8Zc[3R2 *Olgݒ4L0elnO#>>7Z*\vy/S;ivl)Y!o1NNJMEU{%= Hމ$DJ%,~2T hQLdD4סQ'MG4u;JvmԈ]ffBfG T)҂0w=Vy`wț-}J,yk٣Pp "RȖ㻦5yϻ'E߯ *>|o±o5@5-KLHWbǷ aN-xb$k@cX rpiZA %gv+Q`8U` ޘ%yRA*\Z?t/J8R|)Hϊj= Dr1TBsdw5wjq]tzɻ_>O~MI6pP_=}8N*H\{QH"̐*X0\ee ChNgC}s ~*C/Ehqj1*u@^nFw7h@4XFy`Mk\ħӰ "h;yC0hC@O|G[2 @շ2d΍ *~;ሹzhY|uKR͸#$3nyM|AiK.F m&-窈#"i}$!20I-v 1}o?NDeӠ@/}3CX=#H^LM{&F.f}a'{Y`optRJ±ΐ9A>u2Թ%&e-s֐zrq&ٞ}Rl-#[Y3) eEX\NPgᠻm{N3MiӨPB(Hw $KWT# ,au^I&YҝO8I]Bd@\2u,7 yK;]Lͅx9^9|N}ceOl>['}]GөHw>R3\ӣ ycP^Tзtbmd01(A) JT<(XS5S~,4BpOB3nYh |.;w~qWG´xSfkeV8911t@C{ck Sv4Ϲ75G@+o"&a{_L0; : `۷MȮҌ}[8X )Tn'@֬=wg.َwZN-奀vq-t~-}H&,@XI-Sh W'qiQ }"h7Ojܣa6-F4fkX* ӫ4RޛWXLVX`rmˆ0{9WJ?xġ6J %)lhZAz 'D8ZcXe1bSM6Px˺n#IN bw37~o\E+1%LgNoQ90.]/-c3 Q[v:UFk$ZU îqRpXZƓ!ƞnm (*4SAرolDjɂȈ?bFaZl#R;c;g#fyj!^G,[LtnG=(<m#EZ0<[İI*:MVT@(/t錳t:}Q!WK2)d!خ`x1ѣo\m^c]T:D;0 bOE-]F^g?ӭKs3\aW@ [X]oh iHP{dt1#<\B/zgSaJ%^LxkhNQ4;4!}:j\R\.ڙ]-3PG4 йacV`*ò6Cǎ N?XoG8] HJ/TG*@ʟL:doGBô7 еa]}DGG;endstream endobj 327 0 obj 3136 endobj 331 0 obj <> stream x]K/9p.YoC&V+{7_nrYM6pcVM?HTO˫ߟY\;ha!W>˿2]JG+e09@{tttZx2݋uz`K`<:`p0 SLI+fqR ̺+{UJ:aeIoR:61"q`g?iAih;z4cArLxgv- 31ݰ;(M1\1vALײ s1 b8c۬àU= PQٍWQhr3fLē|V9/ieUlt.%.F59)4̓Oul4i5kӦeEk"X۹|GE8}l/]ae}t2d*,}1%Ll}ۧI /MslBr~x3aa>g YӭYW T\!Hyp;n^ePo05c ΝgoO`;9lc DSa&J ʼA^FE)6[˵+yЅzYD@]iK9eW <`1FCхiD}(bkGHy||H*QC@:Al|:0(i]EGw z(Q]/Zo}LKU%5kccȶ}Gzbr2*9zoy0=T@'=% xR!˫QrC}gN2 ƦrS?B`K (u~!jb}v^)¥ H4Z2P"li%t(ʁ [k}C -R/!;(A)C3;8c\2fڻ ZZIIIᒆI?TK4)p?N6ub`9_ ~}&9ND_48TTyvX`vM2 h9ȍcUb8* 7SkH\a@Ң DHH !TN8!14䩻w=CGJ:ߚԳ%FxHz|SLrC\$qJŬ]A Ѳ\G:Vp&N)) @c'(73:);qQPBk//@t=UFb&cIk*+V,s*; u|'Z$J`pCQAVfS_h%q5gR=0Nv1n.Idϊ8sIblxgۍX:r:J]/9i YT:MkSfK<4T8ja6Ď8A䃈|F@inSCtm^ $u 3vz@䅲%b©"Z5K 'Lq|!ZǷYh4Ubz8?C|D?P sЯE3?@ɜ]3B,@4ϙ0,^>L[KK ; D(vnꁁ8nҹyٌ@cHb%KcU|u-<)RJd~T>0QجbLפ\6 >~%~枤8F6r 9N<w)rjz(1R,UTRkb>jza]f2NyZM@iboZ2w#ٝudjg?O iL_Xߋ`z?nnB/eE{~:R7D쯝7m*n(m=.zj Fܑ7A'y\/ =KԜbd9TzH%YǓlDiG)j]sֺqU;!P􀨧ӴmWOpmtCt \?p^V~H0V2 E+fӎaF`Rx{Gj/Ḣٓ@96s1aINj3m,iwa |yf꥓ϰFr*zxWo {HF}P dȽw@4x4uB9Fs+^󟬉rk" #3{$n,!EФFѴ kjFO$i74Mb cYԤF:|VhB?:_9"kQ1> stream xXݏ7#+{C:$Zzx>@.Uۻw pU!d

4FOXL43~lŲy8GY))%7).j+EkI:=*Tkax I9v,72eYU1=֣;uWK9RN.` {jm&p-O 7"Zp\K?YBjWm홼I<[F^D f\2bлge Kx>\qAs0Bb."Usܓl )d oı.B%v`/.¡'0R:x  D:LҰ3"OJLy8nc^9 KDC>e1Z;ƨ+؏+RuM+2-wrJDB$BDdE^lWfq&ٔsQn@Պh!30԰nNJ갥~ՊjZPvR{'Uyk>5_Wc_bpFL3K)6 9j FЗ8~>R#PLN:V]z쾩nΟ9iN(HbLK,-Z_˾C4:eltIv[*YRr<oZWSj:<{ozfz嫦.&Z&ΰ BhkV2r {z[WqU]]`5GACe9FPxYNl^-NaDr Rhx(\LjY6Iarl&o H+9y& ,t ol+sT aE*oN<hF|^;0Fqp r}_$>nI-!yw{ހV5 0JSԈ12g?9endstream endobj 337 0 obj 1033 endobj 341 0 obj <> stream x\Ks+,L ޏd'N%e'N*(T(Y3> `fAh4uc:<'}폮nG?=GG_Sţ< n&cG?I;%MؽgaTjwPJ r~FY<齎9{L>x8vtG;!ڝc^HJWhAFi1i""0*;hC"+`i30olETj>m,jXEWB;ow:^;Gwi e3жT4:Oov^& vRV_N;ɰH {(8|w99#r pN%~f6 &փWV|vGI k 8|J$y8rKGA<Y}*'+ Ìavm}sP7 QVľBb6I8n $aM&a8†S d%}L]ڈ3s&)H-m)91fo[ZЫVY EK0^=lSfYm,ڀ0"0b"Yg~+3af7l9BF0=T<'a>b>eRJXq"%J\sJ+q c4/#X`ak&dwAtߦoY_ Ib,P< :G o\k6-)~ae$ހM?q$|dJT3/Xi Nᵯ_pD!B#%vS Xn([TlJF|5?h,4atb\)t Bڈ-č[65IqҬ̆JQRZ 't6+ r^Xtec-&'_Uӛ~U9I`sF7 TjYa_`LAhp#N xC:f5I,gcd3l'y$m^Lv8c} 3&ШFB7蜆 ˕qa ;:ځ1z7lqUxI,xnw(N=3jeu۰a Q>P"$/#:̤/tQ;HA@-2,VwF) + ׂG\.EJKR)Nux>Kj*\cFYPXFcERFV/&kaV686p0ؒI&ψ qB9>)Tu/E0AI7@^CgpQ2@isYL?_hix<]gnM?{ӷ(-Q=ڦjinP Q]]xŽcX* *,} nk(£%}Y[?mC~3Ƀ1aJk~!u&$8 v~Y,;VzjY@ E&wj6r;@ϩə0%4{<,a.Ulw-䝺EQB " -qZ\>v֐{Bݓ.Do\^USB)rG-P]Fu0y*U`6.3vq"ˎMY(hl qZ ȷ#İMVfDtɈzRp.li=7@9vn ƨ3)?c-ѡإLd# M>8(kۂLF8Ln8H}*(RYICUN7A7F"k .)6"sg]w"f9J)x>/K&lEp ma x|6;揿+fbb1{P^V6YfzcMAOVd:hfjMްǪA9ڷe |݁z8ّ2?lx g@BgEzjxB:zTe3uG;a+ȗe*=x`Ϟm*6Y>NJ1y3qB\peJj.|g. [m U-M+S0j?\b)/bSv ;K# هƯhJ8%K7*9}ۏ0 nCqBkHs?oG5>ekA+/6eG6MvX/q¨6 ]FX e~A58\5}L-°ۿA{(Kh$јVVfBn|bAE@£nPRTif24eMk-}._193Ƹ]ߡ!o AסOX;c#R a_qS-?ߥ,6˛,| Ę=t{˔UW5ҥ4D2 TOӡzi`>-`2z^Uӛ)CҦs[cS'SEVb@qn-tFgiq)\g? ?)x! `U"v:5@UA[ :"gnʦMrRL-u[׆ڨG y,]sK:}uM68j:H,Ҷ}́\9gl/"Anhzix ]SNҵWl̝L}71[ݲK[# WPHp ָc3ς̕OInݿv?1 M.U1Z>6E>'iaȊ> U*ox N Rwa:BQpA O0{Hd9>M޵`:nF)F/m;U6 K+XΐKkuo#[|vWsʴ?N9s'FHٞA'g趩`Q)'bssNӵÍvVB[b%1;:$ϡvmK%b6O~ƀ! 5Ҕrb ;D؅ ̈X~v YENl_, 11Ĵg&aԂp/8UmOb?99RrBv/zH䟖U&FyщQ:5|!>endstream endobj 342 0 obj 5250 endobj 346 0 obj <> stream xrJU~ռ])IQdrdS"!  (ʿ{fvgE|r ~O=<:DLO?OyU{ç _+9(lmDr1y '<`N/OTnnznSgjnkr[lwm޿1Ѽ?Z,7 Қ -'t?~: %Эp%M ,0U"x5"w߬v:bPo":<,X/˓P?{p\=z*MVzh[d@Ilr3owڼw{ZoҜϯ7Gw!oNKGϟBFZ*c}2tz(ʂ ~\}nrj$6rƮ}!ew9E~ŀZNLѤ%zճ:JwjkqZ|oAeG09W}pV;(TTzE'T9 WS_ m@yqnEz)1pr$[ۭ Gs0y^9S'8xּmэ^$mԞfq9_wFY>EbY-\bCn9:oUX=nz|?WHVO!>Cbiq(% 9(WRY3k7bRj+lu J|uj"BhfV(MJLz;8qPp+ej0Z8ZE;Kdp`Jr݀::|tmz y tE[{2Y}AHHUN-=u\\|VYzRuny|@j#0UK` X%/jʦtdT0Lu+{!PT ]_*K*Z j[k\uJ!;7aY3ܓӗ02Uh9z>ṙ=CiD,'}_g5='1>u7zySUz6㹺ב"L<3 D7T`-)-j]b }bjp>>/:VNI0㐏@c5GSWV=I 6hHjLvh4ء5(ު7RʨCeA14Qՠ dj[{Kw-bSђAӊ, `9 RJ[N+vQ$9k @)k<m@VuP,3ĴBd5$q캃`Vn-eB 1e7l*m ƱZ pH0GTPϠևZ1[Y@:[2XѲ\&+/[ }ޅtE@@( 10d0s<eb 6gzMґ;@0]CjaBtYw\ g06 ?`Fz1֬1bAGPN\BZ > ~ڪUT8$.t8 $Z;N//YURs PMFDJ>k mc#!s}V8J 182Bͫ ң&(1`M v)hn 9MBUҵܰ{˴ Xo!Cql [wYe;jL (KB)4"Kl N0>iҚZ/aRAjwTbϷ*QD!zMx8)^pviO#fYI TP$5ڍq;2 Y@pAIB>}( 'TV#c:0B:QwkG /E7x Br1ܢאGNG0Y@!#GUMNJh3 ÈCvhB jǫܟ;M;cT7lP43BׂT| :v(;kHvfH')s7sKwq@\f^P@ߟzlY_T1NNV5\q(qY,5/pb վbh@8Ԫs{t6؟ߒc7OԡvbՖL1dEw k4"8 =:iW?1H>d7\qcx2+#lF*9_ZphuMdŀɻkLX?E$ڤAX똨oH}g&@UtXZhL+wS}PɚS* "NTUNŽFce׍XK;U]3I/8e-LJ08,}lF Xڎ4".蘛pS !b.v>@pIz 8-X9Mml_;>Ł xɽiʐ2d }y;8 g(C HX° ' '͢eh ?Ih hBˠf04% a#Q)߶8qw/Xo6t1hm]c?%ʐyh'fOUWQ?m1K)rοmyqI↟8݀7U=  b4@ƩmCBCj `6;qIyv|svB\['ݰm! US$|7W$,nC)E7ɉ^{53kx~̺44D > stream x\Ys7v~k~k^Ҵ6e5JhC1 S)Ze%R()J*=`\h9*rp,_}r?:goQ?79t3zX9s+O_}Z|<8d ;=?`*?fmsbhgRq;݇{+41Pe|z*i@8!bg|s-jJ3dYb^  0@Y+Ux6ntEe`˴RXBcrz%ѲtS_t'`zfWgxutt:98{C{lvjrF{O)w𾑮bO$aP '0 -16s^>7~;8htLݻnhې? ai 1Onɘϖ YM-\\㳆g5~IzxqjNO}YpWpWyyq#Ng3f?ytlg7i0U~_N#4(3MlzyrO9g3=Z/vӣ:g^㣳{/2tggG! .?`HɃ3`{ s~vSVooábN[]V-|l<R27op/'dy1+ ܲ&$ؗ; ̊Sd}XNS@IOFկ*vJHpR J!05Z\ڌT*WdU\qµ X CP`9}e1)bf ;R{֩a,g ϋM}qeO`Yа %>K X,Wx<(qZ.Xb|O3.­JX \D#J"xC+:pjD IH (@X7h*zy;ߋ)^{Ah_Lt`/e83 Bv"wɁWB\2JO|ie75Pz&hߗǛbum`\,\J4x<7-Vs%UZ,;HĵG%ɔZ"V\4Ff2x%Wy.@ak`oAhxBڀKJվ&h }]mj0D}GhP~S WPR4@ߝqKt%.|tetq4CQ  /Q T*ul>'v/@Tg>~ r?N虃oKnG4/p[< 4A#Xyޕy#_MeȖF %66!PPP ѦO 7Ľ]m*G{&">o,4?=NJh.ri1J}6*O5f`}nGY&=rr%a0m'D+%H/-eMvcЛl t""<ou|R%5GPEB:KU Wi A Z±+[ n^Na\rr!@`KD 4|x*u Ҩx(QkD`e븄fz ZV q3{Ⱥ (ž:G7G& q[NbU<  xiJ/h"@: dOpz-9HJB&JDI+k #C^V#]$HeI1B Fz!H(-4"G*%9SONaKG J4h40!QzF/D)VӋYzuhkVA1 g<tJ̉&ScwpT߾bK1z]hbbj,\ jD4MOD2YM(A0YŖg q`Ә,)fQ&4Sr%OY<^OlT`peņI9j/,Bۼov(\c]eq5;n_6wް/z;ގ1D+0Ȳa<W;$2KطK)Osٜ=(nbTGe: *nWaՈvb]Nq@ ]< ./6d/M4NLͬ9" '!~GGQʵtqCUw/'kQE8>]m37-Wa"Cip ѡSH.u@lrU)5G^B_1aqjփMF=˘Rȱj'sVHvؚ !cIµN'VO7'h#;폼zU{9\i'qY<)ĊZ1T!)c X@FX&,X]K ZLt'˰|pY@'A3R1 oN ,i"pFM-:9ɚ te!WHmR$Z2p)k}e &N/Tt`Ȃ|A$o^)ɛ_༴ =8{u8V^5ZkJblz ִԀ*!p5w.Աno5z8Es3>R548eڥ+PzP5ԌTPQ˺j|sC0IZ^ś7&S. TaEKdጭ"PZO%2$v)ԣ-IFi'fsom].n ٌlZ1d>cg/ Vcۅ @5 # 0 N{*qD`'Lj[G '}T-g(Vr.bne)8%xBCu)dNl.;IfC<.fk̠syˡ.SYXM"H$QE切!^JKM*PnbUmQ ,!*FSqg%>Nn~<!yKuLY|h ^(ٶdX +vdOh DH*2-WF%r#[WpVx2 Xu`΃BDl %#5N (3g80+r%/ߦW?؛QңqkCxN~W7%[##; BtʹWx&[J"%5(,3JΥ,eځ % = B>LRg's0JRz-uotvk!NPTX/*h9 0B-u8!#|//%[#l_hMgx#-ϓ|1tP);i+;=b%mYZ-ՆTvBqI6M ~k8:$&<ؾTVK0A Kb(:/HObIGO_6 eޡ^m; c>c(3NHežlK΀g>k[+Gebјjp zD> qJrpN64E6fXF-/anZI} "}('<>pêW6^p|Q]r $wQߖގEFˬtgw,;KZI)qG1e|x=obXBzЪ$jKN0Wn)*#_[ǁ@f HS&4ҟxdFe89\jaeQtHq!Տ*;qRqCáu*x?ud7*q6fU&ƾ 4TlڥwLqڈw.pl&@$$ @Ǘ#F6[QP͝1fR ^- U|Kǝo}:2$ybr"Tz3K La3X-ŠS Y: ^4iBK]reDIF,e͢u7UKbmZt& o(eJí}TKՆQ`3kM`r9)eW|rD~.AIN[wòY>GI֯ 2w!Q9Qg}?af_hNYZŻZ`(Cr$r*skb<cG`:ݠoZf\b]{Gc|Pw>{/۴$앪%Nױ'#?qZMDRLFgpPB]G$~fڋ.qzb>vs"ܘ- mm?y|^ƑU:,|={K9dendstream endobj 354 0 obj 5406 endobj 358 0 obj <> stream x[[o~W#RcX/) +VDHDAqtZ]IwJ؀Ep.pZM?>ڮ|-~J?V/`+{#Zm7s3Vʞ[:~d/<͚JJ|f-6z*i] jD1{||c);+,3k&]"29%dn:xF}3Qu)jIQ <8d.vRvMOVG05ؘ S*ɳ%z-vO%>z TwQ hقIm1>9Gu\]4e#ޏϘK$H=Lˉq9r\xܰD$51v\ zaװm&y03ZnAs="M<g<,HĩEuS)qnPtsK=™D>`3@`/!ĹBň9/Hs.SȏbBL:Mӎ=Z-Ǚ7o֨O^O7\?YoÂʛRڧ%4=):u5T-uE%*_g H$;^9(1cNkB 9v-_ȣOXHZk"_@a&# \FA̝vO|μ +pOjïA,j$?h}2U3"쨻Jd(ؚHdmjBHj`0 `a(o1ςa8}p4S{ HkXʡp[{eE hDH+!F x bm)@r,"^_NpvF`$6A#sEi5"*Vf =[$?'75'h۵74@LAځӴKlYVƧh t^1`"bC s :♳! a C4iȹu@}[0ֈ:F=a.9S`JR* a?ӱVr<ҠGP&0[aeޮ5؈A[Ԉq7]| +oA#ߢ1̍&Q3Bei8M \%(ؠt"J s VK* 6" <@aE %/yE2?D(hgI9zKdv3/Gxe|wRE S˘e#gZ2RV.Zn:DP(`;W c+@<srp\>,đLG<[]od \.)M%i(?!D.]!8-wǧPeXiMBvs{9rs gŅGC"zvrlOa@7GDZmbn`Qaݽ/v?W! ˋO{@&v}hvA_ٽݝ/v_v=>^&8?D?p^@h+!tN>=XF+LC/;,\@04B p)84(<#>ABCՄ,@2$ C1A[L(.kb&-h* Vfa!y,]6rwr, 1)-`D;`=!4)ɡњkʨ6 uX仉ix;̓E)}7I˞fnFm1Ѵ7lOS(g Be禧݈!_nix?jqx%˼s, ʔb6 4% "olE}y ހP 8>X0V ^~ag5{< nؐΊk^ⵍLZ5 y e/vtj"-/TY; irBNunq9CxMAhbu܃CqO(y1i\4YhSw,xc*E  ֨Rn,=l:g' -SO2a)jvmceie'Ěw%{͢~"|Plҳ_D A(aI|+oX. ɴ/ɠXBf3*)} Q$>aSl/e i -\ sǂ:"ݘJvjjQ`?4՟ya,5HNw/sFzbżkDN4=v54  Z2Oa%PI@y056(r<`/!F#.g}vqy@M3`aeJHpM[ 3e֗nߨMYk!hD܊23 M"^R.[tEG#R=$xkaHDɞs;dNgA65*,r)Gʺy蚡 D\0i;bya);4W-= y->uYC`Y;H3Z(u*ᣑW,{ r3"<g?pvDb-k k{8Л7D(({D!M%2~f!7IFf_*zĀ:ve[C0Kj24_EDdkI]0bF?DsHꗝ(mGmڧ46Tׅiu}obw{7"4jS]q;XFǯkq9zAZ>-Z[ Be^1,bR= 'ddA 3tfI!2/2HYYWcmI`YD{27NxM ʷG'N3?tm­]} ^3 D3}l}VU(aqSDV9Z3*U0IbkOJ. E*ph5.kސC07{,0k`߂㯅K[Ĵrp7嫭~Hendstream endobj 359 0 obj 3890 endobj 363 0 obj <> stream x]IsGr#῀Ӄ}Hj1mJGX>PI'+k׏,ԫ%3˵=f?fgo=~q}Ď_z={{ :H$gϏ/3X gowwMJ(n xivs'mwqbp{w0J{E:g:;Tҝ?6[ᤑw$X!]wuvx=sVsX07>fcW{Ř= /K[Xi'OZXrr*?Zf8]f\.£fv^%wr')q_&)w힟'  Z8=1SYA x/j2la;jx;QRxJ3;wåܽ$9??;;,g*w4`[l炉8TGZ+IK=])@VK9)}Z$>oY}>s˫ ;m&$7X^MxWi8Xʄ-lA{ޟQ>)+xg $NI {#Ƽ2\ Aq'20o:47`GV.-O'/dyx:;} Xcؼqرbz-S://#a8H11dJ(3P'P"ݯù=K_]\>f ipxza"/zdOk'lh qʞSq<.ϻLߔH5R$)2d=7(di&0hZL% {ѳKCEy\~ ;8"2Hso.;o,qVGE @rB:oqdaKtx_vಋY9OcK &iYYؖ8"1=K?<,| R`szLGF^Ax^G"`[5~țe>d,H Wj˭>B"GȲ*|#m1`ٟ3y~[Q R=.2Q9wgYp{73W좐:H,(^y58.<-h@O~0#T5d2J\z"=6 ]n( [<f^xKčhIt~u[/8= ݓc\v?/lcU= O/-¼]A\@:>?$)>ɏ ,=jMͪs^*pn J'NkQ^;}_QȢMGe9ѐH!F\UXyVTC E{|to TN9Ơ{z_~[7 6C#[3Dg4>N޻3|ȌZCwb6G&[$ގ qݫ~H419I)?T Qmc) \qCR!'kf&pAꗀ>6J J 'dFxÜWI?T8+XR**[~D)PJ.o֕cC"-W#xG˯ l_n 2B}<:JV7t] z*$%9L4]pٗZNF/Z3:ÈZ3 w=5vGyD/QDLO:k%]$7:KDTW_ǓԦ:IppwE%L*C{uZQgbZ`DHjKػG `0HzL¹IZ[SAۂ4@vSwd6+f c'J{Vpg)k7KUwi*|&pvzx5F=BZ"2;(o4v_5L\167gpCJٟ$6JqN6E62EOo 6^i :|2 o$Gu ~o '; G3PDD3~ȽhnEL yM [ƹC]*StCQc}9qb=L{f_fyzBՊx]0OMTN^A1+rBLm9̈́ (SRΞأot`c-GMit7700䵉0oX +PW2bj:pi4'x;HiO O;nhh)LGTVza-UpT= 'h0CSyL7T5xU@ 畖$ ;:n` b2tGE[=jG0e[f(g>1Syrtlt:T pOxrOtuHfK~$~Inq4Xڑ,-Ob;/Dw@y@ b)G_/v ~GCO16| =f@Lߖ̀M/˽uʭCa=p\Dm}#lT|5"Mn]sҼe1>'m.Aq0?eԶST*Pz^Ia HP ?gme]ޏ[Ќ@v3[K ˘&ɏì?έe fs<4ڵ9l;-P9&JJHMSUu8{I"dG-ee&k$ b ~.],i3*Ma; [å@bau(XrAfs1U(BiK7}'CgNyys&XV݊6Ƽ %`XѭE\Yo)LU/O8pD pz\$Dr~2Gy6Ϋ4鄴m&k{+xƠbѕyه9 Ώ՞hF S3>Z&3Rjve$ Z`W߅[)Ķ}ڬOuw"z}qYѱƕYF<=tA󕷪Xxqi*žbKEL we뱢/ٹQr)pQeoWG[ܓ94I\CiD|)~f'YBc3 7ͧ*PaţqFl({I1̪wS1:Ae!,tN7q\҆=xI\m⟄㾋 W);h<~[Ѩ>z77+qD k3rP0!:~C0h'i%]g\[W9viŦJ~ NdЩm^UF~9t6EwvRV>NS7eхG%T+UQB5Y/hyS SA!\Uf*EJb"#endstream endobj 364 0 obj 6711 endobj 368 0 obj <> stream x[Yo~G,d 5QGR Lȃ$1ecz{m0͞ǿ-Yϗ M?wBL/?/y{× +<_(loİr؅-xL?ΗOTn逆nvy3=z ˽rwjK `Ggm!xyqj]w藣77*z~0.?.?Ao~>5Gq (8{uqzszpvzwO~O{ȗԻ/_ow쯾_k* wF4:*ȥܬ=r>\ 3bȆ;'痟$JM7ϳ9//va&៶?^)Tҏ qˇ\zjuaM/Z*e>4w-Kݻ&*}emsw`)1l6s`葆i}WؼKFt*nJ,&.2T*,3%q;&tLvo Ōp{нP9%oO<+t-VPkJ;gG0)@q:޽ 4| ltݗhyfx*_?p>/$]i;ψbgx" =9Q<UyW6%.>cb0 IJgly<&RhD) LZ`.?+ aH$ڠBTGu$<I׎Id%7VL8O-WLZ l=TԊ*hR`Hd4{%f YPz (0턩)̛Na`Ck1J9 Sz8s-_V>ю{T ]]-=a2Ȥ5`ԶG|1&*P]Zpbze,1[[ȁt'eАʹP6Nφx!NC@TR"^wQ!-Hp 5*R%}#Sj3S bRiQc'Q);1@R˸ B^{*n4ҩ\>#{H&:+B /x71<ӄ =(bmbx P$* 3PVkKPVFjzy XMdnI bK\t>Bi(- %IEgw+x Q͔(hdv=SW'H@ Ƅ~Bi⛊/Mg@UMdz mr ' Ihf[l۠p^n⅊)z5a\1lF}˯C3ת 4h؏]zp?#; 7o$Pdm2Pe}Yk$O^(-THlą[f88 ']e?F)_;^=4Y89&)$b&~}ܠI$ǟ)]!H<$E<>5KcPv#!_q﹂xHt͙ǫ7 _ wYkSBp˼VX'|+PJ7ݱs2kRĕp"yz/%6wѲD݀,D>OvsE$_+=ݪ{)jf@)9'1p$APJUW ' ;7 XQC>YނXfjr /̈-v+tP}:p=g2Nlڕ}6Q/7+|ECxVɅ>HekdW *8YC*^Qh*_7rG5/_M ASZaĆ7Zi~6aXP@-FZG'aR`|;&1՞oqŸ]5pП*%y@(BReo:׻+(YlދA'u:'W=y4E,Cmn2ɽ74ՃF-ov/PAnbc}74l2ٙ|!'ߙq/0[-ñ\#@endstream endobj 369 0 obj 3387 endobj 373 0 obj <> stream xZ[o~ /ڜ-HHah#AR|Adٖd7$wwCVP9773ܷ;1˝W'=='oOdwj6SbvNٳ|R;lݝ:it/f4azCkaTZFJ5L?K5rY^z?LtQVMY^X~C?{ή:3$ ;ef$LvΞlETj =DTvDMMFzn䬞9;j_DZ:#~r"؈^MwIe3Ys#vI JTΓttq #(Ⴉ&{8LS߽DP{;ӏYbnPahEtY|$C,*ܜnzN\6*,-#%(cۙ-**f)_k!3o - bM`nO.mPM/h vLlwJ1E$VΆ, $}vRDF!H2A6@O-!])GbTzᎸd +`qWr2 Cfm=..Y?!CY{Z[ 9-cz{ +d1htň\I(m,H/9 "  Hb Ֆtά"ʏ^fAUYGӲvzް$.YJ[ SVE |fl'#yCR*&#YvJ%- & GT\CN$p)`d%Mr{ʘhXa4ĝz꧌ .z憺(f>.vطY[c2yz5 LYYF'Hrvs*):P&K9Ȋ9 +Rˠ{#cҳIT^OGSM@k- r#Z c[p>U 7hˏ۸ݶ|.u$}yUNH EZ;esv32"j&ED0}L@&_7F]:`x =CX?d\Gi~hs :sӨ_2o*eT%(EV&Z1][$fЖ<>ƽDbÆ>_?fzܧL_-5>/9dQ9 -ñ֋DJaw\ƃ03hi=h#nD7RGDZi4fP 0Ҽ޼QƸVIpud {r"n3wtl[~}tB7p-R+V7KBjuxOz4C)q7 o|U2i|dr A.\>9zo2vx,Pyi5_o`sYt A.y7  Z鯉V1p9^o|MYZ1%]mk&a8A8(t\K᫖0wQUviG8c@D Їy$6e *Q57Os$y@-y㽹d߈pi֑Uks|iGV$$z6[5sOق=}? @D2@mVɜoBJKO?lXv_ԝ+j ͆_'XO\u>pX`iKǘP!8elxoV]AAoAGhM=UFkUѠB#K{EÙugFʪC\Y8q>@ A-AFRyAGo=uӓH:S8#xT%3hKq~PZt!V;Uwgk nˣlhbkhg}šو|4 9`7cjѯݱǥ==Ts%_\j 4&pMHhMz[ïً֤|;+ڿ1 Χh|jICǞOnWs#}1md>X֤WQyɤV#۳W RvձwiV"XԕsaJ(#=,ӋUǤ1|SU P>4߃$̦h+\Qev| cl_tB)>ȠeŻt#pa=*795Ai:}Jm逿oV"n[~ͬQ61UMi߲,[,>zkKC襱eSއ}QuА,+dS7o7pӶ) `C؇WGcF>;20(`L8:6#ܱ;œz5 )֛#ߍ3yM:B448Jפ =t _)&skC/]jR=J;&_ڇeGJ`hqc0 4=Z~a,9EPo?-mxendstream endobj 374 0 obj 3252 endobj 378 0 obj <> stream xZY7~_E_i| (2IE{eYvaCv!SSU_錸?ӽ[zvrGf'{oq::_43[Ŕ-_텝tF =|<{9Rw/*úU^S=/H%tcdyyN?XIChwg X~oax 4޳< 6[6;/e=;vK- \ڭ9_A"xy Bp858 :]ʁ_FX^Ѡ(K,DJL)HZuw*V1lIY})>M-+F$(VȻ 'Q [̌/c`mg(GSfXHeNuСpd{˯%+{;n\aNxڜn#: p \18д,Ԗ/!s"pJm ?[ F7?yfpa LTrNIԜi *3=W鍱-]&]M,p]PlHtB! cDuMAZڗV J3A(oi)O}weЂ=8l@dnx2׵HwcYV 3 w9`ٿ F`3¹|̿ǭ!oK{_‘GԩӫxwIsOkCjJZH {d\4!w!7U&< #(#GԢZY@6@J+Ihωhp`a=$Z΂>;va=-*j+|Dy֥#h)0fqЅ1TI@L|߈8Q\Ę$R&A I#}Hx!#hqC̹|5* -M`9Λ>»\g*D3@"v&~'Nþp-E@eu﬽Ptz7hr(F(?/Ao2$mb^@UWτP7_0n BKlR4uy7a<:iĆSX- 2 Wi N}mRוJQ;-'qSK]E:1ꀝnw,Nнbny?>$Kh/5LY:,eUqz4Oϫ5!-D~PZ{ȭ{B{I"xw?8.ci'At\rsYYʏ5mH.tc9ɠkU !j]t`)Z3^^> P8 dXnfNL7,xj_>Fͧ24wi?LKe.3Q^G >/f_3MH{m}mЙ?hH)4  fSܨz…8HRiE}EgN*y[8Wݦ]`YFTh! w \}Κݮ0UL}m%XbjVTZ\*?V?~E] j]\P)/( WTkCϦxOfd9jǍUgsBt_g^dE%&F+/̯2/:>3\aa;t@! ZC')\lEIm LL b^_1 thӵq= >L!hXZ&na`2TX#tisMQI bgWGqd&)7`j1@4e"Bhnkbh2׽V*5~̶#˘blIyP%zCv aw҂Ldr"ũ^Xl)h_(hU!q5 `ɗXTs= D[0sapjՐ*y\Ds {FC'ǵE@!gjVhK3|iZ jǩ֠Tve DoA)^'@t k+]jcds?EP690rni ƦeyIZE?NeyLMj3xZB%j;> stream xXKo0 W2zX۰b0 X[;EҴi?XvlC/H~| )#a)k/dd=x,_5 QB4Պ+IҥWH2xBCe ڻO'h(~fD22Ph0{6*o= @ T%ܿ`uB!sg&cͰ4dqIP3ofQaN/ף)5*1z b'b. ,Rr&JK1 U{'E/d@NzX 8Ј*!K"rt 6"տJP*4h10'!. џ&`#bqbv[3 AbY+IӃbl5srz篔th94CakF]Dx,C3Rsi-Tܸ^Zl'ZaQLL0mlʵڻF0jScmRhU/F6VvOc_goE.l_Niؖ?WBc^I9ؙtH;@Gqcw_TNwz =lj=mV48G[8ݏ_]k` i@ԫllϛ"A)OVMЂcB* MD“H!b}]-3f>:endstream endobj 384 0 obj 684 endobj 388 0 obj <> stream xU1 @ =uL.wI&N;PAɗfbL4|j8v{ ah E_)qEtZQ.FCrLCfGy6c$UOCǿqBז7C%!endstream endobj 389 0 obj 134 endobj 393 0 obj <> stream x]Y%5v/7tkMk_03AL0e4n-tY&Pٺ_JGgӑt y?}^]ódP| :XSpU~S[b=uG*M Z?ޢorԅFwP_NEcC*cKh R&tu?cJRKT^r6<~(2j8MDRB F胲KVgAD|[bx#RwQEeu46NQ+z4-dnOi;.ك $67,"3[ $jl",oe ЉߥbLеU|R_tI"4;hӣ^dt(6n4Ty}Ҹw;7%N(j)ʃrSk%M3N+ZL>HB9biSV!g7jök-9,@Y,"x&(FX{;N@-bmJ|kCE8QӼ![&Fג/2dYU!]ϘH0Iө̙:ÏoV=6 >Lz%J ]fLIz'EڰK,={:$,qf+I(@w:@}Va9 [Vͻ ©l4?"_ϯԍ$ŅeNSx*f//kK ļ9~mU"i/Ek՝MD+;S. %Bw?ss۫aLaz WƕAM0g( @5JS!ZP2O0y wܚZ3&XM+e>CH[鴥c˨7,6fp`L0U|jrM/jȅR26(xO ^l`ns-`V/>[ .'$$4$ a}ѵI C8cD" 2KmԂ zSa\ jO&Iřwv:(g9.a9bR+;D/W@~#6ޡlpjb 8F^KX'=}JQc?w;ÁKy: m{T7ȍċ3ENm%KVx55Sᓏuh9w gIA34~;YAx}`w, a$ ӢIAbrǵ1fke/fr.]MƩ2Zr#ߒj܎;aZiDR.e煸bLJkJ_hi qq{f]5O:I?5XdC=AY@4n˝jzwjpt8`|p>?^ī^ﮤ wPyWҐ[7W~'j0h㯯or!ѓԕCڗA] r}p6:nKO<7-1Xϯ{`6Z +=WԩZ"'ޤZ C[o$C o[b-(D8pE[ G^rT-(iߓjI/C6\Do%iՕ6@CjPD;Se̢|2xOtG"1KIGsT PPUgB=Cm[Y BY0A)ACsVqYfZX=G5Z( >`z}3ս>$>`G}h76G UPz*wB=C9R*JAp:}W+a7C򍮊-6ZdNqJx]P,' UK8ʣGCڲ!Sq!Q6h>X"MMP,@eK?->I5]cZl˜*sȨz}g#q2:[7ޙc#KKꩂmC曝B3 [645 JMy XY~!}/#}DM{ txg=@çLAQ0xP>ZbOaEZyj^{c LTRWHÕͧ'hi/8KGIG'%]6g>Agٶh3L1:ђAc+ET b)sڊϲflw 1%JNO4"ܘKoZy2&;rY$ ^jlsi;RRyucl` 698*ұed9 {\- b~ORPUgB=GUWTCPPM岴N*^$ݾ|AHI!2; LXBU (7JzQd xopX.i)P߅v.B;;P PUhgB;G6JVANs[%-+I֒Z 3\s9:.jI\J [E"{"UoQdPz2cEpC49|1U(oi34Pޡt eƊ2 Q(@r*?e(03˘~2 wJŨ۴ 9|ct50_i2Ne$Cq\ɁBJ=K~EU9RPUgB}*3TC# oSj~(C%fȔ층GJ2 %]{fufetNEj8*QX Cc5|PRSgB}*3TCWT* UIcr ~ԃGFn?b~*n?b~D/|7`ts G!<Rr;QR(gBy*3TCPޡ U(Pg~C >49:1MOE 6PvN(K)Qt,bJ#̴攠JL[8JJlɗj) L^SezR7U٫ aȭ>ٰtgd&޾.ɷgS=7{ŷm`7#,"/˷IK8}ֿ]hEi[F7C3Xkg5. vΒ/1#_ \Iba)I;FrcYE ~y7/ΩGuFE}|Ɲ sSH9ʲިIʘm 7Nom{\\s;9>SB oLU(Z`k>c!zM&͍d?YYf;yMs\ݙeDqoڊNo> v˵kUwȩYD˵z[%/2@^9Qn7GܚI!_7dIwo]َTVj?K`{@Ӳdn[nll&TmOqO4(Zje1DS%lH~$zf3hoqo>ұ6Ι~cL~heLG7/l_d]|x }7Ex`{Rd]!DITa詭؍s b<U( "mf~#Ufk(y{Y/.7Iq mc8i*^!*}DoyfƜ80_ɚ<3[=r+OcǣU.{zUdDj&'-ƈ؏ P :h }}Ɏȏ12&n7Wb 0O_P&nq,XH;!ctTH94?s\G~ߏ]˖|c3r?_c&jyaˆYh6Y6]!4ow9Go'իe?Puo\n㎵~Aj[f-s v.F6{7;un#6}J.GYj >>mOg|;ElB-)Ql Ckciy@vL2{l|)>5?lHWξ%Ef2ʗ ×8g ߗD=U-d!ng{x <)}Lݵɝ~?{Kgendstream endobj 394 0 obj 7315 endobj 402 0 obj <> stream x]Is?7nQ`_t42P$j6п2@jӡSI$@,_,@u&c_=7glg<.yz4r'oQgKsfVW^}{MJsۋK$_3ᳶ9q,5,YV JJ =3؉sk2 }Nj0+w~jLJZWǑd"ϱTXfb>C.)?G%__o8t 'i7 Iݚ899U=$1Fi|!q,;&{&_*^4ϖjz$䤕Zˆ:uz5 .GГ/|vq8rz^XLMژRgdK/5/_/|4ZX'!p &* Z [p)<̜%".q~%2R (Ο5(aP('/HwkPvTO؃ 5o{8*wI淏*֍ߝŐٔPUJo >Ejk8wR',sT4Dd=Y1̺S@Wx؜ >4iRΓN;?/V]johڜRf_JFRK$`$^~e~bH();>eш߅Ijf>7D *|%~%v ŭ8{}@6.8h;Z QҋӇqOC,@o.)i`^!97Γ.H_%ӅL`5d}~? v*@c.iR0"\* ]P&{kzpvoϿ ,.:fX2~RGD_ݻ CiIo>`l+$r~]Xv&V{&(Wu5R%fVJA AhfQb(t"Ꮡ>`5fyǛE)ϲHt8տ쫡ݧEf=$X% Y?UT޿"G^E1/㻡w Z%Wn,YzsRB^UGr#dmHȔq~ql ⨅okjBo#4&8WP|I N)Keۀ@"ɛ‹Ks?j]ύYYC $A Y<* q*  4&@!0vH20"Nh}hmc7–,6`D&ɬZ#(}'jwd-K&HUږk"~%p+t*xYZ>X^FL2룇*xl"nZ5l.\SfJûB Q[(MV,ң GmwQأA5'|M)(8;Ⱑ1?Y5ڏTBC~ Z,Z)0%'(M 'VH"؄'\xLNK]vl">5[5֝bNӦV}-s]˕4%>yVK&XYO)UˣfnQ'DOH#]!r({ݰB㭉o *?w?30 Ns^\޼:{ԭTtlT&{0q,U 跕'ap{}뼷4B-ɝ@H$ $&guI"+4$,(: i8-vN'[j4*53sУ3ѣdD_+vQ$qY D RDD_5蛡vѸ\s{k&uSk5{|}T,<\'JCq.o75]孠4Uf[tꙺ +ߦ7ry&0+0U3`s/I.{4>3~$Ppip͌3[ćN nv ]?E֌A >BX\NjV˙mE#1|e",i\c93*3.ԽdU#Lj#q5C u;$0^Լ 6uj|ur=l"0(r UA$5.V3WbR!{m$@1pӲxթ*\FA`~f+VrKR( !ikM74#v[q=-7ç45@iu7]%#I\jfV֊S5b{tl'FZt4hm&(Z4pWWhw`JC7um HV++ 6ғ;4?oԼIRl|A-օh{p]2vSc'E!G9ΠTyQ:_ق}dOLmٸ@k'ܮDzgq]f+u46ZKL(+bA<ڜ,2}=rIp7YvrN q],0Y9 p)%Vc,ؐmW8ѠG|j/{Dd( J#Rut[.(nbA8p ¯5 gk\Y> ʍ2xd6yAƟ{tliw*nOv.+֪kCdTe$:EHwWI^x19k V7R-[tr9ULQ";ӈLq!8%RH_g$.@:uj2ibI|*c#4͞Ep.} Q Lgqi Yي02X _7[^Uk}#uh;=HiV$=coFqeٿD+d U7ufr][6*"JXҎ?!GZ 3bBF(_f(kD X~^i/3ZEOuK;CG\%E1Lj͕rN*,^gyJn<}e|jd@XZxmH&X>Fz!;70FzO7cF(іdHd v^3&#k4dx\_2.)0Ô(uB@ή|kհgJ+YN>7]2&*x[/UXb;3+^0 y}NdƷ.\64xBaxu ^ D7[]J^Q1׮U(4Mp%(t0RTF8+[^ʣnej7yT)dGW&? krSq>`Ӕ N%sV-`o]8[M#.CoAeފ؛91 8+THlQ CRD@J+ɑ=9y̿3opp@ױ9ф•-ED.aK"=AT5^-̵XmNnTFZ`\p!Fq!gE_U?e;qaD4~ܳg9%z)*E˨s򼺊gu,G o]&7@ޫI5.Lcq`pV`MX徐-[:wp7@4)㗚  ,K]ӥ9m?aGf|Rz~6N[U /8ָ-. }]h՛Ps];99þ0d͓[sSJ%_;K#|BhҺxI!pu]9_v\~"7^<6䎆!}aakO锩[ MmuNB`6 r)V;Rs V˥Ҕgt5iNߑ'(oY%Ղ3oSR:`Tf:+ދ͗=X.m;ZP/<8':m\{s䄍J,WTi> /R.`}_TY!}1hy0=eIj: PS\CT`}"2{ /YQ' #߾tsw`4M:nqfYXUP.pʢ+r=5 ݫz;wCZmJUyOUN3>V2>@=ؖ`e,'8S2x ,l N^:CN+J:,,EJNKED?ƯΟkE#M̳K\%j`ߕi! e-O{Gt|'9uH|muE3;iB;Pwׂgnɝ9Tj 1狅C` ^jD8nœF:#|/a\tACM?yV1BrKt '98y߫I &kNKRZ[A#(Uxqс먰qaW<ߏ c' c( 0uT8 |͔?~0٨*p-4QT V;x b+ 'u3_IXHWEV+,`w\OWky 20/eiR̾d 89 2xS\1'Ccd(!NajMŘ BZkJ5젹/BS=H33t\9ѕ<+-5Z7Ѳ%~10!w+ B&.%3糿{&endstream endobj 403 0 obj 6586 endobj 407 0 obj <> stream x=ɒqmuz4k_ "[! 0 f`Z7LЯ3+Wgcw/ogqwʉ[|ul)B211+wTimmsb"<72? 3iGgfR|aGl锶Mo` r 5yhI*inA29yʪ70*}.,{U:С_(ơS? `OhC`_ѥRIރ;fnՀհ=׺'I:wL'l*#we)c!Unj;'M:gƃ<籋Wo/ëy~G==֠&mCWԖ֠IjW-8#y&O`G0=zOWGzq]NtZc#ӆYc8 6i*{DJ7C/U0)}"ڙbEj }Z!p<'jq|Liy; wқC#QtВ&Y>vBk WqB Gzq7C"H%Cf5$&NzX^BIjdDyUțaq8W0:09z.& g%4 hfeif}m$ZY#P5}W$] Ω5 + O+Lā`湍Sq5]˳1EW,2bG0#2ŷ3ȋb-Ys@\,7e E0r@Cq0HO{LXSHbY*nbFXYe2/n*y?NP>{#1B2@1)Pbp,AOV4[B=8 0  (>PhnL݇i<i vI \Vb̶ Ly mnb>-G8(FKO")m[Č. UVjfx`($5,aEͯЛbv<=nʹ]56yyaN2b'Anra_YFl&ˑ&Ř!&k70⟠$D6#调At`ͨ*`Ұ#FzY>Bp[05)6\bd#!]X(ӟG˪/Aq XloKui^BiﻪsRIt#]qm&lm 2xp82RuH{aDP j+ĜQ$۩5@Yy\{ReGMNl& Į'Y^_;kd% <pJ{@M5DH(o2HFo?05-,[ZZK+b grzYݨwCZO6FW>=Ɣl^9dtYH86Et>>J(|waZָ֦dٷr9K3+s Ii=% CSL W@[a g)FDpә+5^f:iU:/qY]LhJA3^.[d%c*iGK$Jx :\d8\p;9i}Bpka jsyéd\rߕ.]c)};:z` X;vj3P/F X+'eձd TYysĽfZA3m(IIEtI$`,F@FC)0+Ӂ)?M|" k'L7ZUp gkDn 0&Vd6r(#1qaY @i}f'0I%@@|vWGV (P=v ֶMOUSϘeKL <%b*€҃2T9NuŘ^8AwhkPgXiJr`\VA871e ᪃O!d)0%BvU77K dVG$C&7)#`*e}\[)v_f -NLZ9`$Dh3b8 8|4yQ?zE9s&RIEF+IHˠAxt̖BC怒ȪIZ ;c} `ou0pp0c2LN!VxPh6>ŹYgyvgVvsLWO̮ tz*G;S Q84 a-+>)|TofP1>敩J0*b[Q$B7r vAF6ah^M}z󅢴&>56(2i]]zk*iIϏdxezmA﾿v .)h4?xY\*IbZGT|QE "|MR (I)reDEMFEMMj~4:0Tr'{Qzq1FLtg4e[M. Ar aԸZrf*=`4`4Okx(:Cw53 0G8]L~!7$ޣYcw$nj|-ڊʝcE>Q^s0Jx qMYBo]NsU - CW7G2̷l|Mr;l-}-4[ibi6K&hAY3Xk2[F8 Y{Ө0:- xcN0z GsXn Q!wF JAIT-e!zN1R&)[>Ns@$エqC(1gGɃ=~Uٰ6;LJG,ǚet5>gD)Zw׊ ?)Ƒ;5IN(R%Ћhj-HNPۊ|R+FCSXfGUm}QnSoR  )/&E֮~^gb)xJ'Fx1D!]>\ m!<rK6ԉ(|CX!qF'_gp`"8t=a%Pjz% p ثR®.Z_]M҂HL^,O@eK ,W1|&w R\@MJ7/=%u㯅ITj⠃clnjf\/*ՌaXk] D 8Hay- SC]JT )rk0]*sk8vՁVԢX LӲ7&_֛)_Y9NƳ3DDjz.#h58ռ/ӪP`z4tJ]M!(Vx@v̀Cnjܘ!&W3R=345\-ýf3:qN@<&T]mdݖUu]i>k|vbEjJup!C>xI`^r2Y+E×'ߧFνF iEbj;%EhcOAsS|%1_$~F<6On XmIUǘZUV]79͜ʉ#. ECR\:s =1r30]QEGZ08z]&pwsn: /V`엘%%qOf,X"b~d(NӋ9|K[jZ1mZɡs1 '8܋8[^Qۢ '> J@&F{E~k$r[/Ta,n(fJlv*Gq*!upi%?\X©wwUAEI0醨eb>#6)ݸI+77E|lXdInFD FQPdM.W0Ǵ! @8 a B(/JHYxؗ[Rdx3_6@h1TUR^<P2=ښvKa*,@G[ Y[GMmM3PmЋj0F1~Xm̵Ͱ@:CkAD31yX}JAH ^yDpߴs^!FNΟu5{1-SJs 9m=}k[y==֌t5a?j+fϜ<<zwggX)f2f}4<cfOϾ~L1-}G蘌⵻t!$c^X'׀pNar dز8MKȡU{ASv0'FP M _κSPP[zes^az2JՓu%49b0 ';'ؙ]poOXRdmY<`J4%KhJ-BYM+eKLg^͘cз¤<5?Qz>*Y%+^Q饦6zEcb\DCy06̉i&^r}`Cb:FV0P1_smnٙ{^!ׄ5g#áb;}\âodUNq UғT9.cPD=i_$(Y6b ӍgwF5F2d'Cx2Ѝ sY.u )nAh-ˏppj*m`-p(.|o,bmW[\Z[(]G0cA~0!@AZ >`=o*)֔ CE]˫¶p~N.j%=. OI[lI2gZx ~P)\{XX ɰZdxj1Je|QVDDk<iةrS8s~NE0wǮSdva+9a~eie~{$YLE!z$`WVIc伈fگ/@D5R2>K +nT S+fsQo־M\D;{-V̑W u' p~Хb%&SŲ6uq AQ˟86cq͔֔beRd$ RG)ĹɚAX[~+N( t9t<0s 6!GXEn^W/߆l}z5ZE8v~T OJy'*ϩu} %rv,>u~ F5]uGS)tϦ}e |{0IZ.y'^FAS;xa"ؤe7a%cZ*RJV T'L~.{]wqA/ѡp~ЯI̜5'ҙy~ϋ)~AIЖ~>U6.yCGzqK&?S 6 /\g%Dd5W%Os$,2dM8%c܁2fVS*T֠BP*:[0nrj.vv^!(5oSR%GrvfjZNxm ִ_\CdʟB8~=+ uH~?P̹=_'pvxr즏`OߦO7b"4A-K.h- .qPM` <):<:)υ"uUi.JD^bS+\ #f&.!9>*dK:MnEZnHt,2 yTsggnҵ8`*5,Kt*W"C,QJ@V[;Wa*G-FXhdf\ׂo$h&]7Txd *Pݾ  ~ֆNMXŬ<*I4PRlfJ_>)uȆnW+n];;h-~endstream endobj 408 0 obj 7557 endobj 412 0 obj <> stream x]Iy ANoO,|Av-8b0c;ŒG"_m<tF?6Y,V}ԏǢǂ/_<ǗG?q6u`oҗFJsljSgWG_Ʈӳ 2|_NNMƿK ^);O5ZjTφ⟽gr~Sa@jփ|:~ǷFVҳq{Hz{TpTy(aVġ8>?O YklEfT6š31K4BY)YcVcG&iDB=Ng~_K`xM|{'^`FXxݠ%&Z@SZD>G#pFT-If?z"nz*_oM,פ@MB"K;B4E ą̇̄0@y-؟V9ƴX:(}F?lktB☩ il{mr̊QBIܥ7<DGRAM7M&jo[$ 3ާ&Bc ?6|oWB 8xg3j#-J*EMt|"J=b`EaE hgL)`QC ڃ7.0-!]kQN!A3 {Da*[cO]/ef},F)(ۋRZljEr4m;bb1HY@SԎ =Hiÿ8Xd7)fm4㠾Ƶ)yr(w #a8i@_NSFV̓G9Q}՜WcT#5wҏy6a:~b\ܜQ ;8\3*9uǷ=?/|fqh\k\aus` ŏXX6 v#҆mJ΋Nz OM E!qk{lE4nO`=`mg50a&_aLBT\6" Yiδ`=i0!K6Dռr0{0/Y:A:n&-OF(ʶw^a R5Ek׭RMuÙ~+50_ly1*U ZF;̦tWyiƩ7R\6{ucgN`&eb&Y>NlUu%G71'dJ>z*.& `w.M'S4<6L :e{vX.k޵~܃wL(|>t0)D|a\K3rK@/ރoy pv^Pmm .4 C{dxdiGq z2hp3  ^dhV+qȷœ#FfL{H,}yY*0Cre''' Y7Y~[YrmwjH|C?Y@)o23xA  ONRIy-BKެJɆY~*OcǒPwҡNJL:J ҳ@~!a8\m4 psźL2ݗ[ˎJe{r36,M3m)/eU{)N6Mq?+9|Q]@X #׋n-sOܺp%_C6k3k贡 n&qV6Z Hٗ;Eh9@|HZ 35&1 S־A'-*jmcG^Ml:k5W^}@R|3IK溜vg&@;# AK1pO4UEH \(T<~?Ƹnad~-]h(ܿiZ렀CrEN_F5H2.jV⑰vmDruë-%P"cdU޻c mn#zCk:~%bآ!?q2=3MvE1gIWfl=6yqf^X%(AI>*q(ȳ; 'R&յe|&=r FLM#VG!Tf+ #5AɋTt1Hl`$ S}uuȵs] X&4e tE wp1\w(\V8^Exa ˡASTzE1>.O)̺joHIF.; -W.~ ꞐXkYG$We׏TwJd1Lˏ &cU팳zzU{}?~vYŞor`^P^i,x3UIFhR݂jeN蠧AZro ME.`G8 i̪,I*@|@PzWdșj!>4'd<;vendstream endobj 413 0 obj 4404 endobj 417 0 obj <> stream xZKo7 .Л/ s(Y4պS7ޠ@R;qdSNPffEigk"r3+q(Hwdwk.dsnҏMɲ4AnЀB!14֡b[L t}m5oM}qJb@k'1XZBjAX!Wzl y߾h"Aۯو秧Mmeڷ9c~6'+ ?le\۾S}o/G5Q Ѫ-{xde)ع}n|`{Q# -qRJ!֒EU`'L!yWӿ=hpizW;!BAAwTJY aDv\\YwdtD3J  $^^*}Y L-ZbIfޭ|w6W 0XpK 4R^5sJp6q 34Ş{;<ٱΒKs!nM87HKіB5XO+;M02RJrb=z *H\ hT.pOӃ,yt0鹛K[nƬhMX5{Λγb+ >_Lq,`b+-&m2TuclIR}6g2k9QrƙDx QL 9M##6V0&vOk4ҬQ߂{Nvi81 '"TevGE%\\fq8F%,ҭQRGO\=̧Yd2Wϲ}f*cөv~͋a@YYZ̉;\JlݨZlJW)nB L R`M nTڛ|y<Q|ڛ&8gæ./9oz X~tTKKruOVWyo;ZDyJY䆄lM_$nL,Ak_=UFa0VүrŚN҅|0 )5ݺ5~ sOfbaD;0sb^n(COt-ail )vcdtGzU$U]$c6b8֘фAMC~G9f!ɨVtg4"J+kڏ3(9{\ ]V?dhnXkvP}_pwWKi!bۮ6zflo1r6~ܭ8SRn8AqwWC[RL֓G&1RuXuDcx2cx6`4hy@*bB+(L%8Pwr9-Qtғ/Q ':?86\aytaXuon[Κ>iO`"=X`8HXXdk(>ɍ)YeSOErX'?rpu>RPZe{П4endstream endobj 418 0 obj 1818 endobj 422 0 obj <> stream xZI5sSxоB,N88*{Zy2_`<_7}-cC: ߷wi> _waFn׿I:e(|Sv'1ҶB }1nZ|pilgS*Ls|^9!eG~h1>f{icit*Pj\tVks-lˇaJCqn"0RN9[NuQӬVy 'I*1tFX~giԌFQ6l}2B_(U%|rc o(w7˹La>6$̺8q*h*tᔞPJ2RD3>Cs0Sds`sJ .w0$07jf cfdqumEŰH[e6 u9|aU׳D&r%)2)Ic?)F8ѹŸlpc$x73FL18ϝl)! ,4cWlH !—!V\p׽`-\?R/(KBGhퟀkRxlIي>ZBaqFH۬@R U3/ZhI6ypH2tgQ|3K3$ OP<#N*j4Kt #'DUX؜x͆* R?Nu3ۚ)d)/i|gOKWcq Ԑ!^ĺPW|+3oTZɵ4r@a[Zr6sRh/؎87hW?D%Cau36U`W;ywq릐Bd2#7%!ő]0lz(UΥV}Yװ LDžC,})XS5S.Rw_p "ܽs-%H%@7R1E洍teEꇒH`WOpFEk$NN†Ka8Ճ)➠v:&  xJNU 38B>rɬ߳fs#mlu%/>Qܕi59 rؾhpK(Ӯ2!'V?7 %A A lB?v mP|$ҡ BS 6|Ws' 8ϫ[z) ֨†8ì`èJ8^) ï%QĨgmJkf g%^ ſ7}y/182Fy(.n ^sl}$H@rRy/ G`}<\$pkG,;|7D 1A3 ƓF\ak|x-76P"Es}AD4c(i{&2!W(ASlLgy8CJf% N;@GS'L dZZa R[GS{s9B%("fT3wFK6Nqs͒I#e쪾a> stream xZ[7~?EqLt<:1!6,PqKѧIMRPu> l ?^n0j~wH_[=+])os]$n|?:Ih9(VѮ́k1\~4_^ ;Y۰R#fdHHs"Z7NHg*lvN_e+,,{S@ Y*F2 |NAKzƎOL yt%$vcJ0) >/pYjq QgQu՛O.]Ii{zdĕ`"k5K THH* J:JH-qJ_Ψ QoòO6$'B >ÃEŽ_ 5o=\>o"`FY[rf۸V0g&4/Hv^ֆɸE?ap\ źn 7Y(M/uAC\nF(34JpwQ$Eε^Iګd(tȼyπbYo:V!fL81QclFUG`n0-5 !RpQlwKB_)Q>w}zԮ$0B dz<= KIj4㨴9 ϱNSBŔ%0/  Y%XO-<nؒu*HAs!x_sB"X(VPAn6`on/P(Gp-/a\Xְb!QX:}+6y:L!<4md m*Lݕo{ȕ'Ip%܄2FrA scE;Cll57. ϤP'Pgju)ECFSا$6tw{k檹G?̡N=s}L`5s!4YFI%w\-l۵C!HR}5,5"g~AʒZ\fRM S,md6Q]?4r}h%ƚ;hDO|K`p繉2~Mі#c5E(b"TpĆWYNTJآ[ K ehJ_ZUT)/,R)nn0K%yn^XϞ-7JF[GD*/.1aV辝 ڶapʾd!Njx􆠼ΫǴg9T6q31ոZ\/:{י]閃׳BE3Qx\>*TX3ү*ߧUl:=ol.(H,ڻ^4?NA'V*"XqQ?遴&(٦y_8EWVa8蜞D)e*/M-6OPuT*R]UZ \MN 椧tm.~z}e`Oiv{k(ha*57G8,^\0 jiu.ۓ׺a7ύ -߸SEoH!>̟ZrjΊA=jK).ЉxmHKsX, 84 BerO6u ĎE /lio O5)j?IGsirOfuSZ狋ߵnTms?1£'؉:`Fuv'j{180VoDf)! C71qUGd۳zp񔗇)٧V3j?C]CkCjUowjTnϷo8Fjw',?ʦO+XvY"c}LӴƭ͡Z^ jͲh%P҆qԣlQ hA2(?58,&z஥IU!zh&]kv$P;ĘӪhho`oZvOC2/{"Sf >tɇP6P~[(&@hzq[LՅx)~?1">ba#J^ƽΓ֫2d20̂Ԓ2) &sK.~Ze(<MXĔM.d{ u6ŦS8 Y,0)y_q-BUkuG.5?KXl\k@AnspG!\N d|QV7*Ŕ8k44e'<wdhVPРOjP*u+n%naxOSEWCߊ4`>1Аr)M&G!,WsEL/Rrendstream endobj 428 0 obj 2504 endobj 432 0 obj <> stream xZKs5,1'J,* ſ5Onj(<5O_Z~l^~4 k]\mh[W;͵^o7Fo=\m>ZHgJjWa.c?d`GԜsc՝^Qk*FF/6NYV)?L6FvymEM Yb̊3j2F27c ^Sh G[F*^ah.&,teXn9ee >ƚ yQvӌ51$89Bܰ- T5ÜN]g3>Y+UURzIPfbI/}c ӽaQZr=O[L覙s5qMp˔P:p/bDµ5k r;\56LґY*J=QITNQ LNPɥ`!v\`s(kad@27!T\ 1tsU#F18Ҩ/sCt1'_Ů7I>#> $PWx"+fMnp6G )`޴Bz/Sw',uc/Y5e~)(6F ~يl%_Nùub.;E pSS @cPS,bezMw:%$ Zk^"g K"%L1q9Lx4f":+ kyE'>'Ӵ3i i:A(Ń}/c?:xNOSKZk/Xe,!夭~G[Ӌ;)t'4$er=G@`EF?hӞ<V j&K 1bW:EǶzGb6ؒSH.Bew 5k%†LH0Gg6XoBy?asPtNgoa ?x0p_ [7b!фqx:d$2_gCXF#$u,*s`nY)>v&$J`y=A'~+Up19F;[ge{kퟮk2=gUA;hCBm¾=@K9ѻzbp~}̢epM>/(b)S;qL.q2tN0 M:nq /'0^7VGH񃣽k SEiwJQeЄV]tX@HTeWiuMZB,/_wVX-~Ek_<؞&ڱ:f#Y Xp&cc&d2gx}STb V1(Mʸ6I𡿕4Yw"\#U5Ji \(GYXܵ֠Uq0B6kr .)gZYMǡ'5@wFD< n^g,MKN6Y]zgb oHoYMNub9d %zRG(7AU0 v2/ M`Ly3?_qr7pe0|5{ .4bL=3e 52jEڅaص(m2/PVFy@ag@l5b=EU悽_E}4nFaJQY (odZ!m֖g}Ypԛ;/k5'izE'J G\`E;g;yxI6{rUЭKׇ;tCW>>CD"w嫚W9 MYײqv;ތ(6/+z endstream endobj 433 0 obj 2104 endobj 437 0 obj <> stream xZɒDoQM08664Á`llaUZTJvs2+)}HC+߾ջR;|:Ǫzpr lcS:=tOʨjY)^?HÅ5Է _kCx9o5;FpxJVN_I}ݷVA4BNn'KRjx}힢jFEx"vMGIJ"o.~.~2a7c'Ilfy Po5F^3ʼQwrޖkqljFQD wh#}Ѧ)Mew=-wk!\XymRޘú* GrXpiv:ΜE`q1EE]tPJX;F]Q,p@#-k6渫>(T<3c0ŜԼ\@ x;dP,x1Gٲ |lg펅.ZeٞFҌ*wbm-sld -3e^?؉5a쏙&$XC{dyWiPD$`UfFʗiev]K εVّR=8WWk 2g ؼegL*:*7r SV3ܶS7eDwGGʙcҲm+ mc!, I`zPQz:>wr(*:\Įgd iTN(;կYe\,c+F 0t&>I&AzL]vcIލ#hjWdI!ڎLe`>X]iȵ*LӐ2#ucv6M)h.QؒLɗջv/i 0ݓ+Y.YegY3e2K`1_q\ ȱWK#AaLشDt΃7E߀&b#':pGZ}dGS$8e m y`PLkv^jz =,u۝g֮w~~ m՞>r|ľ?x!\0ޔ.Pf(\,f5] 3=h%(Lt&7An#&S5ORZz Ae =ÈbL2u͎g״l}}a`!?a8=vj^uߦXfAm˱(m@ۣuWendstream endobj 438 0 obj 1815 endobj 442 0 obj <> stream xZ۲D}crbw>E p@, hD*N3YI_3)-N${u޽aoX/|4/mXrvÇj\вٿ،ohC/5Λ&ENWld+Lgt}2-H9~NiW~sJ4gY?Wp݀_ -_t`uV31kR0dkEgNG~jOdt4FZ*>ns~@sojfnȍV0/Rc? %4Qe7a j?ѿ;1-00cofp=|2X?l7BgG1o0Ws-v7[΁盼_3.(h[mкY!h^#pZ۲DH YU-3i1E\R/_NeZMoπK9E1;7e (-;SPU-~-L&]&tpgjrW%ByHf3` e0@K.'𱽌r#C;ݗ |ӗLȂ~ e̋ͽI2c_RuK*1ԭq>[s Aقb\5@b)!W抋a~Zz'ECw>\:sU*H^ZSӗgb @;ӛ4Q.. Z2jVf}~@ꌈ_uDЅ7_}.EP{ ۑ.G#RkձٖϒNgOv7qrYFh9j e:eN>uX?rĬ\ DR%ap6 #aD)Y0KVQ5=8 +%)H苉"\WJ」h!49_-q?_a B Z%G^hT:ZdϺ ʭɹ&H*^ޜ)Yj+7ՎF r%^+yQXAozH"YWU>oX [4oQL$1Nvs)X\+GR>}ezTxh{||R;WX/H>qL}t5=LOhSZyBͅLRO%ZB{FmvX7O.hWc_AVendstream endobj 443 0 obj 1884 endobj 447 0 obj <> stream x[IF;J;/G Eu `P KHye_UeO3q2oݖ|ŸGvm_mmx r[oQۓ|L˭+o=9۳ m';y^ ťkyˤEVhMom$*'?n8oۓ~?cZ$4 5Ӊ it#jjh'lk k5Q3*f|ΉW[ẆҼ*>J18"ʢ2n0U<riszd$`y(,3)"3(%zݓ$|`N݁(k?)Ir'M# Rn5 iYQwj$ӝЂ 1@QIʴ c˜+ތҚd-gg핫 <U育텣@U>l!k^ˏuo) dz&dQ޵l-[.zR.0M7RA u:eW./.[B~WVӛ,{:Sc.l)r Z!|6~̐YuN@˖S6+IuT1 Ȥ[j *Cy cz@^wB3p) ;lGy)8 p@ 軎qZ&ʻe'f bf?SJmpe!> +6 ÙݵX }e+NUZv휋ϷCt .*1@ST-,ԯ ERSV@63Lg ǤFRq>RN)MWa>tcrnt5b|"0w>vǀ|ǬaJ^wc{H/˔A-j5 2c2ٓ߯N5+)M#OQZ*qr1 NP70.Il"<܃Ѯ+/}EiO>B1udfx@AVP+~YAT |:|pu sdRp ΥrLmóamrW:ԕgHg2?$HpH(TUqwoFB教#| +3wFLU%\qLy*g*|>U0M>_ 8NTEV´xIzO3戊z'Batk\G>#î,^gײMrVY3)weӲR1ڤaR/_R)WpMdT#b<~[B/i6x|2SK]lضAdƫt4Y v 4C`}pF_^VQ˱Kj?,>!Qendstream endobj 448 0 obj 2244 endobj 452 0 obj <> stream xZێD}GbL/ $(\&x"e zn Ӯ:uTuoߧ盯݆5gc<=oiF5K8qc%|k`cLxIo9w?+ƵnMK8-QƷ_mwRxrZʷj|m{yhw6/O]iGW]< oΉ,L&Wq8_!,z\djgG_VPE1Tӊ!Z͔lX0)@N;phdme6fW̪,+ [w$K\HM{'%13hC :K`ogS!!1@I')(^lwjVi+l5Ɲ#w'e=.;ؙ%##Pe_pڬ],mu'N@$.ezG9 ~޲Xte' yqKǏRl,eRMY+bTIԲ_(P =J ۗu#v:Ig4z ɼθ ):VIχM~Dcendstream endobj 453 0 obj 1888 endobj 4 0 obj <> /Contents 5 0 R >> endobj 20 0 obj <> /Contents 21 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 45 0 obj <> /Contents 46 0 R >> endobj 50 0 obj <> /Contents 51 0 R >> endobj 55 0 obj <> /Contents 56 0 R >> endobj 64 0 obj <> /Contents 65 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 76 0 obj <> /Contents 77 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 92 0 obj <> /Contents 93 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 109 0 obj <> /Contents 110 0 R >> endobj 114 0 obj <> /Contents 115 0 R >> endobj 121 0 obj <> /Contents 122 0 R >> endobj 126 0 obj <> /Contents 127 0 R >> endobj 131 0 obj <> /Contents 132 0 R >> endobj 136 0 obj <> /Contents 137 0 R >> endobj 141 0 obj <> /Contents 142 0 R >> endobj 146 0 obj <> /Contents 147 0 R >> endobj 155 0 obj <> /Contents 156 0 R >> endobj 160 0 obj <> /Contents 161 0 R >> endobj 165 0 obj <> /Contents 166 0 R >> endobj 170 0 obj <> /Contents 171 0 R >> endobj 177 0 obj <> /Contents 178 0 R >> endobj 182 0 obj <> /Contents 183 0 R >> endobj 187 0 obj <> /Contents 188 0 R >> endobj 192 0 obj <> /Contents 193 0 R >> endobj 197 0 obj <> /Contents 198 0 R >> endobj 204 0 obj <> /Contents 205 0 R >> endobj 209 0 obj <> /Contents 210 0 R >> endobj 214 0 obj <> /Contents 215 0 R >> endobj 219 0 obj <> /Contents 220 0 R >> endobj 230 0 obj <> /Contents 231 0 R >> endobj 235 0 obj <> /Contents 236 0 R >> endobj 240 0 obj <> /Contents 241 0 R >> endobj 245 0 obj <> /Contents 246 0 R >> endobj 250 0 obj <> /Contents 251 0 R >> endobj 255 0 obj <> /Contents 256 0 R >> endobj 260 0 obj <> /Contents 261 0 R >> endobj 265 0 obj <> /Contents 266 0 R >> endobj 270 0 obj <> /Contents 271 0 R >> endobj 275 0 obj <> /Contents 276 0 R >> endobj 280 0 obj <> /Contents 281 0 R >> endobj 285 0 obj <> /Contents 286 0 R >> endobj 290 0 obj <> /Contents 291 0 R >> endobj 295 0 obj <> /Contents 296 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 305 0 obj <> /Contents 306 0 R >> endobj 310 0 obj <> /Contents 311 0 R >> endobj 315 0 obj <> /Contents 316 0 R >> endobj 320 0 obj <> /Contents 321 0 R >> endobj 325 0 obj <> /Contents 326 0 R >> endobj 330 0 obj <> /Contents 331 0 R >> endobj 335 0 obj <> /Contents 336 0 R >> endobj 340 0 obj <> /Contents 341 0 R >> endobj 345 0 obj <> /Contents 346 0 R >> endobj 352 0 obj <> /Contents 353 0 R >> endobj 357 0 obj <> /Contents 358 0 R >> endobj 362 0 obj <> /Contents 363 0 R >> endobj 367 0 obj <> /Contents 368 0 R >> endobj 372 0 obj <> /Contents 373 0 R >> endobj 377 0 obj <> /Contents 378 0 R >> endobj 382 0 obj <> /Contents 383 0 R >> endobj 387 0 obj <> /Contents 388 0 R >> endobj 392 0 obj <> /Contents 393 0 R >> endobj 401 0 obj <> /Contents 402 0 R >> endobj 406 0 obj <> /Contents 407 0 R >> endobj 411 0 obj <> /Contents 412 0 R >> endobj 416 0 obj <> /Contents 417 0 R >> endobj 421 0 obj <> /Contents 422 0 R >> endobj 426 0 obj <> /Contents 427 0 R >> endobj 431 0 obj <> /Contents 432 0 R >> endobj 436 0 obj <> /Contents 437 0 R >> endobj 441 0 obj <> /Contents 442 0 R >> endobj 446 0 obj <> /Contents 447 0 R >> endobj 451 0 obj <> /Contents 452 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 20 0 R 29 0 R 36 0 R 45 0 R 50 0 R 55 0 R 64 0 R 69 0 R 76 0 R 85 0 R 92 0 R 99 0 R 104 0 R 109 0 R 114 0 R 121 0 R 126 0 R 131 0 R 136 0 R 141 0 R 146 0 R 155 0 R 160 0 R 165 0 R 170 0 R 177 0 R 182 0 R 187 0 R 192 0 R 197 0 R 204 0 R 209 0 R 214 0 R 219 0 R 230 0 R 235 0 R 240 0 R 245 0 R 250 0 R 255 0 R 260 0 R 265 0 R 270 0 R 275 0 R 280 0 R 285 0 R 290 0 R 295 0 R 300 0 R 305 0 R 310 0 R 315 0 R 320 0 R 325 0 R 330 0 R 335 0 R 340 0 R 345 0 R 352 0 R 357 0 R 362 0 R 367 0 R 372 0 R 377 0 R 382 0 R 387 0 R 392 0 R 401 0 R 406 0 R 411 0 R 416 0 R 421 0 R 426 0 R 431 0 R 436 0 R 441 0 R 446 0 R 451 0 R ] /Count 79 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 18 0 obj <> endobj 19 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 253 0 obj <> endobj 254 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 268 0 obj <> endobj 269 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 278 0 obj <> endobj 279 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 293 0 obj <> endobj 294 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 439 0 obj <> endobj 440 0 obj <> endobj 444 0 obj <> endobj 445 0 obj <> endobj 449 0 obj <> endobj 450 0 obj <> endobj 454 0 obj <> endobj 455 0 obj <> endobj 484 0 obj <>stream x]1 D{N Pt4Cc 3$@8X)R,Ã;0^Gk"&"ƪۃp\YO endstream endobj 397 0 obj <> endobj 485 0 obj <> endobj 10 0 obj <> endobj 486 0 obj <> endobj 487 0 obj <>stream x]1 D{N Hؤq d( !7x,~a&Lѫ'$lVEx:RJ_UNȀpwor`/Wm )a RAn7{b50ىN> endobj 488 0 obj <> endobj 79 0 obj <> endobj 489 0 obj <> endobj 348 0 obj <> endobj 72 0 obj <> endobj 490 0 obj <> endobj 8 0 obj <> endobj 491 0 obj <> endobj 226 0 obj <> endobj 224 0 obj <> endobj 492 0 obj <> endobj 222 0 obj <> endobj 493 0 obj <>stream x]Ar0 E>ocƛdE;#gX0,z~EgI߲Uk6]|sM)+=It*+=Nq{/8B v~T|ڶr/HF3&t)Ey^C:R v4KDHf:"c*bD1  B41N\kYh edV 8F쀧 Q#]aUk;;Ɖvrg+W/Xp҆gg6X ${"3OuXel<)y* _y endstream endobj 60 0 obj <> endobj 494 0 obj <> endobj 200 0 obj <> endobj 495 0 obj <> endobj 58 0 obj <> endobj 496 0 obj <> endobj 497 0 obj <>stream x]PA  ~ЭmZMz14  z0e'C5'g^];-X#=+"&XUqVUY;OdV}Q3UЗVkz ){VhI#W4J&Q@MM*3vdIYNL{Y8ޖ+r|-%t XG >dO`e endstream endobj 173 0 obj <> endobj 498 0 obj <> endobj 499 0 obj <>stream x]r0 w? wt^ -<2+ҡӦOtL9T|Q/xKYo&E5׹|}Tq͇GyM~ (:b9{՞%;bAMi`]@0I{2t5@JMւ`Q2H: IH*iGJS:C+)䠁G gHϬrZ1o˙4~.^ endstream endobj 41 0 obj <> endobj 500 0 obj <> endobj 151 0 obj <> endobj 39 0 obj <> endobj 501 0 obj <> endobj 149 0 obj <> endobj 502 0 obj <> endobj 32 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <>stream x]An1 E9En03`*!oE+rLb,DaXGzp_D`0%҉knш0+Pqנꇠc/>ϒT\=](ȞAtw[/ JTdl׊y<5/)e|G^"Se2{u endstream endobj 117 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <>stream x]An E>70v*YI7Y^8""΢/34Uųt~>e7[^f^R|[9ƢKL귦=kcS> endobj 507 0 obj <> endobj 23 0 obj <> endobj 508 0 obj <> endobj 509 0 obj <>stream x]A ER[5iM^`X. Xc\|7'3O -aRwXN5(<#%ڪCU?^h4|#SCj0{ H2&ZcZM̏yED.#V")vhDqVuCZ-+0v>Uk:,_qF7b endstream endobj 95 0 obj <> endobj 510 0 obj <> endobj 16 0 obj <> endobj 88 0 obj <> endobj 14 0 obj <> endobj 511 0 obj <> endobj 81 0 obj <> endobj 512 0 obj <> endobj 12 0 obj <> endobj 513 0 obj <> endobj 398 0 obj <> endobj 456 0 obj <>stream xMMKaǟq"kॲDbB (lK!]VE,Ds^ YKPaf!Gdj_zj^{g/qNɰkӜ9Ϳٗ~UgXiMwxx|~O*Zkֱoq,㽢rTs5>UrYc״rbsVEh6Wa\+hyoe*_ZȨJQI>1ETsc !4o< &t~ +f.VjM$u"LXa!7Z]qB! ZC@,Gy!TڊR(J۝PeX~'I٬$~B?熷r endstream endobj 11 0 obj <> endobj 457 0 obj <>stream xW TS׺>1sMPE5P**KQ(w Փ҉REw{8)v_ڳץQ"ܦ˙L0#ǽB{=={g%w뿾yW lc۠2GAۯ3h]m v.b3 u*PNَC6ɢ)}h]P Z-;hl0!$9=MIIJu.Ae .*X.8QOh0"B9tN,,E,܇ZNi0 B1%xh,7͟6: C;tqWR })SwҡZ'HݝG7f}{[UYdwsZ94H㞉~ޫ`1?n-O`̑|?AYDuWQUma;g> Hz= B@-cMp@h}5aB8D]-Hb1vQ}!Z7 &u^NCB<|6 4Eh}Qj&O13g0s}ڇ^8<@[L1dZ~ g쨱^@A(UHboࡒn(*ҏ "&T!΍EZI7xC$]_Sf*$(֥k"EZt /g~.F#\#賸ԌH+K-ڍcsz$ jǡjѳt{H^Q[IfѮ(wMETEdo%y ^ MN)ǓUq"Ș1k{mQe72@ L2hy<M`q062`~=zzǖ)y|X}TwadbGG9CjdS&3?OiG;g߿!?ۜe:h\0$7i=MfRjjt0j&]_9՜1ya~6==m /슮m*F'd&=9HfѨ7JJ3j3 HgdaݹdW5CC.?H0m=timn!چWu.`1LVYY9C# ~{,^.&p3oc ƂR۞V{0u&Ձa|\DPVȂ2r$zNV^Lma7XxKdD¸j(<U!.*"F;lCrp"r$'~ay7<9):MlrbT^LaHuX2![uo9 4aHM &bxhjm+OP!Nm;SMH?O]7;*D WQ-1 aBaSlY~~io9֡>yyiMkb_0ӎ!4M+~OmBe1J`$Ey6 tpzcNstC5@ꕕC.A\ ]W$OU%|6*$>;uv}"H3btaoS4ol%a2/GW[ˋ4L]YR#JIhL壕 [*vv8  Hxw&xHɦ r{R~45*v^sSA$u5_e&`d =tc%a VBt7;:)Mw<y9Vi0%F(%?F!1}QlMVzNѓ ^f崡Eߘkw IۨpmEFuy"Zv&iNHNQC2O*5*̪U[U\dexn}!4?OJB0,mլ߱> V1s,CQ]Jxq=z L_Hru~J9X,,A͎*Ͱ/[aSBMVS>\csS5_Qs %?uIA TCHYo]zJ :NuV0 gv1-6>ҩvMC7Ccrlw(a.L֍%'5ՐҨԇRsk3vF'D׬(a+dqOT"J(f 2` W~FdZ"$"m8Kbh2*ҶVo0}IsK'Yܜ&I2aj慞-{ֈ:NK'(XȮ. h'|TI93XEs ؑm]{ڻpsiY[1onHߐz\U~H^˙+gO )-=qIKȧ6ia .+ژ['d*8%?=PO: ىbMv!3 \0@晎 2!tdDL_ۙx=>J߲́}#̕(sA5$^QU6w/etiӌ? Njs/'SZ;ߴ̝>b 7ؼ/IH/GtwRG%2tХ.+^#i H@!vrz4BIjR5P 2;Oxvtjg:u .Wji?Ra+cMm#mSN[ lm. {tI]$\Rw lNfؤD cP-ّQZ'ѱT=r=P!ȿ럮Ĭ<SMJ]]D61L%i Z;[,;EkM9$AÔndk8~O˽hl*mUVkR0(11Ve\nb?+AD"F2`6EtT ǔefHC1FPiF/ްuhLSˈv<Eml#DVm:,rfmqtEn2no/]eKrt{H,ޞx D}*pqQc+v妎#<]QGRʷ7;'p^sM>|&A"39}> endobj 458 0 obj <>stream xcd`ab`ddds541UH3a![ׄ_U<<,?Ԅ~O+Ș_ZUS_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@|CR#-MM͌MX8{{XYlz6USG|_K(7aRdiMS;:;Uhhknl4WǛgwoDݾ E~.ɖ[>o!nZ?TD/[roU~]߂K3Ögw?ѻ߹|\o86smf`| endstream endobj 80 0 obj <> endobj 459 0 obj <>stream xMkLSgQ׆P MS :Y^ n*&*jjihHd4f6]cibAkTHo6g.X,s49Q$bb0UZָGC\0ViҵnsFeU 1q[G37v^|Q<5 j"JM85j2F9)5S z}9 8 dg=X꓎{{is$1490 =M& /ߖL`26KEL̐# hj!XJ$N?nD_Gl Ӿ$"&[Q ΢r26<: 幮1qE[\f?X$ 6*";Ⲣ>ǟ )14(dT~F['7-\`a?@zW^&#<% 6056Aa>Km/=T78i_%~XYtHmU-ak ܄[nUp.֭M*UC,,R?^{o6BGȯXUX}QHL^ו88^_ҥ*fB a4>롗>f$'s=+-p?9=8nDBb#7)ll;+j_Z}'O.-^|N {IA~8@ 䣎_Giw})3،woT$DsMܪ:!M~ ǡ$~ԏ;C¼ mOo?_+YiBVtl(.a> endobj 460 0 obj <>stream xX TSW1psU :CCp NNs$!@c8aHGgUl֡CN$Szoe+{9g{vx+n]6SPw%+vss5B#+?d)v.\0n̙ Vx s' 'v[^>hKbѢO>J3D-2N mF*۰/p+!"'YJ•VX+^'Y)Ssߍ~l r v ٶxɤ&/b>cڮ3|23v9~<~A|L㉍bHl&&[[Ʉ+1p#mvF$;U XM|B!fkY:b=1p$'b>L, 6cq`1L,!ψ!Rb(&pb%1p__y;yQ-,, 'L,(S"@ :1|̊ 9C,zuN _>\3шU#~0[xđ#0k6lJmtֶllm,5qqC}9?\冩y ?澣 HĤ`4&@P`BYVZZ%l gTX6DpuP gdTd]L6up9.] =v0 22Nԯz u1]diCd~۩S$ O5蟲7{4'ZcW8HˌKgz%ad !y郋7gղ.SnCgpTJpzCh=t"8Faw XY^J\ ߐ%>Y#Z<f.wGdscp8xKd/&ԟ=D5/^يcƠd_8\^Ά Q}:C%1$-WRfFwopGRePt`XkXs~^q|N\']cR4 [mGp_+0ӛ"0z#Qi%د*-m(i/`iBR*idCԠP=@ ,fIZ 9p\ |p">g,3dzֲAf=NbxTyQl+A-(>H/9xC .6C>MBG-3ȴIMsi}Hn{SxCɩ COnNUXSJ*2%,wΕdw`@!ʘYgZ9:n)p,J`J13Wp@.ᮽ] OͼWo:W_ :Zhꥃ?geԂgzkpGD1kP^ Tjy:cUY(LW1 "|ܸ46GC;p< UK&Qz6+dmp5f2 #7U(H66*ev%PW<\Wil /0:Jռ?4m ;ȣ5I|(dY̾Հ3flVTeYUVߛ<Њ h482S\0'qtWgJ0*1Ym~dJ!}rЈ~>D@6 aM e_6@U}'R|Y"hM?!TTf]/wLQ}zlO&TEkc/*WCb}Giҫ T4 }] (7\GҮ-_ƣw{Nos5ݢE VW 3TdrrH#ΦGjpn+T,0_. 9spf`!ً&Z]AD&C8I0s *]/-б+o9o^䌜#EՈ3tG䉲y@\%?p|zpLcWhN(q-VIpKtU 9/k@3-x{Id4@U֕\^dK1դ/P$3j4>J ܥ0.|gVH> mL4Jrkm\; SgE\nWyZd\C+tIYz(% ˚̀YwECL[U\Y $bZYQS/ivI eEaoIPEM a`F\/Ȩ9pz~evB}ogwwg3{]]Ϊ* OV4šL6f#XWdZ>;=[-Qݨx>t|A;4AkwʛqYj2ê0gOVU5ƶrBf)J?Y88q*U0#[CӲ(dF7gG62}S_3ԍ@7BX(74TW704guchT:{ s ƊdƬpIeK6&{ߌWAm^E̮ʌj>hӯ*(icig Sw~|Ң8|>QP 8F:qf/ZWuӗz=^;'r.:y@/8o{FE)>q>ռypnn4؟C6<54dȢCn|AȒEM`Xi,W㇋ڹMC"EEd$U: kMadVTUgd&fгd>lɤS%>c)@bWN@zQ{^Ji:$x]h8 {kG$=#y,A"NG]F`6Y,b5Lp_[ QQeT}CR,mŕ98"Xa",$49 QZ#h3Frx;wnأ h3ZxLXEJpjKpTRpL(a;M!`'faG=VI%23 X8:{atI)PVQZ$qŝ,~$)S^"tYD B(iQB͑u5l闿M?\e:)99[|1GcHsǡw(8xW \xWKb&MR^jS~Xvv[.x<m3zUsHfcS7dc XEC>\ÁƦzfiB8bԥ4-ܦɀ^1> endobj 461 0 obj <>stream xy xeuBlxA%ЈAM6쥀B4;֦KtoJKKZBYPPguq'wߓquzqJ99&1 &9vٺ-<4f1߲i< &`}>;)0e"r>`19e9AFZz~9Q .|anO=0jIV #)!;j]B~zJVB>Gf朤/=dQQ9W̍*Oڔ"(LIz=';?j}BVJ,'_"Z"f0,^9sݏ hÇG;U^Xh ĿIIRZE6@Цm#TǥRҌK .zQXQ$^*bI9N6uAӶ/CM1Z{f}zB(UR"fqat ;?)pM" pl4}ӹ2WF<97 |H\pfyPZiD=m;,/ b;B 4UE_3d+u_X}G1Tx~1QeV6\z~3Y3ϭ=8ƏrSW4"V sP~ 7_0Meoy~&zS`3ae:5HK/m.HZBD1r@RBKm׾ ϜB368!{\5T,.LhnTwX's mc*-jՄ mЮ[.v:FsͲ6$.~l4oчwħedSr/` t>~I x |쵔Db;e&h‡5fë>f(2pigh#ڌ2Pzd_iE_b\0f߸GOݐMG?c򄗀y?Yy9NeH8F4-=GHJZr;vA\z+>lljxf+o!jmTtbVӶUтCf\/mbt?WK5 ;krBg6Vѩ09G{ۙk:Yï" `49@$ł/'7dj}&+el t:h .LDr%PE//.X"q䢉lhZ׉y^`1uhQIcʠDl (zPj(P@ ,֢K*1Qd!GOKo qjz\1dmx储9SwG(*±pA]cSqQb(+Z_  9OY9[$)@]6֣gn ֿ!UYR羝fʑKs VGph bW 6_[j dCgžgޥu2[Ačݛt/G8% dgkCC l͸t{ϓCh+ Ld&¥,Rf+tR_]:[8C{pZ!OgF6vW@\<_L]1ij'֓5[TچJMW &EU)\FQ~+@{q ZgH4T$h!M3ނYۅQ+VP%R"x@;x-( (Z6!v߁!)0+ LtH|MiU&99h3=vO*k/D'hE4zyO#w`B<eD4m+?"m/}R,02ym9jG+S zq?lj;&$f&"V0ԻPeٍdN3nyuIЫCS#>D=q,ť!>O֓}ż*޴{}p>L@6.znbtzN}1J];0zͫ\|m+npi,J|HSF(*1Kz ֗l w@5tfnj\JJDm2$A)'*]cУbf0+h#V{@3&f-6^^d}>oV< n:" ď/Is_G>MV ;8'IxƸxG7goٳXFaVzj~]`PM D'?)OCJI5/Ejw4@%Xh {{j&K(z{B5.69"~zWrVuk:yLU"nO^&BT&Vk ^b CFL=B鵲DHл=tGfJF!/Ԏs{j?8hAlVJoKwW{υw(8 L |qtX7pkSҾ) *}8X"^$.pVJb%{:&观iPYB'T> J}VP婩ߣFN pX v, RUDU"IVm8Wi p﵁aV&Eoul௯%?:%bVĪ0Z:B5w;>34(\ ^/SK=)bxw}t uDɣzˬhŃo)EOf`JK/FFn |:L^.oHhs$NUH% &PG3Y˕ ɨkJ[ q͑7RPV,6+0nLO9S =X?D.*cba9=x*8=%Q{6B(QRUZbI"Mg/7- ^Qd{p*RT(__ܼed Ft6wAUQe1κ_@Sꝣk؝PB[#Bb.5(@kCoC M @_n-zjCwT?ej1rCLd2S:a:=fdm$VU 8 ((:rI%U%'Px#_Z :7pq7XNz:~tz!i:(y17Y@7#{P?QR M{+:Ug {2!u^=GE;6~hu~4[YLe(#_\Q\x˽q3{u Pdr^i tf&yF^,7a  )֧E+kK\"WO-~^m"h0bʹt):^ʢ Ft79+:/;jzMjQQ4ؒP3*K۠y\RS@Ea,/Cp`Nxj`M<{n G7 JFW>sG&%/^u ,?tpjgၫ/ܪ%#A /4X%<׀9,dy7anlj @l#w1jLd+Zi0KBpq@8E8ۨJ6+#!YZ&L&h4Z]R'ǣH<].{}tP(7cpB{FAUBQ 9&،0NvRr[')i5;QS}6rA ;Ge|{=.=/^r7|]lPZ0@\\][?vz6AT"4kK'$eV $i?Dq|I '=" V ZR)(]Q#UBc`,m97x ^Wf>Fώ^}ѻkEYR'aǞ73.- |{64l}!`v0SBC6s"Ļg`*\%#ruz.;n3¨R!YEVA#.5ʌAcZzu*-y G7cG'Qyy F Mp+Qs"}#jC1kQ2U[M~@ayA+|)Wo 5)m  uo| =W'q87ҦۛL4 J>Q\XDn)gӘ06c3%1Lz D5 6: L r\;" T MFXhVKk Yku7ЌOI4-7MӍQ+J9v{- }n,*C":r ]Fآb(*:gi"Yivh]4 m _9s h=`;v6+*z+4.%]OP8pᠶA[w>AXLO%\>~*s 8#k~w(4 =ӭ!NBadʎJN+kw%I~$J zݿWȻKolܼy׼AhcΰÇ ͣ$$؅׫z68 %(~G/%0+'S4 j(0HzGЌ&,z/ S Nʏ+{jsNꇆ\G㭮pZH;^SOBsSjXru:4bJ]5A{&Bs6'kOnMicokp[<p8Prh Y.MO/L)_G/=_tAQrx}:q}Ykϥ vn|K1@0UfJ/\֪SJ\a8?e l1Ćʀ#0.l D~|Ѕh=. }sz5h!'ӳqkzфyXVE #$Dvh 9~fo y 1+^-trf_+ԛJK8@K]wלJj@]hN';2A3Nz߷4Y|̯~|w&Ho8dvٞAݢh*'MABl>ME'TUҪ蒕oD<;4yێ*qkf<8%k :4mb(#2x9E*O͵ϿP2@/=Ze,eNh5ym*TCje)zq3U#VGu4έ٪|COMOXN/ӓ^*Rn,Ha; 5i^Ss"5(V;=:+ىfYvbPQeQc`A#JPPԀ¹M>D^e͏zPo$2` گSQ鼸zc>Ҧ2jNM)a7$;T&QoSioEzE0>f4l3'-K[d(Lv/Pzkވ[hyҾ՟x^}7KSPk2ʤhOy ;NЛ̯*jnqՆ\| y77Ѭgnn ZZsyuF*W V}}RDeB"^QeZ@%h=eRmvd.knY*"f~}WhD\U(&̭4=J+aH^I#ZRVUo"(2,4 . *;057gwY~- zoF{CkfwXI4 khI:_>d]XJVa`tyƞRNzZ+%sG,,{C'qx ,O|hg( =֌|7 iث?I%[ ߳'/cc@ӏ8y$QJ\(Xc 'w8cd' endstream endobj 9 0 obj <> endobj 462 0 obj <>stream x}}PTeaM5`n#D@͠HH""H!,e ,.7}waY@>V%AR>3I R?KbDΘs7N{93w|,bY,6#fש&Vկ4m?ΖnKT5@7@INTcҳ5!Ea4iNSv˳|eʨm~d;jЂ.@4L~=fD<ȈO3h«^dG37N(FNPy$8]B_t \"d#2Kj^Q) <0?voQ +p8ЁQCkLSȂ8^9ŧS+s 0,rLИŔі2&oO+諛svIU俥/KAeg2 ܊P"ÚSls@K6oE/;YT9#נim-XO,yȳx5^}A J3WbdddH͚,Ҳ[m-g'x{hD^``&5k %Eg`^kZa-wrLНN? R_ɜ0^34MO4fs BL Ay>|hU+0U',qr #t+ nqЀN@> endobj 463 0 obj <>stream xcd`ab`ddds4T~H3a!k_nn? }=D19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;ML:)槤1000203100qƏ|bjIoo_o¢VMb)ݫ6Քtrd/mbMxuԝ]WS\V0}I'ͻxݚnUʪ[[ J[Z [Z#K4̝?or}7|מ?W3|uGCѶʹsϚ,;qʺ >ES֮;ayV8QP'ZR]3Ї%vMjh L樭rSO[;oQkC<ͼZri:/;20!ɏo-^cmoFu5>?ly?N`pq\kq endstream endobj 225 0 obj <> endobj 464 0 obj <>stream xcd`ab`ddds T~H3a!Rnn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##羗d|Sr -*sdaly?ξk'ι<<@Y\ endstream endobj 223 0 obj <> endobj 465 0 obj <>stream xMoLu;n&DDEEbñzr=zBKiR]۵l%NB226|151o|W͇$yIu_ڭkyNh=G;pIڝJ! k(/e:TgkkgYXqsĜ⛬(3ZD$6g/_HVrNNpqG]d6lkV6G L5 v vg NuDm'%ONFnER-}A)ϮdNľtkNZ,#v^EL&1Q򧭧̀Hz,E0o57Պnw`[Ї|0>J]YIޟ% uP`;&3.ScS\8N"2Uw?r ❫:uZ`!$Ǻ#ayfV+\8Pxhŗ >dk{Ws /Xats9=;>Ex#:F5\A)S_jfVjڼ_S#ji0<<aMx$OGS\= i/j>:l~>1@l~mh: k0RX ZzW+?)7-Ujw'Dgss;]P(@/[_I\d3MQOC 23RSS$3ZnTF=HPWgJdjǃ=2[9kUsD|6jetf@SB%l0Ŀ3 endstream endobj 61 0 obj <> endobj 466 0 obj <>stream xYy|SUOV\&[P;kM%͞鞶tIi -#[YDewy2(;eq{$mos= 7x^dєg¿>΍scq Ұ^)2㞸>_5ZehI<'%)Y5!nbԔӧMzgGHI͌Z+MNȈ?ңVJR 3ҬO?-ɞ}J4{(Y49jEBnBN~B|I4jilFB*-ʓ&D-'dƦg%nO'74=!775)6##63/7%)#6!+7%]9M src &[4ayRL򊔕Vɘ9F(<#eGy1yVVVV[ϋMm=ś{7,oo*Usży^-M-=cxxyM|os#ZA yu-aCV?GFF|8訄я>rOѽk墼&?xpl##/~M|㡎1ό)±?z -/ʖήw 6Nhc[?Tyf-#亠|+p!ل **c-++QL ZcAW%lbC`+q: zt} r|}Oy"X'=%|j'm8G:Vj2Bnnwb ET JjS[;.XzZJ @j=:w:օImS6,Ca3īE)%@<`A]q`;P^Ej>Te"z߆P/?Ӣih#2,GEUcKoml,kN2RR1{<7e 5ֱb@OLͰ]Ȩhr+ċ_bMi6Q xҤ6A!UIg@g>@,4.DH{޺-T7(3xt ֤+@N6 B"zM`OwExf&)y!ndP=sI/MշW/EH$,` LmL,[JU`,2,ֽ F"᭚[>? G0x%%*#*3kXb|DgUsMxI $PUvV^t4.gӎJ͐˅l[@0Qޖּխ$;e%+n WO'nHbAU.*:홃#:jq>:UTtY2Ifhj|[V^@ K}tVc};ṋ2:@DBh;莰_X93U؎WVz Y)YMC& e*T3x u2!0MROo&7|gi  ۭs~%Hc2a. 5#_b޺@FcՉj&~2Mppm zȘ|^pY\'iz]d].Su^%]#gCuҶ'n {|wڮcꁖZtӗ{krU@Z*K+gbJQwh?y}p0Y!E2'㓏/zRmK=mP[[R?_ tہbwT-.>ewHg#X![үbH/cqUۋ$@/9qτNw tΨ3I_RD4}D;j?vD/ˁ~[*;.$9V{2ruqY-n ݅V1 qS$9v+@ z{!Ul߅+KlHT~pѠ52Q/ji%v+]o(dcKe&Goy33hl#e;joX|SnN*%jT#?g(PP30MKRZ#-\\1zGڼf: 담t[josnu @w# {E$*i^nkY-D /jr߮g[o1{ȽA?)@p0q+`칌bm醸5) X ;!F eTԢ %hH#y j﹊2?pQ="rvIIQTnЦ],)f~ϡsa0Jz-PϞ[2'ʱ[Ȣ"2й'!P~+dp0LPZ{3rw5B6q:@´,WjMRYaVVC-8v"›?,fgb/8v'7w9]_|oCn Q0hT<aߝIjc! ?ʖal4wף52UᥒI&_$s͇<`&\d?$~XhX4hf7ZQLE-#m:0Uw3Yh5H eTS"Q\l? j_žX$~̿pR30M:L82S`;$ށΑM z[f # ~gU =LY b7;wƱ㓘[i\߇7#A.%2 %aJGNXEG'Y~^c6?[d/:e8(T \Y&۾K=etZ+eKs r"5닏v7phogP3z,)\Z=o}%^uӧhz~8ga.3ѣ6omXBXUAhAZ ^gs$sWܠNhV(]ށxW P_\zbV}@ٰ~̡sV)*I;rL*J¾ϳn==Y#bZ./t_lqvVwDkCUˆx(5#Hvt'.Ƃ ^gvf&v6m0$H}ޘJN%Iy;8Hkm9mww%VOE``URcx/pyg]A~?)e: o{V*x㵦ʖں=^g$Tg1bȪ㡴?=h v4KwnlּM$%S  zG;:l T6K;` L=+ݴ@ s˻~2f% i<:eN75R ?C1#n݇ACPN(.~ډY w>UP$^/ rԯ|Ur"3U#F.ee$6 ldMXtLJP\&W cHEzƢvZf9wK!P$D :ʼUfc .'y@yJ4S9:!G} "?T+bPQRU"s_^ZuM"m򳭒4{L [MX[4e?oVpN"i/U (=ԥ9r ү\FynWk/u0}Adˡ|w"N#@)jڮ h.}U@-V^+s~f- VBNG|,GU緹=b&OͦRSKSl |ǿ:&jʭ̬mjk"bk+'M"mh?.SVgXB"݁7\6RДp|{gW.מNLXxSgiYV2 IdT:[WCc5"7\Jy>ٴZhJ292ځx-GW^jo1kjAS0D Ao ~4'kΈe'ӫV=Y0Oat`׹b^DMU%^+p{-*\NՖ<`~/x[*E"|oƓ?@S};pJ7Խ죂umՊZQT}Y]yȚbzKmV7 -e|yͫ!Z_|jvhL;oe+CDLqMf7}aaf ayqKVXBW:zDI=Ԓ[pZ w2X/؃$9 E|(G/T_1y/g` )]򻂻to-;&v`ՁN{"qSt=3qz|<)] \Q]);MYRl40/P$݀Ƃ?%iL Ix0&RpSgQyW ۡ. .?\9zz~6 =U1XmkSi1oMOY/_ Bh|AJw>^}xmBŠrrPA& $xе߽FjLtYba"P1nv r^e8;44zi#;F羨 endstream endobj 201 0 obj <> endobj 467 0 obj <>stream xcd`ab`ddds 4T~H3a!K*nn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##֏_fn"˺//讖kV]Н{<_ ~+Og?uB e` [ endstream endobj 59 0 obj <> endobj 468 0 obj <>stream xYXWמEYGA GGѨPHoK]`u/.D ƮX,jZhb4hΘK ſ{==yeڋDENNS&k?ὄwLRL sk, 3 82CȤ6vg3e'LeA-P)Kj+%Q,5BYQ֔ 52QkIJ)z^U&&I&M?44͒^YA@10z>I}2_cmin0` ;x``t4I9>l6|C y`55gb]gPm܆U{:|po x_8KN#NԙbO9SW(s9W gpF W &pf *wQ?"_*T/c3e(? $jQ _E9ָ, "kא BcX^g# ]UG Di6'0]8@JGQ4gT9ڙ[+cr 5ӒF.R`vfU X7.t޴st,ԢјCV6ŦXD~,9gvwxꍛW&Or\`x+*FnUj~Yq*J*fxTsf2bBZt@.]ʒ-ߪ@ƒ- x0: B/O|6h;b&x:.j[gFdD6"}a>Põ.d搠[(c/^8s',qXczp|b@g_,%OҊqgcǛ4.0̾WBPBi @E$gY*8xIo+P zq5P1$eG _){`; C ̀3`<汸8+Y9{Ou"V; 6~7.a{jiKB QY_zaKR,"ގ" I.-ݞ\goC~7HV?]qAea5T)cڰL܉|O?e@=nkb`UNh󡞅[m^!p ରLi_Džsifr{D#^P<1sQp9?xXK&|n]^)+S ?^-\z8S=K?0ftpj ւ[%_xC|`,w/cψȉ2x͡ɱQGWb(< `k{PcAazOsMR T @0C<>݃Gq*=w#"4S8 F Z)+f=W1!`M?`3zs EMD{@Mo7fsnQ{<@C<3vBo= CXt` 3n]H+9Uj0 QD[\̡P(.e 'iu=H0#AK6#g7C2S$K ی<Ӑ1-]+ "TJnVopO-:E3zW,ZA'Wī+&AUu #8(M:;Z@yK"dv>; VY\ҽ"@ȸD.):|bf.z0(OW#ZUpk$r >çaF%~-bhTA aqK#9w|UK1kU&S.n0xB``\䖝PXPq^^qfSxI eIՅ5D, @nA] }ͪ陨KO>ɭ=Y b|)RQ^O teRAVJq7{\nuuGqrR>Ғۆa>|4i:TWbYzW_i]d6%>_-dcFe c-=WjN"RE-n, 95VEJ~ E4PM9ְ _`wX?,XT,!5<ٰ6-@ NF_bo]K V G8vmЩ0r&0RqK٬*4EΙu:nAw((9Q,3 ^";u%tF ,8XD(+8k7}evG󛚔|Mi>0C3\lx՟y U}['%)/oοs}1HQJ/rόHɋ)@DU7=ǝ? }DѹJcԁ# 7mE-LU|"= 1\“S3(N">41V{oCqL7v5BDk\5JB-0Ԥ#+7or^5_D7EKd~.%'ވ+CQrEȷ»̷>rb.W)vEcg.*.!X%/ɭ{,RbhoQv' AK i!!!!\77X Wݮj'o:>04Ym\MYu;8׺CrEܻV2);૎B+Î+br?*g$m] ݚqS'n@}r̐$ewd#|k L̝1oHx\y0D犗i+=4;ߧQr p!:dDer030I;Pk XuVo酇ĺS?b=e%٫M+XYQ2H x&h/ :Nk|Qe{oGsRk{;Ֆ?X#6?6ׯs8'?5j5FFc<{1Xpه}ft;4`}1XkaJʅ(}:]w~Yj'n*攲U?F~FYۭ5 :T[zImy jgp"a4d6|CޓȝŒ֎VG8pX.;o ?$q T;}^FF دejQ0; \#F] ++ClM`OZ0GZ-xK#([Qxv`czϧ7;դ'l23,Dg ^Y,KO˕֢\e73b}` @KW^ԞLZo7Ϯ5{[iFu JHJ'H&$`o{GHaD;vQs[{+g",z=ڝM<,,(1<&õ/IKKFᥑչDw]ܸqJ;'O\M_Ƅ9RQWXX]ζ͛V-5'Z_Y`ycQQvpmjS .JQ0Y{. *02>U/}#>):[݉v*T&7# N&#+&W]aHs&pGL6dh,`0Dp~m斦#cĨ$HB ֲeenIQNz$~nh{aӱWS+^! LP Uǃtw9vc4ݾu=<s}>:~AL}WxR aTc"iȟ'T봝,6(,&=05;Р1Ԍpvs8x;\n;v}À;?3w]e\=sӖlZeO3.i߀4;|*,s{X͗l^U#Wj'+NڝsC{xoG@(MsO[#] >۩OVX|y9txCҾK cN)0/ĺݷ}f߱N ?Qf=KVCWWe(<+{wWt$?aO?_wΟl5/l!447~) p?Lzl"yz #[ t!ڇJcO1Aa5ʲV ~ؙq`7=$z>y;6 vr9i9 B,D~:i>RVFBwR -hΓG$=q½9j.++hಡއ Th=DN*i=QH8%++PV5S(NvѶm'{~Վ. }oꎶwq_l\6~I~_l傡L#çw.کeߦQ_W,_3KGzT%?oJf̋F/6ӥXGe֣]^ }~3ۡDNjfԲqxG&]Zʘj2P]mA,DBID3EbI? $tOOeG2xTkn<\VznбqJFY(qZz0T0:#fa >deQt91;aF8%hwA)~(j[3 1d9-P R0՞̆ x0F*Uݕmj_4g-r>\SyoƼE7wͲ5 endstream endobj 174 0 obj <> endobj 469 0 obj <>stream x]mLSgP(.$Ɍ3dFэ6s*:PoRJ{n)}$|ĸdnSY0bdYV]r'9?98q]㽷i}f5Y$g\(`AA5UH_+`%bES'j[ZR]m#jjnH \T69H*PZn%ݱiZy{MFZHup \%hK/p_UuTI \M +"@`WK#ڹzmʰXwYXvO/bX9P{Fsi4;_='f0e4pBO4ݜyIaK=`gsoR* *"o:h-oUYe! ~k B\8oiZ [Z]b8bdvN)}yIaBcm 'G0D";p$V%J* \)u|(QxCF'2/i^ov{nM=vA)㌖ىV2awNID>>feW:F(cktQg@0xS$!7&\q6!iWZL]YjG2PE İ6)A%WcqС,~ &0zwT ͜ GC3_F!' eLe6 5hpu}#˛n.=>dzK {"'Rr0N6S3U[{Uh-Zʯhz$c<3s F[Zպwr&,f[ӈƿBx0잒L-;zaZ 8;>>{f-N#s`s86R"Ʀ? Βd.80I6i0o,em' <n endstream endobj 42 0 obj <> endobj 470 0 obj <>stream xV PSgO C^[}jk=:R۵j[T/\IA @BNII8hD[v:Zcw[]۝n >n켙I鴰Y4:%YZp'kR>wgEaZF-í?je/\:v}9WˎMa /eib:6{+VD^/ naYJVAl"-M-gg+xɜ]*pe,>-h4&TKJ_[]4Z*m3m1-NJˢ%ޤ%ޡ%6RhhӵtzTihaZ1a[¾m O XqG"?gܰ¹Cѓ@C?c3LUju9,&di5yMmCN3ۆÁ}G/6ˬJ!5D=G-1qȟ !:mCXm79Z8vuw+i&_䀠L"m&q3mjrJ.TB,:t#T\a\ JFA%zDtA0g,6CB.MM]}ۈ]Sp 0P(\HsC+jThD=h aN\olVpqf= F}HDy!Ob͗bb `R١@ሇQb%KPOLE?2hTZ캑ܣ3P'n 2rsd8QWIC ˴:LԡC~ 7 $E:szxoVz$r)1mh7sۮʬx+ ' 6'iFRric4z퀹3(  3hF(!Ŭh&A|)JQV;xU}NUBYa6H!X}}F_'j{%-؝z6؏ y}aS|9wnF_1)ȼ zCy!]x|N e(NgқZjJ\s&WI1z+|Y$fx 8bj5b٘NYz+=@99nQ,gʊKfB#Csa[60N#X>J #j21u[` <vz['KXBzx^jFɨ|`0? XzH%/4&(o' '1uztIm^QhxB[J 1P*.X!/N'9IbK&}A1h!mxT3䀥?f6зw?;kqѡBtoA#ǷU}]!O>N."]a #R'd]N_koqL\%.^) ߦz7IBJ/{hV>#->i[[(T., BAWe=fjyͪfQbf#:T 8bT(z>dSȭpkƐO(AקU{ ɩ^9K\1FY7>0CL;_l\Nب.pJ <Nj1j0Z 0V_EH\~g]1؋KK$ȗWky E54mF׬ #}W#a1Tq YK5C+nL(|ϧ tqr6%q Q83eژJJX+Lrڛ,>m]u`5$gd3]_(Z^2 RE F(Bxl.[c]8/3ʼn7M+[_o7w@ QUpKYCSPdE_;-1v $FaZΉLik(SS(BʈikNfX䢩3jhbjbqq?`tW6PJ#SRzlDh^TpiwC6`\E zs3`(gurdl|8,QʋnF[sKXH2Y2=0U"j$A=<~` ;H.); 7*mpe+Y=SQRFDdGtT`"eIo%Սfy2tg  txt*iI/1B AsI,bT§"oPP860Q ]d n 4zI.eœLx[t%[4&z-DY?^8*@ԇ[T:Z}N~wZK[;%7Tev7C:\5G)cݓ)c EC'D#gOM{lz&9J'6yxﺭ--?_Qd7971JGJΨ3 ӁFEJJSh6NA%RK,r9*[] qWWNnQj=zlzأpx>4$z=O~F)u_E`f&,Pb/Q"ܛߡGѳ( RAuWVT9ZZ*m"7=MĢzJZ 'ss{"{QQ4?r endstream endobj 152 0 obj <> endobj 471 0 obj <>stream x CMR5%;6/  y^WRmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR5.CMR5Computer Modern+12 P;zrp~oop}~poo}p<"jDKwz_̎Ťl!Y_ŋŋ‡ #Y!< ַ UaxM{7|Xͼdzŋ #(=)Wqlũ΋Q)7QK>JcmeuCnb  7 } endstream endobj 40 0 obj <> endobj 472 0 obj <>stream xX Xײq`EDi5=7qI1 l*6S Ⱦ, Qq&FM}Fc&zM59wn~>>#c 12_4}xqLO|Md(.C0Q#3r, $&`WDWֳ'ϰ6_onL_;y{G[ ִiaaaS]z=aywZ Pws`U.~Ǜ&oWHG}G?0s/ ٵym]В!B\]WFGXsZou>6.0VAc/f''KZg ] P:o%ľ ٿ-Gа.Μ^Y=6 ?aE'^*ŋʼǩIpuhhp|EIBR挆 mj]4qr?ߠP-m.f1&YFr y1GNw-Fyp򱳩8gU'i4F9CMwRZfɨx^\&^'4]|!mRCy  =ԛFB40Mp*EfORD5PRYiLFl1CF\g*XQ}z5L|ROPPZ;)(N+ʼn|v.h!+pw =Tn6. ,,q"%-bHg#fH E66t{fs2hvTwTEߛYCeS%U2pGTRV4)Oͨhmzbb]o򱹚0UTuMnt&̪ R)f"5@z,T)` JMN@&wNb#:۽9\t|eT%ڮtiu_#i7ǒ!NI^=DB%7V#O+k -GKW)GeME7u nh!ox"#$FOwe)nr_+=8_K\iTQSn;&Ϟre̜MvT&=Mc$$*Wɀru76.B9m-܃p؅翑oM٫dC<{{Z=(L8B|4^ fiJN*Β 8э:$A/3q.O> R<'9ڢbmJЂ J˫"\Tk{Mm[Voedx%EU=AsW[w߿՚>~>nYęIF/5t06m:]Lgzţr;pN۽D%j8׀{VfЉ[Rsx~^G࿟oEBxD!=pjBC٨瞽~ ݆E4<}(!bw7 R\;OzTcÂpMBF74V@Gн QƓHӬifJD.vcbcPoYQrTW"dmg0| 5Ջ}uc/N(?Z6?k)-+R>Cwɓ[r!-4}:T7HhDqK>ɍ_? SWG G fe4%;Ĥfl%MV|C" oJz˚e"gFY=$93իy'_bAlүg$_,9CC~XaaTuǾU''&SFq3Τǿl[W_Qif< [v@=1Ғb ܊O:zow=]bƕw ۫3sWWm r_=}ĥۋ>IA{XˀlMs ?\Omwݣ%$1eaϽ%+`lu*TzLXQ\/,fܕ&RRӀ:9NIu%KD_L}fw׺bG  Me1.#2M2DQDSvn)O,Z kxkt+\qt"I Mp0Rڞhj\yshd~7V7o-Mwl\UJGbh0H[F7E6nb?Kޥy9G9htQ֎C sU>~[+ nbژtevrZ> endobj 473 0 obj <>stream xeoLuh'b'*fzl3nd8`tvpk 1럧p-W +--L(llL|DؖhLw]®17O'><qs ?X` "jR,_oV/]"7٥rt)aMڝ}iy5HyH}n71޿K_+J. zͧ ^uXw8 a8x24vk.x2 f7v!TyƋ ip綃3v%m49Β:C@g>s'F9~<'_ 8N/n41pg{-k̑EL- u~!&2+ᅆ:si3;TpðÉքqQKPiM!7.] endstream endobj 33 0 obj <> endobj 474 0 obj <>stream xy \S׶J<'88TZk눢ℊ*  !d%̣2LAĈ󬭭ֶzV;XvhAg"az1]iG[{qDK!]M2:S̡>2Rtp@F*G- v̙3&Nuti;?'g2?@N}"bmyk<_ 06?'',vQpPr@۞ 80$2'vYOX0 9/ٸ09lQ%DE{xn[g\WX-p8~O8eӦ1͙o`Q f4ìbf2g0㘵ƌg1'fld21gf2qd3S%Tuf)3yθ0˘rMcz3}@?X0A%#g3<3bf(3LGҗq1a̘{^ z]J3[d`ǼU)ڱj*G'{?ۿڢEo0XiHV~p'5wVV?[k˭?en9|1xD;Bb#ťR1sܗq iDOkU:u.pQfq}spH}h#źNqc3Hf>6h/{x|+(#u$FfiI}z`2zyJN߈<ȝ=o\К>}XX5W ia nCmdX2/ܝ_oEEeKhVxG"։}y,ťӲYlZ6^8.miB"wd?][|ob:lG7YѣVK2,ďT- a qdyq,!ǷqOq@ OpQQ~He#U~6qӀ0D.XtTF5$;SrȏMhRwV.;l1=D'Dz\8ي4]\b iid(fÌ.O¹Ld_Gs<3FnNԒqAb0[brTNp-'d󺥻tP6k; !*[2fqKMQt*E+a|f>"BF QBW,̍<~mNCd]c&6P%dex]J,^Q|`P ^r X܀w`<٨rr/>@;}<ùi}bx $-`˦ů/B|k[+,)(M,Q<Ă:!j@68cOڠ(yu>nT #NCEG{I1.YWNʠo2bi1p:/eDJ'NĦ <+.1^X8Qaҟ3v)>^贔Y8zY9Zy+>ќ%o ;tc ]V~F Z|/hyGW^[N;ö .E/ݥڈU/ lY|CS8 8ڽ'5*dTݤ75Bܠ2-x$ˊ_4s &[%+ ՊXSeh [-\ VRhkVT$:o2D Ֆ$.A 6RrRALSP\hw@!]3x1\iDohiJ8jcc|;q' 4@19hX )WbĥYt17B.Ry7fgws9#OA>cwZfFI6QEϿ^s~=̝mg$+pF6L 0آҙ–תSZMFp$qlfVK)ޫ{5t+ +b)̂J7{v鬔vF].vj!=whjJV"D 猲:M x>{Erh@ QXhZzNت'uɍJ*-}EIG=yNe4⊃8`Y f X66(UDHT,Q9  #"M1+)U9">i𧙳PMrSءp`쇂<30Vp ?091lԒQ>3JKR'jyCKrr?ut @(-C5o1B.ѽ&ąX_6O鲡.h*K>]n1Jb.ۧozh4tZJqWp8c뱑8g.HX`:<&Iߒ4ߝ`CPx4Co:^{Ҭ&[Y}&y7hfEqd*Y ʟÌj" A@}lsK2{N!I*K Wt)`B]jf~Vu 4q {b.ݾp~<HL턃%Nc5Q½}"m9bD| 8\n.HjӅPM1)*폝|SZ]xK;-B/5O}Jj"i 3 "`uZCML x8:ej)pQbMדBYX/k]oeo^߾dh`0FFa4E4ZVtk)R z*wA%jkU[9 πw1)J)6P.BV]rb tYʡ6~#Zdş~Iwް.g0b7u2X=Q<^{j8jF2X5y!o3+j <Tq bi)+(+X1$vj U:݁̽z8\\)9{º-RmVB$@aK:>^s*u[N(sN6 "CqjҲHӤǫQ\#hsR`?;Rٰ7艕ΏNYkw1'I;[kwG #Ti#6%1P)tJp:+7>\Z/_H5އ-45sTE[#R?vE 1HhEd)W?!!k$l ہ0ĜDZeYFݵ׸]__P?xObx`!!# 8h}+JCWu׿lK^WdXIM c޹a kHأ8R_ӤkR@ŅWZ:iso[Y9o̚^^)dT;BBƖDSpCwtsԫKV!]5W eP;'BRա9,^K~tJh/#qI[Dm E=0`ze˴q}#y <pQC7O}ww;;h^9V8Lx'oߤ) tVa֤-o8ШtPtOzJPRS@_ Wm E3!̈u% o:a%Gcaq~& Qn%%ډSy2n[Flv='ëpм decK!LasecccJ97_RV;h\2RmdGꞖvwOz}npQ μO[ҷ:*I.vjtz1y;[ U[Sud7$,XJK+a7',?:\,ufm~MFJaxhI&stYT" nw!eg2iH/r';8 . GH⺳bKq&?4tF\r:/)O j.%w  ШmԘƱJCf5yZR{$SCaR}DLu^j48ӑ":zzq4:LF3F)ʿ\9C&MltC 2鴇 [61[kNM7e_X$/6+졂p/t?L={~݄+Us]M,)bonP!ə>0 \pM$;zpwn!}qF$|NN_Y=&1lX=NP$V[gqw&LȬ϶$O>"ɉsكN5:uῦ(|FiyӴ4Pȸ uҸm?~n~۽JD_µBc8DA^Kp`/ޭA6W=.V drq@5^7'WKʁ+,VgN񻧫K+^RtД+В n$@ٰL!4!露@WzPi8]93~ft? x EѦqBđS ,TgkAc#?j!N8PáښS[ѣ $cIo #K#Bz"RI2' ;*T"YJW0cOQ_Q_Q)2ʤLm+MѮȀ4z^> ?2G/*#ÒAO]گPGh4BrjCRVԞ svT鱤/H&:ɅIeeVX]!&JE}J>r@UJߵK%t ғ@Z=ʒ9a ~eScÏZL%*Ғq:*LcI'FVW%J9?Y;UF^ZK[cʷnIcں] 4pMOe){=v'KYƝ7p =y3q [n%B|ėʶ{g oTWGdž@ _|}W<$[Yo.245Eq("H iϹO*B[P3Ƴ`̷ΧJ1InC _Pzh∇,},ms\r >-.܅Rlٚ2 8sǘps+/6rƋw~ooRhn(P sC}trid2j[d(9p71G^D'ݒE;`s.cg&E%wQb/Oz%+c co#T콬,6_GgJtSU]*PPkB`;F%q#Cz(w4{Rٹg1=.qJ_)l9j*ф%h6[>&'OdoVW_؞r23`g,WʂBٜlFE-@~ D~ endstream endobj 118 0 obj <> endobj 475 0 obj <>stream xUmLSg/-)2?r lTt[tLFfkL3J)^@"o[ BuNc9 &5m0f14pc<} K)~GsssqOnbB\FRGDmQ<_[ףq ǨOsroJL&&2&q0MqAkz4^ a'AcqIa =kD዁,+@? QCnC|l=!p_ӄpn6>V1/t~tS(z$z=1ǔuOI峻1z[>n^mm}Ef ^{ lN|V&m&)$tߑ.H!է.bW?Z}3? nPVӑhrb^H^('Q?8p(Đc$lp: pni| PpuJ C#8ӯ3 Ol~N8))([6ӯlAHu_p)isІvcv<ֲ6kʒV,Ixrs9~z6K='kӮMLSWb7  endstream endobj 26 0 obj <> endobj 476 0 obj <>stream xu L[`u3:4ZFAX.m(B&Vb`km ،6!% MvCZ u6mn*I5t`4~DeAɶ3ͯ;H~gpx EP]yit+<[e$ C //{s#FϬxHWq}ƆfcjV+N*}Y) *wh~R0GSX>)ImV(fwjE9j87dV' =j^il_xOi4,=guHjz@7kjC=8&S0hցM`4i:Wg0u^qJkTԪuWzFŠ7锦> doBQugU?L4-Htf#$!%d#dL2!D%h'DtžpHCU5kV$/Y|QfeU3>xOzV~P4_ɕ0,q1H@ǍJK(Sg :\N4?`q]3 g*B,CWpWrtiAlySeh< 鍂:}U.\rpr3u7+qk$|h.PJXPw]+"󿓹&='0[Z؃Jcqv:N!9JI|Cy_'s  f㶺)(izn62A#(K<]9UrMQݒx.}>Hq')xӋ,> RL⊆ R\ K.?Zׯ@ kG1}[pX6 > )Mo܉eiG$χ×iAXW()RAPw#% T8+P'R4Uj-=*f|B r  "3:Oa; ܊˯ ,4e 4~M~p&Ԣ_920Q51ޑDm먾|u0': endstream endobj 24 0 obj <> endobj 477 0 obj <>stream xztWä́+@F {1 ܋p"\IH&۸!-&$$I4mzhШ~& J!G"4h:(!QfM2ItDGwe23I/QInS=("5]:ȡDٸlt,1X`áؙuWCȁ}pU:p`ҭ ֐T5h 0/+wئ=@!y_ XZ)'(<Qj.h!`Jϙi_R(/pwkJO![V|xQw.u)~_,AhcS޿!d/~t}bOV# br!+A$59`VͻGԎ6>&zNB`Ag$d $p[4n><ŏ*< On$x3ma&Qm{cߏ@_ʒJķ:zf][ UpDEm{"polpw2:\Ģpȡ#\>;No @zƖG,hWlV*)C$׹^$R( B3bE8UjHqǻJ&L%Q ` mGzwٹcPA`Dh(Ńd# Ι Vn Yf_ѝ1Hۨ0-,^sȟޓlď<ν73C7#C*50:!4GKCQn_FIH14jBcM: yEԆHy"ߧ#104Yn2Ju>+Bj}10&Q0tw[~P-?z}Ţ^4XpdeKHYsP[ -pZ=k }S#! 6KMuu5n<]FىyЌtބvxICMؠNZt7Nz4H.]nOӓv妡0+ ؖdF2zSG(BYXl=WQ@LFKyMYՂl~`>Ϗ&Kvyeg.oq wQZNC()2ɏֆNSAbT$%+Ggx_qpT"WZ-<$5'Q/kϱ<`r H:QWiZU}_',qo,N^6#qԟd<݆c)TV" 7+w& 3zlF3/s,f0zfh# G/NY J.a6[q~Ow?ڼk\Y䧜KF7|~֨'v@UQ25Uh'~ "Ԏ*B24KN<3aJ!xv 鷷-7]qC_usS$x =&q8쫮EHj_wD6#o#Sfq= ;n{g){fA/Fwٜ, %Bpخ隔MdB!{ g;ިN^@ulR@:U&:+s./@1rȌצ@TJPo~YЊzw8Nܲn|k+s/ϮI4d n-sdEWڙLm =tUjQGKXREVM>A0 8Bu|ET5ެ @ꉪ U i8aҧ响ѕlvqKAQ#jt 7,r,]Wn2c+O~xhvmC4e"_U1-%9^&T3M$_oWm\$PSY]O߮T5#:I)Zf̻qd p f#qwlh8|6IZ7,Zfg=rˢCvHؤT|;KO#8%ؐ^D:Xd_4nKo],#2̂|^#D-(ݳPE@u()FmB, zb+f;1" 3(GoCD YU@>:}YeZjMUѥ(cMϿ-+%KN Z ȆfumOڈJ.ÌȧGןEu8+t>2MvaAF|(m˕A=bmXDy69FV"@W|xv JZժ ];7 V7R2sl{y ddždoKgn(7|#KEYn,K SIV;)l ZiW}bԪX퀅ȨU.l2@1gH~hL!-!~x2H#f-Ԝmb28"R{\ɓ-LM&0dK Mh9o硔BZY]/tNxDL83\֡~I$ *WqA&#7N݋Il_+j;FF%g:J:[M!b P$|FH xu]vzRwwt^tUSW 4ijEhyƁdLFA }L=ɳSL43*kBp]gd 1>&}Qɸ.W̐z&::8F#q@5UnvIԨ)2 O B[U;a'lu)8H:] 4yF;ⓓ/YAehn`A^Eu" ?lxL8 |6HXMKVSTɐ[6)#$RieJQO!XbNEx<~{Y7OB R4ME. ÎA(hK'Jl)+٢d_ |~>>ڧ+".QaLDqdUMɧ~lazV |tp!p:fmGHyԈvf*/Pz΢|!ߨր0]؃!ցNJ&RfҌe1s}Lh-S7џC#}p:=@ .2}T;i}7! L" Dv,eK:5߱e熎!Dvlv/¦O5g ]m%:/E)W]xZuI0Yж[?Yo!+*CY%($?;D_>_fs\^vˡҿJ`p!$'6[@*@M8,I_re IN6NWe_{ * \dE֣랓`|_X9OejhyUHOAΝd]Rd|z3뗎](`@2ڋDy[_(SȒlnj QJ&5CMԨl - iЂFeiYC>  RdeA>S]'ǗDXl2j"hJKmȰG-hBDxa|t-*> %߉ 2 $x#[M󯢸o -K P+'5ZĪ=߭gLBZF󗯐$&/Pβa#C]L:272>I.*Z >?$rcd3>*\6VUrhm^ ~8%Dwp*KLS ;x@yU4! hwRcb1JDZK UzC#1<јZhrQ~wGOI%E^c%KK'Jƅy~r⿵iB$6c _lVW}\+AU-~I<79>x~ %tUL̽)掠^Hw׵"@}Z(ؖ1/=noGz ߂Mb,mՋ ,29\!IQz=ZArGOȕ;[Y,յ mxZj  ׇV\{es^Dk@ZatJ뼐vɱj ŷ*}臻-6&E9<b eŵ׷͝nE2z\5VϞ*ZF,xD.'RX) D)2k$ǼDg}6[ PkZB"7Xn?YTAr5MPΎ+.} \v$Mǿ٢h)A*=KgDT ;RKs!Z ^/pf3 ,%IIJyi De9y鹹:Bk=Ly;";(wCYvf*1alx>H:gﻗ#1°ۺ}e VpÅceÅQ`,'*hlYܸ.J&>!W`lh#˦?0<,"s/q2o__wcz2L8k_ _ZkR=lwr}uZ!>&!1xDob[l3wuAWҐZ]闢+X)`}w{[f_!N(QEhM(-05).5e Q՗T^ɮ ~'9O Rh/z~Yu3/;bΪ9;Q5f3qC i=.Z* ܶCNQR!E$F)eA OeӢx WJNIF4]'=Z84|0CW@3N~I;ɾmqps]N\ZV_?1䷑d&+-/D!%)Wl^ߣFd(ꞽ~΢3`j[/6zy}j~ S&&L^^xwVCO'JtQ7#ow) 5wniR1tOC*%ITBw8bq$Zn(a~vMzm[ϛᔓF;wB֥͙Kl 3tMдui3d_e۸(Clf;^]u0V:`i?}WvN9?Rȥ}K%֟ ö٠ˮ)1Ic Ȗ8ARGdSovq<\"f4͉9 ml,lsMp,t|TuxOA1;J\ӗvfƎ1S9kE$?pͮa$.\x_oyCN`D>:Lv[H゚e330gǬD=g ˶OUGS1HkªODtjZ[^??+/VE lS8P3.hpof<~8 Yҭd||!-R%C$HcK[_2"O\=]cN~ST~ endstream endobj 96 0 obj <> endobj 478 0 obj <>stream xM[OGg8HVpCwWBIVʅjF$',xuwll˰cNZI(/u?@>D"4љotGF\V.@G|E Un֚)d$cuW>.pB %;/ <;c>[?KCC 'ó6vil,#.}?E:aE;= ?L79Hߵ:99s"ӣûYaV#

y;Vs"Kл<'%aJeFdQ;&$dXXZy k/AwY Q@➷~򩹝FE~?"cc{ccBbLIIʄ^UO$kaΖֳZ9\5R>%,%fb4)eU.kry}uRpe#dD ?Is}5Œgᱣ^P;h]) XW_DUGPӫǞ^u4Su$Tkz*t64>kFm= OQ endstream endobj 17 0 obj <> endobj 479 0 obj <>stream xkHSq]QOAv9;ЬI .EB wr϶JDݿ,-JIӦSiDJ#C&#/ϗ}Q0<7r(+-v~vC%⑍ Hơm@a& JjUX3::.,j s᜴,#C2꣩irX팞>i6qteHҘYKXbH Ȁ$\A)ʰ!m+`ǽ}!a#No,UX!}$6o5QAiҩy8y8 x? X}C?Xb@]D(*]7 뛮HR{d`94OM$sA^ޱG×٧!>}$Er-nkSK[#yaB"@K)BT`C Fl5N*P"RU|bg_( 3)DQk.owtAMBb2d;]_鱴7CkݰJ/ƃE?dA!/aj$z:RQ&{c8+m^O W{ A|<@;}RA׍ccKFwb) endstream endobj 89 0 obj <> endobj 480 0 obj <>stream xmTLg땯Dm^D3Yܔu Ԩ0F(PB{宴'A?ڍ *6@ JYpe6&M1f31{?vdrO{y7GSZ E42|-UQzHP>)RIp6*qYrV239vh+8fjTPc,lVWqن*|FYmK嫌ʸ*YEpZVcѷI;\Vhʭ(}K3WRP5zJQ۩T!Jr jJT}RZJ~MƮ9h;s_Y@ &)A,OJT u؉kp#n+'HB[-Žw9N,4pXmmyωY,KW/iz9h>0\Fj)Or;voشymYvb0I'إ|ŵs:@Drø5Rщ@!<--'0+كiUD)\agÐ<2ٜE|n2i.ʦx*;gRi ('ecQ9y{;;uGvL͆ YP/նQ)|xˢ!uۄ۰]u1wс:Nv*XPSh󾦯#>‹q?>KS7y8p7aߠMjQL`S"]:ynxaAϑ> endstream endobj 15 0 obj <> endobj 481 0 obj <>stream xJQFdv6 +Mj 827&"QpanDn`mtħ~.RDJ/nӋv0ޥg9-NJ+]ە/} ojk-ǨE;L(JK;V [lŢgdl&Ty,Κ s瑗ٕ]Z8[%ZCp)v;Up4k AB_R4~ NGh?~_;-B?#@8yz0aNCBІ hylcs~9am$> endobj 482 0 obj <>stream xX TTW}EI"~F1hѨqFEb(@T%2SQ FDcMwLmN׬[:ݫ뱪`{=>gfd2%kϱLo'V?0c<b,tœ5dQYK1qa!*שn/ϝ묙3. v] P?"]aAdש*U̼^JJJ?C5)L>(>(.1h2eum@Tͷ%ʨUPha/^\,^21)`6A!ü6DDF1}/zymf"3YǬg)f#Lc|Mb]f 3̼,e1˙Jf*3d0kΌ`F1ь#3ˌc~33herYz{vX{}WMܳN៌X5:r;~Q 9jFO>u̶1NNNN?6dqIؿ*eIWHunA:z9;&q\v GG&ZY] Z^tr&i2՘ q6?ؔzBvIf;GH<& (`Xd82F]K)xc-(,p⮼"f2a55m8ԃ=Lq%#gVmH^؟G?k n$?ܿg賂ŧ`M!!\rW𿿾qQpcݛr<+or9Hr'6df炊lL75UtFXWoJ?( @\HbkPX=h=2|_=+Z5W.@/\t+ayl M2#܄W ECg yk-zE$C) f "Ѕ~.. Zw[CJ,fgx9XneP4v W()Э.->"4bGXr̖{ ׄFbZK飁ZF!;6mB|:-飇g=ԥ{igg2m7qV69"챝HlMAa&Fg2+`']@`eH bpY0W4ȹ8m'mJ(e,M3-`pzV5e72}ɮSP/~%(es'K=A栃.R<ݖ ʄisc};Eih:C /?j4m;͛;CeBddf{.rxYiT(Yd\_qr ޶PvYh[bJ+ ƦVsM7g.r㵜m@-]t Z7lcl7'ZmG@[y" 6E7>Kä 2P\Lm\Ӊ8H28't PhB^c pkfƩ8鳓JN@r˪Qx&f~c!l-&:cX:']ҟمO/riI@- ]1 PNƮ18 [}8g@_K/S 6?&Și#3F3蓆"uiF&/_#LN-[u(Z9/Aۍ]áLЩ8G2S"qĥom;XhW=sP[$$@[ܼ欍67&8V\qj fZ0ZG}Ga4,).9G>7=,V[ %Wd쮬2?_!n-M]-к$1!.7a)>'}v|vǮ8^#Ӷ܀+~πo껌*X`)o+x1! 6RF%Kq) )6~+"Y/SZ'Zx؂ֱ8geH="n7\惁0.Дuc8VXs["(O,Oz ;tA pL7[wBEj:di%lC8w&bvTYWh(ѵ /"與4:܆99HOUsxt*"%Yb4JiP!tdUq(1Tܥ|Z><'t-,wswqQy-(ty?)ڔWF'z{jubG;=!\d$UYMa[x:#( Zj'}Hy (]:}iPrgRGO7o~~q_޿H"ImJ| 4lְ>Q WtnЯ؃؉6)հuE%h$o hMa85rD8g)g8Ie=؋' `RXTTT i\u0H5ze*\$rhhCׯȰuytѶy=mg%_T!U0 |epڑs6m]u쿀C~yU&hh4ኴxPLP%"|U#}d{HKo͉/^&wx]P^eTȇZǑܱC:9caqv껛rr,qU@8EgF?B_b | : )MSouN%/wCYwuyS&~CZ:`L)ÑSPU1s}yumU{ B˥ MG(x}d%2sDE .Trܑ^9Kb+>0>3n^;.[445XU 1ʔ@?A|u[+/OY.ug&[0)fo銨L N]1|9wT1*RY[C#ްX%?O?KBs v%Rg ӧ9fҝjgT5[7%{=)fmI}7˩uT=|ISϑbED>Eu5#!t^>UfID OfK6BOpԈ# KPYNAX#^79 .W;b endstream endobj 13 0 obj <> endobj 483 0 obj <>stream xW XS׺=1sDD%^{BEتhiEQԪ8 2K L aN'<Q&DDDk[mkjj{Nھ/w>{-ӗ)!B І cmG#Hu%B(yn4yf͟;nU<3S ?v[e^>(o+!K̉6[&[>m]DnOYngimMopE#(jƪ`cmeohP9 ]F'bǢ|Y<#=^qA[!ig$t@Un]@o`"bY50z4ڊ;Fə+ vop W Ȍ2)8e9h F]5* >`6[sXhDxBJ_I-8:%XJ?]/ H"[H,b?NE#S4x' ]5n۴rCK{olnJYJm;mvb9[}f[5e5Imͩ:`,5ze@G8|r#ϸ - LA{<NC4+?;7 %&܂U ZA XDUbJ/Eͺ\Q { f:s_r9:!|ށ3 zXZA#kd6le!P (b-'NUC̥|=ıȷ;=JK+n8UBv<Ƴfn3ž^|ÚW8l6qZvw=)r&!}5~@[dQ?FyLr`'`^Qg5Hxݜ;b?cO}=^A9BSDOPTCz|s`'g'.[kȆ&X! qo=^9_WSzU7HbaT25>5q N 0QPӣ:>2{050355%o,cfјqI#hDN 9Ś;YpMEsow^,8Z0zA]" Nٜ<ҙxg"%^lae>+mF"8$YIt}B&؝x4&DzKfmu?"!+@u}o'жv8=5+{ ɏ D2iؔLedv0G?^QJF3~3GubNv1+B_&H0 At IZ`pL~NW"=HsvgOS <ώ JW eSψ \Շ4nb[{n!rsR]H̀>&j=mzu󪬔̄xURF0yZEÁ.Ehclࢧa`ZD:Y|[pdA?hUr$Pșв(}miYMm6a !P/=JD wf_,?=șGص_DX~U^eDzmA'.Ͼ3ڊQz΢\jt9e9#P}$!{E3!ӄD$e4LJNYXPp=#r5,l$8kCVQHU FO2y5'_UhO@1)AuN8&?M[ B\%7WWכ-s WѝB/d^̵W!̌)\Z6%H:v!;.IKbr .qz͝-#EQD樏h5 qڽrrL,!Af9FH+YZm~WP{Mw߰'%ι9?7 (!5ROZÉ":4t:Uj㉊ Uph"-5!B>xX~%6<=WW @(.( dkp_NKOA#^Azz zOh=]LVJzR>stream 2017-06-30T11:01:17-04:00 2017-06-30T11:01:17-04:00 dvips(k) 5.995 Copyright 2015 Radical Eye Software saclib.dvi endstream endobj 2 0 obj <>endobj xref 0 515 0000000000 65535 f 0000341362 00000 n 0000459337 00000 n 0000340690 00000 n 0000327627 00000 n 0000000015 00000 n 0000001544 00000 n 0000341428 00000 n 0000355026 00000 n 0000389618 00000 n 0000352381 00000 n 0000367449 00000 n 0000366211 00000 n 0000453141 00000 n 0000365434 00000 n 0000447544 00000 n 0000364994 00000 n 0000444940 00000 n 0000341469 00000 n 0000341499 00000 n 0000327787 00000 n 0000001564 00000 n 0000004238 00000 n 0000363413 00000 n 0000434636 00000 n 0000362657 00000 n 0000432259 00000 n 0000341573 00000 n 0000341603 00000 n 0000327949 00000 n 0000004259 00000 n 0000005114 00000 n 0000360648 00000 n 0000422871 00000 n 0000341646 00000 n 0000341676 00000 n 0000328111 00000 n 0000005134 00000 n 0000007620 00000 n 0000359722 00000 n 0000415312 00000 n 0000358988 00000 n 0000411292 00000 n 0000341719 00000 n 0000341749 00000 n 0000328273 00000 n 0000007641 00000 n 0000010270 00000 n 0000341814 00000 n 0000341844 00000 n 0000328435 00000 n 0000010291 00000 n 0000011285 00000 n 0000341887 00000 n 0000341917 00000 n 0000328597 00000 n 0000011305 00000 n 0000012378 00000 n 0000357305 00000 n 0000401887 00000 n 0000356412 00000 n 0000394485 00000 n 0000341960 00000 n 0000341990 00000 n 0000328759 00000 n 0000012399 00000 n 0000019066 00000 n 0000342055 00000 n 0000342085 00000 n 0000328921 00000 n 0000019087 00000 n 0000025227 00000 n 0000354425 00000 n 0000381452 00000 n 0000342139 00000 n 0000342169 00000 n 0000329083 00000 n 0000025248 00000 n 0000027298 00000 n 0000353572 00000 n 0000372957 00000 n 0000365676 00000 n 0000448186 00000 n 0000342256 00000 n 0000342286 00000 n 0000329245 00000 n 0000027319 00000 n 0000031757 00000 n 0000365159 00000 n 0000445943 00000 n 0000342373 00000 n 0000342403 00000 n 0000329407 00000 n 0000031778 00000 n 0000036078 00000 n 0000364445 00000 n 0000443763 00000 n 0000342556 00000 n 0000342586 00000 n 0000329569 00000 n 0000036099 00000 n 0000040051 00000 n 0000342717 00000 n 0000342748 00000 n 0000329734 00000 n 0000040073 00000 n 0000043766 00000 n 0000342847 00000 n 0000342878 00000 n 0000329900 00000 n 0000043788 00000 n 0000044913 00000 n 0000342944 00000 n 0000342975 00000 n 0000330066 00000 n 0000044935 00000 n 0000050362 00000 n 0000361565 00000 n 0000430180 00000 n 0000343041 00000 n 0000343072 00000 n 0000330232 00000 n 0000050384 00000 n 0000055204 00000 n 0000343239 00000 n 0000343270 00000 n 0000330398 00000 n 0000055226 00000 n 0000058845 00000 n 0000343380 00000 n 0000343411 00000 n 0000330564 00000 n 0000058867 00000 n 0000063852 00000 n 0000343510 00000 n 0000343541 00000 n 0000330730 00000 n 0000063874 00000 n 0000066410 00000 n 0000343664 00000 n 0000343695 00000 n 0000330896 00000 n 0000066432 00000 n 0000069490 00000 n 0000343829 00000 n 0000343860 00000 n 0000331062 00000 n 0000069512 00000 n 0000075156 00000 n 0000360293 00000 n 0000421551 00000 n 0000359548 00000 n 0000414468 00000 n 0000343981 00000 n 0000344012 00000 n 0000331228 00000 n 0000075178 00000 n 0000080376 00000 n 0000344183 00000 n 0000344214 00000 n 0000331394 00000 n 0000080398 00000 n 0000088183 00000 n 0000344337 00000 n 0000344368 00000 n 0000331560 00000 n 0000088205 00000 n 0000097243 00000 n 0000344515 00000 n 0000344546 00000 n 0000331726 00000 n 0000097265 00000 n 0000104741 00000 n 0000358162 00000 n 0000409615 00000 n 0000344667 00000 n 0000344698 00000 n 0000331892 00000 n 0000104763 00000 n 0000109725 00000 n 0000344843 00000 n 0000344874 00000 n 0000332058 00000 n 0000109747 00000 n 0000114439 00000 n 0000345019 00000 n 0000345050 00000 n 0000332224 00000 n 0000114461 00000 n 0000118485 00000 n 0000345219 00000 n 0000345250 00000 n 0000332390 00000 n 0000118507 00000 n 0000122032 00000 n 0000345349 00000 n 0000345380 00000 n 0000332556 00000 n 0000122054 00000 n 0000126199 00000 n 0000357071 00000 n 0000401322 00000 n 0000345457 00000 n 0000345488 00000 n 0000332722 00000 n 0000126221 00000 n 0000129063 00000 n 0000345670 00000 n 0000345701 00000 n 0000332888 00000 n 0000129085 00000 n 0000132490 00000 n 0000345800 00000 n 0000345831 00000 n 0000333054 00000 n 0000132512 00000 n 0000134714 00000 n 0000345941 00000 n 0000345972 00000 n 0000333220 00000 n 0000134736 00000 n 0000140749 00000 n 0000355856 00000 n 0000393317 00000 n 0000355623 00000 n 0000392753 00000 n 0000355452 00000 n 0000391841 00000 n 0000346082 00000 n 0000346113 00000 n 0000333386 00000 n 0000140771 00000 n 0000147146 00000 n 0000346321 00000 n 0000346352 00000 n 0000333552 00000 n 0000147168 00000 n 0000148389 00000 n 0000346473 00000 n 0000346504 00000 n 0000333718 00000 n 0000148411 00000 n 0000154679 00000 n 0000346559 00000 n 0000346590 00000 n 0000333884 00000 n 0000154701 00000 n 0000163412 00000 n 0000346726 00000 n 0000346757 00000 n 0000334050 00000 n 0000163434 00000 n 0000170038 00000 n 0000346965 00000 n 0000346996 00000 n 0000334216 00000 n 0000170060 00000 n 0000176375 00000 n 0000347132 00000 n 0000347163 00000 n 0000334382 00000 n 0000176397 00000 n 0000182088 00000 n 0000347347 00000 n 0000347378 00000 n 0000334548 00000 n 0000182110 00000 n 0000184758 00000 n 0000347477 00000 n 0000347508 00000 n 0000334714 00000 n 0000184780 00000 n 0000190698 00000 n 0000347596 00000 n 0000347627 00000 n 0000334880 00000 n 0000190720 00000 n 0000196125 00000 n 0000347774 00000 n 0000347805 00000 n 0000335046 00000 n 0000196147 00000 n 0000198363 00000 n 0000347915 00000 n 0000347946 00000 n 0000335212 00000 n 0000198385 00000 n 0000204125 00000 n 0000348056 00000 n 0000348087 00000 n 0000335378 00000 n 0000204147 00000 n 0000210829 00000 n 0000348197 00000 n 0000348228 00000 n 0000335544 00000 n 0000210851 00000 n 0000214830 00000 n 0000348360 00000 n 0000348391 00000 n 0000335710 00000 n 0000214852 00000 n 0000215625 00000 n 0000348457 00000 n 0000348488 00000 n 0000335876 00000 n 0000215646 00000 n 0000221752 00000 n 0000348532 00000 n 0000348563 00000 n 0000336042 00000 n 0000221774 00000 n 0000231037 00000 n 0000348675 00000 n 0000348706 00000 n 0000336208 00000 n 0000231059 00000 n 0000238133 00000 n 0000348829 00000 n 0000348860 00000 n 0000336374 00000 n 0000238155 00000 n 0000240784 00000 n 0000348992 00000 n 0000349023 00000 n 0000336540 00000 n 0000240806 00000 n 0000244016 00000 n 0000349089 00000 n 0000349120 00000 n 0000336706 00000 n 0000244038 00000 n 0000247169 00000 n 0000349175 00000 n 0000349206 00000 n 0000336872 00000 n 0000247191 00000 n 0000248298 00000 n 0000349261 00000 n 0000349292 00000 n 0000337038 00000 n 0000248320 00000 n 0000253644 00000 n 0000349347 00000 n 0000349378 00000 n 0000337204 00000 n 0000253666 00000 n 0000257816 00000 n 0000353942 00000 n 0000374820 00000 n 0000349464 00000 n 0000349495 00000 n 0000337370 00000 n 0000257838 00000 n 0000263318 00000 n 0000349574 00000 n 0000349605 00000 n 0000337536 00000 n 0000263340 00000 n 0000267304 00000 n 0000349684 00000 n 0000349715 00000 n 0000337702 00000 n 0000267326 00000 n 0000274111 00000 n 0000349805 00000 n 0000349836 00000 n 0000337868 00000 n 0000274133 00000 n 0000277594 00000 n 0000349924 00000 n 0000349955 00000 n 0000338034 00000 n 0000277616 00000 n 0000280942 00000 n 0000350034 00000 n 0000350065 00000 n 0000338200 00000 n 0000280964 00000 n 0000283610 00000 n 0000350151 00000 n 0000350182 00000 n 0000338366 00000 n 0000283632 00000 n 0000284390 00000 n 0000350248 00000 n 0000350279 00000 n 0000338532 00000 n 0000284411 00000 n 0000284619 00000 n 0000350323 00000 n 0000350354 00000 n 0000338698 00000 n 0000284640 00000 n 0000292029 00000 n 0000353181 00000 n 0000372240 00000 n 0000351868 00000 n 0000366718 00000 n 0000350398 00000 n 0000350429 00000 n 0000338864 00000 n 0000292051 00000 n 0000298711 00000 n 0000350552 00000 n 0000350583 00000 n 0000339030 00000 n 0000298733 00000 n 0000306364 00000 n 0000350671 00000 n 0000350702 00000 n 0000339196 00000 n 0000306386 00000 n 0000310864 00000 n 0000350856 00000 n 0000350887 00000 n 0000339362 00000 n 0000310886 00000 n 0000312778 00000 n 0000351008 00000 n 0000351039 00000 n 0000339528 00000 n 0000312800 00000 n 0000314590 00000 n 0000351127 00000 n 0000351158 00000 n 0000339694 00000 n 0000314612 00000 n 0000317190 00000 n 0000351213 00000 n 0000351244 00000 n 0000339860 00000 n 0000317212 00000 n 0000319390 00000 n 0000351288 00000 n 0000351319 00000 n 0000340026 00000 n 0000319412 00000 n 0000321301 00000 n 0000351363 00000 n 0000351394 00000 n 0000340192 00000 n 0000321323 00000 n 0000323281 00000 n 0000351427 00000 n 0000351458 00000 n 0000340358 00000 n 0000323303 00000 n 0000325621 00000 n 0000351491 00000 n 0000351522 00000 n 0000340524 00000 n 0000325643 00000 n 0000327605 00000 n 0000351555 00000 n 0000351586 00000 n 0000366957 00000 n 0000367786 00000 n 0000372469 00000 n 0000373254 00000 n 0000375385 00000 n 0000381859 00000 n 0000389892 00000 n 0000392073 00000 n 0000392964 00000 n 0000393553 00000 n 0000394857 00000 n 0000401533 00000 n 0000402476 00000 n 0000409855 00000 n 0000411569 00000 n 0000414695 00000 n 0000415703 00000 n 0000421794 00000 n 0000423299 00000 n 0000430682 00000 n 0000432684 00000 n 0000435219 00000 n 0000444053 00000 n 0000445169 00000 n 0000446218 00000 n 0000447767 00000 n 0000448549 00000 n 0000453502 00000 n 0000351619 00000 n 0000352274 00000 n 0000352827 00000 n 0000352928 00000 n 0000353467 00000 n 0000353849 00000 n 0000354917 00000 n 0000355359 00000 n 0000355769 00000 n 0000356044 00000 n 0000356904 00000 n 0000357218 00000 n 0000357799 00000 n 0000357892 00000 n 0000358551 00000 n 0000358660 00000 n 0000359414 00000 n 0000360208 00000 n 0000360560 00000 n 0000361154 00000 n 0000361263 00000 n 0000361943 00000 n 0000362332 00000 n 0000363080 00000 n 0000363970 00000 n 0000364179 00000 n 0000364825 00000 n 0000365581 00000 n 0000366126 00000 n 0000366615 00000 n 0000457881 00000 n trailer << /Size 515 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 459542 %%EOF saclib2.2.8/sysdep/doc/user_guide/cPAsI.tex0000664002275300236100000002001614017255270017637 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Purpose} \label{c:PA s:I ss:P} The \saclib\ polynomial arithmetic packages provide functions doing computations with multivariate polynomials over domains implemented by the \saclib\ arithmetic packages. Except for the functions listed in Section \ref{c:PA s:MR} and various conversion functions, only the {\em sparse recursive} representation is used. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Definitions of Terms} \label{c:PA s:I ss:D} \begin{description} \item[sparse recursive representation]\index{sparse recursive representation}\index{polynomial!sparse recursive representation} A polynomial $p \in \BbbD[x_1,\ldots,x_r]$ is interpreted as an element of $(\ldots(\BbbD[x_1])\ldots)[x_r]$, for some domain \BbbD. The \saclib\ {\em sparse recursive representation} \ttP\ of a polynomial $p = \sum_{i=1}^n p_i x_r^{e_i}$ with $e_1 > \ldots > e_n$, $p_i \in (\ldots(\BbbD[x_1])\ldots)[x_{r-1}]$, and $p_i \neq 0$ is defined recursively as follows: \begin{itemize} \item If $p = 0$ then \ttP\ is the \BETA-digit 0. \item If $r = 0$, then $p$ is in \BbbD\ and its representation \ttP\ is the representation of elements of the domain \BbbD. \item If $r > 0$, then \ttP\ is the list $(e_1, \ttP_1,\ldots, e_n, \ttP_n)$ where the $e_i$ are \BETA-digits and each $\ttP_i$ is the representation of $p_i$. \end{itemize} \item[sparse distributive representation]\index{sparse distributive representation}\index{polynomial!sparse distributive representation} A polynomial $p \in \BbbD[x_1,\ldots,x_r]$ is interpreted as $p = \sum_{i=1}^n d_i x^{e_i}$, where $d_i \in \BbbD$, $d_i \neq 0$, and $x^{e_i}$ stands for $x_1^{e_{i,1}} x_2^{e_{i,2}} \cdots x_r^{e_{i,r}}$ with $e_{i,j} \geq 0$. % Furthermore, we assume that $e_1 > e_2 > \ldots > e_n$, where $e_k > e_i$ iff there exists a $\hat{\jmath}$ such that $e_{k,j} = e_{i,j}$ for $\hat{\jmath} < j \leq r$ and $e_{k,\hat{\jmath}} > e_{i,\hat{\jmath}}$. The {\em sparse distributive representation} \ttP\ of such a polynomial $p$ is the list $(\ttD_1, \ttE_1, \ttD_2, \ttE_2,\ldots, \ttD_n, \ttE_n)$, where $\ttD_i$ is the \saclib\ internal representation of $d_i$ and $\ttE_i$ is the list $(e_{i,r}, e_{i,r-1},\ldots, e_{i,1})$ with $e_{i,j}$ being \BETA-digits. As always in \saclib, $\ttP = 0$ if $p = 0$. \item[dense recursive representation]\index{dense recursive representation}\index{polynomial!dense recursive representation} A polynomial $p \in \BbbD[x_1,\ldots,x_r]$ is interpreted as an element of $(\ldots(\BbbD[x_1])\ldots)[x_r]$, for some domain \BbbD. The {\em dense recursive representation} \ttP\ of a polynomial $p = \sum_{i=0}^n p_i x_r^i$ with $p_i \in (\ldots(\BbbD[x_1])\ldots)[x_{r-1}]$ is defined recursively as follows: \begin{itemize} \item If $p = 0$ then \ttP\ is the \BETA-digit 0. \item If $r = 0$, then $p$ is in \BbbD\ and its representation \ttP\ is the representation of elements of the domain \BbbD. \item If $r > 0$, then \ttP\ is the list $(n, \ttP_n, \ttP_{n-1},\ldots, \ttP_0)$ where the $n$ is a \BETA-digit and each $\ttP_i$ is the representation of $p_i$. \end{itemize} \item[polynomial]\index{polynomial} If this term appears in the parameter specifications of a function, this denotes a polynomial in the sparse recursive representation. Otherwise, it is used to denote a polynomial in arbitrary representation. \item[base domain, base ring]\index{base domain}\index{base ring} If $p$ is an element of $\BbbD[x_1,\ldots,x_r]$, \BbbD\ is its base domain. \item[integral polynomial]\index{integral polynomial}\index{polynomial!integral} A polynomial whose base domain is \BbbZ. \item[modular polynomial]\index{modular!polynomial}\index{polynomial!modular} A polynomial whose base domain is $\BbbZ_m$ with $m$ a prime positive \BETA-digit. \item[modular integral polynomial]\index{modular!integral polynomial}\index{polynomial!modular integral} A polynomial whose base domain is $\BbbZ_m$ with $m$ a positive integer. \item[rational polynomial]\index{rational!polynomial}\index{polynomial!rational} A polynomial whose base domain is \BbbQ. \item[main variable]\index{main variable}\index{variable!main} of a polynomial in $\BbbD[x_1,\ldots,x_r]$ is $x_r$. \item[degree]\index{degree} The degree of a polynomial w.r.t.\ a given variable is the highest power of this variable appearing with non-zero coefficient in the polynomial. If no variable is specified, the degree is computed w.r.t.\ the main variable. \item[order]\index{order!of a polynomial} The order of a polynomial $p = \sum_{i=0}^n p_i x_r^i$ is the smallest $k \geq 0$ such that $p_k \neq 0$. \item[constant polynomial]\index{constant polynomial}\index{polynomial!constant} A polynomial of degree 0 in every variable. \item[leading term]\index{leading term}\index{term!leading} of a polynomial is a polynomial equal to the term of highest degree w.r.t.\ the main variable. \item[reductum]\index{reductum!of a polynomial} of a polynomial is the polynomial minus its leading term. \item[leading coefficient]\index{leading coefficient}\index{coefficient!leading} The leading coefficient of a polynomial is the coefficient of its leading term. \item[leading base coefficient]\index{leading base coefficient}\index{coefficient!leading base} An element of the base domain equal to the coefficient of the leading power product of a polynomial where the ordering on the power products is the lexicographic ordering with $x_1 < \cdots < x_r$. \item[trailing base coefficient]\index{trailing base coefficient}\index{coefficient!trailing base} An element of the base domain equal to the coefficient of the smallest power product of a polynomial where the ordering on the power products is the lexicographic ordering with $x_1 < \cdots < x_r$. \item[monic polynomial]\index{monic polynomial}\index{polynomial!monic} A polynomial, the leading coefficient of which is $1$. \item[positive polynomial]\index{positive polynomial}\index{polynomial!positive} A polynomial, the leading base coefficient of which is positive. \item[sign]\index{sign!of a polynomial} An integer equal to $1$ if the leading base coefficient of the polynomial is positive, $-1$ otherwise. \item[absolute value]\index{absolute value!of a polynomial} of a polynomial $p$ is the positive polynomial $q$ such that $p = \sign(p) \cdot q$. \item[content]\index{content} of a polynomial $p$ is equal to the absolute value of the greatest common divisor of the coefficients of $p$. \item[integer content]\index{integer content}\index{content!integer} of an integral polynomial is an integer equal to the positive greatest common divisor of the integer coefficients of each power product of the polynomial. \item[primitive polynomial]\index{primitive polynomial}\index{polynomial!primitive} A polynomial, the content of which is $1$. \item[squarefree polynomial]\index{squarefree!polynomial}\index{polynomial!squarefree} A polynomial $p$ is squarefree if each factor occurs only once. In other words, if $p = p_1^{e_1} \cdots p_k^{e_k}$ is a complete factorization of $p$ then each of the $e_i$ is equal to $1$. \item[squarefree factorization]\index{squarefree!factorization}\index{factorization!squarefree} The squarefree factorization of $p$ is $p_1^{e_1} \cdots p_k^{e_k}$ where $1 \leq e_1 < \cdots < e_k$ and each of the $p_i$ is a positive squarefree polynomial of positive degree. Note that if $p$ is squarefree then $p^1$ is the squarefree factorization of $p$. \item[variable (name)]\index{variable!name}\index{name!of a variable}\index{list!of characters} A list $(c_1, \ldots, c_k)$, where the $c_i$ are C characters. Example: the name "fubar" would be represented by the character list ('f','u','b','a','r'). \item[list of variables]\index{list!of variables}\index{variable!list of} A list $(n_1, \ldots, n_r)$ giving the names of the corresponding variables of an $r$-variate polynomial for input and output. \end{description} saclib2.2.8/sysdep/doc/user_guide/cPAsIPA.tex0000664002275300236100000002347214017255270020071 0ustar wcbrownscs\begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- IPSUM(r,A,B) }]\index{IPSUM} Integral polynomial sum. \item[{\tt C <- IPDIF(r,A,B) }]\index{IPDIF} Integral polynomial difference. \item[{\tt B <- IPNEG(r,A) }]\index{IPNEG} Integral polynomial negative. \item[{\tt C <- IPPROD(r,A,B) }]\index{IPPROD} Integral polynomial product. \item[{\tt C <- IPIP(r,a,B) }]\index{IPIP} Integral polynomial integer product. {\em Computes $c * p$ given an integer $c$ and an integral polynomial $p$.} \item[{\tt C <- IPP2P(r,B,m) }]\index{IPP2P} Integral polynomial power of 2 product. \item[{\tt IPQR(r,A,B; Q,R) }]\index{IPQR} Integral polynomial quotient and remainder. \item[{\tt C <- IPQ(r,A,B) }]\index{IPQ} Integral polynomial quotient. \item[{\tt C <- IPIQ(r,A,b) }]\index{IPIQ} Integral polynomial integer quotient. {\em Computes $p/c$ given an integral polynomial $p$ and an integer $c$.} \item[{\tt C <- IPPSR(r,A,B) }]\index{IPPSR} Integral polynomial pseudo-remainder. \item[{\tt IUPSR(A,B; ab,bb,C) }]\index{IUPSR} Integral univariate polynomial semi-remainder. \item[{\tt B <- IPEXP(r,A,n) }]\index{IPEXP} Integral polynomial exponentiation. \item[{\tt s <- IPSIGN(r,A) }]\index{IPSIGN} Integral polynomial sign. \item[{\tt B <- IPABS(r,A) }]\index{IPABS} Integral polynomial absolute value. \end{description} \item[Differentiation and Integration:] \ \ \begin{description} \item[{\tt B <- IPDMV(r,A) }]\index{IPDMV} Integral polynomial derivative, main variable. \item[{\tt B <- IPDER(r,A,i) }]\index{IPDER} Integral polynomial derivative. {\em Computes the derivative of the argument w.r.t.\ the i-th variable.} \item[{\tt B <- IPHDMV(r,A,k) }]\index{IPHDMV} Integral polynomial higher derivative, main variable. {\em Computes the k-th derivative of the argument w.r.t.\ the main variable.} \item[{\tt B <- IPINT(r,A,b) }]\index{IPINT} Integral polynomial integration. {\em Computes the integral of the argument w.r.t.\ the main variable.} \end{description} \item[Substitution and Evaluation:] \ \ \begin{description} \item[{\tt C <- IPSMV(r,A,B) }]\index{IPSMV} Integral polynomial substitution for main variable. {\em Substitutes an integral polynomial for the main variable of an integral polynomial.} \item[{\tt C <- IPSUB(r,A,i,B) }]\index{IPSUB} Integral polynomial substitution. {\em Substitutes an integral polynomial for the i-th variable of an integral polynomial.} \item[{\tt C <- IPGSUB(r,A,s,L) }]\index{IPGSUB} Integral polynomial general substitution. {\em Substitutes an integral polynomials for all variables of an integral polynomial.} \item[{\tt B <- IUPQS(A) }]\index{IUPQS} Integral univariate polynomial quotient substitution. \item[{\tt B <- IPEMV(r,A,a) }]\index{IPEMV} Integral polynomial evaluation of main variable. {\em Substitutes a constant for the main variable of an integral polynomial.} \item[{\tt B <- IPEVAL(r,A,i,a) }]\index{IPEVAL} Integral polynomial evaluation. {\em Substitutes a constant for the i-th variable of an integral polynomial.} \item[{\tt b <- IUPBEI(A,c,m) }]\index{IUPBEI} Integral univariate polynomial binary rational evaluation, integer output. \item[{\tt s <- IUPBES(A,a) }]\index{IUPBES} Integral univariate polynomial binary rational evaluation of sign. \item[{\tt b <- IUPBRE(A,a) }]\index{IUPBRE} Integral univariate polynomial binary rational evaluation. \item[{\tt B <- IPBEILV(r,A,c,k,m) }]\index{IPBEILV} Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[{\tt B <- IPBREI(r,A,i,c) }]\index{IPBREI} Integral polynomial binary rational evaluation, integral polynomial result. \end{description} \item[Transformation:] \ \ \begin{description} \item[{\tt B <- IPTRMV(r,A,h) }]\index{IPTRMV} Integral polynomial translation, main variable. {\em Computes $p(x+h)$ given $p$ and $h$, where $x$ is the main variable of $p$.} \item[{\tt B <- IPTRAN(r,A,T) }]\index{IPTRAN} Integral polynomial translation. {\em Computes $p(x_1+t_1,\ldots,x_r+t_r)$ given $p$ and the $t_i$.} \item[{\tt B <- IPBHT(r,A,i,k) }]\index{IPBHT} Integral polynomial binary homothetic transformation. \item[{\tt B <- IPBHTLV(r,A,k) }]\index{IPBHTLV} Integral polynomial binary homothetic transformation, leading variable. \item[{\tt B <- IPBHTMV(r,A,k) }]\index{IPBHTMV} Integral polynomial binary homothetic transformation, main variable. \item[{\tt B <- IUPBHT(A,k) }]\index{IUPBHT} Integral univariate polynomial binary homothetic transformation. \item[{\tt B <- IUPIHT(A,n) }]\index{IUPIHT} Integral univariate polynomial integer homothetic transformation. \item[{\tt B <- IPNT(r,A,i) }]\index{IPNT} Integral polynomial negative transformation. \item[{\tt B <- IUPNT(A) }]\index{IUPNT} Integral univariate polynomial negative transformation. \item[{\tt B <- IPTR(r,A,i,h) }]\index{IPTR} Integral polynomial translation, specified variable. \item[{\tt B <- IUPTR(A,h) }]\index{IUPTR} Integral univariate polynomial translation. \item[{\tt B <- IPTR1(r,A,i) }]\index{IPTR1} Integral polynomial translation by 1, specified variable. specified variable. \item[{\tt B <- IPTRLV(r,A) }]\index{IPTRLV} Integral polynomial translation, leading variable. \item[{\tt B <- IPTR1LV(r,A) }]\index{IPTR1LV} Integral polynomial translation by 1, leading variable. \item[{\tt B <- IUPTR1(A) }]\index{IUPTR1} Integral univariate polynomial translation by 1. \end{description} \item[Predicates:] \ \ \begin{description} \item[{\tt t <- IPCONST(r,A) }]\index{IPCONST} Integral polynomial constant. {\em Tests whether the argument is a constant.} \item[{\tt t <- IPONE(r,A) }]\index{IPONE} Integral polynomial one. {\em Tests whether the argument is 1.} \end{description} \item[Random Polynomial Generation:] \ \ \begin{description} \item[{\tt A <- IPRAN(r,k,q,N) }]\index{IPRAN} Integral polynomial, random. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt IPSRP(r,A; a,Ab) }]\index{IPSRP} Integral polynomial similiar to rational polynomial. {\em Given a rational polynomial $q$, computes a rational number $c$ and an integral polynomial $p$ with $c p = q$.} \item[{\tt B <- IPFRP(r,A) }]\index{IPFRP} Integral polynomial from rational polynomial. {\em Computes an integral polynomial from a rational polynomial whose base coefficients are integers.} \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt IPREAD(; r,A) }]\index{IPREAD} Integral polynomial read. \item[{\tt IPEXPREAD(r,V; A,t) }]\index{IPEXPREAD} Integral polynomial expression read. \item[{\tt IPWRITE(r,A,V) }]\index{IPWRITE} Integral polynomial write. \item[{\tt IPDWRITE(r,A,V) }]\index{IPDWRITE} Integral Polynomial Distributive Write. {\em Writes an integral recursive polynomial in distributive form.} \end{description} \item[Contents and Primitive Parts:] \ \ \begin{description} \item[{\tt IPICPP(r,A; a,Ab) }]\index{IPICPP} Integral polynomial integer content and primitive part. \item[{\tt c <- IPIC(r,A) }]\index{IPIC} Integral polynomial integer content. \item[{\tt Ab <- IPIPP(r,A) }]\index{IPIPP} Integral polynomial integer primitive part. \item[{\tt d <- IPICS(r,A,c) }]\index{IPICS} Integral polynomial integer content subroutine. \item[{\tt IPSCPP(r,A; s,C,Ab) }]\index{IPSCPP} Integral polynomial sign, content, and primitive part. {\em Computes the sign, content and primitive part of the argument w.r.t.\ the main variable.} \item[{\tt IPCPP(r,A; C,Ab) }]\index{IPCPP} Integral polynomial content and primitive part. \item[{\tt C <- IPC(r,A) }]\index{IPC} Integral polynomial content. \item[{\tt Ab <- IPPP(r,A) }]\index{IPPP} Integral polynomial primitive part. \item[{\tt IPLCPP(r,A; C,P) }]\index{IPLCPP} Integral polynomial list of contents and primitive parts. \end{description} \item[Polynomial Norms:] \ \ \begin{description} \item[{\tt b <- IPSUMN(r,A) }]\index{IPSUMN} Integral polynomial sum norm. \item[{\tt b <- IPMAXN(r,A) }]\index{IPMAXN} Integral polynomial maximum norm. \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt As <- IPCRA(M,m,mp,r,A,a) }]\index{IPCRA} Integral polynomial chinese remainder algorithm. \end{description} \item[Squarefree Factorization:] \ \ \begin{description} \item[{\tt L <- IPSF(r,A) }]\index{IPSF} Integral polynomial squarefree factorization. \item[{\tt L <- IPFSD(r,A) }]\index{IPFSD} Integral polynomial factorization, second derivative. \item[{\tt L <- IPSFSD(r,A) }]\index{IPSFSD} Integral squarefree factorization, second derivative. \end{description} \item[Computations in Ideals:] \ \ \begin{description} \item[{\tt B <- IPTRUN(r,D,A) }]\index{IPTRUN} Integral polynomial truncation. {\em Computes $p \mod (x_1^{d_1},\ldots,x_r^{d_r})$ given $p$ and the $d_i$.} \item[{\tt C <- IPTPR(r,D,A,B) }]\index{IPTPR} Integral polynomial truncated product. {\em Computes $p q \mod \\(x_1^{d_1},\ldots,x_r^{d_r})$ given $p, q$, and the $d_i$.} \item[{\tt B <- IPIHOM(r,D,A) }]\index{IPIHOM} Integral polynomial mod ideal homomorphism. {\em Computes $p \mod \\(x_1^{d_1},\ldots,x_{r-1}^{d_{r-1}})$ given an r-variate polynomial $p$ and the $d_i$.} \item[{\tt C <- IPIPR(r,D,A,B) }]\index{IPIPR} Integral polynomial mod ideal product. {\em Computes $p q \mod \\(x_1^{d_1},\ldots,x_{r-1}^{d_{r-1}})$ given r-variate polynomials $p$ and $q$ and the $d_i$.} \item[{\tt C <- IUPTPR(n,A,B) }]\index{IUPTPR} Integral univariate polynomial truncated product. {\em Computes $p q \mod x^n$ given univariate polynomials $p$ and $q$ and a \BETA-digit $n$.} \end{description} \end{description} saclib2.2.8/sysdep/doc/user_guide/Makefile0000664002275300236100000000206314017255270017620 0ustar wcbrownscs# # FILE # Makefile for SACLIB User's Guide. # SACSRC = \ saclib.tex\ cAN.tex\ cAsI.tex\ cAsIA.tex\ cAsMA.tex\ cAsRA.tex\ cCFC.tex\ cGCD.tex\ cI.tex\ cISAC.tex\ cLA.tex\ cLP.tex\ cNIWsCGV.tex\ cNIWsGC.tex\ cPAsDIPA.tex\ cPAsI.tex\ cPAsIPA.tex\ cPAsMPA.tex\ cPAsMR.tex\ cPAsPIO.tex\ cPAsRPA.tex\ cPF.tex\ cRRC.tex\ fLIST.tex\ fSPACE.tex # Files to be made. guide: ../saclib.dvi ../saclocal.dvi kwic: ../sackwic.dvi all: guide kwic # The User's guide. ../saclib.dvi: $(SACSRC) saclib.sty saclib.ind latex saclib.tex latex saclib.tex mv saclib.dvi ../saclib.dvi # The local guide. ../saclocal.dvi: saclocal.tex saclib.sty latex saclocal.tex latex saclocal.tex mv saclocal.dvi ../saclocal.dvi # The KWIC index. ../sackwic.dvi: sackwic.tex KWIC.tex saclib.sty latex sackwic.tex mv sackwic.dvi ../sackwic.dvi KWIC.tex: ${saclib}/bin/mktexkwic # The index file. # Requires 'makeindex'. saclib.ind: $(SACSRC) saclib.sty latex saclib.tex latex saclib.tex makeindex saclib.idx # Cleanup. clean: rm *.err *.log *.dvi *.aux *.toc *.lof *.lot *.idx cor[e] saclib2.2.8/sysdep/doc/saclib.dvi0000664002275300236100000101075414017255270015775 0ustar wcbrownscs; TeX output 1998.07.08:1344CPWx>DtGGcmr17SAqCLIB1.17tUser'sGuide0XQ cmr121]jo cmr9cˤ cmsy9 1993Tb9yKurtG`odelInstitute,'`BrunoBucrhbSerger 2GeorgeE.CollinseMarkJ.Encarnaci on;[HoSonHong,JeremryR.Johnson WVernerKrandicrk3+RSvudigerLoosȬAnaM.MandacrheAndreasNeubacrherHerbSertVielhaberWMarcrh12,1993N-=Aacmr61TRISC{Linz"RepAortSeriesT:ec9hnicalReportNum9ber93-19(Researc9hInstituteforSymbAolic 9Computation,TJohannesKeplerUniv9ersity:,TA-4040Linz,Austria)*CyXK`y cmr10SACLIBgandshowshowtocallthem 9fromC.ThereisalsoabriefexplanationoftheinnerworkingsofthelistproGcessingand9garbageUUcollectionfacilitiesofSACLIB(G!. 'C9cNH cmbx12cCon8tents>919In9troQduction71 91.149WhatUUisSACLIB(G!?%................................191.249AbGoutUUthisGuide߁.................................291.349SACLIB\Maintenance*..............................2929ListTProQcessing*492.149MathematicalUUPreliminaries?N...........................492.249PurpGoseFȍ......................................492.349De nitionsUUofT*ermsTȍ...............................492.449F*unctions#1.....................................5939Arithmetic@1993.149IntroGduction....................................9493.1.1T9PurpGosec..................................9493.1.2T9De nitionsUUofT*ermsq...........................993.249IntegerUUArithmetic{................................1093.349MoGdularUUNumberArithmetic[..........................13493.3.1T9MoGdularUUDigitArithmetic"ō........................13493.3.2T9MoGdularUUIntegerArithmeticiۍ.......................1393.449RationalUUNumbGerArithmetic?F..........................14949P9olynomialTArithmeticZ1594.149IntroGduction....................................15494.1.1T9PurpGosec..................................15494.1.2T9De nitionsUUofT*ermsq...........................1594.249PolynomialUUInputandOutput..........................17494.2.1T9RecursiveUUpGolynomialsoverZ􍍑......................17494.2.2T9RecursiveUUpGolynomialsoverQT......................18494.2.3T9DistributiveUUpGolynomialsoverZp荍.....................19494.2.4T9DistributiveUUpGolynomialsoverQ....................19494.2.5T9ConversionUUBetweenRecursiveandDistributiveT9Representationm..............................19494.2.6T9PolynomialsUUoverZ 0ercmmi7m...........................1994.349DomainUUIndepGendentPolynomialArithmeticM8..................2094.449IntegralUUPolynomialArithmetic<.........................2194.549MoGdularUUPolynomialArithmetici䍍.........................2494.649RationalUUPolynomialArithmeticMs.........................2694.749MiscellaneousUURepresentationsJ..........................26494.7.1T9SparseUUDistributiveRepresentationJ...................26494.7.2T9DenseUURecursiveRepresentation捍....................27^i C959LinearTAlgebra&28 95.149MathematicalUUPreliminaries?N...........................2895.249PurpGoseFȍ......................................2895.349MethoGdsUUandAlgorithmsxA.............................2895.449F*unctions#1.....................................29969P9olynomialTGCDandResultants3196.149MathematicalUUPreliminaries?N...........................3196.249PurpGoseFȍ......................................3296.349De nitionsUUofT*ermsTȍ...............................3296.449MethoGdsUUandAlgorithmsxA.............................33496.4.1T9GCDUUComputations...........................33496.4.2T9Resultantsۍ.................................3396.549F*unctions#1.....................................34979P9olynomialTF actorization{3797.149MathematicalUUPreliminaries?N...........................3797.249PurpGoseFȍ......................................3797.349MethoGdsUUandAlgorithmsxA.............................3797.449F*unctions#1.....................................38989RealTRoQotCalculationZ4098.149MathematicalUUPreliminaries?N...........................4098.249PurpGoseFȍ......................................4098.349MethoGdsUUandAlgorithmsxA.............................4098.449De nitionsUUofT*ermsTȍ...............................4198.549F*unctions#1.....................................41999AlgebraicTNum9bQerArithmeticz4499.149MathematicalUUPreliminaries?N...........................4499.249PurpGoseFȍ......................................4499.349MethoGdsUUandAlgorithmsxA.............................4499.449De nitionsUUofT*ermsTȍ...............................4699.549Representationc..................................4699.649F*unctions#1.....................................479A9CallingTSACLIB,tF unctionsTfromCE519A.149AUUSampleProgram................................519A.249DynamicUUMemoryAlloGcationinSACLIB)F2....................519A.349DeclaringUUGlobalV*ariablestoSACLIB*.....................549A.449InitializingUUSACLIB+vbyUUHand ~..........................559A.549SACLIB\ErrorUUHandling퍍.............................559A.649Compilingڍ.....................................569B9ISAC4h:pAnTIn9teractiveInterfacetoSACLIB%{579B.149WhatUUisISAC?qS..................................579B.249SuppGortedUUSACLIB+vAlgorithmsFX.........................579B.349CommandUULineOptions.............................579B.449InterfaceUUF*unctionality..............................579B.549InterfaceUUGrammar................................58zii7C9C9NotesTontheIn9ternalW orkingsofSACLIBd61 9C.149Lists,UUGCAHandles,andGarbageCollection⍍.................6149C.1.1T9ImplementationUUofListsx$.........................6149C.1.2T9ImplementationUUofGCAHandles{....................6249C.1.3T9TheUUGarbageCollector..........................629C.249ConstantsUUandGlobalV*ariables͍.........................639IndexdV66AiiinC9cList T{ofFigures49A.149AUUsampleprogram.\................................52 9A.249SampleUUcoGdeusingGCAhandles.p........................539A.349DeclaringUUglobalvqariables.M............................549A.449SampleUUcoGdeforinitializingSACLIBbyhand..................569C.149TheUU$ cmmi10;(9;6);8).ML.................61:ivtC9iNq cmbx12iChapter 129cIn8tro duction:9AnaMandache,QAndreasNeubacherandHoGonHongalltoiledlonghoursediting9and_reformattingprograms.AndreasdeservesspGecialrecognition.Heinitiatedthewriting9ofthemanual,/wrotethreechaptersofthemanualandtwooftheappGendices,/anddidall9theqYrequiredsystemmaintenance.T*ofacilitateexpGerimentingwiththefunctionsinthe9library*,,HerbGertVielhaberimplementedISAC&,,theinteractiveshellforSACLIB(~.vHealso9wroteUUthecorrespGondingappendixofthemanual.9Besides$theabGove$itwouldbeunthinkqablenottomention,.collectively*,all$ofmyformer9doGctoralTLstudents, whocontributedtothedevelopmentoftheSAC2algorithmsandthe9research>onwhichtheywerefoundedoverapGeriod>of26years.jCDuringthelast20ofthose9yearsRGudigerLooswasafrequentcollabGorator.Heproposedcreationofan"ALgorithm9DEScription[?language"forSAC1,DthepredecessorofSAC2,DandwroteanALDES-to-F*ortran9translator.9ThisoinitialversionofSACLIBoisjustthebGeginningofwhatistocome.sW*eknowhow9toRimproveseveraloftheprogramsinthecurrentsystemandwewilldoitforsubsequent9versions.Some5basicfunctionalitiesarelargelyundevelopGedinthecurrrentsystem(e.g.1|C9linearalgebra)buttheywillbGesuppliedinsubsequentversions.Somemoreadvqanced 9functionalitiesT(e.g.qpGolynomialcomplexrootsandquanti erelimination)arenearlyready9and<#willbGeforthcomingsoon.iaAlsoweexpectthatusersofthesystemwillwriteprograms9basedUUontheoneswedistributeando erthemtootherusers.MTGeorgeUUE.Collins!č91.23 VAbs3outffthisGuide9Theʈmaingoalinwritingthisguidewastoenablethereadertoquicklydiscoverwhether9SACLIB5yprovidesMafunctionforagivenproblem.ThestructureofthepapGershouldfacilitate9searchingUUforafunctioninthefollowingway:9'9EveryZchapterdealswithfunctionsopGeratingoveracertaindomain(lists,[numbGers,'9pGolynomials,etc.)or~Dwithfunctionssolvingcertainproblems(GCD}computation,'9factorization,UUrealroGotcalculation,etc.).9'9SomechaptersaresplitintosectionscoveringmorespGeci ctopics(integerarithmetic,'9rationalUUnumbGerarithmetic,integralpGolynomialarithmetic,etc.)9'9Insideasection,functionsaredividedintovqariousareas(basicarithmetic,predicates,'9input/output,UUetc.).9'9InsideUtheseareas,bUcloselyrelatedfunctions(afunctionanditsinverse,functions'9solvingessentiallythesameproblem,afunctionanditsauxiliaryroutines,etc.)`qare'9groupGed.9Thispartitioningwasdoneonacompletelysub8jectivebasis. 8Theintentionalways9wasthattheneophyteusershouldbGeabletopinpointadesiredfunctionbyusingsimple9heuristics.ThisCapproachmaycertainlyfailinsomecases,?butwithatmost50functions9pGersectionbrowsingthemsequentiallyshouldalwayssucceedinanacceptableamountof9time.9Anotherrathersub8jectivelydesignedfeatureisthefunctiondescriptions.QAThelistswere9generatedautomaticallyfromtheheadersoftheSACLIB,3source les.SF*orsomefunctions9additionalUUremarkswereaddedin!': cmti10emphasize}'dtypGestyle.9Readers.whowant.touseSACLIB+MfunctionsintheirC.programsshouldreadAppGendix9A,rwhich:describGeshowinitializationandcleanuparedone,rwhich leshavetobGe#included,9etc.A!detailed!descriptionoftheinput/outputspGeci cationsofagivenfunctioncanbe9found inthecommentbloGckatthebGeginningofthecorrespondingsource le.gReadthe9\AddendumUUtotheSACLIB+vUser'sGuide"forinformationonhowtoaccessthese.9ThoseVwhowantVtoknowmoreabGouttheinnerworkingsofSACLIB-shouldreferto9AppGendixo6Cwhichgivesanoverviewoftheinternalrepresentationoflists,thegarbage9collector94andtheconstantsandglobalvqariablesusedinternally*.Descriptionsofthehighlevel9datastructuresusedforimplementingtheelementsofdomainslikeintegers,8pGolynomials,9etc.UUcanbGefoundatthebeginningsofthecorrespondingsections.!č91.33 VSACLIBl8Maintenance9The recommendedway forrepGortingproblemswithSACLIB+ 2issendinge-mailtothemain-9tenanceUUaccount'9saclib@risc.uni-linz.ac.at9orUUmailto2C9SACLIB?Maintenance 9Research?InstituteforSymbolicComputation9Johannes?KeplerUniversity94020?Linz9Austria9MessagesUUwhichmightinterestagreateraudienceshouldbGesenttothemailinglist'9saclib-l@risc.uni-linz.ac.at9ThisUUlistcanbGesubscribedbysendingamessagewiththebody'9subscribGeUUsaclib-l< rstname>9toUUlistserv@risc.uni-linz.ac.at. 9NotenthatSACLIB+isnotsoldforpro t^ٓRcmr71|s.ThereforedonotexpGectpromptserviceand9extensivesuppGort.SnNevertheless,ZSACLIB,Eiscontinuouslymaintainedandextended,Zsodo9notUUhesitategettingincontactwithus.97ffl) J= "5-:1L|{Ycmr8SAÎCLIB1mainÎtenanceXisspAnUUintegerasuchthatBETA <aAUUtermdenotingbGothatomsandlists.9compQositionO8ofUUanob8jectlandalist(l1|s;l2;:::;lnq~)UUisthelist(l2`;l1|s;l2;:::;lnq~).9reductumCof+alist(l1|s;l2;:::;lnq~)+isthelist(l2|s;l3;:::;lnq~).cThe+reductumoftheemptylist '9isUUunde ned.9concatenationXofUUlists(l1|s;l2;:::;lnq~)UUand(m1|s;m2;:::;mk됲)UUisthelist(l1|s;:::;'9lnq~;m1|s;:::;mk됲).9in9verse6 ѲofUUalist(l1|s;l2;:::;lnq~)UUisthelist(ln;ln O!cmsy71;:::;l1|s).9length2ofUUalist(l1|s;l2;:::;lnq~)UUisn.qThelengthoftheemptylistis0.9exten9t2TheUUnumbGerofcellsusedbyanob8ject.qMoreprecisely:39=9EXTENT\(a)=0UUifaisanatom.39=9EXTENT\(NIL)=0.39=9EXTENT\(L)=1 +EXTENT (l1|s)+EXTENT((l2|s;:::;lnq~)),;where4Listhenon-emptylist=9(l1|s;l2;:::;lnq~).9order.TheUUdepthofanob8ject.qMoreprecisely:39=9ORDERWy(a)=0UUifaisanatom.39=9ORDERWy(NIL)=1.39=9ORDERWy(L)Q=MAX(ORDER?(l1|s)֪+1;ORDER꙲((l2;:::;lnq~))),}0whereBListhenon-empty=9listUU(l1|s;l2;:::;lnq~).9sideTe ectsIѲWhen afunctionmoGdi esthecontent ofoneormorecellsoftheinputlist(s),'9itUUissaidtocausesidee e}'cts.qThisisalwaysUUnotedinthefunctionspGeci cations.9destructiv9eJXAnUUopGerationonlistscausingsidee ectsiscalleddestructive.9(unordered)Tseta5AnUU(unordered)listofatoms.!č92.43 VFfunctions9Constructors:'9M?<-COMP(a,L)zȲCompGosition.qPr}'e xesanobjecttoalist.'9M?<-COMP2(a,b,L)CompGositionUU2.qPr}'e xes2objectstoalist.'9M?<-COMP3(a1,a2,a3,L)CompGositionUU3.qPr}'e xes3objectstoalist.'9M?<-COMP4(a1,a2,a3,a4,L)CompGositionUU4.qPr}'e xes4objectstoalist.'9L?<-LIST1(a)u˲List,UU1element.qBuildsalistfr}'omoneobject.'9L?<-LIST2(a,b)9ŲList,UU2elements.qBuildsalistfr}'om2objects.'9L?<-LIST3(a1,a2,a3)yList,UU3elements.qBuildsalistfr}'om3objects.'9L?<-LIST4(a1,a2,a3,a4)9List,UU4elements.qBuildsalistfr}'om4objects.'9L?<-LIST5(a1,a2,a3,a4,a5)List,UU5elements.qBuildsalistfr}'om5objects.'9L?<-LIST10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)9qList,10elements.6Builds/alist=9fr}'om10objects.9Selectors:'9ADV(L;?a,Lp)pyβAdvqance.qR}'eturnsthe rstelementandthereductumofalist.5C'9ADV2(L;?a,b,Lp)9ŲAdvqanceh2.[xR}'eturnsVUthe rst2elementsandthe2ndreductumof =9alist.'9ADV3(L;?a1,a2,a3,Lp)yAdvqance D3.`R}'eturnscthe rst3elementsandthe3rdreduc-=9tumofalist.'9ADV4(L;?a1,a2,a3,a4,Lp)9Advqance4.#R}'eturnsthe rst4elementsandthe4th=9r}'eductumofalist.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.'9a?<-FIRST(L)u˲First.qR}'eturnsthe rstelementofalist.'9FIRST2(L;?a,b)zȲFirstUU2.qR}'eturnsthe rst2elementsofalist.'9FIRST3(L;?a1,a2,a3)9FirstUU3.qR}'eturnsthe rst3elementsofalist.'9FIRST4(L;?a1,a2,a3,a4)FirstUU4.qR}'eturnsthe rst4elementsofalist.'9a?<-SECOND(L)zȲSecond.qR}'eturnsthe2ndelementofalist.'9a?<-THIRD(L)u˲Third.qR}'eturnsthe3rdelementofalist.'9a?<-FOURTH(L)zȲF*ourth.qR}'eturnsthe4thelementofalist.'9Lp?<-LASTCELL(L)LastUUcell.qR}'eturnsthelisthandleofthelastcellofalist.'9a?<-LELTI(A,i)9ŲListUUelement.qR}'eturnsthei-thelementofalist.'9Lp?<-RED(L)pyβReductum.qR}'eturnsthereductumofalist.'9Lp?<-RED2(L)u˲ReductumUU2.qR}'eturnsthe2ndreductumofalist.'9M?<-RED3(L)pyβReductumUU3.qR}'eturnsthe3rdreductumofalist.'9M?<-RED4(L)pyβReductumUU4.qR}'eturnsthe4threductumofalist.'9B?<-REDI(A,i)zȲReductum.qR}'eturnsthei-threductumofalist.9InformationTandPredicates:'9t?<-ISOBJECT(a)y²T*estW\forob8ject.T;estsAwhetherthear}'gumentrepresentsanobject.'9t?<-ISATOM(a)zȲT*estUUforatom.qT;estswhetherthear}'gumentrepresentsanatom.'9t?<-ISLIST(a)zȲT*estUUforlist.qT;estswhetherthear}'gumentrepresentsalist.'9t?<-ISNIL(L)u˲T*estAforemptylist.T;estswhetherthear}'gumentrepresentstheempty =9list.'9t?<-EQUAL(a,b)9ŲEqual.qT;estswhethertwoobje}'ctsareequal.'9t?<-MEMBER(a,L)y²MembGershipXtest.{uT;estsdwhetheranobje}'ctisanelementofa=9list.'9i?<-LSRCH(a,A)9ŲListUUsearch.qR}'eturnstheindexofanobjectinalist.'9n?<-EXTENT(a)zȲExtent.'9n?<-LENGTH(L)zȲLength.'9n?<-ORDER(a)u˲Order.9Concatenation:'9L?<-CCONC(L1,L2)ConstructiveUUconcatenation.qBuildsalist(l1|s;:::;lm; =9lm+1;:::;lnq~)fr}'omlists(l1|s;:::;lm)and(lm+1;:::;lnq~).'9L?<-CONC(L1,L2)y²Concatenation.qConc}'atenatestwolistsdestructively.'9M?<-LCONC(L)u˲List?concatenation.(Conc}'atenatestheelementsofalistoflistsde-=9structively.9In9version:6C'9M?<-CINV(L)pyβConstructiveHinverse.Buildsײalistc}'ontainingtheelementsofthe =9ar}'gumentininverseorder.'9M?<-INV(L)k9ѲInverse.qInvertsalistdestructively.9Insertion:'9LINS(a,L)`ײListUUinsertion.qInsertsanobje}'ctafterthe rstelementofalist.'9L?<-LEINST(A,i,a)List|elementinsertion.?Inserts anobje}'ctafterthei-thelement =9ofalist.'9Lp?<-SUFFIX(L,b)Sux.qApp}'endsanobjectafterthelastelementofalist.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.9Com9binatorial:'9M?<-LEROT(L,i,j)Listd:elementrotation.wR}'otatessomeconsecutiveelementsofa =9list.'9Lp?<-LPERM(L,P)y²ListUUpGermute.qPermutestheelementsofalist.'9Pp?<-PERMCY(P)9ŲPermutation,UUcyclic.qR}'otatesalisttotheleft.'9L?<-PERMR(n)u˲Permutation,random.?Builds alistofthe rstninte}'gersinrandom=9or}'der.'9B?<-LEXNEX(A)zȲLexicographicallyzHnext.Computesthelexic}'ographicalsuccessorof=9ap}'ermutation.9SetTOpQerations:'9b?<-SEQUAL(A,B)y²SetVequality*.u_T;estswhethertwosetsr}'epresentedasunor}'dered =9r}'edundantlistsar}'eequal.'9C?<-SDIFF(A,B)9ŲSetUUdi erence.'9B?<-SFCS(A)pyβSetUUfromcharacteristicset.'9C?<-SINTER(A,B)y²SetUUintersection.'9C?<-SUNION(A,B)y²SetUUunion.'9C?<-USDIFF(A,B)y²UnorderedUUsetdi erence.'9C?<-USINT(A,B)9ŲUnorderedUUsetintersection.'9C?<-USUN(A,B)zȲUnorderedUUsetunion.9Sorting:'9M?<-LBIBMS(L)zȲListyofBET*A-integersbubble-mergesort.4Sortsalistofatoms =9intonon-desc}'endingorder.'9LBIBS(L)[yڲList8ofBET*A-integersbubblesort.Sorts8alistofatomsintonon-desc}'ending=9or}'der.'9L?<-LBIM(L1,L2)y²ListUUofBET*A-integersmerge.qMer}'gestwosortedlistsofatoms.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.'9C?<-LMERGE(A,B)y²Listmerge.Constructively@9mer}'gestwolistsavoidingduplicate=9elements.9Input/Output:'9A?<-AREAD()pyβAtomUUread.'9AWRITE(A)`ײAtomUUwrite.'9L?<-LREAD()pyβListUUread.7$C'9LWRITE(L)`ײListUUwrite.'9B?<-OREAD()pyβOb8jectUUread.'9OWRITE(B)`ײOb8jectUUwrite.9Miscellaneous:'9C?<-PAIR(A,B)zȲPair.qBuildsalistbyinterle}'avingtheelementsoftwolists.'9SFIRST(L,a)k9ѲSetUU rstelement.qSetsthe rstelementofalist.'9SLELTI(A,i,a)u˲SetUUlistelement.qSetsthei-thelementofalist.'9SRED(L,Lp)eԲSetUUreductum.qSetsther}'eductumofalist.8 ҦC9iChapter 329cArithmetic:93.13 VIntros3duction95N cmbx123.1.17yPurp`oseuT9TheSACLIB, arithmeticpackqagessuppGortcomputationswithintegers,moGdularnumbGers, 9andUUrationalnumbGersUUwhosesizesareonlyboundedbytheamountofmemoryavqailable.獍93.1.27yDe nitionsofTerms9in9teger5wIntegersUUtobGeenteredintoSACLIB+vmustbGeofthefollowingexternalform.ڠ39=9orڠ39=9+or39=9,'9wherejdesignatesanynon-emptywordoverthealphabGet0;1;:::;9(. '9Note'thatthereisnoblankbGetween'theoptionalsignandthedigitsequence;also'9notethatleadingzerosareallowed.Inputsofthisformareinterpretedintheusual'9wayUUasdecimalnumbGers.mP'9SACLIBOC{outputsthec}'anonical[:externalr}'epresentationofintegers.]>Thisistheinteger'9inUUexternalformwithbGothpositivesignandleadingzerosdigitssupressed.'9TheUUinternalr}'epresentationIofanumbGern2Zisde nedasfollows:ڠ39=9IfUUBETA <norЍ39=9=,'9whereandareexternalformsofrelativelyprimeintegers'9NandzDG,suchthatD5>0.(Notethatnoblanksarepermittedimmediatelybeforeand'9aftersthe=.&InputsofthisformareinterpretedintheusualwayasrationalnumbGers'9withUUnumeratorNlpanddenominatorDG.荍'9SACLIBOoutputsi;thec}'anonical5externalr}'epresentationi;ofrationalnumbGersi;r/^2AQ.xIf'9r52Z,4the,canonicalexternalrepresentationofrsisthecanonicalexternalrepresenta-'9tionHoftheintegerrG.mOtherwisethereareuniqueintegersN_andDsuchthatr5= KNK&fe*]D C/,'9D0T>71,nandigcdi(N;DG)=1.2Theicanonicalexternalrepresentationofrinthiscaseis'9thecanonicalexternalrepresentationoftheintegerNfollowedby=followedbythe'9canonicalUUexternalrepresentationoftheintegerDG.'9TheUUinternalr}'epresentationRofanumbGerr52Qisde nedasfollows:Ѝ39=9IfUUr5=0thenRistheBETA-digit0.Ѝ39=9Otherwise,0,UUandgcdUW(n;d)=1.9ceiling3TofUUanumbGerUUrristhesmallestintegernsuchthatr5n.9 oQor*+ofUUanumbGerUUrristhelargestintegernsuchthatnrG.9pQositiv9e:@nUUispGositiveif0,respectively.'9t?<-IEVEN(A)u˲IntegerUUeven.qT;estswhetherthear}'gumentiseven.'9t?<-IODD(A)pyβIntegerUUoGdd.qT;estswhetherthear}'gumentisodd.9ExpQonen9tiation:'9B?<-IEXP(A,n)zȲIntegerUUexpGonentiation.'9IROOT(A,n;?B,t)9ŲIntegerUUroGot.'9ISQRT(A;?B,t)u˲IntegerUUsquareroGot.'9DSQRTF(a;?b,t)zȲDigitUUsquareroGotfunction.'9IPOWER(A,L;?B,n)y²Integer%pGower.6Ifithear}'gumentcanbeexpressedasb^nq~,*such=9inte}'gersbandnarecomputed.9GreatestTCommonDivisor:'9C?<-IGCD(A,B)zȲIntegerUUgreatestcommondivisor.'9c?<-DGCD(a,b)zȲDigitUUgreatestcommondivisor.'9IGCDCF(A,B;?C,Ab,Bb)yIntegerUUgreatestcommondivisorandcofactors.'9IEGCD(a,b;?c,u1,v1)9IntegerUUextendedgreatestcommondivisoralgorithm.'9DEGCD(a,b;?c,u,v)DigitUUextendedgreatestcommondivisor.'9IDEGCD(a,b;?c,u1,v1,u2,v2)Integerdoublyextendedgreatestcommondivisor=9algorithm.'9IHEGCD(A,B;?C,V)y²IntegerUUhalf-extendedgreatestcommondivisor.'9C?<-ILCM(A,B)zȲIntegerUUleastcommonmultiple.9F actorization:'9F?<-IFACT(n)u˲IntegerUUfactorization.'9s?<-ISPT(m,mp,F)Integer-selfridgeprimalitytest.OR}'eturnsA1iftheargumentis=9prime,-1ifitisnotprime,and0iftheprimalityc}'ouldnotbedetermined.'9ILPDS(n,a,b;?p,np)IntegerUUlargeprimedivisorsearch.'9IMPDS(n,a,b;?p,q)IntegerUUmediumprimedivisorsearch.'9ISPD(n;?F,m)pyβIntegerUUsmallprimedivisors.9PrimeTNum9bQerGeneration:'9L?<-DPGEN(m,k)9ŲDigitUUprimegenerator.9RandomTNum9bQerGeneration:'9A?<-IRAND(n)u˲Integer,UUrandom.'9a?<-DRAN()k9ѲDigit,UUrandom.'9a?<-DRANN()pyβDigit,UUrandomnon-negative.A11 ﮠC9Com9binatorial:|'9A?<-IFACTL(n)zȲIntegerUUfactorial.IH'9A?<-IBCOEF(n,k)y²IntegerUUbinomialcoGecient.qR}'eturns`.: n⍍ mke`I.pd'9B?<-IBCIND(A,n,k)IntegerbinomialcoGecientinduction.PR}'eturns6`5Vpnƍ /kw+81ן`)ygiven =9n,kP,and`.: n⍍ mke`I.ׇ'9A?<-IBCPS(n,k)9ŲIntegerUUbinomialcoGecientpartialsum.qR}'eturnsPލ""k%""i=0A`Z썑#9n0$P1i):`/3{.II9BinaryTArithmetic:'9n?<-ILOG2(A)u˲Integer^logarithm,base2.R}'eturns1+(the oorofthebase2 =9lo}'garithmoftheargument).|'9n?<-DLOG2(a)u˲DigitUUlogarithm,base2.'9IFCL2(a;?m,n)u˲Integer, oGorJandceiling,logarithm,base2.4R}'eturnsϪthe oorand=9thec}'eilingofthebase2logarithmoftheargument.'9B?<-IMP2(A,h)zȲInteger multiplicationbypGowerof2.YXMultipliesPwthear}'gumentbya=9non-ne}'gativepowerof2.'9B?<-IDP2(A,k)zȲIntegerBdivisionbypGowerof2.:gDividesnqthear}'gumentbyanon-=9ne}'gativepowerof2.'9B?<-ITRUNC(A,n)y²IntegerW/truncation.wTDividesthear}'gumentbyapositiveornega-=9tivep}'owerof2.'9n?<-IORD2(a)u˲Integer,orderޒof2. R}'eturns*thelargestnsuchthat2^n dividesthe=9ar}'gument.|9BoQolean:'9c?<-DAND(a,b)zȲDigitUUand.qR}'eturnsthebit-wise^oftwodigits.|'9c?<-DOR(a,b)u˲DigitUUor.qR}'eturnsthebit-wise_oftwodigits.'9b?<-DNOT(a)pyβDigitUUnot.qR}'eturnsthebit-wise:ofadigit.'9c?<-DNIMP(a,b)9ŲDigitnon-implication.8R}'eturnsthebit-wise:(a5)b)ofdigitsa=9andb.|9Input/Output:'9A?<-IREAD()pyβIntegerUUread.|'9IWRITE(A)`ײIntegerUUwrite.'9ILWRITE(L)eԲIntegerUUlistwrite.qWritesalistofinte}'gersintheform=9(n1|s;n2;:::;nk됲)totheoutputstr}'eam.|9AuxiliaryTF unctions:'9C?<-ISSUM(n,L)9ŲInteger shiftedsum.OComputes=Pލk%i=0ٵCiTLBETAT@\pin$ױgiven=nandthe=9CiTL.|'9ISEG(A,n;?A1,A0)y²IntegerHJsegmentation.Splitscaninte}'gerataBETA-digitboundary.'9C?<-IDIPR2(A,B,a,b)yIntegerdigitinnerproGduct, length2.(kComputeskAaY+Bqb=9forinte}'gersA;BXandBETA-digitsa;b.'9C?<-ILCOMB(A,B,u,v)yInteger~linearcombination.N*Computes1Aac3+Bqbforinte}'gers=9A;BXandBETA-digitsa;bwithAa8+Bqb0.'9DPCC(a1,a2;?u,up,v,vp)DigitUUpartialcosequencecalculation.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.A12 `C93.33 VMos3dularffNumberArithmetic93.3.17yMo`dularDigitArithmeticuT9BasicTArithmetic:'9c?<-MDSUM(m,a,b)MoGdularUUdigitsum.'9c?<-MDDIF(m,a,b)MoGdularUUdigitdi erence.'9b?<-MDNEG(m,a)9ŲMoGdularUUdigitnegative.'9c?<-MDPROD(m,a,b)MoGdularUUdigitproduct.'9c?<-MDQ(m,a,b)9ŲMoGdularUUdigitquotient.'9b?<-MDINV(m,a)9ŲMoGdularUUdigitinverse.'9b?<-MDEXP(m,a,n)MoGdularUUdigitexponentiation.9ChineseTRemainderAlgorithm:'9a?<-MDCRA(m1,m2,mp1,a1,a2)9MoGdularUUdigitchineseremainderalgorithm.'9L?<-MDLCRA(m1,m2,L1,L2)yMoGdularUUdigitlistchineseremainderalgorithm.'9b?<-MDHOM(m,A)9ŲMoGdularUUdigithomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9a?<-MDRAN(m)u˲MoGdularUUdigit,random.693.3.27yMo`dularIntegerArithmeticuT9BasicTArithmetic:'9C?<-MISUM(M,A,B)MoGdularUUintegersum.'9C?<-MIDIF(M,A,B)MoGdularUUintegerdi erence.'9B?<-MINEG(M,A)9ŲMoGdularUUintegernegation.'9C?<-MIPROD(M,A,B)MoGdularUUintegerproduct.'9C?<-MIQ(M,A,B)9ŲMoGdularUUintegerquotient.'9B?<-MIINV(M,A)9ŲMoGdularUUintegerinverse.'9B?<-MIEXP(M,A,N)MoGdularUUintegerexponentiation.9ChineseTRemainderAlgorithm:'9As?<-MIDCRA(M,m,mp,A,a)yMoGdularUUintegerdigitchineseremainderalgorithm.'9As?<-MIHOM(M,A)y²MoGdularUUintegerhomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9R?<-MIRAN(M)u˲MoGdularUUinteger,random.9Con9version:'9B?<-SMFMI(M,A)9ŲSymmetric7moGdularfrommodularinteger./Computestheisomor- =9phismfr}'omZm ,tofb m&fe2⍟bQ+81;:::;b m&fe2⍟bqg.A13 C93.43 VRationalffNumbs3erArithmetic9BasicTArithmetic:'9T?<-RNSUM(R,S)9ŲRationalUUnumbGersum.'9T?<-RNDIF(R,S)9ŲRationalUUnumbGerdi erence.'9S?<-RNNEG(R)u˲RationalUUnumbGernegative.'9T?<-RNPROD(R,S)y²RationalUUnumbGerproduct.'9T?<-RNQ(R,S)u˲RationalUUnumbGerquotient.'9S?<-RNINV(R)u˲RationalUUnumbGerinverse.'9s?<-RNSIGN(R)zȲRationalUUnumbGersign.'9S?<-RNABS(R)u˲RationalUUnumbGerabsolutevqalue.'9t?<-RNCOMP(R,S)y²RationalUUnumbGercomparison.'9c?<-RNMIN(a,b)9ŲRationalUUnumbGermin.'9c?<-RNMAX(a,b)9ŲRationalUUnumbGermax.9Constructors:'9R?<-RNINT(A)u˲RationalUUnumbGerfrominteger.qR}'eturns n&fe~z1givenanintegern.'9R?<-RNRED(A,B)9ŲRationaldnumbGerreductiontolowestterms.P"R}'eturns j=nj=&fe~cd given7 two =9inte}'gersnanddwithd6=0.9Selectors:'9a?<-RNNUM(R)u˲RationalUUnumbGernumerator.'9b?<-RNDEN(R)u˲RationalUUnumbGerdenominator.9RandomTNum9bQerGeneration:'9R?<-RNRAND(n)zȲRationalUUnumbGer,random.9Input/Output:'9R?<-RNREAD()u˲RationalUUnumbGerread.'9RNWRITE(R)eԲRationalUUnumbGerwrite.'9RNDWRITE(R,n)u˲RationalHInumbGerdecimalwrite.JAppr}'oximatesslarationalnumber =9byade}'cimalfractionwithagivenaccuracyandwritestheapproximationtothe=9outputstr}'eam.9Miscellaneous:'9a?<-RNCEIL(r)zȲRationalUUnumbGer,ceilingof.'9a?<-RNFLOR(r)zȲRationalUUnumbGer, oorof.'9RNBCR(A,B;?M,N,k)RationalUUnumbGerbinarycommonrepresentation.'9RNFCL2(a;?m,n)zȲRationalUUnumbGer oorandceilingoflogarithm,base2.'9r?<-RNP2(k)pyβRationalUUnumbGerpowerof2.qComputes2^n egivenaGAMMA-digitn.A14̠C9iChapter 429cP8olynomial T{Arithmetic:94.13 VIntros3duction94.1.17yPurp`oseuT9The ;SACLIB-BpGolynomial ;arithmeticpackqagesprovidefunctionsdoingcomputationswith 9multivqariateUUpGolynomialsoverdomainsimplementedbytheSACLIB+varithmeticpackqages.9Except.forthefunctionslistedinSection4.7andvqariousconversion.functions,6Qonlythe9sp}'arserecursiveUUrepresentationisused.694.1.27yDe nitionsofTerms9sparseTrecursiv9erepresentationApGolynomial墵p2D[x1|s;:::;xrm]isinterpretedasanel-'9ementof(::: UO(D[x1|s]):::)[xrm],forsomedomainD.TheSACLIB*#sp}'arserecursiverepre-'9sentation8PofapGolynomialp=Pލ USn% USi=1tJpiTLx^eO \cmmi5i፴r &with8e1C>:::8>enq~,qǵpid2(::: UO(D[x1|s]):::)[xr71],'9andUUpid6=0isde nedrecursivelyasfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.39=9Ifr!}>`0,#thenPisthelist(e1|s;P1;:::;enq~;Pn)wheretheeiNͲareBETA-digitsand=9eachUUPiistherepresentationofpiTL.9sparseTdistributiv9erepresentationβA^pGolynomialp2D[x1|s;:::;xrm]isinterpretedas'9pԲ=Pލin%ii=1diTLx^eivC,#whereadi/ 2D,di/ 6=0,andax^ei standsforxWei;Zcmr51O1 (xWei;2O2ҷ(xWei;rrwith'9ei;j '0.+F*urthermore, {weassumethate19>e2>:::#>enq~, {where觵ek/>eiei;3^|O.'9The8sp}'arse8distributiverepresentation8PofsuchapGolynomialpisthelist(D1|s;E1;D2;E2;:::;Dnq~;En),'9where8Di/istheSACLIB)cinternalrepresentationofdi/andEiisthelist(ei;r ;ei;r71b;:::;ei;1 )'9withUUei;j MbGeingBETA-digits.'9AsUUalwaysinSACLIB(G!,P=0ifp=0.9denseTrecursiv9erepresentation㵲ApGolynomialdpHظ2D[x1|s;:::;xrm]isinterpretedasan'9elementvof(::: UO(D[x1|s]):::)[xrm],DforvsomedomainD.Thedense!r}'ecursiverepresentation'9PofapGolynomialp=Pލ USn% USi=0tJpiTLx^ir.withpid2(::: UO(D[x1|s]):::)[xr71]isde nedrecursively'9asUUfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.A15C39=9Ifɵr>vٲ0,&thenPisthelist(n;Pnq~;Pn1;:::;P0|s)wherethenisaBETA-digitand =9eachUUPiistherepresentationofpiTL.9pQolynomialJPIfthistermappGearsintheparameterspeci cationsofafunction,thisdenotes'9a6pGolynomialinthesparserecursiverepresentation.gOtherwise,=itisusedtodenotea'9pGolynomialUUinarbitraryrepresentation.9baseTdomain,baseringu'IfUUpisanelementofD[x1|s;:::;xrm],Disitsbasedomain.9in9tegralTpQolynomialt³AUUpGolynomialwhosebasedomainisZ.9moQdularTpolynomialxo#AipGolynomialwhosebasedomainisZm ,withmaprimepositive'9BETA-digit.9moQdularTin9tegralpolynomialA pGolynomialMwhosebasedomainisZm :withmapositive'9integer.9rationalTpQolynomialuf?AUUpGolynomialwhosebasedomainisQ.9mainTv\rariableW6JofUUapGolynomialinD[x1|s;:::;xrm]isxr.9degree3The9degreeofapGolynomialw.r.t.agivenvqariableisthehighestpower9ofthisvqari-'9able#appGearingwithnon-zerocoecientinthepolynomial.aMIfnovqariableisspeci ed,'9theUUdegreeiscomputedw.r.t.themainvqariable.9order.TheUUorderofapGolynomialp=Pލ USn% USi=0tJpiTLx^irisUUthesmallestk0suchthatpk6=0.9constan9tTpQolynomialx|AUUpGolynomialofdegree0ineveryvqariable.9leadingTtermROofǦapGolynomialisapolynomialequaltothetermofhighestdegreew.r.t.'9theUUmainvqariable.9reductumCofUUapGolynomialisthepolynomialminusitsleadingterm.9leadingTcoQecien9tlbThe#cleadingcoGecientofapolynomialisthecoecientofitsleading'9term.9leadingTbasecoQecien9tAndelementofthebasedomainequaltothecoGecientofthe'9leadingUpGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9trailingTbasecoQecien9tZ$AnelementofthebasedomainequaltothecoGecientofthe'9smallest\pGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9monicTpQolynomiallAUUpGolynomial,theleadingcoecientofwhichis1.9pQositiv9eTpolynomialu[AUUpGolynomial,theleadingbasecoecientofwhichispGositive.9sign'Anxintegerequalto1iftheleadingbasecoGecientofthepGolynomialispositive,1'9otherwise.9absoluteTv\ralueZofUUapGolynomialpisthepositivepolynomialq.suchthatp=sign7(p)8q[ٲ.9con9tent8qof apGolynomialpisequaltotheabsolutevqalueofthegreatestcommondivisorof'9theUUcoGecientsofp.9in9tegerTcontent_ ۲ofanintegralpGolynomialisanintegerequaltothepGositivegreatest'9commonUUdivisoroftheintegercoGecientsofeachpGowerproGductofthepolynomial.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.A16-C9squarefreeTpQolynomialݵApGolynomialpissquarefreeifeachfactoroccursonlyonce.,In '9otherwords,iifp1=p:e1l1 2bp~ekk hisacompletefactorizationofptheneachoftheei7Jis'9equalUUto1.N9squarefreeTfactorizationQ@Theysquarefreefactorizationofpisp:e1l1 2bp~ekk awhere1je1<'95<ek\andeachofthepiisapGositivesquarefreepGolynomialofpositivedegree.@DNote'9thatUUifpissquarefreethenp^1Ȳisthesquarefreefactorizationofp.9v\rariableT(name)b;Azlist(c1|s;:::;ck됲),wheretheciAareCcharacters.:Example:_thename'9"fubar"UUwouldbGerepresentedbythecharacterlist('f','u','b','a','r').9listTofv\rariables_|RAA&listA,(n1|s;:::;nrm)givingthenamesofthecorrespGondingvqariablesofan'9rG-vqariateUUpolynomialforinputandoutput. 􍍑94.23 VPolynomialffInputandOutput9In thissectionwewilldescribGethepolynomialinputandoutputroutinesthatareavqailable9inKSACLIB).RBeforeKproGceedingfurther, thereadershouldbefamiliarwiththeinternal9representationsUUofpGolynomialswhicharediscussedinSection4.1.2.f94.2.17yRecursivep`olynomialsoverZuT9Theexternalʊc}'anonicalrepresentationofsparser}'ecursivepGolynomialsoverZisde nedby9thefollowingrules.DFirstofall,eachpGolynomialisenclosedinparentheses.DA͝termisrepre-9sentedbythecoGecientimmediatelyfollowedbythevqariable(nospacenor'*'inbGetween).9ThecoGecients+1and1aresuppressedunlesstheexponentofthevqariableis0inwhich9casethevqariableissuppressed.PMThecaret'^'isusedtoindicateexpGonentiation.Exponents9withthevqalue1aresuppressedandifavariablehastheexpGonent0thenthevariable9issuppressed.ʀTheserulesapplyrecursivelytothecoGecientswhichmaythemselvesbGe9pGolynomials.qAUUfewexamplesareinorder.?%?L͉ff)hfdͤ fffdrecursiveUUpGolynomial ffSexternalUUcanonicalform# ffff)h͟ ffy_ ff(5 ff ͤ ff6fdx^4S+82x^3x+36 ff^(-x^4+2x^3-x+3)/̵ ff͟ ffy_ ff(5 ffͤ ff͟fd(x^2S+81)y[ٟ^3,+(x+8)y5 ff((x^2+1)y^3+(x+8)y+(-5)),ß ff͟ ffy_ ff(5 ffͤ fffd(x^2S84)y[ٟ^4,+y[ٟ^2yx ff^((-x^2+4)y^4+(1)y^2+(-1)y+(-x))͟ ff͟ ffy_ ff(5 ffff)h9NoteOthataconstantpGolynomialinr2lvqariableswillbeenclosedinr2lsetsofparentheses.NpF*or 9example,>Qthe8constantpGolynomial2in3vqariableswillberepresentedinexternalcanonical9formUUas(((2))).9The݇algorithmIPREADireadsanrG-vqariaterecursivepolynomialover݇Zinexternalcanon-9ical=formfromtheinputstream.OThepGolynomialthatisreadisstoredininternalcanonical9formandthenumbGerofvqariablesisalsorecorded.OThevariablesarenotstored.OInteger9coGecientsmaybGeofarbitrarylengthbutexponentsmustbGeBETA-digits.]Sincenosort-9ingPispGerformedontheterms,theymustbegiveninorderofdescendingdegree.иThisis9an>2impGortantremarksincealmostallalgorithmsthatmanipulatepolynomialsrequirethat9thejEtermsbGeorderedandviolatingthisrulewillundoubtedlycauseincorrectresultstobe9computedD)andmayevencrashthesystem.lAnotherimpGortantremarkisthattermswhose9coGecientsare0shouldnotbegivenasthesetermswillbestoredandmaycauseproblems,9forUUexampleinequalitytesting.9Although IPREADishappiestwhenapGolynomialisgiveninexternalcanonicalform9asexempli edbythepreviousexamples,theuserisallowedsomefreedom.AnarbitraryA17=ΠC9numbGer)ofspacesmayinterspGersedbetween)thecoecients,Ethevqariables,theexpGonents 9and=thesymbGols'+',B'-'and'^'.MSpacesmaynotbGeinsertedwithinavqariablenorwithinan9integer.F!CoGecientswithmagnitude1aswellastheexponents0and1maybGeexplicitly9given.Thus,forxexample,((x?^2+1)y^3+(1x+8)y^1-(5x^0)y^0)ispGerfectlyvqalid9andUUisequivqalenttothesecondexamplegiveninthetableabGove.9SincebIPREADbwasintendedtobGeusedmainlyforreadingoutputproducedbyprevious9computations,iitisdesignedtobGefastand,consequently*,verylittleerrorcheckingispGer-9formedontheinput. Amongotherthings,BIPREADdoGesnotcheckforconsistencyamong9the%vqariables,Ye.g.8((y)x^2+(z)y)willbGeacceptedasvalidinputandwouldbGeidentical9to((u)v^2+(u)v)ininternalrepresentation.Also,1IPREADdoGesnotcheckforconsistency9amongterms, Ji.e.[eachtermisproGcessedseparatelyanditisnotcheckedwhetherallterms9have~thesamenumbGer~ofrecursivenestings.gF*orexample,B(y^3+(x-1)y)willbeaccepted9althoughYthe rstterm,y^3,isYaunivqariatepGolynomialwhereasthesecond,(x-1)y,isYa9bivqariatepGolynomial.It7 isther}'efore7 ther}'esponsibility7 oftheusertose}'ethatpolynomials9ar}'einputproperly.9Theo~algorithmIPWRITEoxtakesasinputsanrG-vqariaterecursivepGolynomialAoxoverZand9aXlistV?=(v1|s;:::;vrm)XofrvqariablesandwritesAXtotheoutputstreamusingthevariables9spGeci edwithvr dEasthemainvqariableandv1 sasthemostminorvariable. UThelistV9maykbGeinitializedusingVLREADkewhichreadsavqariablelistfromtheinputstream.F*or9generatingByalistwitha xednumbGerByofvqariablesonecouldalsouseanexpressionsuch9asLIST3(LFS("X"),LFS("Y"),LFS("Z")).IHerethefunctionsLFSxisusedforconverting9a7pC76stringtoaSACLIBvqariable.ItispGossibletousethealgorithmIUPWRITEtowrite9univqariaterecursivepGolynomialsbutthisalgorithmwasintendedmainlyasasubroutine9toHbGecalledbyIPWRITE,whichalsohandlesunivqariatepGolynomials,Kandtheuserneednot9evenUUbGeawareofitsexistence.9TherezlisanadditionalsetofinputfunctionsofwhichthetoplevelfunctionisIPEXPREAD.9TheformatacceptedbythisfunctionisabitmoreconvenientasexpressionsmaybGeofthe9form(3?XY^2+X)^3-(YX+Y)(X-1)^2+5.fNotethatIPEXPREADalsotakesa9vqariableYlistasinputandthereforecandetecttheorderofthevariableswithoutrequiring9theUUrecursivestructuremadeexplicitbyparentheses.9T*o$bGemoreprecise, IPEXPREADacceptsanypolynomialexpressionbuiltfromintegers9andvqariablesusing+,>-,blanksformultiplication,>^forexpGonentiation,>andparenthesisfor9grouping.*TheexpressionmaybGeterminatedbyanycharacternotbGeingpartofthelegal9input+set(e.g.apGeriod,&a+semicolon,etc.).^dThisterminatingcharacterisnotremovedfrom9theUUinputstream.9ThetfunctionIPEXPREADRthasthesamespGeci cationasIPEXPREAD,withthedi erence9thatUUitdo}'esremoveUUtheterminatingcharacter.694.2.27yRecursivep`olynomialsoverQuT9F*or )9rG-vqariaterecursivepolynomialsover )9QthealgorithmsRPREAD &and9RPWRITEJ̲areJthecorrespGondinginputandoutputroutines.nEThesituationforrationalpoly-9nomials(isessentiallythesameasthatforintegralpGolynomialswiththeexceptionthatthe9base6coGecientsmaybGerationalnumbGers.kThesamefreedomsonvqalidinputapplyand9an>arbitrarynumbGer>ofspacesmaybeinsertedbeforeandafter'/'..Ifthedenominator9of}abasecoGecientis1thenonlythenumeratorisintheexternalcanonicalrepresen-9tation.ymustappGearinthesameorderthattheyappearinVandthetermsmustbeorderedin9descending'degreeinvrm.5F*orexample,×ifV=(x,y,z)then(4?z^5-y^2z^4+9xyz)9is:vqalidbut(4?z^5+9yxz-y^2z^4):isnotfortwo:reasons| rst,?yappGearsbefore9xintheterm9?yxzandsecond,֖theterm9?yxzappGearsbefore-?y^2z^4which9violatestherulethattermsmustappGearinorderofdescendingdegreeinz.Additionally*,9if"therearetwo"termswiththesamedegreeinvrQIJthentheyshouldbGeorderedaccording9todescendingdegreeinvr71Tandsoon.qCoGecientsmaybGeseparatedfromthevqariables9bytanarbitrarynumbGerofspaces(includingnospaceatall).gV*ariablesmustbGeseparated9by atleastonespaceifthereisnoexpGonentexplicitlygiven,otherwiseanarbitrarynum-9bGerofspacesmayseparatethem.F*orexample(4z^5?-y^2z^4+9xyz)isvqalidbut9(4z^5?-y^2z^4+9xyz)UUisnotsincexyzwillbGetreatedasasinglevqariable.694.2.47yDistributivep`olynomialsoverQ9DistributivepGolynomialsoverQmaybGereadinandwrittenoutusingthealgorithms9DIRPREADXuandXDIRPWRITE.Theonlydi erencebGetweenXrationaldistributivepolynomials9andPintegraldistributivepGolynomialsisthatthebasecoecientsmaybGerationalnumbGers9andnotjustintegers.ItshouldbGeclearafterreadingtheprecedingsubsectionswhat9constitutesUUvqalidinputandwewillnotdiscussthismatterfurther.694.2.57yConversionBetweenRecursiveandDistributive7yRepresentation9Converting recursivepGolynomialstodistributivepGolynomialscanbeachievedbyusing9DIPFPwhich,given5apGolynomialinrecursiveinternalrepresentation,computesanequiv-9alentoneindistributiveinternalrepresentation.YIntheotherdirection,namelytoconvert9from)Kdistributivetorecursiverepresentation,2thealgorithmPFDIP)?isprovided.cBothDIPFP9and˪PFDIPˌworkforpGolynomialsovereitherZorQbutthenumbGerofvqariablesmustbGe9spGeci ed.j=F*or>example,C=ifA>isapolynomialover>Qininternalrecursiverepresentationand9theUUuserwantsUUtodisplayAinexternaldistributiverepresentationthenthecoGdeDIRPWRITE(r,DIPFP(r,A),V);9whereUUrisequaltothenumbGerUUofvqariablesandVisalistofrvariables,willsuce.694.2.67yPolynomialsoverZ2cmmi8m9The6inputandoutputroutinesforpGolynomialsover6ZworkequallywellforpGolynomials 9overUUZm.A19hC94.33 VDomainffIndeps3endentPolynomialArithmetic9Constructors:'9A?<-PFBRE(r,a)9ŲPolynomial'fromBaseRingElement.NBuilds3$anr-variatep}'olyno- =9mialfr}'omanelementofsomedomain.'9A?<-PMON(a,e)zȲPolynomialUUmonomial.qBuildsax^e2fr}'omaande.'9A?<-PBIN(a1,e1,a2,e2)Polynomial8binomial.Builds8a1|sx^e12k+a2x^e2 fr}'oma1;a2;e1,=9ande2|s.9Selectors:'9a?<-PLDCF(A)u˲PolynomialպleadingcoGecient.G>R}'eturnstheleadingcoecientw.r.t.=9themainvariable.'9B?<-PRED(A)pyβPolynomialreductum.`R}'eturnsythereductum(thepolynomialminus=9itsle}'adingterm)w.r.t.themainvariable.'9a?<-PLBCF(r,A)9ŲPolynomial~leadingbasecoGecient.GR}'eturns "thecoecientofthe=9termofthehighestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).'9a?<-PTBCF(r,A)9ŲPolynomial3trailingbasecoGecient.@R}'eturns thecoecientofthe=9termofthelowestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).9InformationTandPredicates:'9n?<-PDEG(A)pyβPolynomialdegree.yR}'eturns.thedegreeoftheargumentw.r.t.the=9mainvariable.'9n?<-PMDEG(A)u˲Polynomial6qmoGdi eddegree.R}'eturnscthedegreeoftheargument,=91ifthear}'gumentis0.'9n?<-PDEGSV(r,A,i)Polynomialdegree,/spGeci edvqariable.}R}'eturns4thedegreeof=9thear}'gumentw.r.t.thei-thvariable.'9V?<-PDEGV(r,A)9ŲPolynomialvtdegreevector.#R}'eturns_alist(d1|s;:::;drm)wherediis=9thede}'greeofargumentw.r.t.thei-thvariable.'9b?<-PCONST(r,A)y²Polynomialdconstant./T;ests"whetherthear}'gumentisaconstant=9p}'olynomial.'9b?<-PUNT(r,A)zȲPolynomialunivqariatetest.wT;estsPwhetherthear}'gumentisauni-=9variatep}'olynomial.'9k?<-PORD(A)pyβPolynomialp7order.mR}'eturns(thesmallestexponentappearinginthe=9ar}'gumentpolynomial(w.r.t.themainvariable).9T ransformation:'9B?<-PSDSV(r,A,i,n)9PolynomialspGecialdecomposition,speci edvqariable.&Com- c=9putesp(x1|s;:::;x:1=nZi յ;:::;xrm)givenp;i;n,andrG.'9B?<-PDPV(r,A,i,n)PolynomialdivisionbypGowerofvqariable.ComputesӴx䍷ni p=9givenp;i,andn.'9B?<-PMPMV(A,k)9ŲPolynomial multiplicationbypGowerofmainvqariable.Computes=9x^nq~pgivenpandn,withxb}'eingthemainvariableofp.'9B?<-PRT(A)k9ѲPolynomial!reciproGcaltransformation.*Computesx^nq~p(x^1 t)withnz==9degL](p).'9B?<-PDBORD(A)zȲPolynomial>dividedbyorder.DjComputesx^n pwher}'enistheorder=9ofp.A20{GC9Con9version^1|s:'9B?<-PFDIP(r,A)9ŲPolynomialdfromdistributivepGolynomial.![Computesap}'olynomial =9inthesp}'arserecursiverepresentationfromapolynomialinthesparsedistributive=9r}'epresentation.'9B?<-PFDP(r,A)zȲPolynomialfromdensepGolynomial.UComputesDap}'olynomialinthe=9sp}'arserecursiverepresentationfromapolynomialinthedenserecursiverepre-=9sentation.9Miscellaneous:'9B?<-PINV(r,A,k)y²PolynomialintroGductionofnewvqariables.GComputesap}'olyno-=9mialinRDz[y1|s;:::;ysF:;x1;:::;xrm]fr}'omapolynomialinRDz[x1|s;:::;xrm].'9B?<-PPERMV(r,A,P)PolynomialpGermutationofvqariables.PComputes82ap}'olynomial=9inCRDz[xp1r;:::;xpr ]fr}'omapolynomialinRDz[x1|s;:::;xrm],lwhere(p1|s;:::;prm)isa=9p}'ermutationof(1;:::;rG).'9B?<-PCPV(r,A,i,j)PolynomialUUcyclicpGermutationofvqariables.'9B?<-PICPV(r,A,i,j)9PolynomialUUinversecyclicpGermutationofvqariables.'9B?<-PTV(r,A,i)9ŲPolynomialUUtranspGosevqariables.'9B?<-PTMV(r,A)zȲPolynomialUUtranspGosemainvqariables.'9B?<-PUFP(r,A)zȲPolynomial,univqariate,fromxpGolynomial.1ComputesZaunivariate=9p}'olynomial0Mfromanr-variatepolynomialbysubstituting0forallvariablesexcept=9themainvariablexrm.'9L?<-PCL(A)k9ѲPolynomialcoGecientlist.ۺR}'eturnsalist(pnq~;:::;p0|s)wherenisthe=9de}'greeofpandthepi3ar}'ethecoecientsofp.!č94.43 VIntegralffPolynomialArithmetic9BasicTarithmetic:'9C?<-IPSUM(r,A,B)IntegralUUpGolynomialsum.'9C?<-IPDIF(r,A,B)IntegralUUpGolynomialdi erence.'9B?<-IPNEG(r,A)9ŲIntegralUUpGolynomialnegative.'9C?<-IPPROD(r,A,B)IntegralUUpGolynomialproduct.'9C?<-IPIP(r,a,B)y²IntegralpGolynomialintegerproGduct.ComputesGc&pgivenan=9inte}'gercandanintegralpolynomialp.'9C?<-IPP2P(r,B,m)IntegralUUpGolynomialpowerUUof2product.'9IPQR(r,A,B;?Q,R)y²IntegralUUpGolynomialquotientandremainder.'9C?<-IPQ(r,A,B)9ŲIntegralUUpGolynomialquotient.'9C?<-IPIQ(r,A,b)y²Integral[pGolynomialintegerquotient.Computesp=cgivenan=9inte}'gralpolynomialpandanintegerc.'9C?<-IPPSR(r,A,B)IntegralUUpGolynomialpseudo-remainder.'9IUPSR(A,B;?ab,bb,C)9IntegralUUunivqariatepGolynomialsemi-remainder.'9B?<-IPEXP(r,A,n)IntegralUUpGolynomialexponentiation.'9s?<-IPSIGN(r,A)y²IntegralUUpGolynomialsign.'9B?<-IPABS(r,A)9ŲIntegralUUpGolynomialabsolutevqalue.9X-ffl) J= "5-:1LSeeXSection4.7foradescriptionofthesparsedistributivÎeandthedenserecursiverepresentations.A21C9Di eren9tiationTandIntegration:؞'9B?<-IPDMV(r,A)9ŲIntegralUUpGolynomialderivqative,mainvqariable.؞'9B?<-IPDER(r,A,i)Integral/pGolynomialderivqative.e3Computesq1thederivativeofthe =9ar}'gumentw.r.t.thei-thvariable.'9B?<-IPHDMV(r,A,k)IntegralEZpGolynomialhigherderivqative,[mainvqariable.ACom-=9putesthek-thderivativeofthear}'gumentw.r.t.themainvariable.'9B?<-IPINT(r,A,b)Integral6pGolynomialintegration.jComputes theinte}'gral ofthe=9ar}'gumentw.r.t.themainvariable.؞9SubstitutionTandEv\raluation:'9C?<-IPSMV(r,A,B)Integral pGolynomialsubstitutionformainvqariable.YSubstitutes=9aninte}'gralpolynomialforthemainvariableofanintegralpolynomial.؞'9C?<-IPSUB(r,A,i,B)9Integral8pGolynomialsubstitution.Substitutes8aninte}'gral8poly-=9nomialforthei-thvariableofaninte}'gralpolynomial.'9C?<-IPGSUB(r,A,s,L)yIntegralpGolynomialgeneralsubstitution..Substitutes`anin-=9te}'gralpolynomialsforallvariablesofanintegralpolynomial.'9B?<-IUPQS(A)u˲IntegralUUunivqariatepGolynomialquotientsubstitution.'9B?<-IPEMV(r,A,a)Integral{~pGolynomialevqaluationofmainvariable.ASubstitutesa=9c}'onstantforthemainvariableofanintegralpolynomial.'9B?<-IPEVAL(r,A,i,a)yIntegralpGolynomialevqaluation.Substitutesac}'onstantfor=9thei-thvariableofaninte}'gralpolynomial.'9b?<-IUPBEI(A,c,m)Integral4univqariatepGolynomialbinaryrationalevaluation,;in-=9tegerUUoutput.'9s?<-IUPBES(A,a)y²IntegralLpunivqariatepGolynomialbinaryrationalevaluationofsign.'9b?<-IUPBRE(A,a)y²IntegralUUunivqariatepGolynomialbinaryrationalevaluation.'9B?<-IPBEILV(r,A,c,k,m)9IntegralpGolynomialbinaryrationalevqaluation,integral=9pGolynomialUUresult,leadingvqariable.'9B?<-IPBREI(r,A,i,c)yIntegral8pGolynomialbinaryrationalevqaluation,qintegralpGoly-=9nomialUUresult.؞9T ransformation:'9B?<-IPTRMV(r,A,h)IntegralYpGolynomialtranslation, mainvqariable. Computes=9p(x8+h)givenpandh,wher}'existhemainvariableofp.؞'9B?<-IPTRAN(r,A,T)IntegralpGolynomialtranslation.?Computes 7p(x1Բ+ at1|s;:::;xry+=9trm)givenpandthetiTL.'9B?<-IPBHT(r,A,i,k)9IntegralUUpGolynomialbinaryhomothetictransformation.'9B?<-IPBHTLV(r,A,k)9IntegralpGolynomialbinaryhomothetictransformation,lead-=9ingUUvqariable.'9B?<-IPBHTMV(r,A,k)9IntegralzrpGolynomialbinaryhomothetictransformation,9main=9vqariable.'9B?<-IUPBHT(A,k)y²IntegralunivqariatepGolynomialbinaryhomothetictransforma-=9tion.'9B?<-IUPIHT(A,n)y²IntegralDunivqariatepGolynomialintegerhomothetictransforma-=9tion.'9B?<-IPNT(r,A,i)y²IntegralUUpGolynomialnegativetransformation.'9B?<-IUPNT(A)u˲IntegralUUunivqariatepGolynomialnegativetransformation.A22/C'9B?<-IPTR(r,A,i,h)IntegralUUpGolynomialtranslation,speci edvqariable.ꍍ'9B?<-IUPTR(A,h)9ŲIntegralUUunivqariatepGolynomialtranslation.'9B?<-IPTR1(r,A,i)IntegralbpGolynomialtranslationby1,espGeci edvqariable.speci- =9 edUUvqariable.'9B?<-IPTRLV(r,A)y²IntegralUUpGolynomialtranslation,leadingvqariable.'9B?<-IPTR1LV(r,A)IntegralUUpGolynomialtranslationby1,leadingvqariable.'9B?<-IUPTR1(A)zȲIntegralUUunivqariatepGolynomialtranslationby1.ꍍ9Predicates:'9t?<-IPCONST(r,A)Integral"pGolynomialconstant.`T;estsewhetherthear}'gumentisa=9c}'onstant.ꍍ'9t?<-IPONE(r,A)9ŲIntegralUUpGolynomialone.qT;estswhetherthear}'gumentis1.9RandomTP9olynomialGeneration:'9A?<-IPRAN(r,k,q,N)9IntegralUUpGolynomial,random.9Con9version:'9IPSRP(r,A;?a,Ab)y²IntegralpGolynomialsimiliartorationalpolynomial.Givena=9r}'ationalpolynomialq[,computesarationalnumbercandanintegralpolynomial=9pwithcp=q[.ꍍ'9B?<-IPFRP(r,A)9ŲIntegralpGolynomialfromrationalpolynomial.Computes)anin-=9te}'gral>=polynomialfromarationalpolynomialwhosebasecoecientsareintegers.9Input/Output:'9IPREAD(;?r,A)u˲IntegralUUpGolynomialread.ꍍ'9IPEXPREAD(r,V;?A,t)9IntegralUUpGolynomialexpressionread.'9IPWRITE(r,A,V)zȲIntegralUUpGolynomialwrite.'9IPDWRITE(r,A,V)9ŲIntegralBPolynomialDistributiveW*rite.FWritesQaninte}'gralQrecur-=9sivep}'olynomialindistributiveform.ꍍ9Con9tentsTandPrimitiv9eParts:'9IPICPP(r,A;?a,Ab)IntegralUUpGolynomialintegercontentandprimitivepart.ꍍ'9c?<-IPIC(r,A)zȲIntegralUUpGolynomialintegercontent.'9Ab?<-IPIPP(r,A)y²IntegralUUpGolynomialintegerprimitivepart.'9d?<-IPICS(r,A,c)IntegralUUpGolynomialintegercontentsubroutine.'9IPSCPP(r,A;?s,C,Ab)9IntegralpGolynomialsign,#content,andprimitivepart.]0Com-=9putesxthesign,c}'ontentandprimitivepartoftheargumentw.r.t.themainvari-=9able.'9IPCPP(r,A;?C,Ab)y²IntegralUUpGolynomialcontentandprimitivepart.'9C?<-IPC(r,A)u˲IntegralUUpGolynomialcontent.'9Ab?<-IPPP(r,A)9ŲIntegralUUpGolynomialprimitivepart.'9IPLCPP(r,A;?C,P)y²IntegralUUpGolynomiallistofcontentsandprimitiveparts.ꍍ9P9olynomialTNorms:'9b?<-IPSUMN(r,A)y²IntegralUUpGolynomialsumnorm.ꍍ'9b?<-IPMAXN(r,A)y²IntegralUUpGolynomialmaximumnorm.A23lC9ChineseTRemainderAlgorithm:'9As?<-IPCRA(M,m,mp,r,A,a)IntegralUUpGolynomialchineseremainderalgorithm.9SquarefreeTF actorization:'9L?<-IPSF(r,A)zȲIntegralUUpGolynomialsquarefreefactorization.'9L?<-IPFSD(r,A)9ŲIntegralUUpGolynomialfactorization,secondderivqative.'9L?<-IPSFSD(r,A)y²IntegralUUsquarefreefactorization,secondderivqative.9ComputationsTinIdeals:'9B?<-IPTRUN(r,D,A)Integral8pGolynomialtruncation.Computes8pmod(x:d1l1ҵ;:::;x^dr፴ri) =9givenpandthediTL.'9C?<-IPTPR(r,D,A,B)9IntegralUUpGolynomialtruncatedproduct.qComputespqmod=9(x:d1l1ҵ;:::;x^dr፴ri)givenp;q[,andthediTL.'9B?<-IPIHOM(r,D,A)IntegralDpGolynomialmodidealhomomorphism. ?Computes=9pmoGd U=9(x:d1l1ҵ;:::;x㍴dr,r 0ncmsy51Ír718)givenanr-variatep}'olynomialpandthediTL.'9C?<-IPIPR(r,D,A,B)9IntegralUUpGolynomialmodidealproduct.qComputespqmod=9(x:d1l1ҵ;:::;x㍴dr,r1Ír718)givenr-variatep}'olynomialspandqandthediTL.'9C?<-IUPTPR(n,A,B)IntegralgGunivqariatepGolynomialtruncatedproduct.Computes =9pqmoGdصx^n egivenunivariatep}'olynomialspandqandaBETA-digitn. o94.53 VMos3dularffPolynomialArithmetic9NotethatthefunctionswhosenamesbGeginwithMI|arebaseduponmodularintegerarith-9metic,~hwhilev1thosebGeginningwithMPv(andMUParebasedupGonmodulardigitarithmetic9withUUaprimemoGdulus^2|s.>w9BasicTarithmetic:'9C?<-MIPSUM(r,M,A,B)yMoGdularUUintegralpolynomialsum.'9C?<-MPSUM(r,m,A,B)9MoGdularUUpolynomialsum.'9C?<-MIPDIF(r,M,A,B)yMoGdularUUintegralpolynomialdi erence.'9C?<-MPDIF(r,m,A,B)9MoGdularUUpolynomialdi erence.'9B?<-MIPNEG(r,M,A)MoGdularUUintegralpolynomialnegation.'9B?<-MPNEG(r,m,A)MoGdularUUpolynomialnegative.'9C?<-MIPPR(r,M,A,B)9MoGdularUUintegralpolynomialproduct.'9C?<-MPPROD(r,m,A,B)yMoGdularUUpolynomialproduct.'9B?<-MPUP(r,m,c,A)MoGdularUUpolynomialunivqariateproduct.'9C?<-MPMDP(r,p,a,B)9MoGdularUUpolynomialmodulardigitproduct.'9C?<-MIPIPR(r,M,D,A,B)MoGdularUUintegralpolynomialmodidealproduct.'9MIUPQR(M,A,B;?Q,R)MoGdularintegralunivqariatepolynomialquotientandremain-=9der.'9MPQR(r,p,A,B;?Q,R)MoGdularUUpolynomialquotientandremainder.'9C?<-MPQ(r,p,A,B)MoGdularUUpolynomialquotient.'9C?<-MPUQ(r,p,A,b)MoGdularUUpolynomialunivqariatequotient.9Qffl) J= "5-:2LSeeXSection3.3fordetailsonmoandB =PލQn%Qi=0:HbiTLx^ir/,thentheSylvestermatrixofAandB-isthe9(m8+n)(m+n)UUsquarematrixC{0.IfM8istheSylvestermatrixof9AIandBq,Kthenfor0ijYSdi >}wherediisas9inUUthepreviousde nition.9Ther}'educedPRSkisobtainedbysettingAi>=prem(Ai2 ;Ai1)=c:i*+1;Zimy,n:whereci>=9ldcfh(Ai2 )UUandid=deg꧟qƴxrB(Ai3)8deg\oqƴxrm (Ai2)UUfor3in,UUwith3C=0.9Althoughitisnotimmediatelyclearfromthede nitions,NabGothsubresultantPRSsas9wellUUasthereducedPRScanbGeshowntobGe,infact,PRSs.9F*orunivqariatepGolynomialsovera eldwemayde newhatisknownasthenatur}'alPRS9de nedHbyAid=Ai2UȵQiTLAi1 ,°Jt(Ai)werefertotheGCDz4ofAandBwewillmeantheGCDz4de ned9byUUthealgorithmsandthiswillbGedenotedbygcdUW(A;Bq).9Algorithms(arealsoavqailableforthecomputationofresultantsofrG-vqariatepolynomials9overRR߲=ZorR=ZpR.Thepackqagealsoprovidesalgorithmsforcomputingthesubresultant9PRS',and'7thereducedPRSforrG-vqariatepolynomialsover'7R߲=ZandthesubresultantPRS9forUUrG-vqariatepolynomialsoverUUR߲=ZpR.96.33 VDe nitionsffofTferms9coarsestTsquarefreebasis5If,A=(A1|s;:::;Anq~)isalistofrG-vqariatepolynomials,4acoars-'9estsquarefreebasisforAisalistB=/(B1|s;:::;Bm)ofpairwiserelativelyprime'9squarefreerG-vqariatepolynomialssuchthateachAi4EinAcanbGeexpressedastheprod-'9uctUUofpGowersUUofelementsofBq.H9discriminan9tQIfkAisanrG-vqariatepolynomialofdegreeninitsmainvqariable,밵n2,'9the?discriminantofAisthe(r1)-vqariatepGolynomialequaltothequotientof'9(1)^n(n1)=2"ɲres/C(A;A^09)Hwhendividedbya,whereA^0{isthederivqativeofAwithrespGect'9toUUitsmainvqariableandaistheleadingcoGecientofA.9 nestTsquarefreebasisA< nestsquarefreebasisBK=(B1|s;:::;Bm)foralistAofrG-'9vqariateZpGolynomialsisacoarsestsquarefreebasisforAwiththeadditionalcondition'9thatUUeachBiisirreducible.9cofactors?If_C{istheGCD9oftwo_pGolynomialsAandBiвthenthecofactorsofAandBq,'9respGectively*,UUareA=C qandBq=C.9ffl) J= "5-:1Lprem(FdAogreatestsquarefreedivisorofapGolynomialAisasquare-'9free+pGolynomialCGthatdividesAandissuchthatanyothersquarefreepGolynomial'9thatUUdividesAalsodividesC.9primitiv9eTpartZTheprimitivepartofapGolynomialAistheabsolutevqalueofA=cwhere'9cUUisthecontentUUofA.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.9squarefreeTfactorizationQ@The<]squarefreefactorizationofAisA=A:e1l1 2bA~ekk Dzwhere<]1'9e1C<8׵<ekandÎeachoftheAiڲisapGositivesquarefreepGolynomialofpositivedegree.'9NoteUUthatifAissquarefreethenA^1ȲisthesquarefreefactorizationofA.9squarefreeTpQolynomialݵAcpGolynomialcAissquarefreeifeachfactoroccursonlyonce.!In'9otherZwords,\]ifAx=A:e1l1 2bA~ekk _isZacompletefactorizationofAtheneachoftheeiAis'9equalUUto1.9univ\rariateTcon9tentn IfAisanrG-vqariatepolynomial,Q|r^hK2,thentheunivqariatecontent'9ofAisaunivqariatepGolynomialinthemostminorvariableequaltotheGCDwofthe'9coGecientsUUofA,whereAisconsideredasanelementof(RDz[x1|s])[x2;:::;xrm].9univ\rariateTprimitiv9epartGivenD.anrG-vqariatepolynomialA,Gr52,theD.univqariateprim-'9itiveLpartofAistherG-vqariatepolynomialA=a,IwhereaistheunivqariatecontentLof'9A.!č96.43 VMethos3dsffandAlgorithms9Injthissectionwebrie ydiscussthemainalgorithmsthatmightbGeofinteresttotheuser9andUUgiveasketchofthemathematicalideasbGehindthesealgorithms.696.4.17yGCDComputationsuT9T*otcomputetheGCDIoftwotunivqariatepGolynomialsovertRg=ݠZpR,&aMPGCDC5proceeds9recursivelyJuntilitarrivesatunivqariatepGolynomialswhereuponMUPGCD*iscalled.FnTheGCD9computedUUismonic.9T*obobtaintheGCD>oftwobrG-vqariateintegralpolynomialsAandB_Ӳonewouldusethe9algorithm IPGCDCwhichalsocomputesthecofactorsofAandBq.InthisalgorithmmoGd-9ularZhomomorphismsandChineseremainderingareusedtoreducetheproblemtoGCD9computationsUUofrG-vqariatepolynomialsoverUUR߲=ZpR,whichissolvedbyMPGCDC.96.4.27yResultantsuT9Using4thealgorithmsuggestedbythede nitionoftheresultant,lnamelytoconstructthe9SylvesterUUmatrixandcomputeitsdeterminant,isnotthemostecientwaytoproGceed.A33")נC9Instead,MUPRESJ#computesJbtheresultantoftwounivqariatepGolynomialsAandBӲover 9R߲=ZpbyUUcomputingthenaturalPRSofAandBƲandbyusingtheidentityK{res>G(A;Bq)=(1)q\" yȴn1  2Y t i=2Rbc㍴di1 Ƿdi+1i&؟\#Ocdn1፴n!9whereUUcid=ldcfc(AiTL),di=deg(AiTL),j=Pލ USk+B2% USi=1'didi+1ɤandA1|s;:::;AnӲisthenaturalPRS.9F*orpcalculatingtheresultantofrG-vqariatepolynomialsoverpR&=ZpR,N6MPRESOp}'olynomialAoverR߲=Z,Oncomputesthepositiveandprimitivegreatestsquare-=9fr}'eedivisoroftheprimitivep}'artofA.'9L?<-IPSF(r,A)zȲIntegralunivqariatepolynomialextendedgreatestcommon =9divisor. ComputestheGCDICoftwounivariatep}'olynomialsAandBfover=9R߲=Zp39aswelltheunivariatep}'olynomialsUandVsuchthatAUO+8BqV=C.'9MUPHEG(p,A,B;?C,V)MoGdular4univqariatepolynomialhalf-extendedgreatestcom-=9monm$divisor.ComputestheGCDɵC`oftwounivariatep}'olynomialsAandB*@over=9R1/=hZpbasÌwelltheunivariatep}'olynomialVpsuchthatAUr+[fBqVVL=Czforsome=9U.A36%_ C9iChapter 729cP8olynomial T{Factorization:97.13 VMathematicalffPreliminaries9Anon-constantpGolynomialA(x1|s;:::;xrm)inRDz[x1;:::;xrm],٣whereR}isauniquefactorization 9domain,issaidtobGeirr}'educibleifAcannotbeexpressedastheproductoftwonon-constant9pGolynomials+inRDz[x1|s;:::;xrm].5dTheproblemoffactoringapolynomialA(x1|s;:::;xrm)isthatof9 ndingFdistinctirreduciblepGolynomialsAiTL(x1|s;:::;xrm)andintegersei,|޵i=1;:::;kP,suchFthat9A=A:e1l1 2bA~ekkj. Suchaanexpressioniscalledac}'ompletefactorizationofA.ThepGolynomials9AiareUUcalledtheirr}'educiblefactorsUUofAandtheintegereiiscalledthemultiplicityofAiTL.!č97.23 VPurps3ose9TheCSACLIB)y4pGolynomialCfactorizationpackqageprovidesfactorizationalgorithmsforR߲=ZpR,9p[asingle-precisionprimeandrE=1,?andforR=ZforrE1.F*orR=Zoneobtains9theqsign,5wintegercontentandpGositiveprimitiveirreduciblefactorsofA,5waswellasthe9multiplicityBofeachirreduciblefactor.kTheintegercontentisnotfactored.kF*orR߲=Zp/the9irreducibleUUfactorsobtainedaremonic.!č97.33 VMethos3dsffandAlgorithms9T*obfactoranarbitraryunivqariatepGolynomialmoduloaprime,$oneshould rstobtaina9similarmonicpGolynomialbyusingthealgorithmMPMON.Havingdonethis,wonethencom-9putesR-thesquarefreefactorsofthemonicpGolynomialbyusingthealgorithmMUPSFF.In9orderɞtofactoreachsquarefreefactoronewoulduseMUPFBL,whichimplementsBerlekqamp's9algorithm.qTheUUirreduciblefactorsreturnedbyMUPFBLaremonic.9F*orfactoringaunivqariateintegralpGolynomial,IUPFACI rstcomputesthesquarefree9factorizationusingthealgorithmIPSF.Thesquarefreefactorsareinturnfactoredusing9IUSFPFffwhichfj rstcomputesafactorizationmoGduloaprimeandthemodularfactorsthus9obtainedEarethenliftedbythequadraticversionoftheHenselconstruction.:IUPFACreturns9theQsign,Rtheintegercontentandalistofirreduciblefactors,Rwithmultiplicities,Roftheinput9pGolynomial.qTheUUirreduciblefactorsreturnedbyIUPFACarepositiveandprimitive.9MultivqariateƜintegralpGolynomialsarefactoredbyusingIPFAC.Thisalgorithm rstcom-9putesthecontentaswellasthesquarefreefactorsoftheprimitivepartoftheinputpGoly-9nomialIandsubsequentlyfactorseachoftheseseparately*.mThefactorizationofasquarefree9primitivepGolynomialisperformedbythealgorithmISFPF֨whichimplementsamultivqariate9lifting{techniquebasedontheHensellemma.9Theliftingisdoneonevqariableatatimeas9oppGosedUUtoliftingseveralvqariablessimultaneously*.A37&fC9If7thepGolynomialAtobefactoredhasrationalbasecoecientsthenitmust rstbGe 9convertedMPtoanintegralpGolynomialbymultiplyingAbytheleastcommonmultipleofthe9denominators` ofthebasecoGecientsandthenconvertingthepGolynomialthusobtainedto9integralrepresentation.RThiscanbGeachievedbyusingIPSRPwhichcomputestheprimitive9andUUpGositiveintegralpGolynomialA^0#aswellastherationalnumbGerasuchthatA=aA^09.!č97.43 VFfunctions9F actorization:'9IPFAC(r,A;?s,c,L)Integral^$pGolynomialfactorization.3F;actorsr-variatep}'olynomi-=9alsoverZ.'9IUPFAC(A;?s,c,L)y²IntegralunivqariatepGolynomialfactorization._QF;actors`univariate=9p}'olynomialsoverZ.'9L?<-MUPFBL(p,A)y²MoGdular8univqariatepolynomialfactorization-Berlekqampalgorithm.=9F;actorsmonicsquar}'efreeunivariatep}'olynomialsoverZpR.9AuxiliaryTF unctionsforFactorization:'9IPCEVP(r,A;?B,L)y²IntegralpGolynomial,#choiceofevqaluationpGoints.]GivenZaninte- =9gr}'al\polynomialAthatissquarefreeinitsmainvariable,gcomputesintegersthat,=9whensubstitute}'dfortheminorvariables,DmaintainthedegreeofAinthemain=9variableanditssquar}'efreeness.'9b?<-IPFCB(V)u˲IntegralspGolynomialfactorcoecientbound.͈Given thede}'gree vec-=9tor*Sofaninte}'gral*SpolynomialA,Ocomputesanintegerbsuchtheproductofthe=9in nity normsofanydivisorsofAislessthanore}'qualto2^bPtimesthein nity=9normofA.'9Lp?<-IPFLC(r,M,I,A,L,D)yIntegralUUpGolynomialfactorlistcombine.'9B?<-IPFSFB(r,A)y²IntegralUUpGolynomial nestsquarefreebasis.'9a?<-IPGFCB(r,A)y²IntegralUUpGolynomialGelfondfactorcoecientbound.'9IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C;?A,B)޹Integral8pGolynomialmodidealquadraticHensel=9lemma.'9L?<-ISFPF(r,A)9ŲIntegralsquarefreepGolynomialfactorization.o2Given#ap}'ositive,=9primitiveinte}'gralpolynomialAthatissquarefreewithrespecttothemainvari-=9able,c}'omputesalistofthedistinctpositiveirreduciblefactorsofA.'9IUPFDS(A;?p,F,C)y²IntegralUUunivqariatepGolynomialfactordegreeset.'9IUPQH(p,Ab,Bb,Sb,Tb,M,C;?A,B)ɹIntegral%univqariatepGolynomialquadraticHensel=9lemma.'9Fp?<-IUPQHL(p,F,M,C)IntegralunivqariatepGolynomialquadraticHensellemma,=9list.'9L?<-IUSFPF(A)zȲIntegralQunivqariatesquarefreepGolynomialfactorization.fGiven{a=9univariate,qp}'ositive,primitive,squarefreeintegralpolynomialA,qcomputesalist=9ofthep}'ositiveirreduciblefactorsofA.'9M?<-MCPMV(n,L)9ŲMatrix>ofcoGecientsofpolynomials,ywithrespecttomainvqari-=9able.'9MIPISE(r,M,D,A,B,S,T,C;?U,V)yMoGdular}integralpolynomialmodideal,solution=9ofUUequation.'9MIUPSE(M,A,B,S,T,C;?U,V)yMoGdularUintegralunivqariatepolynomial,solutionof=9equation.A38't۠C'9MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C;?A,B)yMoGdular8polynomialmodideal,qquadratic =9HenselUUlemma.'9Fp?<-MPIQHL(r,p,F,M,D,C)MoGdular8polynomialmodideal,qquadraticHensellemma,=9list.'9MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C;?A,B,S,T,Dp)9qMoGdularSpolynomialmodideal,=9quadraticUUHensellemmaonasinglevqariable.'9Q?<-MUPBQP(p,A)y²MoGdularunivqariatepolynomialBerlekqampQ-polynomialscon-=9struction.'9L?<-MUPDDF(p,A)y²MoGdular8polynomialdistinctdegreefactorization.Given8amonic,=9squar}'efreepolynomialAoverRy=eZpR,vcomputesalist((n1|s;A1),v:::,v(nk됵;Ak)),=9wher}'ethenijarepositiveintegerswithn1P<)R<)nkandeachAijistheproduct=9ofallmonicirr}'educiblefactorsofAofde}'greeniTL.'9L?<-MUPFS(p,A,B,d)9MoGdularUUunivqariatepolynomialfactorization,special.A39(ؠC9iChapter 829cReal T{Ro otCalculation:98.13 VMathematicalffPreliminaries9Let׵A(x)bGeaunivqariatepolynomialwithintegercoecients. MAqrealnumbGerx0 ]Jwith 9A(x0|s)9=0iscalledar}'ealhrootofA(x).ArealnumbGerx0DvisarootofA(x)ifandonlyif9A(x)isdivisibleby(x}x0|s),i.e.lifthereisapGolynomialBq(x)withrealcoecientssuch9that A(x)'I=(x_Zx0|s)Bq(x).F*oranyrealroGotx0 ofA(x)thereisanaturalnumbGerkߣsuch9that A(x)isdivisibleby(xθx0|s)^kKbut notby(xθx0|s)^k+B+1 .This numbGerk^Riscalledthe9multiplicityroftheroGotx0ofA(x).Rootsofmultiplicityr1arecalledsimpler}'oots.An9intervqalIșcontainingx0|*butnootherrealroGotofA(x),iscalledanisolatingE#intervalforx0|s.9F*orexample, ifA(x)=x^22,theintervqal(2;2)isnotanisolatingintervqalforarealroGot9ofUUA(x),but(0;1000)is.!č98.23 VPurps3ose9TheSACLIB,realroGotcalculationpackqagesolvesnon-linearequationsinonevqariable:FIt9computes!OisolatingintervqalsfortherealroGotsofunivariateintegralpGolynomialsalongwith9theUUmultiplicityofeachroGot,anditre nestheisolatingintervqalstoanyspGeci edsize.!č98.33 VMethos3dsffandAlgorithms9F*orroGotisolationthreemethodsareavqailable./uThec}'oecientsignvariationmetho}'d(or:9mo}'di edUspenskymethod),is-basedonDescartes'ruleofsigns.OOTheCollins-L}'oosmethod9isUUbasedonRolle'stheorem.qSturm'smetho}'disbasedonSturmsequences.9Generally*,&theIcoGecientsignvqariationmethodismanytimesfasterthantheothertwo9methoGds.F*orhthecoecientsignvqariationmethodvqariousmainprogramsareprovidedto9accommoGdateUUdetailsofinputandoutputspeci cations.9F*orXthere nementofisolatingintervqalstoanyspGeci edprecisionasymbGolicversionof9Newton'sUUmethoGdisused.9GivenanarbitraryintegralpGolynomialIPRCH willcalculateallitsrealrootstospeci ed9accuracy*.FTheӣmultiplicityofeachroGotisalsocomputed.FThealgorithmusesthecoecient9sign^vqariationmethoGdtoisolatetherootsfromeachotherandthenappliesNewton'smethod9toUUre netheisolatingintervqalstothedesiredwidth.9GivenlasquarefreeintegralpGolynomialIPRIMXisolatesalltherealrootsfromeachother.9TheroGotsinsideaspeci edopenintervqalareisolatedbyIPRIMO.BothIPRIMandIPRIMO9usethecoGecientsignvqariationmethod.LOthermainalgorithmswhichusethismethod9areUUIPRIMSandIPRIMW.A40)C9TheCollins-LoGosmethodisimplementedinIPRICL:Givenanarbitraryunivqariatein- 9tegralpGolynomialIPRICLgproducesalistofisolatingintervqalsforitsrealroots.>These9intervqalsJhavetheadditionalpropGertythatthe rstderivqativeofAismonotoneoneachof9them.9AneimplementationofSturm'smethoGdisprovidedbyIPRIST:Givenasquarefreeuni-9vqariateUUintegralpGolynomialIPRISTproducesalistofisolatingintervqalsforitsrealroots.9RoGotsWofdi erentpolynomialscanbeisolatedfromeachotherusingtheprogramIPLRRI.9Reference:[QJeremy(hR.Johnson:Algorithmsjforp}'olynomialrealrootisolation.bT*echnical9ResearchcRepGortOSU-CISRC-8/91-TR21,\&1991. NTheOhioStateUniversity*,\&2036Neil9AvenueUUMall,Columbus,Ohio43210,Phone:q614-292-5813.!č98.43 VDe nitionsffofTferms9binaryTrationaln9umbQerWAUUrationalnumbGerUUwhosedenominatorisapowerUUof2.9in9terv\ral9/;AlistunivqariatepGolynomial,Fvariationsforstandardinterval.A43,C9iChapter 929cAlgebraic T{Num8b erArithmetic:99.13 VMathematicalffPreliminaries9AnalgebraicnumbGerisanumberthatsatis esarationalpolynomialequation./Analgebraic 9numbGerԫ %isrepresentedbyanirreduciblepGolynomial,A(x),suchԫthatA( z)Q=0.AԊreal9algebraicTnumbGer,!isarealnumbGerthatisalsoanalgebraicnumbGer,!anditisrepresentedby9anirreduciblepGolynomialandanisolatingintervqaltodistinguishitfromitsrealconjugates.9ThecollectionofalgebraicnumbGersformsa eldcontainingtherealalgebraicnumbGersasa9sub eld.o]SinceNA(x)isirreducible,Otheextension eldQ( z)obtainedbyadjoining Wtothe9rationalbnumbGer eldisisomorphictoQ[x]=(A(x))andelementsofQ( z)arerepresented9by/pGolynomialswhosedegreesarelessthanthedegreeofA(x).eIf 8isrealthenQ( z)isan9orderedUU eldandsigncomputationscanbGeperformedusingtheisolatingintervqalfor z.!č99.23 VPurps3ose9Then`SACLIB)Όalgebraicn`numbGerarithmeticpackqageprovidesalgorithmsforpGerformingarith-9meticvwithalgebraicnumbGers,>withvelementsofanalgebraicnumbGer eld,>andwithpoly-9nomials AwhosecoGecientsbelongtoanalgebraicnumber A eld.Therearealgorithmsfor9computingOthegcdoftwoOpGolynomialswithalgebraicnumberOcoecientsOandforfactoring9a pGolynomialwithalgebraicnumber coecients.YAlgorithms arealsoprovidedforperform-9ingsigncomputationsinarealalgebraicnumbGer eldandforisolatingtherealrootsofa9pGolynomialUUwithrealalgebraicnumberUUcoecients.!č99.33 VMethos3dsffandAlgorithms9AlgorithmsI0forpGerformingalgebraicnumberI0arithmeticuseresultantcomputations.MYLet9A(x)C=Pލ Ѿm% Ѿi=0aiTLx^iϲ=am CCQލ m% i=1 )[(xj i)bGetheintegralminimalpolynomialfor L=C 1oand9letdBq(y[ٲ)=Pލ USn% USjg=0Vbj6y^jY=bn&Qލn%jg=1䞲(yX j6)dbGetheintegralminimalpolynomialfor N4= 1|s.!The9minimalpGolynomialfor 爐+* 3isafactorofres2x(A(x);Bq(yBx))andtheminimalpGolynomial9for' k Cisafactorofresg`xpD(A(x);x^nq~Bq(y[=x)).:LetBq^U(y[ٲ)=Norm(Bq( z;y)),ٜandletQލ ,wt% ,wi=1KnB^q;ZiU(y)9bGe\theirreduciblefactorizationofBq^U(y[ٲ).Providedthenormissquarefreetheirreducible9factorization~ofBq( z;y[ٲ)o=Qލ zt% zi=1qgcd+s(B( z;y[ٲ);B^;ZiU(y[ٲ)).BIf~B^(y[ٲ)~isnotsquarefree,atransla-9tion,7oBq( z;yI!s ),is/computedwhosenormissquarefree.eRThefactorizationofBq( z;y[ٲ)can9bGeUUrecoveredfromthefactorizationofthetranslatedpGolynomial.9SACLIBFalsoqprovidesanalgorithmforcomputingaprimitiveelementofamultiple9extension eld.XLet and bGealgebraicnumbers andconsiderthemultipleextension eld9Q( z; ).^]Theprimitiveelementtheoremstatesthatthereexistsaprimitiveelement Psuch9that,VQ( z; )=Q( 8).dThealgorithmsANPEDE,LandANREPEprovideaconstructiveversionof9thisUUtheorem.9References:IR.G.K.LoGos:ComputingJinAlgebr}'aicExtensions,In\ComputerAlgebra,9SymbGolicUUandAlgebraicComputation",pages173{187.9JeremyʨR.Johnson:\mAlgorithmsforp}'olynomialrealrootisolation.T*echnicalʨResearch9RepGortDOSU-CISRC-8/91-TR21,H1991.lCTheOhioStateUniversity*,H2036NeilAvenueMall,9Columbus,UUOhio43210,Phone:q614-292-5813.A45.ȳC9BarryT*rager:Algebr}'aicF;actoringandRationalF;unctionIntegration,nIn\SYMSAC'76: 9ProGceedingsVofthe1976ACM1SymposiumonSymbolicandAlgebraicComputation",pages9219{226. 099.43 VDe nitionsffofTferms9algebraicTn9umbQerjRA^solution^ofarationalpGolynomialequation.lAnalgebraicnumber^ '9isиrepresentedeitherbyarationalminimalpGolynomialoranintegralminimalpGoly-'9nomial. 9algebraicTin9tegerfHAUUsolutionofamonicintegralpGolynomialequation.9realTalgebraicn9umbQerAArealRnumbGerthatisalsoanalgebraicnumbGer.ZqAArealalgebraic '9numbGer visrepresentedbyanintegralminimalpGolynomialandanacceptableisolating'9intervqal. 9rationalTminimalpQolynomial.ThezrationalminimalpGolynomialforanalgebraicnumber'9 ^ϲisUUtheuniquemonic,irreduciblerationalpGolynomialA(x)suchthatA( z)=0.9in9tegralTminimalpQolynomialRTheQintegralminimalpGolynomialforanalgebraicnumbGer'9 ^ϲisUUtheunique,pGositive,primitive,integralpGolynomialA(x)suchthatA( z)=0.9acceptableTisolatingin9terv\ralOnanisolatingintervqal,jI,forarealalgebraicnumbGer z,'9whereҵIiseitheraleft-opGenandright-closedstandardintervqaloraone-pGointintervqal.9algebraicT eldelemen9tanNrelementoftheextension eldQ( z).o{ N42Q( )Nrisrepresented'9byalist(r;Bq(y[ٲ)),#where N4=rGB( z)andrisarationalnumbGerandB(y[ٲ)isaprimitive'9integralpGolynomialwhosedegreeislessthanthedegreeoftheminimalpolynomial'9ofUU z. 099.53 VRepresentation9Thereareseveraldi erentrepresentationsforelementsofQ( z).LetA(x)bGetheintegral9minimalpGolynomialforanalgebraicnumber Zwithdego(A(x))=m.RAnelement ~ofQ( z)9canUUbGeuniquelyrepresentedby:r1.'9AUUrationalpGolynomial,Bq(x),whosedegreeislessthanmandsuchthatB( z)= .r2.'9Awpairؙ(r;}fe9B (x)),jwhererisarationalnumbGer,}fe9B (x)ؙisapGositiveprimitiveintegral'9pGolynomial,UUand N4=Bq( z)=r}fe9B]V( z).9Theݖdefaultrepresentationis(2). ThealgorithmAFCRrconvertsrepresentation(1)to(2),9andUUthealgorithmAFICRconvertsUUrepresentation(2)to(1).9LetXZ[ z]denotetheZ-moGdulewithbasis1; z; ^2;:::; ^m1މ. iElementsXofZ[ ]are9representedWbyintegralpGolynomialswhosedegreeislessthanm. KIf Ѳisanalgebraic9integer,?thenZ[ z]isaring.IfanalgorithmdoGesnotrequiredivisionorreductionbythe9minimalpGolynomial,0operationsinQ( z)canbereplacedwithoperationsinZ[ z].When9thisispGossible,CeciencyisgainedbyusingtheintegralrepresentationZ[ z].PAnimpGortant9exampleispGolynomialrealrootisolation.nRLetPc( z;y[ٲ)beapolynomialinQ( z)[y[ٲ]andlet9d0bGethegreatestcommondivisorofthedenominatorsofthecoecientsofPc( z;y[ٲ).YThen9dPc( z;y[ٲ)hisinZ[ ;y[ٲ]andhasthesameroGotsasPc( ;y[ٲ).Moreover,cthehcoGecientsign9vqariationRmethoGdforrealrootisolationonlyusesoperationswhichcanbeperformedin9Z[ z].9ThenameofalgorithmswhichopGerateinZ[ z]beginwiththelettersAM.Thealgorithm9AMPSAFP2޲(r;Pc)ҰcomputesapGolynomial}feP9Ѹ2Z[ z;X1;:::;XrG]Ұwhichissimilartothepoly-9nomialO P*2Q( z)[X1;:::;XrG].oThealgorithmAIFANOcomputesanalgebraicinteger~feog ]such9thatUUQ( z)=Q(~feog o).A46/C99.63 VFfunctions9AlgebraicTNum9bQerArithmetic'9ANIIPE(M,I,N,J,t,L;?S,k,K)Algebraic5numbGerisolatingintervqalforaprimitive =9element'9ANPROD(A,I,B,J;?C,K)yAlgebraicUUnumbGerproduct'9ANSUM(A,I,B,J;C,K)AlgebraicUUnumbGersum'9ANPEDE(A,B;C,t)9ŲAlgebraicUUnumbGerprimitiveelementforadoubleextension'9b?<-ANREPE(M,A,B,t)yAlgebraic}numbGerrepresentelementofaprimitiveexten-=9sion9AlgebraicTFieldArithmetic'9c?<-AFDIF(a,b)9ŲAlgebraicUUnumbGer eldelementdi erence'9b?<-AFINV(M,a)9ŲAlgebraicUUnumbGer eldelementinverse'9b?<-AFNEG(a)u˲AlgebraicUUnumbGer eldnegative'9c?<-AFPROD(P,a,b)AlgebraicUUnumbGer eldelementproGduct'9c?<-AFQ(M,a,b)9ŲAlgebraicUUnumbGer eldquotient'9c?<-AFSUM(a,b)9ŲAlgebraicUUnumbGer eldelementsum9RealTAlgebraicNum9bQerSignandOrderComputation'9t?<-AFCOMP(M,I,a,b)yAlgebraicUUnumbGer eldcomparison'9s?<-AFSIGN(M,I,a)AlgebraicUUnumbGer eldsign'9s?<-AMSIGN(M,I,a)AlgebraicUUmoGdulesign'9AMSIGNIR(M,I,a;s,Is)yAlgebraicUUmoGdulesign,intervqalre nement9AlgebraicTP9olynomialArithmetic'9C?<-AFPAFP(r,M,a,B)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld =9elementUUproGduct'9C?<-AFPAFQ(r,M,A,b)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld=9elementUUquotient'9C?<-AFPDIF(r,A,B)AlgebraicUUnumbGer eldpolynomialdi erence'9Ap?<-AFPMON(r,M,A)9AlgebraicUUnumbGer eldpolynomialmonic'9B?<-AFPNEG(r,A)y²AlgebraicUUnumbGer eldpolynomialnegative'9C?<-AFPPR(r,M,A,B)9AlgebraicUUnumbGer eldpolynomialproduct'9AFPQR(r,M,A,B;?Q,R)9AlgebraicUUnumbGer eldpolynomialquotientandremainder'9C?<-AFPSUM(r,A,B)AlgebraicUUnumbGer eldpolynomialsum9AlgebraicTP9olynomialDi erentiationandIntegration'9B?<-AFPDMV(r,M,A)AlgebraicUUnumbGer eldpolynomialderivqative,mainvariable'9B?<-AFPINT(r,M,A,b)yAlgebraicUUnumbGer eldpolynomialintegration'9B?<-AMPDMV(r,M,A)AlgebraicUUmoGdulepolynomialderivqative,mainvariable9AlgebraicTP9olynomialF actorization'9F?<-AFUPFAC(M,B)AlgebraicUUnumbGer eldunivqariatepolynomialfactorizationA470=C'9L?<-AFUPSF(M,A)y²Algebraic:^numbGer eldunivqariatepolynomialsquarefreefactor- =9ization9AlgebraicTP9olynomialGreatestCommonDivisors'9AFUPGC(M,A,B;?C,Ab,Bb)Algebraic2&numbGer eldunivqariatepolynomialgreatest=9commonUUdivisorandcofactors'9B?<-AFUPGS(M,A)y²AlgebraicUUnumbGer eldpolynomialgreatestsquarefreedivisor9AlgebraicTP9olynomialNormComputation'9L?<-AFPNIP(M,A)y²Algebraic+numbGer eldpolynomialnormalizetointegralpoly-=9nomial'9Bs?<-AFPNORM(r,M,B)yAlgebraicUUnumbGer eldpolynomialnorm.9AlgebraicTP9olynomialSubstitutionandEv\raluation'9C?<-AFPCMV(r,M,A,B)yAlgebraicY1numbGer eldpolynomialcompositioninmain=9vqariable'9B?<-AFPEMV(r,M,A,a)yAlgebraicnumbGer eldpolynomialevqaluationofmainvari-=9able'9B?<-AFPEV(r,M,A,i,a)AlgebraicUUnumbGer eldpolynomialevqaluation'9B?<-AFPME(r,M,A,b)9AlgebraicUUnumbGer eldpolynomialmultipleevqaluation'9s?<-AFUPSR(M,I,A,c)yAlgebraic|numbGer eldunivqariatepolynomial,$signatara-=9tionalUUpGoint'9s?<-AMUPBES(M,I,A,c)Algebraic moGduleunivqariatepolynomial,<binaryrational=9evqaluationUUofsign.'9s?<-AMUPSR(M,I,A,c)yAlgebraic:imoGduleunivqariatepolynomial,?signatarational=9pGoint'9B?<-IPAFME(r,M,A,b)yIntegralpGolynomial,*malgebraicnumbGer eldmultipleevqalu-=9ation'9B?<-RPAFME(r,M,A,b)yRationalzpGolynomial,5algebraicnumberz eldmultipleevqal-=9uation9AlgebraicTP9olynomialT ransformations'9B?<-AMUPBHT(A,k)Algebraic8moGduleunivqariatepolynomialbinaryhomothetictrans-=9formation'9B?<-AMUPNT(A)zȲAlgebraicUUmoGduleunivqariatepolynomialnegativetransformation'9B?<-AMUPTR(A,h)y²AlgebraicUUmoGduleunivqariatepolynomialtranslation'9B?<-AMUPTR1(A)9ŲAlgebraicUUmoGduleunivqariatepolynomialtranslationby19RealTAlgebraicP9olynomialRealRoQotIsolation'9N?<-AFUPBRI(M,I,L)9Algebraic%numbGer eldunivqariatepolynomialbasisrealroot=9isolation'9AFUPMPR(M,I,B,J,L;?Js,j)yAlgebraicnumbGer eldpolynomialminimalpolyno-=9mialUUofarealroGot'9b?<-AFUPRB(M,I,A)AlgebraicUUnumbGer eldunivqariatepolynomialrootbound'9L?<-AFUPRICL(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso-=9lation,UUCollins-LoGosalgorithmA4815C'9L?<-AFUPRICS(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso- =9lation,UUcoGecientsignvqariationmethod'9a?<-AFUPRL(M,A)y²Algebraic- numbGer eldunivqariatepolynomial,brootofalinear=9pGolynomial'9n?<-AFUPVAR(M,I,A)9AlgebraicUUnumbGer eldunivqariatepolynomialvqariations'9AMUPMPR(M,I,B,J,L;?Js,j)yAlgebraicW moGduleunivqariatepolynomialminimalpoly-=9nomialUUofarealroGot'9L?<-AMUPRICS(M,I,A)yAlgebraicmoGduleunivqariatepolynomialrealrootisolation,=9coGecientUUsignvqariationmethod'9AMUPRICSW(M,I,A;L,Is)AlgebraicmoGduleunivqariatepolynomialrealrootisola-=9tion,UUcoGecientsignvqariationmethod,weaklydisjointintervqals'9AMUPRINCS(M,I,A,a,b;L,Is)AlgebraicmoGduleunivqariatepolynomialrootisola-=9tion,UUnormalizedcoGecientsignvqariationmethod'9AMUPVARIR(M,I,A;?n,J)Algebraic>moGduleunivqariatepolynomialvqariations,Binter-=9vqalUUre nement9AlgebraicTP9olynomialRealRoQotRe nement'9Js?<-AFUPIIR(M,I,B,J)AlgebraicnumbGer eldpolynomialisolatingintervqalre- =9 nement'9AFUPIIWS(M,I,A,L)Algebraicf9numbGer eldunivqariatepolynomialisolatinginter-=9vqalsUUweaklydisjointtostronglydisjoint'9AFUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹AlgebraicnumbGer eldunivqariatepolyno-=9mialUUrealroGotlistseparation'9Js?<-AFUPRRI(M,I,A,B,J,s1,t1)Algebraic~numbGer eldunivqariatepolynomial=9relativeUUrealroGotisolation'9AFUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicnumbGer eldunivqariatepoly-=9nomialUUrealroGotseparation'9Js?<-AMUPIIR(M,I,B,J)Algebraic^=moGdulepolynomialisolatingintervqalre ne-=9ment'9AMUPIIWS(M,I,A,L)Algebraic8moGduleunivqariatepolynomialisolatingintervqalsweakly=9disjointUUtostronglydisjoint'9AMUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹Algebraic8moGduleunivqariatepolynomialreal=9roGotUUlistseparation'9AMUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicmoGduleunivqariatepolynomial=9realUUroGotseparation9Con9version'9Ap?<-AFCR(A)u˲AlgebraicUUnumbGer eldelementconvertrepresentation'9a?<-AFFINT(M)zȲAlgebraicUUnumbGer eldelementfrominteger'9a?<-AFFRN(R)u˲AlgebraicUUnumbGer eldelementfromrationalnumbGer'9Ap?<-AFICR(A)zȲAlgebraicUUnumbGer eldelementinverseconvertrepresentation'9B?<-AFPCR(r,A)9ŲAlgebraicUUnumbGer eldpolynomialconvertrepresentation'9B?<-AFPFIP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromintegralpolynomial'9B?<-AFPFRP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromrationalpolynomial'9B?<-AFPICR(r,A)y²AlgebraicHnumbGer eldpolynomialinverseconvertrepresenta- =9tionA492 }C'9AIFAN(M;?mh,Mh)9ŲAlgebraicUUintegerfromalgebraicnumbGer'9B?<-AMPSAFP(r,A)Algebraic}moGdulepolynomialsimilartoalgebraic eldpolyno- =9mial'9ANFAF(M,I,a;?N,J)AlgebraicUUnumbGerfromalgebraicnumbGer eldelement9Input/Output'9AFDWRITE(M,I,b,n)AlgebraicUUnumbGer eld,decimalwrite'9AFPWRITE(r,A,V,v)AlgebraicUUnumbGer eldpolynomialwrite'9AFUPWRITE(A,vA,vc)AlgebraicUUnumbGer eldunivqariatepolynomialwrite'9AFWRITE(A,v)pyβAlgebraicUU eldelementwrite'9ANDWRITE(M,I,n)9ŲAlgebraicUUnumbGerdecimalwriteA503C9iAppendix A29cCalling T{GDtHGcmr17GSAYCLIBgW$cFunctions T{from9C49ThischapterdescribGeshowtheSACLIB*&environmenthastobGesetupforSACLIB*&functions 9toUworkcorrectly*.sOWeUwillstartwithaquickintroGductiontothebasicsusingasample9programinSectionA.1.InSectionA.2wedescribGethestepsnecessaryforcombining9dynamicalloGcationwithSACLIB*Wlistprocessing.;SpecialcarehastobetakenwithSACLIB9datastructuresaddressedbyglobalvqariables.мThisisexplainedinSectionA.3.Finally*,9SectionA.4describGeshowSACLIB*c`canbGeinitializedwithoutusingsacMain(),andSection9A.5UUgivessomeinformationonerrorhandlinginSACLIB(G!.!č9A.17ByAffSampleProgram9FigureUUA.1showsthebasiclayoutofaprogramusingSACLIB+vfunctions.9Note%3thattheonlythingwhichisdi erentfromordinaryC%'programsarethe#include9"saclib.h"ܲstatementandthefactthatthemainroutineiscalledsacMaininsteadofmain.9OneimpGortantpointisthattheargcandargvvqariablespassedtosacMainwillnot9contain allcommandlineparameters.Parametersstartingwith\+"are lteredoutand9usedforinitializingsomeSACLIB-globalvqariables.VInformationontheseparametersis9writtenUUoutwhenaprogramiscalledwiththeparameter\+h".9InSectionA.4wegivesomemoredetailsontheinitializationsdonebGeforesacMainis9called.9A.27ByDynamicffMemoryAllos3cationinSACLIB9WhenHoneneedstor}'andomly(asoppGosedtosequentially)accesselementsinadatastructure,9onemayprefertousearraysinsteadoflists.7IfthesizeandthenumbGerofthesearraysis9determinedatruntime,theyhavetobGedynamicallyallocated.W`F*urthermore,onemayneed9toUUmixthemwithlists,inwhichcasethegarbagecollectormustbGeabletohandlethem.9TheQconceptoftheGCAQc(GarbageCollectedArray)handleprovidesthiskindofdynamic9dataUUstructure.9Neverthelessitisrecommendedto rstcheckwhetheritmightbGepossibletoreformulate9the0algorithmsothatlistscanbGeusedinsteadofarrays.BInmanycasesoneusesarraysonly9bGecause {oneismorefamiliarwiththem,talthoughlistsmaybebettersuitedtotheproblem9atUUhand.9ThehfollowingfunctionsaretobGeusedforinitializingGCA39=9GCEff&fǫCHECKe...WThiswillcausethegarbagecollectortocheckthecontentsofthe=9arrayUUforlistorGCAhandles.>39=9GCEff&fǫNOEff&fCHECKm...Withthissetting,thegarbagecollectorwillignorethecontents=9ofthearray*.$Therefore,ߤGCEff&fǫNOEff&fCHECKvshouldonlybGeusedifitisguaranteed=9thatthearraywillnevercontainlistorGCAhandles(e.g.ifitisusedtostore=9BETA-digits).'9If^youarenotsurewhichonetochoGose,HuseGCEff&fǫCHECK,asinappropriateuseof'9GCEff&fǫNOEff&fCHECKUUmaycausetheprogramtocrash.9GCASET(A,i,a)Wy̲setsp!thei-thelementofthearrayreferencedbytheGCAphandleAtothe'9vqalueUUa.qHere,acanbGeanyWord.9a?<-GCAGET(A,i)g9òreturns^_thevqalueofthei-thelementofthearrayreferencedbythe'9GCAUUhandleA.A525*C9FigureUUA.2showshowthemechanismofGCAhandlesisused.I9Hff4. 4.4.4Word,A,L,I,i;4.4.4.9Step2: s,/*Herewedosomeallocation.*/4L=NIL;4do{=ySWRITE("Enteraninteger(0toquit):");I=IREAD();=yA=GCAMALLOC(10,GC_CHECK);=yfor(i=0;i<10;i++)FGCASET(A,i,IDPR(I,i+1));=yL=COMP(A,L);4}4until(ISZERO(I));4.4.4.OGffp\FigureUUA.2:qSamplecoGdeusingGCAhandles.99The6UcoGdeinsidethedo/untilloopreadsanintegerI,allocatesanarrayAof10Words, 9storesothevqalueI8(i+1)3atpGositioniinthearrayusingGCASET(),vandthenappendsa9newUUelementcontainingtheGCAhandleofthearrayAtothebGeginningofthelistL.9Alwaysn\remembGerthatGCAn"handlesmustbGeusedwheneveryouwanttostorereferences9toHSACLIB.$\structuresH(i.e.lists)indynamicallyalloGcatedmemory*.=Usingthestandard9UNIX=functionTmalloc()maycrashyourprogramsometimeafteragarbagecollectionor9atUUleastcausesomestrangebugs.9F*urthermore,GCA~handlesarealsoimplementedinsuchawaythattheycanbGeused9as{inputtolistproGcessingfunctionsinplaceswhereob8jectsareregardedasdata.E.g.9intheCOMP()function,aGCAȢhandlecanbGeusedasthe rstargument(theelementto9bGeUappendedtothelist)butnotasthesecondargument(thelistbeingappendedto).9Nevertheless)notethatthefunctionsLWRITE(),?EXTENT(),^andORDER()arenotde ned9forUUlistscontainingGCAhandles.9ThereEaretwoEmorefunctionstakingGCA6handlesasinput.%It isnotr}'ecommended to9c}'allthesefunctionsdirectly.qDzTheyUUarelistedhereonlyforcompleteness.9p?<-GCA2PTR(A)aƲgives0accesstothearrayreferencedbyaGCA!handle.%YIttakesaGCA'9handleSasinputandreturnsaCCpGointertothearrayofWordsalloGcatedbyaprevious'9callPtoGCAMALLOC().p=ThisCp}'ointermustnotbeusedasinputtoSACLIB,functions'9or'stor}'edinSACLIB+Ajlists.JRather,VitcanbGeusedtoaddresstheelementsofthearray'9directly*.'9Notesthatthisisnottherecommendedwaysofaccessingarrayelements.̿Ifyouover-'9writethevqariablecontainingtheGCAQhandle(e.g.anoptimizingcompilermight'9removeVitifitisnotusedanymore),youVcanstillaccessthearrayusingtheC8pGointer,'9butUUthegarbagecollectorwillfreethealloGcatedmemorythenexttimeitisinvoked.9GCAFREE(A)Gղcan8bGeusedtoexplicitlyfreethememoryallocatedbyGCAMALLOC().hIttakes'9aUUGCAhandleasinputwhichbGecomesinvqalidafterthecall.A5365C'9Y*ouf7shouldconsidercallingGCAFREE()onlyincaseswhereyouaresureyouwillnot '9need(thememoryreferencedbyaGCAhandleanymoreandwanttodealloGcateit'9immediatelyinsteadofputtingthiso untilthenextgarbagecollectionoruntilthe'9SACLIBOcleanup.!č9A.37ByDeclaringffGlobalVfariablestoSACLIB9Ifyouareusingglobalvqariables,arrays,orstructurescontainingSACLIB.OBlistorGCA9handles*otherthanthosede nedwithinSACLIB+F(in\external.c"),2youhavetomakethem9visibleUUtothegarbagecollector.qThisisdonebythefunctionGCGLOBAL().9FigureUUA.3showshowthesemacrosareused:UI9Hff9#include"saclib.h" 9Word!GL=NIL;9Word!GA=NIL;9char!buffer[81];9int%̰flag;9intsacMain(argc,argv)4intargc;4char**argv;9{.../*Variabledeclarations.*/9Step1: s,/*Declareglobalvariables.*/4GCGLOBAL(&GL);4GCGLOBAL(&GA);9Step2: s,/*Initializeglobalvariables.*/4GA=GCAMALLOC(10,GC_CHECK);4.4.4.OGffŲFigureUUA.3:qDeclaringglobalvqariables.99First0twoglobalvqariablesGLandGAoftypGeWord,kaglobalarraybufferof81characters,9andUUaglobalvqariableflagoftypGeintaredeclared.9TheNvqariablesGL(andGAaredeclaredtothegarbagecollectorbycallstoGCGLOBAL()9b}'eforetheyareinitialized.Notethatforthevqariablesbufferandflagthisisnotneces-9saryJbGecausetheywillnotholdSACLIB+`listorGCA?handlesatanytimeduringprogram9execution.9Calling GCGLOBAL onapGointertoaglobalvqariabletellsthegarbagecollectornottofree9cells5orarraysreferencedbythecorrespGondingvqariable.fY*oushouldbecarefulaboutnot9missinganyglobalvqariableswhichoughttobGedeclared:?whiledeclaringtoomuchdoesnot9reallyUUmatter,declaringtoGolittlewillcauseweirdbugsandcrashes...A547BݠC9A.47ByInitializingffSACLIB>HbyffHand9IfnitisdesiredtohavencompletecontrolovercommandlineparametersorifSACLIB*isused 9onlyVaspartofsomebiggerapplication,WWthenthenecessaryinitializationscanalsobGedone9directlyUUwithoutusingsacMain().9ThereUUarethreefunctionswhichareofinterest:9ARGSACLIB(argc,argv;ac,av)doGesrargumentprocessingforSACLIB*commandlineargu-'9ments.bThese&muststartwitha\+"andareusedtosetvqariousglobalvariables.bThe'9argument\+h"causesausagemessagetobGeprinted(byINFOSACLIB()).Thenthe'9programUUisabGorted.'9ARGSACLIBtakes.theargcandargvparametersofmain()asinput.TRItreturnsthe'9numbGerc!ofnon-SACLIB)Tcommandlineargumentsinacandapointertoanarray'9ofnon-SACLIB*commandlineargumentsinav. gThismeansthattheoutputof'9ARGSACLIB()issimilartoargcandargvwiththeexceptionthatallargumentsstart-'9ingUUwith\+"haveUUbGeenremoved.9BEGINSACLIB(p)\ɲinitializessSACLIB-bysalloGcatingmemory*, settingthevqaluesofvarious'9global2vqariables,9etc.f>ItmustbGepassedtheaddressofavariableloGcatedonthestack'9bGeforeanyvqariablecontainingSACLIB+'jstructuressuchaslistsorGCAhandles.^EOne'9vqariableUUwhichful llsthisrequirementisargc,forexample.9ENDSACLIB(f)R9ϲfreesthememoryalloGcatedbyBEGINSACLIB().ItmustbGepassedoneof'9theUUfollowingvqalues(whichareconstantsde nedin\saclib.h"):39=9SACEff&fǫFREEMEMֲ..._ThiswillcauseittoalsofreeallremainingmemoryalloGcated=9byUUGCAMALLOC().39=9SACEff&fǫKEEPMEM3...1ThiswillcauseitnottofreetheremainingmemoryalloGcatedby=9GCAMALLOC().]Nevertheless,#allMGCA=handlesbGecomeinvqalidafterENDSACLIB()=9hasbGeencalled,qsothememorycanonlybeaccessedbyCpointerswhichwere=9initializedkbycallstoGCA2PTR()b}'eforekcallingENDSACLIB().HF*urthermore, if=9anyofthearrayscontainslistorGCAhandles, thesewillalsobGecomeinvqalid, so=9keepingWthealloGcatedmemoryonlymakessensewhenthearrayscontainBETA-=9orUUGAMMA-digits.=9DealloGcationR\thenhastobedonebythestandardUNIXRfunctionfree(),(because=9GCAFREE()UUonlyworkswhentheSACLIB+venvironmentisvqalid.9FigureA.4givesanexampleofhowtheSACLIB,environmentcanbGeinitialized,Cused,9andUUremovedinsideafunction.9ThefunctionsymbolicEff&fǫcomputation()inthisexampleencapsulatesSACLIB*Maspartof9somefbiggerapplicationwhosemainroutineismain()insteadofsacMain().F*romStep29on`theSACLIB+*environment`isinitializedandanySACLIB+*functionmaybGeused.^Outside9theareaenclosedbyBEGINSACLIB?/ENDSACLIB,callstoSACLIB+functionsmaycrashthe9program.!č9A.57BySACLIBp[ErrorffHandling9SACLIB7Xfunctions,donotcheck,whethertheparameterspassedtothemarecorrectand9ful lltheirinputspGeci cations.Callingafunctionwithinvqalidinputswillmostprobably9causeUUtheprogramtocrashinsteadofabGortinginacontrolledway*.9Nevertheless,there_aresituationswhereSACLIB)functionsmayfailandexittheprogram9cleanlyٖwithanerrormessage.F*orexample,:thisisthecasewhenaninputfunctions9discoversUUasyntaxerror.A558LCiX-9Hff9#include"saclib.h" 9voidsymbolic_computation()9{4WordXstack;9Step1: s,/*InitialiseSACLIB.*/4BEGINSACLIB(&stack);9Step2: s,/*UseSACLIB.*/4.4.4.9Step3: s,/*RemoveSACLIB.*/4ENDSACLIB(SAC_FREEMEM);9}OGffTiFigureUUA.4:qSamplecoGdeforinitializingSACLIBbyhand.9AlljEerrorhandling(i.e.writingamessageandabGortingtheprogram)isdonebythe 9functionCFAIL().IfsomemoresophisticatederrorproGcessingisdesired,thesimplestway9isUUtoreplaceitbyacustomwrittenfunction.!č9A.67ByCompiling9TheSACLIB*header lesmustbGevisibletothecompilerandthecompiledSACLIB*library9must4bGelinked.cHowthisisdoneisexplainedinthe\AddendumtotheSACLIB-4User's9Guide",UUwhichshouldbGesuppliedbythepGersoninstallingSACLIB(G!.9A9{pGoint9worthmentioningisthefactthatseveralSACLIB+dfunctionsarealsode nedas9macros.uBydefault,themacroversionsareused,butthereisaconstantforswitchingon9theCfunctionversions:NOEff&fǫSACLIBEff&fMACROSswitcheso allmacrosexceptforFIRST,RED,9SFIRST,SRED,ISNIL,GCASET,GCAGET.TheseelementarylistandGCA²functionsarealways9de nedUUasmacros.9IfUUyouwanttousethisconstant,youmustaddthestatement'9#define?NOEff&fǫSACLIBEff&fMACROS9b}'eforeUUyouincludethe le\saclib.h". 9Alternatively*,,you"canusethe\-D"optionoftheCcompiler(seethe\Addendumto9theUUSACLIB+vUser'sUUGuide"formoreinformation).A569]NC9iAppendix B29GISAYCDLc: pAn T{In8teractiveInterface9to T{GSAYCLIB:9B.16WhatffisISAC&j?9ISAC(Jis8asmallexpGerimentalinteractiveinterfacetoSACLIB'*,qallowingsimpleread--eval--write 9cyclesUUofinteraction.9Thesystemisdesignedandimplementedinthemoststraightforwardway*, sothatits9sourcecoGdecanbeusedasanexampleoratutorialforthosewhowanttoquicklywrite9aninteractivetestenvironmentfortheirSACLIB.basedfunctionsorintendtodevelop9professionalUUinterfacestoSACLIB(G!. $9B.26Supps3ortedffSACLIB>HAlgorithms9AlltheSACLIB,libraryalgorithmsandmacrosareaccessible.,kNILandBETAareavqailable9asUUconstants. $9B.36CommandffLineOptions9ISAC(atakes thestandardSACLIB+ commandlineoptionsforinitializingvqariousglobalvari-9ables.qInUUorderto ndoutwhatisavqailable,issuethecommandM9isac?+h $9B.46InterfaceffFfunctionality9AnEnISAC 'PsessionEnconsistsofoneormorestatements.BEveryEnstatementmustendwitha9semicolonUU`;'.qAstatementcanbGeoneofthethreekinds:9'9commandP9'9call9'9assignment9TheUUcommandssuppGortedinthisversionare:N8,9quit;:F*orUUquittingthesession.p,9vars;:F*ordisplayingthecontentsofthevqariables.V*aluesare :displayedUUininternalSACLIB+vformat.A57:eYC,9help?[ algName]?;:F*ordisplayingageneralhelporanalgorithm.23Forexam- :ple,inordertodisplaythealgorithmIPRODݲ,issuethethe:command: help?IPROD;p,9view?algName;:F*orUUdisplayinganalgorithmwiththeeditorvi(1).,9save?fileName;:F*orsavingthecurrentstateofthesession(i.e.Uthevqariable :binding)UUtoa le.,9restore?fileName;:F*orUUrestoringthestateofasessionfroma le.N89AccallcstatementisacalltoanyproGceduresorfunctionsintheSACLIB)rlibrary*.!GForcexample,-IPFAC(r,A;?s,c,F);-IPWRITE(r,IPSUM(r,A,B),V);9AnUUassignmentstatementisoftheform:-var?:=expression;9F*orUUexample,-A?:=IPROD(a,ISUM(b,c));-a?:=2*3+4;-a?:=3%2;!č9B.56InterfaceffGrammar9Belowקwegiveacontext-freegrammarforasession.W*ehavefollowedthefollowingcon-9ventions:9'9UppGer-caseUUstringsandquotedstringsdenotetokens,9'9Lower-caseUUstringsdenotenon-terminals.9session89:?statement89|?sessionstatement89;9statement89:?command';'89|?proc_call';'89|?assignment';'89;9command89:?IDENT89|?IDENTCMDARGS89;9proc_call89:?IDENT'('proc_arg_star')'89;9assignment89:?IDENT':='exprA58;lРC89; 9proc_arg_star89:?val_star89|?val_star';'ref_star89;9val_star89:?/*empty*/89|?val_plus89;9val_plus89:?expr89|?val_plus','expr89;9ref_star89:?/*empty*/89|?ref_plus89;9ref_plus89:?ref89|?ref_plus','ref89;9ref89:?IDENT9expr89:?expr'+'expr89|?expr'-'expr89|?expr'*'expr89|?expr'/'expr89|?expr'%'expr89|?'+'expr89|?'-'expr89|?'('expr')'89|?func_call89|?atom89;9func_call89:?IDENT'('func_arg_star')'89;9func_arg_star89:?val_star89;9atom89:?IDENT89|?INTEGERA59<sC89;A60=wC9iAppendix C29cNotes T{ontheIn8ternalWorkings9of T{GSAYCLIB:9C.16Lists,ffGCAHandles,andGarbageCollection9C.1.1:yImplementationofListsuT9When*CSACLIB+FRis*Cinitialised,2thearraySPACEcontainingNU+1WordsisalloGcatedfromthe 9heap.ewThis0farrayisusedasthememoryspaceforlistproGcessing.Listsarebuiltfromc}'ells,9whicharepairsofconsecutiveWordsthe rstofwhichisatanoGddpositionintheSPACE9array*.BList;handlesb(\pGointers"tolists)arede nedtobGeBETAplustheindexofthe rstcell9ofthelistintheSPACEarraywiththehandleoftheemptylistbGeingNIL(whichisequal9toUUBETA).FigureC.1showsthestructureoftheSPACEarray*.`~99.SPACE.32fdGO line10QVV*eSfeiʟfeifefefeiʎtfefefefefefe932fdй32fd932fdӹ32fd932fd932fdй32fd932fdӹ32fd932fdع< lcircle10p9pp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdSfeKʟfeKfefefeKʎfefefe-fe8卍9V*alueUUofthe T9SACLIB Ǎ9listUUhandle:qBETA+j0y135tfe32v32fe32Ήfe|932fe32Ήfe32fefe32932feǍ|cellfe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe3232fe32Ήfe932fe32Ήfe32feΆfe32932feǍcellKNU-3KNU-1fe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe32 32fe32--Ήfe&932fe32--Ήfe/32fe<fe325932feǍ&cell FigureUUC.1:qTheSPACEarray*.r9The rstWordofeachcellisusedtostorethehandleofthenextcellinthelist(i.e.9thevqaluereturnedbyRED()),RwhilethesecondWordcontainsthedataofthelistelement9representedbythecell(i.e.thevqaluereturnedbyFIRST()).FigureC.2givesagraphical9representationUUofthecellstructureforasamplelist.qThearrowsstandforlisthandles.L~9L"fe"9?ppp32fd932fd32fd932fd 32fd32fd932fd32fd932fd 32fd!ӎfe(ʟfe(fefefe(ʎ6feJ932fdK32fdM932fdN32fdP932fdJ932fdK32fdM932fdN32fdP932fdQpVp[pQpVp[p[32fd]932fd^32fd`932fda32fd[32fd]932fd^32fd`932fda32fdbӎfe(ʟfe(fefefe(ʎwfe932fd32fd932fd32fd932fd932fd32fd932fd32fd932fdpppppp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe932fd͹32fd932fdй32fd932fd932fd͹32fd932fdй32fd932fdӹpعpݹpӹpعpݹpݹ32fd932fd32fd932fd32fdݹ32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe 932fd32fd932fd32fd932fd 932fd32fd932fd32fd932fdpppppp32fd 932fd!32fd#932fd$32fd32fd 932fd!32fd#932fd$32fd%ӎfe(ʟfe(fefefe(ʎ:feN932fdO32fdQ932fdR32fdT932fdN932fdO32fdQ932fdR32fdT932fdUpZp_p,9q,fe,932fd7cfec9?m9qmfem932fd7fe9?9qfe932fd7&fe&9?㍑=19YNIL㍒8㍒99(YNIL㍒A69qfe92fddfe96V>FigureUUC.2:qThecellstructureofthelistL=(1;(9;6);8).9AspalreadymentionedinChapter2,vatomsarerequiredtobGeintegersawithBETA<9a7w]C9tothememoryaddressesofSPACE[BETA]andSPACE[BETA+1],respGectively*.AThisis 9usedqbythefunctionsFIRST(L),whichreturnsSPACEB1[L],andRED(L),whichreturns9SPACEB[L].9C.1.2:yImplementationofGCAHandlesuT9When'SACLIB.Vis'initialised, [thearrayGCASPACEcontainingNUp+!k1structuresoftypGe9GCArray<>isalloGcated.&A<GCAh!handleisde nedtobeBETApplustheindexofthecorre-9spGondingUUGCArraystructureintheGCASPACEarray*,withthenullhandlebGeingNIL.9TheUUGCArraystructurecontainsthefollowing elds:Cy9'9nextoʲ...taWord,usedforlinkingemptyGCArraystotheGCAAVAILlistandformarking'9(seeUUSectionC.1.3).!9'9flagUU...aWord,settooneofGCEff&fǫCHECKandGCEff&fNOEff&fCHECK(seeSectionC.1.3).9'9lenUU...aWord,thelengthofthearrayinWords.9'9arrayUU...aCpGointertoanarrayofWordsofsizelen.9When9GCAMALLOC()(iscalled,rittakesthe rstGCArrayfromtheGCAAVAILlistand 9initializesUUits elds.9GCA2PTR()UUsimplyreturnstheCpGointerinthearray eld.9GCAFREE()iSdealloGcatesthememoryaddressedbythearray eld,nRsetsall eldstozero,9andUUlinkstheGCArraytothebGeginningoftheGCAAVAILlist.9C.1.3:yTheGarbageCollectoruT9Garbage]Xcollectionisinvoked]XwhenCOMP()orGCAMALLOC()callGC()inthecaseofAVAIL9orUUGCAAVAILbGeingNIL.ThegarbagecollectorconsistsoftwoUUparts:9'9The'functionGC()issystemdepGendent. T=Itmustensurethatthecontentsofall'9proGcessor registersarepushedontothestackandpassalignmentinformationandthe'9addressUUoftheendofthestacktoGCSI().!9'9GCSI()visthesystemindepGendentpartofthegarbagecollector.ժItusesamark-and-'9sweepUUmethoGdforidentifyingunusedcells:'9Marking:ZTheproGcessorregisters,Wthesystemstack,andthevqariablesandGCA=9arraysItowhichpGointersarestoredintheGCGLOBALSlistaresearchedfornon-=9NIL listandGCAhandles.AAllthecellsaccessiblefromthesehandlesaremarked=9byUUacalltoMARK(). ލ=9If̓alisthandleisfound,thisfunctiontraverses̓thecellsofthelist,markingthem=9bynegatingthecontentsoftheir rstWord.\IfthesecondWordofacellcontains=9aUUlistorGCAhandle,MARK()callsitselfrecursivelyonthishandle.=9InCcaseofaGCAChandle,ZtheGCAcelladressedbythehandleismarkedby=9negating~thecontents~ofitsnext eld. AIfthecell'sflag eldisnotsetto=9GCEff&fǫNOEff&fCHECK,theWordsinthearraypGointedtobythearray eldaresearched=9forUUlistorGCAhandleswithMARK()callingitselfrecursivelyonvqalidhandles.!'9Sw9eeping:^:InUUthesweepstep,theAVAILandGCAAVAILlistsarebuilt:=9Cells~inSPACEwhose rstWordcontainsapGositivevqaluearelinkedtotheAVAIL=9list.[If/the rstWordofacellcontainsanegativevqalue, jitismadepGositiveagain=9andUUthecellisnotchangedinanyotherway*.=9CellsinGCASPACEwhosenext eldcontainsapGositivevqaluearelinkedtothe=9GCAAVAILlistandthearraypGointedtobythearray eldisdealloGcated.Ifthe=9next4Ų eldcontainsanegativevqalue,;HitismadepGositiveagainandthecellisnot=9changedUUinanyotherway*.A62?C9IfmtheAVAILlistcontainsnomorethanNU g=RHOdcellsattheendofgarbagecollection,an 9errorUUmessageiswrittentotheoutputstreamandtheprogramisabGorted.!9C.26ConstantsffandGlobalVfariables9This+sectionlistsSACLIB,R"typGes,constants,and+globalvqariables.HAlltypGesandconstants9areqde nedin\saclib.h",?8\sactypGes.h",andq\sacsys.h".Externalvqariablesarede nedin9\external.c"UUanddeclaredasexternalin\saclib.h".9Thei%averageuserofSACLIB-functionsshouldnot nditneccessarytodealdirectly9withanyofthesevqalues(exceptforWord,hBETA,andNIL,whicharealsomentionedinother9sections).CXIfyoumoGdifyanyofthevqalueslistedbGelowwithoutknowingwhatyouaredoing,9youUUmayeithercrashSACLIB+vorcauseittoproGducefalseresults,sopleasetakecare![9Notation:r,InՈthedescriptionbGelow,5p}'ointermeansaC%pointer(i.e.anactualmemory9address)®andp}'ointertoanarray®meansaC‘pGointertothe rstelementofanarray*.List9handleVmeansaSACLIB-Blisthandle(i.e.anintegerLwithBETAĸtL "5-:2LThis٠isequaltoSBETA.FJorhistoricalreasons,ڲinsomeSAÎCLIB%functionsSBETAisexplicitlyusedinsteadofXSNIL.A63@C9BelowUUwegivealistoftheSACLIB+vglobalvqariablesasde nedin\external.c":}9ListTproQcessingandgarbagecollection:ԍ39=9AVAILUU...aWord,thelisthandleofthefreelist.ԍ39=9GCGLOBALSUU...aWord,thelisthandleofthelistofglobalvqariables.39=9BACSTACKUU...apGointertothebeginningofthesystemstack.39=9GCCUU...aWord,thenumbGerofgarbagecollections.39=9GCACUU...aWord,thenumbGerofGCAcellscollectedinallgarbagecollections.39=9GCCCUU...aWord,thenumbGerofcellscollectedinallgarbagecollections.39=9GCMN...?aWord,OifGCMNis1,amessageiswrittentotheoutputstreameachtime =9theUUgarbagecollectoriscalled.39=9NU...9eaWord,onelessthanthesizeoftheSPACEarrayinWords,i.e.twicethe=9numbGerUUofcellsinSPACE.39=9RHOT...taWord,!thegarbagecollectorabGortstheprogramifnomorethanNU JN=RHO=9cellsUUwerereclaimed.39=9SPACEBUU...apGointertoanarrayofwords,SPACEB%[=SPACE?8BETA8Բ.39=9SPACEB1UU...apGointertoanarrayofwords,SPACEB1*X=SPACE?8BETA1xѲ.39=9GCAAVAILUU...aWord,theGCAhandleofthefreelistofGCAcells.39=9GCASPACE #...apGointertoanarrayofGCArraystructures,thememoryspacefor=9GCAUUcells.39=9GCASPACEBpݲ...tapGointertoanarrayofGCArraystructures,&GCASPACEBp>ٲ==9GCASPACEir8BETApxѲ.39=9NUp,...aWord, onelessthanthenumbGerofGCArraystructuresintheGCASPACE=9array*.39=9BETApM...aWord,*thebGoundusedtodistinguishbetweenlistandGCA@handles.=9BETApZ@=BETA+8NU+81.39=9BETApp7...EaWord,=theuppGerboundonGCA7GCAhandles.gBETApp&=BETApu+=9NUpO2̲+81.ԍ9Timing:39=9TAUUU...aWord,thetime(inmilliseconds)spGentforgarbagecollections.ԍ39=9TAU0ł...p,aWord,thesystemtime(inmilliseconds)justbGeforeSACLIB,|initial-=9ization.39=9TAU1Y...aWord,thesystemtime(inmilliseconds)immediatelyafterSACLIB=9initialization.ԍ9In9tegerTarithmetic:ќ39=9DELTAUU...aWord,DELTA \^=2^bZETA=2c&L.ќ39=9EPSILUU...aWord,EPSIL \^=2^dZETA=2e)d=BETA =DELTA?.39=9ETAUU...aWord,ETAd=blog ꬟qƱ10:BETA,.c.39=9RINCUU...aWord,theincrementfortherandomnumbGergenerator.39=9RMULTUU...aWord,themultiplierfortherandomnumbGergenerator.39=9RTERMUU...aWord,thelastvqalueproGducedbytherandomnumbGergenerator.39=9TABP2UU...apGointertoanarrayofWords,TABP2F[i]=2^i1for1iZETA .39=9THETAUU...aWord,THETA \^=10^fCscmtt8fETA .A64A=C39=9UZ210UU...aWord,thelisthandleofthelistofunitsofZ210 uY.39=9ZETAUU...aWord,ZETAa=logğqƱ2BETA*Ӳ.9PrimeTn9umbQers:39=9NPFDSUU...aWord,thenumbGerofprimesusedbytheSACLIB+vfunctionIUPFDS.39=9NPRIMEUU...aWordcontrollingthenumbGerofprimesinPRIME.39=9PRIMEp...+aWord,wKthelisthandleofthelistofprimesbGetweenBETArJNPRIME$ =9ZETATrɸ87=5UUandBETA.39=9NSMPRMUU...aWord,theuppGerboundonthesizeofprimesinSMPRM.39=9SMPRMUU...aWord,thelisthandleofthelistofprimes<NSMPRM"G.9Miscellaneous:39=9NPTR1UU...aWord,thenumbGerofWordsintheGCAPTR1array*.39=9GCAPTR1I[...aWord,KtheGCAIXhandleofthearrayusedbythefunctionIUPTR1.9Input/Output:39=9LASTCHARUU...aWord,thelastcharacterreadfromtheinputstream.A65BʱCG9cIndex.卍G9BETA,UU63 9NIL,UU4,639AADV,UU6,129absoluteUUvqalue"9ofUUapGolynomial,169ADV,UU59ADV2,UU69ADV3,UU69ADV4,UU69AFCOMP*,UU479AFCR,UU499AFDIF,UU479AFDWRITE,UU509AFFINT,UU499AFFRN,UU499AFICR,UU499AFINV,UU479AFNEG,UU479AFP*AFP,UU479AFP*AFQ,UU479AFPCMV,UU489AFPCR,UU499AFPDIF,UU479AFPDMV,UU479AFPEMV,UU489AFPEV,UU489AFPFIP*,UU499AFPFRP*,UU499AFPICR,UU499AFPINT,UU479AFPME,UU489AFPMON,UU479AFPNEG,UU479AFPNIP*,UU489AFPNORM,UU489AFPPR,UU479AFPQR,UU479AFPROD,UU479AFPSUM,UU479AFPWRITE,UU509AFQ,UU479AFSIGN,UU479AFSUM,UU479AFUPBRI,UU48GAFUPFAC,UU47 AFUPGC,UU48AFUPGS,UU48AFUPIGIR,UU49AFUPIGIWS,UU49AFUPMPR,UU48AFUPRB,UU48AFUPRICL,UU48AFUPRICS,UU49AFUPRL,UU49AFUPRLS,UU49AFUPRRI,UU49AFUPRRS,UU49AFUPSF,UU48AFUPSR,UU48AFUPVAR,UU49AFUPWRITE,UU50AFWRITE,UU50AIFAN,UU50algebraic eldUUelement,46integer,UU46numbGer,UU46numbGer,UUreal,46AMPSAFP*,UU50AMSIGN,UU47AMSIGNIR,UU47AMUPBES,UU48AMUPBHT,UU48AMUPIGIR,UU49AMUPIGIWS,UU49AMUPMPR,UU49AMUPNT,UU48AMUPRICS,UU49AMUPRICSW,UU49AMUPRINCS,UU49AMUPRLS,UU49AMUPRRS,UU49AMUPSR,UU48AMUPTR,UU48AMUPTR1,UU48AMUPVARIR,UU49ANDWRITE,UU50ANFAF,UU50ANIGIPE,UU47A66CC9ANPEDE,UU47 9ANPROD,UU479ANREPE,UU479ANSUM,UU479AREAD,UU79ARGSACLIB,UU559atom,UU49AWRITE,UU79baseUUdomain,169baseUUring,169basis"9coarsestUUsquarefree,32"9 nestUUsquarefree,329BEGINSACLIB,UU559binaryUUrationalnumbGer,UU419CCONC,UU69ceiling,UU109cell,UU49CINV,UU79coGecient"9leading,UU16"9leadingUUbase,16"9trailingUUbase,169cofactors,UU329COMP*,UU59COMP2,UU59COMP3,UU59COMP4,UU59compGosition,UU59CONC,UU69concatenation,UU59constantUUpGolynomial,169content,UU16,33"9integer,UU16"9univqariate,UU339DAND,UU129DEGCD,UU119degree,UU169denseUUrecursiverepresentation,159destructive,UU59DGCD,UU119digit,UU9"9BETA-,UU9"9GAMMA-,UU9"9moGdular,UU99DIGIPREAD,UU269DIGIPWRITE,UU279DIPDEG,UU279DIPFP*,UU269DIPINS,UU279DIRPREAD,UU27DIRPWRITE,UU27 discriminant,UU32disjointUUintervqals,41DLOG2,UU12DMPPRD,UU27DMPSUM,UU27DMUPNR,UU27DNIMP*,UU12DNOT,UU12DOR,UU12DPCC,UU12DPFP*,UU27DPGEN,UU11DPR,UU10DQR,UU10DRAN,UU11DRANN,UU11DSQR*TF,UU11elementofUUalist,4ENDSACLIB,UU55EQUAL,UU6EXTENT,UU6extent,UU5factorizationcomplete,UU37squarefree,UU17,33FIRST,UU6FIRST2,UU6FIRST3,UU6FIRST4,UU6 oGor,UU10FOUR*TH,UU6GC,UU62GCffCHECK,UU52GCffNOffCHECK,UU52GCA2PTR,UU53GCAFREE,UU53GCAGET,UU52GCAMALLOC,UU52GCASET,UU52GCSI,UU62handleofUUaGCA,51ofUUalist,4IABSF,UU11IBCIND,UU12IBCOEF,UU12IBCPS,UU12ICOMP*,UU11A67DQC9IDEGCD,UU11 9IDIF,UU109IDIPR2,UU129IDP2,UU129IDPR,UU109IDQ,UU109IDQR,UU109IDREM,UU119IEGCD,UU119IEVEN,UU119IEXP*,UU119IFACT,UU119IFACTL,UU129IFCL2,UU129IGCD,UU119IGCDCF,UU119IHEGCD,UU119ILCM,UU119ILCOMB,UU129ILOG2,UU129ILPDS,UU119ILWRITE,UU129IMAX,UU119IMIN,UU119IMP2,UU129IMPDS,UU119INEG,UU109in ectionlessUUisolatingintervqal,419in ectionlessUUisolationlist,419integer,UU9"9BETA-,UU9"9GAMMA-,UU9"9algebraic,UU46"9moGdular,UU99integerUUcontent,169integralUUpGolynomial,169intervqal,UU41"9isolating,UU41,9acceptable,UU46,9in ectionless,UU41,9strongly*,UU41,9weakly*,UU41"9standard,UU419intervqals"9disjoint,UU41,9strongly*,UU419INV,UU79inverse"9ofUUalist,59IODD,UU119IORD2,UU129IP*ABS,UU219IP*AFME,UU489IPBEILV,UU22IPBHT,UU22 IPBHTLV,UU22IPBHTMV,UU22IPBREI,UU22IPC,UU23,34IPCEVP*,UU38IPCONST,UU23IPCPP*,UU23,34IPCRA,UU24IPCSFB,UU35IPDER,UU22IPDIF,UU21IPDMV,UU22IPDSCR,UU35IPDWRITE,UU23IPEMV,UU22IPEVAL,UU22IPEXP*,UU21IPEXPREAD,UU23IPFAC,UU38IPFCB,UU38IPFLC,UU38IPFRP*,UU23IPFSD,UU24IPFSFB,UU35,38IPGCDC,UU34IPGFCB,UU38IPGSUB,UU22IPHDMV,UU22IPIC,UU23IPICPP*,UU23IPICS,UU23IPIHOM,UU24IPIGIWS,UU42IPINT,UU22IPIP*,UU21IPIPP*,UU23IPIPR,UU24IPIQ,UU21IPIQH,UU38IPLCPP*,UU23,34IPLRRI,UU42IPMAXN,UU23IPNEG,UU21IPNT,UU22IPONE,UU23IPOWER,UU11IPP2P*,UU21IPPGSD,UU35IPPNPRS,UU42IPPP*,UU23,34IPPROD,UU21IPPSC,UU35IPPSR,UU21A68EC9IPQ,UU21 9IPQR,UU219IPRAN,UU239IPRCH,UU419IPRCHS,UU419IPRCN1,UU419IPRCNP*,UU419IPREAD,UU239IPRES,UU359IPRICL,UU429IPRIM,UU429IPRIMO,UU429IPRIMS,UU429IPRIMU,UU429IPRIMW,UU429IPRIST,UU429IPROD,UU109IPRODK,UU109IPRPRS,UU369IPRRIGI,UU429IPRRLS,UU429IPRRRI,UU429IPRRS,UU429IPSCPP*,UU23,349IPSF,UU24,359IPSFBA,UU359IPSFSD,UU249IPSIFI,UU429IPSIGN,UU219IPSMV,UU229IPSPRS,UU369IPSRM,UU429IPSRMS,UU429IPSRP*,UU239IPSUB,UU229IPSUM,UU219IPSUMN,UU239IPTPR,UU249IPTR,UU239IPTR1,UU239IPTR1LV,UU239IPTRAN,UU229IPTRLV,UU239IPTRMV,UU229IPTRUN,UU249IPVCHT,UU429IPWRITE,UU239IQ,UU109IQR,UU109IRAND,UU119IREAD,UU129IREM,UU109IROOT,UU119ISA*TOM,UU6ISEG,UU12 ISFPF,UU38ISIGNF,UU11ISLIST,UU6ISNIL,UU6ISOBJECT,UU6ISPD,UU11ISPSFB,UU35ISPT,UU11ISQR*T,UU11ISSUM,UU12ISUM,UU10ITRUNC,UU12IUPBEI,UU22IUPBES,UU22IUPBHT,UU22IUPBRE,UU22IUPCHT,UU43IUPFAC,UU38IUPFDS,UU38IUPIHT,UU22IUPIGIR,UU42IUPNT,UU22IUPQH,UU38IUPQHL,UU38IUPQS,UU22IUPRB,UU42IUPRC,UU35IUPRLP*,UU42IUPSR,UU21IUPTPR,UU24IUPTR,UU23IUPTR1,UU23IUPVAR,UU43IUPVOI,UU43IUPVSI,UU43IUSFPF,UU38IWRITE,UU12LASTCELL,UU6LBIBMS,UU7LBIBS,UU7LBIM,UU7LCONC,UU6LDSMKB,UU29LDSSBR,UU29leadingUUbasecoGecient,16leadingUUcoGecient,16leadingUUterm,16LEINST,UU7LEL*TI,UU6LENGTH,UU6lengthofUUalist,5A69FĠC9LEROT,UU7 9LEXNEX,UU79LINS,UU79LINSR*T,UU79list,UU4"9empty*,UU4"9ofUUcharacters,17"9ofUUvqariables,179LIST1,UU59LIST10,UU59LIST2,UU59LIST3,UU59LIST4,UU59LIST5,UU59LMERGE,UU79LPERM,UU79LREAD,UU79LSRCH,UU69LWRITE,UU89mainUUvqariable,169MAIPDE,UU299MAIPDM,UU299MAIPHM,UU309MAIPP*,UU299MCPMV,UU389MDCRA,UU139MDDIF,UU139MDEXP*,UU139MDHOM,UU139MDINV,UU139MDLCRA,UU139MDNEG,UU139MDPROD,UU139MDQ,UU139MDRAN,UU139MDSUM,UU139MEMBER,UU69MIAIM,UU309MICINS,UU309MICS,UU309MIDCRA,UU139MIDIF,UU139MIEXP*,UU139MIHOM,UU139MIGINV,UU139MINEG,UU139MINNCT,UU309MIPDIF,UU249MIPFSM,UU259MIPHOM,UU259MIPIPR,UU249MIPISE,UU389MIPNEG,UU24MIPPR,UU24 MIPRAN,UU25MIPROD,UU13MIPSUM,UU24MIQ,UU13MIRAN,UU13MISUM,UU13MIUPQR,UU24MIUPSE,UU38MMDDET,UU29MMDNSB,UU29MMPDMA,UU29MMPEV,UU30MMPIQR,UU25moGdulardigit,UU9integer,UU9integralUUpGolynomial,16pGolynomial,UU16symmetric,UU9monicUUpGolynomial,16MPDIF,UU24MPEMV,UU25MPEVAL,UU25MPEXP*,UU25MPGCDC,UU34MPHOM,UU25MPINT,UU25MPIQH,UU39MPIQHL,UU39MPIQHS,UU39MPMDP*,UU24MPMON,UU25MPNEG,UU24MPPROD,UU24MPPSR,UU25MPQ,UU24MPQR,UU24MPRAN,UU25MPRES,UU35MPSPRS,UU36MPSUM,UU24MPUC,UU25,34MPUCPP*,UU25,34MPUCS,UU25,34MPUP*,UU24MPUPP*,UU25,34MPUQ,UU24MUPBQP*,UU39MUPDDF,UU39MUPDER,UU25MUPEGC,UU36MUPFBL,UU38MUPFS,UU39A70GC9MUPGCD,UU35 9MUPHEG,UU369MUPRAN,UU259MUPRC,UU359MUPRES,UU359MUPSFF,UU25,359name"9ofUUavqariable,179negative,UU109non-negative,UU109non-pGositive,UU109numbGer"9algebraic,UU46"9rational,UU10"9realUUalgebraic,469ob8ject,UU59ORDER,UU69order"9ofUUalist,5"9ofUUapGolynomial,169OREAD,UU89OWRITE,UU89P*AIR,UU89PBIN,UU209PCL,UU219PCONST,UU209PCPV,UU219PDBORD,UU209PDEG,UU209PDEGSV,UU209PDEGV,UU209PDPV,UU209PERMCY,UU79PERMR,UU79PFBRE,UU209PFDIP*,UU21,269PFDP*,UU21,279PICPV,UU219PINV,UU219PLBCF,UU209PLDCF,UU209PMDEG,UU209PMON,UU209PMPMV,UU209pGolynomial,UU16"9constant,UU16"9denseUUrecursiverepresentation,15"9integral,UU16"9integralUUminimal,46"9moGdular,UU16"9moGdularUUintegral,16monic,UU16 pGositive,UU16primitive,UU16,33rational,UU16rationalUUminimal,46sparsehdistributiverepresentation,115sparseUUrecursiverepresentation,15squarefree,UU17,33PORD,UU20pGositive,UU10pGositiveUUpolynomial,16PPERMV,UU21PRED,UU20primitiveUUpart,33univqariate,UU33primitiveUUpGolynomial,16,33PR*T,UU20PSDSV,UU20PTBCF,UU20PTMV,UU21PTV,UU21PUFP*,UU21PUNT,UU20rationalnumbGer,UU10pGolynomial,UU16RED,UU6RED2,UU6RED3,UU6RED4,UU6REDI,UU6reductumofUUalist,5ofUUapGolynomial,16RNABS,UU14RNBCR,UU14RNCEIL,UU14RNCOMP*,UU14RNDEN,UU14RNDIF,UU14RNDWRITE,UU14RNFCL2,UU14RNFLOR,UU14RNINT,UU14RNINV,UU14RNMAX,UU14RNMIN,UU14RNNEG,UU14RNNUM,UU14RNP2,UU14RNPROD,UU14RNQ,UU14RNRAND,UU14A71HOC9RNREAD,UU14 9RNRED,UU149RNSIGN,UU149RNSUM,UU149RNWRITE,UU149RP*AFME,UU489RPBLGS,UU269RPDIF,UU269RPDMV,UU269RPDWRITE,UU269RPEMV,UU269RPEXPREAD,UU269RPFIP*,UU269RPIMV,UU269RPMAIP*,UU269RPNEG,UU269RPPROD,UU269RPQR,UU269RPREAD,UU269RPRNP*,UU269RPSUM,UU269RPWRITE,UU269SACffFREEMEM,UU559SDIFF,UU79SECOND,UU69SEQUAL,UU79set"9unordered,UU59SFCS,UU79SFIRST,UU89sideUUe ects,59sign"9ofUUapGolynomial,169SINTER,UU79SLEL*TI,UU89SMFMI,UU139SMFMIP*,UU259sparseUUdistributiverepresentation,159sparseUUrecursiverepresentation,159squarefree"9basis,9coarsest,UU32,9 nest,UU32"9divisor,UUgreatest,33"9factorization,UU17,33"9pGolynomial,UU17,339SRED,UU89standardUUintervqal,419SUFFIX,UU79SUNION,UU79term"9leading,UU16THIRD,UU6 trailingUUbasecoGecient,16univqariateUUcontent,33univqariateUUprimitivepart,33USDIFF,UU7USINT,UU7USUN,UU7vqariablelistUUof,17main,UU16name,UU17VIAZ,UU29VIDIF,UU29VIERED,UU29VILCOM,UU29VINEG,UU29VISPR,UU30VISUM,UU30VIUT,UU30A72.;IOiNq cmbx12fCscmtt8cNH cmbx12SCscmtt8GDtHGcmr17>DtGGcmr17 cmmi10 0ercmmi7O \cmmi5K`y cmr10ٓRcmr7Zcmr5< lcircle10O line10u cmex10saclib2.2.8/sysdep/doc/desc.doc0000664002275300236100000015661414017255270015446 0ustar wcbrownscsAADV Arithmetic advance. ABS Absolute value. ACLOCK Clock minus garbage collection time. ADDTO Add array to array. ADV Advance. ADV2 Advance 2. ADV3 Advance 3. ADV4 Advance 4. AFCOMP Algebraic number field comparison. AFCR Algebraic number field element convert representation. AFDIF Algebraic number field element difference. AFDWRITE Algebraic number field, decimal write. AFFINT Algebraic number field element from integer. AFFRN Algebraic number field element from rational number. AFGEN Algebraic number field generator. AFICR Algebraic number field element inverse convert representation. AFINV Algebraic number field element inverse. AFNEG Algebraic number field negation. AFPAFP Algebraic number field polynomial algebraic number field element product. AFPAFQ Algebraic number field polynomial algebraic number field element quotient. AFPCMV Algebraic number field polynomial composition in main variable. AFPCR Algebraic number field polynomial convert representation. AFPDIF Algebraic number field polynomial difference. AFPDMV Algebraic number field polynomial derivative, main variable. AFPEMV Algebraic number field polynomial evaluation of main variable. AFPEV Algebraic number field polynomial evaluation. AFPFIP Algebraic number field polynomial from integral polynomial. AFPFRP Algebraic number field polynomial from rational polynomial. AFPHIIR Algebraic field polynomial hardware interval isolation and refinement. AFPHIP Algebraic field polynomial to hardware interval polynomial. AFPICR Algebraic number field polynomial inverse convert representation. AFPINT Algebraic number field polynomial integration. AFPME Algebraic number field polynomial multiple evaluation. AFPMON Algebraic number field polynomial monic. AFPNEG Algebraic number field polynomial negative. AFPNIP Algebraic number field polynomial normalize to integral polynomial. AFPNORM Algebraic number field polynomial norm. AFPPR Algebraic number field polynomial product. AFPQR Algebraic number field polynomial quotient and remainder. AFPROD Algebraic number field element product. AFPSIP Algebraic field polynomial to software interval polynomial. K Algebraic field polynomial software interval refinement. AFPSUM Algebraic number field polynomial sum. AFPWRITE Algebraic number field polynomial write. AFQ Algebraic number field quotient. AFSIGN Algebraic number field sign. AFSUM Algebraic number field element sum. AFUPBRI Algebraic number field univariate polynomial basis real root isolation. AFUPCSFB Algebraic number field univariate polynomial coarsest squarefree basis. AFUPFAC Algebraic number field univariate polynomial factorization. AFUPFMRC Algebraic number field univariate polynomial from modular residues, with comparison. AFUPFRPT Algebraic number field univariate polynomial fast relative-primality test. AFUPGC Algebraic number field univariate polynomial greatest common divisor and cofactors. AFUPGC1 Algebraic number field univariate polynomial greatest common divisor and cofactors, degree 1. AFUPGS Algebraic number field univariate polynomial greatest squarefree divisor. AFUPHIBRI Algebraic number field univariate polynomial hardware interval basis real root isolation. AFUPIIR Algebraic number field polynomial isolating interval refinement. AFUPIIWS Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. AFUPMPR Algebraic number field univariate polynomial minimal polynomial of a real root. AFUPQR Algebraic number field univariate polynomial quotient and remainder. AFUPRB Algebraic number field univariate polynomial root bound. AFUPRICL Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. AFUPRICS Algebraic univariate polynomial real root isolation, coefficient sign variation method. AFUPRII Algebraic number field univariate polynomial real root isolation induction. AFUPRL Algebraic number field univariate polynomial, root of a linear polynomial. AFUPRLS Algebraic number field univariate polynomial real root list separation. AFUPRRI Algebraic number field univariate polynomial relative real root isolation. AFUPRRS Algebraic number field univariate polynomial real root separation. AFUPSF Algebraic number field univariate polynomial squarefree factorization. AFUPSFBA Algebraic number field univariate polynomial squarefree basis augmentation. AFUPSFN Algebraic number field univariate polynomial squarefree norm. AFUPSIBRI Algebraic number field univariate polynomial software interval basis real root isolation. AFUPSR Algebraic number field univariate polynomial, sign at a rational point. AFUPVAR Algebraic number field univariate polynomial variations. AFUPWRITE Algebraic number field univariate polynomial write. AFUSPSFB Algebraic number field univariate squarefree polynomial squarefree basis. AFWRITE Algebraic field element write. AGIBL Array Gaussian integer bit length. AGICOPY Array Gaussian integer copy. AGIDP2 Array Gaussian integer division by a power of 2. D Array Gaussian integer greatest common divisor. D Array Gaussian integer greatest common divisor, approximative Euclidean. AGIGCDW Array Gaussian integer greatest common divisor, Weilert's method. AGIMD Array Gaussian integer minimal difference. AGIMP2 Array Gaussian integer multiplication by a power of 2. AGIMU Array Gaussian integer multiplication by a unit. AGINC Array Gaussian integer norm comparison. AGINORM Array Gaussian integer norm. AGIPROD Array Gaussian integer product. AGIQHQ Array Gaussian integer quadrant and half quadrant. AGIRP Array Gaussian integer reduced part. AGIRSUM Array Gaussian integer rotated sum. AGISUM Array Gaussian integer sum. AGITR Array Gaussian integer truncate and round. AGIWRITE Array Gaussian integer write. t Array Gaussian integer zero. AICOMP Array integer comparison. AICOPY Array integer copy. AIDP2 Array integer division by a power of 2. AIFAN Algebraic integer from algebraic number. AII Array integer to integer. AIMP2 Array integer multiplication by a power of 2. AINQ Array integer nearest quotient. AIPROD Array integer product. AIQR Array integer quotient and remainder. AISUM Array integer sum. AITR Array integer truncate and round. AITRS Array integer truncate and round, small result. AIWRITE Array integer write. t Array integer zero. ALSIL Attach labels to standard isolation list. AMLM Array matrix to list matrix. AMPDMV Algebraic module polynomial derivative, main variable. AMPSAFP Algebraic module polynomial similar to algebraic field polynomial. AMSIGN Algebraic module sign. AMSIGNIR Algebraic module sign, interval refinement. AMUPBES Algebraic module univariate polynomial, binary rational evaluation of sign. AMUPBHT Algebraic module univariate polynomial binary homothetic transformation. AMUPIIR Algebraic module polynomial isolating interval refinement. AMUPIIWS Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. AMUPMPR Algebraic module univariate polynomial minimal polynomial of a real root. AMUPNT Algebraic module univariate polynomial negative transformation. AMUPRBH Algebraic module univariate polynomial root bound and homothetic transformation. AMUPRICS Algebraic module univariate polynomial real root isolation, coefficient sign variation method. AMUPRICSW Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. AMUPRINCS Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. AMUPRLS Algebraic module univariate polynomial real root list separation. AMUPRRS Algebraic module univariate polynomial real root separation. AMUPSR Algebraic module univariate polynomial, sign at a rational point. AMUPTR Algebraic module univariate polynomial translation. AMUPTR1 Algebraic module univariate polynomial translation by 1. AMUPVARIR Algebraic module univariate polynomial variations, interval refinement. ANDWRITE Algebraic number decimal write. ANFAF Algebraic number from algebraic number field element. ANHI Algebraic number to hardware interval. ANIIPE Algebraic number isolating interval for a primitive element. ANPEDE Algebraic number primitive element for a double extension. ANPROD Algebraic number product. ANR Algebraic number refinement. ANREPE Algebraic number represent element of a primitive extension. ANSI Algebraic number to software interval. ANSUM Algebraic number sum. AREAD Atom read. ARGSACLIB Process the command line arguments. ARIE Array remove indexed elements. ASSPR Assignment problem. AWCOPY Array of words copy. AWRITE Atom write. BDGCD Binary digit greatest common divisor. BEGINSACLIB Begin SACLIB. BERNOULLINUM Bernoulli numbers via tangent numbers. BERNOULLIPOL Bernoulli polynomial. The n-th Bernoulli polynomial is computed. BITRAN Bit, random. BKSP Backspace. BRILBRI Binary rational interval to logarithmic binary rational interval. CCONC Constructive concatenation. CHEBY Chebyshev polynomial. CINV Constructive inverse. CLEAR Clear array. CLOCK Clock. CLOUT Character list out. COMP Composition. COMP2 Composition 2. COMP3 Composition 3. COMP4 Composition 4. CONC Concatenation. COPYTO Copy array to array. CPLEXN Cartesian product, lexicographically next. CREAD Character read. CREADB Character read. c Characteristic set from array of members. CSFPAR Characteristic set from partition. CSFS Characteristic set from set. CSINT Characteristic set intersection. CSSUB Characteristic set subset. CSUN Characteristic set union. CTMI Create table of modular inverses. CWRITE Character write. DAND Digit and. DDPCC Double-digit partial cosequence calculation. DDRPCC Double-digit restricted partial cosequence calculation. DEGCD Digit extended greatest common divisor. DGCD Digit greatest common divisor. DIELOC Display Input Error Location. DIGIT Digit. DIIPREAD Distributive integral polynomial read. DIIPWRITE Distributive integral polynomial write. DIPDEG Distributive polynomial degree. DIPFP Distributive polynomial from polynomial. DIPINS Distributive polynomial, insert term. DIRPREAD Distributive rational polynomial read. DIRPWRITE Distributive rational polynomial write. DLINIT Discrete logarithm initialization of tables. DLINV Discrete logarithm inverse. DLNEG Discrete logarithm negative. DLOG2 Digit logarithm, base 2. DLPROD Discrete logarithm product. DLSUM Discrete logarithm sum. DMPPRD Dense modular polynomial product. DMPSUM Dense modular polynomial sum. DMUPNR Dense modular univariate polynomial natural remainder. DNIMP Digit non-implication. DNOT Digit not. DOR Digit or. DPCC Digit partial cosequence calculation. DPFP Dense polynomial from polynomial. DPGEN Digit prime generator. DPR Digit product. DPRNN Digit product. DQR Digit quotient and remainder. DRAN Digit, random. DRANN Digit, random non-negative. DRPCC Digit restricted partial cosequence calculation. DSMC Digit solution of modular congruence. DSQRTF Digit square root function. DVCMP Degree vector comparison. ENDSACLIB End saclib. EQUAL Equal. EVEN EVEN. EXPF Exponential function. EXTENT Extent. FAIL Failure handler. FCOMP Floating point comparison. FCOPY Floating point copy. FDIF Floating-point difference. FILINE Flush the input stream line. FIRST First. FIRST2 First 2. FIRST3 First 3. FIRST4 First 4. FIRST5 First 5. FIRST6 First 6. FLBRN Floating point to logarithmic binary rational number conversion. FOURTH Fourth. FPCATCH Floating-point catch. FPHAND Floating-point handler. FPROD Floating-point product. FPROD1 Floating-point product, precision 1. FPROD2 Floating-point product, precision 2. FPROD21 Floating-point product, precision 2 by precision 1. FQUOT Floating-point quotient. FRAPCR Finite ring array polynomial convert representation. FRAPFMD Finite ring array polynomial from modular digit. FRAPFREE Finite ring array polynomial free memory. FRAPGET Finite ring array polynomial get memory. FRAPMON Finite ring array polynomial monic. FRAPREM Finite ring array polynomial remainder. FREEARRAY Free array. FREEMATRIX Free matrix. FREINV Finite ring element inverse. FREPROD Finite ring element product. FRESL Fermat residue list. FRLSM Fermat residue list, single modulus. FRUPCR Finite ring univariate polynomial convert representation. FRUPGCD Finite ring univariate polynomial gcd. FSUM Floating-point sum. FSUMDEOS1 Floating-point sum, different exponents, opposite signs, exponent difference of 1. FSUMDEOS2 Floating-point sum, different exponents, opposite signs, exponent difference of 2 or more. FSUMDESS Floating-point sum, different exponents, same signs. FSUMSEOS Floating-point sum, same exponents, opposite signs. FSUMSESS Floating-point sum, same exponents, same signs. GC Garbage collection entry-point. GCA2PTR Convert garbage collected array handle to C pointer. GCAFREE Garbage collected array memory deallocation. GCAGET Garbage collected array get element. GCAMALLOC Garbage collected array memory allocation. GCASET Garbage collected array set element. GCATL GCA to list. GCGLOBAL Declare a global variable to the Garbage Collector. GCSI Garbage collection, system independent. GDPGEN Gaussian digit prime generator. GETAHIA Get array of hardware interval arrays. GETARRAY Get array. GETHIPARRAY Get hardware interval polynomial array. GETMATRIX Get matrix. B Gaussian integer to array Gaussian integer. GICONJ Gaussian integer conjugation. GIDIF Gaussian integer difference. GIFP Gaussian integer from parts. b Gaussian integer first quadrant associate. GIGCD Gaussian integer greatest common divisor. GIHQ Gaussian integer half quadrant. GIMS Gaussian integer minimal sum. GINEG Gaussian integer negation. GINORM Gaussian integer norm. q Gaussian integer nearest quotient. GINQR Gaussian integer nearest quotient and remainder. GIPGEN Gaussian integer prime generator. GIPROD Gaussian integer product. GIRP Gaussian integer reduced part. GISUM Gaussian integer sum. GIWRITE Gaussian integer write. GREAD C integer read. GWRITE C integer write. HEXP Hardware exponent. HIACC Hardware interval accuracy. HIDWRITE Hardware interval decimal write. HILBRI Hardware interval to logarithmic binary rational interval. HIPBHT Hardware interval polynomial binary homothetic transformation. HIPCHT Hardware interval polynomial circle to half-plane transformation. HIPCOPY Hardware interval polynomial copy. HIPDWRITE Hardware interval polynomial decimal write. HIPFES Hardware interval polynomial floating point evaluation of sign. HIPIEVAL Hardware interval polynomial interval evaluation. HIPIR Hardware interval polynomial interval refinement. HIPLWRITE Hardware interval polynomial logarithmic write. HIPNEGT Hardware interval polynomial negative transformation. HIPPRB Hardware interval polynomial positive root bound. HIPROD Hardware interval product. HIPRRID Hardware interval polynomial real root isolation, Descartes method. HIPRRISD Hardware interval polynomial real root isolation, standard interval, Descartes' method. HIPRT Hardware interval polynomial reciprocal transformation. HIPSV Hardware interval polynomial sign variations. HIPTR1 Hardware interval polynomial translation by 1. HIPVCHT Hardware interval polynomial, variations after circle to half-plane transformation. HIQUOT Hardware interval quotient. HISIGN Hardware interval sign. HISUM Hardware interval sum. HSIGN Hardware sign. IABSF Integer absolute value function. IACOMPA Integer absolute value comparison, array version. B Integer to array integer. IBCIND Integer binomial coefficient induction. IBCOEF Integer binomial coefficient. IBCOEFFS Integer binomial coefficients. IBCPS Integer binomial coefficient partial sum. IBPPOL Integral bivariate polynomial points on line. IBPPOS Integral bivariate polynomial points on sections. ICOMP Integer comparison. ICRAND Integer, controlled random. IDEGCD Integer doubly extended greatest common divisor algorithm. IDENTMAT Identity matrix. IDEQ Integer-digit exact quotient. IDIF Integer difference. IDIFA Integer difference, array version. IDIPR2 Integer digit inner product, length 2. IDLCOMB Integer double linear combination. IDP2 Integer division by power of 2. IDPR Integer-digit product. IDQ Integer-digit quotient. IDQR Integer-digit quotient and remainder. IDQRA Integer-digit quotient and remainder, array version. IDREM Integer-digit remainder. IEAS Integer Euclidean algorithm step. IEEEDWRITE IEEE decimal write. IEEELBRN IEEE to logarithmic binary rational number conversion. IEEENEIGH IEEE neighbor. IEEEROUND IEEE round. IEEEWRITE IEEE write. IEGCD Integer extended greatest common divisor algorithm. IEQ Integer exact quotient. IEVEN Integer even. IEXP Integer exponentiation. IF Integer to floating. IFACT Integer factorization. IFACTL Integer factorial. IFATL Integer from array to list. IFCL2 Integer, floor and ceiling, logarithm, base 2. IFEC Integer to floating, exact conversion. IFLTA Integer from list to array. IGCD Integer greatest common divisor. IGCDCF Integer greatest common divisor and cofactors. IHDREM Integer half-digit remainder. IHEAS Integer half-extended Euclidean algorithm step. IHEGCD Integer half-extended greatest common divisor. IHI Integer to hardware interval. IIC Isolating interval conversion. IIEEE Integer to IEEE double. IIEEET Integer to IEEE double - truncation. ILBRN Integer to logarithmic binary rational number. ILCM Integer least common multiple. ILCOMB Integer linear combination. ILENGTH Integer length. ILOG2 Integer logarithm, base 2. ILOG2A Integer logarithm, base 2, array version. ILOGB Integer logarithm, base BETA. ILPDS Integer large prime divisor search. ILSA Integer left shift in array. ILWORD Integer leading word. ILWORDS Integer leading words. ILWRITE Integer list write. IMAX Integer maximum. IMIN Integer minimum. IMP2 Integer multiplication by power of 2. IMPB Integer multiplication by power of BETA. IMPBAA Integer multiply by power of BETA and add to array. IMPDS Integer medium prime divisor search. INEG Integer negation. INEGA Integer negation, array version. INFOSACLIB Write out usage information for SACLIB. q Integer nearest quotient. INQR Integer nearest quotient and remainder. INSET Is the element in the set? INV Inverse. INVPERM Invert permutation. IODD Integer odd. IORD2 Integer, order of 2. IPABS Integral polynomial absolute value. IPAFME Integral polynomial, algebraic number field multiple evaluation. IPBEILV Integral polynomial binary rational evaluation, integral polynomial result, leading variable. IPBEZM Integral polynomial Bezout matrix. IPBHT Integral polynomial binary homothetic transformation. IPBHTLV Integral polynomial binary homothetic transformation, leading variable. IPBHTMV Integral polynomial binary homothetic transformation, main variable. IPBREI Integral polynomial binary rational evaluation, integral polynomial result. IPC Integral polynomial content. IPCA Integral polynomial coefficient analysis. IPCEVP Integral polynomial, choice of evaluation points. IPCONST Integral polynomial constant. IPCPP Integral polynomial content and primitive part. IPCRA Integral polynomial chinese remainder algorithm. IPCSFB Integral polynomial coarsest squarefree basis. IPDER Integral polynomial derivative. IPDIF Integral polynomial difference. IPDMV Integral polynomial derivative, main variable. IPDQNR Integral polynomial digit quotient and non-negative remainder. IPDQR Integral polynomial digit quotient and remainder. IPDSCR Integral polynomial discriminant. IPDSCRBEZ Integral polynomial discriminant, Bezout method. IPDWRITE Integral polynomial distributive write. IPEMV Integral polynomial evaluation of main variable. IPEQ Integral polynomial exact quotient. IPEVAL Integral polynomial evaluation. IPEXP Integral polynomial exponentiation. IPEXPREAD Integral polynomial expression read. IPEXPREADR Integral polynomial expression read, remove terminating character. IPFAC Integral polynomial factorization. IPFACTREAD Integral polynomial factor read. IPFCB Integral polynomial factor coefficient bound. IPFLC Integral polynomial factor list combine. IPFRP Integral polynomial from rational polynomial. IPFSD Integral polynomial factorization, second derivative. IPFSFB Integral polynomial finest squarefree basis. IPGCDC Integral polynomial greatest common divisor and cofactors. IPGFCB Integral polynomial Gelfond factor coefficient bound. IPGSUB Integral polynomial general substitution. IPGTDRAN Integral polynomial, guaranteed total degree, random. IPHDMV Integral polynomial higher derivative, main variable. IPIC Integral polynomial integer content. IPICPP Integral polynomial integer content and primitive part. IPICS Integral polynomial integer content subroutine. IPIHOM Integral polynomial mod ideal homomorphism. IPIIRB Integral polynomial isolating interval refinement - bisection. IPIIS Integral polynomial isolating interval separation. IPIISS Integral polynomial isolating interval search using a Sturm sequence. IPIIWS Integral polynomial isolating intervals weakly disjoint to strongly disjoint. IPINT Integral polynomial integration. IPIP Integral polynomial integer product. IPIPP Integral polynomial integer primitive part. IPIPR Integral polynomial mod ideal product. IPIQ Integral polynomial integer quotient. IPIQH Integral polynomial mod ideal quadratic hensel lemma. IPLCPP Integral polynomial list of contents and primitive parts. IPLEV Integral polynomial list evaluation of signs. Inputs S : a list (A_1,A_2,...,A_t) of univariate integral polynomials. a : a binary rational number. IPLRRI Integral polynomial list real root isolation. IPLSEVAL Integral polynomial list sign evaluation, logarithmic. IPLSILM Integral polynomial labeled standard isolation list merge. IPMAXN Integral polynomial maximum norm. IPMONFACT Integral polynomial monomial factors. IPNEG Integral polynomial negative. IPNT Integral polynomial negative transformation. IPONE Integral polynomial one. IPOWER Integer power. IPP2P Integral polynomial power of 2 product. IPPFAC2 Integral primitive polynomial factorization, degree 2. IPPGSD Integral polynomial primitive greatest squarefree divisor. IPPNPRS Integral polynomial primitive negative polynomial remainder sequence. IPPOWREAD Integral polynomial power read. IPPP Integral polynomial primitive part. IPPROD Integral polynomial product. IPPSC Integral polynomial principal subresultant coefficients. IPPSR Integral polynomial pseudo-remainder. IPPVED Integral polynomial powers-of-variables exact divisors. IPQ Integral polynomial quotient. IPQR Integral polynomial quotient and remainder. IPRAN Integral polynomial, random. IPRCH Integral polynomial real root calculation, high precision. IPRCHS Integral polynomial real root calculation, high-precision special. IPRCN1 Integral polynomial real root calculation, 1 root. IPRCNP Integral polynomial real root calculation, Newton method preparation. IPREAD Integral polynomial read. IPRES Integral polynomial resultant. IPRESBEZ Integral polynomial resultant, Bezout. IPRESPRS Integral polynomial resultant, polynomial remainder sequence method. IPRICL Integral polynomial real root isolation, Collins-Loos algorithm. IPRIM Integral polynomial real root isolation, modified Uspensky method. IPRIMO Integral polynomial real root isolation, modified Uspensky method, open interval. IPRIMS Integral polynomial real root isolation, modified Uspensky method, standard interval. IPRIMU Integral polynomial real root isolation, modified Uspensky method, unit interval. IPRIMW Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. IPRIP Integral polynomial real and imaginary parts. IPRIST Integral polynomial real root isolation using a Sturm sequence. Inputs A : in Z[X], non-zero, squarefree. IPRNME Integral polynomial, rational number multiple evaluation. IPROD Integer product. IPROD2X2 Integer product - 2x2-multiplication. IPROD3X2 Integer product - 3x2-multiplication. IPROD3X3 Integer product - 3x3-multiplication. IPRODA Integer product - array representation. Classical algorithm. IPRODAP Integer product - array multiplication in place. IPRPRS Integral polynomial reduced polynomial remainder sequence. IPRRID Integral polynomial real root isolation, Descartes method. IPRRII Integral polynomial real root isolation induction. IPRRIRDB Integral polynomial real root isolation and refinement, Descartes, bisection. IPRRIRSB Integral polynomial real root isolation and refinement, Sturm, bisection. IPRRIS Integral polynomial real root isolation, Sturm method. Inputs A : in Z[x], non-zero, squarefree. IPRRISD Integral polynomial real root isolation, standard interval, Descartes method. IPRRISI Integral polynomial real root isolation in standard interval. IPRRISS Integral polynomial real root isolation, standard interval, Sturm method. IPRRLS Integral polynomial real root list separation. IPRRRI Integral polynomial relative real root isolation. IPRRS Integral polynomial real root separation. IPSBLSIL Integral polynomial squarefree basis labeled standard isolation list. IPSBLSSIL Integral polynomial squarefree basis labeled strong standard isolation list. IPSCPP Integral polynomial sign, content, and primitive part. IPSF Integral polynomial squarefree factorization. IPSFBA Integral polynomial squarefree basis augmentation. IPSFSD Integral squarefree factorization, second derivative. IPSIFI Integral polynomial standard isolating interval from isolating interval. IPSIGN Integral polynomial sign. IPSIP Integral polynomial to soft-float interval polynomial. IPSMV Integral polynomial substitution for main variable. IPSPRS Integral polynomial subresultant polynomial remainder sequence. IPSQRT Integral polynomial square root. IPSRM Integral polynomial strong real root isolation, modified Uspensky method. IPSRMS Integral polynomial strong real root isolation, modified Uspensky method, standard interval. IPSRP Integral polynomial similar to rational polynomial. IPSTDRAN Integral polynomial, specified total degree, random. IPSUB Integral polynomial substitution. IPSUM Integral polynomial sum. IPSUMN Integral polynomial sum norm. IPTERMREAD Integral polynomial term read. IPTPR Integral polynomial truncated product. IPTR Integral polynomial translation, specified variable. IPTR1 Integral polynomial translation by one, specified variable. IPTR1LV Integral polynomial translation by one, leading variable. IPTRAN Integral polynomial translation. IPTRLV Integral polynomial translation, leading variable. IPTRMV Integral polynomial translation, main variable. IPTRUN Integral polynomial truncation. IPVCHT Integral polynomial variations after circle to half-plane transformation. IPVCHTP Integral polynomial variations after circle to half-plane transformation, partial count. IPVDEG12 Integral polynomial variable of degree 1 or 2. IPWRITE Integral polynomial write. IQ Integer quotient. IQR Integer quotient and remainder. IQRA Integer quotient and remainder, array version. IRAND Integer, random. IREAD Integer read. IREM Integer remainder. IRLSA Integer restricted left shift in array. IROOT Integer root. ISATOM Test for atom. ISCSELT Test for characteristic set membership. ISEM Integer sign, exponent and mantissa. ISFPF Integral squarefree polynomial factorization. ISFPIR Integral squarefree polynomial isolating interval refinement. ISGCA Test for GCA handle. ISI Integer to software interval. ISIGNA Integer sign function, array version. ISIGNF Integer sign function. ISLCOMB Integer special linear combination. ISLIST Is list. ISMC Integer solution of modular congruence. ISNIL Test for empty list. ISOBJECT Test for object. ISPD Integer small prime divisors. ISPFAC2 Integral squarefree polynomial factorization, degree 2. ISPROD Integer special short product. ISPSFB Integral squarefree polynomial squarefree basis. ISPT Integer selfridge primality test. ISQRT Integer square root. ISSUBSET Is subset? ISUM Integer sum. ISZERO Test for zero. ITRUNC Integer truncation. IUPBEI Integral univariate polynomial binary rational evaluation. Using arrays. IUPBES Integral univariate polynomial binary rational evaluation of sign. IUPBHT Integral univariate polynomial binary homothetic transformation. IUPBRE Integral univariate polynomial binary rational evaluation. IUPBREA Integral univariate polynomial binary rational evaluation - array version. IUPBRES Integral univariate polynomial binary rational evaluation of sign. IUPBREV Integral univariate polynomial binary rational evaluation. IUPCHT Integral univariate polynomial circle to half-plane transformation. IUPEFD Integral univariate polynomial early factor detection. IUPENF Integral univariate polynomial, estimate number of factors. IUPEVAL Integral univariate polynomial evaluation. IUPFAC Integral univariate polynomial factorization. IUPFCT Integral univariate polynomial factor combination test. IUPFT Integral univariate polynomial factor test. IUPFT2 Integral univariate polynomial factor test, degree at most 2. IUPHIP Integral univariate polynomial to hardware interval polynomial. IUPHLEFD Integral univariate polynomial Hensel lifting with early factor detection. IUPIHT Integral univariate polynomial integer homothetic transformation. IUPIIR Integral univariate polynomial isolating interval refinement. IUPILHS Integral univariate polynomial initial linear Hensel step. IUPLB Integral univariate polynomial lifting bound. IUPLHS Integral univariate polynomial linear Hensel step. IUPLHSL Integral univariate polynomial linear Hensel step, list. IUPLRB Integral univariate polynomial logarithmic root bound. IUPNT Integral univariate polynomial negative transformation. IUPPRB Integral univariate polynomial positive root bound. IUPQH Integral univariate polynomial quadratic hensel lemma. IUPQHL Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. IUPRB Integral univariate polynomial root bound. IUPRC Integral univariate polynomial resultant and cofactor. IUPRLP Integral univariate polynomial, root of a linear polynomial. IUPRRAFE Integral univariate polynomial real root approximation from estimates. IUPSQHL Integral univariate polynomial single-precion quadratic Hensel lifting. IUPSQHLL Integral univariate polynomial single-precision quadratic Hensel lifting, list. IUPSR Integral univariate polynomial semi-remainder. IUPSWN Integral univariate polynomial, square of the weighted norm. IUPTPR Integral univariate polynomial truncated product. IUPTR Integral univariate polynomial translation. IUPTR1 Integral univariate polynomial translation by 1. IUPVAR Integral univariate polynomial variations. IUPVART Integral univariate polynomial variation test. IUPVOI Integral univariate polynomial, variations for open interval. IUPVSI Integral univariate polynomial, variations for standard interval. IUPWRITE Integral univariate polynomial write. IUSFPF Integral univariate squarefree polynomial factorization. IUSFPF2 Integral univariate squarefree polynomial factorization, degree 2. IUSFPMF Integral univariate squarefree polynomial modular factorization. IWRITE Integer write. KARATSUBA Integer product - array representation. Karatsuba's and Maeder's method. LAST Last element of list. LASTCELL Last cell. LBIBMS List of BETA-integers bubble-merge sort. LBIBS List of BETA-integers bubble sort. LBIM List of BETA-integers merge. LBRIBRI Logarithmic binary rational interval to binary rational interval. LBRIDWRITE Logarithmic binary rational interval decimal write. LBRIHI Logarithmic binary rational interval to hardware interval. LBRIMID Logarithmic binary rational interval midpoint. LBRINPROD Logarithmic binary rational interval number product. LBRINSUM Logarithmic binary rational interval number sum. LBRIREAD Logarithmic binary rational interval read. LBRISI Logarithmic binary rational interval to software interval. LBRIW Logarithmic binary rational interval width. LBRIWRITE Logarithmic binary rational interval write. LBRN Logarithmic binary rational number. LBRNCOMP Logarithmic binary rational number comparison. LBRNDIF Logarithmic binary rational number difference. LBRNDWRITE Logarithmic binary rational number decimal write. LBRNF Logarithmic binary rational to floating. LBRNFEC Logarithmic binary rational to floating, exact conversion. LBRNFIE Logarithmic binary rational number from integer and exponent. LBRNIEEE Logarithmic binary rational number to IEEE conversion. LBRNIEEEE Logarithmic binary rational number to IEEE exact conversion. LBRNNEG Logarithmic binary rational number negative. LBRNP2PROD Logarithmic binary rational number power of 2 product. LBRNPROD Logarithmic binary rational number product. LBRNREAD Logarithmic binary rational number read. LBRNRN Logarithmic binary rational number to rational number. LBRNSIGN Logarithmic binary rational number sign. LBRNSUM Logarithmic binary rational number sum. LBRNWRITE Logarithmic binary rational number write. LCONC List concatenation. LCOPY List copy. LDELETE List delete element. LDSMKB Linear diophantine system solution, modified Kannan and Bachem algorithm. LDSSBR Linear diophantine system solution, based on Rosser ideas. LEINST List element insertion. LELTI List element. LENGTH Length. LEROT List element rotation. LETTER Letter. LEXNEX Lexicographically next. LEXNEXT Lexicographically next. LEXNEXTC Lexicographically next combination. M List from multilist. LFS List from String. LGIE List, get indexed elements. LIBS List of intervals bubble sort. LINS List insertion. LINSRT List insertion. LIST1 List, 1 element. LIST10 List, 10 elements. LIST2 List, 2 elements. LIST3 List, 3 elements. LIST4 List, 4 elements. LIST5 List, 5 elements. LIST6 List, 6 elements. LKAHEAD Character lookahead. LLCOPY List of lists copy. LLGIE List of lists, get indexed elements. LLTGCA List of lists to garbage-collected array. LMERGE List merge. LPBSD List of polynomials bubble-sort, by degrees. LPERM List permute. LREAD List read. LSHIFT1 Left shift one bit. LSICOMP Logarithmic standard interval comparison test. LSIIT Logarithmic standard interval inclusion test. LSILW Logarithmic standard interval - logarithm of width. LSIM Logarithmic standard interval midpoint. LSRCH List search. LWRITE List write. MAIPDE Matrix of integral polynomials determinant, exact division algorithm. MAIPDM Matrix of integral polynomials determinant, modular algorithm. MAIPDME Matrix of integral polynomials determinant, minors expansion method. MAIPHM Matrix of integral polynomials homomorphism. MAIPP Matrix of integral polynomials product. MAPASSIGN Modular array polynomial assignment. MAPCOPY Modular array polynomial copy. MAPDIF Modular array polynomial difference. MAPFMD Modular array polynomial from modular digit. MAPFMUP Modular array polynomial from modular univariate polynomial. MAPFMUPS Modular array polynomial from modular univariate polynomial, specify array size. MAPFV Modular array polynomial from vector. MAPGCD Modular array polynomial greatest common divisor. MAPHOM Modular array polynomial homomorphism. MAPIDIF Modular array polynomial in-place difference. MAPMADD Modular array polynomial multiply and add. B Modular array polynomial monic. MAPMPV Modular array polynomial multiplication by a power of variable. MAPPROD Modular array polynomial product. MAPQR Modular array polynomial quotient and remainder. MAPRS Modular array polynomial remainder step. MAPSE Modular array polynomial, solution of equation. MAPSEV Modular array polynomial special evaluation. MAPSUM Modular array polynomial sum. MAPTPR Modular array polynomial truncated product. MARK Mark. MAX Maximum. MCPMV Matrix of coefficients of polynomials, with respect to main variable. MDCRA Modular digit chinese remainder algorithm. MDDIF Modular digit difference. MDEXP Modular digit exponentiation. MDHOM Modular digit homomorphism. MDINV Modular digit inverse. MDINVB Modular digit inverse, modulo BETA. MDLCRA Modular digit list chinese remainder algorithm. MDNEG Modular digit negative. MDPROD Modular digit product. MDQ Modular digit quotient. MDRAN Modular digit, random. MDSUM Modular digit sum. MEMBER Membership test. MIAIM Matrix of integers, adjoin identity matrix. MICINS Matrix of integers column insertion. MICS Matrix of integers column sort. MIDCRA Modular integer digit chinese remainder algorithm. MIDIF Modular integer difference. MIEXP Modular integer exponentiation. MIHOM Modular integer homomorphism. MIINV Modular integer inverse. MIN Minimum. MINEG Modular integer negation. MINNCT Matrix of integers, non-negative column transformation. MIPDIF Modular integral polynomial difference. MIPEMV Modular integral polynomial evaluation of main variable. MIPFSM Modular integral polynomial from symmetric modular. MIPHOM Modular integral polynomial homomorphism. MIPIPR Modular integral polynomial mod ideal product. MIPISE Modular integral polynomial mod ideal, solution of equation. MIPMIP Modular integral polynomial modular integer product. MIPMON Modular integral polynomial monic. MIPNEG Modular integral polynomial negation. MIPPR Modular integral polynomial product. MIPRAN Modular integral polynomial, random. MIPROD Modular integer product. MIPSUM Modular integral polynomial sum. MIQ Modular integer quotient. MIRAN Modular integer, random. MISUM Modular integer sum. MIUPQR Modular integral univariate polynomial quotient and remainder. MIUPSE Modular integral univariate polynomial, solution of equation. MMAMNSB Medium modulus array matrix null space basis. MMAPBM Medium modulus array polynomial Berlekamp matrix. MMAPDEFL Medium modulus array polynomial deflation. MMAPEVAL Medium modulus array polynomial evaluation. MMAPEXP Medium modulus array polynomial exponentiation. MMAPFS Medium modulus array polynomial factorization, special. MMAPGCD Medium modulus array polynomial greatest common divisor. MMAPHEG Medium modulus array polynomial half-extended greatest common divisor. MMAPMADD Medium modulus array polynomial multiply and add. MMAPMDP Medium modulus array polynomial modular digit product. MMAPMON Medium modulus array polynomial monic. MMAPPROD Medium modulus array polynomial product. MMAPQR Medium modulus array polynomial quotient and remainder. MMAPRC Medium modulus array polynomial resultant and cofactor. MMAPREM Medium modulus array polynomial remainder. MMAPSE Medium modulus array polynomial, solution of equation. MMAPTPR Medium modulus array polynomial truncated product. MMDAH Matrix of modular digits array representation - convert to Hessenberg form. MMDAHCP Matrix of modular digits array representation Hessenberg form - characteristic polynomial. (A matrix is in Hessenberg form if its entries below the first diagonal are all zero.) MMDDET Matrix of modular digits determinant. MMPDDF Medium modulus polynomial distinct-degree factorization. MMPDMA Matrix of modular polynomials determinant, modular algorithm. MMPEGC Medium modulus polynomial extended greatest common divisor. MMPEV Matrix of modular polynomials evaluation. MMPFBL Medium modulus polynomial factorization, Berlekamp algorithm. MMPGCD Medium modulus polynomial greatest common divisor. MMPIQR Modular monic polynomial mod ideal quotient and remainder. MMUPIT Medium Modulus univariate polynomial irreducibility test. MPDIF Modular polynomial difference. MPEMV Modular polynomial evaluation of main variable. MPEVAL Modular polynomial evaluation. MPEXP Modular polynomial exponentiation. MPFFAP Medium prime finite field array of powers. MPFFAP1 Medium prime finite field array for plus 1. MPFFDP Medium prime finite field defining polynomial. MPFFDPGT Medium prime finite field defining polynomial, generator and table. MPFFEXP Medium prime finite field exponentiation. MPFFGEN Medium prime finite field generator. MPFFPROD Medium prime finite field product. MPGCDC Modular polynomial greatest common divisor and cofactors. MPHOM Modular polynomial homomorphism. MPINT Modular polynomial interpolation. MPIQH Modular polynomial mod ideal, quadratic Hensel lemma. MPIQHL Modular polynomial mod ideal quadratic hensel lemma, list. MPIQHS Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. MPMDP Modular polynomial modular digit product. MPMON Modular polynomial monic. MPNEG Modular polynomial negative. MPPROD Modular polynomial product. MPPSR Modular polynomial pseudo-remainder. MPQ Modular polynomial quotient. MPQR Modular polynomial quotient and remainder. MPRAN Modular polynomial, random. MPRES Modular polynomial resultant. MPRESDB Modular polynomial resultant, degree bounds. MPSPRS Modular polynomial subresultant polynomial remainder sequence. MPSUM Modular polynomial sum. MPUC Modular polynomial univariate content. MPUCPP Modular polynomial univariate content and primitive part. MPUCS Modular polynomial univariate content subroutine. MPUP Modular polynomial univariate product. MPUPP Modular polynomial univariate primitive part. MPUQ Modular polynomial univariate quotient. MRFMAP Matrix row from modular array polynomial. MUPDER Modular univariate polynomial derivative. MUPEGC Modular univariate polynomial extended greatest common divisor. MUPFAC Modular univariate polynomial factorization. MUPFMAP Modular univariate polynomial from modular array polynomial. MUPFS Modular univariate polynomial factorization, special. MUPGCD Modular univariate polynomial greatest common divisor. MUPHEG Modular univariate polynomial half-extended greatest common divisor. MUPRAN Modular univariate polynomial, random. MUPRC Modular univariate polynomial resultant and cofactor. MUPRES Modular univariate polynomial resultant. MUPSFF Modular univariate polynomial squarefree factorization. NEXTSS Next subset. NORMEFD Norm polynomial early factor detection. NORMFAC Norm polynomial factorization. NORMFCT Norm polynomial factor combination test. NORMFCTS Norm polynomial factor combination test subroutine. NORMFL Norm polynomial flatten list. NORMFT Norm polynomial factor test. NORMHLEFD Norm polynomial Hensel lifting with early factor detection. NORMILHS Norm polynomial initial linear Hensel step. NORMLHS Norm polynomial linear Hensel step. NORMMF Norm polynomial modular factorization. NORMRL Norm polynomial regroup list. NORMSQHL Norm polynomial single-precision quadratic Hensel lifting. ODD Odd. ORDER Order. OREAD Object read. OWRITE Object write. PADV Polynomial advance. PAIR Pair. PARTN Partition, next. PARTR Partition, random. PARTSS Partition sumset. PBIN Polynomial binomial. PCL Polynomial coefficient list. PCOEFF Polynomial coefficient. PCONST Polynomial constant. PCPV Polynomial cyclic permutation of variables. PDBORD Polynomial divided by order. PDE Polynomial division of exponents. PDEG Polynomial degree. PDEGSV Polynomial degree, specified variable. PDEGV Polynomial degree vector. PDLOG2 Positive digit logarithm, base 2. PDPV Polynomial division by power of variable. PDVAR Polynomial divisibility by a variable. PERMCY Permutation, cyclic. PERMR Permutation, random. PFBRE Polynomial from base ring element. PFDIP Polynomial from distributive polynomial. PFDP Polynomial from dense polynomial. PFFAP Prime finite field array of powers. PFFAP1 Medium prime finite field array for plus 1. PFFGEN Prime finite field generator. PGCDE Polynomial greatest common divisor of exponents. PHDQR Positive half-digit quotient and remainder. PHDREM Positive half-digit remainder. PICPV Polynomial inverse cyclic permutation of variables. PINV Polynomial introduction of new variables. PLBCF Polynomial leading base coefficient. PLDCF Polynomial leading coefficient. PMDEG Polynomial modified degree. PME Polynomial multiplication of exponents. PMON Polynomial monomial. PMONSV Polynomial monomial, specified variable. PMPMV Polynomial multiplication by power of main variable. PMPSV Polynomial multiplication by power of specified variable. PNDQR Positive normalized digit quotient and remainder. n Polynomial number of monomials. PORD Polynomial order. PPERMV Polynomial permutation of variables. PPLT Polynomial prefix leading term. PRED Polynomial reductum. PRODUCT Integer product - array representation. Classical method. PRT Polynomial reciprocal transformation. PSDSV Polynomial special decomposition, specified variable. PTBCF Polynomial trailing base coefficient. n Polynomial total degree. PTMV Polynomial transpose main variables. PTRCF Polynomial trailing coefficient. PTV Polynomial transpose variables. PUFP Polynomial, univariate, from polynomial. PUNT Polynomial univariate test. QREM Quotient and remainder. RED Reductum 1. RED2 Reductum 2. RED3 Reductum 3. RED4 Reductum 4. REDI Reductum. REM Remainder. RHI Ratio to hardware interval. RIB Rational interval bisection. RIDWRITE Rational interval decimal write. RIL Rational interval length. RILC Rational interval length comparison. RINEG Rational interval negation. RINT Rational interval normalizing transformation. RIPROD Rational interval product. RIRNP Rational interval rational number product. RISIGN Rational interval sign. RISUM Rational interval sum. RIWRITE Rational interval write. RMDUP Remove duplicate elements from a list. RNABS Rational number absolute value. RNBCR Rational number binary common representation. RNCEIL Rational number, ceiling of. RNCOMP Rational number comparison. RNDDWRITE Rational number directed decimal write. RNDEN Rational number denominator. RNDIF Rational number difference. RNDWRITE Rational number decimal write. RNFCL2 Rational number floor and ceiling of logarithm, base 2. RNFLOR Rational number, floor of. RNFMR Rational number from modular residue. RNFMRPP Rational number from modular residue, modulus a power of a prime. RNINT Rational number from integer. RNINV Rational number inverse. RNLBRN Rational number to logarithmic binary rational number. RNMAX Rational number max. RNMIN Rational number min. RNNEG Rational number negative. RNNUM Rational number numerator. RNP2 Rational number power of 2. RNPROD Rational number product. RNQ Rational number quotient. RNRAND Rational number, random. RNREAD Rational number read. RNRED Rational number reduction to lowest terms. RNROUND Rational number rounding. RNSIGN Rational number sign. RNSUM Rational number sum. RNWRITE Rational number write. RPAFME Rational polynomial, algebraic number field multiple evaluation. RPBLGS Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. RPDIF Rational polynomial difference. RPDMV Rational polynomial derivative, main variable. RPDWRITE Rational Polynomial Distributive Write. RPEMV Rational polynomial evaluation, main variable. RPEV Rational polynomial evaluation. RPEXPREAD Rational polynomial expression read. RPFACTREAD Rational polynomial factor read. RPFIP Rational polynomial from integral polynomial. RPIMV Rational polynomial integration, main variable. RPMAIP Rational polynomial monic associate of integral polynomial. RPME Rational polynomial multiple evaluation. RPNEG Rational polynomial negative. RPPOWREAD Rational polynomial power read. RPPROD Rational polynomial product. RPQR Rational polynomial quotient and remainder. RPRAN Rational polynomial, random. RPREAD Rational polynomial read. RPRNP Rational polynomial rational number product. RPSUM Rational polynomial sum. RPTERMREAD Rational polynomial term read. RPWRITE Rational polynomial write. RSI Ratio to software interval. RUPFMRC Rational univariate polynomial from modular residues, with comparison. RUPWRITE Rational univariate polynomial write. SDIFF Set difference. SDR System of distinct representatives. SECOND Second. SEQUAL Set equality. SFCS Set from characteristic set. SFIRST Set first element. SIAFEE Software interval algebraic field element evaluation. SICOPY Software interval copy. SIDWRITE Software interval decimal write. SIGN Sign. SILBRI Software interval to logarithmic binary rational interval. SINTER Set intersection. SIPBHT Soft-float interval polynomial binary homothetic transformation. SIPCOPY Software interval polynomial copy. SIPES Software interval polynomial evaluation of sign. SIPEVAL Softeare interval polynomial evaluation. M Software interval polynomial isolating interval refinement and merge sort. SIPIIS Software interval polynomial isolating interval separation. SIPIR Software interval polynomial interval refinement. SIPNT Software interval polynomial negative transformation. SIPPRB Software interval polynomial positive root bound. SIPR Software-float interval polynomial reciprocal transformation. SIPROD Software interval product. SIPRRID Software interval polynomial real root isolation, Descartes method. SIPRRISD Software interval polynomial real root isolation, standard interval, Descartes' method. SIPSIZE Software interval polynomial size. SIPTR1 Software interval polynomial translation by 1. SIPVCHT Software interval polynomial, variations after circle to half-plane transformation. SIQUOT Software interval quotient. SISIGN Software interval sign. SISUM Software interval sum. SLBRNIM Small logarithmic binary rational near interval midpoint. SLELTI Set list element. SLIWE Standard logarithmic interval width and endpoints. SMDM Sylvester matrix degree matrix. SMFMI Symmetric modular from modular integer. SMFMIP Symmetric modular from modular integral polynomial. SNLBRN Small nearby logarithmic binary rational number. SPOWER Sign power. SRED Set reductum. STATSACLIB Statistics of saclib. SUBFROM Subtract array from array. SUFFIX Suffix. SUNION Set union. SWRITE String write. TANGENTNUM Tangent numbers. THIRD Third. v Table lookup in list. TSVSLI Test sign variation on standard logarithmic interval. USDIFF Unordered set difference. USINT Unordered set intersection. USUN Unordered set union. VAR Variations. VCOMP Vector comparison. VIAZ Vector of integers, adjoin zeros. VIDIF Vector of integers difference. VIERED Vector of integers, element reduction. VILCOM Vector of integers linear combination. VINEG Vector of integers negation. VISPR Vector of integers scalar product. VISUM Vector of integers sum. VIUT Vector of integers, unimodular transformation. VLREAD Variable list read. VLSRCH Variable list search. VLWRITE Variable list write. VMAX Vector maximum. VMIN Vector minimum. VMPIP Vector of modular polynomial inner product. VREAD Variable read. VWRITE Variable write. external ===========================================================================*/ #include "sacsys.h" #include "sactypes.h" main Default main routine. saclib2.2.8/sysdep/doc/saclib.pdf0000664002275300236100000162575714017255270016003 0ustar wcbrownscs%PDF-1.5 %쏢 5 0 obj <> stream xWn[7k7ˤ<..;Nc.=CRCj p8sd ϓwGyzw2ӻ畭_N|zM6kgc6oWl:)ɧisUFdc.K6A=V[CՔN=8mSR9%gljz^FozSwMp֫h}>o|V@Du-~/Ožp B} S.$S)xGB?&%%O|f<=QbgZmH d&E_\ƻ H~Z#sr%7Rg"T&v8S\]/'M\F{,wY]:8NЃ'qh%GmMV+= KǦH b}bQ?V'}hd)j"厓=ͳGi[ZO社)b3og&9l5^b0g,j#1hrq{LnT9DŢaW(]8i*b 3 e&c|0}V5_Q(\5znrT:2Vr|Atd?M0ft?zauwtmݲ=ŃE/%~SC_8gcy$\\/^^ܶNg-rJUvmL eaϲ^v3Y]|JĺŸh$pQ ^gIMʁ5 c[q;D<Agڠx0ZCxC 0x_:(klfn*@۷JE_u*(PxCC>l>%sVb> stream xZKs3bo"cJYfNvHQDTt_O70m`J_ݘ;)Nҿۋ~w7rwsBݽvQD]oZw΃PvMRXoC:~BK觿5~So_. mm$ .pW8饣E(^;צYkB hS/r01? hA: vaPB:fVLLOA8oo"t:*t}Rz:-svwG@|(a1-\V6A+if< _F݄}N<FJy;#Un6˗3Swec䡖ձ_օPuRW?cByc :.\AfN|5ϣk3w2݋h?)${.@8=tu縧 J/LtV5{LtdvҨ,$X7?}oNOʔ$ST";(d*arKh$h| :GGWqU %% PP_.+"oc`Â׳\zk*۝PtМyi1Iw!Rn@oh {,yM$SD0 BʏZ }7[*sગU+÷y1tN*UX P3Kֺ=*˶ T;Н.vNT¢W>ۡ ~UwsUBx|1 cTKrGh\DHsHd߀`qZRntf?}2O %yeҒS+Tr"@#ǙZ~l|wiNBU[*'([Vj:Ep7\|C߼y2X<}$ZL"IΞ&8Oolxrj= M. ~E6|!،T=_e87O'i:V'JE㐔vAvwd5SV uK0oh#dCW-@󸡃9fDzJ#k^ޔFwh,,@>EU.`wqm i, =TY;YXdMB3m/x̦UX5SeE(]ƨ_]q[P! n nMƸ6ALm.d9+yZi.26HBe_EgH_W*RJ:^F;5|_ 4g]fL .`/VuVV+UBU"a4u\™zBU4,E6OwU! @z`]oj@Icú|*bJz۳.6zV'as0" 46IQ$W%Yըu*=qy}>~z=B܎k<6EDdk(% 6 ]` ` 9O3OCm|/ $Nf<:.c>w- kkDuTtzpI^腳`UamNrֻ8lP UC:jy._^Sc7+ bypui3n!4_N`4cIIՙ7dW8 yfto%}fҰd+[+ѥ}9G/NhZ01G9@Ƴ*2~~@ijH*5?z^{s ]Hbuƌ|hH(kZz@OwL]fWtQvÈ7GõOуt"z0@zg8"{TTn{Zr^aR &וrE찚_SO(נ:*IַrT}.WB`z4m dd㋚0}vƇΟ0n@B-/ʌoZق.GaU.1%jwHh5H4XV%}" .deҰC؆!l6+zܩ2-H%L3 2Se=Ak?%ꤱٰ@O*NaC&% 2gJY7ex֫;!?n hOT(/cZ24t7/-)z o\_( };`rl}endstream endobj 22 0 obj 2602 endobj 30 0 obj <> stream xUKs1 W9%ul0\1ڤ ǿGw9009US;mgg^>n0vu; tI'aoԑvnY]\/{}ߔyT0F\$uUZ"*vC 1P׃R5FALA} ׈nKbtJS`ՃpHBΘv)ZuSx]#C5x'6:+r`!՚<%Ƹ: ?<(=6 &l`ތnfYmKA3h*P|31a/yEGu0y̺Ep%MQN}q# !.tP]VqrJL3iijô !61+Ov߈s}KA.s_JLD:,3ZĈ#Jw<kP koYAb)x9Bb11& <1lʷpN(Jeƨc™J9]*Kk"'3o+ؘ >M4<:\Э7Oi8}U7|XCO5Ad3[IkH۪|$H&G¹-&5+'%")%cM'%vF)Q>l mҺM>kOXx[gm~34L/Zs3jk~=Ք=>עftbLU` Δ[6[{3,>}endstream endobj 31 0 obj 783 endobj 37 0 obj <> stream xYzThŻs Nba/٬^.nuOwϱKcku)van ]EAs2 4>4! C6).nD־E \ؙ=r(=SAKr5ctMMTDK;,c-7+JgEE*x& 2R}Enz?'-]OWGQ$2OV iWF^1ɹ%ݎ0UX0aLܖ9<:TCX83yKfRv2r ũӠצ5/qQ!S `m}&d7V({/;$Qw>t0֏+ .qyg)25Edq.Pȓ#)P2I6 θ<гmO~t%`W ,ަu6$ ZY Z&w?),40",{h^ۃyrm"Åݓ6 mawn:;'G`z.'ƿ^Ԝ @\wNLLkq}G9%e>#`ӗ9hca]bCשqgys˘u%9s6qր iU2=s@ڝnUQܟ?paWKH81.TD~' /`57JMOiohi}с"*|GԠ^?h#_+3=}QYpAFF"LEDgM2dG5L):}dsvQȩˁExWTW6m%_v7u20v[?)5X6l4/U2W: wXEaZZCl΋Kas-d@Qendstream endobj 38 0 obj 2414 endobj 46 0 obj <> stream x\KsOG̑4'$z*9rؕX֮Z43l3;,ƃǯnyZd'>Y|,lyy? @,]ry57,776jvBʚ՚*.t/3ͭ/k2劵̢+[4Vk6gפK$:6(_kk9m/0*BS1hl(*ˤzkl 5-#VWiC0 _9QpB1W{9/+x;f^LD<'U9Z;o!$燷LKc.I{m:trc*83ˬcO Z~õWεڲ,,$ JkHOq/rȈZ'9(;dBHPvƖZWׯGn7~{\3;!-7.6,"F2IGUJ\,%3%Kgh3g|uջPwFHIcm>)! T'L2E{Q9/q!V-#kUmH]s:pv.mĕw+FyשJ*6?DRfXTYA.U^kprp_B1^˨uˋ؈_~p\' %ұ<֨< p %ojAZQЩg~z&.CU>v k*zhC$&p:G>ώon$Co$ ORW2h2śbY!P9AsN jڵdu gd)I5Z/NGk~0\h}EǥnWP̢" Pz5E:k{$EvqwZO|*p0p$tfDQr9r&j8rLd|㹎@X>G=N4y4+Z, 6'i/dI[dEr;) sL PMKL´怞z> $n*Vc>q}>8Cp3R0qgeLV[>LwH{By'U(f9 қ=7V+;ˎ83h⭊+^=lB6 0vEy[KչbG O NU'sVV;[Lj߆U£uaI^yʒ}*0?:,Eci-pmiLRTes:DDʬ_ip")ADcj,rt&\ jv.=3`ZC^<[C\jV!V(t5WC 1N .+|;*KtFP C&!8TɫNn?463sB-PIϩtɂXI$E>?'[8HNм䪅c*q0Bm/qFmc&~1'0< 1!EhG54? tkQF QKقclDkG D8BӢJ2j 'W  Aj%?U"g OсhGK:y)싥Vh7AKrQ!p8MFr)9DjЙm 3HI_D EOK_}RK) FI;ôToQwqUJ+$}Yz$ǟH9>֍ d?}]`8rwnA4Dd84fK/7Y:ih~VɴR朓r5vaѡd^| e$߬ a):-)#r(SuBi(S9:(~V!<}K"h7%[_ߙCnq%Y;65]1ڶ"| a-N9ire.1as̎A140ΎIy3C.H&'82.mN摣:WmJh$^0╡>#C ߬#(aGtءMo?".$: m/r8YJ 6ʵ(әMgkqR< P4a; iCZy'F7BI }~Lj;2z/,MHY!_{?V Lendstream endobj 47 0 obj 2557 endobj 51 0 obj <> stream xWKo9ϯ[b*BH=8<ђ~>eww=LBF,B}jw\ PxJEPvk{2.,(ܭ$tI> stream xM6 :R`2=$iigm[C_ٙݤ٤I}AJ([ln&i Km,4.ӛ75+(yVMY_7h!&YY߬~3'm%vdوY̻2f$(DM7 mKOF" AXP$?6O;+ReO+(VȜj.K QzǙ]Вk*{.r$B+K(.TJN>jl6c â"cϠ')p,iqC>07 qx.8҄w|1@xgbG|J1RU+_.uC ,W }y֛#R: +'#~a5:9yQxb/NyU}m9tO^Wɟr$=z"[k>@ׁ Γy'c~Dkt>];~Zh(-*:j6Ypf=Y7hp;[>B쵗 %3gO'Rnj7ϲS c˨r?x_].'E1=ہ=X],jܼ5:Zk)86 D]c Vݜkɬm*χ>qI\ |C6ɼn *7KeeoE¦~N[? H <3ja̧w,X> stream x=ɒqwOovAѴeY"l$@  $R8םU/kɞ7 ZrWjW }zzGxU۫_?6_`Փʗ*MGsڜWO}7j6yOY9u7zS'}Gh==gQ~A4 1&?O~[㶘%Փ=zw< -ϧ7Vf)xsp83hL>*z oamtv1xzR&3>c\ILvOQyߪvuV}ḇmM66 {ٜdBpcp Lʦl \t6^ >i¥} [AtvJӯLZPo)eԙ`6*&8}=W϶76[M>fO7m]Luo:X |ldr>f)Dr0),p`#\ËV}Qp![w/Ϗ[E(S6 w*ħH#b-n|=?opyU%:M=;Pe.pxZ[6| ;KMc&X0LlU(6Y*?+΁]USoA$k2a pTܳK3`GOH 7G ;A33rqW;_J4U;* k_gLȟh8 evnB3<(1Y@Rg/[$N;1!/n8;ix@;Gt&+F\)(Sd.FR/\ AT.@Lg` ,߆[DZiPgtECx }ymQrUhhIN߰^ X~M [4`:rO |y[=".vq/ߓ5Sm'7ABc٭Ε ߖofxق '^@"u2D6/+J<!#>zQP}SL~Nxr F`NPk`y0.CH`Q-GppE3͐!mݝ7Me"Mȱ["4AaZg{YvCTdA\(12"vJN^Nh֋]3s|5>[P@ ey@F{G9$ϼt[=UttvwpNF'H[g@3&LV9؆["h#@VQBؓY9U 9LA`~]-fg(l,؍ƌz:E-3VZ5>JN9fҕD܎lwlgܵ½@\JRєܻ] -1>Wn!,?|,2T^þgD@^&.okT=nvkYɇ)ͪXUHF cʆNJw Acxwk!ue/ /?\3tQoiNY:|Wm`ޭqk౏.} pYw$a`'2.vX-5?b» z[Bc(hca)'n.wukT,$-WYPۗ"2Ev ɠ$wXHgH>|":waMDhPdſRp*d Z. NDO$v3Q]4` t 1D jA!|@0Q ݰLkN! < KZT5/)DTOI4̙33G** L !ˆ&"B h~U噌 }舁pV'rc_>4I`"J?izZ(gO5Jz] ۔dr>9ȹX`EN|W3F2̭5Fq}]H qBrUA mTg$C`SZԦ(B8V$*Q9Q@ρ0r61fdO򒜋,V R 뵊c\>E%Mwe ՞3ӷetB0IjwNhWf {IH=pc`s9%+esJubNzEqgv]?Qt >DNk&tZM^ow9\e^0_" qX"u腰+gj2y3F7@*.| r'Yt{V8>seR!4Sb`㤗S-8:z=a)wyOe7:t5!4k(E_,n1xGE#KD䳶Gy0]%lp!tITdAޟv[P@FQ gF/2<2g{L\L$3_ 'ڢ\c1'P0K؆Mrx?.sc2?P> >K;:k2ĽNWP@:Lv XewY I7Uyl=̜YvO-,Un pxMcqt; {4{REJ^w.'׸7I2ep$4 &Gz\cq{H48OңŌFd{fh0:Nz]|h OW.ռR4'f:aJDNM&Tk3{wajnᤈ Kd*BlE>V  Ʀ8ǚ= +.{,lbDQ1Ɍ{zÜm -U=B_tiLpo[Z:ug@kn찀B<\|=pH$]PFL₇0I++9&b*cA̲`:c%),Gİ{9]t1auֱ](߰@dh# 3Hrpv Nϲ /Jrݾ{zz_E!M [IZ;d8[(`rvDdXWԲp@H\k"1a;KeA-8? P>#p?ݝ[is^[75u]\ɧzq:6bhquQY,4y956+^@\1= F!S 2bW "sc+3`:2c-8Ũl|CEUL#6γoco8"M ^qmH`G,b=U쨅Eビ{~|-K*(3j r}#ea!_{HN_] C6^B]R+WȰ})iW«w-J!ZTҲ%ݣe>W:: #0wT.9AAY'\$.T4ŵ eyb"鱧dЪeCaa1$vAOhRrmC*Xub{ ϺCZҎTHAIP}i<.m|1~4SS9sڶSNkЦspH4KG} .X>Ha 皒95֐ X|$ )50jl#iS}"+w5Yj50[qiX}XkX"s gpmfc+>šB>,n5}4|lUak()*~W챷/Mrqd+ y r#S] @@7{ ۲Qk}\,E\$swrDYO}z!{® = KY5կsbV9.Ӈ{KBWYZENKWXv.N]}e0-xc9Y.&etr!,dдzZS.0[#ޠ/nr01 *w }%OZ3s UI=z [oLasgmD^> 5ҲIm|\e&Nj5ێX#L 0`g^{" #m sur}{i`ܗ%DmJ/<|t2y n9'13_e[ ?{އm,q r~x2c bJE U9[2YTrvjEo56B/K-q8EG)C:mBS ^pAs1-t&گ;5u,=a_M9bOUri,Lp[Y`XЏz1~ Y?aǰ>mtµQ 8Q{g>׆}N~צuȏH8ȡ-Oy Dp! ;(ؓФ>j8C>ׇz0xȖ{#'<7{jxЦBE?.Ϳ˂ 0b?`hˍi+KU *.9aѶKAt`hJKD}X }F]$u9yH] 劝"+xZ?yD-x Sls3hnĜ!M,d*=lAEƩ-;\2ɣ5endstream endobj 66 0 obj 6595 endobj 70 0 obj <> stream x=rGrwz" Ѫ}3e4H I(ɬ;kF <٬%+x&y&Ogwggx>Ktʙ/Ypy B,Z;mNo|*O8!>iVi0&zKqp)B#2 ÿ8^-=1ǔ)8$J"*;V6,|Z絍e#: $ yz+w,"K^@ؒn^g)=tuyQyK(/:v;AWȅ|IDuOPE"13h936F~c5eW¦Bi]bS6HHHǂ~_>%}GIWىTh h:@&: vahҤHؖx9#. uȲ▖nߟ](@-Yo-WEGy~//y7#Q9E)QW_x& ЌXOTȧ+#PIރQp pj|C~/wFdOiЙEemʂa ݅%LK"ZH?90P׀XѺ@s*X98p2B^Uw]x8< d SW|]z'yqbd[3|Ҙpp Pru9q=TͥZ/_m j(epМ"`@Jj뒱SnWHi@jeB@'QK{*'&U&@5k/ iQ<=&S딙D Ec6iDef\`JocVM%>HU\/ |Q~~v̠~8ʼ섲Z648O׿lk56yt pR٢ߙjJaE%:c̈<䛓3)q6m9eGyh1e>teVǼҸ͈|Ke=ML)مU.XG{p0>i!gi>5hauPkדvđX@ƃ̱.<:P\75 '[& Y[Ql@r쩯h@ "3G`Nwқ~ WQHL`C[xPm'4q*[&/4%Q]^ŁFPqY\p@A 5izbwn6j\0.9D|5ҫ{'RͦzH{D MIyu(/YLg*#T1;0R "9F2 UY:I*"mʆHOe۶Wy]p#4#!9nϩ.VtKk ->%:uqv^_U:rІJuMP_>4 `۵L;xwG<艠/v¬ʧe5OK1B't桙)2j*-D\TГu !+,&ѭ'=GȘ0<0XS(sN5S DlalQ,ۀJL ~q͑B]TyS#g%FH -qK nli20͉^#4*4UD|F3c:Jj?AӼD|31'L@O=L*y{f8/?M̬A^W@xv88d4V)gԼ;P풸I9&' 7sE\{a&ٜ,*N/=ɓBS]O$U` IS3ۊK>S\ܒVtE+UrnwjҒ)30v#p5]I$Nv!2|y0Okm -&f"*^#oĤMC>f\ɢ7YS}g1(F]`2# %sE9g'uwv|9Hm g*=N/؂20-( s`ұ e 5"UZz^1ꬿ-L%Wl̎X|8h]e33{GLzڳ4kw׌I\] \یn!Z>*o%I?MӬa$w鮄v1he8ARtZLCb7+gɰ 3g۶x9 #]f`R;k2M/&NЌv,@Zj3]2'Lt~Z4E_N@cm&8&\E T"20DIǴ!i%{ICF<и#n3SEb W$Wx3lV J IK` 24\ɶ4GJ$@&%^%(An>}huL^ ސYJ)墔 `rZq_ΐEqX~Kvl]ʭYK*n>㈨+a||Ԅ\-!dS}~SyV y[28S(07Eqbf]~z?e1C=r붋w>*y; #1a $)_rt~ݦIԢ+fLgơ`|$z"%iF! a;:DxlTYȹ2Q[n b3aV,f3<]ePsPo]x¦vV#q`gpT~)P`ڄwJ3|RԚe9gCap#ҋ*Xoi%o_3 krեPzA.{D' Uc@3t! GLLZ&}Qci:wDd%~]s ]lm'UZ`bSA#bb R/*7[\4{Hyٍ0)FRBD^kFTn𥴳JAIg :&fz9귾>ݳ} 2kzc( ݩO{GRx!;dL=&tB1UE,'l8lXƺΣa^_vƘ)yjI}/?ވoxfLMr}9Ծh=+練sQ4pD.}RtLȑB(U;Mtj/+w3AdnV3 U(*+ [>ffOҔ ]x*5bQL~Ř)_`A4҈h4K!NTk)f~s( M|+U\^U.o/G |GBg`7/* x*Ə]/G6XK8_(P=5][{eQUo.qT\^ IV gi:z`+O ޟH_r}Ʒb7.O4'j+WLmDN$ "1KLe.O'4\!JBzZ>O2 FPg1`ȯM#K]>5Ԋ!s+9+c\VmwpN9"rw`E>XNJ$0l)|$u9K.!>JNU1F) qs$a&#҈!-t buS`͌Hj!KW_I4Kymi4leOdͯ)2k1T(eQLWv~βlKd-Žw3GkNpOz.v w!rN"к@nW%T?T~hlҴ[3rCv?F JL~ V=O!uΓ[;m}dEѼN'[Nm~CM`>wZP:K˽+aOV3qTm 镙5m#4IJ}=wj.,.R4 ڶX>mI뜔FeVFE@ }b?$(/ oϘP49J}y %=]`a(5 B Itz8&Q~q > stream xYIo\E8FLEB!DHb8l-87]^ Juu_U=8ŋ}7.p?rxC`JE)opfN֗˃=HV۰|^RTꯙj\[iUn2VJǻpe wT,p6ۥn/b 'kS2 ˌaC5fN1PXPjyTD4$x<>POוz?-*ȭIʷ{]qRq D}ߦ u^tnj} $:q#]}LIZK /M E/ʑJ2ka#>TYP+8O=oV<49ΜJ9g8fgpHTH̙q'qV8k]:fQ#@vj3.=[J)=K7dR2͖bMiB9J:;iW1cB='I0*m+RLRXVf/N`~DUjʛ~|äenjw0I}>1FSn Z?,#ҜJD U(4\[ U|v/g h*Xޱ6UUôT`Zy\(%Zm5>.7+`^C)Զ ;^6 Z8HWODK 蒺Īe/1:{CTޮ="z]#ϥd9-%Dގ0}Jezޫf3v4b Me,yc :Rm;i-<ҹ" qL)?Zm0IWRu%1 Fmѽ#5NɰNLlyO6+WY[R+̴: fn~"Cp&s2wBX;3*x/| Q[õ̬)l}3[LtB](, M0Acba(3\,|IraRC)! ^p5NqLj%X_nX8z]XOci{戀DJ_t<ժD[(dvFt&;,@Va3h@ӓ8*o @]"Բ `M6Q؊5 y̚m/%P'9l=J0aFnŏt l$47Y\]!" ҒvB픅dRw=ڱɫ?M3 X>F{nAQxWc~^/ޡ}^ᗅ93 ؁t-bqA:#8<f_,2>#aѩ"p ۰Aa$OwN@IGHK8-3q^#Cցh<7V<idh?PŬ$)idY0sܗ%^өBqa`ǒLߤJ`i bBRmuGը$Ok"8$\EImfk3j螘׸ث0slsTy11?&tGٳLEE> stream x\KsΙ\Ly'@"'N)Ǽ9((&EIҿO73 0$U.4F?~ovb;A/o~w?7g2\>*@Lւ]|{;o'?icvg_p~RH= tn '጗C@f{C@*qLwaů?O y/C }=hI"E:w8DR/ϑZiNj 6yF=5_8B*{zRɹLiIKܛĭ5J*i}武%#;V>&ZgopҌ|ּdcnqx:2N2߈?`B^;Kio/3ڠl!@k8&+toP/PП!8%+-,~@YG%9.""I79mڰqz'm^gWB+ɹ% oQ<#8'Cm+>"EHXrJ'|EƞwlJ>//| ]U0FȾ󓳋ExBOҪ)KA|+wA &?Y&1PUDZ(xS&+!t:4Esڟ8QmJj8RϬ(y kXPgFgm"hbѦڢNԲDM>Q?R~ߤCe(sWN"tЇ=~z0= EWdO~ K*qxāC2v}jyp qWoUsu s |BQASIv>rD6mFsN6 O CLD_:3LjI#"wH4OzƍMBȮkMv|@G$.@M4:E[KqU)) zQIVE}b8z5G$3)ŴN cd6:a؜";QYhKp@Ag7z$?loE@8`A!vƍI|uU/oJLK =}2rSޒэUܨᛛsEPn>8 B-ʞ@c.!;#hfqҫkZ]& wL#,誾;7Q/ǟU>3L1GP%v;~V pj&I0#HΖL׭mǠ9UZ Xƃ1էFUu*QN֮sqݑR>9F_ۚ&ÇŇj,ZΑ#>ՈoSCI9+*":/ @4&8AEfIy8Bu3 Eә$1#W ʀNiĸ~UZ$K:`$a#;`\֓0fNF{Dv{?CO*|DȂ9%9:M!Z~JGr+p2"F4.hT$9 ZXQ^QxI XYz+K3kYD+#c._oN Eؘij(P/ѴUFiq/fҴT$" Н_p rĦ0 #tMm!>T#0˅`,G騎53cQͱS~\6"fRG)֋z~Ty5@9spw;~|@hh&b}bPK~䶪3,҇dGD`jhU ֧5"2꣕i2BNakc +YMidH C@{Cn#B,G.T!(_K1|Ѓ]`4+)Ѵƈ)lvZܘIYgʻ~ y"Gv܍Jopԡ<.Isvm./l[v㊕.yC'dL'}? Zn]5Z/Wu l9ﰼea-[q 673]n#S` /+YQ#"v%QLeXIG +qWEJL&B 13xHgT D&G 2ABs (9_1H!kx4Dͩչ|n!@nKTp,؈%e`Q1 [PCω֏fD<;;U\e۸=h렜%J~wpl͒ׄkJ|#Q iY GP8' +{M_*?G1vC #MԨ"k=ro|:wNUW]ԟ.BtH9{9G #E#.k2kF>g=EV:p@5N8VDfOw,=sTWRraz"0MmM\Cl_0,юd6(-8u&ѩzyJN2+k,1RVxu@=gwjT+2ٳ(⍅rkΐcL8î:Ej'՝VK-ٙ=ekԅU1g,$)Mm#. V^J̟/ϖ盕[iJ,Ӌ/ΨgÙ N2zw{*77g_;&yO@#m!4L'zAh{sde9C ")'E)QF25K20|* AٔQRHșy,䜵"ަd9nٵ Vga4h0s؊W|DWy;GP@}}lU1!3sK4n~<Ɯb/ 1yR.9dU!g endstream endobj 87 0 obj 4366 endobj 93 0 obj <> stream x\IsYVU8A7v;>xKURb9)ɖߧ̼G'J|Lup勉wgWg^Rg9N~΂35gWw>==WZ[™. o/6`ݿ֨,] `yRNH^>A9К5!?gJS|WntwWtކE'~zEN֣/?ν{:R_yGw_[Rp]4Ń44koLY;Q.`l}M7PE@7aގ~SQU#ЖQ6HhE%.8g;U*BcdSNk(GKqc#X<#䌨'm -"{tӲEk[NFj@WH|~Ű|>m:T:.3E4##aZ(\06UFYOYӘ Gb."o_؉%/c:󊶬ϒ/uw}cnIJ{/(/,9.4PjѥFYF$8ۚDB*Zvԩ^=dFvZx6ö_76V*(lZy2qwvkP ιzЂ7˽E >jᧂQuko`:.Zvɏv?Ou6sK\`4bΦ5jY2sgeXNkbr=!EXk.V-Um\5J[zhichj)r)I󅾅 YԒ8UhGH^c$c(kyǑ#5&__ ^!X&r6:fc!z%dDTY?!h]%hl~5K6Œi4sP۾$9K5vx9[]QuTGMTۤV@ePM|{-F G96Cpyf8J-%h$WmD'=IYq.aT3Ďީi[v#TvVOΙss2ZK2X0v$-ဪ ]c` "Q^y!479Xߖ+IH"R<[HAnp-]$@7Ŵlqc)$un!ߤcaLKv@dzkdh/Wܽ!QVJt|64!/JaL(: .#.+|jЄ-&LBƤ;TW"sUν͗t=*U_Mi΄HBY[ qt\-Gq ,*'@$y+RFCݷ`]dDI~b$T6`\rerr^s917K%f֢Lfb%eC@ȧl-EVZW $rŴ0Uœ} u~f^coAc<2Ղ.5sDZND83:$Za_FR 5ؓ^ɫ?oSeڴ' K[iȱ&[%UtBK=R=C>7ƨ' ѯ$܁腴=ihhc6XQ`|h67%>bBvz'흢$SrAXG;׼4uk&`$kjˮ= VZ&KvWɎjL%=`j5/dgǪFUdr)jO0[aBA[oB@hYϊF!k|Wa(YgL&8W!LB}CiHK\vK q]w0SeuO{:e ԖуVߠ[m-Ln9Sj}ܺŽ!`S䌧84]MJ}l&m uyQB/߹gR $Km(999Vk/, ?N K!b|o+Bq"tI([|1ݾ7]ޟ8b{-A Ka?gTJ3_gqsҐR)զҿ$ebs''ْv3v_N=#;[N5'.3mFil5*g.4‚&-] }(nπZ|ټ{_`y1r oK)c8⑁0S8@ ρJ>a̢=2P] [j'*L- ]lhrdNi1z۩ex>0$mxG2|Tt[Ch`! 773 d  Jt4U-t{lOŲzSҭY^EEĥRr{FO%M /&En C@oeO5qL22;l!Ӈ0ŧZƇYܬ-w58Q1QNÌhC_9*x_e/lj¾k_2'0+̯X֪O /iCrk@(TDZ(Wf_Hvmc[9U(K&f ؖGf 5*waRcoOj;`\T%,n"@1%anC!nP^v&?$Bh ;sO%.b`->Zę{O򐥟.ID ȵ(79眦SC_ )+LUOF4-NS 5ĕJf)uiAfL ZmWY8O6h[=脠g{*> stream x][sݶ~GǣiX\؉8$v:cיȗ8w %^$g AۉFk>:c{L^;dzK`.4*w/ғr'l;렑vWg;W?`=>x?904VQ]l/q- Zo`/Dc_ύnHp:_Fmmv˸vtC#S-Nq*jXx|ndT6$KjsDK)j[aMÅ0H#)Xl_PBUm%l!!G`-x<! H.$g0w Os.0r@+ P|G@r`7کƹY5%:9uAsA#b7Cv!"͸rr[fEZ 2""Ad?i#ƣai&,0ch,2Qp5Ǝ)p𰇈 N( 4Bږv/ɶ"eU`ǷґG89{c+\)v?,*+3o#uV!+7D⼷摸G]ꖘgVNWu7lYw2(пC,CeOrADAGq$5^t+h*GD(׾<:,w4gQH[C|K,,S';AP;#%vHm09 Eo`y}E$7/ݵ/=#紅8ȁg}D`_^"'y26H|^~pí=2mT.Gh^A1D`XnsLy;ᛘReqh!ߤ-D:cM%W 0q<#.]%x00 هBSq.&<>ԳDh)@='1>i1ӿŏFAEcAOs7u525-֭I::nU =XXe銑Q2sQ x{(F@;? vډ?#b^\ N$'S&}E..gΧX JR3tLd7Uz?G.=teLGU= YDjc"l17&r~ϕkT`RJ-OmȐG6R\C>u4*_rL k'ioꅩ2™v'IX}f2dZYU)*"Ш7I JrS8_2r= ^_)SXZmυmOf+jI/2r]=sO0:sDRyw56'M }}\.=S>뼹g s޿6s>37WƼ~vjF=pTzt #*ظ49#V$[n\ 3jϧэm-{ZC_:։h,J0y7OI!:%ֲ:@|zfK:vJgDAD m k tц@@/ۭ_Ϙ O2zY^~n~Y4tDAb!@ッ 2(0[-sVy8)j"7j`M% x:W, DX[Y.e@Q\GC҇:~JΉ 6f;eAJꅷoGӥz&ݤi.'TiqX.$bx2IR&KsBG^ 2-U=ҳjnfR퇜E/8xz#-* TT\&l*RTBoA5p@Y*Z k풼S~E+G‡Nw>f+]X) Xu8d>-s|16#Rzhw\\GZMH8凫qf ?C%ݳuN$\,nE(3WیTVtokt?H U!.PPGgx@Q"/C(Ąү` +Eл:2ᔾ1ȢYaQF{:''wQ 2|Ek TR\\y&@lof\#T(MG4c.y9(Ԣz;H ɍ+ שk@_ (Žq'Tl.CGT84je6vCP.9Kpfkozw+a;p FCAhM&~tjE T#lZӡFє2hkTآnΡTXܢz$s',}oEE0l8~٤\dI,)8*0(Y  8 ?:a6L @E ȬP85ζTvAZr.f&f8Y{tLrrD8~ݓB`e=^HVQx4NO~)(*_$_fŷƤ>4ܤpNRw?9Wmj*1@-W4܊; Bqm&b N s&=$C諫PB <~D 7E]lw0Z3hHUwE;mcAckD[>8|XQ>[4ککPmw]#ۍA%&FF)8!FlrƧ5j|ӖKl\ SG:]ЀFxv*S'LxSp>^:D> c#kTVVlaqe8 W ꑐРyr L]@}-k'2S@d1C@4\L< :4L 75Ns'"$sʇ-sh*/0NKNdVܖ#LQҀB*}cypy-?w endstream endobj 101 0 obj 3878 endobj 105 0 obj <> stream x\Y~ 8xۼ /+ɖU$yX ȗ}Hv&{fGAjpdX ɧvz}ꄇ?nN\N0I|rfݩrV^ܜ{so{Rla锶3UrY*+-VmӵJ,3t|vVAq7Og )Rmخ:dv9thRSis* +crH#KNs"% `.^'LKEI3 ~/v %fÌ?1ԗ^2TP FlrR &JDU$^&z/N!ā,rn1Z~SZ:8o~O]*mt/?~'MX0: TD`Y<*|:y^Y?ߐ1k'\peWse(~tCB_i!wW]e_{5Nng{HǬ; ΛI;C*1kB"1 Ŏ?q'$5\tF&{Q>^c߇MVNs+L[ qb16 0͆#щK{杻ڑlV=g5U.޹;?&3́3&o6h>d4L&3oN'J魛Evc]"馞;1/dAgчES!XAҤ LiNu]*il3up3X&M|M.ME *vR+-Q|Sǎ0,ˆ=[B"Ch$['2:%‹f,};ܥ^5*;!K1Y'_O"'t!֪Ӎu h!f ,B{1Km%#CH)pHHfUrj@K43ZS,a?S'/F:y/JG-ߦ&EnSa.ԙXL3ZWl>賶6XVΏ4fB&C#=J4AWu}Hn fT!%ǣGޯLt ~ g0h} f],EH$>n9-fTW*bV) .PLxW.]e[q_PpRGlw$}J!B5`qj5+?$_P6vɓd Yi^<Q0i# GW1>]Mm|\4sX{k50rę/*D] ~)Bxq8b{9_\| lendstream endobj 106 0 obj 3619 endobj 110 0 obj <> stream xWQo7 ~7#QjM$%QҬC=ifiWߏxvl 4%6Bʧ~_g^ps}?s unNRm}|=vBqj"ffhJ>]\ ֳaNs3˟$)$T`)$|٦(ѹhnʚ(0/kfOۘ|e6 )+zeˎ̫vvcZ@2tޛj-z1aD; ԑ\D !E㏶ZM^\ '-l0rLpڄ]V :KPlY%[| %=$]ǔm xQ yz4:+g4̀D."bTWT.idK}<9M{" ZCM=Om u%ɡ!]@c#m aq/;]`Y 1{'{)8K/vxH [d:Z6QT7ѥz)t<|\JODO(OM)~sфXc~ uIED3i$2]-]Emp6Ǔܽ U<&GdEBRS;sڗ)ݵd͕E^zerROOO'GhF<|AV?,^!O0J`S׺y;{JhSNeMv@~oՃf!lj+mѲt9E>XGendstream endobj 111 0 obj 1051 endobj 115 0 obj <> stream x\IǕsi?nU@Kd@IJ#6b[{d*6!*eGF}n'&O㛋w^_ݳ.d+,qrM nl vwus]Ĥu₩h/?J:R gV]~>o~OtQ7 9 MU5AA6(<Q@NAPlg$2eiCoeJp:dp)B.M0$+ֱ Idƻ/U }$R} [zSCDBg|6-h*6pܐIXFF˗mәrr>f*_*?YAҚje-?qNxሾ(&R{X6y :A%ԣncҭDr [Ɏyˎ)TQ4$ qpSSca*oujKHHc8-7H̨SH ༨pkH'>: Ig g@Z:+m޻I2\ A,J 'b&OaԾ&3WdӕgmKQL/"/  W&c8dN4pL٫^]uI*M d] m" :7vf }u9){i,,q1pZg@%UZU%sڗh&nz m#U+ȈZX`O2ۆ}" k\ԨwJRINW-NO:}r߰96s٫$MA7 -j INt~c` uP>OI0_[zA{rIF(-͞Ѕ G"/n0vH)t@WM{bѤzSl܂yAfNJ& Th>o<[ ó$F\WQ" D8m%#$+MhU{.\`P!aoْe@0f)cRF' P~ڑ NfM ,vf5qe󄕏UỼ#E+FòmF: xJR8CO,0$r̂Ak@nc(E &EgbXvf *C o͍c`A"e(@4٩>vCx%7|px4ElQI>@gL)9L`7>dS(Ab(-nGr`jQ*)[6HC(TQ6j$aT9 H=RpV$m 0<ɱK|~ L齘A ~WaD#%AgG6S.Zt2 #xy B.:h\b3 bu2jC,ҍ ?X5u~$!_\b5Z|!,YR*,Jަ3i7͈yNb^5,oDo]>ZajrRd|ەg& XmI\gX9Mdr##*}A7e q25դ_1LↂW78*f¬HcᏬmc2b/?v}Ж=‘ZP1rJ4}51lTF4mbA*m$ǥ>lOY`@`h90J+W 0(tZ6م&Bt2 ylpA6݈7eq$m* NC.:yhݰ(wۢV܃XFo%}-`X;E& 5UrqJVtR0FrHKEb;6yGfE#7Kv?a_la!Uzwhs8*uf "(qUY$Iင{Y(O?oRxMyMy fVE"8«FSؾ!4n9-樆)jAWniFf; ih.C'ݸ׃=t) Ъ.oғEV&m SUUi9fc4$g[&ƣGY)ěpg\)rc5pAp  |mB,g=VTKYEGs8[= e }9|wtH,/[aR2tŚJ%֋;=fAt)M~IK6#&w:u&:#˓gzd_m4g$h$F8L 8 wlvgْ@S}ӫb6‚8mce4#mS +{wy+lER@uz HlE$P5;ׇ6gF|k-NkLRxM_z',1v,$Ք \s c=`C$ǜ6VIiMJ{۰JrF[k ]`m~Z{yH3ag@ BL}7&epȱG{;X {o{~,VUq ے.GP Y21QL,Zrc"g$?_+=xO"RHvUV4AFΌ֐mɡdcv4M>lo=Vf8ۚA|aJqIAk6G][U{!`2g󍼒k40:w4+~j2{F> 2.T_ͱe&`N\;L`bnZvyƂ2<3M@f-Fney5.ՖwȦՖݽK%{1nшD n>'P{{q_ĝ`Gi#9w`u$QՓsUvlt*!pvtk]UVg3#(GդjSe[X;Sq74h0$Ƥ,DlDGoq8SY'fg5pNiJl!a8:wyxvh{_< r]cOe#NmMӅ4tQ["6~D4ӢeCOB=,Y,br^-O;;Es'h|\Y Ϧ̡y `cS39P 9>[LZOmθyzѭoI GGYRKD]d_7'[VzSUu32(h7O^l8-qj*,TJHnR/b9Ч2ӝx ,CgiڹCxD>ɼssƒ3Z4M▃G]vrm> a~ww#]Ϟ*4o%?/JnP}SUe\LWIګy;>te/.itM0_o =CΝH`e:孷]_P:' l\"Kѐd_3;ZG>-ol >Wxt_4x]n8+W+Y Zc7ͽU4u-+eJRT?m}LwEbDXUqbǥHZ_`j_,ϛ$:# |!tmPGP iDˢxϏ&6]<M|-t4Qc\8E;ӄ4iwlsp X3CDX;C}I~z~'Ezͻ+mY]/`æ '[?pPMu񠜦Ң,u,}N`4p 04i j)ӯ6⍏t$iF;yר:Q)0# s[w%Su}ME#3%?( 4~/AxWl/eC}R?\BeypZWwzq̰^uam9h^̀x~6Cj-;%=fMSn*nPBdéRх]ĕ{pYO* tW,y~FT#VO̩4c8L d;Rİendstream endobj 116 0 obj 5353 endobj 122 0 obj <> stream x\Iu@{rH:$,@b# RYˬ̪Y08Q[;A~⟟/.d׫ׇϟcV8D9<") ۃuJ %!j?^hiC}JK157_2AA: by__j9H+K U.VyOAi v65+`sZ{c^C!(&m߄A萷?}}yerNxۗp6{ -yUMb]>[HTLY?,V|Ҙ,N_>NG  )5km|ߦ0yB+)$|'1F@kllORP_Sb5F/:EAb6ɷV7ɕZ'9zK{6FO"7.5K}|=O%b;\I9@m$2(/1O'2ȖG*@$-B&1FԆUh$NC,ʷ 3AfG>r:嗜/a&is)m[7!iszQ熦[%6i'3/[UxQElvF BKɢq?[{]`fPvfVGp[ʍ ccbUa2oF:ƽs2_zhZ3oʃ'pЯ Cdӗ;N$w$1v:p1БuJQ-%LDxt1&`RV`m  {>Ug{?čmė@3r5IWZ2 ^;9GuICkZr%";A =+ՄZ٨&%kUM~%hD IffQ9 w 8a+"U&DEH\p@ֶ ti}.~zO, #YAPqQ > bgIؙF 5Ϗ; (< Bۍp6p3ӂ@<.ZhDePbډU "X [9JS=&M y8)`)2ȅlu-\/3Teu"q aYhGR]`E=qځ g,U"X- LcṉL`\V82xuɃK~J:91Lq`@gs opqu`}0 iKLu:ǵm=$Mı90LHZJÄ.p镖ca!tZO{+SCqck;@K cgPtpץTtC,=߁eʩ'W'.TCHNU"J:_Z;=[eXlXtUR"TKҺ {}K.AQ<F*'n*,9 c1e)l䶼Z6@g$Vcv9}T|qoا*V9 6T9K٠UD6wփa1 s~{Rif<;+E ܔGe =~F+X(s0(+1dp3h#;5,=V̶?+tg y)߶q ;;Qs2oj|H)ɥ0: My(4'#Ls?#|[,&g"RpX>!uffGRķ%i%K  QUvy֚ B65T,d{&p.F -\MdRٶMNtA$Ν^,̱j\M%.=O,+{ C-8'"p(gFLl ِf^C", ;!7DQ&;h*ruJO2@~\j m/ {|{EZпx 69Qa0֍(QQ" ֖GOPq0g!=ʉ8:#e”kR@D\[, I%7^(x3 ՋK&2#ǎ(XyGG ܿצ@{Bn8y6]폷% 1Kdۂ r1vUHbLe<\|2|(X,Nt6 _U@V&MLew@P% ܙjj,9P)*6dk߯)}tDOE'"ܸJV,1)X#7[szj}L-)4ÊX4Ϋ&&Mz؆VBm3fn%‘߼[iGWݥFwҽde@ idxΘf$7䰗jqVݡJ`])s v{hI=UvҕiY6}7j|l4ah .Dm60XBBf}Uk'P,>jXGPhlL>¢V[K: ]KݖN} 3俳6V@;GYJXӥ'!c6ѿ3Rͫn^g !6NkSfId>#J-$L ٤vr+W:d}MȬ/l)mWN"67n)Zw,. ߉ufIx'ia.GTԦ]HCJo7"=x? Cs`"#7KUEf-9GLdgm{ۢ 1bbw섾 )G)Hp릫6{}M[̞jk[-C'mVXw޾o[90- rYTs-{!s4Us@qQJ0^IK8[x`$\I,`YPI .sN5\Cܤ~5-Mgز7Qy>qv/tF\\|n..?Un`iKYV]͚q5.̤j{WQY v 4)4Y>ŠL/ng1 tWK{FtLY&_,ϛO0 W_{啥R"s፬ ݑL[~8.#/-?YvRd5]^s,ݢմ\ |.+?Gs2h&yUg8/BM0ր7|WmRz=1+uF̋=OG.qpCSYF+H#>_1[ag7b }DH>Ӈؑ}쏧)Bnh<}+&}6i2,Uqݔ38dOQJ\F~~B'LE\n DuY6 83Hf;c~&Np QG9v[N~z_zYıFB,SVt|ᖅ}Ӧ2=;]J_3Pxl6@':ZkrRUjoOj7xȎx|x$dߘ ElbTiv7; ˦)W 8t;qas$>${>AysX㙦eJSE镢!f A^H2endstream endobj 123 0 obj 4746 endobj 127 0 obj <> stream x\Yoγ~< V,*B YcKd%_"lLht`bŪu3qOpg?{rwz6;8lgSbvj/|IgҎh3SwT?N 1~p#^i?CߴʰQ}Ҁ_AjK#^_C`oN)#`K >$LwBp3pBKo+Zج PZWNH|RsW wKʹ[Z]6^ >#0F>yXQ¨l]4p*~d>n d$C$ aӈR`1tW%ˁ'V%\tL(tVd1_l3ƽ-$턥 "(%4d:Ig"4HYɳ/x:(ejgHDžts+28" q}OזyIIWa /Lʙ߂4['t@MX^ ^ͦ *x<:>?nwy wu(я)ZӅлl. ArFl 9RxWN7a$.d_ a)"޾E,{BNr&2o(wӠn۟I?&7oLp Gņ=29rJh ;k,KG'P3+MfDMz Zf)xlT l igL,YV2a!w~µUia ,eֆ1͙Vβt79pIl罵6HZLfYԂq~)kDP1kL7z ш Q'/|:5frI~L/ Q}BQ1lwhul]R;|pnY~Deni2PQVG ĩ(T he#R$jǛD}աnjwӺg82կ]]kI&QRyJ0@ ?x*#˝z ,ݭpvsn'F$EUvwg Vp)-mWGٍI-am'"ך{Ր卒z=(:KgΠ#dE(:2)d-/ a V9ˆ_7Fn8 z M(ܑ mI8Ҳ y!ؕ T;. ЌeH]o%&Ucmmq̶!;_3wtJJ^ l ֥+. 9l!jZXR"mhq? qWo=}ka]l/P|RbG+ S:sIP'Wz+eٚ,cNp: ='|w c Uȳ}Nz4Xw r9٣/= lZ þSQpM!Y^6ruwy,WRI Q8:Fo ]hm3jehU,þ@m\@uk9PXY(W(?< [kKM܏M/ 3tTh6 ((zʊY8 b|%֟~Ҥ[I'iLn[ԢmYazA|6BW AW~ps'mdf0Q@\^HkG"gxa%x5XN>Տly`g!ᾦXǏo}L,?ՏEo$-osr"L^WXV?w Vx^JkΪ, x_GBʕ*ȔUBC䋺*a8jV_5cR })B+' ;YsN7:6O8&.d&(nUR ϫHrQaxLc*7긿4K Q*aqlఠ}P?ٲ׍FQB_\9rM*tw S}P*mEA.* |VC Wd)I/7x2@(-LR%Pl܂c7qN7.qƉ>080F@W65[wegV#=ڎz)\#+19}Zv͋M vԱ"׫9bۆ/3_Pl*iSd1dAAi>lk:. C.uCwy $(6uQQV=^ɨȊlj'o8)wA-EWSTV;op~ ~Sc<-$aT6cXEƵ&}ꡏB/|N=ӡZx#qm[bg%Z%o=4}3 0IO7(B((#=ل`{8s<ō{2'E󖋜ԑ;6|06CrC0 x7A3< >=(3_S]]\#m3V'h yU>/5ā6Fs'fll(͞6oQs#p4f7_56jq_{厍?TW*XpȘv"hs(ǣ㽟{endstream endobj 128 0 obj 3545 endobj 132 0 obj <> stream x\K$qo('. rA92оW>Hj@U!BuW ;THd~ىA_~{b7dnyj!:ٽ7Howk{?:A imܿZ[u sG'߿g~e.ӳVW631ʸk(ݼUQ!B:VJmd!'kζڔPGGk7(~sud ?^TՊFla"WV&OAj3}H)]aU%i#0^#6Uh5樅IeE0H(ֻL~' i 3T"hv0DL^fC*w$MLM1;D$2+ܺ)oRqwP jǷZXߗ~Wڎ`ܣ'R`ix hI]ZUtuXUC0fuO%CwS i:|OڵҺ'E,FϤJ\񿮰kcS ~ZEJ\&rB )E e5# l`yˌdߗf=24CdTE{؁.N @-$h SokNF1F'eOJ{芦kTuvMS),vv4*tK,,Zcc*. xתqx-kSܮ_Τ'R |44Ïq?Orȝ`1X%@* 6/cX6!XdɖicX5?ˣ ;.0ŧy2R̹/}ɲN`ɴL<]MYɋ .sK4k/E*zS3j}\}iNVT3[Zn͙j'|PLi &^nĒo%)|Vgm<3oĜ˜^o܄ZtVG!ٲy˜y~ Vfti`^Z+b&6q_[Y &SGò`ш'=,i9;}֐&(GeFqFVP`/3dri# Av=z\6F( ;5IQLwP]2{Z4 (Nש&|cx9vi 313ә^(jU6eQ2[6+M iYٳ-2-yrBs+y<ݦ Y$!(ivw T8E2ZCO ŕ! xC pt4:&n{zj,30ҩً],+a )L8[rz˸=jx/`A l}"bOB (X'1yQpo[Aΐ qS!wvaI}iP 2k&?PKQjgAWl89p-.19ag{rn`ЫNV'sv qk0(F LߜDkĠV(sXQy<`%`x3gD0]D~C."tUvDFġ)XĚcqhas NG*, PZR-%SS 9njtc idF 3i'Hq,{'&>W-U%G 4>D+d#)D+ I_Qd+2PMZ?OS 2|Et #Rx À<(|-ZM@3v!|6G646_J AQqa֪^H_nH1mfe?.Sz:e>=n#kq[R.Sgk X-"=߁o&{UV/q^X26jȚcw/v5/d;n(`pHM.`'jQ Sh)4ǴmʱRg,L3}ĠYFn=4ѱn- yaK >fVG;+WϘ׍eL"y :`Άx&EUX-V)>ho!K# 4) mt?7NSofFep*Nv-{unvy).Ǔ_Y~˞߱g^~(Y~ⓩQam3ϳU.|\tIm ƙ*Q諮φ0$;N & 1&ZG)KZiӧ iVίZcLq3©'/UTv1\nCxWqt|>)Rs-U%[VNz2[e$S +eh;ٹ#l@@,㮃$Z1^* E:3]Ž9rrۚĩ 0̼$&fJX/ji=@e't:&f*PZ=CR RRQɷ.C9-VV`΢SZ#ur n.|B!9u.HdC`C9j_Mj]1%Ȁ>x]M]#5`/>ԋw2Q?ʚ*z3}@nTg|Tݟ3r&_AGJ 5.%+4Rv}K X<_#?)qQNGiz",JH-rop5hi/ϠO'i{ˏxzojRޒnQj rɦU nÉCsq˦HJhum rtolt yt өf%ک"R$+8z{9endstream endobj 133 0 obj 4911 endobj 137 0 obj <> stream x[YsCy%&FL"ۻ^lgm+TyQeY>ߧqLwHڒ*?jhϯF hdW>O{WyM89k hڪ"[4!}bstGK)r]+XsE:"q$ Xߞ,Q jOjR0|m{L{GZ笐RO 6@A{v @վ tX[[oNHBʷo2soѷn_'6&xhv7'z5VAʬ J.E!)RvSч>#˪>;ʼnφ៫^4@=RWyAQhtw*{-M^ۉb/Z~:_y%A{<Hs:r[Na%\s Üqy-arTqԀk$N'g%KKe|X*(>RDK1J}fQs*4r$_1kǕJ|6+2@Xc÷liRaIh:F_Q*EibXLKXe-Uvw y7:T%ˡj aڌrš 0!/SPO2l=m^ Go@dH(^#O']hPvEP9[Ð7l28Y]X:L,ͨ8ƣ@]4p#jFbN#%&̰{ҕC [F[Ev0&ܾ)'Tm1kѪlpSb5;9jӍŗN iIZ)s0.ѓ4ɮvQPY̽V}$=_NX^Mm j I7y UxIT:"*f FmzK{d,"L$$S!9i;fZ禙G7ŨF@txGZ |@*?5ƲS@׾A%t]ȳ!8/ih1]L%Xm\niIާ|χQHvu#u8Rh+iYg4د3׬f8guFuwWU=8 RguKo57zw;KBh W\>OVVmx-~* J]IuKկi^Qkӄ5jfIZsړu%X_{ۯ] ħ☸u5CUϼ?S׾u{m/Tvwt۪jѬ֮%Ûb7ᚫmk[[ նtLTӄuךzz#k+tNBzxwkyfZ; $vTXV.4OYwȍ$;jF7>JLaKc1nR2x9!6NH7|m` -/-hIsfo[IZ1Ӫ]'Vu/hkˏqJ!sA9q\h1y$"]&C6[pD>[ť=B&9(A9 G*o9/ٌ$4"+ dNNIC07NH S1= @$^)עh pf>У" pcF2RdCy/qż M y$BH-. l,ɂ(rb =_ӻw'" 4UBl]܄endstream endobj 138 0 obj 2462 endobj 142 0 obj <> stream x[Ys9~XޠkLI)`f`Gİ>`laR*6c6xBNI2Sy_5Ӎ]оK۳=ԝV#&(yu^!ɘ8,im?s0Zgս!W˓oQЄ.8p&Jtk,c{;[C#>r4R=kĂSk.Cg }t$I[ =3!oBDT@ͣf0?D'by~<QNXSlX2Dlqtz}>>G>~> XVug{9αtXO2`g0XX XD Xo#Q`jI{EE Đfg{Yk1*-Y 8EQiD@䢢KS(ֈYk -.5zJߍϻ_7J'by#t*8gC(_ ŸAg= GF7J}V<QUa.egq3`m{:q#Lo dJEJ%祯oKiARH6ʉIڂkB 'btHKy) ެTVN& 'g{?X\zv!6QO$̚Y K&}z>QoIW[Iۭ[?7 L h86S14ٮ>^ 1Pzsg6_CjZ]Cj&ƙ^~9Sg@=~;ȒrXu$3|U?4?&bq+3q4={=PQV/}ޛbG?e[;:D[["彲@!$b"]ѼՇt4)Կ'Ie!)ɴ0W5ecK (-̤E})X)-_! !j'V xjAI'8噣Q'po u:Q.5"@vVm"Sn4j֤G0e.h,~!2""G{1&Ww:e"]ѲsA=Z~}S Hc*ibzmyؑEURrC^kc>]/jl._ΐ̽Aga_Ӝ~\ի2X=#MyFÑbP`yGݓ/= ںObjU< 3hqXQ5U84[W/5!ؤ胺?zx˯F^! byH"Y0n*@ 5!1ˑ% #af Va^Yp()P} fY_Cb^Xy6as$\ dF) ) ϜpWH8N+j/Jux}BG5} Hendstream endobj 143 0 obj 2984 endobj 147 0 obj <> stream x]YqN^o %y?o97ЙDfzP&ʹK4WݳT,n 4]]]{UAt _/ qxy x+ DrKyl p/.O:X鏿ga\d' S@*9=Kw'mg<4DIwW݃c:$pL살pտ~{R |o3Q=;Lǟҳ&%AFS M_OsE) @QHeO> V T|8)>J8 i:m"TXy8|=v8 EuU:p\חZvVcmTޏ`D4ˆS嫼ez4%YEki* YlAl@=Rl!-Fk7d'JĞQ!CO>M(<%82Jb &Bt QBSa;~tB fxpʯ2PW4%wHV{3kmqܙ­S\DGxDPO[߾cc,KoB;dT:+yҢ>K~]*Yå5`V/>O}9kmQ9p{8N4>!=5=;35'NČtnCȇ,xa~Lm@( Lh@ɒyuzuĮFIjRUm [8AO\Bxˆ ٠ Quڀ48Y7 `l B颔(\ >a`31-焺hߠ[L'7) 6eXKGzrz#t=֫̍ "L=N45/|~.rD 7MÈhI$nS Έ!}^ GZ?{.54,[!.w7r>A׊hnvlMOkBVx %dah?0U|bUKe!6)v$xh:m ¿\kQz: &7> J|O$E碥pVҒC\2ిyHP%gdp$U:`?/!EIZƴ(6^'(zfIM=ٖ93S+tegǥ8*0aNRp]2\HMn/?˾jpEzFd8pNéL;׆z3NpW4 y"thE_LQ1c̣mt-D m%ԪHq kT/`~ `YLAO.M(qT0Cck Cz^C͗VW_|3GIY.s/fZ3;U$UjKqx .0'[RXش=e~h%#t&>f+Hmswi4j>_[ /oΚ!uqY=$]I ݩ0|ɒt U\p.gwͨw]1:C'BD9cK(Zd >]` &q=JOslDe% 4PȜԝТ͇P: ea֔!TLh 15Ew1@Q%]DG1?Wdoďߴ, 3^ Q$!s­J f9toW‘{$b JUgG6ߔ sf^דF/IhU&Wj:L3+:;SqΔ˚P!v ZTfRɹZ.DF< M^M(ڠi&C<5/:T`WQzJDd͜%VԦvd|*DϰOX#BS:`D5;˧q@^v0P]mbyb>v^|H䋁nTM SaJ|eIԏ`h~UOȇ?+6ŧ [@Rn\*E ;Loؘ+@Pb+@?0QtI(|_>O%@Q\_RlyJZMv7ۺ f0|^Qjey^OktFWzǛ@[{ 7,8mTͫ(6;jnU[w'SJ-RKFi pGCx$ #S;ҪpuLWYVEg;<̵J,V["phiLPc4dKE`WkĴwϪ.`.mу˳K%TBef ǕMrbe=󻵟n΢ϳ B˥zȭ3Ḿ~y-R!_]j;sfۇf/'y6tz|'uek~oyd`EQ M@cmFa12NE΅xvd55j}]^sn 07([db' cJNwtIFdlTJe]EͨgAȼB!v;9U@L茊qx4yLh" \z-=ȡ1Լ.[@k|Fa6' e?ȃ)ku1]xjA__f]#Z_ۘ:U6bupvU٘` Krؓ!3iaa[d+J|(CGm;[BT6c%MFN,luc)X4jab43ަq- ihqċv=BPeG8MJO4KxTmfk;VS~nu6[^aB|j0O9e Ixendstream endobj 148 0 obj 5570 endobj 156 0 obj <> stream x]IGCx;AK̉ KX6 KAzYˬ̪8 |P&+oޒ_^A^ o'?zz'2j˫On@٫8DIR^Iz^_ݾ|`&柦s4F>KFC'1G\` u9}𙶭e«C1n6>Ql A;;Zqlh3`HIG)Cqʩ'XUG+(+ʹr!:нIuښ?F\,dNӤN)qfOvyx~lMH!.uAk=S+/>tMRo!F ZE/.H3tѪϮ5L0u~XVTr32,WT58}Sj=x~bd&$MFl4qiE@-g㯹F4yEOO U/4^BBҎ $Pk'72/V95OI*i\$hl̮.8 ZL Ebv/6ԡ3Z̡aT P}Pq5G_Ev#yIpf r.Y {ǔ8ӫ-NĂ(`w6KhD7He\"شh=|MY$ iJ46 WIVx<rٳkb1ea9%SULii % $޳A{TY*B<%U>vPАy|A̩P|ߞ=jЭU4# MΥ8ԉ=YpYwu<uć1FdvʎތIO"P5+߆rENEWH5;&=Z=R[b(o&$YR-$L{,ٯ$ (!i"+VXo޶`3P 3j})OSG\w4QħJD$.N&hmi:Tk0ݩfυvL743s((Y ѹ!`Q҅Ba~nF?le#_oT 4ad.wst]3nrzzҧ/CeemϮJ(_oiu|lT`K5&WOFDuIըn.NWXĀR.z}gHĖf-=A5 /ӈ;1m.3 P،ԍ,uF~+ƘVp |m-14eʨ}.j/vz؟&֣کx< =7%}Ci:apB/wY'XOβ_,6$ caCZجCZSc iQiS")vaG } YW?[/g+DUD8kdR|ےffnaБC۩C%݂|6I75%12Kg~TWgmxӄRdrSH*X %{gE/aV܇'an&EittJ'K^nn>i^sR~iL5N5c+S55XҼ9\ xMsuM$"(Q5=Ws5Dι#$.!% Τ*e7DUM4QrDQLܖ0!VEtaѫ}7xLWӼMU|QP8]y,i'OP2?uHz#ܿc\b=)=q,,c#!RV:x([66SY7ə43yb7D(*XL.qe9C?9,;5!vksGr #tј[s2 '|p))#+3lr:>k_~j\!zWҽ*+8ι{ N/ &Kav=&[XR#\^ϯH7hld'{?\e`-98ND C9=p.:){.hچ ܑJ'b C0")זS谕J?Z Sa; DNW.弳N5Pʀ/[]Dx:rEy6WA 2&H5[)ҏE>n%ͭ/II%( pʂMF4F=/!ԣ+5zX=L4@*t}d' ӯӺKM+mY1՟98h8xIՍJ/N>GCշwoa@GuPܾI{B2?4$㹕1Yٌ먻OVkd n&aHy(Lendstream endobj 157 0 obj 5124 endobj 161 0 obj <> stream x]Iq &tӪ}(Q:DdъB4Z:_*Z%MH0M~FbjpQE(.JD @{0)=O秵71uc{E"&haAীgJ4MA&S7̇h50_-pewf{ 0ol6il{HM{6IMfÐJf&Oc[!])kkl]P8uvuBMx:0`SkL ~5y,NFjD6\][iZ~-\R.iْ9%f d$e#u&O]]p٪!K([BJ7iKv7xr޷n^"TDEvJx :!%cT2%H`Ի%c/*Z\z-PB!-`g@yNunjQ&i;CKj;1FX8j8q;jL!,DDH Kr/'*Jw "9 3'9WK#zy!@LL::p=$=uҦ19ZK̚+2kGi@Zh (&x%V~$ɘ_k0B9Ugbb?6c,xa4Jm*ŀ YhAь~sFbT*V7ChA]3Y ozdr@TEUE0:^N)r>{J &H)&Ǖ*'0~84&$x' oV`^J;?|hbtD2E4"(VP(y3A jjZ>@+nʆ : NI+cFHd.#YYwV֪C[ 6Pvk,n_٘Ʃ1N/BC%EJݩ*|9wipfu}(?9Xc 0@QȊF ]ZM˰0F|w`d*-ZMqNV<'$8؞^#$025EXҰ(-E `鋃I 4xҫáP pf#nƻ3\aNY&M̈\~R1NC,T6$+8@Ӫ>Pn^Ƚ}twzw8bn{?X\=-ֆZ]QX TY$!y:9}qJ+VUBk etKl=*E)j Xf@JUi Hf i_?=R(BaM1ܚj=杴?Y(`s39l^gTG‚ـ_%O\Iȭ0q: r2`FK|5sK\N$A<Β؉[WTځ/4&!Ϥ1hAvAnCr*)i . ہ!ʮg~vU Qz4Xɀ\`` +{{(R Bdm[L)Y 8zmB˳NAm$d%̱/ɭ7 wAy (M6uY;aL +'ӌRx<)Q,mzIP`ײlM<"1,@!AR7 ܜgZ52kj78;1:՜p{xS6"qqBHW0iA!UYt'v]ʃHޗ),soQ~c3&Ҧ07R3 ]QJ}@ZN0ۏ $JHd@JWV )LZ9d h{i8Q7+Aa ̭rD@}J=&zۻG6CoWW8 a P "`?;mb>UaD|pDE4ǮyaVͲn' OIiLlY{E7Y`) cYUltXxtX78G:aY0PN ΞP :K3=skPz$G15(yؖ1 ! =fM(Y<3BKbhZۍ"K$§63=azIz%yz7yhS[cϡ=Nf pGrH+3Aus9Fvl=q,pt,;ݙzJ]~fCctF7"~CISF t1J׸GhE5od_y2*7<-va +Đ;7-|u_x!?$lCWQэB F;%1eK<Xo$wvytw}"Tˣܑ=_5nL/A0Wg®*h l,6ʼQvp>q~@5ӹH6XM0 wQx!LC{A&)=qRi ?9O -B&7/PgUlCy;ǭVo[E+ ǀFXbFFvѤs[u}3 h* Hta H`6!N#%50<Ҭ],tH(Ff/cn[%jw/TMErrbS:ktHwF&n#wc!{e/nGdu[u󲒓ڢY&0Hj[[̜ ?4L|<: 8@E+nY#N5RB199o;ክ(\Ʈhv^Jz޺) a_s\͜7>=$Z6R4u3PNf:Q6MrD}>BdtRߤ.6^:x0)e u_0>V'ÛZn{{'}tgܿ˟._H8^j%-n} UgCDBVx D. (Ƥx;8 52הmz5ɨK8#DRAy2R'oMJoI9 'ò8.L>[|B3YZ7׌ qe}X??NEyƅMRpm*X[Vu`,HޓfCX0BC6E" ںrp༆>4fCT}A8zknȤ$FdLLv xfZ}\1}VYn(5;]!F[T( |WPOSu[{!6_\.6ҥL*F/p+VkDވrmϡ >Wnm̦z 0lWUûYK7F:gY$)KY7됲l-N)zx+כA稌w ^i.( v1Ѡ;3a8fqpV7g*IzOwdmpڪv 0۝9gUfT,ܱBfti(o[Ehۧ c ]BeP.]A+;xh\u,^@nf%mWx\wx38=MQݍ.բN ҡqlq]]rcaa* &bm27;-ɒ3y5jwE= z Rr>o3i-0Pw@!t<8BGٿ0IVt-;0`Ằk8^$,W-nW_TEDf@E>h0*P !%t>ڊt]b IGLfR6gs:J%;Oy+QF$j= kFeFVX?\&[?#%tԨ\J #+.Ll3POWRygO֟ا\lѕeWH2m7u]=_Fٛ⹐@6q1QfKe_)A+B[nΠ(| 70nQs'Ew\L-N,hq4A-ВigU'phm{:)l yA:] C 3kU\c̸Z{&/ij_EfN}54Zv颐'(E:#U܏Wo5rCry-w9j0 tR"*jѶş+U^=6`>PQތtXLlΧ%c=\FF\J_lr?HOEÎx]0BH CZVGih,P¼g2E- s/걁Rn |zw\W{,^*G̺Hl#'( !bHjKED w>&K w7ro|ݩmNqf?RazIE^@4UkLXfBYjt믧x@ޡ־~a_əxV,pxU.w.E nz֌B҆-̇6x3G=Oc?n[][l|_3dsكK|ivhl)3Դ8/;GlHIԏzzSbVб2J9t9Vb3@WpRN,>5EL̼{8x ]pvk}̃m-eG+p+y~\`'u78^meOKjϠ:մc)b^՜UqNv@pcW {sVu‹;G ; D6X@YX_2"J#ѩE݋=&^+]7nvцզQ2y8CEDZO(ҷLM"x]9P<4CCcN'yrnWfUsYR85F%jcj Z"_+KNNI;tE4s56{?E֍l9ws:!Oq9>xRo˱w o5[[g]k'LӍ]n}G=,R3ZTLՄ ̰W`}='w?#I'{EwoE$(, D ݡZ`/S7hIJG n^vTO_zjyFMLQL='}c8F*L }yM0&% *6B]ԥd?ݓ\?Qendstream endobj 162 0 obj 7711 endobj 166 0 obj <> stream x=ْ]qy S~s}I*#NR4%E.h_n砱9t08X}wby~ q xYOoҗqN9sy")/[k__<ŕ1ZVxx~" Wx7Nxp{Z{Or;{o4~YA!ѱ_(0{4 L aT}p?w+)S:%*-Ovѭ/~'Hӻn-*jWkߗ$.ؠw !rh^D4EMCP%c(gWvSD7|G70N|<JZA~b1~b ؉=q/ѨeHct.-w}"q{rI)(t|W"Ӻgg ;];(g J2(8'g5a.ƕ:K >ʋPMhHҹA>.)b22T?F $r"fX< :9m;2 @r|SYP K+Qu (4tF8LM6I&,X2@mNrzp* Obcc:lLw$ql~}P'ğFI8?]@jYvd>bڮtdqtm=qBFDIؔNd_686cO.:5?x3""|ki1AMkmŢ; 8iY;`A=O+:EE&k-Z}nDiXU815A;RDVǟץ)l!*CH wrYZv!t=l{zmak KuhRkeWx%sy0Tup(hmd sU_ϟ |9tM/{|8b]EzTNvJNӀ{$l52c3 wJ8bkW S.Uz4ސUi٤QtI("*ɛ|hfPUPͪ'2EpՈM.#Sd ˡv j]9lr:yl]x'tLo Cy2Mdp~TLqQ%`5,N?)J,"~ 2lj`wtmQ &v}6>)1j&${wW-kr͗ z):VFvw@o BSA+2` Q|mr? hc לPUUbhhlLz] ';n^J-C%Y,-.܉^dmWUrSUfU8e+z$k$A L) ψN(Wށ>emZܾV)ݢzš4w띧Jxӭ9c"[&B}*Ywʹ\p kP^vt_w$'S%i=έy W,} -^mPBPɡ`2fPc*^e92s#;(!˫H*,p (.IIh1Bz~I`nV}kZ2P s@1D~ow!mmƓ,;`33z =;ÙO/I{E)-qJռ.bFѠs0EU &F+!pX37KLgb?=?^{g6 =1~"%EQ\ZE c,54)2@_ tW@ j'1dumSHWBf0{ pB1j=0!v3@FVY"^%DQن.FMNʫSJqgy/xiۈ&w:ٗ aR]E*m~.><.,T/iiW%3 7qvfcw)l-SKU( ϯJm !&&\t,hfyD#O;'΁VB -=4kTډ~zBK'x^tsH9Z{ @~percz U[\с{:e#9& X0@'rLK-@ZŰKЁ)Zfi1lo@yfz ,Uwz3HP#QQ% TIzm+u)BZw!Bs4 t՞3{([|_QșxwǩbQ5e |ƀL+9 e><]Sfh\.QMAZͷ碪9 XQ\Y'% X9s\poX x+h@+M4Am\}Ѧ;`Z|Q,HC5=})ЅuG^89hbDT _-ps50CXb@*m9+(`3 0w#MD&ꪜXN3]6Lwao: Ddu@-/$2ыI<)BkC Rk c)y Y7Ce\mF@Jq!ކN""b:BpG?Ca#7Od,c!Ļ1_.̅}|PIL]D.( IZIɊk$&#<GmK&]]tufbR#-δ?XoL+p{7n 7<-ĐD?",ybc([**SG.+Fҗ7Ի-:WȹNH󅩫xHJf<В!l2Im:;)xEތaI* XaԒem%F=⧦сdOI)ym=>!AOö3ii^aP0+A(/X@0~ňirOb$9 Z`b{ș֋:Aw$OG¨NM-F B, 5Q{1b`C&Vs8%֋q$͓bJnO HϓNn œn{%QfPt7eZvrΖab+bgRwU 1*0,4R5Ħ+)v]sl[q#??YiMmlW3A܏D/jblUT(&pqZǽCBZ(S=7q9#u臣;'s;Mc$۬䈰h7aP5U2RÝ wT׹8`TbǞ?uhP(qW!{=#gHh-3?HC_قt!T\pHrsNa]eh|uIwUƛJr\[rԣdXu@p+^mYw`Os%K k{.$t ^6QZ!7mZжWT-Irw!ty9}Vcd!*+1u&d'5sQB(s#tluv\CihaGĴI3;Ovl7| !i'd}P&IkyP>>h5)j2a ~z( \ /'UPvLR 4gMkQxSLw W.?ybܜϥxvUukXMrQz,ùmWXmd8zTpĺ+h|^jE1BoHjaE*&~xFbΡK)ZN hM aR$nx"ݧU+Ɲ`!/8Ĕ6%WR up~2˵r;\ʫ u55V =crΑeаl˶ȴUϲ3s8 v-Bӊё҅'%/LKg݋L 4_ :W5Qk Ms8Up=ο_W!*pd'u:m|ȉdjuP6RT]'uZDsF59z&6? Ty t,&-}V7մ{XQZHYL_!ըҮO } 3wSk:9߀h==랾Y8ܱS *7C*pbHa-T|5"3,FfiVdRV.RkU˴x$eV­3F[kX0Z rbcQY9J"?|;oB GE2v=P#[E*smG^5QtNc2D޼ %}W K-]1\H2XE(}c*Mrrcx93?@R(ox~$IRJ9qq| O0P߇hWgcPSL %~8(ut϶DcdԜu1X.{ju36 Z;$^,A5>5PLֲQҒ\w4dUN;D]czi0JmXq\0rc 5}y2m9իPYp'*䳈ro\+%`bϏtQc봅TV0,9 AuX&r])a/ >Gtu^r&<^< zH2BǺ]PA`Ğv3l';1O E*FJpEFjX֗1mj&AdbA }:r VX-{,Ds ?be2ؓ+kG'ߡ'>ZY=G7+@"C+/Ś .1݄R.7yJjn.~}aa/v!.ՋחZc<;෗˟ `7a]G9`@\UkO+hbգuzFc߂TG&Jܣ@srDFfVWl'n.o5lGwn./PZ@Z~X`_]Ŀc/f N=kn#)<J^q E:}%x4=PNOZ:TO|:3]ןBW[kg_]'r:§ԟj-͝k7r].EsK/T`74DDn^;_>c[vK;wrx+ڨ;8p Uo^1/gQJ_3b4<'a9ˢ >e\[ַ٬_ta2]h)Db&)WL gkihjk$y- wUs+_d1ˆl*ḋAn^Xt}pƚKB6I' ]iA> stream x=Yq~f}NyM   V ZNKDkxWULW_3-O=}T}w$.f'呻x|w" Tb ƈ܋o o'̅u .'e?M[ g;\򹺼BӃf][ ;O/DhN?O Ë7jqJ9;yaOo৘qE|[O7;y|Kڠ«eIz 6Z9,SZ,6 qX_:Vu8@?iEpCR])Xi5ݐS;9=YNmanidmZn9x᧍21&hڈf~(2Z)ln6؉9ݯRIfe$L,{yÖaC՜K`!k0aV|u8 uqJIot캸/{UZ 6Kc" 8Q@p55moظU 6g&9Zd31s$@OlBVz.h95ߜM/W P;>?!nᡂKڍш@z bwq-:=2>dzM'QMyr-KIzCT#cYb&]= Żx/3{ w'uAcAh!ANlSF\f2Woث5ӤA4 /I"&0`'0j T|!5^7X pAB`%7fлhj̚DDXCD a`AG1e؝zK%mQ%J6>a$FS՗ Ѩד)#'!.k]* t 7\bwb (WEA^*t" <m^+V1{LL\m^e).VWh Е ;RjL&je ]eGRݙaY7T'9xI.(h]]YxI +5QF|˩&e 2VSk4oq4Hnd1mcEP$A"DUɇ7Im˸Iz ]* 2i|ٹpQ ; n Y8]Sprt.2w#ew=iGGRŭvX԰?qsrf7:7TojlhƂ#&SDSԣ,N\, &^:3߆hIgkgC{RgvԼ*WM׍"0ܱlmDN18PD#rϑCyW'ԘT2gqf$p!{LU52MۛWkS^$Yfq^ŧk"KN_q4ĭ0f*A-S˜r2.|=j=[P \I}e~0||.?} WBNjĵOm_xv=r{Gx4C uQ25i$̦H(׆ϯ#D\X=F3s5]m{>MQF$. (Z6ry &ڞL5h܂bX{a1!4y?FY}ПMUrfY 3)D5^u ?feM Ĝ o}9i phbx,EA/NhHdO\N\Ū :~ YZ?zS/!0<%e{9@ZصHM.- xO`Vuh9L$ZT-!;IqR1Z#:ă:^R,AS +晼sC+.gO[ZD*8L^X0'4aE[UdvddLF]',fA/6\9ˁ$+݂ >Euj a7lm}5ieGl r:jũkp# +\mYi0ݴFM&yHIU-$i %z9x5 bC/1jJD:`30[ސgyK.V&o*vB; <0&uLcܱ-nhfb"j'ՄnΛq0X>_Dt?\/ȚI4`̲4y̓$F+ DK`FsYZ ? Q;p 2x1qA˩0""lzIw,#e*,ő+npLKe[zv&$p ف ASC[@GuY۬fo 0c\pr#}*SnfVʙw R})YQʎأ[$%IPL̼"L~Vn@"̎- &LҪAKW4j@nIƿ9W5Y*]^RvX{Nz<-z{XKca^b^AO(Wk0+k`Ut桇9P ,Nuu hr9Dm1oӡ`'kQNҖpx1A#3}>pYq[biJY8|SjONGT*;J O&6a=)ڒK*n9~:} W@.W!^eTgaM(h*D%VùLʣiscnԨ㬟I[}h3 }@hD#e4F:(AuQP+?-c <<$ N%N*%W{ TSrbbh0v|V.0ېn?O{Ehނ+ÛXiN֓C,ӽ4c˓Q%^9D`[@sƊ 5, ]庶ʔ$e3qQo_ -KQs=Jrny&mg24aKY2s߬~7'| 0֏~1{;5Q4|:(p{~50}#jB蕨 j9jZ&Jhؑf$8t5ie*++qNa\Lj-Kzwjz︇)Y6D Ð wTT,Lܩw^4ZޖTjObGgSyea#v|wuUfG)~S^u8@B\jG}m/OQo|Acε9QFYVW>(>xX.b3vZڑۉ=4K!tvyEBX&MbxJ!L]o8/y!u.6f]I[n/*7N.C_JQE۔65TK¦ B(aYɬXXk\Sdjqp I}\XuQR<Fa:fVayq&a16׵ vawΉTɗ烣z_FC#u݇L|VCNf-Hz7mHG5W=/ەuoSX nQ[|,֔ri:Hۅt<[83]A__m~է^cUG.#g')'Wz^]m 3H=j̶8kBuɹF^ζa)^6ц+yѮFy-CΝzX\f }qbDji9,I@oPC9ҡ@DRxsbқ%J,,Rqfn#]Թ8Q:<3㭎:<=ӆH~t"1W S&Ρ^S{hs[LsmgiŖv5hmm,۴znN3nZ?Ε6N˜fkxxS)0?y:I ֝HrS {`5<ɼ`L~nGXRonG~O|Hk;] AJk<tOss_[g#L5DÏХ $61#ts ض1iRp-G3Q!aUe6NT%kF~hA_غ"8ҍ ŻCp"Y.j۠M/ ú}m*pľd? E|5[h(=uM$^BכoEXAu>ր h*I2F LSli#pz1vMC4Ϻ](),~rXuW AܮMQ-qw2$|*2|"}}Q5&TM8QUp?2|~{5G1wA]ywSsiH.#odԬn/Lo('ntmT$VFSȵ ;M9WAwCw l}6$ ްH$vѿNҰFϔ*|Kd#3 aTD_A/֕Z( @|Pհ5&YD1Cd٥y,kt;t a37Q ԁƫKvmRe:`]Q>fniԃN`:8W3~imMSsd&Lf^NUxl 񺞦SL!  uc|躀_}5tW~ u6;6~~+ABvT9ݴ:fZ8'yu\2+1qCRϒ HS&ƇրIdc?1 qoLF T\Xl›4UT86޳tmOP]]wM^b"a+t]m|l|lWPVeRwy 8 za?|O?;{endstream endobj 172 0 obj 7402 endobj 178 0 obj <> stream x]˖PjYf|,#h#{AlE 3Hd=G A$7".6bA?z/GbW'WFA6W//&Azq^Oz뭹W>j跑R*3D\'h跲K}:0&S^\jo' IB: }&]0m_39(X켷C\Y- .zG]fp:l7v>Gj8B83U[g y{Tl?J5lߤ/*_>-|3wZ:j:oş~K۬6qN9C۬\/~ڈIS59bpIoS sW% And՟bctcuiuz`V5Z%| !gys)QHh!XP GX`TjE{H zYՍ@_ܸrPD>囬g£ύҺe,c!zW8?)KJVX5BBY%ID1 XΧp Er2$~O$AjJ]D}Vu,sqXV2r4Jf$Uz&C&U0R>Q8 N Qh_!gն7 ᘕJ7+W4}T^)S=)DOpcT/NA}ֈxZ:h0W熄W;RJ/(׺\ZKa3֬t|\wt"ڴw\و ,AkFiEwNKsң,q1io ޒT%X5M_dz>X,7 J }k([ Y1 R@cqU`#տ]Lf:㙌i&qQ;K&)~y77{_9WX#_Ue6'y6_΢6`*@&E" {u(3䓑&9"_ށ% o7&*$n3 \(Kx2^g{ه2'b._\p KDYֽJDE-gFe+p#p@csn,w1Fy{Y1iaUU\eyȬg";`u4Fmb7 ц}mɋ֣ <!NFW|ֈȗ;gN>n)LX&?.4D[4a(q^-FL¦#,q;L ߳+C 9X/kֈK_Lλ' QC(ԉ*I/ZaHM#%CpNKXD\@X!Ȳ_S's({_KWl(JiL"ҌDݯhot`93̥l,&+5W;{+si&( ;5ul5>oә3gNwq K/5ZD>&L'Zji`|B{;Oŋsȃ8cte1 ~Q!dM]GH?_kjP7"5unh1'[5B^-:CTL9늉*Ȃ d:|z%Vꄎpgi5YN#udh  `q9Eм9KiO$јOW9m.Wib̡ɴ vf=4+|tqѦ~-`8b{: <ԓ dpZa*5&XWmX"`;t`_VO peœWY;N؇^/q&N`D{ ]W@1L\.!ѩ ;`nO9k"I7ɦ|N:' ~i GO!bgM6c$+ULwP7yb9wt`c\aJl+I<"vf|UDDy%[tg쿖&4K o$`bx*u!r^qx\pL;Ǵg_V6~@dk 69.Shs]F軸ةNCF1P ?;Ž}<?_ћfF[-.LT4#-S^klՅwVQ}KlCzgvtbئݮ#깕urE;T]d:N3>GQ%[^li\@>J %LJ[̩Rg'/EWM}GYE/ /-Ѐ?}x)p'S NWx]C r %> NA֍2o|rѯXڔGM-)`!Ϧ0LxYE Rz q #, ͽ U{-V%%,yp6e |m&!Ǹnq.n" &2(c)-C85c'gV^Mc.$~ۖ uD)ŸxI@-{*{іCY>B=wl`?9C#=y (M'(ͥL1Vy˸Jk-W CDCr_<d8F3s5*tFv0:㇐DKwau~㌏Eș^LuuP^f)|r:"N/[]^6ZF78hz9b2J#{j%4aؒfC2c/~^Do381,P9H7jBK;YqjF< 6ي{!oRHؚ5koҝpӜ~ea"ۣ-]_ jO#^f?k;i<@ې_J$z@d-YE%\/&Te_R0'$9@N_v"ծ@7E{ *ES>EB~:23Bπ|auȧ 2hooq/1pcR}rMq&aFP}AmxG4(R|LC[Oϻ`| +&Akk1 GaBjJ8fL a6'[x۠;P@ČfbtpmO^?5EH:橷O /;%j6{+Z^ mjXSd"znK55Ёcz!,Y3`vvȖ'-`za62؝XuT^痣Zjt}qʇ4t# 9nb"ve0o> stream x]I%>֎7k]־}l`33 0ӳ`ffRRUTo SKITa%:_џӋ#zzÑL??g/V@USάNr\']9^8z蔐c5ZtQ z}V4JM>sz*'\.z,gmg+9_>^H儊yL%ә^TσlNʩ<lY8Kzk:1~:>~1|_8>;B|0xx1WcB\08ńwz7q}:mzq@/ X;%T>2a52V$# tXwt1[OX{1JlcEOi~hY -ANU6`T-q~k'ՀG7v1NZ՟e@UL(HDObuPiD E=B&(SxH"QSe:NeA 9]D+B$s`0|™]U$0Vn,ctLC삌=){RB~SNxǁCHaG+%*Ű~2 U&SK}Ti I괆d-q>NK!0^֪=G^Og Ɉ@LOZEI:13کjLm8%1࿌#d*$3ʯA .I$2 +"AYa'XؒUgP,rY3E8h'9k73Z.l#-y68}[a­yjzϸjvᝁQ V/3ZtsGN}Vo%,4+d\gT꼹 pv2F*F֡q9Jۑŀ Xl2z:1+#v&3+XDn$ fZ`'Iē~W9 c&fØla# ~~ynUn-\T¦& +5(o^aɘ`A@¤L*bA1, ^IYRBՃ#+0]î(Z6]mq BUanjةԁō{8:0>r355R qV/{ S8O0{^5 ƭu8HAN឴RH߃Z؅oN3)j3VWP>D*1S"*cYHf%;5&y 'fTȄd.?N*edoy[1 3: #wa|7KRe^ێpݨPT%/Qht+j>o{x UrO"hvq$B)=uYBfK>orw2.nKZKLYNhVk(&-*3@L&W1!LW HC&%4 2.lPzXPwz0cLzғΞ܇N(_ٖVI }{)/9vMKTxJU։sPNl~9lZ܂>r><RN6]]s;:_2֩ :֭?9I2ti8bĝEdp$2OI+h!%݃gIqIbKMƬI-8/y y^l TUҿgaJ UVwcWMiEG><ӌ:rIr>j(煮O*Ұ*| D>8# 3tN())zHzjhBw 8u`r%zRօ&)šylICGx+cgҌ C{kC?0fk:HC$gdw= 5uR3`wy \zp ~M~9l۬5v,Xb Un"ՍFNl])tƻ*(NWŬ\ (ÊBfAvFhk93ï.bJJHXcV):1tÄ=J'3Μ~bgR~t5JMģc}RH% ]&2qeƐ{:)LM'EI)IR2S֌v` ܁ԧ_ mCϼ(7 -er]-;"ې5̡}scw50m0k6 +aT{^nur&;Vn`V^9C[Uo!pksa3CE7`ӫHw_](fl;1&&[7:"Ðel&|{=q5`-tl槳w-3c+P.7d{Ν @䩕=ϗ7zae&uB8ArZTԡҶL3Fӯf:q_Y6%񊿢dT \)PMNͷ/ކ?Axѩz'Df}iUʍ/l5C{>,qqw8r5\|96!?z6RҨe/*>.Uj)2ޭ+kc6Bܽ-l*¦{3.޻s 3w`~GHs[=;Exo6B #$~r6DTqߨ-4b_XhDM[7M<8q.qҖXG(s5,({Rd‚v2!8nKFZz\'d;pYn+a5;o+);%>'-mESK6`x\fiqٗrV~SRSaKl`}ݛu(u%.\,2)}P`Ѧq_SiaVwP=Kο{Tl*F*}t^ڶ/.,X{rvG:d8OPJT ̈>8Pk7gw3$[siW/v[aGPH>9 ]YE]fHC|`O'IyO&tR4Q\ybI6t WtL 2QA}\Q_Җ/>O-ُ2mvl_ޠ-;)rmKg: `]3I]" ~̿ %. +BA,_bA|k5";!}4 jD9e: GSMMs}|8RĢ5zb-/ `?o/CՊcX0DcsJyQOS%%v Ǽ|(B/GQ)TR >z+yy۠Wj -KVPnmP֨0½endstream endobj 184 0 obj 4618 endobj 188 0 obj <> stream x]Ks3bˊwb/qhI)$јp;@  H6~/ޜ}߼p&7~:S鏛׋7ǗXA&˳'5֛7gB q=hlߝ_(2(\ AZ}O5 AҷZh\LW^YݵfATv֑Z3Zoajm 6xNͷI+Ɵ& :ي+Dɲjn䃨Iʿ.o|0"X7* O~‚ΘퟰUŖ.}=KLJ?~Wn5>K;࠹!AI"Y:萧ʠHRzvf&,+!'+V`sۛ  whͬ1< ªGe !YK'H7X#YlZ.kHP>lsnPL yk/DeqIAo 9s6B>\&їU e6Ju_喙BsMc Oz_WA =R_R"gM1 ) GIr[pd7cWxetr GoТp~xש6VA]Y#oǻiK̪|e%:"g&FgH5poBԲG)OǣvCgHhӦQ^ͫ קSԣxþ=6rڼ|_V]T$u (K+[WZCCލ2`Sk|@{`jҡ&_lho542$d>XBCi%0 Bp;Y~ZcbgvHQ7`-j\ؖ!pp Zt&Ɂ `[O*X zN&X^%|Dkzz\B( F`*fqwy ~H*uOK`=U¿%PEyS;k@* &,:w !/φ=/Bǚ>qH0WoRC9';Xklv1\8i{8 Q&s ]=&*AS+67k \|_ԢcP(f9|~ޕF}4Z"3a H C`̌;VFGF= EzDŠ;oUc#E 3fYM~ B$Q [zM9ڧt} p@N2ٗ:ZljkU3pNjw|ځq \I{9[ |tq5(_RI"4uAmw&D'B,BX? PJJwI5U4 tGJ }{Vq4c30QM@9,2ƻ؅6!XI Q'*MM0CAPIx$}VWդP*fw[D3BBJQyЇ9rr&Nvq <7f9|_Y5[>cS&_<~\G/Y,5e1kUC's-c8ȼk? S(_n0{fV5ʂ{q$C.깵kI=Uk8ܺEJUmK2>Kv0-kH}׽:ޓ PnƯ~ U|/Y<7Y^P_c<.y_rd|rbdMW AeB9XםlE6b#4xdK\!vO}2vN/٧mS,vH'σhNmu3z .+|'?`lskd w;;O֧7Zo23.Ak?zMmd$>'~hq`Ao_yئʦ_*+Db@F}ɬU?R'g_' endstream endobj 189 0 obj 3950 endobj 193 0 obj <> stream x\Y~J7#Y%h +JJ.\Au;i\K$WTzXhc38_{qu={ ?}|⇧gHݩgNo)0nݩgW'}=_hQj9"vOR Oơ7NΆgūaxs Ov>!ϗ9O(duB!?=3ݙ/8+9{>)%Mx4\ƱᖛcYIi-/CF{?{0<}6_Hbbi׊ ;{r׎cX  )xIնH%a:E6-er#t/nFڈzRV^1dFJfs?{7׊i)=Y>/٫d Ȇ4Oy# ] |HSkǢ4:I6Z wD DDͅ9f;kޒۣW>-:&N@ҕrӻJZ } mLxFnø'3FNngQHs^A),{3)DLy#qYr\RK.ǎvzo\`^ko̰`L=[TRE9p KCY; wj[x.r$.ȝ@'|Bd>H냀 KcE2\$]˼k-TxyhJѦ:HPcFD!tb@2 Lp #%TA\3*H=5#n%f ke9'$m KN!֎ިx&rGW7+aH?TQ?ԑD[)Q T{ƭiQ,uEsmn\ o46q^B*_n&$zz$xG?~F<$ud8vEgi=G:==˹ԓp#)}+:c{sqs7cDޛc1ofu<ϴ?dBż%Qe™ 0%j<+e;(%Qr +qb] *u}%x^`+$ZIz=tB-C5!*L;Dq;hK#CX&UM0o mYaGL"YljaøL312$7ACJMhp5n-ZB)<~: 4M BE>s\PkXy5]%%Q<. [&/=+vPkmm %(%X|xƝ*5SȐ\[i#>t bOeJeufzhM&K|<% [KQV,?Y;6)aWRLwŮ9S$ys`Ȃ 9U}4  Z/vKi?k.וU- Yv Y_m۳lf4(ӮT,g5}ZwJb @ 1G(:^^ۍw0+ٷO37r##vTlen /Ǚ:W!p 9}(UҀަ`?JuN%c&Ue%V0 =LkHd]n>D\3U["V<Њ|0coo|<`b7yZ4RuQo70~M*Bޜ<;f C{9Hy%Sb =X ; U8٘Q)MAO+ ﻺ]kC047m> stream x]IwΙsy;ɲىdQ''%IV;W 4f$fV|\ W~=?~͑X=>zu$/WhMtʙG\HoWkԫG?<ވF im\?g~}J X4Z+a 5hh`?!T*Jǩ' \ң 18;f%R(}z5\E]ۉ5CP 8ZȻ{Il 31/idn`=|NFpRBg}W̎Yfv_00w5C4*yCg|b4 lnBigC2JZ>cԜT;dA y~4=IMd7l$ Y&L|ԡr" q.m0u ϊ0n3?QZ4Agt 4"-c xP7UCB_(9\Nu(B L ; -4Q7!"8f|f=C0 y\&dwyw -Qy,*:!Xڇz~{>8z.1w}`V D(p00;#I*Fg&UQ=Nr+P5G= z& @҃ՖW],f\O`VFX[\( ʂEmml2 #ޙN`'Pk%m; yMpz yaX;F=;[x{.#\ll<|m G8yoAg)0'`>OJz DI7%^#G I 9WK2nls4xGp"t0J#$")Ĩ&7w+!x'Mν8)i-FܶMG9INI&!%Akd11^k|53|yCvjp~6$|cڬې 6q4ƩR&F7,E󞜜Oi@tj!xxU<:H`28mq/c.Ξ]nH-k;X'pn$۰_A1w9z3bɆId H<>`cI0eFڵ_k3_׆k0; ;̴lw]GulؑQ ӚO ƕ|K'VbɹM"` ܕz%a4n}cHrLKm\iӌ4ZMziWp"dj-c;<*4VMQSw&x qWFtqEqBjJ&S :-<ٍ ՗["7S ( &w7.JEVTw ;U.3q`>oβ]]!uҾ!t"FybT%Y +JόSn%0.&D}@_[rC:IbK&ELU8{1b zA0Ƅ\B]aJA0N]=[f:+Z W*?)3yKo(\Q{ڞiηy_M'J&T! 8;Y\HNc.DuRQ$Rl5.x~[envP\C&hMɀտSѮWRG~. ;J.A`"əqFh>ZPCEt3nڣLM5W02xI/x)nMnr۹a5m]|! /R㛈e${3LKd JVj1t!\Sa 1sX5S=Ɖ r;R /V.&=.܃@R3 y:icv|۾B#`bJ$:CnW&ؐ{N`!p%#Bd.%u '(.-N֖J r/KpZt߁jA87TzK\y;ӴZ0:jXج&IiRu?ZJi% %8?C\ N auhN]TL"BoT.;џ_Rٙ bCVD -3~Kh|79kKaB=Rzh:Ɛ#Sט ]ÝiΆJ=ɖ SLT'T%en|{bu G [4/wo"|2/7ټp6p?3lԾ]Y,=R]9D:uOVrMYر,ͥem6[ҾD!H^zR ٮVDJؠC٨>G΅7wڨTֿwq1W ;|V`D8ݦEy^ q<rxp ꊦ`7aĘuрީҗ7F=tV<Μe-1Ef_]nn3O=EsxewR0ՠc/~w֥!)-[j ms ޫ< `u9"0K+t0N铤rU >S\Ƌxa1zTUx*!/YG}c?'-7홳 e1I %[Snq'_p|I{09 M`*?*ӲXiG,=6c`i/,(鐮WТSPBtE:!G>K 8'~ַyanf0D.4>rJE#&y:-0 @Ӫcza]Ϛj׮t˪-+4t;?6endstream endobj 199 0 obj 4071 endobj 205 0 obj <> stream x\Ks3bU" sd)rlv *z0VEi> Wb%ic\>g^rf/-V8 k2==|nQVy\>bJ z_:vȯ'i+cǽs2!?GcoGpaʞExV xᖛn,L'RZ˸ /P,T( &mߩk_hNk6m@l_dLF( bs j΀tUqPRuUH-U WoW(%)k `l[B$hL ,Hk::e kf#-W5梾C=J+b Nt"Hb=Z7@C\KA8*|ޑ\hK~lïH ) {:ru(<ǡ;TZYu4 0B$ ^s໬ӻN?yv{ "yڌ.k D|<"Z$`t^%EΑ[ b#&ЙbƎF)0i]hf`y'SҒ(ivCm)FyֹnB%zIO9vש"F&M&%fc4>OFE8 8P4 iPϩ:x"&}|R͘ڣπ/j;@/W L\t i#q yЖ`aVȣXHa#1|HxMJI iވj~!!iݦ_.-5\sQ,oPyȢ2-wgwv` U#E/&$ D\mvSMqwV;om:O,6oUW/: ڹ)ֹm F y$Ȁqoԁv=ւA'EH#1Ho&ݣԲլ2+z=kI BZiVҌC6P42 UᛞZ"QVMm _7SyLS| %}ZSQ.& GE&2ns6)8k\5ԩ">F;??:t%D_~՜A-w}w !Z߆:e֠u)@E  q%D juQnU@h/_N><ɧ〓NTE5*6 R_ח-!6+12#J~R傂2%jAg @z. lĴۙopoVfPmۨ/*4 GIۗ)mjݰT< :ZUV]h!nǒa Wǡ ))\IFZAޜAq+~W9qwk:w+=Ma?r*݇ܘ#RzDG1oP޴eJ[7)kJumdr ,oNKʻR+3m-}O2㍫wϩ?bjNcD;X3g ua'Ϛvڦ pe7M]^H]+h `0\]glx/)g&nM9=fN}p't:td#wƟg)XJ?migW @㦾 #n vV'ez;)w |ra(D>>mUխGCh}V`"+*fܳpдvw8 VO|^pcR/}wzWԤ?Ii5Lȧ>.{XCFPd)rWendstream endobj 206 0 obj 2768 endobj 210 0 obj <> stream x\Ys~T7l;}8y,%e`Ty )RrHQHn`fspT,=p h4Oz_FVNj^BT~.XIhT{H=e\#WWNj_k\+6k\ILUupZza7GlV6ZSO%A;],Ang&rml-h6qC'};cffoIm-ЇQ(퍩?PO mO3,8/7|C. r.߻f*6)gp3ltݿZ?$zaP`>vؔEϕ1ƷJ3.YPdK#LAU BKt"(RC 4%49`Ш}c,WVSqVa]3.eiO[7?wzߖw|>16!D^VFX~XBTZ6cy  04D.4[oCP}?vXrh13qvsc)M UȱWp!cjx\%Lm]Mn?[M+ƄS% r,`~>t.o>a@9`j2Ǿq5ASq`@@xp&i/mP֯{j1QoynK&)"~#bKekMcZdeT;9~CGjLckUvܓ{rK0waI\?rIIæ o#8%=8 -o:gƾFg+Wߨ$_v yM~>RH`los>P $cPfTua.;9Io}2Ip6Ѯ#0©"s*g^ߴ;u7L8N1`aJM ^3r&lOR˔ RQ"u:=9wl<5:i#GʺFfywwz{SB~;D,T^]Vd'w0ʸך}P꾉΂95uúvSnj/GŅ>|YZ;x> 0 [*7ϟ_ lrKX@;K17˭N0(7:Y)+^9f^ڲ3t9~=mtX/::wҷDw9opvP0q$J-I'TBn|l$0ȂYBV9Єs儊S0{Ar6wZA9(˭-r kxf;g2w 0pm3J2Rpn 8lF8Bw|MhUc)ðVK!LnO\ֻe0 "ݚAjC!qbe1 ,d52- KY"&B-ӯd`j) @h<@ӂ)T2eEƽ\+(NR+;` [] W]"EV(x b)LG¶`t%֪ Vn/\,jN$`l a.c{.6HwH `x 8:Tvr ΐ b#.G/ =M!#Ԁ]v ׉7lv+拚U]ƁX6g_HMW74Af rt43S&;Yr2 sHRI HLSZ -$A+cL)9 \wlDƦ7hC:Z<<܎?^i¼ }ұQekaW'U5Ϻ(Q;0{Q%7).x|QVʿa4@%i@g)TiN`q;d/̈́P}/IMZUSkPt;Pvqpk&wmVv4vG Q_aĘNu#5=y dʮH2y2Vݾ;,yȃ%bx9A#Ϙ@}W$'ޟ^niX| cAQtDޣO 7V๵G 52X-p<R4QQRM!%M#:8Lɔl?HhSHUW tʷ,amz%ؑD`wGXDd >߅)40\^,m|d5" 3LR9h=J>:t6ɇdaPŴh?<8g/23&=F)a*ٜOYS sU7t4׌*ի>;x-endstream endobj 211 0 obj 3331 endobj 215 0 obj <> stream xZMsﯘlʃ$ɒ]IE)Z''$W+Zʿ4fgEұ)&QIUFu7?tRP'ӿr߽ { ])gMYI Cu|?By]Pugÿ'eyγw,fTl'*OErw4Pָ:u{1Qjq5?zm4Xȗr[1:Ak+VYiT\䱓^Ni&FyMl鯶 ߿2%sJNOURy&fZdEԑ=>Vf, i𞬂dY"Lo(D\=<iEE|C^i8ƊS9D̮9$`W_Tn nQ>ʹ'8'~LZxM> stream x]K$qۄ#|c]apئ8a$re ݳ;( Hd~냚A:CFM!p|)L:ir^ۓM^:㧷'=>ѳV(d|GMݿ)9}|s<~\J1.[tή Y Gz!mKLLU|{cu 1|Y/ŘOD5^7<`2Pr1v9MK!۰`}{n V5IUy?ӳ&Tk!ORꈻFO096V.`=3dbYC0p91 ):z8>@Y[ JdU\)DhtoD+Q_ݒ˲S; jZ圉jaX3#i2boHrJ!y BJjܹ ^(f٤N0IDnMPLErYbf1& L?rVlI_auo[չu>*{FA 1ZZxp"ox >gzto^ŗ+tvd~,J`WH\#VW/Gj$efNyDm]hzk̷[z21]ຘ}!O$*PS&F]rIZm\X`4O$o'g`fӀ;eNvjh}H9-#Yu$(Pv^ sWc%+>X]4y&C+l'-6+i8&(sUzJC;jAϺ!+!@Ll.UFp[|d1ZNjx |u :%`%Ơ݄M5?2˸#aXS:Jn>eiOze+P{8DHK؝Z(ts2sr _2X ^*0 b ™h/SuI'rmugf;f]@*^,\d/gT':HQ2R(alj9ҳҋ#Hx T;Sk'A@ ޷RO{{qcq>Dw;?Ϟ]5תt+l&I<啳v&aō b97Rz[Eb: T/nܤG:|ބWzo'V)zl`W<0Hvf|/ߞOYL rE51k8٘),{Zb1ǯ9nax8R̲{FB)a^@:3AQPEvF3ZXé旌~u#Tz!OsE糛tW.$ y2^H4;4 5S8\/ ^[s1 \y"s!0I-B`oŻ~Wk(!^lF/_e8Gp)kݸA?%UgV ^Y,zb7dQM!*" T˗Z([k&@ m\0{ݧ^ 4*Q̀QNX9/ҔFC*g_$ʀM՗[mn7A|[a)vP䀋󳔟 'Xƅ;eAg<9?3sc뢁Ef_|;[$9I̵/ V8[Ȥ($roLZumb>zqsyYSf+#nCLEl f/̅|9n)%p{|deVw*[ʙE26N7Nv*z5RB~Q͝J<5,9:.Rd8 ouIO #a2?Lk?o4_ӔsdAH۬T.%2}G `"`"X˘ SDj&rB+"01SsuIkXGم̻2֢Rjv!ul1wa4lCE/.Dνw'YRk5y7 *<ǁ % tCWEeiѥ!9,0Zqʨt ;RsN;qr0?~uk>+&y4(X P|=/K/.܁&*)<ᙦR}鲑Wcz4Sԇ%(ڏhn9|Z`y)\0niˁ_džşpFşZĢ꣝oG 9ԌcFevov`~i:\׊6=۵ӆY.u uQtћuz6@UUW\ܦ; C9Z9ϨaMa\&I Qʣs9[dS{YftE֏Tcx\I2KI3aKHGZŕӑ@ _ m}I.(DnkCޓwy͉* ݨ DZć{"Sa :)Httْ3Ӫ-NG(bRJacCmy"0۰>|ߵ25 #l.],gk7QJ Osњ7ݞ/z=gOW\# :r3})D=f겹]wwqՐWU0-&gځosɽkV{TpGdl}Nw RO]J e.Νx67ߕ(f׳0v Ģs%:l盲ƶa]2KbK}5*$Ve-PJwnTf2sӎYA>; f}0pbl,ox_( ܕlBfÖx⣍OZíΓ'%Qm4;GUի (]K_CjE6:Bm5MLD7bRIЀ uΏ@5l/<L82qcTW=>]$tcdMEJ_9x ՛A^O4373Ne+K8W"{t43O7+o6sM\dXTGno4[Qnn ni+eI ot0ҝȣE93 ⰸ &uY_Y!M~/ᮘ "S#YC-ݲ[ϑޒzUfKo%(¼ز_H4 Nu~Wj<*U;!sQ:' N˹*|"ќmF.aio,3xck_5?RxI͛H,~Yo62]F1PjpA`x}i aO9ӸwǦޒ;Yl7]#ifvf)MR*| o\%F>Qb8EݻrY%F;kbkRh77)鈃w^^o^|2[:hӂk,8,YeߺJryսgw)&1T֞tH(<Ϲ"FCh@q=A%)] YGc},HQ0R$[&A,rLR)939-K4y#zym)2!X4MJlI>jLN67M-9!Iy⒂-s*,p"!M?MR.> stream x]Yq`}u`Zu@(Ě`Xŵ E;+뚞% Ѭ#+/yw&~g׷wxg٣ h 䙟F]|gL3c%g7|8߲Iiټgm0~VJ7If6Z%-6zaI Jnޜ[򛗱sl,%ti7ߓi.Ή繗3"i/d̷+L:|}.8.'8,3J*lt&;4'zCLt6No/vװbwWA';gImVla&Ɩ=4fFH6Lxz=Hy]dӺ#z NdbPT/)&G%t&jFI'lŽZ̤^C{lozp;7Ʈ~SFy^94?W >1#K6Ͻj2|7Dʕuϳ`;p+r|@/I$n.7Lɂ`Z(ou}m}uoaN$@E3@$m𚂂G,`TmJDQ^3!&θ26M u~7ߓƝATsBn ƼBLl( Lc^CG5S1 ["|[ dpڇxh.(֫4B`tq"q>(^kahsS =K^;VFeQ ?ˏOq~|Jp [Ď<_`7=,ڝ@ؗS 6l_v $p)?wSplF=Y3˚c=o1jʍwd[R#"Ԋc еfZ)j+)s6L?/h2r)8%u6%d>bSxCCݱ#h5zkZg{x_#֛ISԯ[Ӊ짝ր4mwD#}u-[,]H+i"Cב-pV{-8fMEV#Or8Kt|`p`AqLW =ѧQ~.jL^6 o W( 0$vK;uƏ)g |R*a&u3+0ERxrQ- =^t(¦i^>P'l%V t(de=i5v ܣNHP@rwJ k"plhS[T JMז0mt$]&񻍋t -G:J"i2N4YG6ٓ8%팪Q/v`SRr5zKZ*LEJYG3/DoYi2&$ado Q1dmO@j~{d-ZITFbr0Ё@L(nݹ@V k"B$:rv}vZ ]7g|plac+AKn+"Ⱦ)TɊXXK)N~Ft|8״Ż8U*GGЙYmi1A`!>X3.]йRY'JmF\/[paQD8߉qDV~^%@[W50WxPS"'|- HCƔZޫ8u+ԜaV$=}.`'чawfh{B4h'cӭjNR]\jn5kҿ􍶷U (`&>y0Pq$ @D^QsF$sV?0w4{RkN35(4fL1hJ[k-Оb"?#1"NyfTUÚXU0 UK0OƱU@ZǬev7SU4c*DVy@뷄|!Tt魴^Npc | ._4y;a0d2}L;kDPJzacl0AU4 K %XLm|%A졳[a*4GI1ٯ5=*<@nISa@6c 7Y8K^3MHlda/|/Py]A u.\hj*=4 iH|J/6"e1QWōN5\i{JUfī M/ށiRr$G}(]l"!gE͌ cͮ_/ţLr,kB8 Wȭ%"P#M0CGY0M$.ț²6&SbsQy=eRRg2)kcjKQ׵yQ<ʼn%ԱCs0,/.[4`7Tޖ6" CYCե$ rHٺYWzb)RbSA) k h񵰍/̷%Ij,q2ִ4ú=l#': t.9"lc[QOp ATh" Yu [yE輦I_nc0~kF2!ֳd(v>üD㼙HhC]0XY:(xP `{表𷺯j+1gaBR[؄{50loɇ70t~x|Wvq9F{"em)Ϸy> 9zB*Slߑ3Tp> @g*ZL&\w&HRm5HbF#1IK"ctKLAڢ}߲[5YQ56>[M?Wq2O/'[b@of]Oۣ!>=oAXҊ*WʊqG.| ێL!ï01A5QIuu}ΗtA{tf lնgI@@u'9 i! @d]M**XγܻԚ)gx?ۖMT9?a]ʌ IMtAJ*#1H2TQTJY}Č*#DA$eV.,x+ ͽu}U6!t .LȃX~w{eNel6UUr \ Xˊnu\B9IU 1avLg[xWwo E1pLMׇOqA MStEtwǎclbޙ3tKϢʁ0O|ZząttdMكUU5 ZӪSozYQd8]ׁq(CUҪ/Zior/>>w?xPI:SMM ʂ?ODl<ui{Ss:N1Qp!22 Gv|Nu}[-[4Gu>>ڟO9/׉1xqI5̦>N+?W,qdQ䨖_gȰJ:Q`6}HFP}50uƤG&b5X>MKdjw>D\ɀwAI;qmBT,t6ݷ9#}̠__*_hĚGf]~9kD8IۋI_3(мf~G[[!Ҧ*#wz;!Tjvʰ\N̽_I<Ԟ˰VЇ4^T/=ǘuJWP-X9W_wj%\x񻎥 GF4Kc陇QyY:6Ri-:d *9ƫaG+_eOhA >= 94rǼj^șO07.y!ݞi!LnhR=O~3=sM5ڣ8y?.e9e{/";٢&?(=?#Ѕ1̉d泍9陏+<ÕZa_;`W )oկT!T}[Mjtv)}8S4[s$*7vht}$J5}tJ&_+qoIt3dhO껄B/7^3s;H:i[wu|ſURv#Xj C >䊚&nƯl?K_tV{N([S'חKtI "Ioze•czӎY-p:}?7p_Cx̿l9wJqwj1\2 eF;X(?pVX͈R{F]SFNgTF?sAu.ݥÈZ?!.YsVb_nr7-8^>O[_F'$}LTj#19HW䊚+LO}J4bW።xiKE/ŃYtrendstream endobj 232 0 obj 6301 endobj 236 0 obj <> stream xXKo9ϯc6v \iY)hrQBBv3Y S0Lx0V\ϯg=]=͌W3Y?` UyFUY)*!UJ&ph(U?锶uY)L}8ԿifxQgI>eL}1__.D@Rc8N,㹓 yÙ2rSxsYVݼR3 x+p 9,z)a¨‹,Q h뛤 Y'Q*vº80M`V; ]Cj4h־># Y*)&ò>j.K/R/񨌗"^~Wd.Q -XIʂĹ.rqf L}aFۉ7kE5\1ivl)tlvHX{Iҍe|M2IEAf[ {AL$ ([qnN5*oI:K&@BxUy\BQWhXK7nfAssz9e28#W Zpv0)j mG͊Vh{nE}E+g7JM6&@uMhجc>..drwn,R7!BAhۂ0F UO{y_(U0ai+s%V?aGM=Iޤ_bĒ8%eĮ뉮Fba̹.i9&pHpQYF0jTO 9vJ$FtSF%_9tvQS'-v FMqԺ jyE=)cw)@r ^2\Ndw>u2&%ݪ(6VhCS%]f?U]j T,0,!T~.[PP'kHם$ɰyaf?}d כ''xs2}bƚ{ ŶI}}Ag0eG/L+tm~hѵ}1mC2,RGߨ,S@+׽Y#]|8n |?B\EިQ2 ޘ?1?Zƿ/-endstream endobj 237 0 obj 1147 endobj 241 0 obj <> stream x]I%UW8q+}:S<7HoO6X{znnŠuҟ@h/??6?JѳJ {~{sg(c8i=[k=2h1 #z84%mPxUڷB 'd~i7٢OӣW"NN 92hT;z!d^gLPFg11M _i0)Ӯmx!*,q-Q+m\jxfVJ70|;e3 > 6&0?DMoJM ]0vuv=IwkJVΆ ]Oq%CUrNU[b_dBrڜQ'p-njDP* 'sC8Z[\UFyEÇ£oJiTރS9O,%>S/FdR*8 f >]{ J$&-d GXG s/& @;{xiy у&bD#M~I&SN[p9?>zL#H?kP_#-OF-=OF"8v;(`[Ĥg.H7"6ZNHBI`u1yF*p~815,4'ķ8 xM6!MAE:Aaӆ%?Z~ʻ AC{He􈦪_Rb˖dȬ?)-pBb;jv&H-dM1-EªYW1R"UX"F`F2@ t?3BZU&=PS?˲!]pᙶq F=eL3o[~㹪Y){`S}xzi<at̊UZ'(Gw c̀ڎO@>!X'.x~|4\A,Wʮ43,aƑM|Ĩ-qo* {d(n 7 NOF$jWHI(W$~mtR )N/q~:|QՠRl=VKпmd$0kG9MҲU=[mX79W a^ :nBU%n( fz> az} ]SSPwS)ԨcKSXg;V7&,\V)\L7DW -BVjpV[(YZ_^ }` X<9/]_!@R2FL-/-J o4<$&QP U:},S%9'E-q$"5t| LGJ)JFjI9sH/Yܲ~ADwQoQK\!p:VAFq!>b MAZZp.(8oq9q^ItGg2X6n?G'+rΧ΂Z bb󥭮+R\ciz;Fx#dK wzFN#" it+q+%` D%@ˤ[tⵉgAS&t|y_/}T92;`\_92Q[M…$(.WYruGmY{x;s^)Cnhy^u|٫节20al7)TlxAG_%\*Yb<-ׅ2?G,Bk)C'Uc•yM.҅fFbV5D8&G^A)UKV*L{NX"ajש:gC'ʫ#k9FB Ir/bkMQO؛%SexQEba5zlo9b?ͷ9soj\)2oي6{ AwJJ&g7 ,{G3L༭f [Z2eT4kPcܤ4SmUtU}̒)M2CGH{{>HV)-W֛BS6q f4w(;M"bG fdB fVWXiyR-kIr5?s\j認zP.փ. Om=(-RZ=bP6{ߒ@B='>$4K厹u"@SfJv#':Δ֦$7cؙCz|2HC6ht-RjSΣZ3a S*j*SV9MuŔb\ϣ BaجԥqfI&ҾapCc'mJ-鵴ݯtlU*&c԰?* ݌vaq3DfDۡQB$P.Ws:;x7JtLWi0Xr_GڄL.$qzx㔢h `Kb㠱^A|xڢ9PydkM m]Y:K?)C6$.eeZqwsE5vrX1Id8|'pDZ X $]m puixhFb5L `>7T%m|9pN]MIE"説G 0s3\/?СDV%gޡk +}*-% oi/-PAu`W Z|Ux &|MkxąI(RI2NIbst;khԅo>aP^a% +"<ʞ%2%2u>C/>5+SJ,Tӝ|IO\Ya]%^rJB+^;:SA)/ }*)183%vqۿHFgƍE`]WyŀvړoTӕnǼyC&P41A{h7rԈc1Wi[U,Hb:\E EʚmKluѬOH}Nŝ2׋FM}hmR}ha]d y3O60?HJ){Y70)Nl쁈^j A{#A!|>'Q;'8lWJkDtkB@ڟ^(UoCendstream endobj 242 0 obj 6194 endobj 246 0 obj <> stream x=I&U O_TZb#v}faz^3z- ?<7ث|!N^E}lB#-_pMn A~>>/hF8G5f*џ c0V(佌e+B>_X$蠭3I`:E ǃ1ZM6Zw]󏀖rßmg$_R5CT h X}jDn0A>pz}#=JA[DmNN6&xQ٤"VޝgGO|K|[ UЋ^}ҟ1㗁-#0nTTUie[MHdWn`) zϨ+ F\y!`=G'm43.m{%j?Vyt lXnXs7,l1J3;Q1jǀڏ a{Vv C[J9r B+`IQgіF[1)H&j2=q(.W^1wp[!oB!oT'f+ 28Pzˁ )gd|$M=Kg9&!aA򱤸٨BW؁F@Y E$8}|9KTgQeP0(ǠYJxmґZ #^H)I]%ɐD_=)p֝ cR쮂]KDOA (Ob"{$`:ج#H!  jAD\ *lXJGXoy~v+%Eʑn?&9I`[Ɋhq4HѫOV3# #݅P7;3ҫ/M"T`}a yR~LtwiLktaN|42i Q DE:=c9KXWv5<JTSZsMe.;`ΚhX 1Xgfϙ;-œ|la@Pw^ _3h}q*u8MF IZC,(VϓC& ,D}J1 oxL"a,$me鑍V:=p9XXw4fg 3 y !#hűwڒNfm- l~0l l&oschwwc*HfoIx: C:+1Jzw $=)icN f,@׺qZheNK qPl?sܛ?hd5FRZF  YO͞`cPw}% OOZIe}LP>ؙvMV 7@ȁ|,ؐ `+;F= l n2Ա%".&M#l=HMm`Vy&Ѕ lسў%HG@afxRd_z)¥Ď`ǟ aWTσn>DP,-VPR!I';9i^r~d ǘ˅M1zZ?AiC*W50|j#BB6 9Y(/^kWQ7nUU\ʝ:vV'I$N{wS >E,@x֑ *@JǕ>uJ\!hNcţx 1_1٪Sz5Xo͖p7ʹK #`p@pXtx6H=f́AjvZ8~ 0?F|Es[fGXsCJA4};qmQVYW me&r C@ <(%0Ŋ<:"O+ACvSw %*R<<_,Bk˵{>0W6| kP=G:O>+W2J }_8K-76k%~Ώ;);T -o+[_-,NbV=}2 7wiBeFxܨH9s೏h^8$V:c 0s᧹ O!.rQvv9fc`T /LIXUD\je٧Kfͽǵ#*pw)X6EX4ͲV!2h~HE%K᪷1mh+O?:/n@7"uCc]c7Dpi x9&lM٠֪;L)= UMH)61"X8Ku ^_5W ~aݬHӳӺh>ňMJFq=PN5"gvmEUO#*0*?mub._dq\bHÂn"5eP+pE#7Bl{&>,tЈԕ .6sipZRCN/9|**NV@xTߘTyl^Q*B|XOJǀFhMn9f'E7} T ?=X*mWUDSco 6αDK,1*@}_stxNЬUPu 82?|ocg7lA`iG~F*7ku6<K3=#@\bI{̮GD'E0I&J::}iNH h[ZbK`wWW~+o O~EyBh= `P@W$mF5>1ZjǗWs Z[Xr*5f`C*s時erd}>l}d -l~kJ.`.ӷ-Z*Ӹsx:axk`W!d|֩KCY@RXwcHRm5՚O|joqbi>p#'K}L$]؆-%rYkkddvm-iՌa' V6ܴ:l,k>3/9Kmj`&8GLoYR֞M/!5zi)C \zZF7e~ZTt\4p <ع/Mr2*PSu'V),5gps#U<͹Gr*u_!>*qMbex cȜsg.-$g\UhŔC/L?) e)&Xeijn&B0eТxYRhnMNWu*h: o=Ư`۷ʁ< .9tc̸ AXۀuyeG>G5)2"@M. g?e#- "~0P;$8 l\jJU-}ޭWmVҊ74~}?ӛFGps Q?3jxgDE8L~igk[EoA4gw *bt&^ݘrKoRV7~h[1tkqDy9(IPrUk W9XһMu{4^q41kk _ 'bE ?"t_jniu{S;^{SI\sC<'г7TwM8C[%!ˌ[,'b(6X@cnيdƢ Î);u_p:R/Ȝ7u2ǹ}_&촷0{u`U[7Q؜+.0 [2JPAF9/qaF͝bڹGq,{S-.^sÿ,)ϻf2V0\ tKM`vɾװN"EK"tAľnJ 6E:/E(TbIZ-@T ؍WĮ3qr3R!GWJ~ȣwv"vToajK>'b7QG궳?"S[`&J(`*ɨN⍃m|"ǕP{*j|GIJR,q-*^>F)8X_eXnHksbf|:@[Ғ c7b0Ԣ eGiհ·*O+m:]&cbÓxkwU˨Iˣ>Қ0F:,6";tj\:"I"ȬػvZ2`\i8RgM5JM &6H)exhԮv atbGW(L~tqK8¨U޲pXzVK:dXIAEoQEc' oh9Hܻ똤& *I{}P{?~A;e4au XRM.5{49'/j_de Zb+5C,bee+,)\%[~6FٗR; l ^@8ƥD\ʹ\ Wo}Хoz^ ^2pa8ܒJD3\t|1r.b ~Ch@r=04hCq>wG]N' zuzJp )*A~o"ڙ1̖?߁gk<,e.fnwQV Vq`EtCk@+0~gx;<“ 9}"FPG'endstream endobj 247 0 obj 8637 endobj 251 0 obj <> stream x]IuvTVIUo`{a)SvJM,/A"wt |,WM43|g 1 A^?Ow=/_^_ hu3O|ߔM 5O^?峇WbR8/>Z[sST1\@ VhVZ)/O+7jc'1_~EYoCPJG=^W*C?gFrG=یVZʋɉEZ+hBJs${mTB$=_+t`>$cOrڜ_a)D!S\df,u.YOg"'3Q!wC+b`;Qy|)\&UEv7`o'm.XT 6NWj0tAIV%g} CGr0|?>+]ϹE2ު:<W&3 zeLVY=.!,B6*.R.WX>lbMZjbdi--vcw S` ɿTKJZTc #gqlwNH}GmnEeXx,:qlLU&9R p>f]UV͈ /rgٱ F`-w~x=hn9юax|ms%QYTCe*qy1wym4a:4J1voRnJ`A]&zcÃ"4jY V]}W` ,lM Zh;@y yZ' 8X,pNIO9U; %jU2Ztac2C&dc{wyդ|BۛT  awޤdzLJIaNX7kM_b]U&(ωE4nXZ GW}ћޕ6f"ɩW%^n-pw Ѹg2* R4}1TǺTRR޿.jbzoجX2 XUs"NNEdZJ{d~R 1)=Ŕ!r7P|-Z#{A\9ɞegjS_B 9;`7̷`9cT2G5{-=1FWMv$>UgYgtDP@T23sy omg~ *x׉I G-d8aSx|ea~C],@۾o*2QLR|h h qɅH{yW[&{}nVw9GN~F41T E&hWνEke{N o[؏J6/4உpN&9sٚk;(<$l 䑒f HKί[B2E ^MIG0ϯ)Oqz%}kcʲ灧l|TlWIg?I:aX[fmC/W<-)md&ԄTTEFzT xB0ǭqDUtp9Ty >q)3ņ/> zRNܸv#$XQWð;gF:Ig@%4Ik\U/ .%g`L'13=Y#Gfw.wߗ74LցD>/μ=Tڴj9 /B[w3}J2cya\~ܐ<\rj:q{l'}^6V|'$`uBJ,Kͱ8-6;g98!aC#pM8O% =E^;z׮Nz^=@۞WE|miaL GG]O5J)972|pQ9> EdkOɊf!;ʽH@J9 詑6F3Hy/ρppJ(jx]|g XIgqWpmS09MF94991wrj#)02R+>)XqĒ#G@ʩ- 9/5xwqWvHxP@澒|{-*!*` Z/-Ɗ)VZu~~Mb'hB Lל@Uqbm5ruzf[ QLrc:ӤUTz"לi툞DՁ:$XRGNWM {=ZJst pGΕJ!4޵ΏR˯k 6-# ';0Zۄ>*7`eˣ4uҷaqɺɨntmy^y*7#UE.^P{/X/k;ЫkDգ-B}xtC%DpȩWaa^|¯' _-IMC||s ǒy~m9Onу7(PL."v&')#fB-'c׆ 6/ Ah`\R#DY Y.Vv;g||9:>F>`~:hFqOAo8un*>:յPK_]ItY[m{t7=Ǧ<ސM9"GВŒ^ѝ{6o{K1qIZ9A&%ߓz `EҧH}$mnYH<;+`y&j "e삲wFU7S3n'6'\)U&᱅xAvƩԟ"ڀRҥi@@IauDŽ%dɧC;U0-EQJ%YѱFZmwSrik DUw+|:bntm{SF<Y~'ܣ@ٛ22s|x2bO W* f=q"4,SpX \)''VWRk`9L@ i♉ 8TDPu8Ra)+=4Χ\3?2/iTL -ὀۏfXGGz%^{GGӜI2;U:]JOH)7!3b1I,׹*o:us ıv#szP6 *;?#A;.smy;Uq/#\qM~_iZM> ͝ye27De,k0W57-1g!>tkkp^OSaDE0`G9w2):ҧO"Mc9MM=/@BjON N<.qقF/)Dn>/!Tqkٝ 1.[~t> Ϸq(TZ&;6M Uu+Zwk{No_,^]^ќ%vѹh?._KI8}ĆQbm-}5X@MN^ $J#zX`wCumӿk~Q ZC$NrP4ɚTU}16*t VmWCcXC_J{* ";.mK>&V9pD=<5O$kdu+oFVK)}ms*t4`;M!NBWK8J>Ѐ`sTsP @(1.JsN],th9n?-/PhN,sJrz-%\s=[C'xw*ʈ[LmsѬЌ}TuvO!OVs5%ժش݉dW_@~x M3`[]J+%n[q;8ǵE_bqBS0Pۖ_&؟QM[y[qIup > c|6{th?~3s$24})(K:a ~̜NnT\&tG$1j2xSGG "kJ[ I:Ǒ澤k02dqTtn':C֔dG,ҵ4 <PU5nA*ih`/`> stream x]Iqw/K?k}fB9b̡LJr6K$gYB_ ~KXl˗ P?܈IS~oo>7(&mчWh AҳFpURW9pOZ{/؛ϳ16pbt oC`?Gz]|t}dmk>c_zgVy||k P6EvtR @#o XrwKZj38E5f~=1WtsI9y8Ɉ3AAK'R렃;D[}ĘيhkzCwu戙DrO tt.B)]H5Bsk#o1~BF z&4$&d ?E2-QXHk3I?2Δ䑼ĭ,~ΜйO"Dk 5`^=1BQ~FM4V(4:3H}e-D72dVQI4"`3 )N8O+/jsʎ6WPȋYq+{̕tU^/z(%?9BYp h֑m[oѹ#maO^ZއKIX!DJ+b&XkL Aϭ4z=Nq3 wbI/Z ͇s#ڠ!DZފps$q^^H_ t{P²EX27vR`u @>Hd*}^fq$E ~!%wCyY A5\WMh\A.ifRDsc'eI"L4hۗ^Jݤ|>%o$iו͐Vv2l'gz 8ۭl9$β: F1ja!e(%*پKb.CEͪJX04GKjCڨQAQGZde-}kf/tA+W}n2]+Vdj(l?Օk*v6h49$4y,N5 nnqMWz o "N2}V7Pf0'MoGWP+,t.tmhv4'ge^!zg<͜@9;kU!O[ XS\Qp('&*Cg~*n@,%c`BCVRY ߤxr:D*w$GNOw IQzE$DH Ab7rY ]ʋeĀe#L Vǩ!FyuLBjJGQ:_3mON*% "eui+=_??o5QUQ\:rfS2*^KJ%=׫-|o&ZAY%Y)D9Gl&>$fR Q$%{RFO :jz~װޱ' % x # odVN2k8my7[MR1$y$0COL/ f0,)a+6,TPjzz3^+m!'-L:9NJQ~OE<( DXURȌ"45Ao#ĹҪ)p4Z_@Tq^oS˳[[w]Sm$pXfAgqR) -_sai~XgyRzOŚ!^gzeS"!hҭ!zn7]->&PN!(b0aJ֎/I4u# 3}(X&t=cQ:|Kۧ@iaYM}|cr$R_d >-lNo {Щ]^ ЦSo ʡo+e-M.Z7هŹAˊ՟5)LakL'\:×rBD3$Pq}cj-Y:R0T{] 0" 5%-hw|<]5hyUAm*lgnGexWtkoJ3 XJ8.m˥?JAt*|jc.p ~i=)mn[*L/8w끸c:x3IՐwl|&t8S]Dr*nDG)N@ttgn[V(vb\} S|DG'l,(\hp+Z]kFW/H@er3_Մ1$UyȑMEl[-D-$\&܊O;!ҝK[mw҉# B+H\ ޤ#ØDxHH+/*q7D9*ot{ZUR{е٢RKncy}-Q~ wϾ\_-cMmgS=gx5l}tJ΃<)|ت :=yiPtSi}#r<%:ޖ~;9zrIx؍^S^q6{Vv4V EX:}0+@daZe:LPmu:Mir҄6q"r:G\AC1>u%?,{ttuF}v7Kǯ==;zp-Y].ea?&vFaqК zoQM,ľT!xamI!6{zv xxQ͇! Ŧ3s/Mh6g*ǦKD0}*vKrшr熦$j*x39&2{] R|Mb]g~N@N6$k =&;R@=M'ZE S%*"ieEx$TDt_eĴJK# :\N-Og@=k0*` 0ZJzsn +V^hAF[t|!Sxiɹ$>[X%xY2+3t랱Q=NaYw 6D&N!Z+{X4>0hPt~w+Ϧk:`fWE*P|1^$퀊j0+$W#64|(,El/\=^ ޲H/gn~0W7V6w߹({BxzdɽsLx??uo4E][S3DZ\h2]N6^$;|.?EejXݪXJ?jTWTNefݒgWk4w='Q6;>)7w 轿&IzOflƟ\A^]A)L<${pߛU,gJEZAd!єje%"{EUrfIyeB9G?!4b=!lT7G#օb*gOHendstream endobj 257 0 obj 6241 endobj 261 0 obj <> stream x]I%qy 7.h9hHʐa49ҁU9 %C"Ȭzar%݈Nͣ߼HܼzL{S4&v)gn|ߔ7RNp7O<3wwEc==5N? O??|>=ͧOXwc>Pbt?XӟER~w|gԷ6`hy:Hn8Fko{tZ7؛coΚZUu-w6ơ?ccE(/h@!%^wi04= ~ K ޔy9ouPo0SZN{0^*w6*b.ӕVaKaKAPiچN_xzyAM5xћtn$&<7VS{y ;R!g,R Il-m?=>~ک;E>P Foާyx,65qދWMY&r>R* I\];)09l](knMidl˾΀ֿO} ͭZ[Rke6u`т; (y`6ĭAtyJ uBvQGϳu?N xn=nDXꥵgBXm'!wB:.hW(wCl+Zeh qiJlk,Sl#$`Y!EPoZ~i`xM{mqjKjj7fn 3|$N; Pތ5ľy~y?*HA>Fd^C?4 Y`Sхa{?ʪoZ\ȁ_X<!YFGa:)X ]9V;i5SVg+_kJ.ٔw+&l_^#$W\Z12rrq:D.ig#<>,9fvI9i3N u=s/S 7GRh,3yi C[ښ?M\t  N0=ODXSsTPsf^ϒq6*01=ZЩװD ; l"SoW971]Mo6L`q6e޴/n?U0cHy゙VXrtGyմ@+9gTRhIcr8$ӕR,%SP}u`+wBA3I&X>:w#i*2-P$f '#:TѼRGC* fs]:/fKWT@"aKTȏzNo@[B!:)s&1A#H./_Jkw$?Ֆd8QƯ6rV&sm,ÃPXn1&o,%ο|YQFp5 bre̔+/Ώ };_cJnz*6e[.x>WEJ1}7K)9RX79#̥K.C /8n&1:%7PV̡a;jk Shk0|%NR̜Xjasw8=i/ 07uB %{Xs4/$U~NaR \T,d%/)8k&XK!Ջ[i2yBS5.-Y:Ɋ<ڋu%DEuW"{,<@]p[/]:% QeUiɲt.U\Fnd󒠘@󲈤4(t+!M0 !#/@_k]\R(WvPjMAT@07w]udتgc SM^a ZZߘ$G*SlzqYLbhHf{7fߴ6;yWj Ueu0+ACԚ1_ٺl y.k;e,rtƵ SG0MSr،rN 19I^($ǂjDi5nV,5k6NJE>մxSMu=DAzuXxЇ ]x9 UnYЧE7;*.Ozl~ ;g#zywޅ+~ [M2;}C00yM"eXds1r3hu(C4܈J-D ߒ0gV=?>*ZiT!Rە Ј8~XM <Ƥ;W=û O7>h"gG) x[BG;oFI\&gJTkT[Ԯuǩ]Zʙo *i.T_b=|}@PrK֋Aa;V?@FpWYK5mJו"\u`QAJξk^su;>Ugq2g`[$fO@pmXtQc9ֹֹVmR+8U0J7lLtbGM0 T:4Jn @N1L҄<-H,cڈO @Np noC塟<bjJ\!ǔ>#)Q<]aGGG>R[@#~2a!?M! ~g˜j[Emdu^y*,h}W "`x=GaVY%1cSXؗ&kYu,W^Պ6+`2{0\zBVX*2R> nK8Q~w^Qˆw7WOgմʟr00v1:'^Y1g닕o2eA#/eKtrf̡]˝o< Pz찚ZrL0옽3ȿe"JVn+|tso"ynzvI}&endstream endobj 262 0 obj 5617 endobj 266 0 obj <> stream xݛIs|wV&kCdUE ku%V+N> ҘO8tR<9Vt)|;&es*JE(uژn^Ym֐a"{z)Vh՝!gU>e֘ߗf&;,FݖY^(}ұ 4R6P?_rpy)L)KktBhiYӭCt>X%1,+uBWQi1`Jai2GbɷdeDߵzxQL#eޖ񜟘517h,)bMTagZ]JcI]@ q^ű_FP9qVOG (!&[ S.[=Ħ0%15^kMK}ҧ4cNCJr|<Š)AEFX7]e\jK;٨w~aKj՚^( ^]C[yCHH;ifUJ"]ѐf7"X]Okɡ̞ԁm ФB,.+"&PԦSy*j&uOHݶ_9{sנ.6ls5X)UW!G"­ꍠC4LWl2܊X-KAO )←, Zr" 2aj4I^M7Z$eQ;rXȚ瘛 ɇWUm7 6s6Hzn,P* X%qxIA#T8# g?N_Pݯƞ;@pܝOWZq'E8!().".[E8s6 9=̩:3 =*tFAc+Yu#\]gHkiFM]T'̮a6Š#("eڠ}LJDf|(pg,F-^#љN߰~p>_r\OQ( a&=8Rп4|VfJ8\ydÒvW}ǼCicczvLYDFQk(˜,yˌ Ec<7q'agZ o4y@TN7I&)Mdx"i?C>4Y!H3o&I|iB%f縊4)~:ip i"Pt=ilmJmDzfFD} &_pt&`$"GVws+/O^5|DcDRl1QtST*LpWl 5fAO[7={(`WAwQe卻1{6XڇS^!FnwV Z~/Z~8wHLx'w< Dv Ly'-ԃs>R.3 @1%/}{@DWc/r,D ®/?rf`C k>#k}ڌ=>lj%d*Q95C߹rK磣5k~2Pmq K(*XY>V:DV>^g`rqQA9=h݊r˨4;YU2+#&2 |)Vw;gbłƬ#-]@a,w.0!m~pf9d=0s> ;C7^= | SQEwe:kƚp' #ʟJІۺ쎹OwOw݆KfQAoqMpv$T ڛyPypcmlqjx揃gyYDWg??c9un ϣϨVU1̻U윰~u?%~CKFvh''M/H#rFQ Q:Me ?&/5Fc Pw/ޜendstream endobj 267 0 obj 2574 endobj 271 0 obj <> stream x]Ks$2|{߶1,Çb'lJŲpjF/Ɩ~3@UT7&*P@>|~'&O˷gnn3IsKN9vқr$&cٗ/Ĥu^z:6w;zA*B)a?_ho'%u0}^|cUO.Zkz-f0o q>([o+`"┸@yԓvV^BIEڥU6C?Kesyx>粧ZL8Բ~>B-W>jh`J{ UMQ@\ZhL*(xS687͗l Q JC,R`K528ʌ.jW9!9+ʳB5:y`-1@+gCһ8E Ur >?P^M k*BVio8 QER(:u'pAB"J*6\y؃18@ P>& teIZkAzX/b(LUwD''8$!-3$8`r *OQz |?H}@J}ܹ)zQH@$+'T}Lkaw;Irȥ0|j}F Ae>U#-J^S̠f}>G)gqSWBH@5eLr[6"Gf3݃M.N $)ƛgQBjWR@ik㮊 G2Uz(.;I ;J#[_.m,o+ W8!y͆'r8F ˆ)}!Z&l¼ tAn)"@\mʍ%3$+J0H0u  $+(\s+;xxE5UD-b. OH*Ya, KmTFk ",ud&D他!Gl<;竕s&)w/AEVH'Ymp.C ǐ\I)~/qii @cg([~ llNwiu~ f3I/F+>Դ)Z _édpSS8[Ĥ-B5ȸiszEtxxx1ޅ<(DVzxkEU^[.n}Xcop1MFCfCfi4aN!(S︠5˼<{S0Mu~>ETuAWJ sTVq_ ǚ%MH"` IP2ruE%;ɔ1ܺy}1O&+DL+m\{%`HetNʸk`[7JG$aB5<+~:x59qh(v]e ^)k-EY.%q)k97R #A$dRF)Xj6\o:A0r±W)EVG _S6LP28zt.@@ 'gtpa#_\S'NO1YAHhl r$ e[Hv޵O c4m*dmx@XHa#VcZ%AoCȬd\p=Sr1j`pߖ([dNaDwcA<.@`̝iiG Pe qSmia̬}-0N}} ȣ'! XK *̖>t$ёjPA8zjcD<nKDŶa7‚цS1 ֫LL- P񜑉<ۜ]>٫oQwa[槷PR=e(OSIKOuUѬ>2([GX1<`N&vA U"zP+j  OS SD;AqAI>m+&fl4jԉȝFrMB@tU~g䝽1X- bvZUMI"R"R Ȗ&w:˛ ٩HZ2 jYet"#='h._ DZ:;Dbe'r^E7EYAٕL k.lɢP[08C?Yz%AwygT;xe)MiX\cXrM#9Qh7eHCJmt᫸Co-_5Q3,I?KK砐K( B/X!|fVmb&Ã!Ҳ ,4q+>n6/a`ODnkCXC zSl@E@Gz Wt_,??]~~|$ֳ]^` 6Ոy}S`L&^B#8ӹ( tقr:&!4)@u!jتq_;/GO6}n#Ңa(ymV]qK W}0T gUR:cs;)6u!@;fgMVU`[X|3;=q/`ඒFYRnj:ʆ8pd*?Pd{lR-͆?_~~-SkHw8P *nnBQ{gu} 4klC^`O4a}Uڱ 0@Z?J%Ħ]HZǯ t2}9REWuvsܖJs nmm?IA]؊Vm Aۼsq#M qn̄li%v(uT1^ʖcE"͵0s)i#0iS𞺻cs9!CX˰t4BW]X"/L4 Z@a5(m^wAˆ5~sc[]D:=uۄG=X@w>$g4vA7:dƛݤF֕Z/??κ+w@A[=luo8]x*dؔ<ƀyagþ[<^: g.Et4o]ƴwCN=w@}ge6$1NF`"NOhʏzBb2W;)ޔAw!T-|\2M|HZ~(&u+daFX\L?j뎙G8Dwzƥrkѥ d eI-5vjtTJ0%~d}oRxLb+7FY,"Uqu VOD%۱C&ĵJKM1Ygn:tke?: a,x~^ɯnMs/2>9J Vz߫6Ǔ_33=y ~CG y_is["1Nv J`8+fN e5meriYe6=рG΂*F=ʇ\ m{_7M~ڏNOCwT7i&Gpitxx!gZ}&;]yUdW0]И\//eŅߑ[ 7pm \'kkaL,pjmiߌ]u&H[Dti]iέM=% [0)'p1g5-Zkvua>vt$Yf)|x " Y;!*+۞Vq@i7dF/U.'endstream endobj 272 0 obj 5844 endobj 276 0 obj <> stream x]Ys~WLq' %Unjrk9Bӧv{X8Xwy ybי.6ҺyУmD|+њփr`p8# c=pwl73Kh`p͑9륟fɗ n0bM?a8sE Y}d>hO\Pf`/R2y6&R+'bQ$Gb4%γ,eY!Vye܂##}&Y%(6_dX)d+GGj&WlQzNjxJ} 'i 6篕ǮQ/h( ^iX{$Kxte45\^۴\(~ZVpߕ D\\I_:Qisc+!x:TzCw}Іw=X cZJe-E׉҆L{i ԧ0a<6UBo1پL-)-L2 OVZ9"5jD<6#iUkyQd$R xvGPWdLG Q1,)V@iImC|ab#VGI__+G{ ]F=hmR 7σ8`-VK4"KF1i6( oFIDbub Q?_ppͺTyBH!ܨDJ$B'H Ov@fXG-zG0뭀3Iq+(k9sgnwϋ}-8@UJ??gO- Y9$ eTW)ԩ8a~h= fi t_P=>wHt+p~o s䥅ETФ /@=GJÛIP$064a"ޒ(o4Ӥ\NȤ8el=b0!/*@挈nKC$gӿ&+gN 8Mc)3Kidc`  y0"a &bc[S`'Wgƫ&H;%)Dlm!Y,3nN1uaˆs+7a"+!e!u<Ε ]ߝ UDg17q@%NjA`={H2[%A nGp| pF*u܂έQ\8Sp#g7K(7? MP4~HSSh>4-UioзL,iɢy ˿[a)yr{4|6y33c3cN5?5CX YOPZ)~S |I )Ni$8k| G$ΌSQLAVrhmy:\p=kLĝ:`pN_kia@d*,/PC^U,|6A) ƍ]E떎08bv>~+yw8(|!$#m&n/]Ny6Y+T㛴BcCg0wH'wOW|s8C$vTtll NaY픳ʀ5&a^o p u 8by{?+$J8Upآ>h 8k \IHhrUKb| Ҝ,Ẍ́O _ѯ6Hr_Ԇ%7~ՌJ(s"fNc`=70Op1(/][Yxa)Bde@tѝڽ";n걱qʣX~#7ONS2b-Ґ!*;>M<`غ,T&!*z* PysTN r8fU,،K6ʃz(̔( G W`4k}1 & /+t0;sϨ#+z͟![E`{-Tʛ9O'8:}'vr&ʾL_ bO,: X@ @eV*'@¥rsU}> FNb[A7*HPb(rj{l':?2]`-/A=5h5V>f 0\^I4-NwK3,.ͺRhVV ͧU 'k͋Ϸ7)uDGCQTF~!IO0Jq?MiH͵=v.UϚ)g Vyq0Ca8ʅE&Z$ bKs,. *>H:<7* _രs<6;Q[*jSXqRjn,-<WT O~UL7>\mLoTy]-kE헡+I+yZcYUgϮfV΃2!r0ĵkD+㶛\i3{D!y7BE+ʪ\x6V]GM>vPmH:\8F% Qu8 M;~JPnWmơlYDBP3]9Wx" 9.L ګrBv1BP)\N.kiŒ@/ѰqRcc&,AaE)F`gQ)'S8'j9sz_CW)/dYS_OzWWpUCoS4Mq|l87%Xo$cwuv,?Egs06T 9ֽr+ݻG]׸F̜Njc$_)܏~9|<Û+_OX' w~P)Kjp^oS9Y^4b*pS+}\m h*1;\ӻ駵lֆbz~JsR5)7Iظ | L˯r|{7o 5kbCfoZ5 w4"{c'Uk1 1T'y4+MwPn*,p+%8.u'`%vb %LعB0joUvWk9s:h=ڰxarRP'.G4zoa0N/56I̟-r7C'n}4@kOhk ?8B.JHqwόw^ z$tL{r֫dhѲb*iZ"fbH" :N {1b:]+d  oqTv 9!q/„\Q B 7XW;2K$W+-D~(~j{"XS W*8*:XP8I5tOTсܿbYA3SZ._3(%iG[@Q4L)O0r!&6N(]G]领d.wKps!'$Z ڻgMn%fxP ۧʂCn2poӿu 8mSeQ^6[@LC,ޫލn5 8!+_"XA,"P#Ĭe{#V(j)y[׼q/q ZP( UrsryCNI?nT˨jvMU#!8z8ҝ`p-2j Z'.`:0qU$vZWm.EW\,t<|v5waw` nn)eGby0| !|:Qp[p oC7˗^(noǑE]'<0"4q{ uiY)?R0վ3/bu\=yYxk(䣾l }TTl6샇IoҬ9P!qy( ~NH-M͠ې F62SZ[Q^+}R+m+ uC5꧟H_z Jendstream endobj 277 0 obj 5331 endobj 281 0 obj <> stream xYr\-oVq`g,D*Kb6HlL)s۸!)RBWP+JOՋzq\N_O *lpuYci")iuoq]!WYy4K\ W,WYP d!!'K S|X,Znl۬#鐐=~]H.e9)vrV*@ƮnlT>Z>AoMLLp#.#Ok ' }>ڸ98GƧƚvJlhWHC>XK*1L%s]Q؜;/]XMh;τ䝔uԙu:iۘ*]s\ctӥ \Ar!Ed`ca%ګLT}uU 7nxթX4WwC4K3bv;nСbMHPX&4~nNlwzЛ2&b{ Ø˦ZΏZfe&'&!tMLFls%`i[B-M]rhuugxf/dCrrI%]H2 9e-iAi7sO V?-*r$-^~^7a W ]rӱ8':w -xA5q^WkVeQ|sBb\1S[oF=Gsvw2[^>.$niQgR)rv-NPlL*\|%vzn)-吝"?&ˡ x/,a]/ 3dOu;"Oc,peit*s=ACqL^¢dn/+ qPBv*)y`3t _}\hv-{gx˽4vpDW K/%ObOU k_7bw%Y%_zh;ǕnZ [°Uu s%C13>ܧh&>\'PʊR.{JQz:ubx+Lhp5JmCs 6fw~^ϡTE q*Q!т/xd'WR}ucדEBN.ȓ'pIUџ+P >t;`JM.M&LW֔-<+xrQ Liû!bd2[NC JiFN>}2g_`)l=f꠸]SfڝIf&єB: +N0ZrqtRV,ڛ Cvˋ X ^V+N.K̇v;XRdL`X\%/Ei7U0.Qq#Je~iIe\.ɚ!r<'lL8>+syzdn[P|SӅqsen5 "!*I,l z 1b1E<_Dv_Ph+xm9o&<ܚJQT)(g|:9b 1c([B SP{U5eDHkYh6,o?YG_mendstream endobj 282 0 obj 2142 endobj 286 0 obj <> stream x][q3K߰o֓w1O|( [I&W*2S6óK8!p6c YoxNzwa !L!p$A#4-Kfm3_,-[Gx 3s:Ś9J >IyT6L.7eyW&w*y!V|@2 3u\)[.)+hIv.EA//P{ ?70NXm(PQ߈gw(q?_:;9Fce ;E]cA<^:!qWby*!=I(-*/C:2&-{E_Ѡ]5ߛK@*ikۯYDź|.3 *ȱ>F +9r܊?o ]ćI+!&(jo̥zhd$[ݔ"y-AhA 5Z+i)lWj_hd;4vH~JuK6Nh#Xe+H=@,*مBrܸl764EOӪ N6(N6jd$@O4MeBR6?6>TFQ6Rn)$iX;&T4D#tDΡefkTJI.CFá:mQ1ƹ.Ta,,;*k4:2)֦Ly4Ӱ@„)L0Gu<&xh^iH6bpц`e Q4ր|WG?Ut03G,iHg )]RTV=**sjn?R*ìبb36#^0JL1}(D_b Cuq+[0 .~o$ !V=bk7G!0SGa׫ǟjQ;Bo\ Q Ij?~ر5s8r*U|ݴglj|pC{ n'yV^ C+ojvQC(萀8f_42"M6N$n9c4d`Y1 GL4w1Ƃ-(o-0gh^ R*KF1""C4* rڕ l >N;AJU [CӶt=rcY&NY֤Q'wKXGa TƉ] YUit2VTC 4ߜ(&b "D5mujx#^[kzI[ZұݏbQfcP% !JiƸҌF V PR{Qk j\.K.+|":D&I2ÛkW9*F4{W(= NX?5Zu (7Z}E-IXcgqQ>5ʎ#ǿd48a'Ф7g:)PV&n&Hu)ȅ߻'JmE.Ě ZtfrybvV-Q݁Ɔ iP ׇfue  c F=hJ ?DLVߎdȄl\,iO3*'MmS9'Y$~$TX+_vW4JJ V4l?k>hNv(YXWҨ|)9=B<4LO0&m1;(jN'o)7Pљ~Pi=",aIMs"V.{& ٝQ`1~T쮣g bhOQ xR>)CTnjl8AԹzaa I'ʕҼ* :ixS 6Bz=$y&gyyN vD=ʙ nuP ͊ߊFI__^9 [R܂L pd xv-" lb3h kA=mCicÌ5 vhvS,m<л](A6j Uh:D5xK\OE^>+ⅮcmF͐v_kW&˞&q sqȮsmG,K" H!۟Oos[6{6˙Fqy7g o>|d$}:vy$<Xi8:6p1ZGMm!Dj'nא Ph563QbX%'*Xru v-<[s4:EP//: %ڭϖCXk!OE҉mbHSߍ=t* ƏB1Te]NIsQ&eWZ]UY3rř:Y>n; nmԬR+tgMMFna.OV̧rnm͛ j]%j\I|wahM 2@6}[vLf<a+)Se65dn0 g $p֧Y+D*< s,ON\X 5 }6˩%^T_)P8)q7 BS?ZY M5UB[ P%p#X(M"\FQx5[wԠ;,ỷ=Furu#m8Z66*Ukl`c`PtKZFU5_<~K/;r~QgsKzZCum sbkI5ʖR)8% @bP@W7vF$j?]Qy.m̙q7jUo;BZX'Ži;p>򝾦(q֝􄩯~V:9Fn2R[OeHˋ1Nb $@@lmwn[H6eGh[<"i-VĞ2M^;aK.rܐ_i`vdOLS qoTe낙6M5t eSҰOx-nZ?Ȑ6tJn]|BcGIeLT!P!c̢MnwZp^K(VHDd Omj҃ ..֭ )ԜPX~E?N,?{Y HY,M]sy{tjݔ׽Rdf Q ac"%4+(u`5 u+Csa%9'<+rZC;! //"aWT~5L@T49RmԎtq;DBmC.]k \ɒ퀅OMTRyMˠN$Ƅɛ R27{ Ǹ#j 䫌kT!3|;PpOgz|N+G<م7h{*6KgF덍 8l=UІ!_mP;KaNh欶eq#Uڝ3FjZ>wE^vφA1#~<ǝ_ zaC46N'$AF8t~kXpH:F=C:uv#<.a|6Ϡ:M"Yy,8vce m9c{dãf0☦,l O!xqS :tQgU[)=™\"w{̍Ms׽5y^;X_V*{l U'#.~ blp $!h=W߬?\~PrM`vBx36fy3 &,W]ͷѥ}7ݩ]Fz-B@| {zOܟ%> stream x]Iq3Z]Kx[^(Sq^YYP-HѲ]U ho&Cx!&y!O;>xG^@8ExNRB#9Ii/ד;:<ZGxqy6uxzy:sbi6Xk땯̞_ }8Rc,AGHڛ_jo'%Л4Chℇg+"tW; `/)K 4&eAǷAY;׫KHc4-7F߇_ŽPht@ K$at⯖hԚ7by??1jf1>KG9 -],S&z m( -[*Q߾e<|ˈddS'Nwښ/e xz H=瞵oa&ܙT1x[֢WdTmB՚9_ Ge8J9EsJ7RD}xH%/3s{iZ=$.Yd%9jΜ=4IYj> 5X)g#oZeM 5x1Z"s8ig{*4961q Iȩ,mpUD-g. _<80tFbbeB'=K-\=5 ̝(>6 tgwQϿf"r<2h .yS)ּCFʟfGr 4k9 v0N&v"nP]k+n]ăȬ5(TIECMTT44Dꑿ])z6?br,sEi3O$Fhae)qinL'Zh*i7]-#>є-|!53`ENʦHeҝNTSLXFm &LkgEۢ(X#ōƀV"zM+/*xLLaLL!y2&SaK"D\.%OAf:4sLvfr?S\@˾%_+H4jwNvb`'-k6A> 7\H"u]ye 63(vnX_c- !-V:ptEJDyf@?\#JLR>=hnQv$trB+|rҵZHAB}m{ ]=_;k M,ǁ᥂ :v{I}.FV#/ j^NH[2o+- 421Z?kkWHncƷJ!'z6;VY%}ͽ {sa&6VSip~}gQv'صzTȕshEjx ^X5''oS喐+WL-=Scp Pȶ<"e.#t2Z{3jy<>>ޛu1-#9M0sq[qB4c5(P FӇ/ƮCK"tBWS=k I]L2Z}R ?Tx1D2I!D$kLIg EsZpR4o K!BʴOӦ{l).i%>^V AB= BZd 1JE/|8YMSSuw k5;d 9oe5hFHkR;UTGH1c2YAOZv7fV7ymŮ׀]c D-:=LLxA+3 Fu`M^p+}ز2<D=,?[aҧc\ȿc!Inт; ?0Mfe鄭HǛ!?,ZFအ't 3@T}ou9"\$&HA-\/G<2i:,'G[IN^he[YĈQ _G0rّ#z)|~`'J{`4/hC*Ͳп7<:QWs?iF}S~pk J3+W Vi@vRFқe9 ,3Ql@:5AfcႣh Kbd?[6`*1"|哎qO\t,KVoY <0XGo`*|sX7xo<-4 ɁiXqk03!DJrR۞CPL= = S T,Z&(@n Uͤe~Q #ȇzM 9ZFLt1ڬ q_{h]ն=E 1&̰sx*k\ƑUQ vȓL:ª:U8G#&SP6%@8>/qek ~6 &r&7T1du!J*Q+V[As$wI[0QF N Saf.@ڒ 3>naf >oU¬>P>`iemGI,PP HEBøj:s<|N8:02Tpt%i^Cs$W'}{gDK 450Ah#X}&Rq3eQ =z9 G/Z#,}3E z9~rh@mŃT&E%'+s/V&X^׉0x?<|;w?]1OqO JX)>>cn`W~b@!|OG9B+*W+;+u=% \3jeā)F|kձ>]4ȌzGASXQ:Qʤ v>3Fg-(wUaa<<.8 yZ`T2mV^*9΃)Z޸Rzq3u0x!/e9:yE&ۦ}$wf(qm%NՀ 'b06$4bV<  Q%թ.l2|jw Pb ,eCxH<4^B#|N襄RdRRyߔSͦ>4 @#lViFہN͜! wfiLaIc_v)CR@/qr>cSͱZ3 7%T{4,x'Z!QӘS闳 K/Qi蠌f),-EG4`vWkOib3\C7J h3[{0_fe J+b8]ܻ6N[<_'D;d> I+jxvcѶ ԼIF[/%;z+nnvR,˥a2֎l*12x\z`)Kp omDA՗RJaSF=r=>rKe嚗m6 f [{:?)`lbwGEp)X+wealXLNY7ݨ g'tۚƤk^ֆK`,AR? p7U?2]8m5wEu('d-4k!4VڏXUl,n"UoT\!"ӋQhǧ >Xۚ$Xɧ0lÚ?-!ʁ^ks &CD=hPRu(]GFEw+ܖP\]*_5ڻ7r( oocy{11_uIASbMc,+}b&ݜmM=+%8jԊׄg?wx@YG`c𬂑Pr\MWgʸ={Rę1hiC޷"rrVMFk|MP>1SәJ6E!UkoG~Yk2/G dž(;2.ÊꛓA#VY=/P{^rkNxVnW}>u(mǁET=>fh6Q'.:m>u\!ۉe\v?2,?rC]s]5~uYʖ~^$0s;,"moe Y+.BG9Wy7gv媆_u'A^fwenc/'L|/}<~ic~xwiq-_Mt &BGQ"8~=›mFuM-KgWp!:)ZwXRxMjjc:8~q vjf|Vh8H Pz҃xR~D!96Y<wR:u'}:::o|h[(n~?Sk#X &2!^5+s@-.ou߮8$^Év.>ALhŚ}[\I0JYm/Y.u)m2|If٢ª.%\p3>p ].첍F+Zߊ0AGPE - [ !G?_X5p|㠧*utʼS8pɗDvKǦgOp ӕҾcD]}r+(;!mp]E{'Q X.8a yV/> stream x\IsR *r}qr]qE.yDه8YdǢPK?n3ob\*8{4_7O[=?{}?WדէW@ wVW|Lǭ^+\]ݜk%ZK;_?=gi#R($_?Gɹ|>[s:/Zޜ8Hkf=R+x/Pߞ{Yc1r猗7al\>4%y-g4/012 _8#:̻_c󿯾֎.PZ]rl(~Rh^bꬔ{c7'VBHzl@($uLX BvJJ3` ]*;fC X*K:0[[aY[Nx"7ȠM05Z;$t$6"v d䷑S |drܺqAi=Jȃiz qQ5=2,@8u4GX|R%0n,d*):s,%H:&O?@IfS$i7<'86exED}Og{Vk;-(ux&wTc*LJo{ O[,2a 칌2@{#"BC4uMA`cKG02-lτ:2kwJߗcwpHP觜O44?M,Mq)ZM u E*ȶRGȱҒ_ %Ag*$R׀:"آCN:r3vt[M^%.$հj 㺘S~Kx1> .]8-:لᛸN[:7yJ e]nc .J&*[v3z`/%(d )" ;L/7k&oM& Zn=Hxi`7Dc1KXVW`dZVW`DgN?Z%j/7/ÀJ2aF@Ū&LtA-pAs !"-U^v LJ`+ ֠m׬9a"ͷDxf)*HwX|6[i!nHpMQ0rtJ+-(Em%ӎȉקTd~'w1]GjRc5)7 ;& [Yq*Q* ԋRn!*IU6@V;7hqg*L5vU! `.2QGH!H 롁,q6J:Np9do?=GM+!n;&&x+v:i&k kl/ڄxoSzAqɴl"lb#rF؏F ~SuW ]IT ƀt˰l@]H. Ja`" n;>N8s OLȊS:9xIIAd)^hΰmYO &~PwRHp]r P *{7։"¯fD1`NpCz Eb9C%H3L >Fb[{B, N. 1\ơz ]\7?@X6!3ڃAq+EZ=Ae`4Նm(Jl~Xl$H4=)_!ǡ_F梯A.eI%(F(pQ0ck)ż27QOG Z[XVeF͆pV4cs?Mꧩg,*͚ `IӴaA\.n%G5:Wհtq+q$|r!ivWavPnOSzoKF0b Lˬv6av{V0MB_HXӫGA$*7hNk;-caa|E #x85-Do㤄.ΩaH?XYQZbsuvAQlbz4I JVY+1Y 0criDIyHӎv ! _VPU;ϛ TG=|ev0QMrDyx苔CZhUI(S7wb] 6̳큅zg"Z7rQK\Rxs,ҧ\xw$$9_>J5Kp!xriIscsB]Bg"̸3@J~9M 7vu$?brnx&ܱÊ_,y\\)Q{!i^'[$53d#&LCz |(2!ox^WںؿZ:W}ng`yGo}lW띷Ka.vmbg:l8quiRlOM^2~JeB lrbe!ц cGkhgT Wz;76|{KQ˕$BVJ]1<"߯ ?Sendstream endobj 297 0 obj 3905 endobj 301 0 obj <> stream xVMo1 ϯ1#uBbSB(S.jiݥ-TW( 5 ήldfĂّbT ս ( CH_gD%'#E0g/E[zj{Q,~us/CMŬQ^c h0F)Sbc|D|>m0?i 2endstream endobj 302 0 obj 699 endobj 306 0 obj <> stream x]KqgY[ۮ#<RH4)O @,)${YՏꪞpfuUVV+31A>_o=7O~|"y{ F9n_>oʛ퍍a0ܿz;1h0Kn ?^*}~KCLC|}3%cU7}rON;[)~-2y!#-֔Ok&X^`#߳igU/Zyխci<ҡXqܚv\]*cJD,C8.FM7ps!Hf)BI=CSCTߥÒZ0V 3x;e38p/mٚ٘u ;<2 $ao@P078[8MhO L2.J{Yn:˒DpMo@N B޿^i6ؤyB!?0lRr[87hIxP?Tۊkv>,G, >4O=&!nDIad&jjV= A3;];R a:K_K6H hUMZ-X-Hq޶8P>@g`@3pV+̧Es6ȅo3Tt#-$~̔eHd 7"[<4p6>fZ35\ta?޲&ttC\<'2$Î) mKx|dFZ9_ 9~Y`E@\]ȐAA{.8%]LZÚnL:?PbneO7Ļ|`Gz1ldK)EוbbKY2LkG"lYƙM"s?ELҧ8l# 9s곕%k(u1.f᏷j 1f`o( 6fR>ȘKlD\a:R"7HFۊ."_,Fu= ֔[d^>!tm5؉$nf^M4{y :a ;?Z.QW|QSH{[|۲ʽ̫sY])>"oqi0c<6K`|AOlgsf{'EP 9:B'kE=Hs* +W9 C,eD[oh9_N+8ɱ\AnɧCxx߄;FP.zFJmb}1ђv=0KP2Hhyt$3gqDB>n0pFPVĴ1N7w 9fFH1J0:#Tör!{? f LUhZq+1y,o<)mJ@48= ~dh-"[ϲOBџAPR!6HW2k*Z^2^*¿^ j:V%>=!WFZmH51/e9;ob)'[|DzXnEye16]+v8/=Goӳh9;UEAU00OwAĐYEoJO%.TBʽ0]U7dBZRqIx(QQ͖6EzyJJ-EX[&p6+"(q_\MX*t3"ȡT3:sujv! چ(VR]@ە>OGGs ^r|$B\ў>Ԫם@ZfѥqoNC1յȂT(E rqF~c҂{P-!)4 ~Рݗě֕gЖsXժ/r=@3%:9ּ_UxzRZ3wj>n~.`!}/J@JfʧC2x?QȧPdJHIGERAŕE:$0W6=il)(Xiv^eҍлnis>~= ڤ<{7Ɲ ߛE=Ԟ%cI*n?SGTZ?Zfy՝&bNR 3#X d( wfƎѷէ2'HJ^>%aAkXa6-JД3N `  eǾKڢjj3n`!/\VT:23^yYsZFұI./W@ٻoE&.HR^ da6.#:7c7r[*R@̑> ;tl1hZ$!]q+ Iڛ4+_e2 5I{+Q斶L5] ͣÁNоhwLjִ_EAx1S!l$Rj+n&\$)ېxx*M#;2‰NC6땥 1j+SS[o:5 35Lr !FU%NI˼s~qNgCDh:PN\܍4tE)?/*߀gGl:0LnR?RVzTd}a1gjeƵ]EDCqh[K[M'&*r o^ns0Hg) E5K@`J)ꔺYEVKDh $ 88:ʯ/8XVTAp;ܑ@(E$(›+hEqʘIzq4 _PZXwe%#R hW <6ҁ*;Ni} 1Yz-t3HX-9&4n(FjB3ܓ8+==<*[?E}WUIxF>fJէނe#f5:=M }‚ǃ ܞD:KՆθ5^1DܝYdOcrL^?IcY螈1l"ښ?|}ܟ,|c*3 n2BR$M-EBendstream endobj 307 0 obj 6032 endobj 311 0 obj <> stream x=ْGD̛ :x;]060 y^<Ȗ-%f~~9Yɵ1Jy+3O}˯$G?}쯞~$?˫r/Upy '_>7bRFx_N8ᅻFL"Dc޿Q~27֊([#a+ڛxEt4B +vyXg?imMO1zi=ZGk}M oߤ8{t77rx1NޖoW }EyZ!{}hW|3>4p}ZSp'Wvk?WD ۖʆJ uWӧK^_F(vu7utگ yu%, " mC_.Il\PalLv ִrG*D0-܌P߭xl=h8Z[/Vxu+%`J a/GZ\KZez aG1Ɋqg572©bR`Ajplƅw_FR~%$8=&@~823;p9{76#|cFZW샜>cd #'Ԁ\Tq`Ipa*."bjށV-P1=OO{۴Z-|$ڕȜvP.r:>HLNϧ%hԙB'mix.AO6> <_):iC%J8!ƛW8@ʸC➄ nrF: %&m&"=6 GAMBfE#<_QĞPaa%.OJ/F'bK剜q]na pqZ=zc.P*(%G}+z>o".QW]x!8NmqʧLsL_DA 2AX] Q- -ߍ?48 əU%l5 g.>;)_owfhT\t .g+ A7yp݃]GC󭃓/Wfs:f@EXsFgl2a.4v,Mbʙ? k# 6p]iLlІ;@aMH%o"{BJMjĚׇ }hx4K2 6?umdƀMQ&9ȃG|y٘:`OhdlӤa7qCpF6);g(vt/kF[2TMJ$e`\#:EDB&2NQgՐ"h}j5w?Ն\+8M{+L\[|3t Lʢu߿֔,ʸ~Z dcHjw?=؂*IRuÜit0]n%)fLP6gGtxX<.Ekh{hyO*7i"<\=!'1KL0 _JVJhXFDX3?| 4ε[0,@?mFO+̓F rDX]dqRut^6S;G1=՝nNtfUʤ! >I¤a6NbprC5H8{Ya~T}%\sd&u Bq Ι5%c@8$E4J;W_AX }0   ɷ#oU,(@R%`o?:uV_߶ x}Sx9ZqrR#,A/”p9EYTk;I\4IP]j*R{HzBʁv^s88Yf6|l|.iY |cAtU7Gr^V|N5eߤ`K3BnH~r7Iy _( V -p\!qȿcZW:tt$FĞ^:/a} sz_F" n'V `x#j G| c3N:΋jT} S68=b4ΪyNSB3= %r0D(*SF8<[`ۓ zy1P s+~GP&D?-?aJv #%M! J4`fےW4O#N va X dv]I pV +qڟu(M$0pz"\_rS#z6QДFޑ9uWiJޙΗ@f=^f;#Csj7M@ZDّ̜3O)F-g^fX`F\';sd _v#OÜVƁ^^&>3d" @ܳl Y[By,נFyi*Do;!urj{$QK.B*7txGB256[K5A 0^{u0u 4/ vue9wtXZTS')bݟ/PE;0u 'I ]G(b`-v$kd uh`wұJ, v^R,Y[j4iUBLbʕ[H ?oq~:?SpFPhMVj>1 d U*Nd+ʑeU1*9Aʀ+I[PR|<V;r@p* 9Wy89V{D⹫$4C2sY1g<)\ ]zPҼch''*8iqR9w;PL*F8i"fKc '3fiͿW)Ɇé*Kkyf9afъټ.<p /S@%Dr˴."?znY܊'k婊1BLT[N U>@;cuWcLU& Y;*q]`()[Pp_$C=(j1n Xғ?/WRcO.a3:d.̸?l?Xʎ?5IaY sb\@Y(yuJɽ6&qNII1FJIRҠ0p1̀vPPlY*,C|o ;ph^fqge'訤r4"`B3G=N;Ӕ٠11J;4f0@1'8Ud|M>¨Plvorec^=VļiooK~d3y?>paQܬ^ۇnAϘLռVu_Fiã~`T3U"2Cp^3}amW:K_CfKLRٶ`0)_װ/{[ +򇛓hbP+}*Vfά6(}P $\Dr H&p6F2ä\eai#Pf9>gG軤C)gUXe¹U=(O:xnYH(A:|47$CiVSVYȻ*%*-NL[ь F1Թ#uN)x8N,e,[M$7^TL6WgVɾ]/*Z^J8|:^GTyg-O`.gUٻN*A(Y\rR4M G.>N+lH䢸HmLa]T*DžX?sfK"jrb\\ yt9f6|ֹ^/ Ь# =v}l)FN7MZ2&i}bxhx`&Xv|Z}:/:9w/ &s{z3&k G,G >( ni7|&bȑĠ07e(4SԱ,zPL ]gSLmvּ\ 68굪Sy%SgWhuW,qSFy9.z@1zMSУfuM ^7D;Hb0 ,5X9\:_9XQy7hy[J2LZBXD}TyDK7)5+'"*Q;q`v2qCG eԨ>F ) $#gG*o|V!~iRPOlj|eUI/I4O;t'5cmZv& L/0{Yy"[_ Y:'STwiN29o^t8^LaZiR.٧LDC2L =bjF:-arXxBx=hz[_ΉxɌjeö +XERN;4=Xqf1Kdg:LSeՊ@N:Ǿ"82{$g N Io{Ub%< ZIdHgU[#P8\BKF&T ~k ]TM䷏?Yb5!64&TM nZRDۨ z C5.`WlO߈%i53Zo0f?9lRtP@i&XF6пї!nucP@1],߮E6Q4 )&>Y1Q{1ǞK6@Nx;"҄hr˰e9Hu3:U!,vAH^(w^2&-nL?H*mY̹)!Tz{C&SpUlXHC 1nЀi_{nt0I6svFy-'1XRI,sX~?8 0 U'U*rrRT0i{$F HD#&P(U2alJ]%CVP 2}%>'c'" ` kQ1h`\v߰P+8R[gFg9`;U<\gNqSJyRx (KM2S@ [DXqO´BygC ;٭oFe׃ nǎx=RАG GG_,>3N!./ù Kqpqmf^;rǭCWS`Ղ1Rql,+Vg5hzy=l+R- 32ȸrU~Ubo읆:5~ؔ$pcU*_+u"Bɡ#@*"<6@R86M(`X JHwbew^a<"ǒXw׻*A[>I"N;Ӏ\vx%ֻT]WCwfAt{(w/ۼ鲎zeuk彽.e":@}uk"]w],LicI½()rs[2=%~e~-$&3sZHqEBuWb$1l@~}uu ͆ʫ.4~̙;3_jM[%ڜ5 SBKy7}4¥!,6zπr\`-0t*KR贅{V[z*5Bme//@!|ȃ,V61m=qpuyѱ&^,"F>; WzBev3 y}U!EO=pSOQX,9A 8(]Ed(bfP3X!-A1\p1;3:d⇽.W+QHߘK-"a,=.[VǷNJFx;{=o!\Cn,Pxs N-4us 0r$?*\'zю#[D"iFY:pՑ2:9PD!a&}g?z{CMB?9^Dr]Z$n\.j+ϓ}w,.`XHM =rmh3$;ny^srfd`kQ".6gZBv'[`+|hWORb^c;§apL*9CF2sTLDB@z}Is}zy1lwe-p7n_R#uDG!kE(X퇾()J4(QXh,#B.Ɩ>fEY4 A` T T/u"t˜Q|(DD:@`pUQH VՇ&va9qt(Mҭ4v~Wu"&l2;܄H @L Jo1ۏ!z}8CA+"K\p֧ Bw;zqZ>~MX߼~tf.FՎdbF9JIc}{c w|_:^`n-<Ϙq 밫e IנL[ sDkpQ7q$v+b_<+a!6]}#MS(JD.utّJV~~gUR4bؠ*lc9_}džEʭ|PE9 ]mg@k訹|>^8vڿi0 .:Q'a IM&:@i͑]~䁔2I_&өIբ*K?/]jj'0Z‡2BrH\q~c|ÝV2 ەvm)3XhzX.Hl\a{ +CY}Ky-G&O KԣOR[y\,_nNo k꫈E1>V0^BpBz UVnf o=M4e"Q}V6/F *WX(_;]ohLyUru8W.a 3zL*!Nh^Et/Eq)Z_a״})|KU Nw#nau8x:kR< m;OQ4 }[46Vuv-6JKgsJ?aݔs 09^O:|b*M258L_₎ D^5ˎ8_fH orw^G#8n4 _5]Lٌ;_6 rG=ƆeRH!8+$!31aN + =|}ˢNj 춵!㌅Yxc\ 6YS~R/:| 1w>a2ޓ|O_Ļm9<fs!#6UsoP`BČs74T%>MwAQG'7rwD,Mn9|b\Uw$H[(;xW*as{W(ju4*AE{EPgu2wSux(Aϩ'%eQ>xjönq3ǺqX&{/ōY,')e1,}ٟ3 _m994*OgA#{2äD6HS @ݬNx ݌S1Y4ŏg{2i3|5^i̻pϴ>#|K8|s̀(*\hL̈́.޻)QnLtצ y$QӑKz;^d5ranюijҜj&Fg0X`le:D8'R_endstream endobj 312 0 obj 9189 endobj 316 0 obj <> stream x]Y$7rs[o(tdÆ]c%5C\0=;w 2ɬꮚ5Х&8? w> {}ㅌ<(؅!XeEzSb#9Hiv o.J Ja٥4aJšj.7n}aewKB[?)iY$s88Tz"z q %hcOe7?}wi81Kb qA 39j;).CK]l"R$l |[Y\-*JiΩB;ؿH .th;wvfwoo?8o"(YrĴuf=vZ~I ^Xm"D>Op^!E4Q0 vg+~ V*l50"h=b 6vԝğ{7l矟-hWCzwEJcZpxbupቀ3o%>3A^ǽLx]@yeaD9 Ead"i * GΉx\}Z ς("&Ѹ^ I x,7 bx. cJ3+p.s8pN,@Q`d *?7GHo"y |>o ͓Ap߀?Dtڛ1 ;FA {Jc"'Y"7yAq7!+'RoyN!*Kon'3uH>5^m|~" @ОRPy4بhX:i aڃ_x;H__Y<5h̺tIP,)#*M]+2R()@S&OQDP28NgGQU4VGFAID{CyC؁% }N(UqMȑI3rF_VSk Q4om4gBxS/v WPd# F7l:B$f\hY"ȲV=jiC֤aW*{SSeѦv 7CnA?H jYHS*PEUSSSHsIZ󘸑zęS?Аh;t]P$Zhxes,c;ف;^&7%XU(0tĎi"[<;3b _LԶT9PY29d>)ZIgD9J5_hu}ogufe^bz9WMh?J䥵~DqBs8$ WV&U6eQ0{>c AY;WRN|H\[ȿ;#Z"ZPrz͈~уk)ΓKia`g'Ż=r8IxZ8OBuNV*  lPL!rMy?SkDɝ_PX|NgW}4S5g#e, m?xlKʅhQ~A"f 5.SiQEWu|۝3]VWţE6VT sq 1&GΪc7igRZ)yr L1JK6nvT/érҙ 3Q1A/$o?~*HesI;`HD"X'o)h<2>\~p2)s'Pu0BBO dѮUriUjZPC/^?ŵ L50̧uCI !d]P٨imR#X&=RZb/l PStoUap'A֬J<)ؘXưų_MQ~hjp71?M )umƉ hQ:Lc2"0H|gh^͈{;ʁBS RiTo-`ɋ/ 2|fbR%ga<SY=2T?FpA NS ԡudIz&A5/-7?3Y\HAr+C 35Nz\B#qEA%' @fKخJbQ g^|?[]e6uBu N; M ހy$BV9iSrlLB2OKEJR6 "&>fDoUؓe&PkICDK/8Am`]N=5y'ժ18Ȏ)cm&qyޥɠqP3obȃM@5\i1筝G,*IӒCX_ōCl?1uřؕlT y8I5ARyTx+kj26VU q"8m ,[:}|Bu@ 9m3%x%qG4Y/n{'F=9K_{&SښgS5(QGDi}C2!Pۋ7$vbt͆(EMeVpWL<$C%im%0詬ji4ZLX'>u0iߓg>7Xsͭ5.L(7ht&Y^Gz*=sJO(8a\U[zo/sX hEV XSg<ݶ)2߼TGOd}NרK\#B"ixѢ\VnW~5OUțRו~Hvʆ̖9( Y}ʜ+ez\ ][Pqb~" QfHG'.*l }& n BKFr:n&a !k֔;_Vov|SZ ާoFlcfWRu[.좭26i,A09Y*+$[Bؘw:JӲ8-ݐ+f h& &DF~ȍepV!hEG_8.AUSl)Yb9r m2Wl*[}Ye}RL r/@kS&@w25]W#Qpΰ{ݓ@C|R-FIz!l hu@#4ҝl(PKXfF ~Ke#Q!杏yGrjq@==ӛc -)&2QҔ)FD*OZ,f: ]@2/⍲fJac\xW|CORt@4e3Ctv_gVJܫn1*ӟgQfszWIJ3/ekS_)4 BeD=Zh9\~d=u|0df-,>lX-`S4JyELԬbrX^~J iH4فt"PD9xU.mROLK !3¢Z {1ȟt!.Ra!Uc]S# F=_aA\1A|_x= giq-☶j%`gY-ʆ^WQ~w+BEe}k rfѣ8^HNIe\)[ݨ}x}H~ rU6~iN4>׼w)ٸ Z)SC+#&Ozj_Qdh ?dF!\2+)vh=P,mtk 6IKDD9Tg8T=mV!c铔+*23΋tڪ51LƵ&@ȡf/qP4 Qe j$=Ldf} ._(RwwgGtuuz!ONʧx?V,q᫴ VGi18Is,#->-Aᳮ#* 2$?tfm*_(= B{Yo LQ;kQT뎛EB%ڪ+&5L+Uh㶆c 7ZeZV8D031>/iZ)Aw:0@rY[ OCM 3t\g6`yD/ q>v$%}MwL;DtTB"P~p%BKnˆRe2KMٲ SQ:Pxew'JǭN|~UD詠lY7¹nhЎX: ¦(3]PD4=MAIڏ :Dvb߼Trfk.H@}H+o:U7 t<3]FaQ/kڢ-4+'QݝsoFV7Dծ>[>:(i郊Hq`M|<oM{YS[#OOc uX2j6bk~W,mW3i *S ]~ *%!tƝ10]1Pmi[ʴxP@F(;$!2-ls8?z~/`mgkPcZ֫Eƺt! a>]\xTGU(`X ǗÍpPŔV ?9dʐ4jnGq0%fYJaIu_6DO% >nȀtr !;} ,'p[@9,4:BI"Sr 婽r%ΞUĒmQEbhF,j=/Kd7'*\Qe6wLΟ!Z /S{#JmzSF.40@063-~F6TؐCus"'_"뱳 W!BtV &d P͖>TXP‹)E6e0A4?( `FF" !D~'w~r)E}G~ Zb+S8weiV25 L+-5yE%y>E)oCPoQ7E Ag(/^"S1W3!Pb!~Va e3BU~yLQendstream endobj 317 0 obj 7000 endobj 321 0 obj <> stream x\IwD~5LK c&&oI T/hl2χ(֮J؄yzy屙<,$}^NO@ DH''olb5aFM)&'?n:p)Kf58^M ^96WֿǕSwq.Vh?Jp'O<|\K-g2=9䋟a'a&J*`(\o< ^|cek?d++8΄Æ$iI4S FO-8L۴ E hA$0%\{mj/KK nt:"U%lMRp<0d!g}'KSqL8 S=ዊ/E5~ZQ4mv_Mg",^5i?W_qXzLj Qt 'eF a?;eRs(kZ9S(Э9g\Mqi)Q煑ʦ45TJڼA ZPҘȑcR9~G 3(D9 5+ETI@ҌpVE]WRk?]q';09UPi7wzub".6/P50y"9.,,>[/yE(ha&#&K}}z d-=x{?^"hn {d˃yr"HK]i>Xf,^UO̚6g80|-,$@`B{ mkv52 MU?uy?p|YK[;=E$V?U~x8Fd_2E$>$}H%u_nDӶfː ]P^go 9!Rp7F"*KW]Wx? 3tU"+Oܽ_HkW70$#m o20֦Mqk۸kנE%ٕlMƅqb21U)?̨b r 2'M3d~ޤ [˳QV~oĢ^ &W9z s>^c.{Yϐvn C6!. a u~inp(5UZ<P|]35a!岳@\um!{:6_ ~#]ؒ 4|oEFcoܕ-!>\ZA,e]'uާĠh6QyL q 緷Z2t{)+dl0\4BEWZ3]c*i5gI`<< `Yn]FCu`EAL/|SdQ|i4f+m*\Lv@eYK♱w ݫ(r2ؤ"j Vk=\|\eA֊}0 0>w d!xGL$0+~n8d.:4taN:UA@%mNe㕟Xwf%9 9Y jDCyCY,pDOP.D_p]ίuBȊYvuBoV.`!Cw8WWHg˻%Ol.'lwSA)WL^lbhKIy[djIҶ]C YE}vβVY46IxH]2ߝ)u(\Q|{]M.SOG}Oh 5~I9ȧv hA\z܉Z999߶-wқ$E b1m-rwLs୧!0cpej$ ߍ=MNg\mlpgRd6yuoni>d|\+vG}owg3|]/i_+h1Z7ѪV0X? IlcE3>@V7 퓶{n<𥴭}f-Ng~N-& z|58h4ԛ{,tz?=/זA~* _[iՕPӺ2󽉺#u%a)E~9Hgܞ$͵}gQAbŕxbOhIƭ*T 8YZ݃{O'zےcv|ś?ʽrw~c-g;1/E\yǵ8e?Hh8lSUZEn0e:q}YE:ZPjݝW0@ j*mPTM;z;,Ni>مĿ>N*]2D׽_b~&ĵy/T73fapPjCf>ߞ)+yendstream endobj 322 0 obj 2555 endobj 326 0 obj <> stream x\Ks #Sa~Tr{-ۻdse[DKkUm~}`7[ӣii-Ԣ$+ĊO/∯N>U|_zu()VBƝ_Ypju|~zcaVkEym\V͜Rq| ]ˎqs=?(u֟m󿏿HEx7}|1xlupWЬr:ToY/^q8_5!T:_R'IW7 eMa-Z+|-=\adp;nq@PF9LAr#}!?Gm˱pH ) .}+yNo ک)rHdH!NS5/X&m : :,lbwZq/1Wг`d 45iDB9-x %Vle^:؀&B!6iQQ#zrG *q@z` P%fR+lQ(z<#y/(&vC (y;_cv[ Vf빀mbp¨@IAIp.a|. 3 9 )?:pҊ6TX+D[]G𚶚>2#u._;GBP{|.y^L(+}vm[z!s 8AP!QAݨ,8Zc[3R2 *Olgݒ4L0elnO#>>7Z*\vy/S;ivl)Y!o1NNJMEU{%= Hމ$DJ%,~2T hQLdD4סQ'MG4u;JvmԈ]ffBfG T)҂0w=Vy`wț-}J,yk٣Pp "RȖ㻦5yϻ'E߯ *>|o±o5@5-KLHWbǷ aN-xb$k@cX rpiZA %gv+Q`8U` ޘ%yRA*\Z?t/J8R|)Hϊj= Dr1TBsdw5wjq]tzɻ_>O~MI6pP_=}8N*H\{QH"̐*X0\ee ChNgC}s ~*C/Ehqj1*u@^nFw7h@4XFy`Mk\ħӰ "h;yC0hC@O|G[2 @շ2d΍ *~;ሹzhY|uKR͸#$3nyM|AiK.F m&-窈#"i}$!20I-v 1}o?NDeӠ@/}3CX=#H^LM{&F.f}a'{Y`optRJ±ΐ9A>u2Թ%&e-s֐zrq&ٞ}Rl-#[Y3) eEX\NPgᠻm{N3MiӨPB(Hw $KWT# ,au^I&YҝO8I]Bd@\2u,7 yK;]Lͅx9^9|N}ceOl>['}]GөHw>R3\ӣ ycP^Tзtbmd01(A) JT<(XS5S~,4BpOB3nYh |.;w~qWG´xSfkeV8911t@C{ck Sv4Ϲ75G@+o"&a{_L0; : `۷MȮҌ}[8X )Tn'@֬=wg.َwZN-奀vq-t~-}H&,@XI-Sh W'qiQ }"h7Ojܣa6-F4fkX* ӫ4RޛWXLVX`rmˆ0{9WJ?xġ6J %)lhZAz 'D8ZcXe1bSM6Px˺n#IN bw37~o\E+1%LgNoQ90.]/-c3 Q[v:UFk$ZU îqRpXZƓ!ƞnm (*4SAرolDjɂȈ?bFaZl#R;c;g#fyj!^G,[LtnG=(<m#EZ0<[İI*:MVT@(/t錳t:}Q!WK2)d!خ`x1ѣo\m^c]T:D;0 bOE-]F^g?ӭKs3\aW@ [X]oh iHP{dt1#<\B/zgSaJ%^LxkhNQ4;4!}:j\R\.ڙ]-3PG4 йacV`*ò6Cǎ N?XoG8] HJ/TG*@ʟL:doGBô7 еa]}DGG;endstream endobj 327 0 obj 3136 endobj 331 0 obj <> stream x]K/9p.YoC&V+{7_nrYM6pcVM?HTO˫ߟY\;ha!W>˿2]JG+e09@{tttZx2݋uz`K`<:`p0 SLI+fqR ̺+{UJ:aeIoR:61"q`g?iAih;z4cArLxgv- 31ݰ;(M1\1vALײ s1 b8c۬àU= PQٍWQhr3fLē|V9/ieUlt.%.F59)4̓Oul4i5kӦeEk"X۹|GE8}l/]ae}t2d*,}1%Ll}ۧI /MslBr~x3aa>g YӭYW T\!Hyp;n^ePo05c ΝgoO`;9lc DSa&J ʼA^FE)6[˵+yЅzYD@]iK9eW <`1FCхiD}(bkGHy||H*QC@:Al|:0(i]EGw z(Q]/Zo}LKU%5kccȶ}Gzbr2*9zoy0=T@'=% xR!˫QrC}gN2 ƦrS?B`K (u~!jb}v^)¥ H4Z2P"li%t(ʁ [k}C -R/!;(A)C3;8c\2fڻ ZZIIIᒆI?TK4)p?N6ub`9_ ~}&9ND_48TTyvX`vM2 h9ȍcUb8* 7SkH\a@Ң DHH !TN8!14䩻w=CGJ:ߚԳ%FxHz|SLrC\$qJŬ]A Ѳ\G:Vp&N)) @c'(73:);qQPBk//@t=UFb&cIk*+V,s*; u|'Z$J`pCQAVfS_h%q5gR=0Nv1n.Idϊ8sIblxgۍX:r:J]/9i YT:MkSfK<4T8ja6Ď8A䃈|F@inSCtm^ $u 3vz@䅲%b©"Z5K 'Lq|!ZǷYh4Ubz8?C|D?P sЯE3?@ɜ]3B,@4ϙ0,^>L[KK ; D(vnꁁ8nҹyٌ@cHb%KcU|u-<)RJd~T>0QجbLפ\6 >~%~枤8F6r 9N<w)rjz(1R,UTRkb>jza]f2NyZM@iboZ2w#ٝudjg?O iL_Xߋ`z?nnB/eE{~:R7D쯝7m*n(m=.zj Fܑ7A'y\/ =KԜbd9TzH%YǓlDiG)j]sֺqU;!P􀨧ӴmWOpmtCt \?p^V~H0V2 E+fӎaF`Rx{Gj/Ḣٓ@96s1aINj3m,iwa |yf꥓ϰFr*zxWo {HF}P dȽw@4x4uB9Fs+^󟬉rk" #3{$n,!EФFѴ kjFO$i74Mb cYԤF:|VhB?:_9"kQ1> stream xXݏ7#+{C:$Zzx>@.Uۻw pU!d

4FOXL43~lŲy8GY))%7).j+EkI:=*Tkax I9v,72eYU1=֣;uWK9RN.` {jm&p-O 7"Zp\K?YBjWm홼I<[F^D f\2bлge Kx>\qAs0Bb."Usܓl )d oı.B%v`/.¡'0R:x  D:LҰ3"OJLy8nc^9 KDC>e1Z;ƨ+؏+RuM+2-wrJDB$BDdE^lWfq&ٔsQn@Պh!30԰nNJ갥~ՊjZPvR{'Uyk>5_Wc_bpFL3K)6 9j FЗ8~>R#PLN:V]z쾩nΟ9iN(HbLK,-Z_˾C4:eltIv[*YRr<oZWSj:<{ozfz嫦.&Z&ΰ BhkV2r {z[WqU]]`5GACe9FPxYNl^-NaDr Rhx(\LjY6Iarl&o H+9y& ,t ol+sT aE*oN<hF|^;0Fqp r}_$>nI-!yw{ހV5 0JSԈ12g?9endstream endobj 337 0 obj 1033 endobj 341 0 obj <> stream x\Ks+,L ޏd'N%e'N*(T(Y3> `fAh4uc:<'}폮nG?=GG_Sţ< n&cG?I;%MؽgaTjwPJ r~FY<齎9{L>x8vtG;!ڝc^HJWhAFi1i""0*;hC"+`i30olETj>m,jXEWB;ow:^;Gwi e3жT4:Oov^& vRV_N;ɰH {(8|w99#r pN%~f6 &փWV|vGI k 8|J$y8rKGA<Y}*'+ Ìavm}sP7 QVľBb6I8n $aM&a8†S d%}L]ڈ3s&)H-m)91fo[ZЫVY EK0^=lSfYm,ڀ0"0b"Yg~+3af7l9BF0=T<'a>b>eRJXq"%J\sJ+q c4/#X`ak&dwAtߦoY_ Ib,P< :G o\k6-)~ae$ހM?q$|dJT3/Xi Nᵯ_pD!B#%vS Xn([TlJF|5?h,4atb\)t Bڈ-č[65IqҬ̆JQRZ 't6+ r^Xtec-&'_Uӛ~U9I`sF7 TjYa_`LAhp#N xC:f5I,gcd3l'y$m^Lv8c} 3&ШFB7蜆 ˕qa ;:ځ1z7lqUxI,xnw(N=3jeu۰a Q>P"$/#:̤/tQ;HA@-2,VwF) + ׂG\.EJKR)Nux>Kj*\cFYPXFcERFV/&kaV686p0ؒI&ψ qB9>)Tu/E0AI7@^CgpQ2@isYL?_hix<]gnM?{ӷ(-Q=ڦjinP Q]]xŽcX* *,} nk(£%}Y[?mC~3Ƀ1aJk~!u&$8 v~Y,;VzjY@ E&wj6r;@ϩə0%4{<,a.Ulw-䝺EQB " -qZ\>v֐{Bݓ.Do\^USB)rG-P]Fu0y*U`6.3vq"ˎMY(hl qZ ȷ#İMVfDtɈzRp.li=7@9vn ƨ3)?c-ѡإLd# M>8(kۂLF8Ln8H}*(RYICUN7A7F"k .)6"sg]w"f9J)x>/K&lEp ma x|6;揿+fbb1{P^V6YfzcMAOVd:hfjMްǪA9ڷe |݁z8ّ2?lx g@BgEzjxB:zTe3uG;a+ȗe*=x`Ϟm*6Y>NJ1y3qB\peJj.|g. [m U-M+S0j?\b)/bSv ;K# هƯhJ8%K7*9}ۏ0 nCqBkHs?oG5>ekA+/6eG6MvX/q¨6 ]FX e~A58\5}L-°ۿA{(Kh$јVVfBn|bAE@£nPRTif24eMk-}._193Ƹ]ߡ!o AסOX;c#R a_qS-?ߥ,6˛,| Ę=t{˔UW5ҥ4D2 TOӡzi`>-`2z^Uӛ)CҦs[cS'SEVb@qn-tFgiq)\g? ?)x! `U"v:5@UA[ :"gnʦMrRL-u[׆ڨG y,]sK:}uM68j:H,Ҷ}́\9gl/"Anhzix ]SNҵWl̝L}71[ݲK[# WPHp ָc3ς̕OInݿv?1 M.U1Z>6E>'iaȊ> U*ox N Rwa:BQpA O0{Hd9>M޵`:nF)F/m;U6 K+XΐKkuo#[|vWsʴ?N9s'FHٞA'g趩`Q)'bssNӵÍvVB[b%1;:$ϡvmK%b6O~ƀ! 5Ҕrb ;D؅ ̈X~v YENl_, 11Ĵg&aԂp/8UmOb?99RrBv/zH䟖U&FyщQ:5|!>endstream endobj 342 0 obj 5250 endobj 346 0 obj <> stream xrJU~ռ])IQdrdS"!  (ʿ{fvgE|r ~O=<:DLO?OyU{ç _+9(lmDr1y '<`N/OTnnznSgjnkr[lwm޿1Ѽ?Z,7 Қ -'t?~: %Эp%M ,0U"x5"w߬v:bPo":<,X/˓P?{p\=z*MVzh[d@Ilr3owڼw{ZoҜϯ7Gw!oNKGϟBFZ*c}2tz(ʂ ~\}nrj$6rƮ}!ew9E~ŀZNLѤ%zճ:JwjkqZ|oAeG09W}pV;(TTzE'T9 WS_ m@yqnEz)1pr$[ۭ Gs0y^9S'8xּmэ^$mԞfq9_wFY>EbY-\bCn9:oUX=nz|?WHVO!>Cbiq(% 9(WRY3k7bRj+lu J|uj"BhfV(MJLz;8qPp+ej0Z8ZE;Kdp`Jr݀::|tmz y tE[{2Y}AHHUN-=u\\|VYzRuny|@j#0UK` X%/jʦtdT0Lu+{!PT ]_*K*Z j[k\uJ!;7aY3ܓӗ02Uh9z>ṙ=CiD,'}_g5='1>u7zySUz6㹺ב"L<3 D7T`-)-j]b }bjp>>/:VNI0㐏@c5GSWV=I 6hHjLvh4ء5(ު7RʨCeA14Qՠ dj[{Kw-bSђAӊ, `9 RJ[N+vQ$9k @)k<m@VuP,3ĴBd5$q캃`Vn-eB 1e7l*m ƱZ pH0GTPϠևZ1[Y@:[2XѲ\&+/[ }ޅtE@@( 10d0s<eb 6gzMґ;@0]CjaBtYw\ g06 ?`Fz1֬1bAGPN\BZ > ~ڪUT8$.t8 $Z;N//YURs PMFDJ>k mc#!s}V8J 182Bͫ ң&(1`M v)hn 9MBUҵܰ{˴ Xo!Cql [wYe;jL (KB)4"Kl N0>iҚZ/aRAjwTbϷ*QD!zMx8)^pviO#fYI TP$5ڍq;2 Y@pAIB>}( 'TV#c:0B:QwkG /E7x Br1ܢאGNG0Y@!#GUMNJh3 ÈCvhB jǫܟ;M;cT7lP43BׂT| :v(;kHvfH')s7sKwq@\f^P@ߟzlY_T1NNV5\q(qY,5/pb վbh@8Ԫs{t6؟ߒc7OԡvbՖL1dEw k4"8 =:iW?1H>d7\qcx2+#lF*9_ZphuMdŀɻkLX?E$ڤAX똨oH}g&@UtXZhL+wS}PɚS* "NTUNŽFce׍XK;U]3I/8e-LJ08,}lF Xڎ4".蘛pS !b.v>@pIz 8-X9Mml_;>Ł xɽiʐ2d }y;8 g(C HX° ' '͢eh ?Ih hBˠf04% a#Q)߶8qw/Xo6t1hm]c?%ʐyh'fOUWQ?m1K)rοmyqI↟8݀7U=  b4@ƩmCBCj `6;qIyv|svB\['ݰm! US$|7W$,nC)E7ɉ^{53kx~̺44D > stream x\Ys7v~k~k^Ҵ6e5JhC1 S)Ze%R()J*=`\h9*rp,_}r?:goQ?79t3zX9s+O_}Z|<8d ;=?`*?fmsbhgRq;݇{+41Pe|z*i@8!bg|s-jJ3dYb^  0@Y+Ux6ntEe`˴RXBcrz%ѲtS_t'`zfWgxutt:98{C{lvjrF{O)w𾑮bO$aP '0 -16s^>7~;8htLݻnhې? ai 1Onɘϖ YM-\\㳆g5~IzxqjNO}YpWpWyyq#Ng3f?ytlg7i0U~_N#4(3MlzyrO9g3=Z/vӣ:g^㣳{/2tggG! .?`HɃ3`{ s~vSVooábN[]V-|l<R27op/'dy1+ ܲ&$ؗ; ̊Sd}XNS@IOFկ*vJHpR J!05Z\ڌT*WdU\qµ X CP`9}e1)bf ;R{֩a,g ϋM}qeO`Yа %>K X,Wx<(qZ.Xb|O3.­JX \D#J"xC+:pjD IH (@X7h*zy;ߋ)^{Ah_Lt`/e83 Bv"wɁWB\2JO|ie75Pz&hߗǛbum`\,\J4x<7-Vs%UZ,;HĵG%ɔZ"V\4Ff2x%Wy.@ak`oAhxBڀKJվ&h }]mj0D}GhP~S WPR4@ߝqKt%.|tetq4CQ  /Q T*ul>'v/@Tg>~ r?N虃oKnG4/p[< 4A#Xyޕy#_MeȖF %66!PPP ѦO 7Ľ]m*G{&">o,4?=NJh.ri1J}6*O5f`}nGY&=rr%a0m'D+%H/-eMvcЛl t""<ou|R%5GPEB:KU Wi A Z±+[ n^Na\rr!@`KD 4|x*u Ҩx(QkD`e븄fz ZV q3{Ⱥ (ž:G7G& q[NbU<  xiJ/h"@: dOpz-9HJB&JDI+k #C^V#]$HeI1B Fz!H(-4"G*%9SONaKG J4h40!QzF/D)VӋYzuhkVA1 g<tJ̉&ScwpT߾bK1z]hbbj,\ jD4MOD2YM(A0YŖg q`Ә,)fQ&4Sr%OY<^OlT`peņI9j/,Bۼov(\c]eq5;n_6wް/z;ގ1D+0Ȳa<W;$2KطK)Osٜ=(nbTGe: *nWaՈvb]Nq@ ]< ./6d/M4NLͬ9" '!~GGQʵtqCUw/'kQE8>]m37-Wa"Cip ѡSH.u@lrU)5G^B_1aqjփMF=˘Rȱj'sVHvؚ !cIµN'VO7'h#;폼zU{9\i'qY<)ĊZ1T!)c X@FX&,X]K ZLt'˰|pY@'A3R1 oN ,i"pFM-:9ɚ te!WHmR$Z2p)k}e &N/Tt`Ȃ|A$o^)ɛ_༴ =8{u8V^5ZkJblz ִԀ*!p5w.Աno5z8Es3>R548eڥ+PzP5ԌTPQ˺j|sC0IZ^ś7&S. TaEKdጭ"PZO%2$v)ԣ-IFi'fsom].n ٌlZ1d>cg/ Vcۅ @5 # 0 N{*qD`'Lj[G '}T-g(Vr.bne)8%xBCu)dNl.;IfC<.fk̠syˡ.SYXM"H$QE切!^JKM*PnbUmQ ,!*FSqg%>Nn~<!yKuLY|h ^(ٶdX +vdOh DH*2-WF%r#[WpVx2 Xu`΃BDl %#5N (3g80+r%/ߦW?؛QңqkCxN~W7%[##; BtʹWx&[J"%5(,3JΥ,eځ % = B>LRg's0JRz-uotvk!NPTX/*h9 0B-u8!#|//%[#l_hMgx#-ϓ|1tP);i+;=b%mYZ-ՆTvBqI6M ~k8:$&<ؾTVK0A Kb(:/HObIGO_6 eޡ^m; c>c(3NHežlK΀g>k[+Gebјjp zD> qJrpN64E6fXF-/anZI} "}('<>pêW6^p|Q]r $wQߖގEFˬtgw,;KZI)qG1e|x=obXBzЪ$jKN0Wn)*#_[ǁ@f HS&4ҟxdFe89\jaeQtHq!Տ*;qRqCáu*x?ud7*q6fU&ƾ 4TlڥwLqڈw.pl&@$$ @Ǘ#F6[QP͝1fR ^- U|Kǝo}:2$ybr"Tz3K La3X-ŠS Y: ^4iBK]reDIF,e͢u7UKbmZt& o(eJí}TKՆQ`3kM`r9)eW|rD~.AIN[wòY>GI֯ 2w!Q9Qg}?af_hNYZŻZ`(Cr$r*skb<cG`:ݠoZf\b]{Gc|Pw>{/۴$앪%Nױ'#?qZMDRLFgpPB]G$~fڋ.qzb>vs"ܘ- mm?y|^ƑU:,|={K9dendstream endobj 354 0 obj 5406 endobj 358 0 obj <> stream x[[o~W#RcX/) +VDHDAqtZ]IwJ؀Ep.pZM?>ڮ|-~J?V/`+{#Zm7s3Vʞ[:~d/<͚JJ|f-6z*i] jD1{||c);+,3k&]"29%dn:xF}3Qu)jIQ <8d.vRvMOVG05ؘ S*ɳ%z-vO%>z TwQ hقIm1>9Gu\]4e#ޏϘK$H=Lˉq9r\xܰD$51v\ zaװm&y03ZnAs="M<g<,HĩEuS)qnPtsK=™D>`3@`/!ĹBň9/Hs.SȏbBL:Mӎ=Z-Ǚ7o֨O^O7\?YoÂʛRڧ%4=):u5T-uE%*_g H$;^9(1cNkB 9v-_ȣOXHZk"_@a&# \FA̝vO|μ +pOjïA,j$?h}2U3"쨻Jd(ؚHdmjBHj`0 `a(o1ςa8}p4S{ HkXʡp[{eE hDH+!F x bm)@r,"^_NpvF`$6A#sEi5"*Vf =[$?'75'h۵74@LAځӴKlYVƧh t^1`"bC s :♳! a C4iȹu@}[0ֈ:F=a.9S`JR* a?ӱVr<ҠGP&0[aeޮ5؈A[Ԉq7]| +oA#ߢ1̍&Q3Bei8M \%(ؠt"J s VK* 6" <@aE %/yE2?D(hgI9zKdv3/Gxe|wRE S˘e#gZ2RV.Zn:DP(`;W c+@<srp\>,đLG<[]od \.)M%i(?!D.]!8-wǧPeXiMBvs{9rs gŅGC"zvrlOa@7GDZmbn`Qaݽ/v?W! ˋO{@&v}hvA_ٽݝ/v_v=>^&8?D?p^@h+!tN>=XF+LC/;,\@04B p)84(<#>ABCՄ,@2$ C1A[L(.kb&-h* Vfa!y,]6rwr, 1)-`D;`=!4)ɡњkʨ6 uX仉ix;̓E)}7I˞fnFm1Ѵ7lOS(g Be禧݈!_nix?jqx%˼s, ʔb6 4% "olE}y ހP 8>X0V ^~ag5{< nؐΊk^ⵍLZ5 y e/vtj"-/TY; irBNunq9CxMAhbu܃CqO(y1i\4YhSw,xc*E  ֨Rn,=l:g' -SO2a)jvmceie'Ěw%{͢~"|Plҳ_D A(aI|+oX. ɴ/ɠXBf3*)} Q$>aSl/e i -\ sǂ:"ݘJvjjQ`?4՟ya,5HNw/sFzbżkDN4=v54  Z2Oa%PI@y056(r<`/!F#.g}vqy@M3`aeJHpM[ 3e֗nߨMYk!hD܊23 M"^R.[tEG#R=$xkaHDɞs;dNgA65*,r)Gʺy蚡 D\0i;bya);4W-= y->uYC`Y;H3Z(u*ᣑW,{ r3"<g?pvDb-k k{8Л7D(({D!M%2~f!7IFf_*zĀ:ve[C0Kj24_EDdkI]0bF?DsHꗝ(mGmڧ46Tׅiu}obw{7"4jS]q;XFǯkq9zAZ>-Z[ Be^1,bR= 'ddA 3tfI!2/2HYYWcmI`YD{27NxM ʷG'N3?tm­]} ^3 D3}l}VU(aqSDV9Z3*U0IbkOJ. E*ph5.kސC07{,0k`߂㯅K[Ĵrp7嫭~Hendstream endobj 359 0 obj 3890 endobj 363 0 obj <> stream x]IsGr#῀Ӄ}Hj1mJGX>PI'+k׏,ԫ%3˵=f?fgo=~q}Ď_z={{ :H$gϏ/3X gowwMJ(n xivs'mwqbp{w0J{E:g:;Tҝ?6[ᤑw$X!]wuvx=sVsX07>fcW{Ř= /K[Xi'OZXrr*?Zf8]f\.£fv^%wr')q_&)w힟'  Z8=1SYA x/j2la;jx;QRxJ3;wåܽ$9??;;,g*w4`[l炉8TGZ+IK=])@VK9)}Z$>oY}>s˫ ;m&$7X^MxWi8Xʄ-lA{ޟQ>)+xg $NI {#Ƽ2\ Aq'20o:47`GV.-O'/dyx:;} Xcؼqرbz-S://#a8H11dJ(3P'P"ݯù=K_]\>f ipxza"/zdOk'lh qʞSq<.ϻLߔH5R$)2d=7(di&0hZL% {ѳKCEy\~ ;8"2Hso.;o,qVGE @rB:oqdaKtx_vಋY9OcK &iYYؖ8"1=K?<,| R`szLGF^Ax^G"`[5~țe>d,H Wj˭>B"GȲ*|#m1`ٟ3y~[Q R=.2Q9wgYp{73W좐:H,(^y58.<-h@O~0#T5d2J\z"=6 ]n( [<f^xKčhIt~u[/8= ݓc\v?/lcU= O/-¼]A\@:>?$)>ɏ ,=jMͪs^*pn J'NkQ^;}_QȢMGe9ѐH!F\UXyVTC E{|to TN9Ơ{z_~[7 6C#[3Dg4>N޻3|ȌZCwb6G&[$ގ qݫ~H419I)?T Qmc) \qCR!'kf&pAꗀ>6J J 'dFxÜWI?T8+XR**[~D)PJ.o֕cC"-W#xG˯ l_n 2B}<:JV7t] z*$%9L4]pٗZNF/Z3:ÈZ3 w=5vGyD/QDLO:k%]$7:KDTW_ǓԦ:IppwE%L*C{uZQgbZ`DHjKػG `0HzL¹IZ[SAۂ4@vSwd6+f c'J{Vpg)k7KUwi*|&pvzx5F=BZ"2;(o4v_5L\167gpCJٟ$6JqN6E62EOo 6^i :|2 o$Gu ~o '; G3PDD3~ȽhnEL yM [ƹC]*StCQc}9qb=L{f_fyzBՊx]0OMTN^A1+rBLm9̈́ (SRΞأot`c-GMit7700䵉0oX +PW2bj:pi4'x;HiO O;nhh)LGTVza-UpT= 'h0CSyL7T5xU@ 畖$ ;:n` b2tGE[=jG0e[f(g>1Syrtlt:T pOxrOtuHfK~$~Inq4Xڑ,-Ob;/Dw@y@ b)G_/v ~GCO16| =f@Lߖ̀M/˽uʭCa=p\Dm}#lT|5"Mn]sҼe1>'m.Aq0?eԶST*Pz^Ia HP ?gme]ޏ[Ќ@v3[K ˘&ɏì?έe fs<4ڵ9l;-P9&JJHMSUu8{I"dG-ee&k$ b ~.],i3*Ma; [å@bau(XrAfs1U(BiK7}'CgNyys&XV݊6Ƽ %`XѭE\Yo)LU/O8pD pz\$Dr~2Gy6Ϋ4鄴m&k{+xƠbѕyه9 Ώ՞hF S3>Z&3Rjve$ Z`W߅[)Ķ}ڬOuw"z}qYѱƕYF<=tA󕷪Xxqi*žbKEL we뱢/ٹQr)pQeoWG[ܓ94I\CiD|)~f'YBc3 7ͧ*PaţqFl({I1̪wS1:Ae!,tN7q\҆=xI\m⟄㾋 W);h<~[Ѩ>z77+qD k3rP0!:~C0h'i%]g\[W9viŦJ~ NdЩm^UF~9t6EwvRV>NS7eхG%T+UQB5Y/hyS SA!\Uf*EJb"#endstream endobj 364 0 obj 6711 endobj 368 0 obj <> stream x[Yo~G,d 5QGR Lȃ$1ecz{m0͞ǿ-Yϗ M?wBL/?/y{× +<_(loİr؅-xL?ΗOTn逆nvy3=z ˽rwjK `Ggm!xyqj]w藣77*z~0.?.?Ao~>5Gq (8{uqzszpvzwO~O{ȗԻ/_ow쯾_k* wF4:*ȥܬ=r>\ 3bȆ;'痟$JM7ϳ9//va&៶?^)Tҏ qˇ\zjuaM/Z*e>4w-Kݻ&*}emsw`)1l6s`葆i}WؼKFt*nJ,&.2T*,3%q;&tLvo Ōp{нP9%oO<+t-VPkJ;gG0)@q:޽ 4| ltݗhyfx*_?p>/$]i;ψbgx" =9Q<UyW6%.>cb0 IJgly<&RhD) LZ`.?+ aH$ڠBTGu$<I׎Id%7VL8O-WLZ l=TԊ*hR`Hd4{%f YPz (0턩)̛Na`Ck1J9 Sz8s-_V>ю{T ]]-=a2Ȥ5`ԶG|1&*P]Zpbze,1[[ȁt'eАʹP6Nφx!NC@TR"^wQ!-Hp 5*R%}#Sj3S bRiQc'Q);1@R˸ B^{*n4ҩ\>#{H&:+B /x71<ӄ =(bmbx P$* 3PVkKPVFjzy XMdnI bK\t>Bi(- %IEgw+x Q͔(hdv=SW'H@ Ƅ~Bi⛊/Mg@UMdz mr ' Ihf[l۠p^n⅊)z5a\1lF}˯C3ת 4h؏]zp?#; 7o$Pdm2Pe}Yk$O^(-THlą[f88 ']e?F)_;^=4Y89&)$b&~}ܠI$ǟ)]!H<$E<>5KcPv#!_q﹂xHt͙ǫ7 _ wYkSBp˼VX'|+PJ7ݱs2kRĕp"yz/%6wѲD݀,D>OvsE$_+=ݪ{)jf@)9'1p$APJUW ' ;7 XQC>YނXfjr /̈-v+tP}:p=g2Nlڕ}6Q/7+|ECxVɅ>HekdW *8YC*^Qh*_7rG5/_M ASZaĆ7Zi~6aXP@-FZG'aR`|;&1՞oqŸ]5pП*%y@(BReo:׻+(YlދA'u:'W=y4E,Cmn2ɽ74ՃF-ov/PAnbc}74l2ٙ|!'ߙq/0[-ñ\#@endstream endobj 369 0 obj 3387 endobj 373 0 obj <> stream xZ[o~ /ڜ-HHah#AR|Adٖd7$wwCVP9773ܷ;1˝W'=='oOdwj6SbvNٳ|R;lݝ:it/f4azCkaTZFJ5L?K5rY^z?LtQVMY^X~C?{ή:3$ ;ef$LvΞlETj =DTvDMMFzn䬞9;j_DZ:#~r"؈^MwIe3Ys#vI JTΓttq #(Ⴉ&{8LS߽DP{;ӏYbnPahEtY|$C,*ܜnzN\6*,-#%(cۙ-**f)_k!3o - bM`nO.mPM/h vLlwJ1E$VΆ, $}vRDF!H2A6@O-!])GbTzᎸd +`qWr2 Cfm=..Y?!CY{Z[ 9-cz{ +d1htň\I(m,H/9 "  Hb Ֆtά"ʏ^fAUYGӲvzް$.YJ[ SVE |fl'#yCR*&#YvJ%- & GT\CN$p)`d%Mr{ʘhXa4ĝz꧌ .z憺(f>.vطY[c2yz5 LYYF'Hrvs*):P&K9Ȋ9 +Rˠ{#cҳIT^OGSM@k- r#Z c[p>U 7hˏ۸ݶ|.u$}yUNH EZ;esv32"j&ED0}L@&_7F]:`x =CX?d\Gi~hs :sӨ_2o*eT%(EV&Z1][$fЖ<>ƽDbÆ>_?fzܧL_-5>/9dQ9 -ñ֋DJaw\ƃ03hi=h#nD7RGDZi4fP 0Ҽ޼QƸVIpud {r"n3wtl[~}tB7p-R+V7KBjuxOz4C)q7 o|U2i|dr A.\>9zo2vx,Pyi5_o`sYt A.y7  Z鯉V1p9^o|MYZ1%]mk&a8A8(t\K᫖0wQUviG8c@D Їy$6e *Q57Os$y@-y㽹d߈pi֑Uks|iGV$$z6[5sOق=}? @D2@mVɜoBJKO?lXv_ԝ+j ͆_'XO\u>pX`iKǘP!8elxoV]AAoAGhM=UFkUѠB#K{EÙugFʪC\Y8q>@ A-AFRyAGo=uӓH:S8#xT%3hKq~PZt!V;Uwgk nˣlhbkhg}šو|4 9`7cjѯݱǥ==Ts%_\j 4&pMHhMz[ïً֤|;+ڿ1 Χh|jICǞOnWs#}1md>X֤WQyɤV#۳W RvձwiV"XԕsaJ(#=,ӋUǤ1|SU P>4߃$̦h+\Qev| cl_tB)>ȠeŻt#pa=*795Ai:}Jm逿oV"n[~ͬQ61UMi߲,[,>zkKC襱eSއ}QuА,+dS7o7pӶ) `C؇WGcF>;20(`L8:6#ܱ;œz5 )֛#ߍ3yM:B448Jפ =t _)&skC/]jR=J;&_ڇeGJ`hqc0 4=Z~a,9EPo?-mxendstream endobj 374 0 obj 3252 endobj 378 0 obj <> stream xZY7~_E_i| (2IE{eYvaCv!SSU_錸?ӽ[zvrGf'{oq::_43[Ŕ-_텝tF =|<{9Rw/*úU^S=/H%tcdyyN?XIChwg X~oax 4޳< 6[6;/e=;vK- \ڭ9_A"xy Bp858 :]ʁ_FX^Ѡ(K,DJL)HZuw*V1lIY})>M-+F$(VȻ 'Q [̌/c`mg(GSfXHeNuСpd{˯%+{;n\aNxڜn#: p \18д,Ԗ/!s"pJm ?[ F7?yfpa LTrNIԜi *3=W鍱-]&]M,p]PlHtB! cDuMAZڗV J3A(oi)O}weЂ=8l@dnx2׵HwcYV 3 w9`ٿ F`3¹|̿ǭ!oK{_‘GԩӫxwIsOkCjJZH {d\4!w!7U&< #(#GԢZY@6@J+Ihωhp`a=$Z΂>;va=-*j+|Dy֥#h)0fqЅ1TI@L|߈8Q\Ę$R&A I#}Hx!#hqC̹|5* -M`9Λ>»\g*D3@"v&~'Nþp-E@eu﬽Ptz7hr(F(?/Ao2$mb^@UWτP7_0n BKlR4uy7a<:iĆSX- 2 Wi N}mRוJQ;-'qSK]E:1ꀝnw,Nнbny?>$Kh/5LY:,eUqz4Oϫ5!-D~PZ{ȭ{B{I"xw?8.ci'At\rsYYʏ5mH.tc9ɠkU !j]t`)Z3^^> P8 dXnfNL7,xj_>Fͧ24wi?LKe.3Q^G >/f_3MH{m}mЙ?hH)4  fSܨz…8HRiE}EgN*y[8Wݦ]`YFTh! w \}Κݮ0UL}m%XbjVTZ\*?V?~E] j]\P)/( WTkCϦxOfd9jǍUgsBt_g^dE%&F+/̯2/:>3\aa;t@! ZC')\lEIm LL b^_1 thӵq= >L!hXZ&na`2TX#tisMQI bgWGqd&)7`j1@4e"Bhnkbh2׽V*5~̶#˘blIyP%zCv aw҂Ldr"ũ^Xl)h_(hU!q5 `ɗXTs= D[0sapjՐ*y\Ds {FC'ǵE@!gjVhK3|iZ jǩ֠Tve DoA)^'@t k+]jcds?EP690rni ƦeyIZE?NeyLMj3xZB%j;> stream xXKo0 W2zX۰b0 X[;EҴi?XvlC/H~| )#a)k/dd=x,_5 QB4Պ+IҥWH2xBCe ڻO'h(~fD22Ph0{6*o= @ T%ܿ`uB!sg&cͰ4dqIP3ofQaN/ף)5*1z b'b. ,Rr&JK1 U{'E/d@NzX 8Ј*!K"rt 6"տJP*4h10'!. џ&`#bqbv[3 AbY+IӃbl5srz篔th94CakF]Dx,C3Rsi-Tܸ^Zl'ZaQLL0mlʵڻF0jScmRhU/F6VvOc_goE.l_Niؖ?WBc^I9ؙtH;@Gqcw_TNwz =lj=mV48G[8ݏ_]k` i@ԫllϛ"A)OVMЂcB* MD“H!b}]-3f>:endstream endobj 384 0 obj 684 endobj 388 0 obj <> stream xU1 @ =uL.wI&N;PAɗfbL4|j8v{ ah E_)qEtZQ.FCrLCfGy6c$UOCǿqBז7C%!endstream endobj 389 0 obj 134 endobj 393 0 obj <> stream x]Y%5v/7tkMk_03AL0e4n-tY&Pٺ_JGgӑt y?}^]ódP| :XSpU~S[b=uG*M Z?ޢorԅFwP_NEcC*cKh R&tu?cJRKT^r6<~(2j8MDRB F胲KVgAD|[bx#RwQEeu46NQ+z4-dnOi;.ك $67,"3[ $jl",oe ЉߥbLеU|R_tI"4;hӣ^dt(6n4Ty}Ҹw;7%N(j)ʃrSk%M3N+ZL>HB9biSV!g7jök-9,@Y,"x&(FX{;N@-bmJ|kCE8QӼ![&Fג/2dYU!]ϘH0Iө̙:ÏoV=6 >Lz%J ]fLIz'EڰK,={:$,qf+I(@w:@}Va9 [Vͻ ©l4?"_ϯԍ$ŅeNSx*f//kK ļ9~mU"i/Ek՝MD+;S. %Bw?ss۫aLaz WƕAM0g( @5JS!ZP2O0y wܚZ3&XM+e>CH[鴥c˨7,6fp`L0U|jrM/jȅR26(xO ^l`ns-`V/>[ .'$$4$ a}ѵI C8cD" 2KmԂ zSa\ jO&Iřwv:(g9.a9bR+;D/W@~#6ޡlpjb 8F^KX'=}JQc?w;ÁKy: m{T7ȍċ3ENm%KVx55Sᓏuh9w gIA34~;YAx}`w, a$ ӢIAbrǵ1fke/fr.]MƩ2Zr#ߒj܎;aZiDR.e煸bLJkJ_hi qq{f]5O:I?5XdC=AY@4n˝jzwjpt8`|p>?^ī^ﮤ wPyWҐ[7W~'j0h㯯or!ѓԕCڗA] r}p6:nKO<7-1Xϯ{`6Z +=WԩZ"'ޤZ C[o$C o[b-(D8pE[ G^rT-(iߓjI/C6\Do%iՕ6@CjPD;Se̢|2xOtG"1KIGsT PPUgB=Cm[Y BY0A)ACsVqYfZX=G5Z( >`z}3ս>$>`G}h76G UPz*wB=C9R*JAp:}W+a7C򍮊-6ZdNqJx]P,' UK8ʣGCڲ!Sq!Q6h>X"MMP,@eK?->I5]cZl˜*sȨz}g#q2:[7ޙc#KKꩂmC曝B3 [645 JMy XY~!}/#}DM{ txg=@çLAQ0xP>ZbOaEZyj^{c LTRWHÕͧ'hi/8KGIG'%]6g>Agٶh3L1:ђAc+ET b)sڊϲflw 1%JNO4"ܘKoZy2&;rY$ ^jlsi;RRyucl` 698*ұed9 {\- b~ORPUgB=GUWTCPPM岴N*^$ݾ|AHI!2; LXBU (7JzQd xopX.i)P߅v.B;;P PUhgB;G6JVANs[%-+I֒Z 3\s9:.jI\J [E"{"UoQdPz2cEpC49|1U(oi34Pޡt eƊ2 Q(@r*?e(03˘~2 wJŨ۴ 9|ct50_i2Ne$Cq\ɁBJ=K~EU9RPUgB}*3TC# oSj~(C%fȔ층GJ2 %]{fufetNEj8*QX Cc5|PRSgB}*3TCWT* UIcr ~ԃGFn?b~*n?b~D/|7`ts G!<Rr;QR(gBy*3TCPޡ U(Pg~C >49:1MOE 6PvN(K)Qt,bJ#̴攠JL[8JJlɗj) L^SezR7U٫ aȭ>ٰtgd&޾.ɷgS=7{ŷm`7#,"/˷IK8}ֿ]hEi[F7C3Xkg5. vΒ/1#_ \Iba)I;FrcYE ~y7/ΩGuFE}|Ɲ sSH9ʲިIʘm 7Nom{\\s;9>SB oLU(Z`k>c!zM&͍d?YYf;yMs\ݙeDqoڊNo> v˵kUwȩYD˵z[%/2@^9Qn7GܚI!_7dIwo]َTVj?K`{@Ӳdn[nll&TmOqO4(Zje1DS%lH~$zf3hoqo>ұ6Ι~cL~heLG7/l_d]|x }7Ex`{Rd]!DITa詭؍s b<U( "mf~#Ufk(y{Y/.7Iq mc8i*^!*}DoyfƜ80_ɚ<3[=r+OcǣU.{zUdDj&'-ƈ؏ P :h }}Ɏȏ12&n7Wb 0O_P&nq,XH;!ctTH94?s\G~ߏ]˖|c3r?_c&jyaˆYh6Y6]!4ow9Go'իe?Puo\n㎵~Aj[f-s v.F6{7;un#6}J.GYj >>mOg|;ElB-)Ql Ckciy@vL2{l|)>5?lHWξ%Ef2ʗ ×8g ߗD=U-d!ng{x <)}Lݵɝ~?{Kgendstream endobj 394 0 obj 7315 endobj 402 0 obj <> stream x]Is?7nQ`_t42P$j6п2@jӡSI$@,_,@u&c_=7glg<.yz4r'oQgKsfVW^}{MJsۋK$_3ᳶ9q,5,YV JJ =3؉sk2 }Nj0+w~jLJZWǑd"ϱTXfb>C.)?G%__o8t 'i7 Iݚ899U=$1Fi|!q,;&{&_*^4ϖjz$䤕Zˆ:uz5 .GГ/|vq8rz^XLMژRgdK/5/_/|4ZX'!p &* Z [p)<̜%".q~%2R (Ο5(aP('/HwkPvTO؃ 5o{8*wI淏*֍ߝŐٔPUJo >Ejk8wR',sT4Dd=Y1̺S@Wx؜ >4iRΓN;?/V]johڜRf_JFRK$`$^~e~bH();>eш߅Ijf>7D *|%~%v ŭ8{}@6.8h;Z QҋӇqOC,@o.)i`^!97Γ.H_%ӅL`5d}~? v*@c.iR0"\* ]P&{kzpvoϿ ,.:fX2~RGD_ݻ CiIo>`l+$r~]Xv&V{&(Wu5R%fVJA AhfQb(t"Ꮡ>`5fyǛE)ϲHt8տ쫡ݧEf=$X% Y?UT޿"G^E1/㻡w Z%Wn,YzsRB^UGr#dmHȔq~ql ⨅okjBo#4&8WP|I N)Keۀ@"ɛ‹Ks?j]ύYYC $A Y<* q*  4&@!0vH20"Nh}hmc7–,6`D&ɬZ#(}'jwd-K&HUږk"~%p+t*xYZ>X^FL2룇*xl"nZ5l.\SfJûB Q[(MV,ң GmwQأA5'|M)(8;Ⱑ1?Y5ڏTBC~ Z,Z)0%'(M 'VH"؄'\xLNK]vl">5[5֝bNӦV}-s]˕4%>yVK&XYO)UˣfnQ'DOH#]!r({ݰB㭉o *?w?30 Ns^\޼:{ԭTtlT&{0q,U 跕'ap{}뼷4B-ɝ@H$ $&guI"+4$,(: i8-vN'[j4*53sУ3ѣdD_+vQ$qY D RDD_5蛡vѸ\s{k&uSk5{|}T,<\'JCq.o75]孠4Uf[tꙺ +ߦ7ry&0+0U3`s/I.{4>3~$Ppip͌3[ćN nv ]?E֌A >BX\NjV˙mE#1|e",i\c93*3.ԽdU#Lj#q5C u;$0^Լ 6uj|ur=l"0(r UA$5.V3WbR!{m$@1pӲxթ*\FA`~f+VrKR( !ikM74#v[q=-7ç45@iu7]%#I\jfV֊S5b{tl'FZt4hm&(Z4pWWhw`JC7um HV++ 6ғ;4?oԼIRl|A-օh{p]2vSc'E!G9ΠTyQ:_ق}dOLmٸ@k'ܮDzgq]f+u46ZKL(+bA<ڜ,2}=rIp7YvrN q],0Y9 p)%Vc,ؐmW8ѠG|j/{Dd( J#Rut[.(nbA8p ¯5 gk\Y> ʍ2xd6yAƟ{tliw*nOv.+֪kCdTe$:EHwWI^x19k V7R-[tr9ULQ";ӈLq!8%RH_g$.@:uj2ibI|*c#4͞Ep.} Q Lgqi Yي02X _7[^Uk}#uh;=HiV$=coFqeٿD+d U7ufr][6*"JXҎ?!GZ 3bBF(_f(kD X~^i/3ZEOuK;CG\%E1Lj͕rN*,^gyJn<}e|jd@XZxmH&X>Fz!;70FzO7cF(іdHd v^3&#k4dx\_2.)0Ô(uB@ή|kհgJ+YN>7]2&*x[/UXb;3+^0 y}NdƷ.\64xBaxu ^ D7[]J^Q1׮U(4Mp%(t0RTF8+[^ʣnej7yT)dGW&? krSq>`Ӕ N%sV-`o]8[M#.CoAeފ؛91 8+THlQ CRD@J+ɑ=9y̿3opp@ױ9ф•-ED.aK"=AT5^-̵XmNnTFZ`\p!Fq!gE_U?e;qaD4~ܳg9%z)*E˨s򼺊gu,G o]&7@ޫI5.Lcq`pV`MX徐-[:wp7@4)㗚  ,K]ӥ9m?aGf|Rz~6N[U /8ָ-. }]h՛Ps];99þ0d͓[sSJ%_;K#|BhҺxI!pu]9_v\~"7^<6䎆!}aakO锩[ MmuNB`6 r)V;Rs V˥Ҕgt5iNߑ'(oY%Ղ3oSR:`Tf:+ދ͗=X.m;ZP/<8':m\{s䄍J,WTi> /R.`}_TY!}1hy0=eIj: PS\CT`}"2{ /YQ' #߾tsw`4M:nqfYXUP.pʢ+r=5 ݫz;wCZmJUyOUN3>V2>@=ؖ`e,'8S2x ,l N^:CN+J:,,EJNKED?ƯΟkE#M̳K\%j`ߕi! e-O{Gt|'9uH|muE3;iB;Pwׂgnɝ9Tj 1狅C` ^jD8nœF:#|/a\tACM?yV1BrKt '98y߫I &kNKRZ[A#(Uxqс먰qaW<ߏ c' c( 0uT8 |͔?~0٨*p-4QT V;x b+ 'u3_IXHWEV+,`w\OWky 20/eiR̾d 89 2xS\1'Ccd(!NajMŘ BZkJ5젹/BS=H33t\9ѕ<+-5Z7Ѳ%~10!w+ B&.%3糿{&endstream endobj 403 0 obj 6586 endobj 407 0 obj <> stream x=ɒqmuz4k_ "[! 0 f`Z7LЯ3+Wgcw/ogqwʉ[|ul)B211+wTimmsb"<72? 3iGgfR|aGl锶Mo` r 5yhI*inA29yʪ70*}.,{U:С_(ơS? `OhC`_ѥRIރ;fnՀհ=׺'I:wL'l*#we)c!Unj;'M:gƃ<籋Wo/ëy~G==֠&mCWԖ֠IjW-8#y&O`G0=zOWGzq]NtZc#ӆYc8 6i*{DJ7C/U0)}"ڙbEj }Z!p<'jq|Liy; wқC#QtВ&Y>vBk WqB Gzq7C"H%Cf5$&NzX^BIjdDyUțaq8W0:09z.& g%4 hfeif}m$ZY#P5}W$] Ω5 + O+Lā`湍Sq5]˳1EW,2bG0#2ŷ3ȋb-Ys@\,7e E0r@Cq0HO{LXSHbY*nbFXYe2/n*y?NP>{#1B2@1)Pbp,AOV4[B=8 0  (>PhnL݇i<i vI \Vb̶ Ly mnb>-G8(FKO")m[Č. UVjfx`($5,aEͯЛbv<=nʹ]56yyaN2b'Anra_YFl&ˑ&Ř!&k70⟠$D6#调At`ͨ*`Ұ#FzY>Bp[05)6\bd#!]X(ӟG˪/Aq XloKui^BiﻪsRIt#]qm&lm 2xp82RuH{aDP j+ĜQ$۩5@Yy\{ReGMNl& Į'Y^_;kd% <pJ{@M5DH(o2HFo?05-,[ZZK+b grzYݨwCZO6FW>=Ɣl^9dtYH86Et>>J(|waZָ֦dٷr9K3+s Ii=% CSL W@[a g)FDpә+5^f:iU:/qY]LhJA3^.[d%c*iGK$Jx :\d8\p;9i}Bpka jsyéd\rߕ.]c)};:z` X;vj3P/F X+'eձd TYysĽfZA3m(IIEtI$`,F@FC)0+Ӂ)?M|" k'L7ZUp gkDn 0&Vd6r(#1qaY @i}f'0I%@@|vWGV (P=v ֶMOUSϘeKL <%b*€҃2T9NuŘ^8AwhkPgXiJr`\VA871e ᪃O!d)0%BvU77K dVG$C&7)#`*e}\[)v_f -NLZ9`$Dh3b8 8|4yQ?zE9s&RIEF+IHˠAxt̖BC怒ȪIZ ;c} `ou0pp0c2LN!VxPh6>ŹYgyvgVvsLWO̮ tz*G;S Q84 a-+>)|TofP1>敩J0*b[Q$B7r vAF6ah^M}z󅢴&>56(2i]]zk*iIϏdxezmA﾿v .)h4?xY\*IbZGT|QE "|MR (I)reDEMFEMMj~4:0Tr'{Qzq1FLtg4e[M. Ar aԸZrf*=`4`4Okx(:Cw53 0G8]L~!7$ޣYcw$nj|-ڊʝcE>Q^s0Jx qMYBo]NsU - CW7G2̷l|Mr;l-}-4[ibi6K&hAY3Xk2[F8 Y{Ө0:- xcN0z GsXn Q!wF JAIT-e!zN1R&)[>Ns@$エqC(1gGɃ=~Uٰ6;LJG,ǚet5>gD)Zw׊ ?)Ƒ;5IN(R%Ћhj-HNPۊ|R+FCSXfGUm}QnSoR  )/&E֮~^gb)xJ'Fx1D!]>\ m!<rK6ԉ(|CX!qF'_gp`"8t=a%Pjz% p ثR®.Z_]M҂HL^,O@eK ,W1|&w R\@MJ7/=%u㯅ITj⠃clnjf\/*ՌaXk] D 8Hay- SC]JT )rk0]*sk8vՁVԢX LӲ7&_֛)_Y9NƳ3DDjz.#h58ռ/ӪP`z4tJ]M!(Vx@v̀Cnjܘ!&W3R=345\-ýf3:qN@<&T]mdݖUu]i>k|vbEjJup!C>xI`^r2Y+E×'ߧFνF iEbj;%EhcOAsS|%1_$~F<6On XmIUǘZUV]79͜ʉ#. ECR\:s =1r30]QEGZ08z]&pwsn: /V`엘%%qOf,X"b~d(NӋ9|K[jZ1mZɡs1 '8܋8[^Qۢ '> J@&F{E~k$r[/Ta,n(fJlv*Gq*!upi%?\X©wwUAEI0醨eb>#6)ݸI+77E|lXdInFD FQPdM.W0Ǵ! @8 a B(/JHYxؗ[Rdx3_6@h1TUR^<P2=ښvKa*,@G[ Y[GMmM3PmЋj0F1~Xm̵Ͱ@:CkAD31yX}JAH ^yDpߴs^!FNΟu5{1-SJs 9m=}k[y==֌t5a?j+fϜ<<zwggX)f2f}4<cfOϾ~L1-}G蘌⵻t!$c^X'׀pNar dز8MKȡU{ASv0'FP M _κSPP[zes^az2JՓu%49b0 ';'ؙ]poOXRdmY<`J4%KhJ-BYM+eKLg^͘cз¤<5?Qz>*Y%+^Q饦6zEcb\DCy06̉i&^r}`Cb:FV0P1_smnٙ{^!ׄ5g#áb;}\âodUNq UғT9.cPD=i_$(Y6b ӍgwF5F2d'Cx2Ѝ sY.u )nAh-ˏppj*m`-p(.|o,bmW[\Z[(]G0cA~0!@AZ >`=o*)֔ CE]˫¶p~N.j%=. OI[lI2gZx ~P)\{XX ɰZdxj1Je|QVDDk<iةrS8s~NE0wǮSdva+9a~eie~{$YLE!z$`WVIc伈fگ/@D5R2>K +nT S+fsQo־M\D;{-V̑W u' p~Хb%&SŲ6uq AQ˟86cq͔֔beRd$ RG)ĹɚAX[~+N( t9t<0s 6!GXEn^W/߆l}z5ZE8v~T OJy'*ϩu} %rv,>u~ F5]uGS)tϦ}e |{0IZ.y'^FAS;xa"ؤe7a%cZ*RJV T'L~.{]wqA/ѡp~ЯI̜5'ҙy~ϋ)~AIЖ~>U6.yCGzqK&?S 6 /\g%Dd5W%Os$,2dM8%c܁2fVS*T֠BP*:[0nrj.vv^!(5oSR%GrvfjZNxm ִ_\CdʟB8~=+ uH~?P̹=_'pvxr즏`OߦO7b"4A-K.h- .qPM` <):<:)υ"uUi.JD^bS+\ #f&.!9>*dK:MnEZnHt,2 yTsggnҵ8`*5,Kt*W"C,QJ@V[;Wa*G-FXhdf\ׂo$h&]7Txd *Pݾ  ~ֆNMXŬ<*I4PRlfJ_>)uȆnW+n];;h-~endstream endobj 408 0 obj 7557 endobj 412 0 obj <> stream x]Iy ANoO,|Av-8b0c;ŒG"_m<tF?6Y,V}ԏǢǂ/_<ǗG?q6u`oҗFJsljSgWG_Ʈӳ 2|_NNMƿK ^);O5ZjTφ⟽gr~Sa@jփ|:~ǷFVҳq{Hz{TpTy(aVġ8>?O YklEfT6š31K4BY)YcVcG&iDB=Ng~_K`xM|{'^`FXxݠ%&Z@SZD>G#pFT-If?z"nz*_oM,פ@MB"K;B4E ą̇̄0@y-؟V9ƴX:(}F?lktB☩ il{mr̊QBIܥ7<DGRAM7M&jo[$ 3ާ&Bc ?6|oWB 8xg3j#-J*EMt|"J=b`EaE hgL)`QC ڃ7.0-!]kQN!A3 {Da*[cO]/ef},F)(ۋRZljEr4m;bb1HY@SԎ =Hiÿ8Xd7)fm4㠾Ƶ)yr(w #a8i@_NSFV̓G9Q}՜WcT#5wҏy6a:~b\ܜQ ;8\3*9uǷ=?/|fqh\k\aus` ŏXX6 v#҆mJ΋Nz OM E!qk{lE4nO`=`mg50a&_aLBT\6" Yiδ`=i0!K6Dռr0{0/Y:A:n&-OF(ʶw^a R5Ek׭RMuÙ~+50_ly1*U ZF;̦tWyiƩ7R\6{ucgN`&eb&Y>NlUu%G71'dJ>z*.& `w.M'S4<6L :e{vX.k޵~܃wL(|>t0)D|a\K3rK@/ރoy pv^Pmm .4 C{dxdiGq z2hp3  ^dhV+qȷœ#FfL{H,}yY*0Cre''' Y7Y~[YrmwjH|C?Y@)o23xA  ONRIy-BKެJɆY~*OcǒPwҡNJL:J ҳ@~!a8\m4 psźL2ݗ[ˎJe{r36,M3m)/eU{)N6Mq?+9|Q]@X #׋n-sOܺp%_C6k3k贡 n&qV6Z Hٗ;Eh9@|HZ 35&1 S־A'-*jmcG^Ml:k5W^}@R|3IK溜vg&@;# AK1pO4UEH \(T<~?Ƹnad~-]h(ܿiZ렀CrEN_F5H2.jV⑰vmDruë-%P"cdU޻c mn#zCk:~%bآ!?q2=3MvE1gIWfl=6yqf^X%(AI>*q(ȳ; 'R&յe|&=r FLM#VG!Tf+ #5AɋTt1Hl`$ S}uuȵs] X&4e tE wp1\w(\V8^Exa ˡASTzE1>.O)̺joHIF.; -W.~ ꞐXkYG$We׏TwJd1Lˏ &cU팳zzU{}?~vYŞor`^P^i,x3UIFhR݂jeN蠧AZro ME.`G8 i̪,I*@|@PzWdșj!>4'd<;vendstream endobj 413 0 obj 4404 endobj 417 0 obj <> stream xZKo7 .Л/ s(Y4պS7ޠ@R;qdSNPffEigk"r3+q(Hwdwk.dsnҏMɲ4AnЀB!14֡b[L t}m5oM}qJb@k'1XZBjAX!Wzl y߾h"Aۯو秧Mmeڷ9c~6'+ ?le\۾S}o/G5Q Ѫ-{xde)ع}n|`{Q# -qRJ!֒EU`'L!yWӿ=hpizW;!BAAwTJY aDv\\YwdtD3J  $^^*}Y L-ZbIfޭ|w6W 0XpK 4R^5sJp6q 34Ş{;<ٱΒKs!nM87HKіB5XO+;M02RJrb=z *H\ hT.pOӃ,yt0鹛K[nƬhMX5{Λγb+ >_Lq,`b+-&m2TuclIR}6g2k9QrƙDx QL 9M##6V0&vOk4ҬQ߂{Nvi81 '"TevGE%\\fq8F%,ҭQRGO\=̧Yd2Wϲ}f*cөv~͋a@YYZ̉;\JlݨZlJW)nB L R`M nTڛ|y<Q|ڛ&8gæ./9oz X~tTKKruOVWyo;ZDyJY䆄lM_$nL,Ak_=UFa0VүrŚN҅|0 )5ݺ5~ sOfbaD;0sb^n(COt-ail )vcdtGzU$U]$c6b8֘фAMC~G9f!ɨVtg4"J+kڏ3(9{\ ]V?dhnXkvP}_pwWKi!bۮ6zflo1r6~ܭ8SRn8AqwWC[RL֓G&1RuXuDcx2cx6`4hy@*bB+(L%8Pwr9-Qtғ/Q ':?86\aytaXuon[Κ>iO`"=X`8HXXdk(>ɍ)YeSOErX'?rpu>RPZe{П4endstream endobj 418 0 obj 1818 endobj 422 0 obj <> stream xZI5sSxоB,N88*{Zy2_`<_7}-cC: ߷wi> _waFn׿I:e(|Sv'1ҶB }1nZ|pilgS*Ls|^9!eG~h1>f{icit*Pj\tVks-lˇaJCqn"0RN9[NuQӬVy 'I*1tFX~giԌFQ6l}2B_(U%|rc o(w7˹La>6$̺8q*h*tᔞPJ2RD3>Cs0Sds`sJ .w0$07jf cfdqumEŰH[e6 u9|aU׳D&r%)2)Ic?)F8ѹŸlpc$x73FL18ϝl)! ,4cWlH !—!V\p׽`-\?R/(KBGhퟀkRxlIي>ZBaqFH۬@R U3/ZhI6ypH2tgQ|3K3$ OP<#N*j4Kt #'DUX؜x͆* R?Nu3ۚ)d)/i|gOKWcq Ԑ!^ĺPW|+3oTZɵ4r@a[Zr6sRh/؎87hW?D%Cau36U`W;ywq릐Bd2#7%!ő]0lz(UΥV}Yװ LDžC,})XS5S.Rw_p "ܽs-%H%@7R1E洍teEꇒH`WOpFEk$NN†Ka8Ճ)➠v:&  xJNU 38B>rɬ߳fs#mlu%/>Qܕi59 rؾhpK(Ӯ2!'V?7 %A A lB?v mP|$ҡ BS 6|Ws' 8ϫ[z) ֨†8ì`èJ8^) ï%QĨgmJkf g%^ ſ7}y/182Fy(.n ^sl}$H@rRy/ G`}<\$pkG,;|7D 1A3 ƓF\ak|x-76P"Es}AD4c(i{&2!W(ASlLgy8CJf% N;@GS'L dZZa R[GS{s9B%("fT3wFK6Nqs͒I#e쪾a> stream xZ[7~?EqLt<:1!6,PqKѧIMRPu> l ?^n0j~wH_[=+])os]$n|?:Ih9(VѮ́k1\~4_^ ;Y۰R#fdHHs"Z7NHg*lvN_e+,,{S@ Y*F2 |NAKzƎOL yt%$vcJ0) >/pYjq QgQu՛O.]Ii{zdĕ`"k5K THH* J:JH-qJ_Ψ QoòO6$'B >ÃEŽ_ 5o=\>o"`FY[rf۸V0g&4/Hv^ֆɸE?ap\ źn 7Y(M/uAC\nF(34JpwQ$Eε^Iګd(tȼyπbYo:V!fL81QclFUG`n0-5 !RpQlwKB_)Q>w}zԮ$0B dz<= KIj4㨴9 ϱNSBŔ%0/  Y%XO-<nؒu*HAs!x_sB"X(VPAn6`on/P(Gp-/a\Xְb!QX:}+6y:L!<4md m*Lݕo{ȕ'Ip%܄2FrA scE;Cll57. ϤP'Pgju)ECFSا$6tw{k檹G?̡N=s}L`5s!4YFI%w\-l۵C!HR}5,5"g~AʒZ\fRM S,md6Q]?4r}h%ƚ;hDO|K`p繉2~Mі#c5E(b"TpĆWYNTJآ[ K ehJ_ZUT)/,R)nn0K%yn^XϞ-7JF[GD*/.1aV辝 ڶapʾd!Njx􆠼ΫǴg9T6q31ոZ\/:{י]閃׳BE3Qx\>*TX3ү*ߧUl:=ol.(H,ڻ^4?NA'V*"XqQ?遴&(٦y_8EWVa8蜞D)e*/M-6OPuT*R]UZ \MN 椧tm.~z}e`Oiv{k(ha*57G8,^\0 jiu.ۓ׺a7ύ -߸SEoH!>̟ZrjΊA=jK).ЉxmHKsX, 84 BerO6u ĎE /lio O5)j?IGsirOfuSZ狋ߵnTms?1£'؉:`Fuv'j{180VoDf)! C71qUGd۳zp񔗇)٧V3j?C]CkCjUowjTnϷo8Fjw',?ʦO+XvY"c}LӴƭ͡Z^ jͲh%P҆qԣlQ hA2(?58,&z஥IU!zh&]kv$P;ĘӪhho`oZvOC2/{"Sf >tɇP6P~[(&@hzq[LՅx)~?1">ba#J^ƽΓ֫2d20̂Ԓ2) &sK.~Ze(<MXĔM.d{ u6ŦS8 Y,0)y_q-BUkuG.5?KXl\k@AnspG!\N d|QV7*Ŕ8k44e'<wdhVPРOjP*u+n%naxOSEWCߊ4`>1Аr)M&G!,WsEL/Rrendstream endobj 428 0 obj 2504 endobj 432 0 obj <> stream xZKs5,1'J,* ſ5Onj(<5O_Z~l^~4 k]\mh[W;͵^o7Fo=\m>ZHgJjWa.c?d`GԜsc՝^Qk*FF/6NYV)?L6FvymEM Yb̊3j2F27c ^Sh G[F*^ah.&,teXn9ee >ƚ yQvӌ51$89Bܰ- T5ÜN]g3>Y+UURzIPfbI/}c ӽaQZr=O[L覙s5qMp˔P:p/bDµ5k r;\56LґY*J=QITNQ LNPɥ`!v\`s(kad@27!T\ 1tsU#F18Ҩ/sCt1'_Ů7I>#> $PWx"+fMnp6G )`޴Bz/Sw',uc/Y5e~)(6F ~يl%_Nùub.;E pSS @cPS,bezMw:%$ Zk^"g K"%L1q9Lx4f":+ kyE'>'Ӵ3i i:A(Ń}/c?:xNOSKZk/Xe,!夭~G[Ӌ;)t'4$er=G@`EF?hӞ<V j&K 1bW:EǶzGb6ؒSH.Bew 5k%†LH0Gg6XoBy?asPtNgoa ?x0p_ [7b!фqx:d$2_gCXF#$u,*s`nY)>v&$J`y=A'~+Up19F;[ge{kퟮk2=gUA;hCBm¾=@K9ѻzbp~}̢epM>/(b)S;qL.q2tN0 M:nq /'0^7VGH񃣽k SEiwJQeЄV]tX@HTeWiuMZB,/_wVX-~Ek_<؞&ڱ:f#Y Xp&cc&d2gx}STb V1(Mʸ6I𡿕4Yw"\#U5Ji \(GYXܵ֠Uq0B6kr .)gZYMǡ'5@wFD< n^g,MKN6Y]zgb oHoYMNub9d %zRG(7AU0 v2/ M`Ly3?_qr7pe0|5{ .4bL=3e 52jEڅaص(m2/PVFy@ag@l5b=EU悽_E}4nFaJQY (odZ!m֖g}Ypԛ;/k5'izE'J G\`E;g;yxI6{rUЭKׇ;tCW>>CD"w嫚W9 MYײqv;ތ(6/+z endstream endobj 433 0 obj 2104 endobj 437 0 obj <> stream xZɒDoQM08664Á`llaUZTJvs2+)}HC+߾ջR;|:Ǫzpr lcS:=tOʨjY)^?HÅ5Է _kCx9o5;FpxJVN_I}ݷVA4BNn'KRjx}힢jFEx"vMGIJ"o.~.~2a7c'Ilfy Po5F^3ʼQwrޖkqljFQD wh#}Ѧ)Mew=-wk!\XymRޘú* GrXpiv:ΜE`q1EE]tPJX;F]Q,p@#-k6渫>(T<3c0ŜԼ\@ x;dP,x1Gٲ |lg펅.ZeٞFҌ*wbm-sld -3e^?؉5a쏙&$XC{dyWiPD$`UfFʗiev]K εVّR=8WWk 2g ؼegL*:*7r SV3ܶS7eDwGGʙcҲm+ mc!, I`zPQz:>wr(*:\Įgd iTN(;կYe\,c+F 0t&>I&AzL]vcIލ#hjWdI!ڎLe`>X]iȵ*LӐ2#ucv6M)h.QؒLɗջv/i 0ݓ+Y.YegY3e2K`1_q\ ȱWK#AaLشDt΃7E߀&b#':pGZ}dGS$8e m y`PLkv^jz =,u۝g֮w~~ m՞>r|ľ?x!\0ޔ.Pf(\,f5] 3=h%(Lt&7An#&S5ORZz Ae =ÈbL2u͎g״l}}a`!?a8=vj^uߦXfAm˱(m@ۣuWendstream endobj 438 0 obj 1815 endobj 442 0 obj <> stream xZ۲D}crbw>E p@, hD*N3YI_3)-N${u޽aoX/|4/mXrvÇj\вٿ،ohC/5Λ&ENWld+Lgt}2-H9~NiW~sJ4gY?Wp݀_ -_t`uV31kR0dkEgNG~jOdt4FZ*>ns~@sojfnȍV0/Rc? %4Qe7a j?ѿ;1-00cofp=|2X?l7BgG1o0Ws-v7[΁盼_3.(h[mкY!h^#pZ۲DH YU-3i1E\R/_NeZMoπK9E1;7e (-;SPU-~-L&]&tpgjrW%ByHf3` e0@K.'𱽌r#C;ݗ |ӗLȂ~ e̋ͽI2c_RuK*1ԭq>[s Aقb\5@b)!W抋a~Zz'ECw>\:sU*H^ZSӗgb @;ӛ4Q.. Z2jVf}~@ꌈ_uDЅ7_}.EP{ ۑ.G#RkձٖϒNgOv7qrYFh9j e:eN>uX?rĬ\ DR%ap6 #aD)Y0KVQ5=8 +%)H苉"\WJ」h!49_-q?_a B Z%G^hT:ZdϺ ʭɹ&H*^ޜ)Yj+7ՎF r%^+yQXAozH"YWU>oX [4oQL$1Nvs)X\+GR>}ezTxh{||R;WX/H>qL}t5=LOhSZyBͅLRO%ZB{FmvX7O.hWc_AVendstream endobj 443 0 obj 1884 endobj 447 0 obj <> stream x[IF;J;/G Eu `P KHye_UeO3q2oݖ|ŸGvm_mmx r[oQۓ|L˭+o=9۳ m';y^ ťkyˤEVhMom$*'?n8oۓ~?cZ$4 5Ӊ it#jjh'lk k5Q3*f|ΉW[ẆҼ*>J18"ʢ2n0U<riszd$`y(,3)"3(%zݓ$|`N݁(k?)Ir'M# Rn5 iYQwj$ӝЂ 1@QIʴ c˜+ތҚd-gg핫 <U育텣@U>l!k^ˏuo) dz&dQ޵l-[.zR.0M7RA u:eW./.[B~WVӛ,{:Sc.l)r Z!|6~̐YuN@˖S6+IuT1 Ȥ[j *Cy cz@^wB3p) ;lGy)8 p@ 軎qZ&ʻe'f bf?SJmpe!> +6 ÙݵX }e+NUZv휋ϷCt .*1@ST-,ԯ ERSV@63Lg ǤFRq>RN)MWa>tcrnt5b|"0w>vǀ|ǬaJ^wc{H/˔A-j5 2c2ٓ߯N5+)M#OQZ*qr1 NP70.Il"<܃Ѯ+/}EiO>B1udfx@AVP+~YAT |:|pu sdRp ΥrLmóamrW:ԕgHg2?$HpH(TUqwoFB教#| +3wFLU%\qLy*g*|>U0M>_ 8NTEV´xIzO3戊z'Batk\G>#î,^gײMrVY3)weӲR1ڤaR/_R)WpMdT#b<~[B/i6x|2SK]lضAdƫt4Y v 4C`}pF_^VQ˱Kj?,>!Qendstream endobj 448 0 obj 2244 endobj 452 0 obj <> stream xZێD}GbL/ $(\&x"e zn Ӯ:uTuoߧ盯݆5gc<=oiF5K8qc%|k`cLxIo9w?+ƵnMK8-QƷ_mwRxrZʷj|m{yhw6/O]iGW]< oΉ,L&Wq8_!,z\djgG_VPE1Tӊ!Z͔lX0)@N;phdme6fW̪,+ [w$K\HM{'%13hC :K`ogS!!1@I')(^lwjVi+l5Ɲ#w'e=.;ؙ%##Pe_pڬ],mu'N@$.ezG9 ~޲Xte' yqKǏRl,eRMY+bTIԲ_(P =J ۗu#v:Ig4z ɼθ ):VIχM~Dcendstream endobj 453 0 obj 1888 endobj 4 0 obj <> /Contents 5 0 R >> endobj 20 0 obj <> /Contents 21 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 45 0 obj <> /Contents 46 0 R >> endobj 50 0 obj <> /Contents 51 0 R >> endobj 55 0 obj <> /Contents 56 0 R >> endobj 64 0 obj <> /Contents 65 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 76 0 obj <> /Contents 77 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 92 0 obj <> /Contents 93 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 109 0 obj <> /Contents 110 0 R >> endobj 114 0 obj <> /Contents 115 0 R >> endobj 121 0 obj <> /Contents 122 0 R >> endobj 126 0 obj <> /Contents 127 0 R >> endobj 131 0 obj <> /Contents 132 0 R >> endobj 136 0 obj <> /Contents 137 0 R >> endobj 141 0 obj <> /Contents 142 0 R >> endobj 146 0 obj <> /Contents 147 0 R >> endobj 155 0 obj <> /Contents 156 0 R >> endobj 160 0 obj <> /Contents 161 0 R >> endobj 165 0 obj <> /Contents 166 0 R >> endobj 170 0 obj <> /Contents 171 0 R >> endobj 177 0 obj <> /Contents 178 0 R >> endobj 182 0 obj <> /Contents 183 0 R >> endobj 187 0 obj <> /Contents 188 0 R >> endobj 192 0 obj <> /Contents 193 0 R >> endobj 197 0 obj <> /Contents 198 0 R >> endobj 204 0 obj <> /Contents 205 0 R >> endobj 209 0 obj <> /Contents 210 0 R >> endobj 214 0 obj <> /Contents 215 0 R >> endobj 219 0 obj <> /Contents 220 0 R >> endobj 230 0 obj <> /Contents 231 0 R >> endobj 235 0 obj <> /Contents 236 0 R >> endobj 240 0 obj <> /Contents 241 0 R >> endobj 245 0 obj <> /Contents 246 0 R >> endobj 250 0 obj <> /Contents 251 0 R >> endobj 255 0 obj <> /Contents 256 0 R >> endobj 260 0 obj <> /Contents 261 0 R >> endobj 265 0 obj <> /Contents 266 0 R >> endobj 270 0 obj <> /Contents 271 0 R >> endobj 275 0 obj <> /Contents 276 0 R >> endobj 280 0 obj <> /Contents 281 0 R >> endobj 285 0 obj <> /Contents 286 0 R >> endobj 290 0 obj <> /Contents 291 0 R >> endobj 295 0 obj <> /Contents 296 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 305 0 obj <> /Contents 306 0 R >> endobj 310 0 obj <> /Contents 311 0 R >> endobj 315 0 obj <> /Contents 316 0 R >> endobj 320 0 obj <> /Contents 321 0 R >> endobj 325 0 obj <> /Contents 326 0 R >> endobj 330 0 obj <> /Contents 331 0 R >> endobj 335 0 obj <> /Contents 336 0 R >> endobj 340 0 obj <> /Contents 341 0 R >> endobj 345 0 obj <> /Contents 346 0 R >> endobj 352 0 obj <> /Contents 353 0 R >> endobj 357 0 obj <> /Contents 358 0 R >> endobj 362 0 obj <> /Contents 363 0 R >> endobj 367 0 obj <> /Contents 368 0 R >> endobj 372 0 obj <> /Contents 373 0 R >> endobj 377 0 obj <> /Contents 378 0 R >> endobj 382 0 obj <> /Contents 383 0 R >> endobj 387 0 obj <> /Contents 388 0 R >> endobj 392 0 obj <> /Contents 393 0 R >> endobj 401 0 obj <> /Contents 402 0 R >> endobj 406 0 obj <> /Contents 407 0 R >> endobj 411 0 obj <> /Contents 412 0 R >> endobj 416 0 obj <> /Contents 417 0 R >> endobj 421 0 obj <> /Contents 422 0 R >> endobj 426 0 obj <> /Contents 427 0 R >> endobj 431 0 obj <> /Contents 432 0 R >> endobj 436 0 obj <> /Contents 437 0 R >> endobj 441 0 obj <> /Contents 442 0 R >> endobj 446 0 obj <> /Contents 447 0 R >> endobj 451 0 obj <> /Contents 452 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 20 0 R 29 0 R 36 0 R 45 0 R 50 0 R 55 0 R 64 0 R 69 0 R 76 0 R 85 0 R 92 0 R 99 0 R 104 0 R 109 0 R 114 0 R 121 0 R 126 0 R 131 0 R 136 0 R 141 0 R 146 0 R 155 0 R 160 0 R 165 0 R 170 0 R 177 0 R 182 0 R 187 0 R 192 0 R 197 0 R 204 0 R 209 0 R 214 0 R 219 0 R 230 0 R 235 0 R 240 0 R 245 0 R 250 0 R 255 0 R 260 0 R 265 0 R 270 0 R 275 0 R 280 0 R 285 0 R 290 0 R 295 0 R 300 0 R 305 0 R 310 0 R 315 0 R 320 0 R 325 0 R 330 0 R 335 0 R 340 0 R 345 0 R 352 0 R 357 0 R 362 0 R 367 0 R 372 0 R 377 0 R 382 0 R 387 0 R 392 0 R 401 0 R 406 0 R 411 0 R 416 0 R 421 0 R 426 0 R 431 0 R 436 0 R 441 0 R 446 0 R 451 0 R ] /Count 79 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 18 0 obj <> endobj 19 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 253 0 obj <> endobj 254 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 268 0 obj <> endobj 269 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 278 0 obj <> endobj 279 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 293 0 obj <> endobj 294 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 439 0 obj <> endobj 440 0 obj <> endobj 444 0 obj <> endobj 445 0 obj <> endobj 449 0 obj <> endobj 450 0 obj <> endobj 454 0 obj <> endobj 455 0 obj <> endobj 484 0 obj <>stream x]1 D{N Pt4Cc 3$@8X)R,Ã;0^Gk"&"ƪۃp\YO endstream endobj 397 0 obj <> endobj 485 0 obj <> endobj 10 0 obj <> endobj 486 0 obj <> endobj 487 0 obj <>stream x]1 D{N Hؤq d( !7x,~a&Lѫ'$lVEx:RJ_UNȀpwor`/Wm )a RAn7{b50ىN> endobj 488 0 obj <> endobj 79 0 obj <> endobj 489 0 obj <> endobj 348 0 obj <> endobj 72 0 obj <> endobj 490 0 obj <> endobj 8 0 obj <> endobj 491 0 obj <> endobj 226 0 obj <> endobj 224 0 obj <> endobj 492 0 obj <> endobj 222 0 obj <> endobj 493 0 obj <>stream x]Ar0 E>ocƛdE;#gX0,z~EgI߲Uk6]|sM)+=It*+=Nq{/8B v~T|ڶr/HF3&t)Ey^C:R v4KDHf:"c*bD1  B41N\kYh edV 8F쀧 Q#]aUk;;Ɖvrg+W/Xp҆gg6X ${"3OuXel<)y* _y endstream endobj 60 0 obj <> endobj 494 0 obj <> endobj 200 0 obj <> endobj 495 0 obj <> endobj 58 0 obj <> endobj 496 0 obj <> endobj 497 0 obj <>stream x]PA  ~ЭmZMz14  z0e'C5'g^];-X#=+"&XUqVUY;OdV}Q3UЗVkz ){VhI#W4J&Q@MM*3vdIYNL{Y8ޖ+r|-%t XG >dO`e endstream endobj 173 0 obj <> endobj 498 0 obj <> endobj 499 0 obj <>stream x]r0 w? wt^ -<2+ҡӦOtL9T|Q/xKYo&E5׹|}Tq͇GyM~ (:b9{՞%;bAMi`]@0I{2t5@JMւ`Q2H: IH*iGJS:C+)䠁G gHϬrZ1o˙4~.^ endstream endobj 41 0 obj <> endobj 500 0 obj <> endobj 151 0 obj <> endobj 39 0 obj <> endobj 501 0 obj <> endobj 149 0 obj <> endobj 502 0 obj <> endobj 32 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <>stream x]An1 E9En03`*!oE+rLb,DaXGzp_D`0%҉knш0+Pqנꇠc/>ϒT\=](ȞAtw[/ JTdl׊y<5/)e|G^"Se2{u endstream endobj 117 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <>stream x]An E>70v*YI7Y^8""΢/34Uųt~>e7[^f^R|[9ƢKL귦=kcS> endobj 507 0 obj <> endobj 23 0 obj <> endobj 508 0 obj <> endobj 509 0 obj <>stream x]A ER[5iM^`X. Xc\|7'3O -aRwXN5(<#%ڪCU?^h4|#SCj0{ H2&ZcZM̏yED.#V")vhDqVuCZ-+0v>Uk:,_qF7b endstream endobj 95 0 obj <> endobj 510 0 obj <> endobj 16 0 obj <> endobj 88 0 obj <> endobj 14 0 obj <> endobj 511 0 obj <> endobj 81 0 obj <> endobj 512 0 obj <> endobj 12 0 obj <> endobj 513 0 obj <> endobj 398 0 obj <> endobj 456 0 obj <>stream xMMKaǟq"kॲDbB (lK!]VE,Ds^ YKPaf!Gdj_zj^{g/qNɰkӜ9Ϳٗ~UgXiMwxx|~O*Zkֱoq,㽢rTs5>UrYc״rbsVEh6Wa\+hyoe*_ZȨJQI>1ETsc !4o< &t~ +f.VjM$u"LXa!7Z]qB! ZC@,Gy!TڊR(J۝PeX~'I٬$~B?熷r endstream endobj 11 0 obj <> endobj 457 0 obj <>stream xW TS׺>1sMPE5P**KQ(w Փ҉REw{8)v_ڳץQ"ܦ˙L0#ǽB{=={g%w뿾yW lc۠2GAۯ3h]m v.b3 u*PNَC6ɢ)}h]P Z-;hl0!$9=MIIJu.Ae .*X.8QOh0"B9tN,,E,܇ZNi0 B1%xh,7͟6: C;tqWR })SwҡZ'HݝG7f}{[UYdwsZ94H㞉~ޫ`1?n-O`̑|?AYDuWQUma;g> Hz= B@-cMp@h}5aB8D]-Hb1vQ}!Z7 &u^NCB<|6 4Eh}Qj&O13g0s}ڇ^8<@[L1dZ~ g쨱^@A(UHboࡒn(*ҏ "&T!΍EZI7xC$]_Sf*$(֥k"EZt /g~.F#\#賸ԌH+K-ڍcsz$ jǡjѳt{H^Q[IfѮ(wMETEdo%y ^ MN)ǓUq"Ș1k{mQe72@ L2hy<M`q062`~=zzǖ)y|X}TwadbGG9CjdS&3?OiG;g߿!?ۜe:h\0$7i=MfRjjt0j&]_9՜1ya~6==m /슮m*F'd&=9HfѨ7JJ3j3 HgdaݹdW5CC.?H0m=timn!چWu.`1LVYY9C# ~{,^.&p3oc ƂR۞V{0u&Ձa|\DPVȂ2r$zNV^Lma7XxKdD¸j(<U!.*"F;lCrp"r$'~ay7<9):MlrbT^LaHuX2![uo9 4aHM &bxhjm+OP!Nm;SMH?O]7;*D WQ-1 aBaSlY~~io9֡>yyiMkb_0ӎ!4M+~OmBe1J`$Ey6 tpzcNstC5@ꕕC.A\ ]W$OU%|6*$>;uv}"H3btaoS4ol%a2/GW[ˋ4L]YR#JIhL壕 [*vv8  Hxw&xHɦ r{R~45*v^sSA$u5_e&`d =tc%a VBt7;:)Mw<y9Vi0%F(%?F!1}QlMVzNѓ ^f崡Eߘkw IۨpmEFuy"Zv&iNHNQC2O*5*̪U[U\dexn}!4?OJB0,mլ߱> V1s,CQ]Jxq=z L_Hru~J9X,,A͎*Ͱ/[aSBMVS>\csS5_Qs %?uIA TCHYo]zJ :NuV0 gv1-6>ҩvMC7Ccrlw(a.L֍%'5ՐҨԇRsk3vF'D׬(a+dqOT"J(f 2` W~FdZ"$"m8Kbh2*ҶVo0}IsK'Yܜ&I2aj慞-{ֈ:NK'(XȮ. h'|TI93XEs ؑm]{ڻpsiY[1onHߐz\U~H^˙+gO )-=qIKȧ6ia .+ژ['d*8%?=PO: ىbMv!3 \0@晎 2!tdDL_ۙx=>J߲́}#̕(sA5$^QU6w/etiӌ? Njs/'SZ;ߴ̝>b 7ؼ/IH/GtwRG%2tХ.+^#i H@!vrz4BIjR5P 2;Oxvtjg:u .Wji?Ra+cMm#mSN[ lm. {tI]$\Rw lNfؤD cP-ّQZ'ѱT=r=P!ȿ럮Ĭ<SMJ]]D61L%i Z;[,;EkM9$AÔndk8~O˽hl*mUVkR0(11Ve\nb?+AD"F2`6EtT ǔefHC1FPiF/ްuhLSˈv<Eml#DVm:,rfmqtEn2no/]eKrt{H,ޞx D}*pqQc+v妎#<]QGRʷ7;'p^sM>|&A"39}> endobj 458 0 obj <>stream xcd`ab`ddds541UH3a![ׄ_U<<,?Ԅ~O+Ș_ZUS_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@|CR#-MM͌MX8{{XYlz6USG|_K(7aRdiMS;:;Uhhknl4WǛgwoDݾ E~.ɖ[>o!nZ?TD/[roU~]߂K3Ögw?ѻ߹|\o86smf`| endstream endobj 80 0 obj <> endobj 459 0 obj <>stream xMkLSgQ׆P MS :Y^ n*&*jjihHd4f6]cibAkTHo6g.X,s49Q$bb0UZָGC\0ViҵnsFeU 1q[G37v^|Q<5 j"JM85j2F9)5S z}9 8 dg=X꓎{{is$1490 =M& /ߖL`26KEL̐# hj!XJ$N?nD_Gl Ӿ$"&[Q ΢r26<: 幮1qE[\f?X$ 6*";Ⲣ>ǟ )14(dT~F['7-\`a?@zW^&#<% 6056Aa>Km/=T78i_%~XYtHmU-ak ܄[nUp.֭M*UC,,R?^{o6BGȯXUX}QHL^ו88^_ҥ*fB a4>롗>f$'s=+-p?9=8nDBb#7)ll;+j_Z}'O.-^|N {IA~8@ 䣎_Giw})3،woT$DsMܪ:!M~ ǡ$~ԏ;C¼ mOo?_+YiBVtl(.a> endobj 460 0 obj <>stream xX TSW1psU :CCp NNs$!@c8aHGgUl֡CN$Szoe+{9g{vx+n]6SPw%+vss5B#+?d)v.\0n̙ Vx s' 'v[^>hKbѢO>J3D-2N mF*۰/p+!"'YJ•VX+^'Y)Ssߍ~l r v ٶxɤ&/b>cڮ3|23v9~<~A|L㉍bHl&&[[Ʉ+1p#mvF$;U XM|B!fkY:b=1p$'b>L, 6cq`1L,!ψ!Rb(&pb%1p__y;yQ-,, 'L,(S"@ :1|̊ 9C,zuN _>\3шU#~0[xđ#0k6lJmtֶllm,5qqC}9?\冩y ?澣 HĤ`4&@P`BYVZZ%l gTX6DpuP gdTd]L6up9.] =v0 22Nԯz u1]diCd~۩S$ O5蟲7{4'ZcW8HˌKgz%ad !y郋7gղ.SnCgpTJpzCh=t"8Faw XY^J\ ߐ%>Y#Z<f.wGdscp8xKd/&ԟ=D5/^يcƠd_8\^Ά Q}:C%1$-WRfFwopGRePt`XkXs~^q|N\']cR4 [mGp_+0ӛ"0z#Qi%د*-m(i/`iBR*idCԠP=@ ,fIZ 9p\ |p">g,3dzֲAf=NbxTyQl+A-(>H/9xC .6C>MBG-3ȴIMsi}Hn{SxCɩ COnNUXSJ*2%,wΕdw`@!ʘYgZ9:n)p,J`J13Wp@.ᮽ] OͼWo:W_ :Zhꥃ?geԂgzkpGD1kP^ Tjy:cUY(LW1 "|ܸ46GC;p< UK&Qz6+dmp5f2 #7U(H66*ev%PW<\Wil /0:Jռ?4m ;ȣ5I|(dY̾Հ3flVTeYUVߛ<Њ h482S\0'qtWgJ0*1Ym~dJ!}rЈ~>D@6 aM e_6@U}'R|Y"hM?!TTf]/wLQ}zlO&TEkc/*WCb}Giҫ T4 }] (7\GҮ-_ƣw{Nos5ݢE VW 3TdrrH#ΦGjpn+T,0_. 9spf`!ً&Z]AD&C8I0s *]/-б+o9o^䌜#EՈ3tG䉲y@\%?p|zpLcWhN(q-VIpKtU 9/k@3-x{Id4@U֕\^dK1դ/P$3j4>J ܥ0.|gVH> mL4Jrkm\; SgE\nWyZd\C+tIYz(% ˚̀YwECL[U\Y $bZYQS/ivI eEaoIPEM a`F\/Ȩ9pz~evB}ogwwg3{]]Ϊ* OV4šL6f#XWdZ>;=[-Qݨx>t|A;4AkwʛqYj2ê0gOVU5ƶrBf)J?Y88q*U0#[CӲ(dF7gG62}S_3ԍ@7BX(74TW704guchT:{ s ƊdƬpIeK6&{ߌWAm^E̮ʌj>hӯ*(icig Sw~|Ң8|>QP 8F:qf/ZWuӗz=^;'r.:y@/8o{FE)>q>ռypnn4؟C6<54dȢCn|AȒEM`Xi,W㇋ڹMC"EEd$U: kMadVTUgd&fгd>lɤS%>c)@bWN@zQ{^Ji:$x]h8 {kG$=#y,A"NG]F`6Y,b5Lp_[ QQeT}CR,mŕ98"Xa",$49 QZ#h3Frx;wnأ h3ZxLXEJpjKpTRpL(a;M!`'faG=VI%23 X8:{atI)PVQZ$qŝ,~$)S^"tYD B(iQB͑u5l闿M?\e:)99[|1GcHsǡw(8xW \xWKb&MR^jS~Xvv[.x<m3zUsHfcS7dc XEC>\ÁƦzfiB8bԥ4-ܦɀ^1> endobj 461 0 obj <>stream xy xeuBlxA%ЈAM6쥀B4;֦KtoJKKZBYPPguq'wߓquzqJ99&1 &9vٺ-<4f1߲i< &`}>;)0e"r>`19e9AFZz~9Q .|anO=0jIV #)!;j]B~zJVB>Gf朤/=dQQ9W̍*Oڔ"(LIz=';?j}BVJ,'_"Z"f0,^9sݏ hÇG;U^Xh ĿIIRZE6@Цm#TǥRҌK .zQXQ$^*bI9N6uAӶ/CM1Z{f}zB(UR"fqat ;?)pM" pl4}ӹ2WF<97 |H\pfyPZiD=m;,/ b;B 4UE_3d+u_X}G1Tx~1QeV6\z~3Y3ϭ=8ƏrSW4"V sP~ 7_0Meoy~&zS`3ae:5HK/m.HZBD1r@RBKm׾ ϜB368!{\5T,.LhnTwX's mc*-jՄ mЮ[.v:FsͲ6$.~l4oчwħedSr/` t>~I x |쵔Db;e&h‡5fë>f(2pigh#ڌ2Pzd_iE_b\0f߸GOݐMG?c򄗀y?Yy9NeH8F4-=GHJZr;vA\z+>lljxf+o!jmTtbVӶUтCf\/mbt?WK5 ;krBg6Vѩ09G{ۙk:Yï" `49@$ł/'7dj}&+el t:h .LDr%PE//.X"q䢉lhZ׉y^`1uhQIcʠDl (zPj(P@ ,֢K*1Qd!GOKo qjz\1dmx储9SwG(*±pA]cSqQb(+Z_  9OY9[$)@]6֣gn ֿ!UYR羝fʑKs VGph bW 6_[j dCgžgޥu2[Ačݛt/G8% dgkCC l͸t{ϓCh+ Ld&¥,Rf+tR_]:[8C{pZ!OgF6vW@\<_L]1ij'֓5[TچJMW &EU)\FQ~+@{q ZgH4T$h!M3ނYۅQ+VP%R"x@;x-( (Z6!v߁!)0+ LtH|MiU&99h3=vO*k/D'hE4zyO#w`B<eD4m+?"m/}R,02ym9jG+S zq?lj;&$f&"V0ԻPeٍdN3nyuIЫCS#>D=q,ť!>O֓}ż*޴{}p>L@6.znbtzN}1J];0zͫ\|m+npi,J|HSF(*1Kz ֗l w@5tfnj\JJDm2$A)'*]cУbf0+h#V{@3&f-6^^d}>oV< n:" ď/Is_G>MV ;8'IxƸxG7goٳXFaVzj~]`PM D'?)OCJI5/Ejw4@%Xh {{j&K(z{B5.69"~zWrVuk:yLU"nO^&BT&Vk ^b CFL=B鵲DHл=tGfJF!/Ԏs{j?8hAlVJoKwW{υw(8 L |qtX7pkSҾ) *}8X"^$.pVJb%{:&观iPYB'T> J}VP婩ߣFN pX v, RUDU"IVm8Wi p﵁aV&Eoul௯%?:%bVĪ0Z:B5w;>34(\ ^/SK=)bxw}t uDɣzˬhŃo)EOf`JK/FFn |:L^.oHhs$NUH% &PG3Y˕ ɨkJ[ q͑7RPV,6+0nLO9S =X?D.*cba9=x*8=%Q{6B(QRUZbI"Mg/7- ^Qd{p*RT(__ܼed Ft6wAUQe1κ_@Sꝣk؝PB[#Bb.5(@kCoC M @_n-zjCwT?ej1rCLd2S:a:=fdm$VU 8 ((:rI%U%'Px#_Z :7pq7XNz:~tz!i:(y17Y@7#{P?QR M{+:Ug {2!u^=GE;6~hu~4[YLe(#_\Q\x˽q3{u Pdr^i tf&yF^,7a  )֧E+kK\"WO-~^m"h0bʹt):^ʢ Ft79+:/;jzMjQQ4ؒP3*K۠y\RS@Ea,/Cp`Nxj`M<{n G7 JFW>sG&%/^u ,?tpjgၫ/ܪ%#A /4X%<׀9,dy7anlj @l#w1jLd+Zi0KBpq@8E8ۨJ6+#!YZ&L&h4Z]R'ǣH<].{}tP(7cpB{FAUBQ 9&،0NvRr[')i5;QS}6rA ;Ge|{=.=/^r7|]lPZ0@\\][?vz6AT"4kK'$eV $i?Dq|I '=" V ZR)(]Q#UBc`,m97x ^Wf>Fώ^}ѻkEYR'aǞ73.- |{64l}!`v0SBC6s"Ļg`*\%#ruz.;n3¨R!YEVA#.5ʌAcZzu*-y G7cG'Qyy F Mp+Qs"}#jC1kQ2U[M~@ayA+|)Wo 5)m  uo| =W'q87ҦۛL4 J>Q\XDn)gӘ06c3%1Lz D5 6: L r\;" T MFXhVKk Yku7ЌOI4-7MӍQ+J9v{- }n,*C":r ]Fآb(*:gi"Yivh]4 m _9s h=`;v6+*z+4.%]OP8pᠶA[w>AXLO%\>~*s 8#k~w(4 =ӭ!NBadʎJN+kw%I~$J zݿWȻKolܼy׼AhcΰÇ ͣ$$؅׫z68 %(~G/%0+'S4 j(0HzGЌ&,z/ S Nʏ+{jsNꇆ\G㭮pZH;^SOBsSjXru:4bJ]5A{&Bs6'kOnMicokp[<p8Prh Y.MO/L)_G/=_tAQrx}:q}Ykϥ vn|K1@0UfJ/\֪SJ\a8?e l1Ćʀ#0.l D~|Ѕh=. }sz5h!'ӳqkzфyXVE #$Dvh 9~fo y 1+^-trf_+ԛJK8@K]wלJj@]hN';2A3Nz߷4Y|̯~|w&Ho8dvٞAݢh*'MABl>ME'TUҪ蒕oD<;4yێ*qkf<8%k :4mb(#2x9E*O͵ϿP2@/=Ze,eNh5ym*TCje)zq3U#VGu4έ٪|COMOXN/ӓ^*Rn,Ha; 5i^Ss"5(V;=:+ىfYvbPQeQc`A#JPPԀ¹M>D^e͏zPo$2` گSQ鼸zc>Ҧ2jNM)a7$;T&QoSioEzE0>f4l3'-K[d(Lv/Pzkވ[hyҾ՟x^}7KSPk2ʤhOy ;NЛ̯*jnqՆ\| y77Ѭgnn ZZsyuF*W V}}RDeB"^QeZ@%h=eRmvd.knY*"f~}WhD\U(&̭4=J+aH^I#ZRVUo"(2,4 . *;057gwY~- zoF{CkfwXI4 khI:_>d]XJVa`tyƞRNzZ+%sG,,{C'qx ,O|hg( =֌|7 iث?I%[ ߳'/cc@ӏ8y$QJ\(Xc 'w8cd' endstream endobj 9 0 obj <> endobj 462 0 obj <>stream x}}PTeaM5`n#D@͠HH""H!,e ,.7}waY@>V%AR>3I R?KbDΘs7N{93w|,bY,6#fש&Vկ4m?ΖnKT5@7@INTcҳ5!Ea4iNSv˳|eʨm~d;jЂ.@4L~=fD<ȈO3h«^dG37N(FNPy$8]B_t \"d#2Kj^Q) <0?voQ +p8ЁQCkLSȂ8^9ŧS+s 0,rLИŔі2&oO+諛svIU俥/KAeg2 ܊P"ÚSls@K6oE/;YT9#נim-XO,yȳx5^}A J3WbdddH͚,Ҳ[m-g'x{hD^``&5k %Eg`^kZa-wrLНN? R_ɜ0^34MO4fs BL Ay>|hU+0U',qr #t+ nqЀN@> endobj 463 0 obj <>stream xcd`ab`ddds4T~H3a!k_nn? }=D19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;ML:)槤1000203100qƏ|bjIoo_o¢VMb)ݫ6Քtrd/mbMxuԝ]WS\V0}I'ͻxݚnUʪ[[ J[Z [Z#K4̝?or}7|מ?W3|uGCѶʹsϚ,;qʺ >ES֮;ayV8QP'ZR]3Ї%vMjh L樭rSO[;oQkC<ͼZri:/;20!ɏo-^cmoFu5>?ly?N`pq\kq endstream endobj 225 0 obj <> endobj 464 0 obj <>stream xcd`ab`ddds T~H3a!Rnn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##羗d|Sr -*sdaly?ξk'ι<<@Y\ endstream endobj 223 0 obj <> endobj 465 0 obj <>stream xMoLu;n&DDEEbñzr=zBKiR]۵l%NB226|151o|W͇$yIu_ڭkyNh=G;pIڝJ! k(/e:TgkkgYXqsĜ⛬(3ZD$6g/_HVrNNpqG]d6lkV6G L5 v vg NuDm'%ONFnER-}A)ϮdNľtkNZ,#v^EL&1Q򧭧̀Hz,E0o57Պnw`[Ї|0>J]YIޟ% uP`;&3.ScS\8N"2Uw?r ❫:uZ`!$Ǻ#ayfV+\8Pxhŗ >dk{Ws /Xats9=;>Ex#:F5\A)S_jfVjڼ_S#ji0<<aMx$OGS\= i/j>:l~>1@l~mh: k0RX ZzW+?)7-Ujw'Dgss;]P(@/[_I\d3MQOC 23RSS$3ZnTF=HPWgJdjǃ=2[9kUsD|6jetf@SB%l0Ŀ3 endstream endobj 61 0 obj <> endobj 466 0 obj <>stream xYy|SUOV\&[P;kM%͞鞶tIi -#[YDewy2(;eq{$mos= 7x^dєg¿>΍scq Ұ^)2㞸>_5ZehI<'%)Y5!nbԔӧMzgGHI͌Z+MNȈ?ңVJR 3ҬO?-ɞ}J4{(Y49jEBnBN~B|I4jilFB*-ʓ&D-'dƦg%nO'74=!775)6##63/7%)#6!+7%]9M src &[4ayRL򊔕Vɘ9F(<#eGy1yVVVV[ϋMm=ś{7,oo*Usży^-M-=cxxyM|os#ZA yu-aCV?GFF|8訄я>rOѽk墼&?xpl##/~M|㡎1ό)±?z -/ʖήw 6Nhc[?Tyf-#亠|+p!ل **c-++QL ZcAW%lbC`+q: zt} r|}Oy"X'=%|j'm8G:Vj2Bnnwb ET JjS[;.XzZJ @j=:w:օImS6,Ca3īE)%@<`A]q`;P^Ej>Te"z߆P/?Ӣih#2,GEUcKoml,kN2RR1{<7e 5ֱb@OLͰ]Ȩhr+ċ_bMi6Q xҤ6A!UIg@g>@,4.DH{޺-T7(3xt ֤+@N6 B"zM`OwExf&)y!ndP=sI/MշW/EH$,` LmL,[JU`,2,ֽ F"᭚[>? G0x%%*#*3kXb|DgUsMxI $PUvV^t4.gӎJ͐˅l[@0Qޖּխ$;e%+n WO'nHbAU.*:홃#:jq>:UTtY2Ifhj|[V^@ K}tVc};ṋ2:@DBh;莰_X93U؎WVz Y)YMC& e*T3x u2!0MROo&7|gi  ۭs~%Hc2a. 5#_b޺@FcՉj&~2Mppm zȘ|^pY\'iz]d].Su^%]#gCuҶ'n {|wڮcꁖZtӗ{krU@Z*K+gbJQwh?y}p0Y!E2'㓏/zRmK=mP[[R?_ tہbwT-.>ewHg#X![үbH/cqUۋ$@/9qτNw tΨ3I_RD4}D;j?vD/ˁ~[*;.$9V{2ruqY-n ݅V1 qS$9v+@ z{!Ul߅+KlHT~pѠ52Q/ji%v+]o(dcKe&Goy33hl#e;joX|SnN*%jT#?g(PP30MKRZ#-\\1zGڼf: 담t[josnu @w# {E$*i^nkY-D /jr߮g[o1{ȽA?)@p0q+`칌bm醸5) X ;!F eTԢ %hH#y j﹊2?pQ="rvIIQTnЦ],)f~ϡsa0Jz-PϞ[2'ʱ[Ȣ"2й'!P~+dp0LPZ{3rw5B6q:@´,WjMRYaVVC-8v"›?,fgb/8v'7w9]_|oCn Q0hT<aߝIjc! ?ʖal4wף52UᥒI&_$s͇<`&\d?$~XhX4hf7ZQLE-#m:0Uw3Yh5H eTS"Q\l? j_žX$~̿pR30M:L82S`;$ށΑM z[f # ~gU =LY b7;wƱ㓘[i\߇7#A.%2 %aJGNXEG'Y~^c6?[d/:e8(T \Y&۾K=etZ+eKs r"5닏v7phogP3z,)\Z=o}%^uӧhz~8ga.3ѣ6omXBXUAhAZ ^gs$sWܠNhV(]ށxW P_\zbV}@ٰ~̡sV)*I;rL*J¾ϳn==Y#bZ./t_lqvVwDkCUˆx(5#Hvt'.Ƃ ^gvf&v6m0$H}ޘJN%Iy;8Hkm9mww%VOE``URcx/pyg]A~?)e: o{V*x㵦ʖں=^g$Tg1bȪ㡴?=h v4KwnlּM$%S  zG;:l T6K;` L=+ݴ@ s˻~2f% i<:eN75R ?C1#n݇ACPN(.~ډY w>UP$^/ rԯ|Ur"3U#F.ee$6 ldMXtLJP\&W cHEzƢvZf9wK!P$D :ʼUfc .'y@yJ4S9:!G} "?T+bPQRU"s_^ZuM"m򳭒4{L [MX[4e?oVpN"i/U (=ԥ9r ү\FynWk/u0}Adˡ|w"N#@)jڮ h.}U@-V^+s~f- VBNG|,GU緹=b&OͦRSKSl |ǿ:&jʭ̬mjk"bk+'M"mh?.SVgXB"݁7\6RДp|{gW.מNLXxSgiYV2 IdT:[WCc5"7\Jy>ٴZhJ292ځx-GW^jo1kjAS0D Ao ~4'kΈe'ӫV=Y0Oat`׹b^DMU%^+p{-*\NՖ<`~/x[*E"|oƓ?@S};pJ7Խ죂umՊZQT}Y]yȚbzKmV7 -e|yͫ!Z_|jvhL;oe+CDLqMf7}aaf ayqKVXBW:zDI=Ԓ[pZ w2X/؃$9 E|(G/T_1y/g` )]򻂻to-;&v`ՁN{"qSt=3qz|<)] \Q]);MYRl40/P$݀Ƃ?%iL Ix0&RpSgQyW ۡ. .?\9zz~6 =U1XmkSi1oMOY/_ Bh|AJw>^}xmBŠrrPA& $xе߽FjLtYba"P1nv r^e8;44zi#;F羨 endstream endobj 201 0 obj <> endobj 467 0 obj <>stream xcd`ab`ddds 4T~H3a!K*nn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##֏_fn"˺//讖kV]Н{<_ ~+Og?uB e` [ endstream endobj 59 0 obj <> endobj 468 0 obj <>stream xYXWמEYGA GGѨPHoK]`u/.D ƮX,jZhb4hΘK ſ{==yeڋDENNS&k?ὄwLRL sk, 3 82CȤ6vg3e'LeA-P)Kj+%Q,5BYQ֔ 52QkIJ)z^U&&I&M?44͒^YA@10z>I}2_cmin0` ;x``t4I9>l6|C y`55gb]gPm܆U{:|po x_8KN#NԙbO9SW(s9W gpF W &pf *wQ?"_*T/c3e(? $jQ _E9ָ, "kא BcX^g# ]UG Di6'0]8@JGQ4gT9ڙ[+cr 5ӒF.R`vfU X7.t޴st,ԢјCV6ŦXD~,9gvwxꍛW&Or\`x+*FnUj~Yq*J*fxTsf2bBZt@.]ʒ-ߪ@ƒ- x0: B/O|6h;b&x:.j[gFdD6"}a>Põ.d搠[(c/^8s',qXczp|b@g_,%OҊqgcǛ4.0̾WBPBi @E$gY*8xIo+P zq5P1$eG _){`; C ̀3`<汸8+Y9{Ou"V; 6~7.a{jiKB QY_zaKR,"ގ" I.-ݞ\goC~7HV?]qAea5T)cڰL܉|O?e@=nkb`UNh󡞅[m^!p ରLi_Džsifr{D#^P<1sQp9?xXK&|n]^)+S ?^-\z8S=K?0ftpj ւ[%_xC|`,w/cψȉ2x͡ɱQGWb(< `k{PcAazOsMR T @0C<>݃Gq*=w#"4S8 F Z)+f=W1!`M?`3zs EMD{@Mo7fsnQ{<@C<3vBo= CXt` 3n]H+9Uj0 QD[\̡P(.e 'iu=H0#AK6#g7C2S$K ی<Ӑ1-]+ "TJnVopO-:E3zW,ZA'Wī+&AUu #8(M:;Z@yK"dv>; VY\ҽ"@ȸD.):|bf.z0(OW#ZUpk$r >çaF%~-bhTA aqK#9w|UK1kU&S.n0xB``\䖝PXPq^^qfSxI eIՅ5D, @nA] }ͪ陨KO>ɭ=Y b|)RQ^O teRAVJq7{\nuuGqrR>Ғۆa>|4i:TWbYzW_i]d6%>_-dcFe c-=WjN"RE-n, 95VEJ~ E4PM9ְ _`wX?,XT,!5<ٰ6-@ NF_bo]K V G8vmЩ0r&0RqK٬*4EΙu:nAw((9Q,3 ^";u%tF ,8XD(+8k7}evG󛚔|Mi>0C3\lx՟y U}['%)/oοs}1HQJ/rόHɋ)@DU7=ǝ? }DѹJcԁ# 7mE-LU|"= 1\“S3(N">41V{oCqL7v5BDk\5JB-0Ԥ#+7or^5_D7EKd~.%'ވ+CQrEȷ»̷>rb.W)vEcg.*.!X%/ɭ{,RbhoQv' AK i!!!!\77X Wݮj'o:>04Ym\MYu;8׺CrEܻV2);૎B+Î+br?*g$m] ݚqS'n@}r̐$ewd#|k L̝1oHx\y0D犗i+=4;ߧQr p!:dDer030I;Pk XuVo酇ĺS?b=e%٫M+XYQ2H x&h/ :Nk|Qe{oGsRk{;Ֆ?X#6?6ׯs8'?5j5FFc<{1Xpه}ft;4`}1XkaJʅ(}:]w~Yj'n*攲U?F~FYۭ5 :T[zImy jgp"a4d6|CޓȝŒ֎VG8pX.;o ?$q T;}^FF دejQ0; \#F] ++ClM`OZ0GZ-xK#([Qxv`czϧ7;դ'l23,Dg ^Y,KO˕֢\e73b}` @KW^ԞLZo7Ϯ5{[iFu JHJ'H&$`o{GHaD;vQs[{+g",z=ڝM<,,(1<&õ/IKKFᥑչDw]ܸqJ;'O\M_Ƅ9RQWXX]ζ͛V-5'Z_Y`ycQQvpmjS .JQ0Y{. *02>U/}#>):[݉v*T&7# N&#+&W]aHs&pGL6dh,`0Dp~m斦#cĨ$HB ֲeenIQNz$~nh{aӱWS+^! LP Uǃtw9vc4ݾu=<s}>:~AL}WxR aTc"iȟ'T봝,6(,&=05;Р1Ԍpvs8x;\n;v}À;?3w]e\=sӖlZeO3.i߀4;|*,s{X͗l^U#Wj'+NڝsC{xoG@(MsO[#] >۩OVX|y9txCҾK cN)0/ĺݷ}f߱N ?Qf=KVCWWe(<+{wWt$?aO?_wΟl5/l!447~) p?Lzl"yz #[ t!ڇJcO1Aa5ʲV ~ؙq`7=$z>y;6 vr9i9 B,D~:i>RVFBwR -hΓG$=q½9j.++hಡއ Th=DN*i=QH8%++PV5S(NvѶm'{~Վ. }oꎶwq_l\6~I~_l傡L#çw.کeߦQ_W,_3KGzT%?oJf̋F/6ӥXGe֣]^ }~3ۡDNjfԲqxG&]Zʘj2P]mA,DBID3EbI? $tOOeG2xTkn<\VznбqJFY(qZz0T0:#fa >deQt91;aF8%hwA)~(j[3 1d9-P R0՞̆ x0F*Uݕmj_4g-r>\SyoƼE7wͲ5 endstream endobj 174 0 obj <> endobj 469 0 obj <>stream x]mLSgP(.$Ɍ3dFэ6s*:PoRJ{n)}$|ĸdnSY0bdYV]r'9?98q]㽷i}f5Y$g\(`AA5UH_+`%bES'j[ZR]m#jjnH \T69H*PZn%ݱiZy{MFZHup \%hK/p_UuTI \M +"@`WK#ڹzmʰXwYXvO/bX9P{Fsi4;_='f0e4pBO4ݜyIaK=`gsoR* *"o:h-oUYe! ~k B\8oiZ [Z]b8bdvN)}yIaBcm 'G0D";p$V%J* \)u|(QxCF'2/i^ov{nM=vA)㌖ىV2awNID>>feW:F(cktQg@0xS$!7&\q6!iWZL]YjG2PE İ6)A%WcqС,~ &0zwT ͜ GC3_F!' eLe6 5hpu}#˛n.=>dzK {"'Rr0N6S3U[{Uh-Zʯhz$c<3s F[Zպwr&,f[ӈƿBx0잒L-;zaZ 8;>>{f-N#s`s86R"Ʀ? Βd.80I6i0o,em' <n endstream endobj 42 0 obj <> endobj 470 0 obj <>stream xV PSgO C^[}jk=:R۵j[T/\IA @BNII8hD[v:Zcw[]۝n >n켙I鴰Y4:%YZp'kR>wgEaZF-í?je/\:v}9WˎMa /eib:6{+VD^/ naYJVAl"-M-gg+xɜ]*pe,>-h4&TKJ_[]4Z*m3m1-NJˢ%ޤ%ޡ%6RhhӵtzTihaZ1a[¾m O XqG"?gܰ¹Cѓ@C?c3LUju9,&di5yMmCN3ۆÁ}G/6ˬJ!5D=G-1qȟ !:mCXm79Z8vuw+i&_䀠L"m&q3mjrJ.TB,:t#T\a\ JFA%zDtA0g,6CB.MM]}ۈ]Sp 0P(\HsC+jThD=h aN\olVpqf= F}HDy!Ob͗bb `R١@ሇQb%KPOLE?2hTZ캑ܣ3P'n 2rsd8QWIC ˴:LԡC~ 7 $E:szxoVz$r)1mh7sۮʬx+ ' 6'iFRric4z퀹3(  3hF(!Ŭh&A|)JQV;xU}NUBYa6H!X}}F_'j{%-؝z6؏ y}aS|9wnF_1)ȼ zCy!]x|N e(NgқZjJ\s&WI1z+|Y$fx 8bj5b٘NYz+=@99nQ,gʊKfB#Csa[60N#X>J #j21u[` <vz['KXBzx^jFɨ|`0? XzH%/4&(o' '1uztIm^QhxB[J 1P*.X!/N'9IbK&}A1h!mxT3䀥?f6зw?;kqѡBtoA#ǷU}]!O>N."]a #R'd]N_koqL\%.^) ߦz7IBJ/{hV>#->i[[(T., BAWe=fjyͪfQbf#:T 8bT(z>dSȭpkƐO(AקU{ ɩ^9K\1FY7>0CL;_l\Nب.pJ <Nj1j0Z 0V_EH\~g]1؋KK$ȗWky E54mF׬ #}W#a1Tq YK5C+nL(|ϧ tqr6%q Q83eژJJX+Lrڛ,>m]u`5$gd3]_(Z^2 RE F(Bxl.[c]8/3ʼn7M+[_o7w@ QUpKYCSPdE_;-1v $FaZΉLik(SS(BʈikNfX䢩3jhbjbqq?`tW6PJ#SRzlDh^TpiwC6`\E zs3`(gurdl|8,QʋnF[sKXH2Y2=0U"j$A=<~` ;H.); 7*mpe+Y=SQRFDdGtT`"eIo%Սfy2tg  txt*iI/1B AsI,bT§"oPP860Q ]d n 4zI.eœLx[t%[4&z-DY?^8*@ԇ[T:Z}N~wZK[;%7Tev7C:\5G)cݓ)c EC'D#gOM{lz&9J'6yxﺭ--?_Qd7971JGJΨ3 ӁFEJJSh6NA%RK,r9*[] qWWNnQj=zlzأpx>4$z=O~F)u_E`f&,Pb/Q"ܛߡGѳ( RAuWVT9ZZ*m"7=MĢzJZ 'ss{"{QQ4?r endstream endobj 152 0 obj <> endobj 471 0 obj <>stream x CMR5%;6/  y^WRmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR5.CMR5Computer Modern+12 P;zrp~oop}~poo}p<"jDKwz_̎Ťl!Y_ŋŋ‡ #Y!< ַ UaxM{7|Xͼdzŋ #(=)Wqlũ΋Q)7QK>JcmeuCnb  7 } endstream endobj 40 0 obj <> endobj 472 0 obj <>stream xX Xײq`EDi5=7qI1 l*6S Ⱦ, Qq&FM}Fc&zM59wn~>>#c 12_4}xqLO|Md(.C0Q#3r, $&`WDWֳ'ϰ6_onL_;y{G[ ִiaaaS]z=aywZ Pws`U.~Ǜ&oWHG}G?0s/ ٵym]В!B\]WFGXsZou>6.0VAc/f''KZg ] P:o%ľ ٿ-Gа.Μ^Y=6 ?aE'^*ŋʼǩIpuhhp|EIBR挆 mj]4qr?ߠP-m.f1&YFr y1GNw-Fyp򱳩8gU'i4F9CMwRZfɨx^\&^'4]|!mRCy  =ԛFB40Mp*EfORD5PRYiLFl1CF\g*XQ}z5L|ROPPZ;)(N+ʼn|v.h!+pw =Tn6. ,,q"%-bHg#fH E66t{fs2hvTwTEߛYCeS%U2pGTRV4)Oͨhmzbb]o򱹚0UTuMnt&̪ R)f"5@z,T)` JMN@&wNb#:۽9\t|eT%ڮtiu_#i7ǒ!NI^=DB%7V#O+k -GKW)GeME7u nh!ox"#$FOwe)nr_+=8_K\iTQSn;&Ϟre̜MvT&=Mc$$*Wɀru76.B9m-܃p؅翑oM٫dC<{{Z=(L8B|4^ fiJN*Β 8э:$A/3q.O> R<'9ڢbmJЂ J˫"\Tk{Mm[Voedx%EU=AsW[w߿՚>~>nYęIF/5t06m:]Lgzţr;pN۽D%j8׀{VfЉ[Rsx~^G࿟oEBxD!=pjBC٨瞽~ ݆E4<}(!bw7 R\;OzTcÂpMBF74V@Gн QƓHӬifJD.vcbcPoYQrTW"dmg0| 5Ջ}uc/N(?Z6?k)-+R>Cwɓ[r!-4}:T7HhDqK>ɍ_? SWG G fe4%;Ĥfl%MV|C" oJz˚e"gFY=$93իy'_bAlүg$_,9CC~XaaTuǾU''&SFq3Τǿl[W_Qif< [v@=1Ғb ܊O:zow=]bƕw ۫3sWWm r_=}ĥۋ>IA{XˀlMs ?\Omwݣ%$1eaϽ%+`lu*TzLXQ\/,fܕ&RRӀ:9NIu%KD_L}fw׺bG  Me1.#2M2DQDSvn)O,Z kxkt+\qt"I Mp0Rڞhj\yshd~7V7o-Mwl\UJGbh0H[F7E6nb?Kޥy9G9htQ֎C sU>~[+ nbژtevrZ> endobj 473 0 obj <>stream xeoLuh'b'*fzl3nd8`tvpk 1럧p-W +--L(llL|DؖhLw]®17O'><qs ?X` "jR,_oV/]"7٥rt)aMڝ}iy5HyH}n71޿K_+J. zͧ ^uXw8 a8x24vk.x2 f7v!TyƋ ip綃3v%m49Β:C@g>s'F9~<'_ 8N/n41pg{-k̑EL- u~!&2+ᅆ:si3;TpðÉքqQKPiM!7.] endstream endobj 33 0 obj <> endobj 474 0 obj <>stream xy \S׶J<'88TZk눢ℊ*  !d%̣2LAĈ󬭭ֶzV;XvhAg"az1]iG[{qDK!]M2:S̡>2Rtp@F*G- v̙3&Nuti;?'g2?@N}"bmyk<_ 06?'',vQpPr@۞ 80$2'vYOX0 9/ٸ09lQ%DE{xn[g\WX-p8~O8eӦ1͙o`Q f4ìbf2g0㘵ƌg1'fld21gf2qd3S%Tuf)3yθ0˘rMcz3}@?X0A%#g3<3bf(3LGҗq1a̘{^ z]J3[d`ǼU)ڱj*G'{?ۿڢEo0XiHV~p'5wVV?[k˭?en9|1xD;Bb#ťR1sܗq iDOkU:u.pQfq}spH}h#źNqc3Hf>6h/{x|+(#u$FfiI}z`2zyJN߈<ȝ=o\К>}XX5W ia nCmdX2/ܝ_oEEeKhVxG"։}y,ťӲYlZ6^8.miB"wd?][|ob:lG7YѣVK2,ďT- a qdyq,!ǷqOq@ OpQQ~He#U~6qӀ0D.XtTF5$;SrȏMhRwV.;l1=D'Dz\8ي4]\b iid(fÌ.O¹Ld_Gs<3FnNԒqAb0[brTNp-'d󺥻tP6k; !*[2fqKMQt*E+a|f>"BF QBW,̍<~mNCd]c&6P%dex]J,^Q|`P ^r X܀w`<٨rr/>@;}<ùi}bx $-`˦ů/B|k[+,)(M,Q<Ă:!j@68cOڠ(yu>nT #NCEG{I1.YWNʠo2bi1p:/eDJ'NĦ <+.1^X8Qaҟ3v)>^贔Y8zY9Zy+>ќ%o ;tc ]V~F Z|/hyGW^[N;ö .E/ݥڈU/ lY|CS8 8ڽ'5*dTݤ75Bܠ2-x$ˊ_4s &[%+ ՊXSeh [-\ VRhkVT$:o2D Ֆ$.A 6RrRALSP\hw@!]3x1\iDohiJ8jcc|;q' 4@19hX )WbĥYt17B.Ry7fgws9#OA>cwZfFI6QEϿ^s~=̝mg$+pF6L 0آҙ–תSZMFp$qlfVK)ޫ{5t+ +b)̂J7{v鬔vF].vj!=whjJV"D 猲:M x>{Erh@ QXhZzNت'uɍJ*-}EIG=yNe4⊃8`Y f X66(UDHT,Q9  #"M1+)U9">i𧙳PMrSءp`쇂<30Vp ?091lԒQ>3JKR'jyCKrr?ut @(-C5o1B.ѽ&ąX_6O鲡.h*K>]n1Jb.ۧozh4tZJqWp8c뱑8g.HX`:<&Iߒ4ߝ`CPx4Co:^{Ҭ&[Y}&y7hfEqd*Y ʟÌj" A@}lsK2{N!I*K Wt)`B]jf~Vu 4q {b.ݾp~<HL턃%Nc5Q½}"m9bD| 8\n.HjӅPM1)*폝|SZ]xK;-B/5O}Jj"i 3 "`uZCML x8:ej)pQbMדBYX/k]oeo^߾dh`0FFa4E4ZVtk)R z*wA%jkU[9 πw1)J)6P.BV]rb tYʡ6~#Zdş~Iwް.g0b7u2X=Q<^{j8jF2X5y!o3+j <Tq bi)+(+X1$vj U:݁̽z8\\)9{º-RmVB$@aK:>^s*u[N(sN6 "CqjҲHӤǫQ\#hsR`?;Rٰ7艕ΏNYkw1'I;[kwG #Ti#6%1P)tJp:+7>\Z/_H5އ-45sTE[#R?vE 1HhEd)W?!!k$l ہ0ĜDZeYFݵ׸]__P?xObx`!!# 8h}+JCWu׿lK^WdXIM c޹a kHأ8R_ӤkR@ŅWZ:iso[Y9o̚^^)dT;BBƖDSpCwtsԫKV!]5W eP;'BRա9,^K~tJh/#qI[Dm E=0`ze˴q}#y <pQC7O}ww;;h^9V8Lx'oߤ) tVa֤-o8ШtPtOzJPRS@_ Wm E3!̈u% o:a%Gcaq~& Qn%%ډSy2n[Flv='ëpм decK!LasecccJ97_RV;h\2RmdGꞖvwOz}npQ μO[ҷ:*I.vjtz1y;[ U[Sud7$,XJK+a7',?:\,ufm~MFJaxhI&stYT" nw!eg2iH/r';8 . GH⺳bKq&?4tF\r:/)O j.%w  ШmԘƱJCf5yZR{$SCaR}DLu^j48ӑ":zzq4:LF3F)ʿ\9C&MltC 2鴇 [61[kNM7e_X$/6+졂p/t?L={~݄+Us]M,)bonP!ə>0 \pM$;zpwn!}qF$|NN_Y=&1lX=NP$V[gqw&LȬ϶$O>"ɉsكN5:uῦ(|FiyӴ4Pȸ uҸm?~n~۽JD_µBc8DA^Kp`/ޭA6W=.V drq@5^7'WKʁ+,VgN񻧫K+^RtД+В n$@ٰL!4!露@WzPi8]93~ft? x EѦqBđS ,TgkAc#?j!N8PáښS[ѣ $cIo #K#Bz"RI2' ;*T"YJW0cOQ_Q_Q)2ʤLm+MѮȀ4z^> ?2G/*#ÒAO]گPGh4BrjCRVԞ svT鱤/H&:ɅIeeVX]!&JE}J>r@UJߵK%t ғ@Z=ʒ9a ~eScÏZL%*Ғq:*LcI'FVW%J9?Y;UF^ZK[cʷnIcں] 4pMOe){=v'KYƝ7p =y3q [n%B|ėʶ{g oTWGdž@ _|}W<$[Yo.245Eq("H iϹO*B[P3Ƴ`̷ΧJ1InC _Pzh∇,},ms\r >-.܅Rlٚ2 8sǘps+/6rƋw~ooRhn(P sC}trid2j[d(9p71G^D'ݒE;`s.cg&E%wQb/Oz%+c co#T콬,6_GgJtSU]*PPkB`;F%q#Cz(w4{Rٹg1=.qJ_)l9j*ф%h6[>&'OdoVW_؞r23`g,WʂBٜlFE-@~ D~ endstream endobj 118 0 obj <> endobj 475 0 obj <>stream xUmLSg/-)2?r lTt[tLFfkL3J)^@"o[ BuNc9 &5m0f14pc<} K)~GsssqOnbB\FRGDmQ<_[ףq ǨOsroJL&&2&q0MqAkz4^ a'AcqIa =kD዁,+@? QCnC|l=!p_ӄpn6>V1/t~tS(z$z=1ǔuOI峻1z[>n^mm}Ef ^{ lN|V&m&)$tߑ.H!է.bW?Z}3? nPVӑhrb^H^('Q?8p(Đc$lp: pni| PpuJ C#8ӯ3 Ol~N8))([6ӯlAHu_p)isІvcv<ֲ6kʒV,Ixrs9~z6K='kӮMLSWb7  endstream endobj 26 0 obj <> endobj 476 0 obj <>stream xu L[`u3:4ZFAX.m(B&Vb`km ،6!% MvCZ u6mn*I5t`4~DeAɶ3ͯ;H~gpx EP]yit+<[e$ C //{s#FϬxHWq}ƆfcjV+N*}Y) *wh~R0GSX>)ImV(fwjE9j87dV' =j^il_xOi4,=guHjz@7kjC=8&S0hցM`4i:Wg0u^qJkTԪuWzFŠ7锦> doBQugU?L4-Htf#$!%d#dL2!D%h'DtžpHCU5kV$/Y|QfeU3>xOzV~P4_ɕ0,q1H@ǍJK(Sg :\N4?`q]3 g*B,CWpWrtiAlySeh< 鍂:}U.\rpr3u7+qk$|h.PJXPw]+"󿓹&='0[Z؃Jcqv:N!9JI|Cy_'s  f㶺)(izn62A#(K<]9UrMQݒx.}>Hq')xӋ,> RL⊆ R\ K.?Zׯ@ kG1}[pX6 > )Mo܉eiG$χ×iAXW()RAPw#% T8+P'R4Uj-=*f|B r  "3:Oa; ܊˯ ,4e 4~M~p&Ԣ_920Q51ޑDm먾|u0': endstream endobj 24 0 obj <> endobj 477 0 obj <>stream xztWä́+@F {1 ܋p"\IH&۸!-&$$I4mzhШ~& J!G"4h:(!QfM2ItDGwe23I/QInS=("5]:ȡDٸlt,1X`áؙuWCȁ}pU:p`ҭ ֐T5h 0/+wئ=@!y_ XZ)'(<Qj.h!`Jϙi_R(/pwkJO![V|xQw.u)~_,AhcS޿!d/~t}bOV# br!+A$59`VͻGԎ6>&zNB`Ag$d $p[4n><ŏ*< On$x3ma&Qm{cߏ@_ʒJķ:zf][ UpDEm{"polpw2:\Ģpȡ#\>;No @zƖG,hWlV*)C$׹^$R( B3bE8UjHqǻJ&L%Q ` mGzwٹcPA`Dh(Ńd# Ι Vn Yf_ѝ1Hۨ0-,^sȟޓlď<ν73C7#C*50:!4GKCQn_FIH14jBcM: yEԆHy"ߧ#104Yn2Ju>+Bj}10&Q0tw[~P-?z}Ţ^4XpdeKHYsP[ -pZ=k }S#! 6KMuu5n<]FىyЌtބvxICMؠNZt7Nz4H.]nOӓv妡0+ ؖdF2zSG(BYXl=WQ@LFKyMYՂl~`>Ϗ&Kvyeg.oq wQZNC()2ɏֆNSAbT$%+Ggx_qpT"WZ-<$5'Q/kϱ<`r H:QWiZU}_',qo,N^6#qԟd<݆c)TV" 7+w& 3zlF3/s,f0zfh# G/NY J.a6[q~Ow?ڼk\Y䧜KF7|~֨'v@UQ25Uh'~ "Ԏ*B24KN<3aJ!xv 鷷-7]qC_usS$x =&q8쫮EHj_wD6#o#Sfq= ;n{g){fA/Fwٜ, %Bpخ隔MdB!{ g;ިN^@ulR@:U&:+s./@1rȌצ@TJPo~YЊzw8Nܲn|k+s/ϮI4d n-sdEWڙLm =tUjQGKXREVM>A0 8Bu|ET5ެ @ꉪ U i8aҧ响ѕlvqKAQ#jt 7,r,]Wn2c+O~xhvmC4e"_U1-%9^&T3M$_oWm\$PSY]O߮T5#:I)Zf̻qd p f#qwlh8|6IZ7,Zfg=rˢCvHؤT|;KO#8%ؐ^D:Xd_4nKo],#2̂|^#D-(ݳPE@u()FmB, zb+f;1" 3(GoCD YU@>:}YeZjMUѥ(cMϿ-+%KN Z ȆfumOڈJ.ÌȧGןEu8+t>2MvaAF|(m˕A=bmXDy69FV"@W|xv JZժ ];7 V7R2sl{y ddždoKgn(7|#KEYn,K SIV;)l ZiW}bԪX퀅ȨU.l2@1gH~hL!-!~x2H#f-Ԝmb28"R{\ɓ-LM&0dK Mh9o硔BZY]/tNxDL83\֡~I$ *WqA&#7N݋Il_+j;FF%g:J:[M!b P$|FH xu]vzRwwt^tUSW 4ijEhyƁdLFA }L=ɳSL43*kBp]gd 1>&}Qɸ.W̐z&::8F#q@5UnvIԨ)2 O B[U;a'lu)8H:] 4yF;ⓓ/YAehn`A^Eu" ?lxL8 |6HXMKVSTɐ[6)#$RieJQO!XbNEx<~{Y7OB R4ME. ÎA(hK'Jl)+٢d_ |~>>ڧ+".QaLDqdUMɧ~lazV |tp!p:fmGHyԈvf*/Pz΢|!ߨր0]؃!ցNJ&RfҌe1s}Lh-S7џC#}p:=@ .2}T;i}7! L" Dv,eK:5߱e熎!Dvlv/¦O5g ]m%:/E)W]xZuI0Yж[?Yo!+*CY%($?;D_>_fs\^vˡҿJ`p!$'6[@*@M8,I_re IN6NWe_{ * \dE֣랓`|_X9OejhyUHOAΝd]Rd|z3뗎](`@2ڋDy[_(SȒlnj QJ&5CMԨl - iЂFeiYC>  RdeA>S]'ǗDXl2j"hJKmȰG-hBDxa|t-*> %߉ 2 $x#[M󯢸o -K P+'5ZĪ=߭gLBZF󗯐$&/Pβa#C]L:272>I.*Z >?$rcd3>*\6VUrhm^ ~8%Dwp*KLS ;x@yU4! hwRcb1JDZK UzC#1<јZhrQ~wGOI%E^c%KK'Jƅy~r⿵iB$6c _lVW}\+AU-~I<79>x~ %tUL̽)掠^Hw׵"@}Z(ؖ1/=noGz ߂Mb,mՋ ,29\!IQz=ZArGOȕ;[Y,յ mxZj  ׇV\{es^Dk@ZatJ뼐vɱj ŷ*}臻-6&E9<b eŵ׷͝nE2z\5VϞ*ZF,xD.'RX) D)2k$ǼDg}6[ PkZB"7Xn?YTAr5MPΎ+.} \v$Mǿ٢h)A*=KgDT ;RKs!Z ^/pf3 ,%IIJyi De9y鹹:Bk=Ly;";(wCYvf*1alx>H:gﻗ#1°ۺ}e VpÅceÅQ`,'*hlYܸ.J&>!W`lh#˦?0<,"s/q2o__wcz2L8k_ _ZkR=lwr}uZ!>&!1xDob[l3wuAWҐZ]闢+X)`}w{[f_!N(QEhM(-05).5e Q՗T^ɮ ~'9O Rh/z~Yu3/;bΪ9;Q5f3qC i=.Z* ܶCNQR!E$F)eA OeӢx WJNIF4]'=Z84|0CW@3N~I;ɾmqps]N\ZV_?1䷑d&+-/D!%)Wl^ߣFd(ꞽ~΢3`j[/6zy}j~ S&&L^^xwVCO'JtQ7#ow) 5wniR1tOC*%ITBw8bq$Zn(a~vMzm[ϛᔓF;wB֥͙Kl 3tMдui3d_e۸(Clf;^]u0V:`i?}WvN9?Rȥ}K%֟ ö٠ˮ)1Ic Ȗ8ARGdSovq<\"f4͉9 ml,lsMp,t|TuxOA1;J\ӗvfƎ1S9kE$?pͮa$.\x_oyCN`D>:Lv[H゚e330gǬD=g ˶OUGS1HkªODtjZ[^??+/VE lS8P3.hpof<~8 Yҭd||!-R%C$HcK[_2"O\=]cN~ST~ endstream endobj 96 0 obj <> endobj 478 0 obj <>stream xM[OGg8HVpCwWBIVʅjF$',xuwll˰cNZI(/u?@>D"4љotGF\V.@G|E Un֚)d$cuW>.pB %;/ <;c>[?KCC 'ó6vil,#.}?E:aE;= ?L79Hߵ:99s"ӣûYaV#

y;Vs"Kл<'%aJeFdQ;&$dXXZy k/AwY Q@➷~򩹝FE~?"cc{ccBbLIIʄ^UO$kaΖֳZ9\5R>%,%fb4)eU.kry}uRpe#dD ?Is}5Œgᱣ^P;h]) XW_DUGPӫǞ^u4Su$Tkz*t64>kFm= OQ endstream endobj 17 0 obj <> endobj 479 0 obj <>stream xkHSq]QOAv9;ЬI .EB wr϶JDݿ,-JIӦSiDJ#C&#/ϗ}Q0<7r(+-v~vC%⑍ Hơm@a& JjUX3::.,j s᜴,#C2꣩irX팞>i6qteHҘYKXbH Ȁ$\A)ʰ!m+`ǽ}!a#No,UX!}$6o5QAiҩy8y8 x? X}C?Xb@]D(*]7 뛮HR{d`94OM$sA^ޱG×٧!>}$Er-nkSK[#yaB"@K)BT`C Fl5N*P"RU|bg_( 3)DQk.owtAMBb2d;]_鱴7CkݰJ/ƃE?dA!/aj$z:RQ&{c8+m^O W{ A|<@;}RA׍ccKFwb) endstream endobj 89 0 obj <> endobj 480 0 obj <>stream xmTLg땯Dm^D3Yܔu Ԩ0F(PB{宴'A?ڍ *6@ JYpe6&M1f31{?vdrO{y7GSZ E42|-UQzHP>)RIp6*qYrV239vh+8fjTPc,lVWqن*|FYmK嫌ʸ*YEpZVcѷI;\Vhʭ(}K3WRP5zJQ۩T!Jr jJT}RZJ~MƮ9h;s_Y@ &)A,OJT u؉kp#n+'HB[-Žw9N,4pXmmyωY,KW/iz9h>0\Fj)Or;voشymYvb0I'إ|ŵs:@Drø5Rщ@!<--'0+كiUD)\agÐ<2ٜE|n2i.ʦx*;gRi ('ecQ9y{;;uGvL͆ YP/նQ)|xˢ!uۄ۰]u1wс:Nv*XPSh󾦯#>‹q?>KS7y8p7aߠMjQL`S"]:ynxaAϑ> endstream endobj 15 0 obj <> endobj 481 0 obj <>stream xJQFdv6 +Mj 827&"QpanDn`mtħ~.RDJ/nӋv0ޥg9-NJ+]ە/} ojk-ǨE;L(JK;V [lŢgdl&Ty,Κ s瑗ٕ]Z8[%ZCp)v;Up4k AB_R4~ NGh?~_;-B?#@8yz0aNCBІ hylcs~9am$> endobj 482 0 obj <>stream xX TTW}EI"~F1hѨqFEb(@T%2SQ FDcMwLmN׬[:ݫ뱪`{=>gfd2%kϱLo'V?0c<b,tœ5dQYK1qa!*שn/ϝ묙3. v] P?"]aAdש*U̼^JJJ?C5)L>(>(.1h2eum@Tͷ%ʨUPha/^\,^21)`6A!ü6DDF1}/zymf"3YǬg)f#Lc|Mb]f 3̼,e1˙Jf*3d0kΌ`F1ь#3ˌc~33herYz{vX{}WMܳN៌X5:r;~Q 9jFO>u̶1NNNN?6dqIؿ*eIWHunA:z9;&q\v GG&ZY] Z^tr&i2՘ q6?ؔzBvIf;GH<& (`Xd82F]K)xc-(,p⮼"f2a55m8ԃ=Lq%#gVmH^؟G?k n$?ܿg賂ŧ`M!!\rW𿿾qQpcݛr<+or9Hr'6df炊lL75UtFXWoJ?( @\HbkPX=h=2|_=+Z5W.@/\t+ayl M2#܄W ECg yk-zE$C) f "Ѕ~.. Zw[CJ,fgx9XneP4v W()Э.->"4bGXr̖{ ׄFbZK飁ZF!;6mB|:-飇g=ԥ{igg2m7qV69"챝HlMAa&Fg2+`']@`eH bpY0W4ȹ8m'mJ(e,M3-`pzV5e72}ɮSP/~%(es'K=A栃.R<ݖ ʄisc};Eih:C /?j4m;͛;CeBddf{.rxYiT(Yd\_qr ޶PvYh[bJ+ ƦVsM7g.r㵜m@-]t Z7lcl7'ZmG@[y" 6E7>Kä 2P\Lm\Ӊ8H28't PhB^c pkfƩ8鳓JN@r˪Qx&f~c!l-&:cX:']ҟمO/riI@- ]1 PNƮ18 [}8g@_K/S 6?&Și#3F3蓆"uiF&/_#LN-[u(Z9/Aۍ]áLЩ8G2S"qĥom;XhW=sP[$$@[ܼ欍67&8V\qj fZ0ZG}Ga4,).9G>7=,V[ %Wd쮬2?_!n-M]-к$1!.7a)>'}v|vǮ8^#Ӷ܀+~πo껌*X`)o+x1! 6RF%Kq) )6~+"Y/SZ'Zx؂ֱ8geH="n7\惁0.Дuc8VXs["(O,Oz ;tA pL7[wBEj:di%lC8w&bvTYWh(ѵ /"與4:܆99HOUsxt*"%Yb4JiP!tdUq(1Tܥ|Z><'t-,wswqQy-(ty?)ڔWF'z{jubG;=!\d$UYMa[x:#( Zj'}Hy (]:}iPrgRGO7o~~q_޿H"ImJ| 4lְ>Q WtnЯ؃؉6)հuE%h$o hMa85rD8g)g8Ie=؋' `RXTTT i\u0H5ze*\$rhhCׯȰuytѶy=mg%_T!U0 |epڑs6m]u쿀C~yU&hh4ኴxPLP%"|U#}d{HKo͉/^&wx]P^eTȇZǑܱC:9caqv껛rr,qU@8EgF?B_b | : )MSouN%/wCYwuyS&~CZ:`L)ÑSPU1s}yumU{ B˥ MG(x}d%2sDE .Trܑ^9Kb+>0>3n^;.[445XU 1ʔ@?A|u[+/OY.ug&[0)fo銨L N]1|9wT1*RY[C#ްX%?O?KBs v%Rg ӧ9fҝjgT5[7%{=)fmI}7˩uT=|ISϑbED>Eu5#!t^>UfID OfK6BOpԈ# KPYNAX#^79 .W;b endstream endobj 13 0 obj <> endobj 483 0 obj <>stream xW XS׺=1sDD%^{BEتhiEQԪ8 2K L aN'<Q&DDDk[mkjj{Nھ/w>{-ӗ)!B І cmG#Hu%B(yn4yf͟;nU<3S ?v[e^>(o+!K̉6[&[>m]DnOYngimMopE#(jƪ`cmeohP9 ]F'bǢ|Y<#=^qA[!ig$t@Un]@o`"bY50z4ڊ;Fə+ vop W Ȍ2)8e9h F]5* >`6[sXhDxBJ_I-8:%XJ?]/ H"[H,b?NE#S4x' ]5n۴rCK{olnJYJm;mvb9[}f[5e5Imͩ:`,5ze@G8|r#ϸ - LA{<NC4+?;7 %&܂U ZA XDUbJ/Eͺ\Q { f:s_r9:!|ށ3 zXZA#kd6le!P (b-'NUC̥|=ıȷ;=JK+n8UBv<Ƴfn3ž^|ÚW8l6qZvw=)r&!}5~@[dQ?FyLr`'`^Qg5Hxݜ;b?cO}=^A9BSDOPTCz|s`'g'.[kȆ&X! qo=^9_WSzU7HbaT25>5q N 0QPӣ:>2{050355%o,cfјqI#hDN 9Ś;YpMEsow^,8Z0zA]" Nٜ<ҙxg"%^lae>+mF"8$YIt}B&؝x4&DzKfmu?"!+@u}o'жv8=5+{ ɏ D2iؔLedv0G?^QJF3~3GubNv1+B_&H0 At IZ`pL~NW"=HsvgOS <ώ JW eSψ \Շ4nb[{n!rsR]H̀>&j=mzu󪬔̄xURF0yZEÁ.Ehclࢧa`ZD:Y|[pdA?hUr$Pșв(}miYMm6a !P/=JD wf_,?=șGص_DX~U^eDzmA'.Ͼ3ڊQz΢\jt9e9#P}$!{E3!ӄD$e4LJNYXPp=#r5,l$8kCVQHU FO2y5'_UhO@1)AuN8&?M[ B\%7WWכ-s WѝB/d^̵W!̌)\Z6%H:v!;.IKbr .qz͝-#EQD樏h5 qڽrrL,!Af9FH+YZm~WP{Mw߰'%ι9?7 (!5ROZÉ":4t:Uj㉊ Uph"-5!B>xX~%6<=WW @(.( dkp_NKOA#^Azz zOh=]LVJzR>stream 2017-09-29T14:35:55-04:00 2017-09-29T14:35:55-04:00 dvips(k) 5.995 Copyright 2015 Radical Eye Software saclib.dvi endstream endobj 2 0 obj <>endobj xref 0 515 0000000000 65535 f 0000341362 00000 n 0000459337 00000 n 0000340690 00000 n 0000327627 00000 n 0000000015 00000 n 0000001544 00000 n 0000341428 00000 n 0000355026 00000 n 0000389618 00000 n 0000352381 00000 n 0000367449 00000 n 0000366211 00000 n 0000453141 00000 n 0000365434 00000 n 0000447544 00000 n 0000364994 00000 n 0000444940 00000 n 0000341469 00000 n 0000341499 00000 n 0000327787 00000 n 0000001564 00000 n 0000004238 00000 n 0000363413 00000 n 0000434636 00000 n 0000362657 00000 n 0000432259 00000 n 0000341573 00000 n 0000341603 00000 n 0000327949 00000 n 0000004259 00000 n 0000005114 00000 n 0000360648 00000 n 0000422871 00000 n 0000341646 00000 n 0000341676 00000 n 0000328111 00000 n 0000005134 00000 n 0000007620 00000 n 0000359722 00000 n 0000415312 00000 n 0000358988 00000 n 0000411292 00000 n 0000341719 00000 n 0000341749 00000 n 0000328273 00000 n 0000007641 00000 n 0000010270 00000 n 0000341814 00000 n 0000341844 00000 n 0000328435 00000 n 0000010291 00000 n 0000011285 00000 n 0000341887 00000 n 0000341917 00000 n 0000328597 00000 n 0000011305 00000 n 0000012378 00000 n 0000357305 00000 n 0000401887 00000 n 0000356412 00000 n 0000394485 00000 n 0000341960 00000 n 0000341990 00000 n 0000328759 00000 n 0000012399 00000 n 0000019066 00000 n 0000342055 00000 n 0000342085 00000 n 0000328921 00000 n 0000019087 00000 n 0000025227 00000 n 0000354425 00000 n 0000381452 00000 n 0000342139 00000 n 0000342169 00000 n 0000329083 00000 n 0000025248 00000 n 0000027298 00000 n 0000353572 00000 n 0000372957 00000 n 0000365676 00000 n 0000448186 00000 n 0000342256 00000 n 0000342286 00000 n 0000329245 00000 n 0000027319 00000 n 0000031757 00000 n 0000365159 00000 n 0000445943 00000 n 0000342373 00000 n 0000342403 00000 n 0000329407 00000 n 0000031778 00000 n 0000036078 00000 n 0000364445 00000 n 0000443763 00000 n 0000342556 00000 n 0000342586 00000 n 0000329569 00000 n 0000036099 00000 n 0000040051 00000 n 0000342717 00000 n 0000342748 00000 n 0000329734 00000 n 0000040073 00000 n 0000043766 00000 n 0000342847 00000 n 0000342878 00000 n 0000329900 00000 n 0000043788 00000 n 0000044913 00000 n 0000342944 00000 n 0000342975 00000 n 0000330066 00000 n 0000044935 00000 n 0000050362 00000 n 0000361565 00000 n 0000430180 00000 n 0000343041 00000 n 0000343072 00000 n 0000330232 00000 n 0000050384 00000 n 0000055204 00000 n 0000343239 00000 n 0000343270 00000 n 0000330398 00000 n 0000055226 00000 n 0000058845 00000 n 0000343380 00000 n 0000343411 00000 n 0000330564 00000 n 0000058867 00000 n 0000063852 00000 n 0000343510 00000 n 0000343541 00000 n 0000330730 00000 n 0000063874 00000 n 0000066410 00000 n 0000343664 00000 n 0000343695 00000 n 0000330896 00000 n 0000066432 00000 n 0000069490 00000 n 0000343829 00000 n 0000343860 00000 n 0000331062 00000 n 0000069512 00000 n 0000075156 00000 n 0000360293 00000 n 0000421551 00000 n 0000359548 00000 n 0000414468 00000 n 0000343981 00000 n 0000344012 00000 n 0000331228 00000 n 0000075178 00000 n 0000080376 00000 n 0000344183 00000 n 0000344214 00000 n 0000331394 00000 n 0000080398 00000 n 0000088183 00000 n 0000344337 00000 n 0000344368 00000 n 0000331560 00000 n 0000088205 00000 n 0000097243 00000 n 0000344515 00000 n 0000344546 00000 n 0000331726 00000 n 0000097265 00000 n 0000104741 00000 n 0000358162 00000 n 0000409615 00000 n 0000344667 00000 n 0000344698 00000 n 0000331892 00000 n 0000104763 00000 n 0000109725 00000 n 0000344843 00000 n 0000344874 00000 n 0000332058 00000 n 0000109747 00000 n 0000114439 00000 n 0000345019 00000 n 0000345050 00000 n 0000332224 00000 n 0000114461 00000 n 0000118485 00000 n 0000345219 00000 n 0000345250 00000 n 0000332390 00000 n 0000118507 00000 n 0000122032 00000 n 0000345349 00000 n 0000345380 00000 n 0000332556 00000 n 0000122054 00000 n 0000126199 00000 n 0000357071 00000 n 0000401322 00000 n 0000345457 00000 n 0000345488 00000 n 0000332722 00000 n 0000126221 00000 n 0000129063 00000 n 0000345670 00000 n 0000345701 00000 n 0000332888 00000 n 0000129085 00000 n 0000132490 00000 n 0000345800 00000 n 0000345831 00000 n 0000333054 00000 n 0000132512 00000 n 0000134714 00000 n 0000345941 00000 n 0000345972 00000 n 0000333220 00000 n 0000134736 00000 n 0000140749 00000 n 0000355856 00000 n 0000393317 00000 n 0000355623 00000 n 0000392753 00000 n 0000355452 00000 n 0000391841 00000 n 0000346082 00000 n 0000346113 00000 n 0000333386 00000 n 0000140771 00000 n 0000147146 00000 n 0000346321 00000 n 0000346352 00000 n 0000333552 00000 n 0000147168 00000 n 0000148389 00000 n 0000346473 00000 n 0000346504 00000 n 0000333718 00000 n 0000148411 00000 n 0000154679 00000 n 0000346559 00000 n 0000346590 00000 n 0000333884 00000 n 0000154701 00000 n 0000163412 00000 n 0000346726 00000 n 0000346757 00000 n 0000334050 00000 n 0000163434 00000 n 0000170038 00000 n 0000346965 00000 n 0000346996 00000 n 0000334216 00000 n 0000170060 00000 n 0000176375 00000 n 0000347132 00000 n 0000347163 00000 n 0000334382 00000 n 0000176397 00000 n 0000182088 00000 n 0000347347 00000 n 0000347378 00000 n 0000334548 00000 n 0000182110 00000 n 0000184758 00000 n 0000347477 00000 n 0000347508 00000 n 0000334714 00000 n 0000184780 00000 n 0000190698 00000 n 0000347596 00000 n 0000347627 00000 n 0000334880 00000 n 0000190720 00000 n 0000196125 00000 n 0000347774 00000 n 0000347805 00000 n 0000335046 00000 n 0000196147 00000 n 0000198363 00000 n 0000347915 00000 n 0000347946 00000 n 0000335212 00000 n 0000198385 00000 n 0000204125 00000 n 0000348056 00000 n 0000348087 00000 n 0000335378 00000 n 0000204147 00000 n 0000210829 00000 n 0000348197 00000 n 0000348228 00000 n 0000335544 00000 n 0000210851 00000 n 0000214830 00000 n 0000348360 00000 n 0000348391 00000 n 0000335710 00000 n 0000214852 00000 n 0000215625 00000 n 0000348457 00000 n 0000348488 00000 n 0000335876 00000 n 0000215646 00000 n 0000221752 00000 n 0000348532 00000 n 0000348563 00000 n 0000336042 00000 n 0000221774 00000 n 0000231037 00000 n 0000348675 00000 n 0000348706 00000 n 0000336208 00000 n 0000231059 00000 n 0000238133 00000 n 0000348829 00000 n 0000348860 00000 n 0000336374 00000 n 0000238155 00000 n 0000240784 00000 n 0000348992 00000 n 0000349023 00000 n 0000336540 00000 n 0000240806 00000 n 0000244016 00000 n 0000349089 00000 n 0000349120 00000 n 0000336706 00000 n 0000244038 00000 n 0000247169 00000 n 0000349175 00000 n 0000349206 00000 n 0000336872 00000 n 0000247191 00000 n 0000248298 00000 n 0000349261 00000 n 0000349292 00000 n 0000337038 00000 n 0000248320 00000 n 0000253644 00000 n 0000349347 00000 n 0000349378 00000 n 0000337204 00000 n 0000253666 00000 n 0000257816 00000 n 0000353942 00000 n 0000374820 00000 n 0000349464 00000 n 0000349495 00000 n 0000337370 00000 n 0000257838 00000 n 0000263318 00000 n 0000349574 00000 n 0000349605 00000 n 0000337536 00000 n 0000263340 00000 n 0000267304 00000 n 0000349684 00000 n 0000349715 00000 n 0000337702 00000 n 0000267326 00000 n 0000274111 00000 n 0000349805 00000 n 0000349836 00000 n 0000337868 00000 n 0000274133 00000 n 0000277594 00000 n 0000349924 00000 n 0000349955 00000 n 0000338034 00000 n 0000277616 00000 n 0000280942 00000 n 0000350034 00000 n 0000350065 00000 n 0000338200 00000 n 0000280964 00000 n 0000283610 00000 n 0000350151 00000 n 0000350182 00000 n 0000338366 00000 n 0000283632 00000 n 0000284390 00000 n 0000350248 00000 n 0000350279 00000 n 0000338532 00000 n 0000284411 00000 n 0000284619 00000 n 0000350323 00000 n 0000350354 00000 n 0000338698 00000 n 0000284640 00000 n 0000292029 00000 n 0000353181 00000 n 0000372240 00000 n 0000351868 00000 n 0000366718 00000 n 0000350398 00000 n 0000350429 00000 n 0000338864 00000 n 0000292051 00000 n 0000298711 00000 n 0000350552 00000 n 0000350583 00000 n 0000339030 00000 n 0000298733 00000 n 0000306364 00000 n 0000350671 00000 n 0000350702 00000 n 0000339196 00000 n 0000306386 00000 n 0000310864 00000 n 0000350856 00000 n 0000350887 00000 n 0000339362 00000 n 0000310886 00000 n 0000312778 00000 n 0000351008 00000 n 0000351039 00000 n 0000339528 00000 n 0000312800 00000 n 0000314590 00000 n 0000351127 00000 n 0000351158 00000 n 0000339694 00000 n 0000314612 00000 n 0000317190 00000 n 0000351213 00000 n 0000351244 00000 n 0000339860 00000 n 0000317212 00000 n 0000319390 00000 n 0000351288 00000 n 0000351319 00000 n 0000340026 00000 n 0000319412 00000 n 0000321301 00000 n 0000351363 00000 n 0000351394 00000 n 0000340192 00000 n 0000321323 00000 n 0000323281 00000 n 0000351427 00000 n 0000351458 00000 n 0000340358 00000 n 0000323303 00000 n 0000325621 00000 n 0000351491 00000 n 0000351522 00000 n 0000340524 00000 n 0000325643 00000 n 0000327605 00000 n 0000351555 00000 n 0000351586 00000 n 0000366957 00000 n 0000367786 00000 n 0000372469 00000 n 0000373254 00000 n 0000375385 00000 n 0000381859 00000 n 0000389892 00000 n 0000392073 00000 n 0000392964 00000 n 0000393553 00000 n 0000394857 00000 n 0000401533 00000 n 0000402476 00000 n 0000409855 00000 n 0000411569 00000 n 0000414695 00000 n 0000415703 00000 n 0000421794 00000 n 0000423299 00000 n 0000430682 00000 n 0000432684 00000 n 0000435219 00000 n 0000444053 00000 n 0000445169 00000 n 0000446218 00000 n 0000447767 00000 n 0000448549 00000 n 0000453502 00000 n 0000351619 00000 n 0000352274 00000 n 0000352827 00000 n 0000352928 00000 n 0000353467 00000 n 0000353849 00000 n 0000354917 00000 n 0000355359 00000 n 0000355769 00000 n 0000356044 00000 n 0000356904 00000 n 0000357218 00000 n 0000357799 00000 n 0000357892 00000 n 0000358551 00000 n 0000358660 00000 n 0000359414 00000 n 0000360208 00000 n 0000360560 00000 n 0000361154 00000 n 0000361263 00000 n 0000361943 00000 n 0000362332 00000 n 0000363080 00000 n 0000363970 00000 n 0000364179 00000 n 0000364825 00000 n 0000365581 00000 n 0000366126 00000 n 0000366615 00000 n 0000457881 00000 n trailer << /Size 515 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 459542 %%EOF saclib2.2.8/sysdep/doc/saclocal.dvi0000664002275300236100000000745414017255270016323 0ustar wcbrownscs; TeX output 1998.07.08:1344l'&B9>DtGGcmr17Addendumto7tthe-SAqCLIB5_User's7tGuide2!", cmsy10_0XQ cmr12AndreasNeubacrherfj+yJune26,19926iX?DtGGcmr17(3)creates$saclib/include/sacproto.h,whichcontainsaprototypGeofeachfunctionUUinSA9CLIB."Stepb*(4)createsnewmakefilesinthedirectories$saclib/lib/objdand$saclib/-lib/objo."Stepv(5)makestheoptimizedlibrary$saclib/lib/saclibo.aandthedebuggingli-braryH$saclib/lib/saclibd.a.Alternatively*,mklib?opt(mklibdeb)makesonlytheoptimized0(debugging)library*.Undernormalcircumstances,youshouldtypGemklib?alltoUUmakebGothlibraries."StepUU(6)makestheinterfaceprogamisac."StepUU(7)createsthe le$saclib/doc/desc.doc,whichisusedbythescriptsdesc."EachUUofSteps(3){(7)maytakeaminuteortwoto nish. G-:q% cmsy6y)DepartmenÎtofComputerScience,UniversityofthePhilippines,QuezonCity1101,Philippines. K cmsy8hXCscmtt8Xmje@engg.upd.edu.phi*2M.XJ.EncarnacionffF2.MoQdifyingTfunctions2"BeforemoGdifyingaSA9CLIB le,youshould rstcheck-inthe lesothatthemoGdi ca- tionUUcanbGe\undone".SeeSection4fordetailsandanexample.!a󍍒3.`DeletingTfunctions"T*oUUdeletea le,sayOLDF.c,fromSA9CLIB,dothefollowing.*8(1)0IfUUOLDF.cdoGesnothaveUUanRCS le,thencheckitin.(SeeSection4.) 썍8(2)0EditXOLDF.csothat`[?removedfromlibrary]'Xisthe rstlineofthe leOLDF.c.8(3)0Check-inUUthemoGdi edOLDF.cwith !", cmsy10h!': cmti10state[isettodel.8(4)0rm?$saclib/src/OLDF.c8(5)0cd?$saclib/lib8(6)0ar?dsaclibd.aOLDF.o8(7)0ar?tssaclibd.a8(8)0ar?dsaclibo.aOLDF.o8(9)0ar?tssaclibo.a8(10)0rm?objo/OLDF.oobjd/OLDF.o8(11)0mkproto8(12)0mkmake8(13)0mkdesc8(14)0mkisac("NoteUUthatthelibrariesdonothaveUUtobGerecompiled,butisacshouldberemade. 2"Steps(6)and(8)deletethespGeci edob8ject lefromthespeci edlibrary*,andSteps(7)andUU(9)upGdatethesymboltableofthespeci edlibrary*."Ifyouaredeletingmorethanone le,thenSteps(6){(9)maybGeperformedonlyoncepbylistingallthe lestobGedeleted.F*orexample,ifyouaredeletingOLDF1.candOLDF2.c,UUthenyoumaydoinstead:*8(6)0ar?dsaclibd.aOLDF1.oOLDF2.o 썍8(7)0ar?tssaclibd.a8(8)0ar?dsaclibo.aOLDF1.oOLDF2.o8(9)0ar?tssaclibo.a("AsanalternativetoSteps(11),(12),andQ(13),youcanmanuallyremovethecorre-spGondingUUlinesinthe les*0$saclib/include/sacproto.h,0$saclib/lib/objd/makefile,0$saclib/lib/objo/makefile,UUand0$saclib/doc/desc.doc.(ThisQBalternativewillbGesomewhatquicker,butwillrequiremoreworkonyourpartandisUUpronetoerror. SAÎCLIBXMaintainer'sGuide3ffF4._RevisionTcon9trolݍ"I've1usedtheRevisionControlSystem(RCS)1forkeepingtrackofthechangesthatȍhaveUUbGeenmadetoSA9CLIB.^y ݍ"Thesscriptsciallowsyouto\check-in"arevision.Beforemakinganychangestoa  le,>~AtUUtheprompt>>,IwillnowtypGethedescriptionofIPFAC.c:>>?Integralpolynomialfactorization.>>?.~ThepGeriod`.'terminatestheinput. &(IfthebackspacekeydoGesnotworkwhiletheprompt(>>isactive,thenuseCTRL-hinstead.)QTheRCS( le$saclib/RCS/IPFAC.c,vwillKnowhavebGeencreated.AllfuturechangesthataremadetoIPFAC.candthatarerecordedUUusingsciwillbGestoredinthatRCS le. ݍ"AftermmakingmychangestoIPFAC.c,Imshouldnowcheck-inthechanges.T*odoso,ItypGeUUsci?IPFAC.calgoMark.Iwillthengetamessagelike:/usr/local/saclib/saclib2.1/RCS/IPFAC.c,v <--IPFAC.cnew?revision:1.2;previousrevision:1.1enter?logmessage,terminatedwithsingle'.'orendoffile:>>~Atuthe>>prompt,I$typGeinashortdescriptionofthechangesthatweremade.F*orexample,UUImighttypGe:>>?Introducedheuristicthatsearchesforavariableof>>?degree1or2sothatthepolynomialcanbefactored>>?byformula.~"IfTISmakefurtherchangestoIPFAC.c,forexample,ifIS xabuginIPFAC.c,thenI would2typGesci?IPFAC.cbugMark.NotethatI shouldnottypGesciIPFAC.cinitsaclibUUbGeforehand;thatcommandshouldonlybeissuedonceforeach le. ݍ"TheoIPFAC.cwillproGducethe leoIPFAC.c,whichwillcontaintheoriginalrevisionofIPFAC.c.Ingeneral,anyparticularrevisionofa lecanbGeretrievedinthiswaybygivingtheappropriaterevision3numbGer(inplaceof`1.1'intheexampleabove)asgivenintheoutputofslog.5.iyDeletingTrevisions9"In8somecases,youmaywanttodeletearevisionfromanRCS le.Atypicalexampleisthe+following.SuppGoseI+zhaveanewversionofIPFAC.cthatI+zwanttoputintoSA9CLIB.While7developingthenewversionofIPFAC.c,I7usedaheader lethatIwrote,andthisheader9 leis#includedbythenewIPFAC.c.NowIcheck-inthenewIPFAC.c,butIneglect7tochangethe#includestatement.TheerroneousnewIPFAC.cisnowrecordedin5]theRCS5U le$saclib/RCS/IPFAC.c,vasrevision?1.3,say*.WhatshouldI5Udo?Oneoption6wouldbGetosimply xIPFAC.candcheck-inthisnewrevisionasrevision?1.4.ThisRsolutionisnotsatisfactorybGecausethesillymistakeofnotchangingthe#includestatementUUwillbGerecorded."T*oUUdeletetheerroneousrevision,dothefollowing.r8(1)0cd?$saclib/RCSSAÎCLIBXMaintainer'sGuide5ffF8(2)0chmod?600IPFAC.c,v 8(3)0rcs?-u1.3IPFAC.c,v8(4)0rcs?-o1.3IPFAC.c,v8(5)0rcs?-l1.2IPFAC.c,v8(6)0chmod?444IPFAC.c,v"StepUU(2)changesthe lepGermissionssothatyoucanwritetotheRCS le."StepUU(3)unloGcksrevision1.3sothatyoucandeleteit."StepUU(4)outdates(deletes)revision1.3fromtheRCS le."Step8(5)loGcksrevision1.2.Y*ouwillnotbeabletocheck-in8laterrevisionsunlessthelastUUrevisionisloGckedUUbyyou."StepC(6)makesthe leonlyreadable,andnotwritable.ICdecidedtosetthesepGermis-sionsUUtoavoidUUinadvertentlychangingtheRCS les.+H6. ListingTthec9hanges"T*olistthechangesthathavebGeenmadetothecurrentversionofSA9CLIB,Iwrotethescriptslist,thattakesoneargumentchosenfromalgo,bug,del,new.F*orinstance,slist?newUUwilllistthenamesofallnew les."Finally*,c~whenanewversionnumbGerisgiventoSA9CLIB,don'tforgettomoGdify$saclib/src/external.c,UUwheretheversionnumbGerisde ned.AppQendix:Tquic9kreferencemkdescoCreatesUUthe le$saclib/doc/desc.doc.mklib?hlibi 3ڲRecompilesUUthelibraries$saclib/lib/saclib[do].a.WU]hlibiUUisoneofall,deb,opt.mkmakeoCreatesUUthe les$saclib/lib/obj[do]/makefile.mkprotorCreatesUUthe le$saclib/include/sacproto.h.sciUUh lename[ihstateihauthoriWU]ChecksUUinarevisionofh lename[imoGdi edbyhauthori.WU]hstate[iUUisoneofalgo,bug,embe,init,new,typo,spec.slistUUhtyp}'e[iListschanges.htype[iisoneofalgo,bug,del,new.slogUUh lename[i[hveri]WU]DisplaysUUrevisionhistoryofh lename[i.IftheoptionalargumenthveriWU]isUUgiven,displaysversionhveriofh lename[i.,; XCscmtt8 \> --- RCS log files\\ %% \verb|bin| \> \> --- shell scripts\\ %% \verb|doc| \> \> --- documentation\\ %% \> \verb|guide| \> --- \LaTeX\ sources\\ %% \verb|example| \> \> --- example programs\\ %% \verb|include| \> \> --- header files\\ %% \verb|isac| \> \> --- interface programs sources, header files, and executables\\ %% \verb|lib| \> \> --- the compiled libraries\\ %% \> \verb|objd| \> --- the debugging object files\\ %% \> \verb|objo| \> --- the optimized object files\\ %% \verb|pardep| \> \> --- parameter dependent sources\\ %% \> \verb|W_32_Z_29| \> --- sources that require 32-bit words, %% with $\verb|ZETA|=29$\\ %% \verb|src| \> \> --- the source files\\ %% \verb|sysdep| \> \> --- system dependent files\\ %% \verb|times| \> \> --- timings for various functions %% \end{tabbing} \section{Adding new functions} To add a new function, say {\tt NEWF.c}, to \SACLIB/, do the following. \begin{enumerate} \item[(1)] Put {\tt NEWF.c} in the directory {\tt \$saclib/src}. \item[(2)] Check-in {\tt NEWF.c} using the script {\tt sci}. \ (See Section~\ref{section:rcs}.) \item[(3)] {\tt mkproto} \item[(4)] {\tt mkmake} \item[(5)] {\tt mklib all} \item[(6)] {\tt mkisac} \item[(7)] {\tt mkdesc} \end{enumerate} I assume here that the environment variable {\tt saclib} has been properly set to the main directory of \SACLIB/, so that \verb|$saclib| is a shorthand for that directory. If you are adding more than one function, then do steps (1)~and~(2), in that order, for each new function. Steps (3)--(7) only need to be done after adding all the new functions. Steps (3), (4), (5), and~(6) should be done in that order. Step~(3) creates {\tt \$saclib/include/sacproto.h}, which contains a prototype of each function in \SACLIB/. Step~(4) creates new {\tt makefile}s in the directories {\tt \$saclib/lib/objd} and {\tt \$saclib/\-lib/objo}. Step~(5) {\tt make}s the optimized library {\tt \$saclib/lib/saclibo.a} and the debugging library {\tt \$saclib/lib/saclibd.a}. Alternatively, {\tt mklib opt} ({\tt mklib deb}) {\tt make}s only the optimized (debugging) library. Under normal circumstances, you should type {\tt mklib all} to {\tt make} both libraries. Step~(6) {\tt make}s the interface progam {\tt isac}. Step~(7) creates the file {\tt \$saclib/doc/desc.doc}, which is used by the script {\tt sdesc}. Each of Steps (3)--(7) may take a minute or two to finish. \section{Modifying functions} Before modifying a \SACLIB/ file, you should first check-in the file so that the modification can be ``undone''. See Section~\ref{section:rcs} for details and an example. \section{Deleting functions} To delete a file, say {\tt OLDF.c}, from \SACLIB/, do the following. \begin{itemize} \item[(1)] If {\tt OLDF.c} does not have an RCS file, then check it in. \ (See Section~\ref{section:rcs}.) \item[(2)] Edit {\tt OLDF.c} so that `{\tt [ removed from library ]}' is the first line of the file {\tt OLDF.c}. \item[(3)] Check-in the modified {\tt OLDF.c} with \argu{state} set to {\tt del}. \item[(4)] {\tt rm \$saclib/src/OLDF.c} \item[(5)] {\tt cd \$saclib/lib} \item[(6)] {\tt ar d saclibd.a OLDF.o} \item[(7)] {\tt ar ts saclibd.a} \item[(8)] {\tt ar d saclibo.a OLDF.o} \item[(9)] {\tt ar ts saclibo.a} \item[(10)] {\tt rm objo/OLDF.o objd/OLDF.o} \item[(11)] {\tt mkproto} \item[(12)] {\tt mkmake} \item[(13)] {\tt mkdesc} \item[(14)] {\tt mkisac} \end{itemize} Note that the libraries do not have to be recompiled, but {\tt isac} should be remade. Steps~(6) and~(8) delete the specified object file from the specified library, and Steps~(7) and~(9) update the symbol table of the specified library. If you are deleting more than one file, then Steps~(6)--(9) may be performed only once by listing all the files to be deleted. For example, if you are deleting {\tt OLDF1.c} and {\tt OLDF2.c}, then you may do instead: \begin{itemize} \item[(6)] {\tt ar d saclibd.a OLDF1.o OLDF2.o} \item[(7)] {\tt ar ts saclibd.a} \item[(8)] {\tt ar d saclibo.a OLDF1.o OLDF2.o} \item[(9)] {\tt ar ts saclibo.a} \end{itemize} As an alternative to Steps~(11), (12), and ~(13), you can manually remove the corresponding lines in the files \begin{itemize} \item[] \verb|$saclib/include/sacproto.h|, \item[] \verb|$saclib/lib/objd/makefile|, \item[] \verb|$saclib/lib/objo/makefile|, and \item[] \verb|$saclib/doc/desc.doc|. \end{itemize} This alternative will be somewhat quicker, but will require more work on your part and is prone to error. \section{Revision control} \label{section:rcs} I've used the Revision Control System (RCS) for keeping track of the changes that have been made to \SACLIB/.\footnote{The RCS system is available at {\tt ftp.cs.purdue.edu} in the directory {\tt pub/RCS}.} The script {\tt sci} allows you to ``check-in'' a revision. Before making any changes to a file, that file should first be checked in so that the original revision of the file can be retrieved. For example, suppose I want to make changes to the algorithm of {\tt IPFAC.c}. Before making the changes, I would {\tt cd} to {\tt \$saclib/src} and type {\tt sci IPFAC.c init saclib}. I will then get a message on the screen that looks like: \begin{verbatim} /usr/local/saclib/saclib2.1/RCS/IPFAC.c,v <-- IPFAC.c enter description, terminated with single '.' or end of file: NOTE: This is NOT the log message! >> \end{verbatim} At the prompt {\tt >>}, I will now type the description of {\tt IPFAC.c}: \begin{verbatim} >> Integral polynomial factorization. >> . \end{verbatim} The period `{\tt .}' terminates the input. \ (If the backspace key does not work while the prompt {\tt >>} is active, then use CTRL-h instead.) \ The RCS file {\tt \$saclib/RCS/IPFAC.c,v} will now have been created. All future changes that are made to {\tt IPFAC.c} and that are recorded using {\tt sci} will be stored in that RCS file. After making my changes to {\tt IPFAC.c}, I should now check-in the changes. To do so, I type {\tt sci IPFAC.c algo Mark}. I will then get a message like: \begin{verbatim} /usr/local/saclib/saclib2.1/RCS/IPFAC.c,v <-- IPFAC.c new revision: 1.2; previous revision: 1.1 enter log message, terminated with single '.' or end of file: >> \end{verbatim} At the {\tt >>} prompt, I type in a short description of the changes that were made. For example, I might type: \begin{verbatim} >> Introduced heuristic that searches for a variable of >> degree 1 or 2 so that the polynomial can be factored >> by formula. \end{verbatim} If I make further changes to {\tt IPFAC.c}, for example, if I fix a bug in {\tt IPFAC.c}, then I would type {\tt sci IPFAC.c bug Mark}. Note that I should not type {\tt sci IPFAC.c init saclib} beforehand; that command should only be issued once for each file. The general form of the {\tt sci} command is: {\tt sci} \argu{filename} \argu{state} \argu{author}. The argument \argu{filename} should include the extension (`{\tt .c}', for instance). The argument \argu{state} should be one of the following: \begin{tabbing} XX \= {\tt algooo} \= \kill \> {\tt algo} \> algorithm change\\ \> {\tt bug} \> bug fix\\ \> {\tt del} \> deleted from library\\ \> {\tt embe} \> embellishment\\ \> {\tt init} \> initial revision\\ \> {\tt new} \> new file\\ \> {\tt typo} \> typographical correction\\ \> {\tt spec} \> specification correction \end{tabbing} The argument \argu{author} should be the name of the person who made the change. The \SACLIB/ maintainer will be the only person checking in revisions, but \argu{author} should be the name of the person proposing the change (so you know whom to blame!). The revision history of a file can be viewed using the script {\tt slog}. For example, {\tt slog IPFAC.c} will produce something like: {\small \begin{verbatim} ============================================================================= IPFAC.c Integral polynomial factorization. ---------------------------- revision 1.2 locked by: saclib; date: 1995/08/11 09:40:49; author: Mark; state: algo; lines: +48 -17 Introduced heuristic that searches for a variable of degree 1 or 2 so that the polynomial can be factored by formula. ---------------------------- revision 1.1 date: 1995/08/11 09:35:37; author: saclib; state: init; Initial revision ============================================================================= \end{verbatim} } The original revision of {\tt IPFAC.c} can be retrieved by typing {\tt slog IPFAC.c 1.1}; this will cause the original revision of {\tt IPFAC.c} to printed on the screen. You can save the original revision of {\tt IPFAC.c} to a file by redirection: {\tt slog IPFAC.c 1.1 > oIPFAC.c} will produce the file {\tt oIPFAC.c}, which will contain the original revision of {\tt IPFAC.c}. In general, any particular revision of a file can be retrieved in this way by giving the appropriate revision number (in place of `{\tt 1.1}' in the example above) as given in the output of {\tt slog}. \section{Deleting revisions} In some cases, you may want to delete a revision from an RCS file. A typical example is the following. Suppose I have a new version of {\tt IPFAC.c} that I want to put into \SACLIB/. While developing the new version of {\tt IPFAC.c}, I used a header file that I wrote, and this header file is {\tt \#include}d by the new {\tt IPFAC.c}. Now I check-in the new {\tt IPFAC.c}, but I neglect to change the {\tt \#include} statement. The erroneous new {\tt IPFAC.c} is now recorded in the RCS file {\tt \$saclib/RCS/IPFAC.c,v} as {\tt revision 1.3}, say. What should I do? One option would be to simply fix {\tt IPFAC.c} and check-in this new revision as {\tt revision 1.4}. This solution is not satisfactory because the silly mistake of not changing the {\tt \#include} statement will be recorded. To delete the erroneous revision, do the following. \begin{itemize} \item[(1)] {\tt cd \$saclib/RCS} \item[(2)] {\tt chmod 600 IPFAC.c,v} \item[(3)] {\tt rcs -u1.3 IPFAC.c,v} \item[(4)] {\tt rcs -o1.3 IPFAC.c,v} \item[(5)] {\tt rcs -l1.2 IPFAC.c,v} \item[(6)] {\tt chmod 444 IPFAC.c,v} \end{itemize} Step~(2) changes the file permissions so that you can write to the RCS file. Step~(3) unlocks revision 1.3 so that you can delete it. Step~(4) outdates (deletes) revision 1.3 from the RCS file. Step~(5) locks revision 1.2. You will not be able to check-in later revisions unless the last revision is locked by you. Step~(6) makes the file only readable, and not writable. I decided to set these permissions to avoid inadvertently changing the RCS files. \section{Listing the changes} To list the changes that have been made to the current version of \SACLIB/, I wrote the script {\tt slist}, that takes one argument chosen from {\tt algo}, {\tt bug}, {\tt del}, {\tt new}. For instance, {\tt slist new} will list the names of all new files. Finally, when a new version number is given to \SACLIB/, don't forget to modify \verb|$saclib/src/external.c|, where the version number is defined. \section*{Appendix: quick reference} \medskip \begin{tabbing} XXXXXXXX \= \kill {\tt mkdesc} \> Creates the file \verb|$saclib/doc/desc.doc|. \\[1em] {\tt mklib \argu{lib}} \> Recompiles the libraries \verb|$saclib/lib/saclib[do].a|. \\ \> \argu{lib} is one of {\tt all}, {\tt deb}, {\tt opt}. \\[1em] {\tt mkmake} \> Creates the files \verb|$saclib/lib/obj[do]/makefile|. \\[1em] {\tt mkproto} \> Creates the file \verb|$saclib/include/sacproto.h|.\\[1em] {\tt sci} \argu{filename} \argu{state} \argu{author}\\ \> Checks in a revision of \argu{filename} modified by \argu{author}.\\ \> \argu{state} is one of {\tt algo}, {\tt bug}, {\tt embe}, {\tt init}, {\tt new}, {\tt typo}, {\tt spec}. \\[1em] {\tt slist} \argu{type} \> Lists changes. \argu{type} is one of {\tt algo}, {\tt bug}, {\tt del}, {\tt new}. \\[1em] {\tt slog} \argu{filename} [\argu{ver}]\\ \> Displays revision history of \argu{filename}. If the optional argument \argu{ver}\\ \> is given, displays version \argu{ver} of \argu{filename}. \end{tabbing} \end{document} saclib2.2.8/doc/maint_guide/maintain.log0000664002275300236100000001003114017255270017300 0ustar wcbrownscsThis is TeX, Version 3.14159 (C version 6.1) (format=latex 96.10.29) 8 MAR 2000 13:08 **maintain (maintain.tex LaTeX2e <1996/06/01> Hyphenation patterns for english, german, loaded. (/usr/local/latex/texmf/tex/latex/base/latex209.def File: latex209.def 1996/05/21 v0.51 Standard LaTeX file Entering LaTeX 2.09 compatibility mode. \footheight=\dimen102 \@maxsep=\dimen103 \@dblmaxsep=\dimen104 \@cla=\count79 \@clb=\count80 \mscount=\count81 (/usr/local/latex/texmf/tex/latex/base/tracefnt.sty Package: tracefnt 1996/05/08 v3.0h Standard LaTeX package (font tracing) \tracingfonts=\count82 LaTeX Info: Redefining \selectfont on input line 139. ) \symbold=\mathgroup4 \symsans=\mathgroup5 \symtypewriter=\mathgroup6 \symitalic=\mathgroup7 \symsmallcaps=\mathgroup8 \symslanted=\mathgroup9 LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 307. LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 308. LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 309. LaTeX Font Info: Redeclaring math alphabet \mathit on input line 315. LaTeX Info: Redefining \em on input line 325. (/usr/local/latex/texmf/tex/latex/base/latexsym.sty Package: latexsym 1995/11/28 v2.2c Standard LaTeX package (lasy symbols) \symlasy=\mathgroup10 LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' (Font) U/lasy/m/n --> U/lasy/b/n on input line 86. ) LaTeX Font Info: Redeclaring math delimiter \lgroup on input line 389. LaTeX Font Info: Redeclaring math delimiter \rgroup on input line 391. LaTeX Font Info: Redeclaring math delimiter \bracevert on input line 393. (/usr/local/latex/texmf/tex/latex/config/latex209.cfg (/usr/local/latex/texmf/tex/latex/tools/rawfonts.sty Compatibility mode: package `' requested, but `rawfonts' provided. Package: rawfonts 1994/05/08 Low-level LaTeX 2.09 font compatibility (/usr/local/latex/texmf/tex/latex/tools/somedefs.sty Package: somedefs 1994/06/01 Toolkit for optional definitions ) LaTeX Font Info: Try loading font information for U+lasy on input line 36. (/usr/local/latex/texmf/tex/latex/base/Ulasy.fd File: Ulasy.fd 1995/11/28 v2.2cLaTeX symbol font definitions )))) Compatibility mode: loading maintain.sty rather than maintain.cls. (maintain.sty \@indentskip=\skip41 \smallindent=\skip42 \@footindent=\skip43 \@leftskip=\skip44 \c@part=\count83 \c@section=\count84 \c@subsection=\count85 \c@subsubsection=\count86 \c@paragraph=\count87 \c@subparagraph=\count88 \c@table=\count89 \c@figure=\count90 ) (maintain.aux) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 25. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 25. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 25. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 25. [1 ] [2] [3] [4] [5] (maintain.aux) ) Here is how much of TeX's memory you used: 559 strings out of 10910 5631 string characters out of 72284 51066 words of memory out of 262141 3438 multiletter control sequences out of 9500 25710 words of font info for 95 fonts, out of 150000 for 255 15 hyphenation exceptions out of 607 21i,9n,20p,299b,262s stack positions out of 300i,40n,60p,3000b,4000s Output written on maintain.dvi (5 pages, 14224 bytes). saclib2.2.8/doc/maint_guide/maintain.sty0000664002275300236100000007126314017255270017354 0ustar wcbrownscs%% JSC style hacked by MJE on August 23, 1995. % CUP Journal JSC document style -- V1.00 Released 23 January 1992 % for LaTeX version 2.09 % Copyright (C) 1992 Cambridge University Press % % based on the original LaTeX ARTICLE DOCUMENT STYLE % Copyright (C) 1988, 1989 by Leslie Lamport % %% \typeout{Document Style `JSC journal style'. V1.00 Released 23 January 1992} % % Journals use two-sided printing. % \@twosidetrue % Defines twoside option. \@mparswitchtrue % Marginpars go on outside of page. % draft option % \def\ds@draft{\overfullrule 5pt} % Causes overfull hboxes to be marked. % \@options % **************************************** % * FONTS * % **************************************** % \lineskip 1pt \normallineskip 1pt \def\baselinestretch{1} \def\quarter@line{3pt} \def\half@line{6pt} \def\full@line{12pt} \def\@normalsize{\@setsize\normalsize{\full@line}\xpt\@xpt \abovedisplayskip \half@line plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip \quarter@line plus 1pt \belowdisplayshortskip \abovedisplayskip \let\@listi\@listI} \def\small{\@setsize\small{10pt}\ixpt\@ixpt \abovedisplayskip 5pt plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip 2.5pt plus 1pt \belowdisplayshortskip \abovedisplayskip \def\@listi{\leftmargin\leftmargini \topsep 10pt plus 1pt minus 1pt \parsep \z@ \itemsep \parsep}} \def\medium{\@setsize\medium{10pt}\viiipt\@viiipt \abovedisplayskip 5pt plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip 2.5pt plus 1pt \belowdisplayshortskip \abovedisplayskip \def\@listi{\leftmargin\leftmargini \topsep 10pt plus 1pt minus 1pt \parsep \z@ \itemsep \parsep}} \def\footnotesize{\@setsize\footnotesize{9pt}\viiipt\@viiipt \abovedisplayskip 4.5pt plus 1pt minus 1pt \belowdisplayskip \abovedisplayskip \abovedisplayshortskip \z@ plus 1pt \belowdisplayshortskip \abovedisplayskip \def\@listi{\leftmargin\leftmargini \topsep 9pt plus 1pt minus 1pt \parsep \z@ \itemsep \parsep}} \def\scriptsize{\@setsize\scriptsize{8pt}\viipt\@viipt} \def\tiny{\@setsize\tiny{6pt}\vpt\@vpt} \def\large{\@setsize\large{14pt}\xiipt\@xiipt} \def\Large{\@setsize\Large{16pt}\xivpt\@xivpt} \def\LARGE{\@setsize\LARGE{21pt}\xviipt\@xviipt} \def\huge{\@setsize\huge{25pt}\xxpt\@xxpt} \def\Huge{\@setsize\Huge{30pt}\xxvpt\@xxvpt} \normalsize % Choose the normalsize font. % **************************************** % * PAGE LAYOUT * % **************************************** % % All margin dimensions measured from a point one inch from top and side % of page. % % SIDE MARGINS: \oddsidemargin 2pc % Left margin on odd-numbered pages. \evensidemargin 2pc % Left margin on even-numbered pages. \marginparwidth 2.0cm % Width of marginal notes. \marginparsep 10pt % Horizontal space between outer margin and % marginal note % VERTICAL SPACING: % Top of page: \topmargin 3pc % Nominal distance from top of page to top of % box containing running head. \headheight 18pt % Height of box containing running head. \headsep 6pt % Space between running head and text. \topskip = 12pt % '\baselineskip' for first line of page. % Bottom of page: \footheight \full@line % Height of box containing running foot. \footskip 18pt % Distance from baseline of box containing foot % to baseline of last line of text. % DIMENSION OF TEXT: % \textheight = 47\baselineskip \advance\textheight by \topskip % Height of text (including footnotes and figures, % excluding running head and foot). \textwidth 32pc % Width of text line. % For two-column mode: \columnsep 10pt % Space between columns \columnseprule 0pt % Width of rule between columns. % % FOOTNOTES: % \footnotesep \half@line % Height of strut placed at the beginning of every % footnote = height of normal \footnotesize strut, % so no extra space between footnotes. \skip\footins \full@line plus \full@line minus 1pt % Space between last line of text and % top of first footnote. % FOR FLOATS ON A TEXT PAGE: % \floatsep 12pt plus \half@line minus 1pt % Space between adjacent floats moved % to top or bottom of text page. \textfloatsep 18pt plus \half@line minus 3pt % Space between main text and floats % at top or bottom of page. \intextsep 18pt plus \quarter@line minus 2pt % Space between in-text figures and text \@maxsep 18pt % The maximum of \floatsep, % \textfloatsep and \intextsep (minus % the stretch and shrink). % TWO-COLUMN FLOATS IN TWO-COLUMN MODE: \dblfloatsep 12pt plus \half@line minus 2pt % Same as \floatsep for double-column \dbltextfloatsep 18pt plus 4.5pt minus 3pt % \textfloatsep for double-column \@dblmaxsep 18pt % The maximum of \dblfloatsep and % \dbltexfloatsep. % FOR FLOATS ON A SEPARATE FLOAT PAGE OR COLUMN: \@fptop 0pt plus 0fil % Stretch at top of float page/column. (Must be % 0pt plus ...) \@fpsep \full@line plus 0fil % Space between floats on float page/column. \@fpbot 0pt plus 3fil % Stretch at bottom of float page/column. (Must be % 0pt plus ... ) % DOUBLE-COLUMN FLOATS IN TWO-COLUMN MODE. \@dblfptop 0pt plus 0fil % Stretch at top of float page. (Must be 0pt plus ...) \@dblfpsep \full@line plus 0fil % Space between floats on float page. \@dblfpbot 0pt plus 3fil % Stretch at bottom of float page. (Must be % 0pt plus ... ) % MARGINAL NOTES: \marginparpush 6pt % Minimum vertical separation between two marginal % notes. % **************************************** % * PARAGRAPHING * % **************************************** % \parskip \z@ plus .1pt % Extra vertical space between paragraphs. \parindent 1em % Width of paragraph indentation. \partopsep 0pt plus 1pt % Extra vertical space, in addition to % % The following page-breaking penalties are defined % \@lowpenalty 51 % Produced by \nopagebreak[1] or \nolinebreak[1] \@medpenalty 151 % Produced by \nopagebreak[2] or \nolinebreak[2] \@highpenalty 301 % Produced by \nopagebreak[3] or \nolinebreak[3] % \@beginparpenalty -\@lowpenalty % Before a list or paragraph environment. \@endparpenalty -\@lowpenalty % After a list or paragraph environment. \@itempenalty -\@lowpenalty % Between list items. % \clubpenalty=0 % 'Club line' at bottom of page is OK. \widowpenalty=10000 % 'Widow line' at top of page is not good. % **************************************** % * PARTS * % **************************************** % \def\part{\par \addvspace{4ex} \@afterindentfalse \secdef\@part\@spart} \def\@part[#1]#2{\ifnum \c@secnumdepth >\m@ne \refstepcounter{part} \addcontentsline{toc}{part}{Part \thepart: #1} \else \addcontentsline{toc}{part}{#1} \fi {\parindent 0pt \raggedright \ifnum \c@secnumdepth >\m@ne \large\rm PART \ifcase\thepart \or ONE \or TWO \or THREE \or FOUR \or FIVE \or SIX \or SEVEN \or EIGHT \or NINE \or TEN \else \fi \par \nobreak \fi \LARGE \rm #2 \markboth{}{}\par } \nobreak \vskip 3ex \@afterheading } % Heading for \part* command \def\@spart#1{% {\parindent 0pt \raggedright \LARGE \rm #1\par} \nobreak \vskip 3ex \@afterheading } % **************************************** % * SECTIONS * % **************************************** % \def\section{\@startsection{section}{1}{\z@} {18pt plus 6pt minus 3pt} {6pt plus 0pt minus 1pt} {\centering\normalsize\bf}} \def\subsection{\@startsection{subsection}{2}{\z@} {\full@line plus 6pt minus 3pt} {\full@line plus 3pt minus 1pt} {\centering\normalsize\sc}} \def\subsubsection{\@startsection{subsubsection}{3}{\z@} {\full@line plus 6pt minus 3pt} {\full@line plus 3pt minus 1pt} {\noindent\normalsize\sc}} \def\paragraph{\@startsection{paragraph}{4}{\z@} {\full@line plus 6pt minus 3pt} {\half@line plus 3pt minus 1pt} {\noindent\normalsize\rm}} \def\subparagraph{\@startsection{subparagraph}{4}{\parindent} {\half@line plus 3.25pt minus 1pt} {-0.5em} {\normalsize\sc}} % The value of the counter secnumdepth gives the depth of the % highest-level sectioning command that is to produce section numbers. % \setcounter{secnumdepth}{3} % % Changes to \@sect to achieve full points after numbers in section headings % \def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth \def\@svsec{} \else \refstepcounter{#1} \edef\@svsec{\csname the#1\endcsname.\hskip 0.5em}\fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} \endgroup \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi #7} \else \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname {#7}\addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi#7}} \fi \@xsect{#5}} % % APPENDIX % \def\appendix{\par \setcounter{section}{0} \setcounter{subsection}{0} \def\thesection{\Alph{section}}} % **************************************** % * SKIPS * % **************************************** % \newskip\@indentskip % General CUP indent \newskip\smallindent % para. indent \newskip\@footindent % footnote indent \newskip\@leftskip % for CUP float stuff \@indentskip=2pc \smallindent=1em \@footindent=\smallindent \@leftskip=1pc % **************************************** % * LISTS * % **************************************** % \leftmargini \@indentskip \leftmarginii 1.5pc \leftmarginiii 1.5pc \leftmarginiv 1.5pc \leftmarginv 1pc \leftmarginvi 1pc \leftmargin\leftmargini \labelsep 0.5em \labelwidth\leftmargini\advance\labelwidth-\labelsep % % label macros for Range-Left and Range-Right labels \def\makeRLlabel#1{\rlap{#1}\hss} \def\makeRRlabel#1{\hss\llap{#1}} % \def\@listI{\leftmargin\leftmargini \parsep \z@ plus 1pt minus 1pt \topsep \full@line plus 1pt minus 1pt \itemsep \z@ plus 1pt minus 1pt \let\makelabel\makeRRlabel} \let\@listi\@listI \@listi \def\@listii{\leftmargin\leftmarginii \labelwidth\leftmarginii\advance\labelwidth-\labelsep \topsep \half@line plus 1pt minus 1pt \parsep \z@ \itemsep \parsep \let\makelabel\makeRRlabel} \def\@listiii{\leftmargin\leftmarginiii \labelwidth\leftmarginiii\advance\labelwidth-\labelsep \topsep \half@line plus 1pt minus 1pt \parsep \z@ \partopsep \z@ \itemsep \parsep \let\makelabel\makeRRlabel} \def\@listiv{\leftmargin\leftmarginiv \labelwidth\leftmarginiv\advance\labelwidth-\labelsep \let\makelabel\makeRRlabel} \def\@listv{\leftmargin\leftmarginv \labelwidth\leftmarginv\advance\labelwidth-\labelsep \let\makelabel\makeRRlabel} \def\@listvi{\leftmargin\leftmarginvi \labelwidth\leftmarginvi\advance\labelwidth-\labelsep \let\makelabel\makeRRlabel} % % ENUMERATE \def\enumerate{\ifnum \@enumdepth >3 \@toodeep \else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth}% \list{\csname label\@enumctr\endcsname}% {\usecounter{\@enumctr}\let\makelabel\makeRRlabel}% \fi} \def\labelenumi{\theenumi} \def\theenumi{\arabic{enumi}} \def\labelenumii{(\theenumii)} \def\theenumii{\alph{enumii}} \def\p@enumii{\theenumi} \def\labelenumiii{\theenumiii} \def\theenumiii{\roman{enumiii}} \def\p@enumiii{\theenumi(\theenumii)} \def\labelenumiv{\theenumiv} \def\theenumiv{\Alph{enumiv}} \def\p@enumiv{\p@enumiii\theenumiii} % % ITEMIZE % \def\itemize{\ifnum \@itemdepth >3 \@toodeep \else \advance\@itemdepth \@ne \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% \list{\csname\@itemitem\endcsname}{\let\makelabel\makeRRlabel}% \fi} \def\labelitemi{\quad} \def\labelitemii{\bf --} \def\labelitemiii{$\ast$} \def\labelitemiv{$\cdot$} % % DESCRIPTION % \def\descriptionlabel#1{\hspace\labelsep \bf #1} \def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin \let\makelabel\descriptionlabel}} \let\enddescription\endlist % % Unlabelled run-in list %\def\unnumlabel#1{\rm #1} \def\unnum{\list{}{\labelwidth\z@ % \let\makelabel\unnumlabel \leftmargin \parindent \itemindent-\parindent }} \let\endunnum\endlist % % VERSE % \def\verse{\let\\=\@centercr \list{}{\itemsep\z@ \itemindent -\@indentskip \listparindent \itemindent \rightmargin\leftmargin \advance\leftmargin \@indentskip}\item[]} \let\endverse\endlist % % QUOTATION % \def\quotation{\list{}{\listparindent \smallindent \itemindent\listparindent \leftmargin2.5pc\rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]\small} \let\endquotation=\endlist % % QUOTE -- same as quotation except no paragraph indentation, % \def\quote{\list{}{\leftmargin2.5pc\rightmargin\leftmargin}\item[]\small} \let\endquote=\endlist % % **************************************** % * TITLE AND ABSTRACT * % **************************************** % \def\maketitle{\par \begingroup \def\thefootnote{\fnsymbol{footnote}} \def\@makefnmark{\hbox to 0pt{$^{\@thefnmark}$\hss}} \newpage \global\@topnum\z@ \@maketitle \thispagestyle{titlepage} \@thanks \endgroup \setcounter{footnote}{0} \let\maketitle\relax \let\@maketitle\relax \gdef\@thanks{} % \gdef\@author{}\gdef\@title{} \let\thanks\relax} \def\and{\end{author@tabular}\vskip .25em\par \begin{author@tabular}[t]{@{}c@{}}} \def\@maketitle{\newpage \vspace*{26pt} {\parindent 0pt \centering\sloppy {\Large \bf \@title \par} \vskip 14pt {\normalsize \begin{author@tabular}[t]{@{}c@{}}\@author \end{author@tabular}\par} \vskip 9pt {\small \@date} \par\noindent} \vspace{-10pt} } \def\abstract{\list{}{\leftmargin 2.5pc\rightmargin \leftmargin \parsep 0pt plus 1pt\listparindent 1em\labelsep \z@}% \item[]\medium\top@eightrule\ignorespaces} % SFB to remove space \def\endabstract{\bottom@eightrule\endlist\vspace{14pt}} % **************************************** % * PAGE STYLES * % **************************************** % \mark{{}{}} % Initializes TeX's marks \gdef\@author{\mbox{}} % SFB 0.02 \def\author{\@ifnextchar [{\@authortwo}{\@authorone}} \def\@authortwo[#1]#2{\gdef\@author{#2}\gdef\@shortauthor{#1}} \def\@authorone#1{\gdef\@author{#1}\gdef\@shortauthor{#1}} \def\shortauthor#1{\gdef\@shortauthor{#1}} \gdef\@shortauthor{\@author} \gdef\@title{\mbox{}} % SFB 0.02 \def\title{\@ifnextchar [{\@titletwo}{\@titleone}} \def\@titletwo[#1]#2{\gdef\@title{#2}\gdef\@shorttitle{#1}} \def\@titleone#1{\gdef\@title{#1}\gdef\@shorttitle{#1}} \def\shorttitle#1{\gdef\@shorttitle{#1}} \gdef\@shorttitle{\@title} \def\volume#1{\gdef\@volume{#1}} \gdef\@volume{11} \def\pagerange#1{\gdef\@pagerange{#1}} \gdef\@pagerange{1--000} \def\journal#1{\gdef\@journal{#1}} \gdef\@journal{{\it J. Symbolic Computation\/} (\number\year) {\bf \@volume}, \@pagerange} % \ps@empty and \ps@plain defined in LATEX.TEX \def\ps@headings{\let\@mkboth\markboth \def\@oddhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\hfill\footnotesize\rm \@shorttitle \hspace{3em}\thepage} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@oddfoot{} \def\@evenhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\footnotesize\rm\thepage\hspace{3em}\@shortauthor\hfill} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@evenfoot{} \def\sectionmark##1{\markboth{##1}{}} \def\subsectionmark##1{\markright{##1}} } % Definition of 'myheadings' page style. % \def\ps@myheadings{\let\@mkboth\@gobbletwo \def\@oddhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\hfill\footnotesize\rm\rightmark\hspace{3em}\thepage} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@oddfoot{} \def\@evenhead{\hss\vbox{\hsize=\textwidth \hbox to \textwidth {\strut\footnotesize\rm\thepage\hspace{3em}\leftmark\hfill} \vskip 2.5pt \hrule height \arrayrulewidth}} \def\@evenfoot{} \def\sectionmark##1{} \def\subsectionmark##1{} } \def\ps@titlepage{\let\@mkboth\@gobbletwo \def\@oddhead{} \def\@oddfoot{} \def\@evenhead{} \def\@evenfoot{} \def\sectionmark##1{} \def\subsectionmark##1{} } % **************************************** % * OTHER ENVIRONMENTS * % **************************************** % % THEOREM % %\def\@thmcounter#1{\noexpand\thesection.\noexpand\arabic{#1}} %\@addtoreset{#1}{section} \def\@nthm#1#2{\@ifnextchar[{\@xnthm{#1}{#2}}{\@xnthm{#1}{#2}[section]}} \def\@begintheorem#1#2{\it \trivlist \item[\hskip \labelsep{\sc #1\ #2.}]} \def\@opargbegintheorem#1#2#3{\it \trivlist \item[\hskip \labelsep{\sc #1\ #2.\hspace{0.5em}(#3)}]} \def\@endtheorem{\endtrivlist} \def\proof{\rm \trivlist % \item[\hskip \labelsep{\sc Proof.\hspace{0.5em}}]} \item[\hskip \labelsep{\sc Proof.}]} \def\endproof{{\large$\Box$}\endtrivlist} \@namedef{proof*}{\rm \trivlist \item[\hskip \labelsep{\sc Proof.}]} \@namedef{endproof*}{\endtrivlist} % TITLEPAGE % \def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn \else \newpage \fi \thispagestyle{empty}\c@page\z@} \def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi} % ARRAY AND TABULAR % \arraycolsep 5pt % Half the space between columns in an array environment. \tabcolsep 6pt % Half the space between columns in a tabular environment. \arrayrulewidth .4pt % Width of rules in array and tabular environment. \doublerulesep 1.5pt % Space between adjacent rules in array or tabular env. %\renewcommand{\arraystretch}{1} \def\tabular{\def\@halignto{} \doublerulesep \z@ \def\hline{\noalign{\ifnum0=`}\fi \vskip 4.5pt \hrule \@height \arrayrulewidth \vskip 4.5pt \futurelet \@tempa\@xhline} \def\@xhline{\ifx\@tempa\hline \vskip -9pt \vskip \doublerulesep \fi \ifnum0=`{\fi}} \def\@arrayrule{\@addtopreamble{\hskip -.5\arrayrulewidth % \vrule \@width \arrayrulewidth \hskip .5\arrayrulewidth}} \@tabular } % TABBING % \tabbingsep \labelsep % Space used by the \'75ommand. (See LaTeX manual.) % MINIPAGE % \skip\@mpfootins = \skip\footins % FRAMEBOX % \fboxsep = 3pt % Space left between box and text by \fbox and \framebox. \fboxrule = \arrayrulewidth % Width of rules in box made by \fbox and \framebox. % **************************************** % * SECTIONS * % **************************************** % \newcounter{part} \newcounter {section} \newcounter {subsection}[section] \newcounter {subsubsection}[subsection] \newcounter {paragraph}[subsubsection] \newcounter {subparagraph}[paragraph] \def\thepart {\arabic{part}} \def\thesection {\arabic{section}} \def\thesubsection {\thesection.\arabic{subsection}} \def\thesubsubsection {\thesubsection.\arabic{subsubsection}} \def\theparagraph {\thesubsubsection.\arabic{paragraph}} \def\thesubparagraph {\theparagraph.\arabic{subparagraph}} % **************************************** % * TABLE OF CONTENTS, ETC. * % **************************************** % \def\@pnumwidth{1.55em} \def\@tocrmarg {2.55em} \def\@dotsep{4.5} \setcounter{tocdepth}{1} \def\@undottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else \vskip \z@ plus .2pt {\hangindent #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip \parindent #2\relax \@afterindenttrue \interlinepenalty\@M \leavevmode \@tempdima #3\relax #4\nobreak \hfill \nobreak \hbox to\@pnumwidth{\hfil\rm \ }\par}\fi} % TABLEOFCONTENTS % \def\tableofcontents{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \section*{Contents} \@starttoc{toc} \if@restonecol\twocolumn\fi \par\vspace{\full@line}} \def\l@part#1#2{\addpenalty{-\@highpenalty} \addvspace{2.25em plus 1pt} \begingroup \parindent \z@ \rightskip \@pnumwidth \parfillskip -\@pnumwidth {\normalsize\rm \leavevmode \hspace*{3pc} #1\hfil \hbox to\@pnumwidth{\hss \ }}\par \nobreak \global\@nobreaktrue \everypar{\global\@nobreakfalse\everypar{}}% \endgroup } \def\l@section#1#2{\addpenalty{\@secpenalty} \@tempdima 1.5em \begingroup \parindent \z@ \rightskip \@pnumwidth \parfillskip -\@pnumwidth \rm \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss \ }\par \endgroup } \def\l@subsection{\@undottedtocline{2}{1.5em}{2.3em}} \def\l@subsubsection{\@undottedtocline{3}{3.8em}{3.2em}} \def\l@paragraph{\@undottedtocline{4}{7.0em}{4.1em}} \def\l@subparagraph{\@undottedtocline{5}{10em}{5em}} % LIST OF FIGURES % \def\listoffigures{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \section*{List of Figures\@mkboth{List of Figures}{List of Figures}} \@starttoc{lof} \if@restonecol\twocolumn\fi } \def\l@figure{\@undottedtocline{1}{1.5em}{2.3em}} % LIST OF TABLES % \def\listoftables{\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \section*{List of Tables\@mkboth{List of Tables}{List of Tables}} \@starttoc{lot} \if@restonecol\twocolumn\fi } \let\l@table\l@figure % **************************************** % * BIBLIOGRAPHY * % **************************************** % \def\@biblabel#1{#1} \def\thebibliography#1{\section*{References} \addcontentsline{toc}{section}{References} \list{}{\labelwidth\z@ % \leftmargin \@indentskip \leftmargin 1.5pc \itemindent-\leftmargin} \footnotesize \parindent\z@ \parskip\z@ plus .1pt\relax \def\newblock{\hskip .11em plus .33em minus .07em} \sloppy\clubpenalty4000\widowpenalty4000 \sfcode`\.=1000\relax} \let\endthebibliography=\endlist % **************************************** % * THE INDEX * % **************************************** % \newif\if@restonecol \def\theindex{\section*{Index} \addcontentsline{toc}{section}{Index} \footnotesize \parindent\z@ \parskip\z@ plus .1pt\relax \let\item\@idxitem} \def\@idxitem{\par\hangindent 1pc} \def\subitem {\par\hangindent 1pc \hspace*{1pc}} \def\subsubitem{\par\hangindent 1pc\hspace*{1pc}} \def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi} \def\indexspace{\par\vskip\baselineskip \relax} % **************************************** % * FOOTNOTES * % **************************************** % \def\footnoterule{\kern-3\p@ \hrule width .4\columnwidth height \z@ \kern 3\p@} \long\def\@makefntext#1{\parindent 1em\noindent \hbox to 1.5em{\hss$^{\@thefnmark}$}\hspace{0.5em}#1} %\long\def\@makefntext#1{\@setpar{\@@par\@tempdima \hsize % \advance\@tempdima-\@footindent % \parshape \@ne \@footindent \@tempdima}\par % \noindent \hbox to \z@{\hss$^{\@thefnmark}$\ }#1} % \renewcommand{\thefootnote}{\mbox{$\fnsymbol{footnote}$}} \@addtoreset{footnote}{page} \def\@fnsymbol#1{\ifcase#1\or \dagger\or \ddagger\or \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi\relax} % **************************************** % * FIGURES AND TABLES * % **************************************** % \setcounter{topnumber}{2} \def\topfraction{.9} \setcounter{bottomnumber}{1} \def\bottomfraction{.9} \setcounter{totalnumber}{3} \def\textfraction{.1} \def\floatpagefraction{.75} \setcounter{dbltopnumber}{2} \def\dbltopfraction{.9} \def\dblfloatpagefraction{.75} % \long\def\@makecaption#1#2{\vskip \half@line \ifwide@float \raggedright\sloppy #1. #2\par \else \raggedright\sloppy #1. #2\par \fi} % TABLE % \newcounter{table} \def\thetable{\@arabic\c@table} \def\fps@table{tbp} \def\ftype@table{1} \def\ext@table{lot} \def\fnum@table{Table \thetable} \def\table{\@float{table}} \let\endtable\end@float \@namedef{table*}{\@dblfloat{table}} \@namedef{endtable*}{\end@dblfloat} \def\fstyle@table{\footnotesize\rm} \def\fjust@table{\centering} \def\fcapjust@table{\centering\sloppy} \def\fcapsize@table{\normalsize\bf} \def\fcapstyle@table{\normalsize\rm} % % FIGURE % \newcounter{figure} \def\thefigure{\@arabic\c@figure} \def\fps@figure{tbp} \def\ftype@figure{2} \def\ext@figure{lof} \def\fnum@figure{Figure\ \thefigure} \def\figure{\@float{figure}} \let\endfigure\end@float \@namedef{figure*}{\@dblfloat{figure}} \@namedef{endfigure*}{\end@dblfloat} \def\fstyle@figure{\footnotesize\rm} \def\fjust@figure{\centering} \def\fcapjust@figure{\centering\sloppy} \def\fcapsize@figure{\footnotesize\bf} \def\fcapstyle@figure{\footnotesize\rm} % % stuff for different style float captions % \newif\ifwide@float \wide@floatfalse \long\def\@caption#1[#2]#3{\addcontentsline{\csname ext@#1\endcsname}{#1}% {\protect\numberline{\csname the#1\endcsname}% {\ignorespaces #2}}\par \begingroup \ifwide@float\@parboxrestore\else\@myparboxrestore\fi \@makecaption{\csname fcapjust@#1\endcsname \csname fcapsize@#1\endcsname \csname fnum@#1\endcsname}% {\csname fcapstyle@#1\endcsname \ignorespaces #3}\par \endgroup } \def\@xfloat#1[#2]{% \ifhmode \@bsphack\@floatpenalty-\@Mii \else \@floatpenalty-\@Miii\fi \def\@captype{#1}% \ifinner \@parmoderr\@floatpenalty\z@ \else \@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname \multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n \@tfor \@tempa :=#2\do {\if\@tempa h\advance\@tempcnta \@ne\fi \if\@tempa t\advance\@tempcnta \tw@\fi \if\@tempa b\advance\@tempcnta 4\relax\fi \if\@tempa p\advance\@tempcnta 8\relax\fi }\global\count\@currbox\@tempcnta}\@fltovf \fi \global\setbox\@currbox\vbox\bgroup \boxmaxdepth\z@ \csname fstyle@#1\endcsname \ifwide@float \hsize\textwidth \linewidth\textwidth \@parboxrestore \else \hsize\textwidth \linewidth\textwidth \@parboxrestore %\hsize\columnwidth \addtolength{\hsize}{-2pc} \@rightskip 2pc % \@myparboxrestore \fi \csname fjust@#1\endcsname } \def\@myarrayparboxrestore{\let\par\@@par \let\-\@dischyph \let\'\@acci \let\`\@accii \let\=\@acciii \parindent\z@ \everypar{}\linewidth\hsize \@totalleftmargin\z@ \leftskip\@leftskip \rightskip\@rightskip \parfillskip\@flushglue \lineskip\normallineskip \baselineskip\normalbaselineskip\sloppy } \def\@myparboxrestore{\@myarrayparboxrestore\let\\=\@normalcr} % % stuff for wide floats % \def\@dblfloat{\wide@floattrue\@float} \def\end@dblfloat{\if@twocolumn\egroup \ifnum\@floatpenalty <\z@ \@cons\@dbldeferlist\@currbox\fi \ifnum \@floatpenalty =-\@Mii \@esphack\fi\else\end@float\fi \wide@floatfalse } % **************************************** % * CUP specials * % **************************************** % \def\author@tabular{\def\@halignto{}\@authortable} \let\endauthor@tabular=\endtabular \def\author@tabularcr{{\ifnum0=`}\fi \@xtabularcr[4pt]\small\it\ignorespaces} \def\author@tabularcrnospace{{\ifnum0=`}\fi \@xtabularcr[-2pt]\small\it\ignorespaces} \def\@authortable{\leavevmode \hbox \bgroup $\let\@acol\@tabacol \let\@classz\@tabclassz \let\@classiv\@tabclassiv \let\\\author@tabularcr \let\nextaddress\author@tabularcrnospace \@tabarray} \def\long@rule{\par\noindent\rule{\textwidth}{\arrayrulewidth}\par\noindent} \def\short@rule{\par\noindent\rule{27pc}{\arrayrulewidth}\par\noindent} \def\top@eightrule{\par% \rule{27pc}{\arrayrulewidth}\vspace{4pt}\par\noindent} \def\bottom@eightrule{\par\noindent% \vspace{-1pt}\rule{27pc}{\arrayrulewidth}\par\noindent} \@addtoreset{equation}{section} \def\theequation{\thesection.\arabic{equation}} % **************************************** % * MISCELLANEOUS * % **************************************** % % DATE % \def\today{\number\day\ \ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December \fi \ \number\year} % **************************************** % * INITIALIZATION * % **************************************** % % Default initializations \ps@headings % `headings' page style \pagenumbering{arabic} % Arabic page numbers \onecolumn % Switch to \onecolumn and disable \twocolumn. \let\onecolumn=\relax \def\twocolumn{\typeout{Two column mode not available with CUP styles.}} % \flushbottom \frenchspacing saclib2.2.8/doc/user_guide/0000775002275300236100000000000014017255270014650 5ustar wcbrownscssaclib2.2.8/doc/user_guide/saclocal.log0000664002275300236100000001134214017255270017135 0ustar wcbrownscsThis is TeX, Version 3.14159 (C version 6.1) (format=latex 96.10.29) 8 JUL 1998 13:44 **saclocal.tex (saclocal.tex LaTeX2e <1996/06/01> Hyphenation patterns for english, german, loaded. (/usr/local/latex/texmf/tex/latex/base/latex209.def File: latex209.def 1996/05/21 v0.51 Standard LaTeX file Entering LaTeX 2.09 compatibility mode. \footheight=\dimen102 \@maxsep=\dimen103 \@dblmaxsep=\dimen104 \@cla=\count79 \@clb=\count80 \mscount=\count81 (/usr/local/latex/texmf/tex/latex/base/tracefnt.sty Package: tracefnt 1996/05/08 v3.0h Standard LaTeX package (font tracing) \tracingfonts=\count82 LaTeX Info: Redefining \selectfont on input line 139. ) \symbold=\mathgroup4 \symsans=\mathgroup5 \symtypewriter=\mathgroup6 \symitalic=\mathgroup7 \symsmallcaps=\mathgroup8 \symslanted=\mathgroup9 LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 307. LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 308. LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 309. LaTeX Font Info: Redeclaring math alphabet \mathit on input line 315. LaTeX Info: Redefining \em on input line 325. (/usr/local/latex/texmf/tex/latex/base/latexsym.sty Package: latexsym 1995/11/28 v2.2c Standard LaTeX package (lasy symbols) \symlasy=\mathgroup10 LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' (Font) U/lasy/m/n --> U/lasy/b/n on input line 86. ) LaTeX Font Info: Redeclaring math delimiter \lgroup on input line 389. LaTeX Font Info: Redeclaring math delimiter \rgroup on input line 391. LaTeX Font Info: Redeclaring math delimiter \bracevert on input line 393. (/usr/local/latex/texmf/tex/latex/config/latex209.cfg (/usr/local/latex/texmf/tex/latex/tools/rawfonts.sty Compatibility mode: package `' requested, but `rawfonts' provided. Package: rawfonts 1994/05/08 Low-level LaTeX 2.09 font compatibility (/usr/local/latex/texmf/tex/latex/tools/somedefs.sty Package: somedefs 1994/06/01 Toolkit for optional definitions ) LaTeX Font Info: Try loading font information for U+lasy on input line 36. (/usr/local/latex/texmf/tex/latex/base/Ulasy.fd File: Ulasy.fd 1995/11/28 v2.2cLaTeX symbol font definitions )))) (/usr/local/latex/texmf/tex/latex/base/article.cls Document Class: article 1996/05/26 v1.3r Standard LaTeX document class (/usr/local/latex/texmf/tex/latex/base/size10.clo File: size10.clo 1996/05/26 v1.3r Standard LaTeX file (size option) ) \c@part=\count83 \c@section=\count84 \c@subsection=\count85 \c@subsubsection=\count86 \c@paragraph=\count87 \c@subparagraph=\count88 \c@figure=\count89 \c@table=\count90 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 Compatibility mode: definition of \rm ignored. Compatibility mode: definition of \sf ignored. Compatibility mode: definition of \tt ignored. Compatibility mode: definition of \bf ignored. Compatibility mode: definition of \it ignored. Compatibility mode: definition of \sl ignored. Compatibility mode: definition of \sc ignored. LaTeX Info: Redefining \cal on input line 543. LaTeX Info: Redefining \mit on input line 544. \bibindent=\dimen105 ) (saclib.sty \arrow=\box26 \cell=\box27 \dline=\box28 ) (saclocal.aux) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. LaTeX Font Info: ... okay on input line 5. LaTeX Font Info: External font `cmex10' loaded for size (Font) <17.28> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 16. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 16. [1 ] [2] (saclocal.aux) ) Here is how much of TeX's memory you used: 594 strings out of 10910 5776 string characters out of 72284 49645 words of memory out of 262141 3465 multiletter control sequences out of 9500 26055 words of font info for 96 fonts, out of 150000 for 255 14 hyphenation exceptions out of 607 26i,6n,20p,310b,248s stack positions out of 300i,40n,60p,3000b,4000s Output written on saclocal.dvi (2 pages, 3884 bytes). saclib2.2.8/doc/user_guide/saclib.sty0000664002275300236100000000371014017255270016647 0ustar wcbrownscs% SHORTHAND FOR FREQUENTLY USED EXPRESSIONS \newcommand{\saclib}{\mbox{\rm SACLIB}} \newcommand{\isac}{\mbox{\rm ISAC}} \newcommand{\Word}{{\tt Word}} \newcommand{\BDigit}{{\tt BDigit}} \newcommand{\GCArray}{{\tt GCArray}} \newcommand{\Wordptr}{{\tt (Word *)}} \newcommand{\NIL}{{\tt NIL}} \newcommand{\BETA}{{\tt BETA}} \newcommand{\BETAone}{{\tt BETA1}} \newcommand{\GAMMA}{{\tt GAMMA}} \newcommand{\SLOGV}{{\tt SLOGV}} \newcommand{\SLOGA}{{\tt SLOGA}} \newcommand{\SPACE}{{\tt SPACE}} \newcommand{\SPACEB}{{\tt SPACEB}} \newcommand{\SPACEBone}{{\tt SPACEB1}} \newcommand{\GCASPACE}{{\tt GCASPACE}} \newcommand{\GCASPACEBp}{{\tt GCASPACEBp}} \newcommand{\BETAp}{{\tt BETAp}} \newcommand{\BETApp}{{\tt BETApp}} \newcommand{\NU}{{\tt NU}} \newcommand{\NUp}{{\tt NUp}} \newcommand{\RHO}{{\tt RHO}} \newcommand{\AVAIL}{{\tt AVAIL}} \newcommand{\GCAAVAIL}{{\tt GCAAVAIL}} \newcommand{\GCGLOBALS}{{\tt GCGLOBALS}} \newcommand{\ttA}{{\tt A}} \newcommand{\tta}{{\tt a}} \newcommand{\ttD}{{\tt D}} \newcommand{\ttE}{{\tt E}} \newcommand{\ttI}{{\tt I}} \newcommand{\ttL}{{\tt L}} \newcommand{\ttN}{{\tt N}} \newcommand{\ttP}{{\tt P}} \newcommand{\ttR}{{\tt R}} \newcommand{\BbbZ}{{\bf Z}} \newcommand{\BbbQ}{{\bf Q}} \newcommand{\BbbD}{{\bf D}} \newcommand{\mod}{\,{\rm mod}\,} \newcommand{\sign}{\mbox{\rm sign}} \newcommand{\norm}{{\rm Norm}} \newcommand{\res}{{\rm res}} % LIST WITH USER-DEFINED INDENTATION \newenvironment{glists}[4]{ \begin{list}{}{ \setlength{\labelwidth}{#2} \setlength{\labelsep}{#3} \setlength{\leftmargin}{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \setlength{\parsep}{#4} \setlength{\topsep}{\parsep} \setlength{\itemsep}{\parsep} \setlength{\listparindent}{0in} } }{ \end{list} } \newcommand{\iteml}[1]{\item[\tt #1 \hfill]} % GRAPHICS \newsavebox{\arrow} \newsavebox{\cell} \newsavebox{\dline} \unitlength0.5pt \savebox{\dline}(0,0)[lb]{ \multiput( 0, 0)(3,0){5}{\line(1,0){1}} } saclib2.2.8/doc/user_guide/saclib.lof0000664002275300236100000000144714017255270016615 0ustar wcbrownscs\addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } \contentsline {figure}{\numberline {A.1}{\ignorespaces A sample program.}}{52} \contentsline {figure}{\numberline {A.2}{\ignorespaces Sample code using GCA handles.}}{53} \contentsline {figure}{\numberline {A.3}{\ignorespaces Declaring global variables.}}{54} \contentsline {figure}{\numberline {A.4}{\ignorespaces Sample code for initializing SACLIB by hand.}}{56} \addvspace {10\p@ } \addvspace {10\p@ } \contentsline {figure}{\numberline {C.1}{\ignorespaces The {\tt SPACE}\ array.}}{61} \contentsline {figure}{\numberline {C.2}{\ignorespaces The cell structure of the list ${\tt L}= (1,(9,6),8)$.}}{61} saclib2.2.8/doc/user_guide/saclocal.aux0000664002275300236100000000103314017255270017145 0ustar wcbrownscs\relax \@writefile{toc}{\contentsline {section}{\numberline {1}Availability}{1}} \@writefile{toc}{\contentsline {section}{\numberline {2}Environment}{1}} \@writefile{toc}{\contentsline {section}{\numberline {3}Compiling and Linking}{1}} \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces A sample makefile.}}{2}} \newlabel{fMF}{{1}{2}} \@writefile{toc}{\contentsline {section}{\numberline {4}Additional Documentation, Tools, etc.}{2}} \@writefile{toc}{\contentsline {section}{\numberline {5}Where to Look for Help}{2}} saclib2.2.8/doc/user_guide/saclocal.tex0000664002275300236100000000741014017255270017155 0ustar wcbrownscs\documentclass{article} \usepackage{saclib} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{ Addendum\\to the\\\saclib\ User's Guide\thanks{ \saclib\ version 1.0, ``Addendum'' version 1.0. } } \author{Andreas Neubacher} \date{June 26, 1992} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Availability} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \saclib\ is installed on \ldots in the directory ``{\tt\~{ }saclib/saclib}''. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Environment} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% It is recommended to define an environment variable ``{\tt \$saclib}'' containing the name of the \saclib\ directory. This can be done by adding the line \begin{verbatim} setenv saclib ~saclib/saclib \end{verbatim} to your ``{\tt .login}'' or ``{\tt .cshrc}'' file. \saclib\ header and library files should then only be accessed by using this variable. If the installation is moved to a different directory you will only have to change the definition of this variable. If you want to use the shell scripts provided with \saclib, the environment variable ``{\tt \$saclib}'' is required, and you also need \begin{verbatim} set path=($path $saclib/bin) \end{verbatim} in your ``{\tt .login}'' or ``{\tt .cshrc}'' file. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compiling and Linking} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \sloppy The compiled library is ``{\tt \$saclib/lib/saclib.a}'', an optimized version is ``{\tt \$saclib/lib/saclibo.a}'', a version compiled with the debug option is ``{\tt \$saclib/lib/saclibd.a}'', and the header files are in ``{\tt \$saclib/include}''. Figure \ref{fMF} shows what a makefile for linking with the standard library might look like. \begin{figure}[htb] \ \hrulefill\ \small \begin{verbatim} CFLAGS = -DNO_SACLIB_MACROS -I${saclib}/include LIB = ${saclib}/lib/saclib.a OBJS = example.o example: $(OBJS) ${CC} $(OBJS) $(LIB) -o example \end{verbatim} \ \hrulefill\ \normalsize \caption{A sample makefile.} \label{fMF} \end{figure} \fussy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Additional Documentation, Tools, etc.} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In ``{\tt \$saclib/example}'' you will find sample programs which are a bit more sophisticated than the ones given in the ``\saclib\ User's Guide''. They should be of help in learning how to work with \saclib. There are also two shell scripts which should facilitate searching for a certain algorithm and displaying \saclib\ functions: \begin{description} \item[sdesc] takes a regular expression in the style of {\tt grep} and lists all \saclib\ functions whose description matches the regular expression. \item[sman] takes a full \saclib\ function name and displays the corresponding source file. \end{description} Calling the scripts without parameters produces a usage message. For experimenting with \saclib\ functions interactively, use ``{\tt isac}'', which gives you a simple shell environment from which you can call all \saclib\ functions. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Where to Look for Help} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Apart from sending e-mail to the adresses given in Section 1.3 of the ``User's Guide'' you can also ask \ldots \end{document} saclib2.2.8/doc/user_guide/cCFC.tex0000664002275300236100000003655114017255270016142 0ustar wcbrownscsThis chapter describes how the \saclib\ environment has to be set up for \saclib\ functions to work correctly. We will start with a quick introduction to the basics using a sample program in Section \ref{c:CFC s:SP}. In Section \ref{c:CFC s:MA} we describe the steps necessary for combining dynamic allocation with \saclib\ list processing. Special care has to be taken with \saclib\ data structures addressed by global variables. This is explained in Section \ref{c:CFC s:GV}. Finally, Section \ref{c:CFC s:IS} describes how \saclib\ can be initialized without using {\tt sacMain()}, and Section \ref{c:CFC s:EH} gives some information on error handling in \saclib. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{A Sample Program} \label{c:CFC s:SP} Figure \ref{f:sample} shows the basic layout of a program using \saclib\ functions. \begin{figure}[htb] \ \hrulefill\ \small \begin{verbatim} #include "saclib.h" int sacMain(argc, argv) int argc; char **argv; { Word I1,I2,I3,t; Word i,n; Step1: /* Input. */ SWRITE("Please enter the first integer: "); I1 = IREAD(); SWRITE("Please enter the second integer: "); I2 = IREAD(); SWRITE("How many iterations? "); n = GREAD(); Step2: /* Processing. */ t = CLOCK(); for (i=0; i Hyphenation patterns for english, german, loaded. (/usr/local/latex/texmf/tex/latex/base/latex209.def File: latex209.def 1996/05/21 v0.51 Standard LaTeX file Entering LaTeX 2.09 compatibility mode. \footheight=\dimen102 \@maxsep=\dimen103 \@dblmaxsep=\dimen104 \@cla=\count79 \@clb=\count80 \mscount=\count81 (/usr/local/latex/texmf/tex/latex/base/tracefnt.sty Package: tracefnt 1996/05/08 v3.0h Standard LaTeX package (font tracing) \tracingfonts=\count82 LaTeX Info: Redefining \selectfont on input line 139. ) \symbold=\mathgroup4 \symsans=\mathgroup5 \symtypewriter=\mathgroup6 \symitalic=\mathgroup7 \symsmallcaps=\mathgroup8 \symslanted=\mathgroup9 LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 307. LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 308. LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 309. LaTeX Font Info: Redeclaring math alphabet \mathit on input line 315. LaTeX Info: Redefining \em on input line 325. (/usr/local/latex/texmf/tex/latex/base/latexsym.sty Package: latexsym 1995/11/28 v2.2c Standard LaTeX package (lasy symbols) \symlasy=\mathgroup10 LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' (Font) U/lasy/m/n --> U/lasy/b/n on input line 86. ) LaTeX Font Info: Redeclaring math delimiter \lgroup on input line 389. LaTeX Font Info: Redeclaring math delimiter \rgroup on input line 391. LaTeX Font Info: Redeclaring math delimiter \bracevert on input line 393. (/usr/local/latex/texmf/tex/latex/config/latex209.cfg (/usr/local/latex/texmf/tex/latex/tools/rawfonts.sty Compatibility mode: package `' requested, but `rawfonts' provided. Package: rawfonts 1994/05/08 Low-level LaTeX 2.09 font compatibility (/usr/local/latex/texmf/tex/latex/tools/somedefs.sty Package: somedefs 1994/06/01 Toolkit for optional definitions ) LaTeX Font Info: Try loading font information for U+lasy on input line 36. (/usr/local/latex/texmf/tex/latex/base/Ulasy.fd File: Ulasy.fd 1995/11/28 v2.2cLaTeX symbol font definitions )))) (/usr/local/latex/texmf/tex/latex/base/report.cls Document Class: report 1996/05/26 v1.3r Standard LaTeX document class (/usr/local/latex/texmf/tex/latex/base/size10.clo File: size10.clo 1996/05/26 v1.3r Standard LaTeX file (size option) ) \c@part=\count83 \c@chapter=\count84 \c@section=\count85 \c@subsection=\count86 \c@subsubsection=\count87 \c@paragraph=\count88 \c@subparagraph=\count89 \c@figure=\count90 \c@table=\count91 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 Compatibility mode: definition of \rm ignored. Compatibility mode: definition of \sf ignored. Compatibility mode: definition of \tt ignored. Compatibility mode: definition of \bf ignored. Compatibility mode: definition of \it ignored. Compatibility mode: definition of \sl ignored. Compatibility mode: definition of \sc ignored. LaTeX Info: Redefining \cal on input line 620. LaTeX Info: Redefining \mit on input line 621. \bibindent=\dimen105 ) (saclib.sty \arrow=\box26 \cell=\box27 \dline=\box28 ) (makeidx.sty) (DinA4.sty) \@indexfile=\write3 Writing index file saclib.idx (saclib.aux) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. LaTeX Font Info: ... okay on input line 7. LaTeX Font Info: External font `cmex10' loaded for size (Font) <17.28> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 27. LaTeX Font Info: Try loading font information for OMS+cmr on input line 27. (/usr/local/latex/texmf/tex/latex/base/OMScmr.fd File: OMScmr.fd 1996/05/19 v2.4h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <9> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <9> on input line 27. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 27. [0 ] LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 34. [1 ] [0] (saclib.toc LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 2. [1 ] [2]) \tf@toc=\write4 [3] (saclib.lof) \tf@lof=\write5 [4 ] Chapter 1. (cI.tex [1 ] [2]) [3] Chapter 2. (cLP.tex [4 ] [5] [6] Overfull \hbox (6.23833pt too wide) in paragraph at lines 292--295 [][]\OT1/cmr/m/n/10 List of BETA-integers bub-ble sort. \OT1/cmr/m/it/10 Sorts a list of atoms into non-descending [] [7]) [8] Chapter 3. (cAsI.tex [9 ]) (cAsIA.tex [10] [11]) (cAsMA.tex [12]) (cAsRA.tex [13]) [14] Chapter 4. (cPAsI.tex Overfull \hbox (14.91335pt too wide) in paragraph at lines 21--27 \OT1/cmr/m/it/10 sen-ta-tion \OT1/cmtt/m/n/10 P \OT1/cmr/m/n/10 of a poly-no-mi al $\OML/cmm/m/it/10 p \OT1/cmr/m/n/10 = [][] \OML/cmm/m/it/10 p[]x[]$ \OT1/cmr /m/n/10 with $\OML/cmm/m/it/10 e[] > [] > e[]$\OT1/cmr/m/n/10 , $\OML/cmm/m/it/ 10 p[] \OMS/cmsy/m/n/10 2 \OT1/cmr/m/n/10 ([] (\OT1/cmr/bx/n/10 D\OT1/cmr/m/n/1 0 [\OML/cmm/m/it/10 x[]\OT1/cmr/m/n/10 ]) [])[\OML/cmm/m/it/10 x[]\OT1/cmr/m/n/ 10 ]$, [] Overfull \hbox (48.21544pt too wide) in paragraph at lines 48--53 []\OT1/cmr/m/n/10 The \OT1/cmr/m/it/10 sparse dis-tribu-tive rep-re-sen-ta-tion \OT1/cmtt/m/n/10 P \OT1/cmr/m/n/10 of such a poly-no-mial $\OML/cmm/m/it/10 p$ \OT1/cmr/m/n/10 is the list $(\OT1/cmtt/m/n/10 D[]\OML/cmm/m/it/10 ; \OT1/cmtt /m/n/10 E[]\OML/cmm/m/it/10 ; \OT1/cmtt/m/n/10 D[]\OML/cmm/m/it/10 ; \OT1/cmtt/ m/n/10 E[]\OML/cmm/m/it/10 ; [] ; \OT1/cmtt/m/n/10 D[]\OML/cmm/m/it/10 ; \OT1/c mtt/m/n/10 E[]\OT1/cmr/m/n/10 )$, [] Overfull \hbox (10.34651pt too wide) in paragraph at lines 48--53 \OT1/cmr/m/n/10 where $\OT1/cmtt/m/n/10 D[]$ \OT1/cmr/m/n/10 is the [] in-ter-n al rep-re-sen-ta-tion of $\OML/cmm/m/it/10 d[]$ \OT1/cmr/m/n/10 and $\OT1/cmtt/ m/n/10 E[]$ \OT1/cmr/m/n/10 is the list $(\OML/cmm/m/it/10 e[]; e[]; [] ; e[]\O T1/cmr/m/n/10 )$ [] [15 ] [16]) (cPAsPIO.tex [17] Underfull \hbox (badness 10000) in paragraph at lines 113--128 \OT1/cmr/m/n/10 For $\OML/cmm/m/it/10 r$\OT1/cmr/m/n/10 -variate re-cur-sive po ly-no-mi-als over $\OT1/cmr/bx/n/10 Q$ \OT1/cmr/m/n/10 the al-go-rithms \OT1/cm tt/m/n/10 RPREAD \OT1/cmr/m/n/10 and [] [18]) (cPAsDIPA.tex [19] Overfull \hbox (1.30998pt too wide) in paragraph at lines 10--12 [][]\OT1/cmr/m/n/10 Polynomial bi-no-mial. \OT1/cmr/m/it/10 Builds $\OML/cmm/m/ it/10 a[]x[] \OT1/cmr/m/n/10 + \OML/cmm/m/it/10 a[]x[]$ \OT1/cmr/m/it/10 from $ \OML/cmm/m/it/10 a[]; a[]; e[]$\OT1/cmr/m/it/10 , [] [20]) (cPAsIPA.tex [21] Overfull \hbox (2.75485pt too wide) in paragraph at lines 61--64 [][]\OT1/cmr/m/n/10 Integral poly-no-mial sub-sti-tu-tion. \OT1/cmr/m/it/10 Sub -sti-tutes an in-te-gral poly- [] Overfull \hbox (4.79852pt too wide) in paragraph at lines 87--89 [][]\OT1/cmr/m/n/10 Integral poly-no-mial bi-nary ra-tio-nal eval-u-a-tion, in- te-gral poly- [] [22] [23] Overfull \hbox (4.52579pt too wide) in paragraph at lines 231--234 [][]\OT1/cmr/m/n/10 Integral poly-no-mial trun-ca-tion. \OT1/cmr/m/it/10 Com-pu tes $\OML/cmm/m/it/10 p [] \OT1/cmr/m/n/10 (\OML/cmm/m/it/10 x[]; [] ; x[]\OT1/ cmr/m/n/10 )$ [] ) (cPAsMPA.tex [24]) (cPAsRPA.tex [25]) (cPAsMR.tex [26]) [27] Chapter 5. (cLA.tex [28 ] Overfull \hbox (13.29865pt too wide) in paragraph at lines 75--83 [][]\OT1/cmr/m/n/10 Linear dio-phan-tine sys-tem so-lu-tion, mod-i-fied Kan-nan and Bachem [] [29]) [30] Chapter 6. (cGCD.tex [31 ] [32] [33] Overfull \hbox (5.33914pt too wide) in paragraph at lines 314--318 [][]\OT1/cmr/m/n/10 Modular uni-vari-ate poly-no-mial great-est com-mon di-vi-s or. \OT1/cmr/m/it/10 Com- [] [34] [35]) [36] Chapter 7. (cPF.tex [37 ] Overfull \hbox (10.68768pt too wide) in paragraph at lines 82--85 [][]\OT1/cmr/m/n/10 Modular uni-vari-ate poly-no-mial factorization-Berlekamp a l-go-rithm. [] Overfull \hbox (15.60327pt too wide) in paragraph at lines 114--115 [][]\OT1/cmr/m/n/10 Integral poly-no-mial mod ideal quadratic Hensel [] Overfull \hbox (6.7976pt too wide) in paragraph at lines 151--152 [][]\OT1/cmr/m/n/10 Modular poly-no-mial mod ideal, quadratic [] Overfull \hbox (13.82599pt too wide) in paragraph at lines 154--156 [][]\OT1/cmr/m/n/10 Modular poly-no-mial mod ideal, quadratic Hensel lemma, [] [38] Overfull \hbox (5.39168pt too wide) in paragraph at lines 166--171 [][]\OT1/cmr/m/n/10 Modular poly-no-mial dis-tinct de-gree fac-tor-iza-tion. \O T1/cmr/m/it/10 Given a monic, [] ) [39] Chapter 8. (cRRC.tex [40 ] [41] [42]) [43] Chapter 9. (cAN.tex [44 ] [45] [46] [47] Overfull \hbox (9.71533pt too wide) in paragraph at lines 373--376 [][]\OT1/cmr/m/n/10 Algebraic mod-ule uni-vari-ate poly-no-mial bi-nary ho-mo-t h-etic trans- [] [48] Overfull \hbox (10.29866pt too wide) in paragraph at lines 441--444 [][]\OT1/cmr/m/n/10 Algebraic mod-ule uni-vari-ate poly-no-mial iso-lat-ing in- ter-vals weakly [] Overfull \hbox (2.79773pt too wide) in paragraph at lines 444--447 [][]\OT1/cmr/m/n/10 Algebraic mod-ule uni-vari-ate poly-no-mial real [] [49]) [50] Appendix A. (cCFC.tex [51 ] [52] [53] [54] [55]) [56] Appendix B. (cISAC.tex Overfull \hbox (27.82635pt too wide) in paragraph at lines 5--7 [] \OT1/cmr/m/n/10 is a small ex-per-i-men-tal in-ter-ac-tive in-ter-face to [] , al-low-ing sim-ple \OT1/cmtt/m/n/10 read--eval--write [] [57 ] [58] [59]) [60] Appendix C. (cNIWsGC.tex (fSPACE.tex) (fLIST.tex) [61 ]) [62] (cNIWsCGV.tex [63] [64]) [65] (saclib.ind [66 ] [67] [68] [69] [70] [71] [72]) (saclib.aux) ) Here is how much of TeX's memory you used: 857 strings out of 10910 7838 string characters out of 72284 57077 words of memory out of 262141 3569 multiletter control sequences out of 9500 29059 words of font info for 106 fonts, out of 150000 for 255 14 hyphenation exceptions out of 607 24i,11n,21p,321b,282s stack positions out of 300i,40n,60p,3000b,4000s Output written on saclib.dvi (79 pages, 266732 bytes). saclib2.2.8/doc/user_guide/cPAsDIPA.tex0000664002275300236100000001231214017255270016655 0ustar wcbrownscs\begin{description} \item[Constructors:] \ \ \begin{description} \item[{\tt A <- PFBRE(r,a) }]\index{PFBRE} Polynomial from Base Ring Element. {\em Builds an r-variate polynomial from an element of some domain.} \item[{\tt A <- PMON(a,e) }]\index{PMON} Polynomial monomial. {\em Builds $a x^e$ from $a$ and $e$.} \item[{\tt A <- PBIN(a1,e1,a2,e2) }]\index{PBIN} Polynomial binomial. {\em Builds $a_1 x^{e_1} + a_2 x^{e_2}$ from $a_1, a_2, e_1$, and $e_2$.} \end{description} \item[Selectors:] \ \ \begin{description} \item[{\tt a <- PLDCF(A) }]\index{PLDCF} Polynomial leading coefficient. {\em Returns the leading coefficient w.r.t.\ the main variable.} \item[{\tt B <- PRED(A) }]\index{PRED} Polynomial reductum. {\em Returns the reductum (the polynomial minus its leading term) w.r.t.\ the main variable.} \item[{\tt a <- PLBCF(r,A) }]\index{PLBCF} Polynomial leading base coefficient. {\em Returns the coefficient of the term of the highest degree w.r.t.\ all variables (an element of the base domain).} \item[{\tt a <- PTBCF(r,A) }]\index{PTBCF} Polynomial trailing base coefficient. {\em Returns the coefficient of the term of the lowest degree w.r.t.\ all variables (an element of the base domain).} \end{description} \item[Information and Predicates:] \ \ \begin{description} \item[{\tt n <- PDEG(A) }]\index{PDEG} Polynomial degree. {\em Returns the degree of the argument w.r.t.\ the main variable.} \item[{\tt n <- PMDEG(A) }]\index{PMDEG} Polynomial modified degree. {\em Returns the degree of the argument, $-1$ if the argument is $0$.} \item[{\tt n <- PDEGSV(r,A,i) }]\index{PDEGSV} Polynomial degree, specified variable. {\em Returns the degree of the argument w.r.t.\ the i-th variable.} \item[{\tt V <- PDEGV(r,A) }]\index{PDEGV} Polynomial degree vector. {\em Returns a list $(d_1,\ldots,d_r)$ where $d_i$ is the degree of argument w.r.t.\ the i-th variable.} \item[{\tt b <- PCONST(r,A) }]\index{PCONST} Polynomial constant. {\em Tests whether the argument is a constant polynomial.} \item[{\tt b <- PUNT(r,A) }]\index{PUNT} Polynomial univariate test. {\em Tests whether the argument is a univariate polynomial.} \item[{\tt k <- PORD(A) }]\index{PORD} Polynomial order. {\em Returns the smallest exponent appearing in the argument polynomial (w.r.t.\ the main variable).} \end{description} \item[Transformation:] \ \ \begin{description} \item[{\tt B <- PSDSV(r,A,i,n) }]\index{PSDSV} Polynomial special decomposition, specified variable. {\em Computes $p(x_1, \ldots, x_i^{1/n}, \ldots, x_r)$ given $p, i, n$, and $r$.} \item[{\tt B <- PDPV(r,A,i,n) }]\index{PDPV} Polynomial division by power of variable. {\em Computes $x_i^{-n} p$ given $p, i$, and $n$.} \item[{\tt B <- PMPMV(A,k) }]\index{PMPMV} Polynomial multiplication by power of main variable. {\em Computes $x^n p$ given $p$ and $n$, with $x$ being the main variable of $p$.} \item[{\tt B <- PRT(A) }]\index{PRT} Polynomial reciprocal transformation. {\em Computes $x^n p(x^{-1})$ with $n = {\rm deg}(p)$.} \item[{\tt B <- PDBORD(A) }]\index{PDBORD} Polynomial divided by order. {\em Computes $x^{-n} p$ where $n$ is the order of $p$.} \end{description} \item[Conversion\footnotemark :] \ \ \footnotetext{ \rm See Section \ref{c:PA s:MR} for a description of the sparse distributive and the dense recursive representations. } \begin{description} \item[{\tt B <- PFDIP(r,A) }]\index{PFDIP} Polynomial from distributive polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the sparse distributive representation.} \item[{\tt B <- PFDP(r,A) }]\index{PFDP} Polynomial from dense polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the dense recursive representation.} \end{description} \item[Miscellaneous:] \ \ \begin{description} \item[{\tt B <- PINV(r,A,k) }]\index{PINV} Polynomial introduction of new variables. {\em Computes a polynomial in $R[y_1, \ldots, y_s, x_1, \ldots, x_r]$ from a polynomial in $R[x_1,\ldots,x_r]$.} \item[{\tt B <- PPERMV(r,A,P) }]\index{PPERMV} Polynomial permutation of variables. {\em Computes a polynomial in $R[x_{p_1}, \ldots, x_{p_r}]$ from a polynomial in $R[x_1, \ldots, x_r]$, where $(p_1, \ldots, p_r)$ is a permutation of $(1, \ldots, r)$.} \item[{\tt B <- PCPV(r,A,i,j) }]\index{PCPV} Polynomial cyclic permutation of variables. \item[{\tt B <- PICPV(r,A,i,j) }]\index{PICPV} Polynomial inverse cyclic permutation of variables. \item[{\tt B <- PTV(r,A,i) }]\index{PTV} Polynomial transpose variables. \item[{\tt B <- PTMV(r,A) }]\index{PTMV} Polynomial transpose main variables. \item[{\tt B <- PUFP(r,A) }]\index{PUFP} Polynomial, univariate, from polynomial. {\em Computes a univariate polynomial from an r-variate polynomial by substituting 0 for all variables except the main variable $x_r$.} \item[{\tt L <- PCL(A) }]\index{PCL} Polynomial coefficient list. {\em Returns a list $(p_n,\ldots,p_0)$ where $n$ is the degree of $p$ and the $p_i$ are the coefficients of $p$.} \end{description} \end{description} saclib2.2.8/doc/user_guide/cPAsPIO.tex0000664002275300236100000002544514017255270016602 0ustar wcbrownscsIn this section we will describe the polynomial input and output routines that are available in \saclib. Before proceeding further, the reader should be familiar with the internal representations of polynomials which are discussed in Section \ref{c:PA s:I ss:D}. \subsection{Recursive polynomials over $\BbbZ$} The {\em external canonical representation} of sparse {\em recursive} polynomials over $\BbbZ$ is defined by the following rules. First of all, each polynomial is enclosed in parentheses. A term is represented by the coefficient immediately followed by the variable (no space nor '{\tt *}' in between). The coefficients $+1$ and $-1$ are suppressed unless the exponent of the variable is $0$ in which case the variable is suppressed. The caret '\verb@^@' is used to indicate exponentiation. Exponents with the value $1$ are suppressed and if a variable has the exponent $0$ then the variable is suppressed. These rules apply recursively to the coefficients which may themselves be polynomials. A few examples are in order. \begin{center} \begin{tabular}{|c|c|} \hline recursive polynomial & external canonical form \\ \hline & \\ $ -x^4 + 2x^3 - x + 3 $ & \verb@(-x^4+2x^3-x+3)@ \\ & \\ $ (x^2+1)y^3+(x+8)y-5 $ & \verb@((x^2+1)y^3+(x+8)y+(-5))@ \\ & \\ $ - (x^2-4)y^4 + y^2 - y - x$ & \verb@((-x^2+4)y^4+(1)y^2+(-1)y+(-x))@ \\ & \\ \hline \end{tabular} \end{center} \noindent Note that a constant polynomial in $r$ variables will be enclosed in $r$ sets of parentheses. For example, the constant polynomial $2$ in 3 variables will be represented in external canonical form as \verb@(((2)))@. The algorithm {\tt IPREAD} reads an $r$-variate recursive polynomial over $\BbbZ$ in external canonical form from the input stream. The polynomial that is read is stored in internal canonical form and the number of variables is also recorded. The variables are {\em not} stored. Integer coefficients may be of arbitrary length but exponents must be {\tt BETA}-digits. Since no sorting is performed on the terms, they must be given in order of descending degree. This is an important remark since almost all algorithms that manipulate polynomials require that the terms be ordered and violating this rule will undoubtedly cause incorrect results to be computed and may even crash the system. Another important remark is that terms whose coefficients are 0 should not be given as these terms will be stored and may cause problems, for example in equality testing. Although {\tt IPREAD} is happiest when a polynomial is given in external canonical form as exemplified by the previous examples, the user is allowed some freedom. An arbitrary number of spaces may interspersed between the coefficients, the variables, the exponents and the symbols '\verb@+@', '\verb@-@' and '\verb@^@'. Spaces may not be inserted within a variable nor within an integer. Coefficients with magnitude 1 as well as the exponents 0 and 1 may be explicitly given. Thus, for example, \verb@((x ^ 2+1) y^3+(1x+8) y^1-(5x^0) y^0)@ is perfectly valid and is equivalent to the second example given in the table above. Since {\tt IPREAD} was intended to be used mainly for reading output produced by previous computations, it is designed to be fast and, consequently, very little error checking is performed on the input. Among other things, {\tt IPREAD} does not check for consistency among the variables, e.g. \verb@((y)x^2+(z)y)@ will be accepted as valid input and would be identical to \verb@((u)v^2+(u)v)@ in internal representation. Also, {\tt IPREAD} does not check for consistency among terms, i.e. each term is processed separately and it is not checked whether all terms have the same number of recursive nestings. For example, \verb@(y^3+(x-1)y)@ will be accepted although the first term, \verb@y^3@, is a univariate polynomial whereas the second, \verb@(x-1)y@, is a bivariate polynomial. {\em It is therefore the responsibility of the user to see that polynomials are input properly.} The algorithm {\tt IPWRITE} takes as inputs an $r$-variate recursive polynomial \verb@A@ over $\BbbZ$ and a list \verb@V = (@$v_1,\ldots,v_r$\verb@)@ of $r$ variables and writes \verb@A@ to the output stream using the variables specified with $v_r$ as the main variable and $v_1$ as the most minor variable. The list \verb@V@ may be initialized using {\tt VLREAD} which reads a variable list from the input stream. For generating a list with a fixed number of variables one could also use an expression such as {\tt LIST3(LFS("X"),LFS("Y"),LFS("Z"))}. Here the functions {\tt LFS} is used for converting a C string to a SACLIB variable. It is possible to use the algorithm {\tt IUPWRITE} to write univariate recursive polynomials but this algorithm was intended mainly as a subroutine to be called by {\tt IPWRITE}, which also handles univariate polynomials, and the user need not even be aware of its existence. There is an additional set of input functions of which the top level function is {\tt IPEXPREAD}. The format accepted by this function is a bit more convenient as expressions may be of the form \verb@(3 X Y^2 + X)^3 - (Y X + Y) (X - 1)^2 + 5@. Note that {\tt IPEXPREAD} also takes a variable list as input and therefore can detect the order of the variables without requiring the recursive structure made explicit by parentheses. To be more precise, {\tt IPEXPREAD} accepts any polynomial expression built from integers and variables using +, -, blanks for multiplication, \^\ for exponentiation, and parenthesis for grouping. The expression may be terminated by any character not being part of the legal input set (e.g.\ a period, a semicolon, etc.). This terminating character is not removed from the input stream. The function {\tt IPEXPREADR} has the same specification as {\tt IPEXPREAD}, with the difference that it {\em does} remove the terminating character. \subsection{Recursive polynomials over $\BbbQ$} For $r$-variate recursive polynomials over $\BbbQ$ the algorithms {\tt RPREAD} and \linebreak {\tt RPWRITE} are the corresponding input and output routines. The situation for rational polynomials is essentially the same as that for integral polynomials with the exception that the base coefficients may be rational numbers. The same freedoms on valid input apply and an arbitrary number of spaces may be inserted before and after '\verb@/@'. If the denominator of a base coefficient is 1 then only the numerator is in the external canonical representation. As an example, the external canonical representation of $\frac{2}{7}x^3-65x^2+5x+\frac{12}{4}$ is \verb@(2/7x^3-65x^2+5x+12/4)@ which, among many other possible variations, may be input as \verb@(2/7x^ 3- 65 x^2 + 5/1x+12/ 4)@. It should be noted that the rational base coefficients are not reduced to lowest terms when converted to internal representation. Corresponding to {\tt IUPWRITE} is {\tt RUPWRITE} which, again, need not concern the user. For rational polynomials there are also input functions for reading polynomial expressions. Here the name of the top level function is {\tt RPEXPREAD}. The input format here is the same as in the integral case, except that numbers may be rational. \subsection{Distributive polynomials over $\BbbZ$} The external canonical representation of sparse {\em distributive} polynomials over $\BbbZ$ is as follows. The entire polynomial is enclosed in parentheses. Each term is made up of the integer coefficient followed by the variables having positive exponents with each variable separated from its corresponding exponent by a caret. The coefficient and each variable-exponent pair is separated by a single space. As was the case for recursive polynomials, coefficients and exponents with a magnitude of 1 are suppressed as are variables with exponent 0. For example, the polynomial $2x^3y^5-xy^3-4y+x+1$ will be expressed in external canonical form as \verb@( 2 x^3 y^5 - x y^3 -4 y + x +1 )@. The algorithms {\tt DIIPREAD} and {\tt DIIPWRITE} are the input and output routines for distributive polynomials over $\BbbZ$. {\tt DIIPREAD} takes as input a variable list \verb@V@ = \verb@(@$v_1,\ldots,v_r$\verb@)@ and reads a distributive polynomial in external canonical form from the input stream. The ordering of the variables in \verb@V@ is significant and the variables in each term of the polynomial that is read must appear in the same order that they appear in \verb@V@ and the terms must be ordered in descending degree in $v_r$. For example, if\space \verb@V@ = \verb@(x,y,z)@ then \verb@(4 z^5 - y^2 z^4 + 9 x y z)@ is valid but \verb@(4 z^5 + 9 y x z - y^2 z^4)@ is not for two reasons---first, \verb@y@ appears before \verb@x@ in the term \verb@9 y x z@ and second, the term \verb@9 y x z@ appears before \verb@- y^2 z^4@ which violates the rule that terms must appear in order of descending degree in \verb@z@. Additionally, if there are two terms with the same degree in $v_r$ then they should be ordered according to descending degree in $v_{r-1}$ and so on. Coefficients may be separated from the variables by an arbitrary number of spaces (including no space at all). Variables must be separated by at least one space if there is no exponent explicitly given, otherwise an arbitrary number of spaces may separate them. For example \verb@(4z^5 - y^2z^4 + 9x y z)@ is valid but \verb@(4z^5 - y^2z^4 + 9xyz)@ is not since \verb@xyz@ will be treated as a single variable. \subsection{Distributive polynomials over $\BbbQ$} Distributive polynomials over $\BbbQ$ may be read in and written out using the algorithms {\tt DIRPREAD} and {\tt DIRPWRITE}. The only difference between rational distributive polynomials and integral distributive polynomials is that the base coefficients may be rational numbers and not just integers. It should be clear after reading the preceding subsections what constitutes valid input and we will not discuss this matter further. \subsection{Conversion Between Recursive and Distributive\protect\newline Representation} Converting recursive polynomials to distributive polynomials can be achieved by using {\tt DIPFP} which, given a polynomial in recursive internal representation, computes an equivalent one in distributive internal representation. In the other direction, namely to convert from distributive to recursive representation, the algorithm {\tt PFDIP} is provided. Both {\tt DIPFP} and {\tt PFDIP} work for polynomials over either $\BbbZ$ or $\BbbQ$ but the number of variables must be specified. For example, if \verb@A@ is a polynomial over $\BbbQ$ in internal recursive representation and the user wants to display \verb@A@ in external distributive representation then the code \begin{center} \verb@DIRPWRITE(r,DIPFP(r,A),V);@ \end{center} where \verb@r@ is equal to the number of variables and \verb@V@ is a list of \verb@r@ variables, will suffice. \subsection{Polynomials over $\BbbZ_m$} The input and output routines for polynomials over $\BbbZ$ work equally well for polynomials over $\BbbZ_m$. saclib2.2.8/doc/user_guide/saclib.ilg0000664002275300236100000000047614017255270016611 0ustar wcbrownscsThis is makeindex, portable version 2.12 [26-May-1993]. Scanning input file saclib.idx....done (691 entries accepted, 0 rejected). Sorting entries........done (7150 comparisons). Generating output file saclib.ind....done (748 lines written, 0 warnings). Output written in saclib.ind. Transcript written in saclib.ilg. saclib2.2.8/doc/user_guide/cAsMA.tex0000664002275300236100000000532114017255270016317 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Modular Digit Arithmetic} \begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt c <- MDSUM(m,a,b) }]\index{MDSUM} Modular digit sum. \item[{\tt c <- MDDIF(m,a,b) }]\index{MDDIF} Modular digit difference. \item[{\tt b <- MDNEG(m,a) }]\index{MDNEG} Modular digit negative. \item[{\tt c <- MDPROD(m,a,b) }]\index{MDPROD} Modular digit product. \item[{\tt c <- MDQ(m,a,b) }]\index{MDQ} Modular digit quotient. \item[{\tt b <- MDINV(m,a) }]\index{MDINV} Modular digit inverse. \item[{\tt b <- MDEXP(m,a,n) }]\index{MDEXP} Modular digit exponentiation. \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt a <- MDCRA(m1,m2,mp1,a1,a2) }]\index{MDCRA} Modular digit chinese remainder algorithm. \item[{\tt L <- MDLCRA(m1,m2,L1,L2) }]\index{MDLCRA} Modular digit list chinese remainder algorithm. \item[{\tt b <- MDHOM(m,A) }]\index{MDHOM} Modular digit homomorphism. {\em Computes $n \mod m$.} \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt a <- MDRAN(m) }]\index{MDRAN} Modular digit, random. \end{description} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Modular Integer Arithmetic} \begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt C <- MISUM(M,A,B) }]\index{MISUM} Modular integer sum. \item[{\tt C <- MIDIF(M,A,B) }]\index{MIDIF} Modular integer difference. \item[{\tt B <- MINEG(M,A) }]\index{MINEG} Modular integer negation. \item[{\tt C <- MIPROD(M,A,B) }]\index{MIPROD} Modular integer product. \item[{\tt C <- MIQ(M,A,B) }]\index{MIQ} Modular integer quotient. \item[{\tt B <- MIINV(M,A) }]\index{MIINV} Modular integer inverse. \item[{\tt B <- MIEXP(M,A,N) }]\index{MIEXP} Modular integer exponentiation. \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt As <- MIDCRA(M,m,mp,A,a) }]\index{MIDCRA} Modular integer digit chinese remainder algorithm. \item[{\tt As <- MIHOM(M,A) }]\index{MIHOM} Modular integer homomorphism. {\em Computes $n \mod m$.} \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt R <- MIRAN(M) }]\index{MIRAN} Modular integer, random. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt B <- SMFMI(M,A) }]\index{SMFMI} Symmetric modular from modular integer. {\em Computes the isomorphism from $\BbbZ_m$ to $\{-\left\lfloor\frac{m}{2}\right\rfloor+1, \ldots, \left\lfloor\frac{m}{2}\right\rfloor\}$.} \end{description} \end{description} saclib2.2.8/doc/user_guide/cAN.tex0000664002275300236100000005366414017255270016051 0ustar wcbrownscs\section{Mathematical Preliminaries} An algebraic number is a number that satisfies a rational polynomial equation. An algebraic number $\alpha$ is represented by an irreducible polynomial, $A(x)$, such that $A(\alpha) = 0$. A real algebraic number, is a real number that is also an algebraic number, and it is represented by an irreducible polynomial and an isolating interval to distinguish it from its real conjugates. The collection of algebraic numbers forms a field containing the real algebraic numbers as a subfield. Since $A(x)$ is irreducible, the extension field $Q(\alpha)$ obtained by adjoining $\alpha$ to the rational number field is isomorphic to $Q[x]/(A(x))$ and elements of $Q(\alpha)$ are represented by polynomials whose degrees are less than the degree of $A(x)$. If $\alpha$ is real then $Q(\alpha)$ is an ordered field and sign computations can be performed using the isolating interval for $\alpha$. \section{Purpose} The \saclib\ algebraic number arithmetic package provides algorithms for performing arithmetic with algebraic numbers, with elements of an algebraic number field, and with polynomials whose coefficients belong to an algebraic number field. There are algorithms for computing the gcd of two polynomials with algebraic number coefficients and for factoring a polynomial with algebraic number coefficients. Algorithms are also provided for performing sign computations in a real algebraic number field and for isolating the real roots of a polynomial with real algebraic number coefficients. \section{Methods and Algorithms} Algorithms for performing algebraic number arithmetic use resultant computations. Let $A(x) = \sum_{i=0}^ma_ix^i = a_m \prod_{i=1}^m(x-\alpha_i)$ be the integral minimal polynomial for $\alpha = \alpha_1$ and let $B(y) = \sum_{j=0}^n b_jy^j = b_n \prod_{j=1}^n (y - \beta_j)$ be the integral minimal polynomial for $\beta = \beta_1$. The minimal polynomial for $\alpha + \beta$ is a factor of $\res_x(A(x),B(y-x))$ and the minimal polynomial for $\alpha \cdot \beta$ is a factor of $\res_x(A(x),x^nB(y/x))$. If $\alpha$ and $\beta$ are real algebraic numbers, the particular factor can be found by using the isolating intervals for $\alpha$ and $\beta$. The algorithms {\tt ANSUM} and {\tt ANPROD} use these ideas to perform addition and multiplication in the field of real algebraic numbers. Subtraction and division can be performed by negating and adding and inverting and multiplying respectively. The minimal polynomial of $-\alpha$ is $A(-x)$ and the minimal polynomial of $1/\alpha$ is $x^mA(1/x)$. These operations are provided by the algorithms {\tt IUPNT} and {\tt PRT} in the polynomial arithmetic system. Let $Q(\alpha)$ be the extension field of the rationals obtained by adjoining the algebraic number $\alpha$. Arithmetic in $Q(\alpha)$ is performed using the isomorphism $Q(\alpha) \cong Q[x]/(A(x))$. Elements of $Q(\alpha)$ are represented by polynomials whose degrees are less than the degree of the minimal polynomial of $\alpha$ and addition and multiplication are performed using polynomial multiplication and addition modulo the minimal polynomial. Inverses of elements of $Q(\alpha)$ are calculated by using a resultant computation. If $B(x)$ is the polynomial representing $\beta = B(\alpha)$ and $R = \res(A(x),B(x))$, then there exist polynomials $S(x)$ and $T(x)$ such that $A(x)S(x) + B(x)T(x) = R$. Since the minimal polynomial $A(x)$ is irreducible, the resultant does not equal zero and $B(\alpha)^{-1} = T(\alpha)/R$. The algorithm {\tt AFINV} uses this approach to compute inverses of elements of $Q(\alpha)$. If $\alpha \in I$ is a real algebraic number, then the field $Q(\alpha)$ can be ordered. The algorithm {\tt AFSIGN} computes the sign of an element of $Q(\alpha)$. The sign of $\beta = B(\alpha)$ is determined by refining the isolating interval, $I$, for $\alpha$ until it can be shown that $B(y)$ does not contain any roots in $I$. If there are no roots of $B(y)$ in the isolating interval $I$, then the sign of $B(\alpha)$ is equal to the sign of $B(y)$ for any $y \in I$. The algorithm {\tt AFSIGN} uses this approach and Descartes' rule of signs to determine how much to refine $I$. \saclib\ provides algorithms for computing with polynomials whose coefficients belong to an algebraic field $Q(\alpha)$. Besides basic arithmetic, there are algorithms for polynomial gcd computation, factorization, and real root isolation. The algorithm {\tt AFUPGC} uses the monic PRS to compute the gcd of two univariate polynomials. The algorithms {\tt AFUPGS}, {\tt AFUPSF}, and {\tt AFUPSB} use this algorithm to compute greatest squarefree divisors, squarefree factorization, and a squarefree basis respectively. Algorithms are also provided to isolate the real roots of a polynomial whose coefficients belong to a real algebraic number field. Both the Collins-Loos algorithm ({\tt AFUPRICL}) and the coefficient sign variation method ({\tt AFUPRICS}) are provided. An algebraic number may arise as a solution of a polynomial with algebraic number coefficients. The norm can be used to find a defining polynomial with integral coefficients. Let $B(\alpha,y)$ be a polynomial with coefficients in $Q(\alpha)$. The norm of $B(\alpha,y)$ is the rational polynomial $\norm(B\alpha,y)) = \prod_{i=1}^m B(\alpha_i,y)$. The norm can be computed with the resultant computation $res_x(A(x),B(x,y))$ which produces a polynomial similar to the norm. The algorithm {\tt AFPNORM} uses this approach to compute the norm. The algorithm {\tt AFPNIP} returns the list of irreducible factors of the norm. If $\alpha$ is a real algebraic number, the isolating interval for $\alpha$ can be used to select the appropriate irreducible factor of the norm. This is done by the algorithm {\tt AFUPMPR}. As a special case, the minimal polynomial of $\beta = B(\alpha)$ can be computed by calculating the norm of the linear polynomial $y-B(\alpha)$. Since $y-B(\alpha)$ is irreducible the norm is a power of an irreducible polynomial, and the minimal polynomial can be obtained with a greatest squarefree divisor computation. The algorithm {\tt ANFAF} uses this approach to convert the representation of an element of an algebraic number field to its representation as an algebraic number. The algorithm {\tt AFUPFAC} uses the norm to factor a squarefree polynomial whose coefficients belong to an algebraic number field. Let $B^*(y) = \norm(B(\alpha,y))$, and let $\prod_{i=1}^t B^*_i(y)$ be the irreducible factorization of $B^*(y)$. Provided the norm is squarefree the irreducible factorization of $B(\alpha,y) = \prod_{i=1}^t\gcd(B(\alpha,y),B^*_i(y))$. If $B^*(y)$ is not squarefree, a translation, $B(\alpha,y-s\alpha)$, is computed whose norm is squarefree. The factorization of $B(\alpha,y)$ can be recovered from the factorization of the translated polynomial. \saclib\ also provides an algorithm for computing a primitive element of a multiple extension field. Let $\alpha$ and $\beta$ be algebraic numbers and consider the multiple extension field $Q(\alpha,\beta)$. The primitive element theorem states that there exists a primitive element $\gamma$ such that $Q(\alpha,\beta) = Q(\gamma)$. The algorithms {\tt ANPEDE} and {\tt ANREPE} provide a constructive version of this theorem. References: %\begin{thebibliography}{99} % %\bibitem{JJ} R. G. K. Loos: {\it Computing in Algebraic Extensions}, In ``Computer Algebra, Symbolic and Algebraic Computation'', pages 173--187. Jeremy R.\ Johnson: {\it Algorithms for polynomial real root isolation}. Technical Research Report OSU-CISRC-8/91-TR21, 1991. The Ohio State University, 2036 Neil Avenue Mall, Columbus, Ohio 43210, Phone: 614-292-5813. Barry Trager: {\it Algebraic Factoring and Rational Function Integration}, In ``SYMSAC '76: Proceedings of the 1976 ACM Symposium on Symbolic and Algebraic Computation'', pages 219--226. % %\end{thebibliography} \section{Definitions of Terms} \begin{description} \item[algebraic number]\index{number!algebraic}\index{algebraic!number} A solution of a rational polynomial equation. An algebraic number $\alpha$ is represented either by a rational minimal polynomial or an integral minimal polynomial. \item[algebraic integer]\index{integer!algebraic}\index{algebraic!integer} A solution of a monic integral polynomial equation. \item[real algebraic number]\index{number!real algebraic}\index{algebraic!number, real} A real number that is also an algebraic number. A real algebraic number is represented by an integral minimal polynomial and an acceptable isolating interval. \item[rational minimal polynomial]\index{polynomial!rational minimal} The rational minimal polynomial for an algebraic number $\alpha$ is the unique monic, irreducible rational polynomial $A(x)$ such that $A(\alpha) = 0$. \item[integral minimal polynomial]\index{polynomial!integral minimal} The integral minimal polynomial for an algebraic number $\alpha$ is the unique, positive, primitive, integral polynomial $A(x)$ such that $A(\alpha) = 0$. \item[acceptable isolating interval]\index{interval!isolating!acceptable} an isolating interval, $I$, for a real algebraic number $\alpha$, where $I$ is either a left-open and right-closed standard interval or a one-point interval. \item[algebraic field element]\index{algebraic!field element} an element of the extension field $Q(\alpha)$. $\beta \in Q(\alpha)$ is represented by a list $(r,B(y))$, where $\beta = rB(\alpha)$ and $r$ is a rational number and $B(y)$ is a primitive integral polynomial whose degree is less than the degree of the minimal polynomial of $\alpha$. \end{description} \section{Representation} There are several different representations for elements of $Q(\alpha)$. Let $A(x)$ be the integral minimal polynomial for an algebraic number $\alpha$ with $\deg(A(x)) = m$. An element $\beta$ of $Q(\alpha)$ can be uniquely represented by: \begin{enumerate} \item A rational polynomial, $B(x)$, whose degree is less than $m$ and such that $B(\alpha) = \beta$. \item A pair $(r,\overline{B}(x))$, where $r$ is a rational number, $\overline{B}(x)$ is a positive primitive integral polynomial, and $\beta = B(\alpha) = r \overline{B}(\alpha)$. \end{enumerate} The default representation is (2). The algorithm {\tt AFCR} converts representation (1) to (2), and the algorithm {\tt AFICR} converts representation (2) to (1). Let $Z[\alpha]$ denote the $Z$-module with basis $1,\alpha,\alpha^2,\ldots,\alpha^{m-1}$. Elements of $Z[\alpha]$ are represented by integral polynomials whose degree is less than $m$. If $\alpha$ is an algebraic integer, then $Z[\alpha]$ is a ring. If an algorithm does not require division or reduction by the minimal polynomial, operations in $Q(\alpha)$ can be replaced with operations in $Z[\alpha]$. When this is possible, efficiency is gained by using the integral representation $Z[\alpha]$. An important example is polynomial real root isolation. Let $P(\alpha,y)$ be a polynomial in $Q(\alpha)[y]$ and let $d$ be the greatest common divisor of the denominators of the coefficients of $P(\alpha,y)$. Then $dP(\alpha,y)$ is in $Z[\alpha,y]$ and has the same roots as $P(\alpha,y)$. Moreover, the coefficient sign variation method for real root isolation only uses operations which can be performed in $Z[\alpha]$. The name of algorithms which operate in $Z[\alpha]$ begin with the letters {\tt AM}. The algorithm ${\tt AMPSAFP}(r,P)$ computes a polynomial $\overline{P} \in Z[\alpha,X1,\ldots,Xr]$ which is similar to the polynomial $P \in Q(\alpha)[X1,\ldots,Xr]$. The algorithm {\tt AIFAN} computes an algebraic integer $\overline{\alpha}$ such that $Q(\alpha) = Q(\overline{\alpha})$. \section{Functions} \begin{description} \item[Algebraic Number Arithmetic] \ \ \begin{description} \item[{\tt ANIIPE(M,I,N,J,t,L; S,k,K) }]\index{ANIIPE} Algebraic number isolating interval for a primitive element \item[{\tt ANPROD(A,I,B,J; C,K) }]\index{ANPROD} Algebraic number product \item[{\tt ANSUM(A,I,B,J;C,K) }]\index{ANSUM} Algebraic number sum \item[{\tt ANPEDE(A,B;C,t) }]\index{ANPEDE} Algebraic number primitive element for a double extension \item[{\tt b <- ANREPE(M,A,B,t) }]\index{ANREPE} Algebraic number represent element of a primitive extension \end{description} \item[Algebraic Field Arithmetic] \ \ \begin{description} \item[{\tt c <- AFDIF(a,b) }]\index{AFDIF} Algebraic number field element difference \item[{\tt b <- AFINV(M,a) }]\index{AFINV} Algebraic number field element inverse \item[{\tt b <- AFNEG(a) }]\index{AFNEG} Algebraic number field negative \item[{\tt c <- AFPROD(P,a,b) }]\index{AFPROD} Algebraic number field element product \item[{\tt c <- AFQ(M,a,b) }]\index{AFQ} Algebraic number field quotient \item[{\tt c <- AFSUM(a,b) }]\index{AFSUM} Algebraic number field element sum \end{description} \item[Real Algebraic Number Sign and Order Computation] \ \ \begin{description} \item[{\tt t <- AFCOMP(M,I,a,b) }]\index{AFCOMP} Algebraic number field comparison \item[{\tt s <- AFSIGN(M,I,a) }]\index{AFSIGN} Algebraic number field sign \item[{\tt s <- AMSIGN(M,I,a) }]\index{AMSIGN} Algebraic module sign \item[{\tt AMSIGNIR(M,I,a;s,Is) }]\index{AMSIGNIR} Algebraic module sign, interval refinement \end{description} \item[Algebraic Polynomial Arithmetic] \ \ \begin{description} \item[{\tt C <- AFPAFP(r,M,a,B) }]\index{AFPAFP} Algebraic number field polynomial algebraic number field element product \item[{\tt C <- AFPAFQ(r,M,A,b) }]\index{AFPAFQ} Algebraic number field polynomial algebraic number field element quotient \item[{\tt C <- AFPDIF(r,A,B) }]\index{AFPDIF} Algebraic number field polynomial difference \item[{\tt Ap <- AFPMON(r,M,A) }]\index{AFPMON} Algebraic number field polynomial monic \item[{\tt B <- AFPNEG(r,A) }]\index{AFPNEG} Algebraic number field polynomial negative \item[{\tt C <- AFPPR(r,M,A,B) }]\index{AFPPR} Algebraic number field polynomial product \item[{\tt AFPQR(r,M,A,B; Q,R) }]\index{AFPQR} Algebraic number field polynomial quotient and remainder \item[{\tt C <- AFPSUM(r,A,B) }]\index{AFPSUM} Algebraic number field polynomial sum \end{description} \item[Algebraic Polynomial Differentiation and Integration] \ \ \begin{description} \item[{\tt B <- AFPDMV(r,M,A) }]\index{AFPDMV} Algebraic number field polynomial derivative, main variable \item[{\tt B <- AFPINT(r,M,A,b) }]\index{AFPINT} Algebraic number field polynomial integration \item[{\tt B <- AMPDMV(r,M,A) }]\index{AFPDMV} Algebraic module polynomial derivative, main variable \end{description} \item[Algebraic Polynomial Factorization] \ \ \begin{description} \item[{\tt F <- AFUPFAC(M,B) }]\index{AFUPFAC} Algebraic number field univariate polynomial factorization \item[{\tt L <- AFUPSF(M,A) }]\index{AFUPSF} Algebraic number field univariate polynomial squarefree factorization \end{description} \item[Algebraic Polynomial Greatest Common Divisors] \ \ \begin{description} \item[{\tt AFUPGC(M,A,B; C,Ab,Bb) }]\index{AFUPGC} Algebraic number field univariate polynomial greatest common divisor and cofactors \item[{\tt B <- AFUPGS(M,A) }]\index{AFUPGS} Algebraic number field polynomial greatest squarefree divisor \end{description} \item[Algebraic Polynomial Norm Computation] \ \ \begin{description} \item[{\tt L <- AFPNIP(M,A) }]\index{AFPNIP} Algebraic number field polynomial normalize to integral polynomial \item[{\tt Bs <- AFPNORM(r,M,B) }]\index{AFPNORM} Algebraic number field polynomial norm. \end{description} \item[Algebraic Polynomial Substitution and Evaluation] \ \ \begin{description} \item[{\tt C <- AFPCMV(r,M,A,B) }]\index{AFPCMV} Algebraic number field polynomial composition in main variable \item[{\tt B <- AFPEMV(r,M,A,a) }]\index{AFPEMV} Algebraic number field polynomial evaluation of main variable \item[{\tt B <- AFPEV(r,M,A,i,a) }]\index{AFPEV} Algebraic number field polynomial evaluation \item[{\tt B <- AFPME(r,M,A,b) }]\index{AFPME} Algebraic number field polynomial multiple evaluation \item[{\tt s <- AFUPSR(M,I,A,c) }]\index{AFUPSR} Algebraic number field univariate polynomial, sign at a rational point \item[{\tt s <- AMUPBES(M,I,A,c) }]\index{AMUPBES} Algebraic module univariate polynomial, binary rational evaluation of sign. \item[{\tt s <- AMUPSR(M,I,A,c) }]\index{AMUPSR} Algebraic module univariate polynomial, sign at a rational point \item[{\tt B <- IPAFME(r,M,A,b) }]\index{IPAFME} Integral polynomial, algebraic number field multiple evaluation \item[{\tt B <- RPAFME(r,M,A,b) }]\index{RPAFME} Rational polynomial, algebraic number field multiple evaluation \end{description} \item[Algebraic Polynomial Transformations] \ \ \begin{description} \item[{\tt B <- AMUPBHT(A,k) }]\index{AMUPBHT} Algebraic module univariate polynomial binary homothetic transformation \item[{\tt B <- AMUPNT(A) }]\index{AMUPNT} Algebraic module univariate polynomial negative transformation \item[{\tt B <- AMUPTR(A,h) }]\index{AMUPTR} Algebraic module univariate polynomial translation \item[{\tt B <- AMUPTR1(A) }]\index{AMUPTR1} Algebraic module univariate polynomial translation by 1 \end{description} \item[Real Algebraic Polynomial Real Root Isolation] \ \ \begin{description} \item[{\tt N <- AFUPBRI(M,I,L) }]\index{AFUPBRI} Algebraic number field univariate polynomial basis real root isolation \item[{\tt AFUPMPR(M,I,B,J,L; Js,j) }]\index{AFUPMPR} Algebraic number field polynomial minimal polynomial of a real root \item[{\tt b <- AFUPRB(M,I,A) }]\index{AFUPRB} Algebraic number field univariate polynomial root bound \item[{\tt L <- AFUPRICL(M,I,A) }]\index{AFUPRICL} Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm \item[{\tt L <- AFUPRICS(M,I,A) }]\index{AFUPRICS} Algebraic number field univariate polynomial real root isolation, coefficient sign variation method \item[{\tt a <- AFUPRL(M,A) }]\index{AFUPRL} Algebraic number field univariate polynomial, root of a linear polynomial \item[{\tt n <- AFUPVAR(M,I,A) }]\index{AFUPVAR} Algebraic number field univariate polynomial variations \item[{\tt AMUPMPR(M,I,B,J,L; Js,j) }]\index{AMUPMPR} Algebraic module univariate polynomial minimal polynomial of a real root \item[{\tt L <- AMUPRICS(M,I,A) }]\index{AMUPRICS} Algebraic module univariate polynomial real root isolation, coefficient sign variation method \item[{\tt AMUPRICSW(M,I,A;L,Is) }]\index{AMUPRICSW} Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals \item[{\tt AMUPRINCS(M,I,A,a,b;L,Is) }]\index{AMUPRINCS} Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method \item[{\tt AMUPVARIR(M,I,A; n,J) }]\index{AMUPVARIR} Algebraic module univariate polynomial variations, interval refinement \end{description} \item[Algebraic Polynomial Real Root Refinement] \ \ \begin{description} \item[{\tt Js <- AFUPIIR(M,I,B,J) }]\index{AFUPIIR} Algebraic number field polynomial isolating interval refinement \item[{\tt AFUPIIWS(M,I,A,L) }]\index{AFUPIIWS} Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint \item[{\tt AFUPRLS(M,I,A1,A2,L1,L2; Ls1,Ls2) }]\index{AFUPRLS} Algebraic number field univariate polynomial real root list separation \item[{\tt Js <- AFUPRRI(M,I,A,B,J,s1,t1) }]\index{AFUPRRI} Algebraic number field univariate polynomial relative real root isolation \item[{\tt AFUPRRS(M,I,A1,A2,I1,I2; Is1,Is2,s) }]\index{AFUPRRS} Algebraic number field univariate polynomial real root separation \item[{\tt Js <- AMUPIIR(M,I,B,J) }]\index{AMUPIIR} Algebraic module polynomial isolating interval refinement \item[{\tt AMUPIIWS(M,I,A,L) }]\index{AMUPIIWS} Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint \item[{\tt AMUPRLS(M,I,A1,A2,L1,L2; Ls1,Ls2) }]\index{AMUPRLS} Algebraic module univariate polynomial real root list separation \item[{\tt AMUPRRS(M,I,A1,A2,I1,I2; Is1,Is2,s) }]\index{AMUPRRS} Algebraic module univariate polynomial real root separation \end{description} \item[Conversion] \ \ \begin{description} \item[{\tt Ap <- AFCR(A) }]\index{AFCR} Algebraic number field element convert representation \item[{\tt a <- AFFINT(M) }]\index{AFFINT} Algebraic number field element from integer \item[{\tt a <- AFFRN(R) }]\index{AFFRN} Algebraic number field element from rational number \item[{\tt Ap <- AFICR(A) }]\index{AFICR} Algebraic number field element inverse convert representation \item[{\tt B <- AFPCR(r,A) }]\index{AFPCR} Algebraic number field polynomial convert representation \item[{\tt B <- AFPFIP(r,A) }]\index{AFPFIP} Algebraic number field polynomial from integral polynomial \item[{\tt B <- AFPFRP(r,A) }]\index{AFPFRP} Algebraic number field polynomial from rational polynomial \item[{\tt B <- AFPICR(r,A) }]\index{AFPICR} Algebraic number field polynomial inverse convert representation \item[{\tt AIFAN(M; mh,Mh) }]\index{AIFAN} Algebraic integer from algebraic number \item[{\tt B <- AMPSAFP(r,A) }]\index{AMPSAFP} Algebraic module polynomial similar to algebraic field polynomial \item[{\tt ANFAF(M,I,a; N,J) }]\index{ANFAF} Algebraic number from algebraic number field element \end{description} \item[Input/Output] \ \ \begin{description} \item[{\tt AFDWRITE(M,I,b,n) }]\index{AFDWRITE} Algebraic number field, decimal write \item[{\tt AFPWRITE(r,A,V,v) }]\index{AFPWRITE} Algebraic number field polynomial write \item[{\tt AFUPWRITE(A,vA,vc) }]\index{AFUPWRITE} Algebraic number field univariate polynomial write \item[{\tt AFWRITE(A,v) }]\index{AFWRITE} Algebraic field element write \item[{\tt ANDWRITE(M,I,n) }]\index{ANDWRITE} Algebraic number decimal write \end{description} \end{description} saclib2.2.8/doc/user_guide/KWIC.tex0000664002275300236100000062031514017255270016136 0ustar wcbrownscs\begin{description} \item[absolute] \ \ \begin{description} \item[ABS] Absolute value. \item[IABSF] Integer absolute value function. \item[IPABS] Integral polynomial absolute value. \item[RNABS] Rational number absolute value. \item[SFRABS] Single-precision floating-point real absolute value. \end{description} \item[adjoin] \ \ \begin{description} \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[VIAZ] Vector of integers, adjoin zeros. \end{description} \item[advance] \ \ \begin{description} \item[AADV] Arithmetic advance. \item[ADV] Advance. \item[ADV2] Advance 2. \item[ADV3] Advance 3. \item[ADV4] Advance 4. \end{description} \item[after] \ \ \begin{description} \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \end{description} \item[algebraic] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFDWRITE] Algebraic number field, decimal write. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFNEG] Algebraic number field negative. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPROD] Algebraic number field element product. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFQ] Algebraic number field quotient. \item[AFSIGN] Algebraic number field sign. \item[AFSUM] Algebraic number field element sum. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AFWRITE] Algebraic field element write. \item[AIFAN] Algebraic integer from algebraic number. \item[AIFAN] Algebraic integer from algebraic number. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMSIGN] Algebraic module sign. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[ANDWRITE] Algebraic number decimal write. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPROD] Algebraic number product. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[ANSUM] Algebraic number sum. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \end{description} \item[algorithm] \ \ \begin{description} \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRODK] Integer product, karatsuba algorithm. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \end{description} \item[allocation] \ \ \begin{description} \item[GCAMALLOC] Garbage collected array memory allocation. \end{description} \item[and] \ \ \begin{description} \item[DAND] Digit and. \end{description} \item[arguments] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \end{description} \item[arithmetic] \ \ \begin{description} \item[AADV] Arithmetic advance. \end{description} \item[array] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAGET] Garbage collected array get element. \item[GCAMALLOC] Garbage collected array memory allocation. \item[GCASET] Garbage collected array set element. \end{description} \item[assignment] \ \ \begin{description} \item[ASSPR] Assignment problem. \end{description} \item[associate] \ \ \begin{description} \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \end{description} \item[atom] \ \ \begin{description} \item[AREAD] Atom read. \item[AWRITE] Atom write. \item[ISATOM] Test for atom. \end{description} \item[augmentation] \ \ \begin{description} \item[IPSFBA] Integral polynomial squarefree basis augmentation. \end{description} \item[bachem] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \end{description} \item[backspace] \ \ \begin{description} \item[BKSP] Backspace. \end{description} \item[base] \ \ \begin{description} \item[DLOG2] Digit logarithm, base 2. \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[ILOG2] Integer logarithm, base 2. \item[PFBRE] Polynomial From Base Ring Element. \item[PLBCF] Polynomial leading base coefficient. \item[PTBCF] Polynomial trailing base coefficient. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[based] \ \ \begin{description} \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[basis] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[begin] \ \ \begin{description} \item[BEGINSACLIB] Begin SACLIB. \end{description} \item[berlekamp] \ \ \begin{description} \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \end{description} \item[beta] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[LBIM] List of BETA-integers merge. \end{description} \item[binary] \ \ \begin{description} \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[RNBCR] Rational number binary common representation. \end{description} \item[binomial] \ \ \begin{description} \item[IBCIND] Integer binomial coefficient induction. \item[IBCOEF] Integer binomial coefficient. \item[IBCPS] Integer binomial coefficient partial sum. \item[PBIN] Polynomial binomial. \end{description} \item[bisection] \ \ \begin{description} \item[RIB] Rational interval bisection. \end{description} \item[bit] \ \ \begin{description} \item[BITRAN] Bit, random. \end{description} \item[bound] \ \ \begin{description} \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IUPRB] Integral univariate polynomial root bound. \end{description} \item[bubble] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \end{description} \item[c] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \end{description} \item[calculation] \ \ \begin{description} \item[DPCC] Digit partial cosequence calculation. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \end{description} \item[cartesian] \ \ \begin{description} \item[CPLEXN] Cartesian product, lexicographically next. \end{description} \item[ceiling] \ \ \begin{description} \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[RNCEIL] Rational number, ceiling of. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \end{description} \item[cell] \ \ \begin{description} \item[LASTCELL] Last cell. \end{description} \item[character] \ \ \begin{description} \item[CLOUT] Character list out. \item[CREAD] Character read. \item[CREADB] Character read. \item[CWRITE] Character write. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[LKAHEAD] Character lookahead. \end{description} \item[characteristic] \ \ \begin{description} \item[CSFPAR] Characteristic set from partition. \item[CSINT] Characteristic set intersection. \item[CSSUB] Characteristic set subset. \item[CSUN] Characteristic set union. \item[SFCS] Set from characteristic set. \end{description} \item[chinese] \ \ \begin{description} \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \end{description} \item[choice] \ \ \begin{description} \item[IPCEVP] Integral polynomial, choice of evaluation points. \end{description} \item[circle] \ \ \begin{description} \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \end{description} \item[clock] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \item[CLOCK] Clock. \end{description} \item[coarsest] \ \ \begin{description} \item[IPCSFB] Integral polynomial coarsest squarefree basis. \end{description} \item[coefficient] \ \ \begin{description} \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[IBCIND] Integer binomial coefficient induction. \item[IBCOEF] Integer binomial coefficient. \item[IBCPS] Integer binomial coefficient partial sum. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[PCL] Polynomial coefficient list. \item[PLBCF] Polynomial leading base coefficient. \item[PLDCF] Polynomial leading coefficient. \item[PTBCF] Polynomial trailing base coefficient. \end{description} \item[coefficients] \ \ \begin{description} \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[cofactor] \ \ \begin{description} \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \end{description} \item[cofactors] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \end{description} \item[collected] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAGET] Garbage collected array get element. \item[GCAMALLOC] Garbage collected array memory allocation. \item[GCASET] Garbage collected array set element. \end{description} \item[collection] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \item[GC] Garbage collection entry-point. \item[GCSI] Garbage collection, system independent. \end{description} \item[collector] \ \ \begin{description} \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \end{description} \item[collins] \ \ \begin{description} \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \end{description} \item[column] \ \ \begin{description} \item[MICINS] Matrix of integers column insertion. \item[MICS] Matrix of integers column sort. \item[MINNCT] Matrix of integers, non-negative column transformation. \end{description} \item[combination] \ \ \begin{description} \item[ILCOMB] Integer linear combination. \item[VILCOM] Vector of integers linear combination. \end{description} \item[combine] \ \ \begin{description} \item[IPFLC] Integral polynomial factor list combine. \end{description} \item[command] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \end{description} \item[common] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[ILCM] Integer least common multiple. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[RNBCR] Rational number binary common representation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[comparison] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[DVCMP] Degree vector comparison. \item[ICOMP] Integer comparison. \item[RILC] Rational interval length comparison. \item[RNCOMP] Rational number comparison. \item[VCOMP] Vector comparison. \end{description} \item[complex] \ \ \begin{description} \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \end{description} \item[composition] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[COMP] Composition. \item[COMP2] Composition 2. \item[COMP3] Composition 3. \item[COMP4] Composition 4. \end{description} \item[concatenation] \ \ \begin{description} \item[CCONC] Constructive concatenation. \item[CONC] Concatenation. \item[LCONC] List concatenation. \end{description} \item[conjugation] \ \ \begin{description} \item[SFCCON] Single-precision floating-point complex conjugation. \end{description} \item[constant] \ \ \begin{description} \item[IPCONST] Integral polynomial constant. \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \end{description} \item[construction] \ \ \begin{description} \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \end{description} \item[constructive] \ \ \begin{description} \item[CCONC] Constructive concatenation. \item[CINV] Constructive inverse. \end{description} \item[content] \ \ \begin{description} \item[IPC] Integral polynomial content. \item[IPCPP] Integral polynomial content and primitive part. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \end{description} \item[contents] \ \ \begin{description} \item[IPLCPP] Integral polynomial list of contents and primitive parts. \end{description} \item[conversion] \ \ \begin{description} \item[IIC] Isolating interval conversion. \end{description} \item[convert] \ \ \begin{description} \item[AFCR] Algebraic number field element convert representation. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[GCA2PTR] Convert garbage collected array handle to C pointer. \end{description} \item[cosequence] \ \ \begin{description} \item[DPCC] Digit partial cosequence calculation. \end{description} \item[cyclic] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PERMCY] Permutation, cyclic. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \end{description} \item[deallocation] \ \ \begin{description} \item[GCAFREE] Garbage collected array memory deallocation. \end{description} \item[decimal] \ \ \begin{description} \item[AFDWRITE] Algebraic number field, decimal write. \item[ANDWRITE] Algebraic number decimal write. \item[RNDWRITE] Rational number decimal write. \end{description} \item[declare] \ \ \begin{description} \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \end{description} \item[decomposition] \ \ \begin{description} \item[PSDSV] Polynomial special decomposition, specified variable. \end{description} \item[default] \ \ \begin{description} \item[main] Default main routine. \end{description} \item[degree] \ \ \begin{description} \item[DIPDEG] Distributive polynomial degree. \item[DVCMP] Degree vector comparison. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[PDEG] Polynomial degree. \item[PDEGSV] Polynomial degree, specified variable. \item[PDEGV] Polynomial degree vector. \item[PMDEG] Polynomial modified degree. \end{description} \item[denominator] \ \ \begin{description} \item[RNDEN] Rational number denominator. \end{description} \item[dense] \ \ \begin{description} \item[DMPPRD] Dense modular polynomial product. \item[DMPSUM] Dense modular polynomial sum. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[DPFP] Dense polynomial from polynomial. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \end{description} \item[derivative] \ \ \begin{description} \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[IPDER] Integral polynomial derivative. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[MUPDER] Modular univariate polynomial derivative. \item[RPDMV] Rational polynomial derivative, main variable. \end{description} \item[determinant] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MMDDET] Matrix of modular digits determinant. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \end{description} \item[difference] \ \ \begin{description} \item[AFDIF] Algebraic number field element difference. \item[AFPDIF] Algebraic number field polynomial difference. \item[IDIF] Integer difference. \item[IPDIF] Integral polynomial difference. \item[MDDIF] Modular digit difference. \item[MIDIF] Modular integer difference. \item[MIPDIF] Modular integral polynomial difference. \item[MPDIF] Modular polynomial difference. \item[RNDIF] Rational number difference. \item[RPDIF] Rational polynomial difference. \item[SDIFF] Set difference. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFRDIF] Single-precision floating-point real difference. \item[USDIFF] Unordered set difference. \item[VIDIF] Vector of integers difference. \end{description} \item[digit] \ \ \begin{description} \item[DAND] Digit and. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[DIGIT] Digit. \item[DLOG2] Digit logarithm, base 2. \item[DNIMP] Digit non-implication. \item[DNOT] Digit not. \item[DOR] Digit or. \item[DPCC] Digit partial cosequence calculation. \item[DPGEN] Digit prime generator. \item[DPR] Digit product. \item[DQR] Digit quotient and remainder. \item[DRAN] Digit, random. \item[DRANN] Digit, random non-negative. \item[DSQRTF] Digit square root function. \item[GDPGEN] Gaussian digit prime generator. \item[IDIPR2] Integer digit inner product, length 2. \item[IDPR] Integer-digit product. \item[IDQ] Integer-digit quotient. \item[IDQR] Integer-digit quotient and remainder. \item[IDREM] Integer-digit remainder. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDDIF] Modular digit difference. \item[MDEXP] Modular digit exponentiation. \item[MDHOM] Modular digit homomorphism. \item[MDINV] Modular digit inverse. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MDNEG] Modular digit negative. \item[MDPROD] Modular digit product. \item[MDQ] Modular digit quotient. \item[MDRAN] Modular digit, random. \item[MDSUM] Modular digit sum. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MPMDP] Modular polynomial modular digit product. \item[REM] GAMMA-digit remainder. \end{description} \item[digits] \ \ \begin{description} \item[MMDDET] Matrix of modular digits determinant. \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[diophantine] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[discriminant] \ \ \begin{description} \item[IPDSCR] Integral polynomial discriminant. \end{description} \item[disjoint] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \end{description} \item[display] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \end{description} \item[distinct] \ \ \begin{description} \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[SDR] System of distinct representatives. \end{description} \item[distributive] \ \ \begin{description} \item[DIIPREAD] Distributive integral polynomial read. \item[DIIPWRITE] Distributive integral polynomial write. \item[DIPDEG] Distributive polynomial degree. \item[DIPFP] Distributive polynomial from polynomial. \item[DIPINS] Distributive polynomial, insert term. \item[DIRPREAD] Distributive rational polynomial read. \item[DIRPWRITE] Distributive rational polynomial write. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[PFDIP] Polynomial from distributive polynomial. \item[RPDWRITE] Rational Polynomial Distributive Write. \end{description} \item[divided] \ \ \begin{description} \item[PDBORD] Polynomial divided by order. \end{description} \item[division] \ \ \begin{description} \item[IDP2] Integer division by power of 2. \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[PDPV] Polynomial division by power of variable. \end{description} \item[divisior] \ \ \begin{description} \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \end{description} \item[divisor] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[ILPDS] Integer large prime divisor search. \item[IMPDS] Integer medium prime divisor search. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[divisors] \ \ \begin{description} \item[ISPD] Integer small prime divisors. \end{description} \item[double] \ \ \begin{description} \item[ANPEDE] [Algebraic number primitive element for a double extension. \end{description} \item[doubly] \ \ \begin{description} \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \end{description} \item[element] \ \ \begin{description} \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPROD] Algebraic number field element product. \item[AFSUM] Algebraic number field element sum. \item[AFWRITE] Algebraic field element write. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[GCAGET] Garbage collected array get element. \item[GCASET] Garbage collected array set element. \item[LEINST] List element insertion. \item[LELTI] List element. \item[LEROT] List element rotation. \item[LIST1] List, 1 element. \item[PFBRE] Polynomial From Base Ring Element. \item[SFIRST] Set first element. \item[SLELTI] Set list element. \item[VIERED] Vector of integers, element reduction. \end{description} \item[elements] \ \ \begin{description} \item[LIST10] List, 10 elements. \item[LIST2] List, 2 elements. \item[LIST3] List, 3 elements. \item[LIST4] List, 4 elements. \item[LIST5] List, 5 elements. \end{description} \item[empty] \ \ \begin{description} \item[ISLIST] Test for non-empty list. \item[ISNIL] Test for empty list. \end{description} \item[end] \ \ \begin{description} \item[ENDSACLIB] End saclib. \end{description} \item[entry] \ \ \begin{description} \item[GC] Garbage collection entry-point. \end{description} \item[equal] \ \ \begin{description} \item[EQUAL] Equal. \end{description} \item[equality] \ \ \begin{description} \item[SEQUAL] Set equality. \end{description} \item[equation] \ \ \begin{description} \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \end{description} \item[error] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \end{description} \item[evaluation] \ \ \begin{description} \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPCEVP] Integral polynomial, choice of evaluation points. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPEVAL] Integral polynomial evaluation. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[MMPEV] Matrix of modular polynomials evaluation. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPEVAL] Modular polynomial evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPEMV] Rational polynomial evaluation, main variable. \end{description} \item[even] \ \ \begin{description} \item[EVEN] EVEN. \item[IEVEN] Integer even. \end{description} \item[exact] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \end{description} \item[exponential] \ \ \begin{description} \item[EXPF] Exponential function. \end{description} \item[exponentiation] \ \ \begin{description} \item[IEXP] Integer exponentiation. \item[IPEXP] Integral polynomial exponentiation. \item[MDEXP] Modular digit exponentiation. \item[MIEXP] Modular integer exponentiation. \item[MPEXP] Modular polynomial exponentiation. \end{description} \item[expression] \ \ \begin{description} \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[RPEXPREAD] Rational polynomial expression read. \end{description} \item[extended] \ \ \begin{description} \item[DEGCD] Digit extended greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IHEGCD] Integer half-extended greatest common divisor. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \end{description} \item[extension] \ \ \begin{description} \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANREPE] Algebraic number represent element of a primitive extension. \end{description} \item[extent] \ \ \begin{description} \item[EXTENT] Extent. \end{description} \item[factor] \ \ \begin{description} \item[IPFACTREAD] Integral polynomial factor read. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPFLC] Integral polynomial factor list combine. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[RPFACTREAD] Rational polynomial factor read. \end{description} \item[factorial] \ \ \begin{description} \item[IFACTL] Integer factorial. \end{description} \item[factorization] \ \ \begin{description} \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[IFACT] Integer factorization. \item[IPFAC] Integral polynomial factorization. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[ISFPF] Integral squarefree polynomial factorization. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \end{description} \item[failure] \ \ \begin{description} \item[FAIL] Failure handler. \end{description} \item[fermat] \ \ \begin{description} \item[FRESL] Fermat residue list. \item[FRLSM] Fermat residue list, single modulus. \end{description} \item[field] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFDWRITE] Algebraic number field, decimal write. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFNEG] Algebraic number field negative. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPROD] Algebraic number field element product. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFQ] Algebraic number field quotient. \item[AFSIGN] Algebraic number field sign. \item[AFSUM] Algebraic number field element sum. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AFWRITE] Algebraic field element write. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[ANFAF] Algebraic number from algebraic number field element. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \end{description} \item[finest] \ \ \begin{description} \item[IPFSFB] Integral polynomial finest squarefree basis. \end{description} \item[first] \ \ \begin{description} \item[FIRST] First. \item[FIRST2] First 2. \item[FIRST3] First 3. \item[FIRST4] First 4. \item[SFIRST] Set first element. \end{description} \item[floating] \ \ \begin{description} \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[floor] \ \ \begin{description} \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RNFLOR] Rational number, floor of. \end{description} \item[flush] \ \ \begin{description} \item[FILINE] Flush the input stream line. \end{description} \item[fourth] \ \ \begin{description} \item[FOURTH] Fourth. \end{description} \item[from] \ \ \begin{description} \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AIFAN] Algebraic integer from algebraic number. \item[ANFAF] Algebraic number from algebraic number field element. \item[CSFPAR] Characteristic set from partition. \item[DIPFP] Distributive polynomial from polynomial. \item[DPFP] Dense polynomial from polynomial. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[LFS] List from String. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[PFBRE] Polynomial From Base Ring Element. \item[PFDIP] Polynomial from distributive polynomial. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PUFP] Polynomial, univariate, from polynomial. \item[RNINT] Rational number from integer. \item[RPFIP] Rational polynomial from integral polynomial. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCS] Set from characteristic set. \item[SFIFI] Single-precision floating-point interval from integer. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMIP] Symmetric modular from modular integral polynomial. \end{description} \item[function] \ \ \begin{description} \item[DSQRTF] Digit square root function. \item[EXPF] Exponential function. \item[IABSF] Integer absolute value function. \item[ISIGNF] Integer sign function. \end{description} \item[gamma] \ \ \begin{description} \item[GREAD] Gamma-integer read. \item[GWRITE] Gamma-integer write. \item[REM] GAMMA-digit remainder. \end{description} \item[garbage] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \item[GC] Garbage collection entry-point. \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAGET] Garbage collected array get element. \item[GCAMALLOC] Garbage collected array memory allocation. \item[GCASET] Garbage collected array set element. \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \item[GCSI] Garbage collection, system independent. \end{description} \item[gaussian] \ \ \begin{description} \item[GDPGEN] Gaussian digit prime generator. \end{description} \item[gca] \ \ \begin{description} \item[ISGCA] Test for GCA handle. \end{description} \item[gelfond] \ \ \begin{description} \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \end{description} \item[general] \ \ \begin{description} \item[IPGSUB] Integral polynomial general substitution. \end{description} \item[generator] \ \ \begin{description} \item[DPGEN] Digit prime generator. \item[GDPGEN] Gaussian digit prime generator. \end{description} \item[get] \ \ \begin{description} \item[GCAGET] Garbage collected array get element. \end{description} \item[global] \ \ \begin{description} \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \end{description} \item[greatest] \ \ \begin{description} \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[DEGCD] Digit extended greatest common divisor. \item[DGCD] Digit greatest common divisor. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[half] \ \ \begin{description} \item[IHEGCD] Integer half-extended greatest common divisor. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \end{description} \item[handle] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \item[ISGCA] Test for GCA handle. \end{description} \item[handler] \ \ \begin{description} \item[FAIL] Failure handler. \end{description} \item[hensel] \ \ \begin{description} \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[high] \ \ \begin{description} \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \end{description} \item[higher] \ \ \begin{description} \item[IPHDMV] Integral polynomial higher derivative, main variable. \end{description} \item[homomorphism] \ \ \begin{description} \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MDHOM] Modular digit homomorphism. \item[MIHOM] Modular integer homomorphism. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MPHOM] Modular polynomial homomorphism. \end{description} \item[homothetic] \ \ \begin{description} \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \end{description} \item[ideal] \ \ \begin{description} \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[ideas] \ \ \begin{description} \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[identity] \ \ \begin{description} \item[MIAIM] Matrix of integers, adjoin identity matrix. \end{description} \item[imaginary] \ \ \begin{description} \item[SFCIP] Single-precision floating-point complex, imaginary part. \end{description} \item[implication] \ \ \begin{description} \item[DNIMP] Digit non-implication. \end{description} \item[in] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \end{description} \item[independent] \ \ \begin{description} \item[GCSI] Garbage collection, system independent. \end{description} \item[induction] \ \ \begin{description} \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[IBCIND] Integer binomial coefficient induction. \item[IPRRII] Integral polynomial real root isolation induction. \end{description} \item[information] \ \ \begin{description} \item[INFOSACLIB] Write out usage information for SACLIB. \end{description} \item[inner] \ \ \begin{description} \item[IDIPR2] Integer digit inner product, length 2. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[input] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \item[FILINE] Flush the input stream line. \end{description} \item[insert] \ \ \begin{description} \item[DIPINS] Distributive polynomial, insert term. \end{description} \item[insertion] \ \ \begin{description} \item[LEINST] List element insertion. \item[LINS] List insertion. \item[LINSRT] List insertion. \item[MICINS] Matrix of integers column insertion. \end{description} \item[integer] \ \ \begin{description} \item[AFFINT] Algebraic number field element from integer. \item[AIFAN] Algebraic integer from algebraic number. \item[GREAD] Gamma-integer read. \item[GWRITE] Gamma-integer write. \item[IABSF] Integer absolute value function. \item[IBCIND] Integer binomial coefficient induction. \item[IBCOEF] Integer binomial coefficient. \item[IBCPS] Integer binomial coefficient partial sum. \item[ICOMP] Integer comparison. \item[IDEGCD] Integer doubly extended greatest common divisor algorithm. \item[IDIF] Integer difference. \item[IDIPR2] Integer digit inner product, length 2. \item[IDP2] Integer division by power of 2. \item[IDPR] Integer-digit product. \item[IDQ] Integer-digit quotient. \item[IDQR] Integer-digit quotient and remainder. \item[IDREM] Integer-digit remainder. \item[IEGCD] Integer extended greatest common divisor algorithm. \item[IEVEN] Integer even. \item[IEXP] Integer exponentiation. \item[IFACT] Integer factorization. \item[IFACTL] Integer factorial. \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[IGCD] Integer greatest common divisor. \item[IGCDCF] Integer greatest common divisor and cofactors. \item[IHEGCD] Integer half-extended greatest common divisor. \item[ILCM] Integer least common multiple. \item[ILCOMB] Integer linear combination. \item[ILOG2] Integer logarithm, base 2. \item[ILPDS] Integer large prime divisor search. \item[ILWRITE] Integer list write. \item[IMAX] Integer maximum. \item[IMIN] Integer minimum. \item[IMP2] Integer multiplication by power of 2. \item[IMPDS] Integer medium prime divisor search. \item[INEG] Integer negation. \item[IODD] Integer odd. \item[IORD2] Integer, order of 2. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPIP] Integral polynomial integer product. \item[IPIPP] Integral polynomial integer primitive part. \item[IPIQ] Integral polynomial integer quotient. \item[IPOWER] Integer power. \item[IPROD] Integer product. \item[IPRODK] Integer product, karatsuba algorithm. \item[IQ] Integer quotient. \item[IQR] Integer quotient and remainder. \item[IRAND] Integer, random. \item[IREAD] Integer read. \item[IREM] Integer remainder. \item[IROOT] Integer root. \item[ISEG] Integer segmentation. \item[ISIGNF] Integer sign function. \item[ISPD] Integer small prime divisors. \item[ISPT] Integer selfridge primality test. \item[ISQRT] Integer square root. \item[ISSUM] Integer shifted sum. \item[ISUM] Integer sum. \item[ITRUNC] Integer truncation. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IWRITE] Integer write. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MIDIF] Modular integer difference. \item[MIEXP] Modular integer exponentiation. \item[MIHOM] Modular integer homomorphism. \item[MIINV] Modular integer inverse. \item[MINEG] Modular integer negation. \item[MIPROD] Modular integer product. \item[MIQ] Modular integer quotient. \item[MIRAN] Modular integer, random. \item[MISUM] Modular integer sum. \item[RNINT] Rational number from integer. \item[SFIFI] Single-precision floating-point interval from integer. \item[SMFMI] Symmetric modular from modular integer. \end{description} \item[integers] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[LBIM] List of BETA-integers merge. \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[MICINS] Matrix of integers column insertion. \item[MICS] Matrix of integers column sort. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[VIAZ] Vector of integers, adjoin zeros. \item[VIDIF] Vector of integers difference. \item[VIERED] Vector of integers, element reduction. \item[VILCOM] Vector of integers linear combination. \item[VINEG] Vector of integers negation. \item[VISPR] Vector of integers scalar product. \item[VISUM] Vector of integers sum. \item[VIUT] Vector of integers, unimodular transformation. \end{description} \item[integral] \ \ \begin{description} \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[DIIPREAD] Distributive integral polynomial read. \item[DIIPWRITE] Distributive integral polynomial write. \item[IPABS] Integral polynomial absolute value. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPC] Integral polynomial content. \item[IPCEVP] Integral polynomial, choice of evaluation points. \item[IPCONST] Integral polynomial constant. \item[IPCPP] Integral polynomial content and primitive part. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPDER] Integral polynomial derivative. \item[IPDIF] Integral polynomial difference. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPDSCR] Integral polynomial discriminant. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPEVAL] Integral polynomial evaluation. \item[IPEXP] Integral polynomial exponentiation. \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[IPFAC] Integral polynomial factorization. \item[IPFACTREAD] Integral polynomial factor read. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPFLC] Integral polynomial factor list combine. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IPGSUB] Integral polynomial general substitution. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPINT] Integral polynomial integration. \item[IPIP] Integral polynomial integer product. \item[IPIPP] Integral polynomial integer primitive part. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQ] Integral polynomial integer quotient. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPMAXN] Integral polynomial maximum norm. \item[IPNEG] Integral polynomial negative. \item[IPNT] Integral polynomial negative transformation. \item[IPONE] Integral polynomial one. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPPOWREAD] Integral polynomial power read. \item[IPPP] Integral polynomial primitive part. \item[IPPROD] Integral polynomial product. \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[IPPSR] Integral polynomial pseudo-remainder. \item[IPQ] Integral polynomial quotient. \item[IPQR] Integral polynomial quotient and remainder. \item[IPRAN] Integral polynomial, random. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPREAD] Integral polynomial read. \item[IPRES] Integral polynomial resultant. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIGN] Integral polynomial sign. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IPSUB] Integral polynomial substitution. \item[IPSUM] Integral polynomial sum. \item[IPSUMN] Integral polynomial sum norm. \item[IPTERMREAD] Integral polynomial term read. \item[IPTPR] Integral polynomial truncated product. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRAN] Integral polynomial translation. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[IPTRUN] Integral polynomial truncation. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IPWRITE] Integral polynomial write. \item[ISFPF] Integral squarefree polynomial factorization. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPNT] Integral univariate polynomial negative transformation. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[IUPTPR] Integral univariate polynomial truncated product. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[IUPWRITE] Integral univariate polynomial write. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MAIPP] Matrix of integral polynomials product. \item[MIPDIF] Modular integral polynomial difference. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIPNEG] Modular integral polynomial negation. \item[MIPPR] Modular integral polynomial product. \item[MIPRAN] Modular integral polynomial, random. \item[MIPSUM] Modular integral polynomial sum. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[SMFMIP] Symmetric modular from modular integral polynomial. \end{description} \item[integration] \ \ \begin{description} \item[AFPINT] Algebraic number field polynomial integration. \item[IPINT] Integral polynomial integration. \item[RPIMV] Rational polynomial integration, main variable. \end{description} \item[interpolation] \ \ \begin{description} \item[MPINT] Modular polynomial interpolation. \end{description} \item[intersection] \ \ \begin{description} \item[CSINT] Characteristic set intersection. \item[SINTER] Set intersection. \item[USINT] Unordered set intersection. \end{description} \item[interval] \ \ \begin{description} \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[IIC] Isolating interval conversion. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[RIB] Rational interval bisection. \item[RIL] Rational interval length. \item[RILC] Rational interval length comparison. \item[RINEG] Rational interval negation. \item[RINT] Rational interval normalizing transformation. \item[RIPROD] Rational interval product. \item[RIRNP] Rational interval rational number product. \item[RISIGN] Rational interval sign. \item[RISUM] Rational interval sum. \item[SFIFI] Single-precision floating-point interval from integer. \end{description} \item[intervals] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \end{description} \item[introduction] \ \ \begin{description} \item[PINV] Polynomial introduction of new variables. \end{description} \item[inverse] \ \ \begin{description} \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[CINV] Constructive inverse. \item[INV] Inverse. \item[MDINV] Modular digit inverse. \item[MIINV] Modular integer inverse. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[RNINV] Rational number inverse. \end{description} \item[isolating] \ \ \begin{description} \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[IIC] Isolating interval conversion. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \end{description} \item[isolation] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[iupqs] \ \ \begin{description} \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \end{description} \item[kannan] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \end{description} \item[karatsuba] \ \ \begin{description} \item[IPRODK] Integer product, karatsuba algorithm. \end{description} \item[large] \ \ \begin{description} \item[ILPDS] Integer large prime divisor search. \end{description} \item[last] \ \ \begin{description} \item[LASTCELL] Last cell. \end{description} \item[leading] \ \ \begin{description} \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRLV] Integral polynomial translation, leading variable. \item[PLBCF] Polynomial leading base coefficient. \item[PLDCF] Polynomial leading coefficient. \end{description} \item[least] \ \ \begin{description} \item[ILCM] Integer least common multiple. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[lemma] \ \ \begin{description} \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[length] \ \ \begin{description} \item[IDIPR2] Integer digit inner product, length 2. \item[LENGTH] Length. \item[RIL] Rational interval length. \item[RILC] Rational interval length comparison. \end{description} \item[letter] \ \ \begin{description} \item[LETTER] Letter. \end{description} \item[lexicographically] \ \ \begin{description} \item[CPLEXN] Cartesian product, lexicographically next. \item[LEXNEX] Lexicographically next. \end{description} \item[line] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \item[FILINE] Flush the input stream line. \end{description} \item[linear] \ \ \begin{description} \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[ILCOMB] Integer linear combination. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \item[VILCOM] Vector of integers linear combination. \end{description} \item[list] \ \ \begin{description} \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[CLOUT] Character list out. \item[FRESL] Fermat residue list. \item[FRLSM] Fermat residue list, single modulus. \item[ILWRITE] Integer list write. \item[IPFLC] Integral polynomial factor list combine. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRRLS] Integral polynomial real root list separation. \item[ISLIST] Test for non-empty list. \item[ISNIL] Test for empty list. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[LBIM] List of BETA-integers merge. \item[LCONC] List concatenation. \item[LEINST] List element insertion. \item[LELTI] List element. \item[LEROT] List element rotation. \item[LFS] List from String. \item[LINS] List insertion. \item[LINSRT] List insertion. \item[LIST1] List, 1 element. \item[LIST10] List, 10 elements. \item[LIST2] List, 2 elements. \item[LIST3] List, 3 elements. \item[LIST4] List, 4 elements. \item[LIST5] List, 5 elements. \item[LMERGE] List merge. \item[LPERM] List permute. \item[LREAD] List read. \item[LSRCH] List search. \item[LWRITE] List write. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[PCL] Polynomial coefficient list. \item[SLELTI] Set list element. \item[VLREAD] Variable list read. \item[VLSRCH] Variable list search. \item[VLWRITE] Variable list write. \end{description} \item[location] \ \ \begin{description} \item[DIELOC] Display Input Error Location. \end{description} \item[logarithm] \ \ \begin{description} \item[DLOG2] Digit logarithm, base 2. \item[IFCL2] Integer, floor and ceiling, logarithm, base 2. \item[ILOG2] Integer logarithm, base 2. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \end{description} \item[lookahead] \ \ \begin{description} \item[LKAHEAD] Character lookahead. \end{description} \item[loos] \ \ \begin{description} \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \end{description} \item[lower] \ \ \begin{description} \item[SFRLS] Single-precision floating-point real number lower sum. \end{description} \item[lowest] \ \ \begin{description} \item[RNRED] Rational number reduction to lowest terms. \end{description} \item[main] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[main] Default main routine. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MPEMV] Modular polynomial evaluation of main variable. \item[PMPMV] Polynomial multiplication by power of main variable. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPIMV] Rational polynomial integration, main variable. \end{description} \item[mark] \ \ \begin{description} \item[MARK] Mark. \end{description} \item[matrix] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MAIPP] Matrix of integral polynomials product. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[MIAIM] Matrix of integers, adjoin identity matrix. \item[MICINS] Matrix of integers column insertion. \item[MICS] Matrix of integers column sort. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[MMDDET] Matrix of modular digits determinant. \item[MMDNSB] Matrix of modular digits null-space basis. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPEV] Matrix of modular polynomials evaluation. \end{description} \item[max] \ \ \begin{description} \item[RNMAX] Rational number max. \end{description} \item[maximum] \ \ \begin{description} \item[IMAX] Integer maximum. \item[IPMAXN] Integral polynomial maximum norm. \item[MAX] Maximum. \item[VMAX] Vector maximum. \end{description} \item[medium] \ \ \begin{description} \item[IMPDS] Integer medium prime divisor search. \end{description} \item[membership] \ \ \begin{description} \item[MEMBER] Membership test. \end{description} \item[memory] \ \ \begin{description} \item[GCAFREE] Garbage collected array memory deallocation. \item[GCAMALLOC] Garbage collected array memory allocation. \end{description} \item[merge] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIM] List of BETA-integers merge. \item[LMERGE] List merge. \end{description} \item[method] \ \ \begin{description} \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[min] \ \ \begin{description} \item[RNMIN] Rational number min. \end{description} \item[minimal] \ \ \begin{description} \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \end{description} \item[minimum] \ \ \begin{description} \item[IMIN] Integer minimum. \item[MIN] Minimum. \item[VMIN] Vector minimum. \end{description} \item[minus] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \end{description} \item[mod] \ \ \begin{description} \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[modified] \ \ \begin{description} \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[PMDEG] Polynomial modified degree. \end{description} \item[modular] \ \ \begin{description} \item[DMPPRD] Dense modular polynomial product. \item[DMPSUM] Dense modular polynomial sum. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDDIF] Modular digit difference. \item[MDEXP] Modular digit exponentiation. \item[MDHOM] Modular digit homomorphism. \item[MDINV] Modular digit inverse. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MDNEG] Modular digit negative. \item[MDPROD] Modular digit product. \item[MDQ] Modular digit quotient. \item[MDRAN] Modular digit, random. \item[MDSUM] Modular digit sum. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MIDIF] Modular integer difference. \item[MIEXP] Modular integer exponentiation. \item[MIHOM] Modular integer homomorphism. \item[MIINV] Modular integer inverse. \item[MINEG] Modular integer negation. \item[MIPDIF] Modular integral polynomial difference. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIPNEG] Modular integral polynomial negation. \item[MIPPR] Modular integral polynomial product. \item[MIPRAN] Modular integral polynomial, random. \item[MIPROD] Modular integer product. \item[MIPSUM] Modular integral polynomial sum. \item[MIQ] Modular integer quotient. \item[MIRAN] Modular integer, random. \item[MISUM] Modular integer sum. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[MMDDET] Matrix of modular digits determinant. \item[MMDNSB] Matrix of modular digits null-space basis. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPEV] Matrix of modular polynomials evaluation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPDIF] Modular polynomial difference. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPEVAL] Modular polynomial evaluation. \item[MPEXP] Modular polynomial exponentiation. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MPHOM] Modular polynomial homomorphism. \item[MPINT] Modular polynomial interpolation. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[MPMDP] Modular polynomial modular digit product. \item[MPMDP] Modular polynomial modular digit product. \item[MPMON] Modular polynomial monic. \item[MPNEG] Modular polynomial negative. \item[MPPROD] Modular polynomial product. \item[MPPSR] Modular polynomial pseudo-remainder. \item[MPQ] Modular polynomial quotient. \item[MPQR] Modular polynomial quotient and remainder. \item[MPRAN] Modular polynomial, random. \item[MPRES] Modular polynomial resultant. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[MPSUM] Modular polynomial sum. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \item[MPUP] Modular polynomial univariate product. \item[MPUPP] Modular polynomial univariate primitive part. \item[MPUQ] Modular polynomial univariate quotient. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPDER] Modular univariate polynomial derivative. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[MUPRAN] Modular univariate polynomial, random. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMIP] Symmetric modular from modular integral polynomial. \item[SMFMIP] Symmetric modular from modular integral polynomial. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[module] \ \ \begin{description} \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMSIGN] Algebraic module sign. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \end{description} \item[modulus] \ \ \begin{description} \item[FRLSM] Fermat residue list, single modulus. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \end{description} \item[monic] \ \ \begin{description} \item[AFPMON] Algebraic number field polynomial monic. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPMON] Modular polynomial monic. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \end{description} \item[monomial] \ \ \begin{description} \item[PMON] Polynomial monomial. \end{description} \item[multiple] \ \ \begin{description} \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[ILCM] Integer least common multiple. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \item[multiplication] \ \ \begin{description} \item[IMP2] Integer multiplication by power of 2. \item[PMPMV] Polynomial multiplication by power of main variable. \end{description} \item[natural] \ \ \begin{description} \item[DMUPNR] Dense modular univariate polynomial natural remainder. \end{description} \item[negation] \ \ \begin{description} \item[INEG] Integer negation. \item[MINEG] Modular integer negation. \item[MIPNEG] Modular integral polynomial negation. \item[RINEG] Rational interval negation. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFRNEG] Single-precision floating-point real negation. \item[VINEG] Vector of integers negation. \end{description} \item[negative] \ \ \begin{description} \item[AFNEG] Algebraic number field negative. \item[AFPNEG] Algebraic number field polynomial negative. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[DRANN] Digit, random non-negative. \item[IPNEG] Integral polynomial negative. \item[IPNT] Integral polynomial negative transformation. \item[IUPNT] Integral univariate polynomial negative transformation. \item[MDNEG] Modular digit negative. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[MPNEG] Modular polynomial negative. \item[RNNEG] Rational number negative. \item[RPNEG] Rational polynomial negative. \end{description} \item[new] \ \ \begin{description} \item[PINV] Polynomial introduction of new variables. \end{description} \item[newton] \ \ \begin{description} \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \end{description} \item[next] \ \ \begin{description} \item[CPLEXN] Cartesian product, lexicographically next. \item[LEXNEX] Lexicographically next. \item[PARTN] Partition, next. \end{description} \item[non] \ \ \begin{description} \item[DNIMP] Digit non-implication. \item[DRANN] Digit, random non-negative. \item[ISLIST] Test for non-empty list. \item[MINNCT] Matrix of integers, non-negative column transformation. \end{description} \item[norm] \ \ \begin{description} \item[AFPNORM] Algebraic number field polynomial norm. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[IPMAXN] Integral polynomial maximum norm. \item[IPSUMN] Integral polynomial sum norm. \end{description} \item[normalize] \ \ \begin{description} \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \end{description} \item[normalized] \ \ \begin{description} \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \end{description} \item[normalizing] \ \ \begin{description} \item[RINT] Rational interval normalizing transformation. \end{description} \item[not] \ \ \begin{description} \item[DNOT] Digit not. \end{description} \item[null] \ \ \begin{description} \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[number] \ \ \begin{description} \item[AFCOMP] Algebraic number field comparison. \item[AFCR] Algebraic number field element convert representation. \item[AFDIF] Algebraic number field element difference. \item[AFDWRITE] Algebraic number field, decimal write. \item[AFFINT] Algebraic number field element from integer. \item[AFFRN] Algebraic number field element from rational number. \item[AFFRN] Algebraic number field element from rational number. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFINV] Algebraic number field element inverse. \item[AFNEG] Algebraic number field negative. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPROD] Algebraic number field element product. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFQ] Algebraic number field quotient. \item[AFSIGN] Algebraic number field sign. \item[AFSUM] Algebraic number field element sum. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AIFAN] Algebraic integer from algebraic number. \item[ANDWRITE] Algebraic number decimal write. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANFAF] Algebraic number from algebraic number field element. \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANPROD] Algebraic number product. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[ANSUM] Algebraic number sum. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[RIRNP] Rational interval rational number product. \item[RNABS] Rational number absolute value. \item[RNBCR] Rational number binary common representation. \item[RNCEIL] Rational number, ceiling of. \item[RNCOMP] Rational number comparison. \item[RNDEN] Rational number denominator. \item[RNDIF] Rational number difference. \item[RNDWRITE] Rational number decimal write. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RNFLOR] Rational number, floor of. \item[RNINT] Rational number from integer. \item[RNINV] Rational number inverse. \item[RNMAX] Rational number max. \item[RNMIN] Rational number min. \item[RNNEG] Rational number negative. \item[RNNUM] Rational number numerator. \item[RNP2] Rational number power of 2. \item[RNPROD] Rational number product. \item[RNQ] Rational number quotient. \item[RNRAND] Rational number, random. \item[RNREAD] Rational number read. \item[RNRED] Rational number reduction to lowest terms. \item[RNSIGN] Rational number sign. \item[RNSUM] Rational number sum. \item[RNWRITE] Rational number write. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPRNP] Rational polynomial rational number product. \item[SFRLS] Single-precision floating-point real number lower sum. \end{description} \item[numerator] \ \ \begin{description} \item[RNNUM] Rational number numerator. \end{description} \item[object] \ \ \begin{description} \item[ISOBJECT] Test for object. \item[OREAD] Object read. \item[OWRITE] Object write. \end{description} \item[odd] \ \ \begin{description} \item[IODD] Integer odd. \item[ODD] Odd. \end{description} \item[one] \ \ \begin{description} \item[IPONE] Integral polynomial one. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \end{description} \item[open] \ \ \begin{description} \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \end{description} \item[or] \ \ \begin{description} \item[DOR] Digit or. \end{description} \item[order] \ \ \begin{description} \item[IORD2] Integer, order of 2. \item[ORDER] Order. \item[PDBORD] Polynomial divided by order. \item[PORD] Polynomial order. \end{description} \item[out] \ \ \begin{description} \item[CLOUT] Character list out. \item[INFOSACLIB] Write out usage information for SACLIB. \end{description} \item[output] \ \ \begin{description} \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \end{description} \item[pair] \ \ \begin{description} \item[PAIR] Pair. \end{description} \item[part] \ \ \begin{description} \item[IPCPP] Integral polynomial content and primitive part. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPIPP] Integral polynomial integer primitive part. \item[IPPP] Integral polynomial primitive part. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUPP] Modular polynomial univariate primitive part. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCRP] Single-precision floating-point complex, real part. \end{description} \item[partial] \ \ \begin{description} \item[DPCC] Digit partial cosequence calculation. \item[IBCPS] Integer binomial coefficient partial sum. \end{description} \item[partition] \ \ \begin{description} \item[CSFPAR] Characteristic set from partition. \item[PARTN] Partition, next. \item[PARTR] Partition, random. \item[PARTSS] Partition sumset. \end{description} \item[parts] \ \ \begin{description} \item[IPLCPP] Integral polynomial list of contents and primitive parts. \end{description} \item[pcpv] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \end{description} \item[permutation] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PERMCY] Permutation, cyclic. \item[PERMR] Permutation, random. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PPERMV] Polynomial permutation of variables. \end{description} \item[permute] \ \ \begin{description} \item[LPERM] List permute. \end{description} \item[picpv] \ \ \begin{description} \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \end{description} \item[plane] \ \ \begin{description} \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \end{description} \item[point] \ \ \begin{description} \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[GC] Garbage collection entry-point. \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[pointer] \ \ \begin{description} \item[GCA2PTR] Convert garbage collected array handle to C pointer. \end{description} \item[points] \ \ \begin{description} \item[IPCEVP] Integral polynomial, choice of evaluation points. \end{description} \item[polynomial] \ \ \begin{description} \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPDIF] Algebraic number field polynomial difference. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AFPEV] Algebraic number field polynomial evaluation. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFIP] Algebraic number field polynomial from integral polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[AFPINT] Algebraic number field polynomial integration. \item[AFPME] Algebraic number field polynomial multiple evaluation. \item[AFPMON] Algebraic number field polynomial monic. \item[AFPNEG] Algebraic number field polynomial negative. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNIP] Algebraic number field polynomial normalize to integral polynomial. \item[AFPNORM] Algebraic number field polynomial norm. \item[AFPPR] Algebraic number field polynomial product. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFPSUM] Algebraic number field polynomial sum. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[DIIPREAD] Distributive integral polynomial read. \item[DIIPWRITE] Distributive integral polynomial write. \item[DIPDEG] Distributive polynomial degree. \item[DIPFP] Distributive polynomial from polynomial. \item[DIPFP] Distributive polynomial from polynomial. \item[DIPINS] Distributive polynomial, insert term. \item[DIRPREAD] Distributive rational polynomial read. \item[DIRPWRITE] Distributive rational polynomial write. \item[DMPPRD] Dense modular polynomial product. \item[DMPSUM] Dense modular polynomial sum. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[DPFP] Dense polynomial from polynomial. \item[DPFP] Dense polynomial from polynomial. \item[IPABS] Integral polynomial absolute value. \item[IPAFME] Integral polynomial, algebraic number field multiple evaluation. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPC] Integral polynomial content. \item[IPCEVP] Integral polynomial, choice of evaluation points. \item[IPCONST] Integral polynomial constant. \item[IPCPP] Integral polynomial content and primitive part. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPDER] Integral polynomial derivative. \item[IPDIF] Integral polynomial difference. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPDSCR] Integral polynomial discriminant. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPEVAL] Integral polynomial evaluation. \item[IPEXP] Integral polynomial exponentiation. \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[IPFAC] Integral polynomial factorization. \item[IPFACTREAD] Integral polynomial factor read. \item[IPFCB] Integral polynomial factor coefficient bound. \item[IPFLC] Integral polynomial factor list combine. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPGCDC] Integral polynomial greatest common divisor and cofactors. \item[IPGFCB] Integral polynomial Gelfond factor coefficient bound. \item[IPGSUB] Integral polynomial general substitution. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPIC] Integral polynomial integer content. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPICS] Integral polynomial integer content subroutine. \item[IPIHOM] Integral polynomial mod ideal homomorphism. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPINT] Integral polynomial integration. \item[IPIP] Integral polynomial integer product. \item[IPIPP] Integral polynomial integer primitive part. \item[IPIPR] Integral polynomial mod ideal product. \item[IPIQ] Integral polynomial integer quotient. \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPMAXN] Integral polynomial maximum norm. \item[IPNEG] Integral polynomial negative. \item[IPNT] Integral polynomial negative transformation. \item[IPONE] Integral polynomial one. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPPOWREAD] Integral polynomial power read. \item[IPPP] Integral polynomial primitive part. \item[IPPROD] Integral polynomial product. \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[IPPSR] Integral polynomial pseudo-remainder. \item[IPQ] Integral polynomial quotient. \item[IPQR] Integral polynomial quotient and remainder. \item[IPRAN] Integral polynomial, random. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPREAD] Integral polynomial read. \item[IPRES] Integral polynomial resultant. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSIGN] Integral polynomial sign. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IPSUB] Integral polynomial substitution. \item[IPSUM] Integral polynomial sum. \item[IPSUMN] Integral polynomial sum norm. \item[IPTERMREAD] Integral polynomial term read. \item[IPTPR] Integral polynomial truncated product. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRAN] Integral polynomial translation. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[IPTRUN] Integral polynomial truncation. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IPWRITE] Integral polynomial write. \item[ISFPF] Integral squarefree polynomial factorization. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPNT] Integral univariate polynomial negative transformation. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[IUPTPR] Integral univariate polynomial truncated product. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[IUPWRITE] Integral univariate polynomial write. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MIPDIF] Modular integral polynomial difference. \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[MIPHOM] Modular integral polynomial homomorphism. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIPNEG] Modular integral polynomial negation. \item[MIPPR] Modular integral polynomial product. \item[MIPRAN] Modular integral polynomial, random. \item[MIPSUM] Modular integral polynomial sum. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPDIF] Modular polynomial difference. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPEVAL] Modular polynomial evaluation. \item[MPEXP] Modular polynomial exponentiation. \item[MPGCDC] Modular polynomial greatest common divisor and cofactors. \item[MPHOM] Modular polynomial homomorphism. \item[MPINT] Modular polynomial interpolation. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[MPMDP] Modular polynomial modular digit product. \item[MPMON] Modular polynomial monic. \item[MPNEG] Modular polynomial negative. \item[MPPROD] Modular polynomial product. \item[MPPSR] Modular polynomial pseudo-remainder. \item[MPQ] Modular polynomial quotient. \item[MPQR] Modular polynomial quotient and remainder. \item[MPRAN] Modular polynomial, random. \item[MPRES] Modular polynomial resultant. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[MPSUM] Modular polynomial sum. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \item[MPUP] Modular polynomial univariate product. \item[MPUPP] Modular polynomial univariate primitive part. \item[MPUQ] Modular polynomial univariate quotient. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPDER] Modular univariate polynomial derivative. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[MUPRAN] Modular univariate polynomial, random. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \item[PBIN] Polynomial binomial. \item[PCL] Polynomial coefficient list. \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PDBORD] Polynomial divided by order. \item[PDEG] Polynomial degree. \item[PDEGSV] Polynomial degree, specified variable. \item[PDEGV] Polynomial degree vector. \item[PDPV] Polynomial division by power of variable. \item[PFBRE] Polynomial From Base Ring Element. \item[PFDIP] Polynomial from distributive polynomial. \item[PFDIP] Polynomial from distributive polynomial. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PINV] Polynomial introduction of new variables. \item[PLBCF] Polynomial leading base coefficient. \item[PLDCF] Polynomial leading coefficient. \item[PMDEG] Polynomial modified degree. \item[PMON] Polynomial monomial. \item[PMPMV] Polynomial multiplication by power of main variable. \item[PORD] Polynomial order. \item[PPERMV] Polynomial permutation of variables. \item[PRED] Polynomial reductum. \item[PRT] Polynomial reciprocal transformation. \item[PSDSV] Polynomial special decomposition, specified variable. \item[PTBCF] Polynomial trailing base coefficient. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PUFP] Polynomial, univariate, from polynomial. \item[PUFP] Polynomial, univariate, from polynomial. \item[PUNT] Polynomial univariate test. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[RPDIF] Rational polynomial difference. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPDWRITE] Rational Polynomial Distributive Write. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPEXPREAD] Rational polynomial expression read. \item[RPFACTREAD] Rational polynomial factor read. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPIMV] Rational polynomial integration, main variable. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[RPNEG] Rational polynomial negative. \item[RPPOWREAD] Rational polynomial power read. \item[RPPROD] Rational polynomial product. \item[RPQR] Rational polynomial quotient and remainder. \item[RPREAD] Rational polynomial read. \item[RPRNP] Rational polynomial rational number product. \item[RPSUM] Rational polynomial sum. \item[RPTERMREAD] Rational polynomial term read. \item[RPWRITE] Rational polynomial write. \item[RUPWRITE] Rational univariate polynomial write. \item[SMFMIP] Symmetric modular from modular integral polynomial. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[polynomials] \ \ \begin{description} \item[MAIPDE] Matrix of integral polynomials determinant, exact division algorithm. \item[MAIPDM] Matrix of integral polynomials determinant, modular algorithm. \item[MAIPHM] Matrix of integral polynomials homomorphism. \item[MAIPP] Matrix of integral polynomials product. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MMPDMA] Matrix of modular polynomials determinant, modular algorithm. \item[MMPEV] Matrix of modular polynomials evaluation. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \end{description} \item[power] \ \ \begin{description} \item[IDP2] Integer division by power of 2. \item[IMP2] Integer multiplication by power of 2. \item[IPOWER] Integer power. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPOWREAD] Integral polynomial power read. \item[PDPV] Polynomial division by power of variable. \item[PMPMV] Polynomial multiplication by power of main variable. \item[RNP2] Rational number power of 2. \item[RPPOWREAD] Rational polynomial power read. \end{description} \item[precision] \ \ \begin{description} \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[preparation] \ \ \begin{description} \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \end{description} \item[primality] \ \ \begin{description} \item[ISPT] Integer selfridge primality test. \end{description} \item[prime] \ \ \begin{description} \item[DPGEN] Digit prime generator. \item[GDPGEN] Gaussian digit prime generator. \item[ILPDS] Integer large prime divisor search. \item[IMPDS] Integer medium prime divisor search. \item[ISPD] Integer small prime divisors. \end{description} \item[primitive] \ \ \begin{description} \item[ANIIPE] Algebraic number isolating interval for a primitive element. \item[ANPEDE] [Algebraic number primitive element for a double extension. \item[ANREPE] Algebraic number represent element of a primitive extension. \item[IPCPP] Integral polynomial content and primitive part. \item[IPICPP] Integral polynomial integer content and primitive part. \item[IPIPP] Integral polynomial integer primitive part. \item[IPLCPP] Integral polynomial list of contents and primitive parts. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPPP] Integral polynomial primitive part. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUPP] Modular polynomial univariate primitive part. \end{description} \item[principal] \ \ \begin{description} \item[IPPSC] Integral polynomial principal subresultant coefficients. \end{description} \item[problem] \ \ \begin{description} \item[ASSPR] Assignment problem. \end{description} \item[process] \ \ \begin{description} \item[ARGSACLIB] Process the command line arguments. \end{description} \item[product] \ \ \begin{description} \item[AFPAFP] Algebraic number field polynomial algebraic number field element product. \item[AFPPR] Algebraic number field polynomial product. \item[AFPROD] Algebraic number field element product. \item[ANPROD] Algebraic number product. \item[CPLEXN] Cartesian product, lexicographically next. \item[DMPPRD] Dense modular polynomial product. \item[DPR] Digit product. \item[IDIPR2] Integer digit inner product, length 2. \item[IDPR] Integer-digit product. \item[IPIP] Integral polynomial integer product. \item[IPIPR] Integral polynomial mod ideal product. \item[IPP2P] Integral polynomial power of 2 product. \item[IPPROD] Integral polynomial product. \item[IPROD] Integer product. \item[IPRODK] Integer product, karatsuba algorithm. \item[IPTPR] Integral polynomial truncated product. \item[IUPTPR] Integral univariate polynomial truncated product. \item[MAIPP] Matrix of integral polynomials product. \item[MDPROD] Modular digit product. \item[MIPIPR] Modular integral polynomial mod ideal product. \item[MIPPR] Modular integral polynomial product. \item[MIPROD] Modular integer product. \item[MPMDP] Modular polynomial modular digit product. \item[MPPROD] Modular polynomial product. \item[MPUP] Modular polynomial univariate product. \item[RIPROD] Rational interval product. \item[RIRNP] Rational interval rational number product. \item[RNPROD] Rational number product. \item[RPPROD] Rational polynomial product. \item[RPRNP] Rational polynomial rational number product. \item[SFCPR] Single-precision floating-point complex product. \item[SFRPR] Single-precision floating-point real product. \item[VISPR] Vector of integers scalar product. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[pseudo] \ \ \begin{description} \item[IPPSR] Integral polynomial pseudo-remainder. \item[MPPSR] Modular polynomial pseudo-remainder. \end{description} \item[ptv] \ \ \begin{description} \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \end{description} \item[q] \ \ \begin{description} \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \end{description} \item[quadratic] \ \ \begin{description} \item[IPIQH] Integral polynomial mod ideal quadratic hensel lemma. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MPIQH] Modular polynomial mod ideal, quadratic Hensel lemma. \item[MPIQHL] Modular polynomial mod ideal quadratic hensel lemma, list. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \end{description} \item[quotient] \ \ \begin{description} \item[AFPAFQ] Algebraic number field polynomial algebraic number field element quotient. \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[AFQ] Algebraic number field quotient. \item[DQR] Digit quotient and remainder. \item[IDQ] Integer-digit quotient. \item[IDQR] Integer-digit quotient and remainder. \item[IPIQ] Integral polynomial integer quotient. \item[IPQ] Integral polynomial quotient. \item[IPQR] Integral polynomial quotient and remainder. \item[IQ] Integer quotient. \item[IQR] Integer quotient and remainder. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[MDQ] Modular digit quotient. \item[MIQ] Modular integer quotient. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPQ] Modular polynomial quotient. \item[MPQR] Modular polynomial quotient and remainder. \item[MPUQ] Modular polynomial univariate quotient. \item[QREM] Quotient and remainder. \item[RNQ] Rational number quotient. \item[RPQR] Rational polynomial quotient and remainder. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFRQ] Single-precision floating-point real quotient. \end{description} \item[random] \ \ \begin{description} \item[BITRAN] Bit, random. \item[DRAN] Digit, random. \item[DRANN] Digit, random non-negative. \item[IPRAN] Integral polynomial, random. \item[IRAND] Integer, random. \item[MDRAN] Modular digit, random. \item[MIPRAN] Modular integral polynomial, random. \item[MIRAN] Modular integer, random. \item[MPRAN] Modular polynomial, random. \item[MUPRAN] Modular univariate polynomial, random. \item[PARTR] Partition, random. \item[PERMR] Permutation, random. \item[RNRAND] Rational number, random. \end{description} \item[rational] \ \ \begin{description} \item[AFFRN] Algebraic number field element from rational number. \item[AFPFRP] Algebraic number field polynomial from rational polynomial. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[DIRPREAD] Distributive rational polynomial read. \item[DIRPWRITE] Distributive rational polynomial write. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \item[IPFRP] Integral polynomial from rational polynomial. \item[IPSRP] Integral polynomial similiar to rational polynomial. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[RIB] Rational interval bisection. \item[RIL] Rational interval length. \item[RILC] Rational interval length comparison. \item[RINEG] Rational interval negation. \item[RINT] Rational interval normalizing transformation. \item[RIPROD] Rational interval product. \item[RIRNP] Rational interval rational number product. \item[RIRNP] Rational interval rational number product. \item[RISIGN] Rational interval sign. \item[RISUM] Rational interval sum. \item[RNABS] Rational number absolute value. \item[RNBCR] Rational number binary common representation. \item[RNCEIL] Rational number, ceiling of. \item[RNCOMP] Rational number comparison. \item[RNDEN] Rational number denominator. \item[RNDIF] Rational number difference. \item[RNDWRITE] Rational number decimal write. \item[RNFCL2] Rational number floor and ceiling of logarithm, base 2. \item[RNFLOR] Rational number, floor of. \item[RNINT] Rational number from integer. \item[RNINV] Rational number inverse. \item[RNMAX] Rational number max. \item[RNMIN] Rational number min. \item[RNNEG] Rational number negative. \item[RNNUM] Rational number numerator. \item[RNP2] Rational number power of 2. \item[RNPROD] Rational number product. \item[RNQ] Rational number quotient. \item[RNRAND] Rational number, random. \item[RNREAD] Rational number read. \item[RNRED] Rational number reduction to lowest terms. \item[RNSIGN] Rational number sign. \item[RNSUM] Rational number sum. \item[RNWRITE] Rational number write. \item[RPAFME] Rational polynomial, algebraic number field multiple evaluation. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[RPDIF] Rational polynomial difference. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPDWRITE] Rational Polynomial Distributive Write. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPEXPREAD] Rational polynomial expression read. \item[RPFACTREAD] Rational polynomial factor read. \item[RPFIP] Rational polynomial from integral polynomial. \item[RPIMV] Rational polynomial integration, main variable. \item[RPMAIP] Rational polynomial monic associate of integral polynomial. \item[RPNEG] Rational polynomial negative. \item[RPPOWREAD] Rational polynomial power read. \item[RPPROD] Rational polynomial product. \item[RPQR] Rational polynomial quotient and remainder. \item[RPREAD] Rational polynomial read. \item[RPRNP] Rational polynomial rational number product. \item[RPRNP] Rational polynomial rational number product. \item[RPSUM] Rational polynomial sum. \item[RPTERMREAD] Rational polynomial term read. \item[RPWRITE] Rational polynomial write. \item[RUPWRITE] Rational univariate polynomial write. \end{description} \item[read] \ \ \begin{description} \item[AREAD] Atom read. \item[CREAD] Character read. \item[CREADB] Character read. \item[DIIPREAD] Distributive integral polynomial read. \item[DIRPREAD] Distributive rational polynomial read. \item[GREAD] Gamma-integer read. \item[IPEXPREAD] Integral polynomial expression read. \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \item[IPFACTREAD] Integral polynomial factor read. \item[IPPOWREAD] Integral polynomial power read. \item[IPREAD] Integral polynomial read. \item[IPTERMREAD] Integral polynomial term read. \item[IREAD] Integer read. \item[LREAD] List read. \item[OREAD] Object read. \item[RNREAD] Rational number read. \item[RPEXPREAD] Rational polynomial expression read. \item[RPFACTREAD] Rational polynomial factor read. \item[RPPOWREAD] Rational polynomial power read. \item[RPREAD] Rational polynomial read. \item[RPTERMREAD] Rational polynomial term read. \item[VLREAD] Variable list read. \item[VREAD] Variable read. \end{description} \item[real] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[reciprocal] \ \ \begin{description} \item[PRT] Polynomial reciprocal transformation. \end{description} \item[reduced] \ \ \begin{description} \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \end{description} \item[reduction] \ \ \begin{description} \item[RNRED] Rational number reduction to lowest terms. \item[VIERED] Vector of integers, element reduction. \end{description} \item[reductum] \ \ \begin{description} \item[PRED] Polynomial reductum. \item[RED] Reductum 1. \item[RED2] Reductum 2. \item[RED3] Reductum 3. \item[RED4] Reductum 4. \item[REDI] Reductum. \item[SRED] Set reductum. \end{description} \item[refinement] \ \ \begin{description} \item[AFUPIIR] Algebraic number field polynomial isolating interval refinement. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPIIR] Algebraic module polynomial isolating interval refinement. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \end{description} \item[relative] \ \ \begin{description} \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[IPRRRI] Integral polynomial relative real root isolation. \end{description} \item[remainder] \ \ \begin{description} \item[AFPQR] Algebraic number field polynomial quotient and remainder. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[DQR] Digit quotient and remainder. \item[IDQR] Integer-digit quotient and remainder. \item[IDREM] Integer-digit remainder. \item[IPCRA] Integral polynomial chinese remainder algorithm. \item[IPPSR] Integral polynomial pseudo-remainder. \item[IPQR] Integral polynomial quotient and remainder. \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[IQR] Integer quotient and remainder. \item[IREM] Integer remainder. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[MDCRA] Modular digit chinese remainder algorithm. \item[MDLCRA] Modular digit list chinese remainder algorithm. \item[MIDCRA] Modular integer digit chinese remainder algorithm. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MMPIQR] Modular monic polynomial mod ideal quotient and remainder. \item[MPPSR] Modular polynomial pseudo-remainder. \item[MPQR] Modular polynomial quotient and remainder. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \item[QREM] Quotient and remainder. \item[REM] GAMMA-digit remainder. \item[RPQR] Rational polynomial quotient and remainder. \end{description} \item[remove] \ \ \begin{description} \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \end{description} \item[represent] \ \ \begin{description} \item[ANREPE] Algebraic number represent element of a primitive extension. \end{description} \item[representation] \ \ \begin{description} \item[AFCR] Algebraic number field element convert representation. \item[AFICR] Algebraic number field element inverse convert representation. \item[AFPCR] Algebraic number field polynomial convert representation. \item[AFPICR] Algebraic number field polynomial inverse convert representation. \item[RNBCR] Rational number binary common representation. \end{description} \item[representatives] \ \ \begin{description} \item[SDR] System of distinct representatives. \end{description} \item[residue] \ \ \begin{description} \item[FRESL] Fermat residue list. \item[FRLSM] Fermat residue list, single modulus. \end{description} \item[respect] \ \ \begin{description} \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \end{description} \item[result] \ \ \begin{description} \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBREI] Integral polynomial binary rational evaluation, integral polynomial result. \end{description} \item[resultant] \ \ \begin{description} \item[IPRES] Integral polynomial resultant. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[MPRES] Modular polynomial resultant. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \end{description} \item[ring] \ \ \begin{description} \item[PFBRE] Polynomial From Base Ring Element. \end{description} \item[root] \ \ \begin{description} \item[AFPBRI] Algebraic number field polynomial basis real root isolation. \item[AFPRCL] Algebraic number field polynomial real root isolation, collins-loos algorithm. \item[AFPRII] Algebraic number field polynomial real root isolation induction. \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRI] Algebraic number field polynomial relative real root isolation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[DSQRTF] Digit square root function. \item[IPLRRI] Integral polynomial list real root isolation. \item[IPRCH] Integral polynomial real root calculation, high precision. \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCN1] Integral polynomial real root calculation, 1 root. \item[IPRCNP] Integral polynomial real root calculation, Newton method preparation. \item[IPRICL] Integral polynomial real root isolation, Collins-Loos algorithm. \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPRRII] Integral polynomial real root isolation induction. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRRI] Integral polynomial relative real root isolation. \item[IPRRS] Integral polynomial real root separation. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IROOT] Integer root. \item[ISQRT] Integer square root. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \end{description} \item[rosser] \ \ \begin{description} \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \end{description} \item[rotation] \ \ \begin{description} \item[LEROT] List element rotation. \end{description} \item[routine] \ \ \begin{description} \item[main] Default main routine. \end{description} \item[saclib] \ \ \begin{description} \item[BEGINSACLIB] Begin SACLIB. \item[ENDSACLIB] End saclib. \item[INFOSACLIB] Write out usage information for SACLIB. \item[STATSACLIB] Statistics of saclib. \end{description} \item[scalar] \ \ \begin{description} \item[VISPR] Vector of integers scalar product. \end{description} \item[search] \ \ \begin{description} \item[ILPDS] Integer large prime divisor search. \item[IMPDS] Integer medium prime divisor search. \item[LSRCH] List search. \item[VLSRCH] Variable list search. \end{description} \item[second] \ \ \begin{description} \item[IPFSD] Integral polynomial factorization, second derivative. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[SECOND] Second. \end{description} \item[segmentation] \ \ \begin{description} \item[ISEG] Integer segmentation. \end{description} \item[selfridge] \ \ \begin{description} \item[ISPT] Integer selfridge primality test. \end{description} \item[semi] \ \ \begin{description} \item[IUPSR] Integral univariate polynomial semi-remainder. \end{description} \item[separation] \ \ \begin{description} \item[AFPRLS] Algebraic number field polynomial real root list separation. \item[AFPRRS] Algebraic number field polynomial real root separation. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[IPRRLS] Integral polynomial real root list separation. \item[IPRRS] Integral polynomial real root separation. \end{description} \item[sequence] \ \ \begin{description} \item[IPRPRS] Integral polynomial reduced polynomial remainder sequence. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \end{description} \item[set] \ \ \begin{description} \item[CSFPAR] Characteristic set from partition. \item[CSINT] Characteristic set intersection. \item[CSSUB] Characteristic set subset. \item[CSUN] Characteristic set union. \item[GCASET] Garbage collected array set element. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[SDIFF] Set difference. \item[SEQUAL] Set equality. \item[SFCS] Set from characteristic set. \item[SFCS] Set from characteristic set. \item[SFIRST] Set first element. \item[SINTER] Set intersection. \item[SLELTI] Set list element. \item[SRED] Set reductum. \item[SUNION] Set union. \item[USDIFF] Unordered set difference. \item[USINT] Unordered set intersection. \item[USUN] Unordered set union. \end{description} \item[shifted] \ \ \begin{description} \item[ISSUM] Integer shifted sum. \end{description} \item[sign] \ \ \begin{description} \item[AFSIGN] Algebraic number field sign. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AMSIGN] Algebraic module sign. \item[AMSIGNIR] Algebraic module sign, interval refinement. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[IPSCPP] Integral polynomial sign, content, and primitive part. \item[IPSIGN] Integral polynomial sign. \item[ISIGNF] Integer sign function. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[RISIGN] Rational interval sign. \item[RNSIGN] Rational number sign. \item[RPBLGS] Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \item[SIGN] Sign. \end{description} \item[similar] \ \ \begin{description} \item[AMPSAFP] Algebraic module polynomial similar to algebraic field polynomial. \end{description} \item[similiar] \ \ \begin{description} \item[IPSRP] Integral polynomial similiar to rational polynomial. \end{description} \item[single] \ \ \begin{description} \item[FRLSM] Fermat residue list, single modulus. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[SFCCON] Single-precision floating-point complex conjugation. \item[SFCDIF] Single-precision floating-point complex difference. \item[SFCFR] Single-precision floating-point complex from real. \item[SFCIP] Single-precision floating-point complex, imaginary part. \item[SFCMSQ] Single-precision floating-point complex modulus squared. \item[SFCNEG] Single-precision floating-point complex negation. \item[SFCPR] Single-precision floating-point complex product. \item[SFCQ] Single-precision floating-point complex quotient. \item[SFCRP] Single-precision floating-point complex, real part. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFIFI] Single-precision floating-point interval from integer. \item[SFRABS] Single-precision floating-point real absolute value. \item[SFRDIF] Single-precision floating-point real difference. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRNEG] Single-precision floating-point real negation. \item[SFRPR] Single-precision floating-point real product. \item[SFRQ] Single-precision floating-point real quotient. \item[SFRSUM] Single-precision floating-point real sum. \end{description} \item[small] \ \ \begin{description} \item[ISPD] Integer small prime divisors. \end{description} \item[solution] \ \ \begin{description} \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \item[MIPISE] Modular integral polynomial mod ideal, solution of equation. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \end{description} \item[sort] \ \ \begin{description} \item[LBIBMS] List of BETA-integers bubble-merge sort. \item[LBIBS] List of BETA-integers bubble sort. \item[MICS] Matrix of integers column sort. \end{description} \item[space] \ \ \begin{description} \item[MMDNSB] Matrix of modular digits null-space basis. \end{description} \item[special] \ \ \begin{description} \item[IPRCHS] Integral polynomial real root calculation, high-precision special. \item[MUPFS] Modular univariate polynomial factorization, special. \item[PSDSV] Polynomial special decomposition, specified variable. \end{description} \item[specified] \ \ \begin{description} \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[PDEGSV] Polynomial degree, specified variable. \item[PSDSV] Polynomial special decomposition, specified variable. \end{description} \item[square] \ \ \begin{description} \item[DSQRTF] Digit square root function. \item[ISQRT] Integer square root. \end{description} \item[squared] \ \ \begin{description} \item[SFCMSQ] Single-precision floating-point complex modulus squared. \end{description} \item[squarefree] \ \ \begin{description} \item[AFUPGS] Algebraic number field polynomial greatest squarefree divisior. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[IPCSFB] Integral polynomial coarsest squarefree basis. \item[IPFSFB] Integral polynomial finest squarefree basis. \item[IPPGSD] Integral polynomial primitive greatest squarefree divisor. \item[IPSF] Integral polynomial squarefree factorization. \item[IPSFBA] Integral polynomial squarefree basis augmentation. \item[IPSFSD] Integral squarefree factorization, second derivative. \item[ISFPF] Integral squarefree polynomial factorization. \item[ISFPIR] Integral squarefree polynomial isolating interval refinement. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[ISPSFB] Integral squarefree polynomial squarefree basis. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \end{description} \item[standard] \ \ \begin{description} \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPSIFI] Integral polynomial standard isolating interval from isolating interval. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \end{description} \item[statistics] \ \ \begin{description} \item[STATSACLIB] Statistics of saclib. \end{description} \item[stream] \ \ \begin{description} \item[FILINE] Flush the input stream line. \end{description} \item[string] \ \ \begin{description} \item[LFS] List from String. \item[SWRITE] String write. \end{description} \item[strong] \ \ \begin{description} \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[strongly] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \end{description} \item[subresultant] \ \ \begin{description} \item[IPPSC] Integral polynomial principal subresultant coefficients. \item[IPSPRS] Integral polynomial subresultant polynomial remainder sequence. \item[MPSPRS] Modular polynomial subresultant polynomial remainder sequence. \end{description} \item[subroutine] \ \ \begin{description} \item[IPICS] Integral polynomial integer content subroutine. \item[MPUCS] Modular polynomial univariate content subroutine. \end{description} \item[subset] \ \ \begin{description} \item[CSSUB] Characteristic set subset. \end{description} \item[substitution] \ \ \begin{description} \item[IPGSUB] Integral polynomial general substitution. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPSUB] Integral polynomial substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \end{description} \item[suffix] \ \ \begin{description} \item[SUFFIX] Suffix. \end{description} \item[sum] \ \ \begin{description} \item[AFPSUM] Algebraic number field polynomial sum. \item[AFSUM] Algebraic number field element sum. \item[ANSUM] Algebraic number sum. \item[DMPSUM] Dense modular polynomial sum. \item[IBCPS] Integer binomial coefficient partial sum. \item[IPSUM] Integral polynomial sum. \item[IPSUMN] Integral polynomial sum norm. \item[ISSUM] Integer shifted sum. \item[ISUM] Integer sum. \item[MDSUM] Modular digit sum. \item[MIPSUM] Modular integral polynomial sum. \item[MISUM] Modular integer sum. \item[MPSUM] Modular polynomial sum. \item[RISUM] Rational interval sum. \item[RNSUM] Rational number sum. \item[RPSUM] Rational polynomial sum. \item[SFCSUM] Single-precision floating-point complex sum. \item[SFRLS] Single-precision floating-point real number lower sum. \item[SFRSUM] Single-precision floating-point real sum. \item[VISUM] Vector of integers sum. \end{description} \item[sumset] \ \ \begin{description} \item[PARTSS] Partition sumset. \end{description} \item[symmetric] \ \ \begin{description} \item[MIPFSM] Modular integral polynomial from symmetric modular. \item[SMFMI] Symmetric modular from modular integer. \item[SMFMIP] Symmetric modular from modular integral polynomial. \end{description} \item[system] \ \ \begin{description} \item[GCSI] Garbage collection, system independent. \item[LDSMKB] Linear diophantine system solution, modified Kannan and Bachem algorithm. \item[LDSSBR] Linear diophantine system solution, based on Rosser ideas. \item[SDR] System of distinct representatives. \end{description} \item[term] \ \ \begin{description} \item[DIPINS] Distributive polynomial, insert term. \item[IPTERMREAD] Integral polynomial term read. \item[RPTERMREAD] Rational polynomial term read. \end{description} \item[terminating] \ \ \begin{description} \item[IPEXPREADR] Integral polynomial expression read, remove terminating character. \end{description} \item[terms] \ \ \begin{description} \item[RNRED] Rational number reduction to lowest terms. \end{description} \item[test] \ \ \begin{description} \item[ISATOM] Test for atom. \item[ISGCA] Test for GCA handle. \item[ISLIST] Test for non-empty list. \item[ISNIL] Test for empty list. \item[ISOBJECT] Test for object. \item[ISPT] Integer selfridge primality test. \item[ISZERO] Test for zero. \item[MEMBER] Membership test. \item[PUNT] Polynomial univariate test. \end{description} \item[third] \ \ \begin{description} \item[THIRD] Third. \end{description} \item[time] \ \ \begin{description} \item[ACLOCK] Clock minus garbage collection time. \end{description} \item[trailing] \ \ \begin{description} \item[PTBCF] Polynomial trailing base coefficient. \end{description} \item[transformation] \ \ \begin{description} \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[IPBHT] Integral polynomial binary homothetic transformation. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPNT] Integral polynomial negative transformation. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPNT] Integral univariate polynomial negative transformation. \item[MINNCT] Matrix of integers, non-negative column transformation. \item[PRT] Polynomial reciprocal transformation. \item[RINT] Rational interval normalizing transformation. \item[VIUT] Vector of integers, unimodular transformation. \end{description} \item[translation] \ \ \begin{description} \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRAN] Integral polynomial translation. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \end{description} \item[transpose] \ \ \begin{description} \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \end{description} \item[truncated] \ \ \begin{description} \item[IPTPR] Integral polynomial truncated product. \item[IUPTPR] Integral univariate polynomial truncated product. \end{description} \item[truncation] \ \ \begin{description} \item[IPTRUN] Integral polynomial truncation. \item[ITRUNC] Integer truncation. \end{description} \item[unimodular] \ \ \begin{description} \item[VIUT] Vector of integers, unimodular transformation. \end{description} \item[union] \ \ \begin{description} \item[CSUN] Characteristic set union. \item[SUNION] Set union. \item[USUN] Unordered set union. \end{description} \item[unit] \ \ \begin{description} \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \end{description} \item[univariate] \ \ \begin{description} \item[AFUPBRI] Algebraic number field univariate polynomial basis real root isolation. \item[AFUPFAC] Algebraic number field univariate polynomial factorization. \item[AFUPGC] Algebraic number field univariate polynomial greatest common divisor and cofactors. \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AFUPMPR] Algebraic number field univariate polynomial minimal polynomial of a real root. \item[AFUPRB] Algebraic number field univariate polynomial root bound. \item[AFUPRICL] Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AFUPRII] Algebraic number field univariate polynomial real root isolation induction. \item[AFUPRL] Algebraic number field univariate polynomial, root of a linear polynomial. \item[AFUPRLS] Algebraic number field univariate polynomial real root list separation. \item[AFUPRRI] Algebraic number field univariate polynomial relative real root isolation. \item[AFUPRRS] Algebraic number field univariate polynomial real root separation. \item[AFUPSF] Algebraic number field univariate polynomial squarefree factorization. \item[AFUPSFN] Algebraic number field univariate polynomial squarefree norm. \item[AFUPSR] Algebraic number field univariate polynomial, sign at a rational point. \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AMUPBES] Algebraic module univariate polynomial, binary rational evaluation of sign. \item[AMUPBHT] Algebraic module univariate polynomial binary homothetic transformation. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPMPR] Algebraic module univariate polynomial minimal polynomial of a real root. \item[AMUPNT] Algebraic module univariate polynomial negative transformation. \item[AMUPRBH] Algebraic module univariate polynomial root bound and homothetic transformation. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \item[AMUPRLS] Algebraic module univariate polynomial real root list separation. \item[AMUPRRS] Algebraic module univariate polynomial real root separation. \item[AMUPSR] Algebraic module univariate polynomial, sign at a rational point. \item[AMUPTR] Algebraic module univariate polynomial translation. \item[AMUPTR1] Algebraic module univariate polynomial translation by 1. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[DMUPNR] Dense modular univariate polynomial natural remainder. \item[IUPBEI] Integral univariate polynomial binary rational evaluation, integer output. \item[IUPBES] Integral univariate polynomial binary rational evaluation of sign. \item[IUPBHT] Integral univariate polynomial binary homothetic transformation. \item[IUPBRE] Integral univariate polynomial binary rational evaluation. \item[IUPCHT] Integral univariate polynomial circle to half-plane transformation. \item[IUPFAC] Integral univariate polynomial factorization. \item[IUPFDS] Integral univariate polynomial factor degree set. \item[IUPIHT] Integral univariate polynomial integer homothetic transformation. \item[IUPIIR] Integral univariate polynomial isolating interval refinement. \item[IUPNT] Integral univariate polynomial negative transformation. \item[IUPQH] Integral univariate polynomial quadratic hensel lemma. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPQHL] Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. \item[IUPRB] Integral univariate polynomial root bound. \item[IUPRC] Integral univariate polynomial resultant and cofactor. \item[IUPRLP] Integral univariate polynomial, root of a linear polynomial. \item[IUPSR] Integral univariate polynomial semi-remainder. \item[IUPTPR] Integral univariate polynomial truncated product. \item[IUPTR] Integral univariate polynomial translation. \item[IUPTR1] Integral univariate polynomial translation by 1. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \item[IUPWRITE] Integral univariate polynomial write. \item[IUSFPF] Integral univariate squarefree polynomial factorization. \item[MIUPQR] Modular integral univariate polynomial quotient and remainder. \item[MIUPSE] Modular integral univariate polynomial, solution of equation. \item[MPUC] Modular polynomial univariate content. \item[MPUCPP] Modular polynomial univariate content and primitive part. \item[MPUCS] Modular polynomial univariate content subroutine. \item[MPUP] Modular polynomial univariate product. \item[MPUPP] Modular polynomial univariate primitive part. \item[MPUQ] Modular polynomial univariate quotient. \item[MUPBQP] Modular univariate polynomial berlekamp Q polynomials construction. \item[MUPDDF] Modular univariate polynomial distinct degree factorization. \item[MUPDER] Modular univariate polynomial derivative. \item[MUPEGC] Modular univariate polynomial extended greatest common divisor. \item[MUPFBL] Modular univariate polynomial factorization-berlekamp algorithm. \item[MUPFS] Modular univariate polynomial factorization, special. \item[MUPGCD] Modular univariate polynomial greatest common divisor. \item[MUPHEG] Modular univariate polynomial half-extended greatest common divisor. \item[MUPRAN] Modular univariate polynomial, random. \item[MUPRC] Modular univariate polynomial resultant and cofactor. \item[MUPRES] Modular univariate polynomial resultant. \item[MUPSFF] Modular univariate polynomial squarefree factorization. \item[PUFP] Polynomial, univariate, from polynomial. \item[PUNT] Polynomial univariate test. \item[RUPWRITE] Rational univariate polynomial write. \end{description} \item[unordered] \ \ \begin{description} \item[USDIFF] Unordered set difference. \item[USINT] Unordered set intersection. \item[USUN] Unordered set union. \end{description} \item[usage] \ \ \begin{description} \item[INFOSACLIB] Write out usage information for SACLIB. \end{description} \item[uspensky] \ \ \begin{description} \item[IPRIM] Integral polynomial real root isolation, modified Uspensky method. \item[IPRIMO] Integral polynomial real root isolation, modified Uspensky method, open interval. \item[IPRIMS] Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[IPRIMU] Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[IPSRM] Integral polynomial strong real root isolation, modified Uspensky method. \item[IPSRMS] Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[value] \ \ \begin{description} \item[ABS] Absolute value. \item[IABSF] Integer absolute value function. \item[IPABS] Integral polynomial absolute value. \item[RNABS] Rational number absolute value. \item[SFRABS] Single-precision floating-point real absolute value. \end{description} \item[variable] \ \ \begin{description} \item[AFPCMV] Algebraic number field polynomial composition in main variable. \item[AFPDMV] Algebraic number field polynomial derivative, main variable. \item[AFPEMV] Algebraic number field polynomial evaluation of main variable. \item[AMPDMV] Algebraic module polynomial derivative, main variable. \item[GCGLOBAL] Declare a global variable to the Garbage Collector. \item[IPBEILV] Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[IPBHTLV] Integral polynomial binary homothetic transformation, leading variable. \item[IPBHTMV] Integral polynomial binary homothetic transformation, main variable. \item[IPDMV] Integral polynomial derivative, main variable. \item[IPEMV] Integral polynomial evaluation of main variable. \item[IPHDMV] Integral polynomial higher derivative, main variable. \item[IPSMV] Integral polynomial substitution for main variable. \item[IPTR] Integral polynomial translation, specified variable. \item[IPTR1] Integral polynomial translation by one, specified variable. \item[IPTR1LV] Integral polynomial translation by one, leading variable. \item[IPTRLV] Integral polynomial translation, leading variable. \item[IPTRMV] Integral polynomial translation, main variable. \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \item[MPEMV] Modular polynomial evaluation of main variable. \item[MPIQHS] Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[PDEGSV] Polynomial degree, specified variable. \item[PDPV] Polynomial division by power of variable. \item[PMPMV] Polynomial multiplication by power of main variable. \item[PSDSV] Polynomial special decomposition, specified variable. \item[RPDMV] Rational polynomial derivative, main variable. \item[RPEMV] Rational polynomial evaluation, main variable. \item[RPIMV] Rational polynomial integration, main variable. \item[VLREAD] Variable list read. \item[VLSRCH] Variable list search. \item[VLWRITE] Variable list write. \item[VREAD] Variable read. \item[VWRITE] Variable write. \end{description} \item[variables] \ \ \begin{description} \item[PCONST] Polynomial constant. PCPV Polynomial cyclic permutation of variables. \item[PFDP] Polynomial from dense polynomial. PICPV Polynomial inverse cyclic permutation of variables. \item[PINV] Polynomial introduction of new variables. \item[PPERMV] Polynomial permutation of variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \item[PTMV] Polynomial transpose main variables. PTV Polynomial transpose variables. \end{description} \item[variation] \ \ \begin{description} \item[AFUPRICS] Algebraic univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICS] Algebraic module univariate polynomial real root isolation, coefficient sign variation method. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[AMUPRINCS] Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. \end{description} \item[variations] \ \ \begin{description} \item[AFUPVAR] Algebraic number field univariate polynomial variations. \item[AMUPVARIR] Algebraic module univariate polynomial variations, interval refinement. \item[IPVCHT] Integral polynomial variations after circle to half-plane transformation. \item[IUPVAR] Integral univariate polynomial variations. \item[IUPVOI] Integral univariate polynomial, variations for open interval. \item[IUPVSI] Integral univariate polynomial, variations for standard interval. \end{description} \item[vector] \ \ \begin{description} \item[DVCMP] Degree vector comparison. \item[PDEGV] Polynomial degree vector. \item[VCOMP] Vector comparison. \item[VIAZ] Vector of integers, adjoin zeros. \item[VIDIF] Vector of integers difference. \item[VIERED] Vector of integers, element reduction. \item[VILCOM] Vector of integers linear combination. \item[VINEG] Vector of integers negation. \item[VISPR] Vector of integers scalar product. \item[VISUM] Vector of integers sum. \item[VIUT] Vector of integers, unimodular transformation. \item[VMAX] Vector maximum. \item[VMIN] Vector minimum. \item[VMPIP] Vector of modular polynomial inner product. \end{description} \item[weakly] \ \ \begin{description} \item[AFUPIIWS] Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPIIWS] Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. \item[AMUPRICSW] Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. \item[IPIIWS] Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[IPRIMW] Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \end{description} \item[with] \ \ \begin{description} \item[MCPMV] Matrix of coefficients of polynomials, with respect to main variable. \end{description} \item[write] \ \ \begin{description} \item[AFDWRITE] Algebraic number field, decimal write. \item[AFPWRITE] Algebraic number field polynomial write. \item[AFUPWRITE] Algebraic number field univariate polynomial write. \item[AFWRITE] Algebraic field element write. \item[ANDWRITE] Algebraic number decimal write. \item[AWRITE] Atom write. \item[CWRITE] Character write. \item[DIIPWRITE] Distributive integral polynomial write. \item[DIRPWRITE] Distributive rational polynomial write. \item[GWRITE] Gamma-integer write. \item[ILWRITE] Integer list write. \item[INFOSACLIB] Write out usage information for SACLIB. \item[IPDWRITE] Integral Polynomial Distributive Write. \item[IPWRITE] Integral polynomial write. \item[IUPWRITE] Integral univariate polynomial write. \item[IWRITE] Integer write. \item[LWRITE] List write. \item[OWRITE] Object write. \item[RNDWRITE] Rational number decimal write. \item[RNWRITE] Rational number write. \item[RPDWRITE] Rational Polynomial Distributive Write. \item[RPWRITE] Rational polynomial write. \item[RUPWRITE] Rational univariate polynomial write. \item[SWRITE] String write. \item[VLWRITE] Variable list write. \item[VWRITE] Variable write. \end{description} \item[zero] \ \ \begin{description} \item[ISZERO] Test for zero. \end{description} \item[zeros] \ \ \begin{description} \item[VIAZ] Vector of integers, adjoin zeros. \end{description} \item[[algebraic] \ \ \begin{description} \item[ANPEDE] [Algebraic number primitive element for a double extension. \end{description} \end{description} saclib2.2.8/doc/user_guide/cNIWsCGV.tex0000664002275300236100000001725514017255270016727 0ustar wcbrownscsThis section lists \saclib\ types, constants, and global variables. All types and constants are defined in ``saclib.h'', ``sactypes.h'', and ``sacsys.h''. External variables are defined in ``external.c'' and declared as {\tt external} in ``saclib.h''. The average user of \saclib\ functions should not find it neccessary to deal directly with any of these values (except for \Word, \BETA, and \NIL, which are also mentioned in other sections). If you modify any of the values listed below without knowing what you are doing, you may either crash \saclib\ or cause it to produce false results, so please take care! \medskip \noindent{\em Notation:} In the description below, {\em pointer} means a C pointer (i.e.\ an actual memory address) and {\em pointer to an array} means a C pointer to the first element of an array. {\em List handle} means a \saclib\ list handle (i.e.\ an integer \ttL\ with $\BETA \leq \ttL < \BETAp$ which is used as an index into the \SPACEB\ and \SPACEBone\ arrays), and {\em GCA handle} means a handle for a garbage collected array (i.e.\ an integer \ttA\ with $\BETAp \leq \ttA < \BETApp$ which is used as an index into the \GCASPACEBp\ array). {\em Cell} means a \saclib\ list cell (i.e.\ two consecutive \Word s in the \SPACE\ array, the first one of which has an odd index) and {\em GCA cell} means a \GCArray\ structure in the \GCASPACE\ array. \medskip In \saclib\ only two low-level data structures are typechecked by the C compiler\footnote{Lists, integers, polynomials, etc.\ are structures which are built at runtime. For these no type checking is done so that the programmer has to make sure that there are no conflicts.}. These two typedefs are: \begin{itemize} \item \Word\ \ldots\ the basic type which in most installations of \saclib\ will be the same as a C {\tt int}. \Word\ is defined in ``sysdep.h''. \item \GCArray\ \ldots\ a {\tt struct} containing information on garbage collected arrays. This is a \saclib\ internal data structure defined in ``sactypes.h''. \end{itemize} The following constants are defined in ``sacsys.h'' except for \NIL, which is defined in ``saclib.h'': \begin{itemize} \item \BETA\index{\BETA}\ \ldots\ a \Word, the value used to distinguish between atoms and lists. This is also the base for the internal representation of large integers. \BETA\ must be a power of $2$ such that $2^8 \leq \BETA$ and $3 * \BETA$ fits into a \Word. In most implementations where a \Word\ is a standard C {\tt int} with $n$ bits, the setting is $\BETA = 2^{n-3}$. \item \BETAone\ \ldots\ a \Word, $\BETAone = \BETA - 1$. \item \NIL\index{\NIL}\ \ldots\ a \Word, the empty list handle\footnote{ This is equal to \BETA. For historical reasons, in some \saclib\ functions \BETA\ is explicitly used instead of \NIL. }. \item {\tt NU\_, NUp\_, NPRIME\_, NSMPRM\_, NPFDS\_, RHO\_, NPTR1\_}\ \ldots\ \Word s, the initial values for the corresponding global variables. \end{itemize} The following flags are defined in ``saclib.h'': \begin{itemize} \item {\tt GC\_CHECK / GC\_NO\_CHECK}\ \ldots\ \Word s, used for telling the garbage collector whether an array allocated by {\tt GCAMALLOC()} will contain list or GCA handles (and thus cannot be ignored in the mark phase). \item {\tt SAC\_KEEPMEM / SAC\_FREEMEM}\ \ldots\ \Word s, used when calling {\tt ENDSACLIB()} directly for requesting memory allocated by {\tt GCAMALLOC()} to be kept / deallocated. \end{itemize} Below we give a list of the \saclib\ global variables as defined in ``external.c'': \begin{description} \item[List processing and garbage collection:] \ \ \begin{itemize} \item \AVAIL\ \ldots\ a \Word, the list handle of the free list. \item \GCGLOBALS\ \ldots\ a \Word, the list handle of the list of global variables. \item {\tt BACSTACK}\ \ldots\ a pointer to the beginning of the system stack. \item {\tt GCC}\ \ldots\ a \Word, the number of garbage collections. \item {\tt GCAC}\ \ldots\ a \Word, the number of GCA cells collected in all garbage collections. \item {\tt GCCC}\ \ldots\ a \Word, the number of cells collected in all garbage collections. \item {\tt GCM}\ \ldots\ a \Word, if {\tt GCM} is 1, a message is written to the output stream each time the garbage collector is called. \item \NU\ \ldots\ a \Word, one less than the size of the \SPACE\ array in \Word s, i.e.\ twice the number of cells in \SPACE. \item \RHO\ \ldots\ a \Word, the garbage collector aborts the program if no more than $\NU/\RHO$ cells were reclaimed. \item \SPACEB \ \ldots\ a pointer to an array of words, $\SPACEB = \SPACE - \BETA$. \item \SPACEBone \ \ldots\ a pointer to an array of words, $\SPACEBone = \SPACE - \BETAone$. \item \GCAAVAIL \ \ldots\ a \Word, the GCA handle of the free list of GCA cells. \item \GCASPACE \ \ldots\ a pointer to an array of \GCArray\ structures, the memory space for GCA cells. \item \GCASPACEBp \ \ldots\ a pointer to an array of \GCArray\ structures, $\GCASPACEBp = \GCASPACE - \BETAp$. \item \NUp \ \ldots\ a \Word, one less than the number of \GCArray\ structures in the \GCASPACE\ array. \item \BETAp \ \ldots\ a \Word, the bound used to distinguish between list and GCA handles. $\BETAp = \BETA + \NU + 1$. \item \BETApp \ \ldots\ a \Word, the upper bound on GCA GCA handles. $\BETApp = \BETAp + \NUp + 1$. \end{itemize} \item[Timing:] \ \ \begin{itemize} \item {\tt TAU}\ \ldots\ a \Word, the time (in milliseconds) spent for garbage collections. \item {\tt TAU0}\ \ldots\ a \Word, the system time (in milliseconds) just before \saclib\ initialization. \item {\tt TAU1}\ \ldots\ a \Word, the system time (in milliseconds) immediately after \saclib\ initialization. \end{itemize} \item[Integer arithmetic:] \ \ \begin{itemize} \item {\tt DELTA}\ \ldots\ a \Word, ${\tt DELTA} = 2^{\lfloor{\textstyle {\tt ZETA}/2}\rfloor}$. \item {\tt EPSIL}\ \ldots\ a \Word, ${\tt EPSIL} = 2^{\lceil{\textstyle {\tt ZETA}/2}\rceil} = \BETA/{\tt DELTA}$. \item {\tt ETA}\ \ldots\ a \Word, ${\tt ETA} = \lfloor\log_{10} \BETA \rfloor$. \item {\tt RINC}\ \ldots\ a \Word, the increment for the random number generator. \item {\tt RMULT}\ \ldots\ a \Word, the multiplier for the random number generator. \item {\tt RTERM}\ \ldots\ a \Word, the last value produced by the random number generator. \item {\tt TABP2}\ \ldots\ a pointer to an array of \Word s, ${\tt TABP2}[i] = 2^{i-1}$ for $1 \leq i \leq {\tt ZETA}$. \item {\tt THETA}\ \ldots\ a \Word, ${\tt THETA} = 10^{\tt ETA}$. \item {\tt UZ210}\ \ldots\ a \Word, the list handle of the list of units of ${\bf Z}_{210}$. \item {\tt ZETA}\ \ldots\ a \Word, ${\tt ZETA} = \log_2 {\tt BETA}$. \end{itemize} \item[Prime numbers:] \ \ \begin{itemize} \item {\tt NPFDS}\ \ldots\ a \Word, the number of primes used by the \saclib\ function {\tt IUPFDS}. \item {\tt NPRIME}\ \ldots\ a \Word\ controlling the number of primes in {\tt PRIME}. \item {\tt PRIME}\ \ldots\ a \Word, the list handle of the list of primes between $\BETA - {\tt NPRIME} * {\tt ZETA} * 7 / 5$ and \BETA. \item {\tt NSMPRM}\ \ldots\ a \Word, the upper bound on the size of primes in {\tt SMPRM}. \item {\tt SMPRM}\ \ldots\ a \Word, the list handle of the list of primes $< {\tt NSMPRM}$. \end{itemize} \item[Miscellaneous:] \ \ \begin{itemize} \item {\tt NPTR1}\ \ldots\ a \Word, the number of \Word s in the {\tt GCAPTR1} array. \item {\tt GCAPTR1}\ \ldots\ a \Word, the GCA handle of the array used by the function {\tt IUPTR1}. \end{itemize} \item[Input/Output:] \ \ \begin{itemize} \item {\tt LASTCHAR}\ \ldots\ a \Word, the last character read from the input stream. \end{itemize} \end{description} saclib2.2.8/doc/user_guide/cRRC.tex0000664002275300236100000002435414017255270016173 0ustar wcbrownscs\section{Mathematical Preliminaries} Let $A(x)$ be a univariate polynomial with integer coefficients. % A real number $x_0$ with $A(x_0) = 0$ is called a {\em real root} of $A(x)$. % A real number $x_0$ is a root of $A(x)$ if and only if $A(x)$ is divisible by $(x-x_0)$, i.e. if there is a polynomial $B(x)$ with real coefficients such that $A(x) = (x-x_0)B(x)$. % For any real root $x_0$ of $A(x)$ there is a natural number $k$ such that $A(x)$ is divisible by $(x-x_0)^k$ but not by $(x-x_0)^{k+1}$. % This number $k$ is called the {\em multiplicity} of the root $x_0$ of $A(x)$. % Roots of multiplicity 1 are called {\em simple roots}. % An interval $I$ containing $x_0$ but no other real root of $A(x)$, is called an {\em isolating interval} for $x_0$. % For example, if $A(x) = x^2 - 2$, the interval $(-2,2)$ is not an isolating interval for a real root of $A(x)$, but $(0,1000)$ is. \section{Purpose} The \saclib\ real root calculation package solves non-linear equations in one variable: % It computes isolating intervals for the real roots of univariate integral polynomials along with the multiplicity of each root, and it refines the isolating intervals to any specified size. \section{Methods and Algorithms} For root isolation three methods are available. % The {\em coefficient sign variation method} (or: {\em modified Uspensky method}), is based on Descartes' rule of signs. % The {\em Collins-Loos method} is based on Rolle's theorem. % {\em Sturm's method} is based on Sturm sequences. Generally, the coefficient sign variation method is many times faster than the other two methods. For the coefficient sign variation method various main programs are provided to accommodate details of input and output specifications. For the refinement of isolating intervals to any specified precision a symbolic version of Newton's method is used. Given an arbitrary integral polynomial {\tt IPRCH} will calculate all its real roots to specified accuracy. % The multiplicity of each root is also computed. % The algorithm uses the coefficient sign variation method to isolate the roots from each other and then applies Newton's method to refine the isolating intervals to the desired width. Given a squarefree integral polynomial {\tt IPRIM} isolates all the real roots from each other. The roots inside a specified open interval are isolated by {\tt IPRIMO}. Both {\tt IPRIM} and {\tt IPRIMO} use the coefficient sign variation method. Other main algorithms which use this method are {\tt IPRIMS} and {\tt IPRIMW}. The Collins-Loos method is implemented in {\tt IPRICL}: % Given an arbitrary univariate integral polynomial {\tt IPRICL} produces a list of isolating intervals for its real roots. % These intervals have the additional property that the first derivative of $A$ is monotone on each of them. An implementation of Sturm's method is provided by {\tt IPRIST}: Given a squarefree univariate integral polynomial {\tt IPRIST} produces a list of isolating intervals for its real roots. Roots of different polynomials can be isolated from each other using the program {\tt IPLRRI}. Reference: %\begin{thebibliography}{99} % %\bibitem{JJ} Jeremy R.\ Johnson: {\it Algorithms for polynomial real root isolation}. Technical Research Report OSU-CISRC-8/91-TR21, 1991. The Ohio State University, 2036 Neil Avenue Mall, Columbus, Ohio 43210, Phone: 614-292-5813. % %\end{thebibliography} \section{Definitions of Terms} \begin{description} \item[binary rational number]\index{binary rational number} A rational number whose denominator is a power of 2. \item[interval]\index{interval} A list $I=(a,b)$ of rational numbers $a \leq b$. If $a = b$ the interval is called a one-point interval and it designates the set consisting of the number $a$. If $a < b$ it is not evident from the representation whether the endpoints are thought to be part of $I$ or not. Therefore the specifications of the algorithms have to state whether a particular interval is meant to be an open interval, a left-open and right closed interval, a left-closed and right open interval or a closed interval. \item[standard interval]\index{standard interval}\index{interval!standard} An interval whose endpoints are binary rational numbers $a$, $b$ such that $a = m / 2^k$, $b = (m+1) / 2^k$, $k$ and $m$ being positive or negative integers, or zero. \item[(weakly) isolating interval]\index{interval!isolating}\index{interval!isolating!weakly} An interval $I$ is called a (weakly) isolating interval for a simple real root $\alpha$ of the polynomial $A$ if $I$ contains $\alpha$ but no other root of $A$. \item[strongly isolating interval]\index{interval!isolating!strongly} An isolating interval for a root $\alpha$ of a polynomial $A$ is said to be strongly isolating, if the closure of $I$ is also an isolating interval for $\alpha$. \item[disjoint intervals]\index{disjoint intervals}\index{intervals!disjoint} Intervals are called disjoint if the sets they designate are disjoint. \item[strongly disjoint intervals]\index{intervals!disjoint!strongly} Disjoint intervals are called strongly disjoint if their closures are disjoint. \item[inflectionless isolating interval]\index{inflectionless isolating interval}\index{interval!isolating!inflectionless} An interval I with binary rational endpoints which is an isolating interval for a real root $x_0$ of $A(x)$ is called inflectionless if the derivative $A'(x)$ is monotone in $I$, i.e. if $A''(x)$ does not have a root in $I$ except possibly $x_0$. \item[inflectionless isolation list]\index{inflectionless isolation list} A list of inflectionless isolating intervals. \end{description} \section{Functions} \begin{description} \item[High Precision Calculation] \ \ \begin{description} \item[{\tt L <- IPRCH(A,I,k) }]\index{IPRCH} Integral polynomial real root calculation, high precision. Input: any polynomial. Output: all roots or all roots in an interval. \item[{\tt L <- IPRCHS(A,I,k) }]\index{IPRCHS} Integral polynomial real root calculation, high-precision special. Input: polynomial which does not have common roots with its first or second derivative. Output: all roots or all roots in an interval. \item[{\tt IPRCNP(A,I; sp,spp,J) }]\index{IPRCNP} Integral polynomial real root calculation, Newton method preparation. \item[{\tt J <- IPRCN1(A,I,s,k) }]\index{IPRCN1} Integral polynomial real root calculation, 1 root. \end{description} \item[Coefficient Sign Variation Method] \ \ \begin{description} \item[{\tt L <- IPRIM(A) }]\index{IPRIM} Integral polynomial real root isolation, modified Uspensky method. \item[{\tt L <- IPRIMO(A,Ap,I) }]\index{IPRIMO} Integral polynomial real root isolation, modified Uspensky method, open interval. \item[{\tt L <- IPRIMS(A,Ap,I) }]\index{IPRIMS} Integral polynomial real root isolation, modified Uspensky method, standard interval. \item[{\tt L <- IPRIMU(A) }]\index{IPRIMU} Integral polynomial real root isolation, modified Uspensky method, unit interval. \item[{\tt L <- IPRIMW(A) }]\index{IPRIMW} Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. \item[{\tt L <- IPSRM(A,I) }]\index{IPSRM} Integral polynomial strong real root isolation, modified Uspensky method. Input: an integral polynomial without multiple roots and no roots in common with its second derivative. Output: an inflectionless isolation list for all roots or all roots in an interval. \item[{\tt L <- IPSRMS(A,I) }]\index{IPSRMS} Integral polynomial strong real root isolation, modified Uspensky method, standard interval. \end{description} \item[Rolle's Theorem] \ \ \begin{description} \item[{\tt L <- IPRICL(A) }]\index{IPRICL} Integral polynomial real root isolation, Collins-Loos algorithm. \end{description} \item[Sturm's method] \ \ \begin{description} \item[{\tt IPRIST}]\index{IPRIST} Integral polynomial real root isolation using a Sturm sequence. \end{description} \item[Special] \ \ \begin{description} \item[{\tt r <- IUPRLP(A) }]\index{IUPRLP} Integral univariate polynomial, root of a linear polynomial. \item[{\tt b <- IUPRB(A) }]\index{IUPRB} Integral univariate polynomial root bound. Input: a univariate integral polynomial $A$. Output: a binary rational number, power of 2, which is greater than the absolute value of any root of $A$. \item[{\tt M <- IPLRRI(L) }]\index{IPLRRI} Integral polynomial list real root isolation. Input: a list of integral polynomials without multiple roots and without common roots. Output: a list of strongly disjoint isolating intervals in ascending order for all the roots of all the input polynomials -- each interval is listed with the polynomial of which it isolates a root. \item[{\tt Is <- IUPIIR(A,I) }]\index{IUPIIR} Integral univariate polynomial isolating interval refinement. \end{description} \item[Low-Level Functions] \ \ \begin{description} \item[{\tt IPRRS(A1,A2,I1,I2; Is1,Is2,s) }]\index{IPRRS} Integral polynomial real root separation. \item[{\tt IPRRLS(A1,A2,L1,L2; Ls1,Ls2) }]\index{IPRRLS} Integral polynomial real root list separation. \item[{\tt L <- IPRRII(A,Ap,d,Lp) }]\index{IPRRII} Integral polynomial real root isolation induction. \item[{\tt Is <- IPRRRI(A,B,I,s1,t1) }]\index{IPRRRI} Integral polynomial relative real root isolation. \item[{\tt J <- IPSIFI(A,I) }]\index{IPSIFI} Integral polynomial standard isolating interval from isolating interval. \item[{\tt IPIIWS(A,L) }]\index{IPIIWS} Integral polynomial isolating intervals weakly disjoint to strongly disjoint. \item[{\tt IPPNPRS}]\index{IPPNPRS} Integral polynomial primitive negative polynomial remainder sequence. \item[{\tt k <- IPVCHT(A) }]\index{IPVCHT} Integral polynomial variations after circle to half-plane transformation. \item[{\tt B <- IUPCHT(A) }]\index{IUPCHT} Integral univariate polynomial circle to half-plane transformation. \item[{\tt n <- IUPVAR(A) }]\index{IUPVAR} Integral univariate polynomial variations. \item[{\tt v <- IUPVOI(A,I) }]\index{IUPVOI} Integral univariate polynomial, variations for open interval. \item[{\tt v <- IUPVSI(A,I) }]\index{IUPVSI} Integral univariate polynomial, variations for standard interval. \end{description} \end{description} saclib2.2.8/doc/user_guide/cPF.tex0000664002275300236100000001627114017255270016051 0ustar wcbrownscs\section{Mathematical Preliminaries} A non-constant polynomial $A(x_1,\ldots,x_r)$ in $R[x_1,\ldots,x_r]$, where $R$ is a unique factorization domain, is said to be {\em irreducible} if $A$ cannot be expressed as the product of two non-constant polynomials in $R[x_1,\ldots,x_r]$. % The problem of factoring a polynomial $A(x_1,\ldots,x_r)$ is that of finding distinct irreducible polynomials $A_i(x_1,\ldots,x_r)$ and integers $e_i$, $i = 1,\ldots,k$, such that $A = A_1^{e_1}\cdots A_k^{e_k}$. % Such an expression is called a {\em complete factorization}\index{factorization!complete} of $A$. % The polynomials $A_i$ are called the {\em irreducible factors} of $A$ and the integer $e_i$ is called the {\em multiplicity} of $A_i$. \section{Purpose} The \saclib\ polynomial factorization package provides factorization algorithms for $R = \BbbZ_p$, $p$ a single-precision prime and $r = 1$, and for $R = \BbbZ$ for $r \geq 1$. For $R = \BbbZ$ one obtains the sign, integer content and positive primitive irreducible factors of $A$, as well as the multiplicity of each irreducible factor. The integer content is not factored. For $R = \BbbZ_p$ the irreducible factors obtained are monic. \section{Methods and Algorithms} To factor an arbitrary univariate polynomial modulo a prime, one should first obtain a similar monic polynomial by using the algorithm {\tt MPMON}. Having done this, one then computes the squarefree factors of the monic polynomial by using the algorithm {\tt MUPSFF}. In order to factor each squarefree factor one would use {\tt MUPFBL}, which implements Berlekamp's algorithm. The irreducible factors returned by {\tt MUPFBL} are monic. For factoring a univariate integral polynomial, {\tt IUPFAC} first computes the squarefree factorization using the algorithm {\tt IPSF}. The squarefree factors are in turn factored using {\tt IUSFPF} which first computes a factorization modulo a prime and the modular factors thus obtained are then lifted by the quadratic version of the Hensel construction. {\tt IUPFAC} returns the sign, the integer content and a list of irreducible factors, with multiplicities, of the input polynomial. The irreducible factors returned by {\tt IUPFAC} are positive and primitive. Multivariate integral polynomials are factored by using {\tt IPFAC}. This algorithm first computes the content as well as the squarefree factors of the primitive part of the input polynomial and subsequently factors each of these separately. The factorization of a squarefree primitive polynomial is performed by the algorithm {\tt ISFPF} which implements a multivariate lifting technique based on the Hensel lemma. The lifting is done one variable at a time as opposed to lifting several variables simultaneously. If the polynomial $A$ to be factored has rational base coefficients then it must first be converted to an integral polynomial by multiplying $A$ by the least common multiple of the denominators of the base coefficients and then converting the polynomial thus obtained to integral representation. This can be achieved by using {\tt IPSRP} which computes the primitive and positive integral polynomial $A^{\prime}$ as well as the rational number $a$ such that $A = a A^{\prime}$. \section{Functions} \begin{description} \item[Factorization:] \ \ \begin{description} \item[{\tt IPFAC(r,A; s,c,L) }]\index{IPFAC} Integral polynomial factorization. {\em Factors $r$-variate polynomials over $\BbbZ$.} \item[{\tt IUPFAC(A; s,c,L) }]\index{IUPFAC} Integral univariate polynomial factorization. {\em Factors univariate polynomials over $\BbbZ$.} \item[{\tt L <- MUPFBL(p,A) }]\index{MUPFBL} Modular univariate polynomial factorization-Berlekamp algorithm. {\em Factors monic squarefree univariate polynomials over $\BbbZ_p$.} \end{description} % factorization \item[Auxiliary Functions for Factorization:] \ \ \begin{description} \item[{\tt IPCEVP(r,A; B,L) }]\index{IPCEVP} Integral polynomial, choice of evaluation points. {\em Given an integral polynomial $A$ that is squarefree in its main variable, computes integers that, when substituted for the minor variables, maintain the degree of $A$ in the main variable and its squarefreeness.} \item[{\tt b <- IPFCB(V) }]\index{IPFCB} Integral polynomial factor coefficient bound. {\em Given the degree vector of an integral polynomial $A$, computes an integer $b$ such the product of the infinity norms of any divisors of $A$ is less than or equal to $2^b$ times the infinity norm of $A$.} \item[{\tt Lp <- IPFLC(r,M,I,A,L,D) }]\index{IPFLC} Integral polynomial factor list combine. \item[{\tt B <- IPFSFB(r,A) }]\index{IPFSFB} Integral polynomial finest squarefree basis. \item[{\tt a <- IPGFCB(r,A) }]\index{IPGFCB} Integral polynomial Gelfond factor coefficient bound. \item[{\tt IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C; A,B) }]\index{IPIQH} Integral polynomial mod ideal quadratic Hensel lemma. \item[{\tt L <- ISFPF(r,A) }]\index{ISFPF} Integral squarefree polynomial factorization. {\em Given a positive, primitive integral polynomial $A$ that is squarefree with respect to the main variable, computes a list of the distinct positive irreducible factors of $A$.} \item[{\tt IUPFDS(A; p,F,C) }]\index{IUPFDS} Integral univariate polynomial factor degree set. \item[{\tt IUPQH(p,Ab,Bb,Sb,Tb,M,C; A,B) }]\index{IUPQH} Integral univariate polynomial quadratic Hensel lemma. \item[{\tt Fp <- IUPQHL(p,F,M,C) }]\index{IUPQHL} Integral univariate polynomial quadratic Hensel lemma, list. \item[{\tt L <- IUSFPF(A) }]\index{IUSFPF} Integral univariate squarefree polynomial factorization. {\em Given a univariate, positive, primitive, squarefree integral polynomial $A$, computes a list of the positive irreducible factors of $A$.} \item[{\tt M <- MCPMV(n,L) }]\index{MCPMV} Matrix of coefficients of polynomials, with respect to main variable. \item[{\tt MIPISE(r,M,D,A,B,S,T,C; U,V) }]\index{MIPISE} Modular integral polynomial mod ideal, solution of equation. \item[{\tt MIUPSE(M,A,B,S,T,C; U,V) }]\index{MIUPSE} Modular integral univariate polynomial, solution of equation. \item[{\tt MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C; A,B) }]\index{MPIQH} Modular polynomial mod ideal, quadratic Hensel lemma. \item[{\tt Fp <- MPIQHL(r,p,F,M,D,C) }]\index{MPIQHL} Modular polynomial mod ideal, quadratic Hensel lemma, list. \item[{\tt MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C; A,B,S,T,Dp) }]\index{MPIQHS} Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. \item[{\tt Q <- MUPBQP(p,A) }]\index{MUPBQP} Modular univariate polynomial Berlekamp Q-polynomials construction. \item[{\tt L <- MUPDDF(p,A) }]\index{MUPDDF} Modular polynomial distinct degree factorization. {\em Given a monic, squarefree polynomial $A$ over $R = \BbbZ_p$, computes a list $((n_1,A_1)$, $\ldots$, $(n_k,A_k))$, where the $n_i$ are positive integers with $n_1 < \cdots < n_k$ and each $A_i$ is the product of all monic irreducible factors of $A$ of degree $n_i$.} \item[{\tt L <- MUPFS(p,A,B,d) }]\index{MUPFS} Modular univariate polynomial factorization, special. \end{description} % auxiliary functions \end{description} % programs saclib2.2.8/doc/user_guide/cNIWsGC.tex0000664002275300236100000001350414017255270016572 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Implementation of Lists} When \saclib\ is initialised, the array \SPACE\ containing $\NU+1$ \Word s is allocated from the heap. This array is used as the memory space for list processing. Lists are built from {\em cells}, which are pairs of consecutive \Word s the first of which is at an odd position in the \SPACE\ array. {\em List handles} (``pointers'' to lists) are defined to be \BETA\ plus the index of the first cell of the list in the \SPACE\ array with the handle of the empty list being \NIL\ (which is equal to \BETA). Figure \ref{f:SPACE} shows the structure of the \SPACE\ array. \begin{figure}[htb] \input{fSPACE.tex} \caption{The \SPACE\ array.} \label{f:SPACE} \end{figure} The first \Word\ of each cell is used to store the handle of the next cell in the list (i.e.\ the value returned by {\tt RED()}), while the second \Word\ contains the data of the list element represented by the cell (i.e.\ the value returned by {\tt FIRST()}). Figure \ref{f:LIST} gives a graphical representation of the cell structure for a sample list. The arrows stand for list handles. \begin{figure}[htb] \input{fLIST.tex} \caption{The cell structure of the list $\ttL = (1,(9,6),8)$.} \label{f:LIST} \end{figure} As already mentioned in Chapter \ref{c:LP}, atoms are required to be integers $a$ with $-\BETA < a < \BETA$. This allows the garbage collector and other functions operating on objects to decide whether a variable of type \Word\ contains an atom or a list handle. Note that values less or equal $-\BETA$ are legal only during garbage collection while values greater than $\BETA + \NU$ are used for referencing other garbage collected structures. The \Word s of a cell adressed by a list handle \ttL\ are {\tt \SPACE[$\ttL-\BETA$]} and {\tt \SPACE[$\ttL-\BETA+1$]}. To simplify these computations, the C pointers \SPACEB\ and \SPACEBone\ are set to the memory addresses of {\tt \SPACE[$-\BETA$]} and {\tt \SPACE[$-\BETA+1$]}, respectively. This is used by the functions {\tt FIRST(L)}, which returns {\tt SPACEB1[L]}, and {\tt RED(L)}, which returns {\tt SPACEB[L]}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Implementation of GCA Handles} When \saclib\ is initialised, the array \GCASPACE\ containing $\NUp+1$ structures of type \GCArray\ is allocated. A {\em GCA handle} is defined to be \BETAp plus the index of the corresponding \GCArray\ structure in the \GCASPACE\ array, with the null handle being \NIL. The \GCArray\ structure contains the following fields: \begin{itemize} \item {\tt next}\ \ldots\ a \Word, used for linking empty \GCArray s to the \GCAAVAIL\ list and for marking (see Section \ref{cNIWsGCssGC}). \item {\tt flag}\ \ldots\ a \Word, set to one of {\tt GC\_CHECK} and {\tt GC\_NO\_CHECK} (see Section \ref{cNIWsGCssGC}). \item {\tt len}\ \ldots\ a \Word, the length of the array in \Word s. \item {\tt array}\ \ldots\ a C pointer to an array of \Word s of size {\tt len}. \end{itemize} When {\tt GCAMALLOC()(} is called, it takes the first \GCArray\ from the \GCAAVAIL\ list and initializes its fields. {\tt GCA2PTR()} simply returns the C pointer in the {\tt array} field. {\tt GCAFREE()} deallocates the memory addressed by the {\tt array} field, sets all fields to zero, and links the \GCArray\ to the beginning of the \GCAAVAIL\ list. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{The Garbage Collector} \label{cNIWsGCssGC} Garbage collection is invoked when {\tt COMP()} or {\tt GCAMALLOC()} call {\tt GC()} in the case of \AVAIL\ or \GCAAVAIL\ being \NIL. The garbage collector consists of two parts: \begin{itemize} \item The function {\tt GC()}\index{GC} is system dependent. It must ensure that the contents of all processor registers are pushed onto the stack and pass alignment information and the address of the end of the stack to {\tt GCSI()}. \item {\tt GCSI()}\index{GCSI} is the system independent part of the garbage collector. It uses a mark-and-sweep method for identifying unused cells: \begin{description} \item[Marking:] The processor registers, the system stack, and the variables and GCA arrays to which pointers are stored in the \GCGLOBALS\ list are searched for non-\NIL\ list and GCA handles. All the cells accessible from these handles are marked by a call to {\tt MARK()}. If a list handle is found, this function traverses the cells of the list, marking them by negating the contents of their first \Word. If the second \Word\ of a cell contains a list or GCA handle, {\tt MARK()} calls itself recursively on this handle. In case of a GCA handle, the GCA cell adressed by the handle is marked by negating the contents of its {\tt next} field. If the cell's {\tt flag} field is not set to {\tt GC\_NO\_CHECK}, the \Word s in the array pointed to by the {\tt array} field are searched for list or GCA handles with {\tt MARK()} calling itself recursively on valid handles. \item[Sweeping:] In the sweep step, the \AVAIL\ and \GCAAVAIL\ lists are built: Cells in \SPACE\ whose first \Word\ contains a positive value are linked to the \AVAIL\ list. If the first \Word\ of a cell contains a negative value, it is made positive again and the cell is not changed in any other way. Cells in \GCASPACE\ whose {\tt next} field contains a positive value are linked to the \GCAAVAIL\ list and the array pointed to by the {\tt array} field is deallocated. If the {\tt next} field contains a negative value, it is made positive again and the cell is not changed in any other way. \end{description} \end{itemize} If the \AVAIL\ list contains no more than $\NU/\RHO$ cells at the end of garbage collection, an error message is written to the output stream and the program is aborted. saclib2.2.8/doc/user_guide/saclib.dvi0000664002275300236100000101075414017255270016621 0ustar wcbrownscs; TeX output 2000.03.09:1423CPWx>DtGGcmr17SAqCLIB1.17tUser'sGuide0XQ cmr121]jo cmr9cˤ cmsy9 1993Tb9yKurtG`odelInstitute,'`BrunoBucrhbSerger 2GeorgeE.CollinseMarkJ.Encarnaci on;[HoSonHong,JeremryR.Johnson WVernerKrandicrk3+RSvudigerLoosȬAnaM.MandacrheAndreasNeubacrherHerbSertVielhaberWMarcrh12,1993N-=Aacmr61TRISC{Linz"RepAortSeriesT:ec9hnicalReportNum9ber93-19(Researc9hInstituteforSymbAolic 9Computation,TJohannesKeplerUniv9ersity:,TA-4040Linz,Austria)*CyXK`y cmr10SACLIBgandshowshowtocallthem 9fromC.ThereisalsoabriefexplanationoftheinnerworkingsofthelistproGcessingand9garbageUUcollectionfacilitiesofSACLIB(G!. 'C9cNH cmbx12cCon8tents>919In9troQduction71 91.149WhatUUisSACLIB(G!?%................................191.249AbGoutUUthisGuide߁.................................291.349SACLIB\Maintenance*..............................2929ListTProQcessing*492.149MathematicalUUPreliminaries?N...........................492.249PurpGoseFȍ......................................492.349De nitionsUUofT*ermsTȍ...............................492.449F*unctions#1.....................................5939Arithmetic@1993.149IntroGduction....................................9493.1.1T9PurpGosec..................................9493.1.2T9De nitionsUUofT*ermsq...........................993.249IntegerUUArithmetic{................................1093.349MoGdularUUNumberArithmetic[..........................13493.3.1T9MoGdularUUDigitArithmetic"ō........................13493.3.2T9MoGdularUUIntegerArithmeticiۍ.......................1393.449RationalUUNumbGerArithmetic?F..........................14949P9olynomialTArithmeticZ1594.149IntroGduction....................................15494.1.1T9PurpGosec..................................15494.1.2T9De nitionsUUofT*ermsq...........................1594.249PolynomialUUInputandOutput..........................17494.2.1T9RecursiveUUpGolynomialsoverZ􍍑......................17494.2.2T9RecursiveUUpGolynomialsoverQT......................18494.2.3T9DistributiveUUpGolynomialsoverZp荍.....................19494.2.4T9DistributiveUUpGolynomialsoverQ....................19494.2.5T9ConversionUUBetweenRecursiveandDistributiveT9Representationm..............................19494.2.6T9PolynomialsUUoverZ 0ercmmi7m...........................1994.349DomainUUIndepGendentPolynomialArithmeticM8..................2094.449IntegralUUPolynomialArithmetic<.........................2194.549MoGdularUUPolynomialArithmetici䍍.........................2494.649RationalUUPolynomialArithmeticMs.........................2694.749MiscellaneousUURepresentationsJ..........................26494.7.1T9SparseUUDistributiveRepresentationJ...................26494.7.2T9DenseUURecursiveRepresentation捍....................27^i C959LinearTAlgebra&28 95.149MathematicalUUPreliminaries?N...........................2895.249PurpGoseFȍ......................................2895.349MethoGdsUUandAlgorithmsxA.............................2895.449F*unctions#1.....................................29969P9olynomialTGCDandResultants3196.149MathematicalUUPreliminaries?N...........................3196.249PurpGoseFȍ......................................3296.349De nitionsUUofT*ermsTȍ...............................3296.449MethoGdsUUandAlgorithmsxA.............................33496.4.1T9GCDUUComputations...........................33496.4.2T9Resultantsۍ.................................3396.549F*unctions#1.....................................34979P9olynomialTF actorization{3797.149MathematicalUUPreliminaries?N...........................3797.249PurpGoseFȍ......................................3797.349MethoGdsUUandAlgorithmsxA.............................3797.449F*unctions#1.....................................38989RealTRoQotCalculationZ4098.149MathematicalUUPreliminaries?N...........................4098.249PurpGoseFȍ......................................4098.349MethoGdsUUandAlgorithmsxA.............................4098.449De nitionsUUofT*ermsTȍ...............................4198.549F*unctions#1.....................................41999AlgebraicTNum9bQerArithmeticz4499.149MathematicalUUPreliminaries?N...........................4499.249PurpGoseFȍ......................................4499.349MethoGdsUUandAlgorithmsxA.............................4499.449De nitionsUUofT*ermsTȍ...............................4699.549Representationc..................................4699.649F*unctions#1.....................................479A9CallingTSACLIB,tF unctionsTfromCE519A.149AUUSampleProgram................................519A.249DynamicUUMemoryAlloGcationinSACLIB)F2....................519A.349DeclaringUUGlobalV*ariablestoSACLIB*.....................549A.449InitializingUUSACLIB+vbyUUHand ~..........................559A.549SACLIB\ErrorUUHandling퍍.............................559A.649Compilingڍ.....................................569B9ISAC4h:pAnTIn9teractiveInterfacetoSACLIB%{579B.149WhatUUisISAC?qS..................................579B.249SuppGortedUUSACLIB+vAlgorithmsFX.........................579B.349CommandUULineOptions.............................579B.449InterfaceUUF*unctionality..............................579B.549InterfaceUUGrammar................................58zii7C9C9NotesTontheIn9ternalW orkingsofSACLIBd61 9C.149Lists,UUGCAHandles,andGarbageCollection⍍.................6149C.1.1T9ImplementationUUofListsx$.........................6149C.1.2T9ImplementationUUofGCAHandles{....................6249C.1.3T9TheUUGarbageCollector..........................629C.249ConstantsUUandGlobalV*ariables͍.........................639IndexdV66AiiinC9cList T{ofFigures49A.149AUUsampleprogram.\................................52 9A.249SampleUUcoGdeusingGCAhandles.p........................539A.349DeclaringUUglobalvqariables.M............................549A.449SampleUUcoGdeforinitializingSACLIBbyhand..................569C.149TheUU$ cmmi10;(9;6);8).ML.................61:ivtC9iNq cmbx12iChapter 129cIn8tro duction:9AnaMandache,QAndreasNeubacherandHoGonHongalltoiledlonghoursediting9and_reformattingprograms.AndreasdeservesspGecialrecognition.Heinitiatedthewriting9ofthemanual,/wrotethreechaptersofthemanualandtwooftheappGendices,/anddidall9theqYrequiredsystemmaintenance.T*ofacilitateexpGerimentingwiththefunctionsinthe9library*,,HerbGertVielhaberimplementedISAC&,,theinteractiveshellforSACLIB(~.vHealso9wroteUUthecorrespGondingappendixofthemanual.9Besides$theabGove$itwouldbeunthinkqablenottomention,.collectively*,all$ofmyformer9doGctoralTLstudents, whocontributedtothedevelopmentoftheSAC2algorithmsandthe9research>onwhichtheywerefoundedoverapGeriod>of26years.jCDuringthelast20ofthose9yearsRGudigerLooswasafrequentcollabGorator.Heproposedcreationofan"ALgorithm9DEScription[?language"forSAC1,DthepredecessorofSAC2,DandwroteanALDES-to-F*ortran9translator.9ThisoinitialversionofSACLIBoisjustthebGeginningofwhatistocome.sW*eknowhow9toRimproveseveraloftheprogramsinthecurrentsystemandwewilldoitforsubsequent9versions.Some5basicfunctionalitiesarelargelyundevelopGedinthecurrrentsystem(e.g.1|C9linearalgebra)buttheywillbGesuppliedinsubsequentversions.Somemoreadvqanced 9functionalitiesT(e.g.qpGolynomialcomplexrootsandquanti erelimination)arenearlyready9and<#willbGeforthcomingsoon.iaAlsoweexpectthatusersofthesystemwillwriteprograms9basedUUontheoneswedistributeando erthemtootherusers.MTGeorgeUUE.Collins!č91.23 VAbs3outffthisGuide9Theʈmaingoalinwritingthisguidewastoenablethereadertoquicklydiscoverwhether9SACLIB5yprovidesMafunctionforagivenproblem.ThestructureofthepapGershouldfacilitate9searchingUUforafunctioninthefollowingway:9'9EveryZchapterdealswithfunctionsopGeratingoveracertaindomain(lists,[numbGers,'9pGolynomials,etc.)or~Dwithfunctionssolvingcertainproblems(GCD}computation,'9factorization,UUrealroGotcalculation,etc.).9'9SomechaptersaresplitintosectionscoveringmorespGeci ctopics(integerarithmetic,'9rationalUUnumbGerarithmetic,integralpGolynomialarithmetic,etc.)9'9Insideasection,functionsaredividedintovqariousareas(basicarithmetic,predicates,'9input/output,UUetc.).9'9InsideUtheseareas,bUcloselyrelatedfunctions(afunctionanditsinverse,functions'9solvingessentiallythesameproblem,afunctionanditsauxiliaryroutines,etc.)`qare'9groupGed.9Thispartitioningwasdoneonacompletelysub8jectivebasis. 8Theintentionalways9wasthattheneophyteusershouldbGeabletopinpointadesiredfunctionbyusingsimple9heuristics.ThisCapproachmaycertainlyfailinsomecases,?butwithatmost50functions9pGersectionbrowsingthemsequentiallyshouldalwayssucceedinanacceptableamountof9time.9Anotherrathersub8jectivelydesignedfeatureisthefunctiondescriptions.QAThelistswere9generatedautomaticallyfromtheheadersoftheSACLIB,3source les.SF*orsomefunctions9additionalUUremarkswereaddedin!': cmti10emphasize}'dtypGestyle.9Readers.whowant.touseSACLIB+MfunctionsintheirC.programsshouldreadAppGendix9A,rwhich:describGeshowinitializationandcleanuparedone,rwhich leshavetobGe#included,9etc.A!detailed!descriptionoftheinput/outputspGeci cationsofagivenfunctioncanbe9found inthecommentbloGckatthebGeginningofthecorrespondingsource le.gReadthe9\AddendumUUtotheSACLIB+vUser'sGuide"forinformationonhowtoaccessthese.9ThoseVwhowantVtoknowmoreabGouttheinnerworkingsofSACLIB-shouldreferto9AppGendixo6Cwhichgivesanoverviewoftheinternalrepresentationoflists,thegarbage9collector94andtheconstantsandglobalvqariablesusedinternally*.Descriptionsofthehighlevel9datastructuresusedforimplementingtheelementsofdomainslikeintegers,8pGolynomials,9etc.UUcanbGefoundatthebeginningsofthecorrespondingsections.!č91.33 VSACLIBl8Maintenance9The recommendedway forrepGortingproblemswithSACLIB+ 2issendinge-mailtothemain-9tenanceUUaccount'9saclib@risc.uni-linz.ac.at9orUUmailto2C9SACLIB?Maintenance 9Research?InstituteforSymbolicComputation9Johannes?KeplerUniversity94020?Linz9Austria9MessagesUUwhichmightinterestagreateraudienceshouldbGesenttothemailinglist'9saclib-l@risc.uni-linz.ac.at9ThisUUlistcanbGesubscribedbysendingamessagewiththebody'9subscribGeUUsaclib-l< rstname>9toUUlistserv@risc.uni-linz.ac.at. 9NotenthatSACLIB+isnotsoldforpro t^ٓRcmr71|s.ThereforedonotexpGectpromptserviceand9extensivesuppGort.SnNevertheless,ZSACLIB,Eiscontinuouslymaintainedandextended,Zsodo9notUUhesitategettingincontactwithus.97ffl) J= "5-:1L|{Ycmr8SAÎCLIB1mainÎtenanceXisspAnUUintegerasuchthatBETA <aAUUtermdenotingbGothatomsandlists.9compQositionO8ofUUanob8jectlandalist(l1|s;l2;:::;lnq~)UUisthelist(l2`;l1|s;l2;:::;lnq~).9reductumCof+alist(l1|s;l2;:::;lnq~)+isthelist(l2|s;l3;:::;lnq~).cThe+reductumoftheemptylist '9isUUunde ned.9concatenationXofUUlists(l1|s;l2;:::;lnq~)UUand(m1|s;m2;:::;mk됲)UUisthelist(l1|s;:::;'9lnq~;m1|s;:::;mk됲).9in9verse6 ѲofUUalist(l1|s;l2;:::;lnq~)UUisthelist(ln;ln O!cmsy71;:::;l1|s).9length2ofUUalist(l1|s;l2;:::;lnq~)UUisn.qThelengthoftheemptylistis0.9exten9t2TheUUnumbGerofcellsusedbyanob8ject.qMoreprecisely:39=9EXTENT\(a)=0UUifaisanatom.39=9EXTENT\(NIL)=0.39=9EXTENT\(L)=1 +EXTENT (l1|s)+EXTENT((l2|s;:::;lnq~)),;where4Listhenon-emptylist=9(l1|s;l2;:::;lnq~).9order.TheUUdepthofanob8ject.qMoreprecisely:39=9ORDERWy(a)=0UUifaisanatom.39=9ORDERWy(NIL)=1.39=9ORDERWy(L)Q=MAX(ORDER?(l1|s)֪+1;ORDER꙲((l2;:::;lnq~))),}0whereBListhenon-empty=9listUU(l1|s;l2;:::;lnq~).9sideTe ectsIѲWhen afunctionmoGdi esthecontent ofoneormorecellsoftheinputlist(s),'9itUUissaidtocausesidee e}'cts.qThisisalwaysUUnotedinthefunctionspGeci cations.9destructiv9eJXAnUUopGerationonlistscausingsidee ectsiscalleddestructive.9(unordered)Tseta5AnUU(unordered)listofatoms.!č92.43 VFfunctions9Constructors:'9M?<-COMP(a,L)zȲCompGosition.qPr}'e xesanobjecttoalist.'9M?<-COMP2(a,b,L)CompGositionUU2.qPr}'e xes2objectstoalist.'9M?<-COMP3(a1,a2,a3,L)CompGositionUU3.qPr}'e xes3objectstoalist.'9M?<-COMP4(a1,a2,a3,a4,L)CompGositionUU4.qPr}'e xes4objectstoalist.'9L?<-LIST1(a)u˲List,UU1element.qBuildsalistfr}'omoneobject.'9L?<-LIST2(a,b)9ŲList,UU2elements.qBuildsalistfr}'om2objects.'9L?<-LIST3(a1,a2,a3)yList,UU3elements.qBuildsalistfr}'om3objects.'9L?<-LIST4(a1,a2,a3,a4)9List,UU4elements.qBuildsalistfr}'om4objects.'9L?<-LIST5(a1,a2,a3,a4,a5)List,UU5elements.qBuildsalistfr}'om5objects.'9L?<-LIST10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)9qList,10elements.6Builds/alist=9fr}'om10objects.9Selectors:'9ADV(L;?a,Lp)pyβAdvqance.qR}'eturnsthe rstelementandthereductumofalist.5C'9ADV2(L;?a,b,Lp)9ŲAdvqanceh2.[xR}'eturnsVUthe rst2elementsandthe2ndreductumof =9alist.'9ADV3(L;?a1,a2,a3,Lp)yAdvqance D3.`R}'eturnscthe rst3elementsandthe3rdreduc-=9tumofalist.'9ADV4(L;?a1,a2,a3,a4,Lp)9Advqance4.#R}'eturnsthe rst4elementsandthe4th=9r}'eductumofalist.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.'9a?<-FIRST(L)u˲First.qR}'eturnsthe rstelementofalist.'9FIRST2(L;?a,b)zȲFirstUU2.qR}'eturnsthe rst2elementsofalist.'9FIRST3(L;?a1,a2,a3)9FirstUU3.qR}'eturnsthe rst3elementsofalist.'9FIRST4(L;?a1,a2,a3,a4)FirstUU4.qR}'eturnsthe rst4elementsofalist.'9a?<-SECOND(L)zȲSecond.qR}'eturnsthe2ndelementofalist.'9a?<-THIRD(L)u˲Third.qR}'eturnsthe3rdelementofalist.'9a?<-FOURTH(L)zȲF*ourth.qR}'eturnsthe4thelementofalist.'9Lp?<-LASTCELL(L)LastUUcell.qR}'eturnsthelisthandleofthelastcellofalist.'9a?<-LELTI(A,i)9ŲListUUelement.qR}'eturnsthei-thelementofalist.'9Lp?<-RED(L)pyβReductum.qR}'eturnsthereductumofalist.'9Lp?<-RED2(L)u˲ReductumUU2.qR}'eturnsthe2ndreductumofalist.'9M?<-RED3(L)pyβReductumUU3.qR}'eturnsthe3rdreductumofalist.'9M?<-RED4(L)pyβReductumUU4.qR}'eturnsthe4threductumofalist.'9B?<-REDI(A,i)zȲReductum.qR}'eturnsthei-threductumofalist.9InformationTandPredicates:'9t?<-ISOBJECT(a)y²T*estW\forob8ject.T;estsAwhetherthear}'gumentrepresentsanobject.'9t?<-ISATOM(a)zȲT*estUUforatom.qT;estswhetherthear}'gumentrepresentsanatom.'9t?<-ISLIST(a)zȲT*estUUforlist.qT;estswhetherthear}'gumentrepresentsalist.'9t?<-ISNIL(L)u˲T*estAforemptylist.T;estswhetherthear}'gumentrepresentstheempty =9list.'9t?<-EQUAL(a,b)9ŲEqual.qT;estswhethertwoobje}'ctsareequal.'9t?<-MEMBER(a,L)y²MembGershipXtest.{uT;estsdwhetheranobje}'ctisanelementofa=9list.'9i?<-LSRCH(a,A)9ŲListUUsearch.qR}'eturnstheindexofanobjectinalist.'9n?<-EXTENT(a)zȲExtent.'9n?<-LENGTH(L)zȲLength.'9n?<-ORDER(a)u˲Order.9Concatenation:'9L?<-CCONC(L1,L2)ConstructiveUUconcatenation.qBuildsalist(l1|s;:::;lm; =9lm+1;:::;lnq~)fr}'omlists(l1|s;:::;lm)and(lm+1;:::;lnq~).'9L?<-CONC(L1,L2)y²Concatenation.qConc}'atenatestwolistsdestructively.'9M?<-LCONC(L)u˲List?concatenation.(Conc}'atenatestheelementsofalistoflistsde-=9structively.9In9version:6C'9M?<-CINV(L)pyβConstructiveHinverse.Buildsײalistc}'ontainingtheelementsofthe =9ar}'gumentininverseorder.'9M?<-INV(L)k9ѲInverse.qInvertsalistdestructively.9Insertion:'9LINS(a,L)`ײListUUinsertion.qInsertsanobje}'ctafterthe rstelementofalist.'9L?<-LEINST(A,i,a)List|elementinsertion.?Inserts anobje}'ctafterthei-thelement =9ofalist.'9Lp?<-SUFFIX(L,b)Sux.qApp}'endsanobjectafterthelastelementofalist.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.9Com9binatorial:'9M?<-LEROT(L,i,j)Listd:elementrotation.wR}'otatessomeconsecutiveelementsofa =9list.'9Lp?<-LPERM(L,P)y²ListUUpGermute.qPermutestheelementsofalist.'9Pp?<-PERMCY(P)9ŲPermutation,UUcyclic.qR}'otatesalisttotheleft.'9L?<-PERMR(n)u˲Permutation,random.?Builds alistofthe rstninte}'gersinrandom=9or}'der.'9B?<-LEXNEX(A)zȲLexicographicallyzHnext.Computesthelexic}'ographicalsuccessorof=9ap}'ermutation.9SetTOpQerations:'9b?<-SEQUAL(A,B)y²SetVequality*.u_T;estswhethertwosetsr}'epresentedasunor}'dered =9r}'edundantlistsar}'eequal.'9C?<-SDIFF(A,B)9ŲSetUUdi erence.'9B?<-SFCS(A)pyβSetUUfromcharacteristicset.'9C?<-SINTER(A,B)y²SetUUintersection.'9C?<-SUNION(A,B)y²SetUUunion.'9C?<-USDIFF(A,B)y²UnorderedUUsetdi erence.'9C?<-USINT(A,B)9ŲUnorderedUUsetintersection.'9C?<-USUN(A,B)zȲUnorderedUUsetunion.9Sorting:'9M?<-LBIBMS(L)zȲListyofBET*A-integersbubble-mergesort.4Sortsalistofatoms =9intonon-desc}'endingorder.'9LBIBS(L)[yڲList8ofBET*A-integersbubblesort.Sorts8alistofatomsintonon-desc}'ending=9or}'der.'9L?<-LBIM(L1,L2)y²ListUUofBET*A-integersmerge.qMer}'gestwosortedlistsofatoms.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.'9C?<-LMERGE(A,B)y²Listmerge.Constructively@9mer}'gestwolistsavoidingduplicate=9elements.9Input/Output:'9A?<-AREAD()pyβAtomUUread.'9AWRITE(A)`ײAtomUUwrite.'9L?<-LREAD()pyβListUUread.7$C'9LWRITE(L)`ײListUUwrite.'9B?<-OREAD()pyβOb8jectUUread.'9OWRITE(B)`ײOb8jectUUwrite.9Miscellaneous:'9C?<-PAIR(A,B)zȲPair.qBuildsalistbyinterle}'avingtheelementsoftwolists.'9SFIRST(L,a)k9ѲSetUU rstelement.qSetsthe rstelementofalist.'9SLELTI(A,i,a)u˲SetUUlistelement.qSetsthei-thelementofalist.'9SRED(L,Lp)eԲSetUUreductum.qSetsther}'eductumofalist.8 ҦC9iChapter 329cArithmetic:93.13 VIntros3duction95N cmbx123.1.17yPurp`oseuT9TheSACLIB, arithmeticpackqagessuppGortcomputationswithintegers,moGdularnumbGers, 9andUUrationalnumbGersUUwhosesizesareonlyboundedbytheamountofmemoryavqailable.獍93.1.27yDe nitionsofTerms9in9teger5wIntegersUUtobGeenteredintoSACLIB+vmustbGeofthefollowingexternalform.ڠ39=9orڠ39=9+or39=9,'9wherejdesignatesanynon-emptywordoverthealphabGet0;1;:::;9(. '9Note'thatthereisnoblankbGetween'theoptionalsignandthedigitsequence;also'9notethatleadingzerosareallowed.Inputsofthisformareinterpretedintheusual'9wayUUasdecimalnumbGers.mP'9SACLIBOC{outputsthec}'anonical[:externalr}'epresentationofintegers.]>Thisistheinteger'9inUUexternalformwithbGothpositivesignandleadingzerosdigitssupressed.'9TheUUinternalr}'epresentationIofanumbGern2Zisde nedasfollows:ڠ39=9IfUUBETA <norЍ39=9=,'9whereandareexternalformsofrelativelyprimeintegers'9NandzDG,suchthatD5>0.(Notethatnoblanksarepermittedimmediatelybeforeand'9aftersthe=.&InputsofthisformareinterpretedintheusualwayasrationalnumbGers'9withUUnumeratorNlpanddenominatorDG.荍'9SACLIBOoutputsi;thec}'anonical5externalr}'epresentationi;ofrationalnumbGersi;r/^2AQ.xIf'9r52Z,4the,canonicalexternalrepresentationofrsisthecanonicalexternalrepresenta-'9tionHoftheintegerrG.mOtherwisethereareuniqueintegersN_andDsuchthatr5= KNK&fe*]D C/,'9D0T>71,nandigcdi(N;DG)=1.2Theicanonicalexternalrepresentationofrinthiscaseis'9thecanonicalexternalrepresentationoftheintegerNfollowedby=followedbythe'9canonicalUUexternalrepresentationoftheintegerDG.'9TheUUinternalr}'epresentationRofanumbGerr52Qisde nedasfollows:Ѝ39=9IfUUr5=0thenRistheBETA-digit0.Ѝ39=9Otherwise,0,UUandgcdUW(n;d)=1.9ceiling3TofUUanumbGerUUrristhesmallestintegernsuchthatr5n.9 oQor*+ofUUanumbGerUUrristhelargestintegernsuchthatnrG.9pQositiv9e:@nUUispGositiveif0,respectively.'9t?<-IEVEN(A)u˲IntegerUUeven.qT;estswhetherthear}'gumentiseven.'9t?<-IODD(A)pyβIntegerUUoGdd.qT;estswhetherthear}'gumentisodd.9ExpQonen9tiation:'9B?<-IEXP(A,n)zȲIntegerUUexpGonentiation.'9IROOT(A,n;?B,t)9ŲIntegerUUroGot.'9ISQRT(A;?B,t)u˲IntegerUUsquareroGot.'9DSQRTF(a;?b,t)zȲDigitUUsquareroGotfunction.'9IPOWER(A,L;?B,n)y²Integer%pGower.6Ifithear}'gumentcanbeexpressedasb^nq~,*such=9inte}'gersbandnarecomputed.9GreatestTCommonDivisor:'9C?<-IGCD(A,B)zȲIntegerUUgreatestcommondivisor.'9c?<-DGCD(a,b)zȲDigitUUgreatestcommondivisor.'9IGCDCF(A,B;?C,Ab,Bb)yIntegerUUgreatestcommondivisorandcofactors.'9IEGCD(a,b;?c,u1,v1)9IntegerUUextendedgreatestcommondivisoralgorithm.'9DEGCD(a,b;?c,u,v)DigitUUextendedgreatestcommondivisor.'9IDEGCD(a,b;?c,u1,v1,u2,v2)Integerdoublyextendedgreatestcommondivisor=9algorithm.'9IHEGCD(A,B;?C,V)y²IntegerUUhalf-extendedgreatestcommondivisor.'9C?<-ILCM(A,B)zȲIntegerUUleastcommonmultiple.9F actorization:'9F?<-IFACT(n)u˲IntegerUUfactorization.'9s?<-ISPT(m,mp,F)Integer-selfridgeprimalitytest.OR}'eturnsA1iftheargumentis=9prime,-1ifitisnotprime,and0iftheprimalityc}'ouldnotbedetermined.'9ILPDS(n,a,b;?p,np)IntegerUUlargeprimedivisorsearch.'9IMPDS(n,a,b;?p,q)IntegerUUmediumprimedivisorsearch.'9ISPD(n;?F,m)pyβIntegerUUsmallprimedivisors.9PrimeTNum9bQerGeneration:'9L?<-DPGEN(m,k)9ŲDigitUUprimegenerator.9RandomTNum9bQerGeneration:'9A?<-IRAND(n)u˲Integer,UUrandom.'9a?<-DRAN()k9ѲDigit,UUrandom.'9a?<-DRANN()pyβDigit,UUrandomnon-negative.A11 ﮠC9Com9binatorial:|'9A?<-IFACTL(n)zȲIntegerUUfactorial.IH'9A?<-IBCOEF(n,k)y²IntegerUUbinomialcoGecient.qR}'eturns`.: n⍍ mke`I.pd'9B?<-IBCIND(A,n,k)IntegerbinomialcoGecientinduction.PR}'eturns6`5Vpnƍ /kw+81ן`)ygiven =9n,kP,and`.: n⍍ mke`I.ׇ'9A?<-IBCPS(n,k)9ŲIntegerUUbinomialcoGecientpartialsum.qR}'eturnsPލ""k%""i=0A`Z썑#9n0$P1i):`/3{.II9BinaryTArithmetic:'9n?<-ILOG2(A)u˲Integer^logarithm,base2.R}'eturns1+(the oorofthebase2 =9lo}'garithmoftheargument).|'9n?<-DLOG2(a)u˲DigitUUlogarithm,base2.'9IFCL2(a;?m,n)u˲Integer, oGorJandceiling,logarithm,base2.4R}'eturnsϪthe oorand=9thec}'eilingofthebase2logarithmoftheargument.'9B?<-IMP2(A,h)zȲInteger multiplicationbypGowerof2.YXMultipliesPwthear}'gumentbya=9non-ne}'gativepowerof2.'9B?<-IDP2(A,k)zȲIntegerBdivisionbypGowerof2.:gDividesnqthear}'gumentbyanon-=9ne}'gativepowerof2.'9B?<-ITRUNC(A,n)y²IntegerW/truncation.wTDividesthear}'gumentbyapositiveornega-=9tivep}'owerof2.'9n?<-IORD2(a)u˲Integer,orderޒof2. R}'eturns*thelargestnsuchthat2^n dividesthe=9ar}'gument.|9BoQolean:'9c?<-DAND(a,b)zȲDigitUUand.qR}'eturnsthebit-wise^oftwodigits.|'9c?<-DOR(a,b)u˲DigitUUor.qR}'eturnsthebit-wise_oftwodigits.'9b?<-DNOT(a)pyβDigitUUnot.qR}'eturnsthebit-wise:ofadigit.'9c?<-DNIMP(a,b)9ŲDigitnon-implication.8R}'eturnsthebit-wise:(a5)b)ofdigitsa=9andb.|9Input/Output:'9A?<-IREAD()pyβIntegerUUread.|'9IWRITE(A)`ײIntegerUUwrite.'9ILWRITE(L)eԲIntegerUUlistwrite.qWritesalistofinte}'gersintheform=9(n1|s;n2;:::;nk됲)totheoutputstr}'eam.|9AuxiliaryTF unctions:'9C?<-ISSUM(n,L)9ŲInteger shiftedsum.OComputes=Pލk%i=0ٵCiTLBETAT@\pin$ױgiven=nandthe=9CiTL.|'9ISEG(A,n;?A1,A0)y²IntegerHJsegmentation.Splitscaninte}'gerataBETA-digitboundary.'9C?<-IDIPR2(A,B,a,b)yIntegerdigitinnerproGduct, length2.(kComputeskAaY+Bqb=9forinte}'gersA;BXandBETA-digitsa;b.'9C?<-ILCOMB(A,B,u,v)yInteger~linearcombination.N*Computes1Aac3+Bqbforinte}'gers=9A;BXandBETA-digitsa;bwithAa8+Bqb0.'9DPCC(a1,a2;?u,up,v,vp)DigitUUpartialcosequencecalculation.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.A12 `C93.33 VMos3dularffNumberArithmetic93.3.17yMo`dularDigitArithmeticuT9BasicTArithmetic:'9c?<-MDSUM(m,a,b)MoGdularUUdigitsum.'9c?<-MDDIF(m,a,b)MoGdularUUdigitdi erence.'9b?<-MDNEG(m,a)9ŲMoGdularUUdigitnegative.'9c?<-MDPROD(m,a,b)MoGdularUUdigitproduct.'9c?<-MDQ(m,a,b)9ŲMoGdularUUdigitquotient.'9b?<-MDINV(m,a)9ŲMoGdularUUdigitinverse.'9b?<-MDEXP(m,a,n)MoGdularUUdigitexponentiation.9ChineseTRemainderAlgorithm:'9a?<-MDCRA(m1,m2,mp1,a1,a2)9MoGdularUUdigitchineseremainderalgorithm.'9L?<-MDLCRA(m1,m2,L1,L2)yMoGdularUUdigitlistchineseremainderalgorithm.'9b?<-MDHOM(m,A)9ŲMoGdularUUdigithomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9a?<-MDRAN(m)u˲MoGdularUUdigit,random.693.3.27yMo`dularIntegerArithmeticuT9BasicTArithmetic:'9C?<-MISUM(M,A,B)MoGdularUUintegersum.'9C?<-MIDIF(M,A,B)MoGdularUUintegerdi erence.'9B?<-MINEG(M,A)9ŲMoGdularUUintegernegation.'9C?<-MIPROD(M,A,B)MoGdularUUintegerproduct.'9C?<-MIQ(M,A,B)9ŲMoGdularUUintegerquotient.'9B?<-MIINV(M,A)9ŲMoGdularUUintegerinverse.'9B?<-MIEXP(M,A,N)MoGdularUUintegerexponentiation.9ChineseTRemainderAlgorithm:'9As?<-MIDCRA(M,m,mp,A,a)yMoGdularUUintegerdigitchineseremainderalgorithm.'9As?<-MIHOM(M,A)y²MoGdularUUintegerhomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9R?<-MIRAN(M)u˲MoGdularUUinteger,random.9Con9version:'9B?<-SMFMI(M,A)9ŲSymmetric7moGdularfrommodularinteger./Computestheisomor- =9phismfr}'omZm ,tofb m&fe2⍟bQ+81;:::;b m&fe2⍟bqg.A13 C93.43 VRationalffNumbs3erArithmetic9BasicTArithmetic:'9T?<-RNSUM(R,S)9ŲRationalUUnumbGersum.'9T?<-RNDIF(R,S)9ŲRationalUUnumbGerdi erence.'9S?<-RNNEG(R)u˲RationalUUnumbGernegative.'9T?<-RNPROD(R,S)y²RationalUUnumbGerproduct.'9T?<-RNQ(R,S)u˲RationalUUnumbGerquotient.'9S?<-RNINV(R)u˲RationalUUnumbGerinverse.'9s?<-RNSIGN(R)zȲRationalUUnumbGersign.'9S?<-RNABS(R)u˲RationalUUnumbGerabsolutevqalue.'9t?<-RNCOMP(R,S)y²RationalUUnumbGercomparison.'9c?<-RNMIN(a,b)9ŲRationalUUnumbGermin.'9c?<-RNMAX(a,b)9ŲRationalUUnumbGermax.9Constructors:'9R?<-RNINT(A)u˲RationalUUnumbGerfrominteger.qR}'eturns n&fe~z1givenanintegern.'9R?<-RNRED(A,B)9ŲRationaldnumbGerreductiontolowestterms.P"R}'eturns j=nj=&fe~cd given7 two =9inte}'gersnanddwithd6=0.9Selectors:'9a?<-RNNUM(R)u˲RationalUUnumbGernumerator.'9b?<-RNDEN(R)u˲RationalUUnumbGerdenominator.9RandomTNum9bQerGeneration:'9R?<-RNRAND(n)zȲRationalUUnumbGer,random.9Input/Output:'9R?<-RNREAD()u˲RationalUUnumbGerread.'9RNWRITE(R)eԲRationalUUnumbGerwrite.'9RNDWRITE(R,n)u˲RationalHInumbGerdecimalwrite.JAppr}'oximatesslarationalnumber =9byade}'cimalfractionwithagivenaccuracyandwritestheapproximationtothe=9outputstr}'eam.9Miscellaneous:'9a?<-RNCEIL(r)zȲRationalUUnumbGer,ceilingof.'9a?<-RNFLOR(r)zȲRationalUUnumbGer, oorof.'9RNBCR(A,B;?M,N,k)RationalUUnumbGerbinarycommonrepresentation.'9RNFCL2(a;?m,n)zȲRationalUUnumbGer oorandceilingoflogarithm,base2.'9r?<-RNP2(k)pyβRationalUUnumbGerpowerof2.qComputes2^n egivenaGAMMA-digitn.A14̠C9iChapter 429cP8olynomial T{Arithmetic:94.13 VIntros3duction94.1.17yPurp`oseuT9The ;SACLIB-BpGolynomial ;arithmeticpackqagesprovidefunctionsdoingcomputationswith 9multivqariateUUpGolynomialsoverdomainsimplementedbytheSACLIB+varithmeticpackqages.9Except.forthefunctionslistedinSection4.7andvqariousconversion.functions,6Qonlythe9sp}'arserecursiveUUrepresentationisused.694.1.27yDe nitionsofTerms9sparseTrecursiv9erepresentationApGolynomial墵p2D[x1|s;:::;xrm]isinterpretedasanel-'9ementof(::: UO(D[x1|s]):::)[xrm],forsomedomainD.TheSACLIB*#sp}'arserecursiverepre-'9sentation8PofapGolynomialp=Pލ USn% USi=1tJpiTLx^eO \cmmi5i፴r &with8e1C>:::8>enq~,qǵpid2(::: UO(D[x1|s]):::)[xr71],'9andUUpid6=0isde nedrecursivelyasfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.39=9Ifr!}>`0,#thenPisthelist(e1|s;P1;:::;enq~;Pn)wheretheeiNͲareBETA-digitsand=9eachUUPiistherepresentationofpiTL.9sparseTdistributiv9erepresentationβA^pGolynomialp2D[x1|s;:::;xrm]isinterpretedas'9pԲ=Pލin%ii=1diTLx^eivC,#whereadi/ 2D,di/ 6=0,andax^ei standsforxWei;Zcmr51O1 (xWei;2O2ҷ(xWei;rrwith'9ei;j '0.+F*urthermore, {weassumethate19>e2>:::#>enq~, {where觵ek/>eiei;3^|O.'9The8sp}'arse8distributiverepresentation8PofsuchapGolynomialpisthelist(D1|s;E1;D2;E2;:::;Dnq~;En),'9where8Di/istheSACLIB)cinternalrepresentationofdi/andEiisthelist(ei;r ;ei;r71b;:::;ei;1 )'9withUUei;j MbGeingBETA-digits.'9AsUUalwaysinSACLIB(G!,P=0ifp=0.9denseTrecursiv9erepresentation㵲ApGolynomialdpHظ2D[x1|s;:::;xrm]isinterpretedasan'9elementvof(::: UO(D[x1|s]):::)[xrm],DforvsomedomainD.Thedense!r}'ecursiverepresentation'9PofapGolynomialp=Pލ USn% USi=0tJpiTLx^ir.withpid2(::: UO(D[x1|s]):::)[xr71]isde nedrecursively'9asUUfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.A15C39=9Ifɵr>vٲ0,&thenPisthelist(n;Pnq~;Pn1;:::;P0|s)wherethenisaBETA-digitand =9eachUUPiistherepresentationofpiTL.9pQolynomialJPIfthistermappGearsintheparameterspeci cationsofafunction,thisdenotes'9a6pGolynomialinthesparserecursiverepresentation.gOtherwise,=itisusedtodenotea'9pGolynomialUUinarbitraryrepresentation.9baseTdomain,baseringu'IfUUpisanelementofD[x1|s;:::;xrm],Disitsbasedomain.9in9tegralTpQolynomialt³AUUpGolynomialwhosebasedomainisZ.9moQdularTpolynomialxo#AipGolynomialwhosebasedomainisZm ,withmaprimepositive'9BETA-digit.9moQdularTin9tegralpolynomialA pGolynomialMwhosebasedomainisZm :withmapositive'9integer.9rationalTpQolynomialuf?AUUpGolynomialwhosebasedomainisQ.9mainTv\rariableW6JofUUapGolynomialinD[x1|s;:::;xrm]isxr.9degree3The9degreeofapGolynomialw.r.t.agivenvqariableisthehighestpower9ofthisvqari-'9able#appGearingwithnon-zerocoecientinthepolynomial.aMIfnovqariableisspeci ed,'9theUUdegreeiscomputedw.r.t.themainvqariable.9order.TheUUorderofapGolynomialp=Pލ USn% USi=0tJpiTLx^irisUUthesmallestk0suchthatpk6=0.9constan9tTpQolynomialx|AUUpGolynomialofdegree0ineveryvqariable.9leadingTtermROofǦapGolynomialisapolynomialequaltothetermofhighestdegreew.r.t.'9theUUmainvqariable.9reductumCofUUapGolynomialisthepolynomialminusitsleadingterm.9leadingTcoQecien9tlbThe#cleadingcoGecientofapolynomialisthecoecientofitsleading'9term.9leadingTbasecoQecien9tAndelementofthebasedomainequaltothecoGecientofthe'9leadingUpGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9trailingTbasecoQecien9tZ$AnelementofthebasedomainequaltothecoGecientofthe'9smallest\pGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9monicTpQolynomiallAUUpGolynomial,theleadingcoecientofwhichis1.9pQositiv9eTpolynomialu[AUUpGolynomial,theleadingbasecoecientofwhichispGositive.9sign'Anxintegerequalto1iftheleadingbasecoGecientofthepGolynomialispositive,1'9otherwise.9absoluteTv\ralueZofUUapGolynomialpisthepositivepolynomialq.suchthatp=sign7(p)8q[ٲ.9con9tent8qof apGolynomialpisequaltotheabsolutevqalueofthegreatestcommondivisorof'9theUUcoGecientsofp.9in9tegerTcontent_ ۲ofanintegralpGolynomialisanintegerequaltothepGositivegreatest'9commonUUdivisoroftheintegercoGecientsofeachpGowerproGductofthepolynomial.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.A16-C9squarefreeTpQolynomialݵApGolynomialpissquarefreeifeachfactoroccursonlyonce.,In '9otherwords,iifp1=p:e1l1 2bp~ekk hisacompletefactorizationofptheneachoftheei7Jis'9equalUUto1.N9squarefreeTfactorizationQ@Theysquarefreefactorizationofpisp:e1l1 2bp~ekk awhere1je1<'95<ek\andeachofthepiisapGositivesquarefreepGolynomialofpositivedegree.@DNote'9thatUUifpissquarefreethenp^1Ȳisthesquarefreefactorizationofp.9v\rariableT(name)b;Azlist(c1|s;:::;ck됲),wheretheciAareCcharacters.:Example:_thename'9"fubar"UUwouldbGerepresentedbythecharacterlist('f','u','b','a','r').9listTofv\rariables_|RAA&listA,(n1|s;:::;nrm)givingthenamesofthecorrespGondingvqariablesofan'9rG-vqariateUUpolynomialforinputandoutput. 􍍑94.23 VPolynomialffInputandOutput9In thissectionwewilldescribGethepolynomialinputandoutputroutinesthatareavqailable9inKSACLIB).RBeforeKproGceedingfurther, thereadershouldbefamiliarwiththeinternal9representationsUUofpGolynomialswhicharediscussedinSection4.1.2.f94.2.17yRecursivep`olynomialsoverZuT9Theexternalʊc}'anonicalrepresentationofsparser}'ecursivepGolynomialsoverZisde nedby9thefollowingrules.DFirstofall,eachpGolynomialisenclosedinparentheses.DA͝termisrepre-9sentedbythecoGecientimmediatelyfollowedbythevqariable(nospacenor'*'inbGetween).9ThecoGecients+1and1aresuppressedunlesstheexponentofthevqariableis0inwhich9casethevqariableissuppressed.PMThecaret'^'isusedtoindicateexpGonentiation.Exponents9withthevqalue1aresuppressedandifavariablehastheexpGonent0thenthevariable9issuppressed.ʀTheserulesapplyrecursivelytothecoGecientswhichmaythemselvesbGe9pGolynomials.qAUUfewexamplesareinorder.?%?L͉ff)hfdͤ fffdrecursiveUUpGolynomial ffSexternalUUcanonicalform# ffff)h͟ ffy_ ff(5 ff ͤ ff6fdx^4S+82x^3x+36 ff^(-x^4+2x^3-x+3)/̵ ff͟ ffy_ ff(5 ffͤ ff͟fd(x^2S+81)y[ٟ^3,+(x+8)y5 ff((x^2+1)y^3+(x+8)y+(-5)),ß ff͟ ffy_ ff(5 ffͤ fffd(x^2S84)y[ٟ^4,+y[ٟ^2yx ff^((-x^2+4)y^4+(1)y^2+(-1)y+(-x))͟ ff͟ ffy_ ff(5 ffff)h9NoteOthataconstantpGolynomialinr2lvqariableswillbeenclosedinr2lsetsofparentheses.NpF*or 9example,>Qthe8constantpGolynomial2in3vqariableswillberepresentedinexternalcanonical9formUUas(((2))).9The݇algorithmIPREADireadsanrG-vqariaterecursivepolynomialover݇Zinexternalcanon-9ical=formfromtheinputstream.OThepGolynomialthatisreadisstoredininternalcanonical9formandthenumbGerofvqariablesisalsorecorded.OThevariablesarenotstored.OInteger9coGecientsmaybGeofarbitrarylengthbutexponentsmustbGeBETA-digits.]Sincenosort-9ingPispGerformedontheterms,theymustbegiveninorderofdescendingdegree.иThisis9an>2impGortantremarksincealmostallalgorithmsthatmanipulatepolynomialsrequirethat9thejEtermsbGeorderedandviolatingthisrulewillundoubtedlycauseincorrectresultstobe9computedD)andmayevencrashthesystem.lAnotherimpGortantremarkisthattermswhose9coGecientsare0shouldnotbegivenasthesetermswillbestoredandmaycauseproblems,9forUUexampleinequalitytesting.9Although IPREADishappiestwhenapGolynomialisgiveninexternalcanonicalform9asexempli edbythepreviousexamples,theuserisallowedsomefreedom.AnarbitraryA17=ΠC9numbGer)ofspacesmayinterspGersedbetween)thecoecients,Ethevqariables,theexpGonents 9and=thesymbGols'+',B'-'and'^'.MSpacesmaynotbGeinsertedwithinavqariablenorwithinan9integer.F!CoGecientswithmagnitude1aswellastheexponents0and1maybGeexplicitly9given.Thus,forxexample,((x?^2+1)y^3+(1x+8)y^1-(5x^0)y^0)ispGerfectlyvqalid9andUUisequivqalenttothesecondexamplegiveninthetableabGove.9SincebIPREADbwasintendedtobGeusedmainlyforreadingoutputproducedbyprevious9computations,iitisdesignedtobGefastand,consequently*,verylittleerrorcheckingispGer-9formedontheinput. Amongotherthings,BIPREADdoGesnotcheckforconsistencyamong9the%vqariables,Ye.g.8((y)x^2+(z)y)willbGeacceptedasvalidinputandwouldbGeidentical9to((u)v^2+(u)v)ininternalrepresentation.Also,1IPREADdoGesnotcheckforconsistency9amongterms, Ji.e.[eachtermisproGcessedseparatelyanditisnotcheckedwhetherallterms9have~thesamenumbGer~ofrecursivenestings.gF*orexample,B(y^3+(x-1)y)willbeaccepted9althoughYthe rstterm,y^3,isYaunivqariatepGolynomialwhereasthesecond,(x-1)y,isYa9bivqariatepGolynomial.It7 isther}'efore7 ther}'esponsibility7 oftheusertose}'ethatpolynomials9ar}'einputproperly.9Theo~algorithmIPWRITEoxtakesasinputsanrG-vqariaterecursivepGolynomialAoxoverZand9aXlistV?=(v1|s;:::;vrm)XofrvqariablesandwritesAXtotheoutputstreamusingthevariables9spGeci edwithvr dEasthemainvqariableandv1 sasthemostminorvariable. UThelistV9maykbGeinitializedusingVLREADkewhichreadsavqariablelistfromtheinputstream.F*or9generatingByalistwitha xednumbGerByofvqariablesonecouldalsouseanexpressionsuch9asLIST3(LFS("X"),LFS("Y"),LFS("Z")).IHerethefunctionsLFSxisusedforconverting9a7pC76stringtoaSACLIBvqariable.ItispGossibletousethealgorithmIUPWRITEtowrite9univqariaterecursivepGolynomialsbutthisalgorithmwasintendedmainlyasasubroutine9toHbGecalledbyIPWRITE,whichalsohandlesunivqariatepGolynomials,Kandtheuserneednot9evenUUbGeawareofitsexistence.9TherezlisanadditionalsetofinputfunctionsofwhichthetoplevelfunctionisIPEXPREAD.9TheformatacceptedbythisfunctionisabitmoreconvenientasexpressionsmaybGeofthe9form(3?XY^2+X)^3-(YX+Y)(X-1)^2+5.fNotethatIPEXPREADalsotakesa9vqariableYlistasinputandthereforecandetecttheorderofthevariableswithoutrequiring9theUUrecursivestructuremadeexplicitbyparentheses.9T*o$bGemoreprecise, IPEXPREADacceptsanypolynomialexpressionbuiltfromintegers9andvqariablesusing+,>-,blanksformultiplication,>^forexpGonentiation,>andparenthesisfor9grouping.*TheexpressionmaybGeterminatedbyanycharacternotbGeingpartofthelegal9input+set(e.g.apGeriod,&a+semicolon,etc.).^dThisterminatingcharacterisnotremovedfrom9theUUinputstream.9ThetfunctionIPEXPREADRthasthesamespGeci cationasIPEXPREAD,withthedi erence9thatUUitdo}'esremoveUUtheterminatingcharacter.694.2.27yRecursivep`olynomialsoverQuT9F*or )9rG-vqariaterecursivepolynomialsover )9QthealgorithmsRPREAD &and9RPWRITEJ̲areJthecorrespGondinginputandoutputroutines.nEThesituationforrationalpoly-9nomials(isessentiallythesameasthatforintegralpGolynomialswiththeexceptionthatthe9base6coGecientsmaybGerationalnumbGers.kThesamefreedomsonvqalidinputapplyand9an>arbitrarynumbGer>ofspacesmaybeinsertedbeforeandafter'/'..Ifthedenominator9of}abasecoGecientis1thenonlythenumeratorisintheexternalcanonicalrepresen-9tation.ymustappGearinthesameorderthattheyappearinVandthetermsmustbeorderedin9descending'degreeinvrm.5F*orexample,×ifV=(x,y,z)then(4?z^5-y^2z^4+9xyz)9is:vqalidbut(4?z^5+9yxz-y^2z^4):isnotfortwo:reasons| rst,?yappGearsbefore9xintheterm9?yxzandsecond,֖theterm9?yxzappGearsbefore-?y^2z^4which9violatestherulethattermsmustappGearinorderofdescendingdegreeinz.Additionally*,9if"therearetwo"termswiththesamedegreeinvrQIJthentheyshouldbGeorderedaccording9todescendingdegreeinvr71Tandsoon.qCoGecientsmaybGeseparatedfromthevqariables9bytanarbitrarynumbGerofspaces(includingnospaceatall).gV*ariablesmustbGeseparated9by atleastonespaceifthereisnoexpGonentexplicitlygiven,otherwiseanarbitrarynum-9bGerofspacesmayseparatethem.F*orexample(4z^5?-y^2z^4+9xyz)isvqalidbut9(4z^5?-y^2z^4+9xyz)UUisnotsincexyzwillbGetreatedasasinglevqariable.694.2.47yDistributivep`olynomialsoverQ9DistributivepGolynomialsoverQmaybGereadinandwrittenoutusingthealgorithms9DIRPREADXuandXDIRPWRITE.Theonlydi erencebGetweenXrationaldistributivepolynomials9andPintegraldistributivepGolynomialsisthatthebasecoecientsmaybGerationalnumbGers9andnotjustintegers.ItshouldbGeclearafterreadingtheprecedingsubsectionswhat9constitutesUUvqalidinputandwewillnotdiscussthismatterfurther.694.2.57yConversionBetweenRecursiveandDistributive7yRepresentation9Converting recursivepGolynomialstodistributivepGolynomialscanbeachievedbyusing9DIPFPwhich,given5apGolynomialinrecursiveinternalrepresentation,computesanequiv-9alentoneindistributiveinternalrepresentation.YIntheotherdirection,namelytoconvert9from)Kdistributivetorecursiverepresentation,2thealgorithmPFDIP)?isprovided.cBothDIPFP9and˪PFDIPˌworkforpGolynomialsovereitherZorQbutthenumbGerofvqariablesmustbGe9spGeci ed.j=F*or>example,C=ifA>isapolynomialover>Qininternalrecursiverepresentationand9theUUuserwantsUUtodisplayAinexternaldistributiverepresentationthenthecoGdeDIRPWRITE(r,DIPFP(r,A),V);9whereUUrisequaltothenumbGerUUofvqariablesandVisalistofrvariables,willsuce.694.2.67yPolynomialsoverZ2cmmi8m9The6inputandoutputroutinesforpGolynomialsover6ZworkequallywellforpGolynomials 9overUUZm.A19hC94.33 VDomainffIndeps3endentPolynomialArithmetic9Constructors:'9A?<-PFBRE(r,a)9ŲPolynomial'fromBaseRingElement.NBuilds3$anr-variatep}'olyno- =9mialfr}'omanelementofsomedomain.'9A?<-PMON(a,e)zȲPolynomialUUmonomial.qBuildsax^e2fr}'omaande.'9A?<-PBIN(a1,e1,a2,e2)Polynomial8binomial.Builds8a1|sx^e12k+a2x^e2 fr}'oma1;a2;e1,=9ande2|s.9Selectors:'9a?<-PLDCF(A)u˲PolynomialպleadingcoGecient.G>R}'eturnstheleadingcoecientw.r.t.=9themainvariable.'9B?<-PRED(A)pyβPolynomialreductum.`R}'eturnsythereductum(thepolynomialminus=9itsle}'adingterm)w.r.t.themainvariable.'9a?<-PLBCF(r,A)9ŲPolynomial~leadingbasecoGecient.GR}'eturns "thecoecientofthe=9termofthehighestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).'9a?<-PTBCF(r,A)9ŲPolynomial3trailingbasecoGecient.@R}'eturns thecoecientofthe=9termofthelowestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).9InformationTandPredicates:'9n?<-PDEG(A)pyβPolynomialdegree.yR}'eturns.thedegreeoftheargumentw.r.t.the=9mainvariable.'9n?<-PMDEG(A)u˲Polynomial6qmoGdi eddegree.R}'eturnscthedegreeoftheargument,=91ifthear}'gumentis0.'9n?<-PDEGSV(r,A,i)Polynomialdegree,/spGeci edvqariable.}R}'eturns4thedegreeof=9thear}'gumentw.r.t.thei-thvariable.'9V?<-PDEGV(r,A)9ŲPolynomialvtdegreevector.#R}'eturns_alist(d1|s;:::;drm)wherediis=9thede}'greeofargumentw.r.t.thei-thvariable.'9b?<-PCONST(r,A)y²Polynomialdconstant./T;ests"whetherthear}'gumentisaconstant=9p}'olynomial.'9b?<-PUNT(r,A)zȲPolynomialunivqariatetest.wT;estsPwhetherthear}'gumentisauni-=9variatep}'olynomial.'9k?<-PORD(A)pyβPolynomialp7order.mR}'eturns(thesmallestexponentappearinginthe=9ar}'gumentpolynomial(w.r.t.themainvariable).9T ransformation:'9B?<-PSDSV(r,A,i,n)9PolynomialspGecialdecomposition,speci edvqariable.&Com- c=9putesp(x1|s;:::;x:1=nZi յ;:::;xrm)givenp;i;n,andrG.'9B?<-PDPV(r,A,i,n)PolynomialdivisionbypGowerofvqariable.ComputesӴx䍷ni p=9givenp;i,andn.'9B?<-PMPMV(A,k)9ŲPolynomial multiplicationbypGowerofmainvqariable.Computes=9x^nq~pgivenpandn,withxb}'eingthemainvariableofp.'9B?<-PRT(A)k9ѲPolynomial!reciproGcaltransformation.*Computesx^nq~p(x^1 t)withnz==9degL](p).'9B?<-PDBORD(A)zȲPolynomial>dividedbyorder.DjComputesx^n pwher}'enistheorder=9ofp.A20{GC9Con9version^1|s:'9B?<-PFDIP(r,A)9ŲPolynomialdfromdistributivepGolynomial.![Computesap}'olynomial =9inthesp}'arserecursiverepresentationfromapolynomialinthesparsedistributive=9r}'epresentation.'9B?<-PFDP(r,A)zȲPolynomialfromdensepGolynomial.UComputesDap}'olynomialinthe=9sp}'arserecursiverepresentationfromapolynomialinthedenserecursiverepre-=9sentation.9Miscellaneous:'9B?<-PINV(r,A,k)y²PolynomialintroGductionofnewvqariables.GComputesap}'olyno-=9mialinRDz[y1|s;:::;ysF:;x1;:::;xrm]fr}'omapolynomialinRDz[x1|s;:::;xrm].'9B?<-PPERMV(r,A,P)PolynomialpGermutationofvqariables.PComputes82ap}'olynomial=9inCRDz[xp1r;:::;xpr ]fr}'omapolynomialinRDz[x1|s;:::;xrm],lwhere(p1|s;:::;prm)isa=9p}'ermutationof(1;:::;rG).'9B?<-PCPV(r,A,i,j)PolynomialUUcyclicpGermutationofvqariables.'9B?<-PICPV(r,A,i,j)9PolynomialUUinversecyclicpGermutationofvqariables.'9B?<-PTV(r,A,i)9ŲPolynomialUUtranspGosevqariables.'9B?<-PTMV(r,A)zȲPolynomialUUtranspGosemainvqariables.'9B?<-PUFP(r,A)zȲPolynomial,univqariate,fromxpGolynomial.1ComputesZaunivariate=9p}'olynomial0Mfromanr-variatepolynomialbysubstituting0forallvariablesexcept=9themainvariablexrm.'9L?<-PCL(A)k9ѲPolynomialcoGecientlist.ۺR}'eturnsalist(pnq~;:::;p0|s)wherenisthe=9de}'greeofpandthepi3ar}'ethecoecientsofp.!č94.43 VIntegralffPolynomialArithmetic9BasicTarithmetic:'9C?<-IPSUM(r,A,B)IntegralUUpGolynomialsum.'9C?<-IPDIF(r,A,B)IntegralUUpGolynomialdi erence.'9B?<-IPNEG(r,A)9ŲIntegralUUpGolynomialnegative.'9C?<-IPPROD(r,A,B)IntegralUUpGolynomialproduct.'9C?<-IPIP(r,a,B)y²IntegralpGolynomialintegerproGduct.ComputesGc&pgivenan=9inte}'gercandanintegralpolynomialp.'9C?<-IPP2P(r,B,m)IntegralUUpGolynomialpowerUUof2product.'9IPQR(r,A,B;?Q,R)y²IntegralUUpGolynomialquotientandremainder.'9C?<-IPQ(r,A,B)9ŲIntegralUUpGolynomialquotient.'9C?<-IPIQ(r,A,b)y²Integral[pGolynomialintegerquotient.Computesp=cgivenan=9inte}'gralpolynomialpandanintegerc.'9C?<-IPPSR(r,A,B)IntegralUUpGolynomialpseudo-remainder.'9IUPSR(A,B;?ab,bb,C)9IntegralUUunivqariatepGolynomialsemi-remainder.'9B?<-IPEXP(r,A,n)IntegralUUpGolynomialexponentiation.'9s?<-IPSIGN(r,A)y²IntegralUUpGolynomialsign.'9B?<-IPABS(r,A)9ŲIntegralUUpGolynomialabsolutevqalue.9X-ffl) J= "5-:1LSeeXSection4.7foradescriptionofthesparsedistributivÎeandthedenserecursiverepresentations.A21C9Di eren9tiationTandIntegration:؞'9B?<-IPDMV(r,A)9ŲIntegralUUpGolynomialderivqative,mainvqariable.؞'9B?<-IPDER(r,A,i)Integral/pGolynomialderivqative.e3Computesq1thederivativeofthe =9ar}'gumentw.r.t.thei-thvariable.'9B?<-IPHDMV(r,A,k)IntegralEZpGolynomialhigherderivqative,[mainvqariable.ACom-=9putesthek-thderivativeofthear}'gumentw.r.t.themainvariable.'9B?<-IPINT(r,A,b)Integral6pGolynomialintegration.jComputes theinte}'gral ofthe=9ar}'gumentw.r.t.themainvariable.؞9SubstitutionTandEv\raluation:'9C?<-IPSMV(r,A,B)Integral pGolynomialsubstitutionformainvqariable.YSubstitutes=9aninte}'gralpolynomialforthemainvariableofanintegralpolynomial.؞'9C?<-IPSUB(r,A,i,B)9Integral8pGolynomialsubstitution.Substitutes8aninte}'gral8poly-=9nomialforthei-thvariableofaninte}'gralpolynomial.'9C?<-IPGSUB(r,A,s,L)yIntegralpGolynomialgeneralsubstitution..Substitutes`anin-=9te}'gralpolynomialsforallvariablesofanintegralpolynomial.'9B?<-IUPQS(A)u˲IntegralUUunivqariatepGolynomialquotientsubstitution.'9B?<-IPEMV(r,A,a)Integral{~pGolynomialevqaluationofmainvariable.ASubstitutesa=9c}'onstantforthemainvariableofanintegralpolynomial.'9B?<-IPEVAL(r,A,i,a)yIntegralpGolynomialevqaluation.Substitutesac}'onstantfor=9thei-thvariableofaninte}'gralpolynomial.'9b?<-IUPBEI(A,c,m)Integral4univqariatepGolynomialbinaryrationalevaluation,;in-=9tegerUUoutput.'9s?<-IUPBES(A,a)y²IntegralLpunivqariatepGolynomialbinaryrationalevaluationofsign.'9b?<-IUPBRE(A,a)y²IntegralUUunivqariatepGolynomialbinaryrationalevaluation.'9B?<-IPBEILV(r,A,c,k,m)9IntegralpGolynomialbinaryrationalevqaluation,integral=9pGolynomialUUresult,leadingvqariable.'9B?<-IPBREI(r,A,i,c)yIntegral8pGolynomialbinaryrationalevqaluation,qintegralpGoly-=9nomialUUresult.؞9T ransformation:'9B?<-IPTRMV(r,A,h)IntegralYpGolynomialtranslation, mainvqariable. Computes=9p(x8+h)givenpandh,wher}'existhemainvariableofp.؞'9B?<-IPTRAN(r,A,T)IntegralpGolynomialtranslation.?Computes 7p(x1Բ+ at1|s;:::;xry+=9trm)givenpandthetiTL.'9B?<-IPBHT(r,A,i,k)9IntegralUUpGolynomialbinaryhomothetictransformation.'9B?<-IPBHTLV(r,A,k)9IntegralpGolynomialbinaryhomothetictransformation,lead-=9ingUUvqariable.'9B?<-IPBHTMV(r,A,k)9IntegralzrpGolynomialbinaryhomothetictransformation,9main=9vqariable.'9B?<-IUPBHT(A,k)y²IntegralunivqariatepGolynomialbinaryhomothetictransforma-=9tion.'9B?<-IUPIHT(A,n)y²IntegralDunivqariatepGolynomialintegerhomothetictransforma-=9tion.'9B?<-IPNT(r,A,i)y²IntegralUUpGolynomialnegativetransformation.'9B?<-IUPNT(A)u˲IntegralUUunivqariatepGolynomialnegativetransformation.A22/C'9B?<-IPTR(r,A,i,h)IntegralUUpGolynomialtranslation,speci edvqariable.ꍍ'9B?<-IUPTR(A,h)9ŲIntegralUUunivqariatepGolynomialtranslation.'9B?<-IPTR1(r,A,i)IntegralbpGolynomialtranslationby1,espGeci edvqariable.speci- =9 edUUvqariable.'9B?<-IPTRLV(r,A)y²IntegralUUpGolynomialtranslation,leadingvqariable.'9B?<-IPTR1LV(r,A)IntegralUUpGolynomialtranslationby1,leadingvqariable.'9B?<-IUPTR1(A)zȲIntegralUUunivqariatepGolynomialtranslationby1.ꍍ9Predicates:'9t?<-IPCONST(r,A)Integral"pGolynomialconstant.`T;estsewhetherthear}'gumentisa=9c}'onstant.ꍍ'9t?<-IPONE(r,A)9ŲIntegralUUpGolynomialone.qT;estswhetherthear}'gumentis1.9RandomTP9olynomialGeneration:'9A?<-IPRAN(r,k,q,N)9IntegralUUpGolynomial,random.9Con9version:'9IPSRP(r,A;?a,Ab)y²IntegralpGolynomialsimiliartorationalpolynomial.Givena=9r}'ationalpolynomialq[,computesarationalnumbercandanintegralpolynomial=9pwithcp=q[.ꍍ'9B?<-IPFRP(r,A)9ŲIntegralpGolynomialfromrationalpolynomial.Computes)anin-=9te}'gral>=polynomialfromarationalpolynomialwhosebasecoecientsareintegers.9Input/Output:'9IPREAD(;?r,A)u˲IntegralUUpGolynomialread.ꍍ'9IPEXPREAD(r,V;?A,t)9IntegralUUpGolynomialexpressionread.'9IPWRITE(r,A,V)zȲIntegralUUpGolynomialwrite.'9IPDWRITE(r,A,V)9ŲIntegralBPolynomialDistributiveW*rite.FWritesQaninte}'gralQrecur-=9sivep}'olynomialindistributiveform.ꍍ9Con9tentsTandPrimitiv9eParts:'9IPICPP(r,A;?a,Ab)IntegralUUpGolynomialintegercontentandprimitivepart.ꍍ'9c?<-IPIC(r,A)zȲIntegralUUpGolynomialintegercontent.'9Ab?<-IPIPP(r,A)y²IntegralUUpGolynomialintegerprimitivepart.'9d?<-IPICS(r,A,c)IntegralUUpGolynomialintegercontentsubroutine.'9IPSCPP(r,A;?s,C,Ab)9IntegralpGolynomialsign,#content,andprimitivepart.]0Com-=9putesxthesign,c}'ontentandprimitivepartoftheargumentw.r.t.themainvari-=9able.'9IPCPP(r,A;?C,Ab)y²IntegralUUpGolynomialcontentandprimitivepart.'9C?<-IPC(r,A)u˲IntegralUUpGolynomialcontent.'9Ab?<-IPPP(r,A)9ŲIntegralUUpGolynomialprimitivepart.'9IPLCPP(r,A;?C,P)y²IntegralUUpGolynomiallistofcontentsandprimitiveparts.ꍍ9P9olynomialTNorms:'9b?<-IPSUMN(r,A)y²IntegralUUpGolynomialsumnorm.ꍍ'9b?<-IPMAXN(r,A)y²IntegralUUpGolynomialmaximumnorm.A23lC9ChineseTRemainderAlgorithm:'9As?<-IPCRA(M,m,mp,r,A,a)IntegralUUpGolynomialchineseremainderalgorithm.9SquarefreeTF actorization:'9L?<-IPSF(r,A)zȲIntegralUUpGolynomialsquarefreefactorization.'9L?<-IPFSD(r,A)9ŲIntegralUUpGolynomialfactorization,secondderivqative.'9L?<-IPSFSD(r,A)y²IntegralUUsquarefreefactorization,secondderivqative.9ComputationsTinIdeals:'9B?<-IPTRUN(r,D,A)Integral8pGolynomialtruncation.Computes8pmod(x:d1l1ҵ;:::;x^dr፴ri) =9givenpandthediTL.'9C?<-IPTPR(r,D,A,B)9IntegralUUpGolynomialtruncatedproduct.qComputespqmod=9(x:d1l1ҵ;:::;x^dr፴ri)givenp;q[,andthediTL.'9B?<-IPIHOM(r,D,A)IntegralDpGolynomialmodidealhomomorphism. ?Computes=9pmoGd U=9(x:d1l1ҵ;:::;x㍴dr,r 0ncmsy51Ír718)givenanr-variatep}'olynomialpandthediTL.'9C?<-IPIPR(r,D,A,B)9IntegralUUpGolynomialmodidealproduct.qComputespqmod=9(x:d1l1ҵ;:::;x㍴dr,r1Ír718)givenr-variatep}'olynomialspandqandthediTL.'9C?<-IUPTPR(n,A,B)IntegralgGunivqariatepGolynomialtruncatedproduct.Computes =9pqmoGdصx^n egivenunivariatep}'olynomialspandqandaBETA-digitn. o94.53 VMos3dularffPolynomialArithmetic9NotethatthefunctionswhosenamesbGeginwithMI|arebaseduponmodularintegerarith-9metic,~hwhilev1thosebGeginningwithMPv(andMUParebasedupGonmodulardigitarithmetic9withUUaprimemoGdulus^2|s.>w9BasicTarithmetic:'9C?<-MIPSUM(r,M,A,B)yMoGdularUUintegralpolynomialsum.'9C?<-MPSUM(r,m,A,B)9MoGdularUUpolynomialsum.'9C?<-MIPDIF(r,M,A,B)yMoGdularUUintegralpolynomialdi erence.'9C?<-MPDIF(r,m,A,B)9MoGdularUUpolynomialdi erence.'9B?<-MIPNEG(r,M,A)MoGdularUUintegralpolynomialnegation.'9B?<-MPNEG(r,m,A)MoGdularUUpolynomialnegative.'9C?<-MIPPR(r,M,A,B)9MoGdularUUintegralpolynomialproduct.'9C?<-MPPROD(r,m,A,B)yMoGdularUUpolynomialproduct.'9B?<-MPUP(r,m,c,A)MoGdularUUpolynomialunivqariateproduct.'9C?<-MPMDP(r,p,a,B)9MoGdularUUpolynomialmodulardigitproduct.'9C?<-MIPIPR(r,M,D,A,B)MoGdularUUintegralpolynomialmodidealproduct.'9MIUPQR(M,A,B;?Q,R)MoGdularintegralunivqariatepolynomialquotientandremain-=9der.'9MPQR(r,p,A,B;?Q,R)MoGdularUUpolynomialquotientandremainder.'9C?<-MPQ(r,p,A,B)MoGdularUUpolynomialquotient.'9C?<-MPUQ(r,p,A,b)MoGdularUUpolynomialunivqariatequotient.9Qffl) J= "5-:2LSeeXSection3.3fordetailsonmoandB =PލQn%Qi=0:HbiTLx^ir/,thentheSylvestermatrixofAandB-isthe9(m8+n)(m+n)UUsquarematrixC{0.IfM8istheSylvestermatrixof9AIandBq,Kthenfor0ijYSdi >}wherediisas9inUUthepreviousde nition.9Ther}'educedPRSkisobtainedbysettingAi>=prem(Ai2 ;Ai1)=c:i*+1;Zimy,n:whereci>=9ldcfh(Ai2 )UUandid=deg꧟qƴxrB(Ai3)8deg\oqƴxrm (Ai2)UUfor3in,UUwith3C=0.9Althoughitisnotimmediatelyclearfromthede nitions,NabGothsubresultantPRSsas9wellUUasthereducedPRScanbGeshowntobGe,infact,PRSs.9F*orunivqariatepGolynomialsovera eldwemayde newhatisknownasthenatur}'alPRS9de nedHbyAid=Ai2UȵQiTLAi1 ,°Jt(Ai)werefertotheGCDz4ofAandBwewillmeantheGCDz4de ned9byUUthealgorithmsandthiswillbGedenotedbygcdUW(A;Bq).9Algorithms(arealsoavqailableforthecomputationofresultantsofrG-vqariatepolynomials9overRR߲=ZorR=ZpR.Thepackqagealsoprovidesalgorithmsforcomputingthesubresultant9PRS',and'7thereducedPRSforrG-vqariatepolynomialsover'7R߲=ZandthesubresultantPRS9forUUrG-vqariatepolynomialsoverUUR߲=ZpR.96.33 VDe nitionsffofTferms9coarsestTsquarefreebasis5If,A=(A1|s;:::;Anq~)isalistofrG-vqariatepolynomials,4acoars-'9estsquarefreebasisforAisalistB=/(B1|s;:::;Bm)ofpairwiserelativelyprime'9squarefreerG-vqariatepolynomialssuchthateachAi4EinAcanbGeexpressedastheprod-'9uctUUofpGowersUUofelementsofBq.H9discriminan9tQIfkAisanrG-vqariatepolynomialofdegreeninitsmainvqariable,밵n2,'9the?discriminantofAisthe(r1)-vqariatepGolynomialequaltothequotientof'9(1)^n(n1)=2"ɲres/C(A;A^09)Hwhendividedbya,whereA^0{isthederivqativeofAwithrespGect'9toUUitsmainvqariableandaistheleadingcoGecientofA.9 nestTsquarefreebasisA< nestsquarefreebasisBK=(B1|s;:::;Bm)foralistAofrG-'9vqariateZpGolynomialsisacoarsestsquarefreebasisforAwiththeadditionalcondition'9thatUUeachBiisirreducible.9cofactors?If_C{istheGCD9oftwo_pGolynomialsAandBiвthenthecofactorsofAandBq,'9respGectively*,UUareA=C qandBq=C.9ffl) J= "5-:1Lprem(FdAogreatestsquarefreedivisorofapGolynomialAisasquare-'9free+pGolynomialCGthatdividesAandissuchthatanyothersquarefreepGolynomial'9thatUUdividesAalsodividesC.9primitiv9eTpartZTheprimitivepartofapGolynomialAistheabsolutevqalueofA=cwhere'9cUUisthecontentUUofA.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.9squarefreeTfactorizationQ@The<]squarefreefactorizationofAisA=A:e1l1 2bA~ekk Dzwhere<]1'9e1C<8׵<ekandÎeachoftheAiڲisapGositivesquarefreepGolynomialofpositivedegree.'9NoteUUthatifAissquarefreethenA^1ȲisthesquarefreefactorizationofA.9squarefreeTpQolynomialݵAcpGolynomialcAissquarefreeifeachfactoroccursonlyonce.!In'9otherZwords,\]ifAx=A:e1l1 2bA~ekk _isZacompletefactorizationofAtheneachoftheeiAis'9equalUUto1.9univ\rariateTcon9tentn IfAisanrG-vqariatepolynomial,Q|r^hK2,thentheunivqariatecontent'9ofAisaunivqariatepGolynomialinthemostminorvariableequaltotheGCDwofthe'9coGecientsUUofA,whereAisconsideredasanelementof(RDz[x1|s])[x2;:::;xrm].9univ\rariateTprimitiv9epartGivenD.anrG-vqariatepolynomialA,Gr52,theD.univqariateprim-'9itiveLpartofAistherG-vqariatepolynomialA=a,IwhereaistheunivqariatecontentLof'9A.!č96.43 VMethos3dsffandAlgorithms9Injthissectionwebrie ydiscussthemainalgorithmsthatmightbGeofinteresttotheuser9andUUgiveasketchofthemathematicalideasbGehindthesealgorithms.696.4.17yGCDComputationsuT9T*otcomputetheGCDIoftwotunivqariatepGolynomialsovertRg=ݠZpR,&aMPGCDC5proceeds9recursivelyJuntilitarrivesatunivqariatepGolynomialswhereuponMUPGCD*iscalled.FnTheGCD9computedUUismonic.9T*obobtaintheGCD>oftwobrG-vqariateintegralpolynomialsAandB_Ӳonewouldusethe9algorithm IPGCDCwhichalsocomputesthecofactorsofAandBq.InthisalgorithmmoGd-9ularZhomomorphismsandChineseremainderingareusedtoreducetheproblemtoGCD9computationsUUofrG-vqariatepolynomialsoverUUR߲=ZpR,whichissolvedbyMPGCDC.96.4.27yResultantsuT9Using4thealgorithmsuggestedbythede nitionoftheresultant,lnamelytoconstructthe9SylvesterUUmatrixandcomputeitsdeterminant,isnotthemostecientwaytoproGceed.A33")נC9Instead,MUPRESJ#computesJbtheresultantoftwounivqariatepGolynomialsAandBӲover 9R߲=ZpbyUUcomputingthenaturalPRSofAandBƲandbyusingtheidentityK{res>G(A;Bq)=(1)q\" yȴn1  2Y t i=2Rbc㍴di1 Ƿdi+1i&؟\#Ocdn1፴n!9whereUUcid=ldcfc(AiTL),di=deg(AiTL),j=Pލ USk+B2% USi=1'didi+1ɤandA1|s;:::;AnӲisthenaturalPRS.9F*orpcalculatingtheresultantofrG-vqariatepolynomialsoverpR&=ZpR,N6MPRESOp}'olynomialAoverR߲=Z,Oncomputesthepositiveandprimitivegreatestsquare-=9fr}'eedivisoroftheprimitivep}'artofA.'9L?<-IPSF(r,A)zȲIntegralunivqariatepolynomialextendedgreatestcommon =9divisor. ComputestheGCDICoftwounivariatep}'olynomialsAandBfover=9R߲=Zp39aswelltheunivariatep}'olynomialsUandVsuchthatAUO+8BqV=C.'9MUPHEG(p,A,B;?C,V)MoGdular4univqariatepolynomialhalf-extendedgreatestcom-=9monm$divisor.ComputestheGCDɵC`oftwounivariatep}'olynomialsAandB*@over=9R1/=hZpbasÌwelltheunivariatep}'olynomialVpsuchthatAUr+[fBqVVL=Czforsome=9U.A36%_ C9iChapter 729cP8olynomial T{Factorization:97.13 VMathematicalffPreliminaries9Anon-constantpGolynomialA(x1|s;:::;xrm)inRDz[x1;:::;xrm],٣whereR}isauniquefactorization 9domain,issaidtobGeirr}'educibleifAcannotbeexpressedastheproductoftwonon-constant9pGolynomials+inRDz[x1|s;:::;xrm].5dTheproblemoffactoringapolynomialA(x1|s;:::;xrm)isthatof9 ndingFdistinctirreduciblepGolynomialsAiTL(x1|s;:::;xrm)andintegersei,|޵i=1;:::;kP,suchFthat9A=A:e1l1 2bA~ekkj. Suchaanexpressioniscalledac}'ompletefactorizationofA.ThepGolynomials9AiareUUcalledtheirr}'educiblefactorsUUofAandtheintegereiiscalledthemultiplicityofAiTL.!č97.23 VPurps3ose9TheCSACLIB)y4pGolynomialCfactorizationpackqageprovidesfactorizationalgorithmsforR߲=ZpR,9p[asingle-precisionprimeandrE=1,?andforR=ZforrE1.F*orR=Zoneobtains9theqsign,5wintegercontentandpGositiveprimitiveirreduciblefactorsofA,5waswellasthe9multiplicityBofeachirreduciblefactor.kTheintegercontentisnotfactored.kF*orR߲=Zp/the9irreducibleUUfactorsobtainedaremonic.!č97.33 VMethos3dsffandAlgorithms9T*obfactoranarbitraryunivqariatepGolynomialmoduloaprime,$oneshould rstobtaina9similarmonicpGolynomialbyusingthealgorithmMPMON.Havingdonethis,wonethencom-9putesR-thesquarefreefactorsofthemonicpGolynomialbyusingthealgorithmMUPSFF.In9orderɞtofactoreachsquarefreefactoronewoulduseMUPFBL,whichimplementsBerlekqamp's9algorithm.qTheUUirreduciblefactorsreturnedbyMUPFBLaremonic.9F*orfactoringaunivqariateintegralpGolynomial,IUPFACI rstcomputesthesquarefree9factorizationusingthealgorithmIPSF.Thesquarefreefactorsareinturnfactoredusing9IUSFPFffwhichfj rstcomputesafactorizationmoGduloaprimeandthemodularfactorsthus9obtainedEarethenliftedbythequadraticversionoftheHenselconstruction.:IUPFACreturns9theQsign,Rtheintegercontentandalistofirreduciblefactors,Rwithmultiplicities,Roftheinput9pGolynomial.qTheUUirreduciblefactorsreturnedbyIUPFACarepositiveandprimitive.9MultivqariateƜintegralpGolynomialsarefactoredbyusingIPFAC.Thisalgorithm rstcom-9putesthecontentaswellasthesquarefreefactorsoftheprimitivepartoftheinputpGoly-9nomialIandsubsequentlyfactorseachoftheseseparately*.mThefactorizationofasquarefree9primitivepGolynomialisperformedbythealgorithmISFPF֨whichimplementsamultivqariate9lifting{techniquebasedontheHensellemma.9Theliftingisdoneonevqariableatatimeas9oppGosedUUtoliftingseveralvqariablessimultaneously*.A37&fC9If7thepGolynomialAtobefactoredhasrationalbasecoecientsthenitmust rstbGe 9convertedMPtoanintegralpGolynomialbymultiplyingAbytheleastcommonmultipleofthe9denominators` ofthebasecoGecientsandthenconvertingthepGolynomialthusobtainedto9integralrepresentation.RThiscanbGeachievedbyusingIPSRPwhichcomputestheprimitive9andUUpGositiveintegralpGolynomialA^0#aswellastherationalnumbGerasuchthatA=aA^09.!č97.43 VFfunctions9F actorization:'9IPFAC(r,A;?s,c,L)Integral^$pGolynomialfactorization.3F;actorsr-variatep}'olynomi-=9alsoverZ.'9IUPFAC(A;?s,c,L)y²IntegralunivqariatepGolynomialfactorization._QF;actors`univariate=9p}'olynomialsoverZ.'9L?<-MUPFBL(p,A)y²MoGdular8univqariatepolynomialfactorization-Berlekqampalgorithm.=9F;actorsmonicsquar}'efreeunivariatep}'olynomialsoverZpR.9AuxiliaryTF unctionsforFactorization:'9IPCEVP(r,A;?B,L)y²IntegralpGolynomial,#choiceofevqaluationpGoints.]GivenZaninte- =9gr}'al\polynomialAthatissquarefreeinitsmainvariable,gcomputesintegersthat,=9whensubstitute}'dfortheminorvariables,DmaintainthedegreeofAinthemain=9variableanditssquar}'efreeness.'9b?<-IPFCB(V)u˲IntegralspGolynomialfactorcoecientbound.͈Given thede}'gree vec-=9tor*Sofaninte}'gral*SpolynomialA,Ocomputesanintegerbsuchtheproductofthe=9in nity normsofanydivisorsofAislessthanore}'qualto2^bPtimesthein nity=9normofA.'9Lp?<-IPFLC(r,M,I,A,L,D)yIntegralUUpGolynomialfactorlistcombine.'9B?<-IPFSFB(r,A)y²IntegralUUpGolynomial nestsquarefreebasis.'9a?<-IPGFCB(r,A)y²IntegralUUpGolynomialGelfondfactorcoecientbound.'9IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C;?A,B)޹Integral8pGolynomialmodidealquadraticHensel=9lemma.'9L?<-ISFPF(r,A)9ŲIntegralsquarefreepGolynomialfactorization.o2Given#ap}'ositive,=9primitiveinte}'gralpolynomialAthatissquarefreewithrespecttothemainvari-=9able,c}'omputesalistofthedistinctpositiveirreduciblefactorsofA.'9IUPFDS(A;?p,F,C)y²IntegralUUunivqariatepGolynomialfactordegreeset.'9IUPQH(p,Ab,Bb,Sb,Tb,M,C;?A,B)ɹIntegral%univqariatepGolynomialquadraticHensel=9lemma.'9Fp?<-IUPQHL(p,F,M,C)IntegralunivqariatepGolynomialquadraticHensellemma,=9list.'9L?<-IUSFPF(A)zȲIntegralQunivqariatesquarefreepGolynomialfactorization.fGiven{a=9univariate,qp}'ositive,primitive,squarefreeintegralpolynomialA,qcomputesalist=9ofthep}'ositiveirreduciblefactorsofA.'9M?<-MCPMV(n,L)9ŲMatrix>ofcoGecientsofpolynomials,ywithrespecttomainvqari-=9able.'9MIPISE(r,M,D,A,B,S,T,C;?U,V)yMoGdular}integralpolynomialmodideal,solution=9ofUUequation.'9MIUPSE(M,A,B,S,T,C;?U,V)yMoGdularUintegralunivqariatepolynomial,solutionof=9equation.A38't۠C'9MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C;?A,B)yMoGdular8polynomialmodideal,qquadratic =9HenselUUlemma.'9Fp?<-MPIQHL(r,p,F,M,D,C)MoGdular8polynomialmodideal,qquadraticHensellemma,=9list.'9MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C;?A,B,S,T,Dp)9qMoGdularSpolynomialmodideal,=9quadraticUUHensellemmaonasinglevqariable.'9Q?<-MUPBQP(p,A)y²MoGdularunivqariatepolynomialBerlekqampQ-polynomialscon-=9struction.'9L?<-MUPDDF(p,A)y²MoGdular8polynomialdistinctdegreefactorization.Given8amonic,=9squar}'efreepolynomialAoverRy=eZpR,vcomputesalist((n1|s;A1),v:::,v(nk됵;Ak)),=9wher}'ethenijarepositiveintegerswithn1P<)R<)nkandeachAijistheproduct=9ofallmonicirr}'educiblefactorsofAofde}'greeniTL.'9L?<-MUPFS(p,A,B,d)9MoGdularUUunivqariatepolynomialfactorization,special.A39(ؠC9iChapter 829cReal T{Ro otCalculation:98.13 VMathematicalffPreliminaries9Let׵A(x)bGeaunivqariatepolynomialwithintegercoecients. MAqrealnumbGerx0 ]Jwith 9A(x0|s)9=0iscalledar}'ealhrootofA(x).ArealnumbGerx0DvisarootofA(x)ifandonlyif9A(x)isdivisibleby(x}x0|s),i.e.lifthereisapGolynomialBq(x)withrealcoecientssuch9that A(x)'I=(x_Zx0|s)Bq(x).F*oranyrealroGotx0 ofA(x)thereisanaturalnumbGerkߣsuch9that A(x)isdivisibleby(xθx0|s)^kKbut notby(xθx0|s)^k+B+1 .This numbGerk^Riscalledthe9multiplicityroftheroGotx0ofA(x).Rootsofmultiplicityr1arecalledsimpler}'oots.An9intervqalIșcontainingx0|*butnootherrealroGotofA(x),iscalledanisolatingE#intervalforx0|s.9F*orexample, ifA(x)=x^22,theintervqal(2;2)isnotanisolatingintervqalforarealroGot9ofUUA(x),but(0;1000)is.!č98.23 VPurps3ose9TheSACLIB,realroGotcalculationpackqagesolvesnon-linearequationsinonevqariable:FIt9computes!OisolatingintervqalsfortherealroGotsofunivariateintegralpGolynomialsalongwith9theUUmultiplicityofeachroGot,anditre nestheisolatingintervqalstoanyspGeci edsize.!č98.33 VMethos3dsffandAlgorithms9F*orroGotisolationthreemethodsareavqailable./uThec}'oecientsignvariationmetho}'d(or:9mo}'di edUspenskymethod),is-basedonDescartes'ruleofsigns.OOTheCollins-L}'oosmethod9isUUbasedonRolle'stheorem.qSturm'smetho}'disbasedonSturmsequences.9Generally*,&theIcoGecientsignvqariationmethodismanytimesfasterthantheothertwo9methoGds.F*orhthecoecientsignvqariationmethodvqariousmainprogramsareprovidedto9accommoGdateUUdetailsofinputandoutputspeci cations.9F*orXthere nementofisolatingintervqalstoanyspGeci edprecisionasymbGolicversionof9Newton'sUUmethoGdisused.9GivenanarbitraryintegralpGolynomialIPRCH willcalculateallitsrealrootstospeci ed9accuracy*.FTheӣmultiplicityofeachroGotisalsocomputed.FThealgorithmusesthecoecient9sign^vqariationmethoGdtoisolatetherootsfromeachotherandthenappliesNewton'smethod9toUUre netheisolatingintervqalstothedesiredwidth.9GivenlasquarefreeintegralpGolynomialIPRIMXisolatesalltherealrootsfromeachother.9TheroGotsinsideaspeci edopenintervqalareisolatedbyIPRIMO.BothIPRIMandIPRIMO9usethecoGecientsignvqariationmethod.LOthermainalgorithmswhichusethismethod9areUUIPRIMSandIPRIMW.A40)C9TheCollins-LoGosmethodisimplementedinIPRICL:Givenanarbitraryunivqariatein- 9tegralpGolynomialIPRICLgproducesalistofisolatingintervqalsforitsrealroots.>These9intervqalsJhavetheadditionalpropGertythatthe rstderivqativeofAismonotoneoneachof9them.9AneimplementationofSturm'smethoGdisprovidedbyIPRIST:Givenasquarefreeuni-9vqariateUUintegralpGolynomialIPRISTproducesalistofisolatingintervqalsforitsrealroots.9RoGotsWofdi erentpolynomialscanbeisolatedfromeachotherusingtheprogramIPLRRI.9Reference:[QJeremy(hR.Johnson:Algorithmsjforp}'olynomialrealrootisolation.bT*echnical9ResearchcRepGortOSU-CISRC-8/91-TR21,\&1991. NTheOhioStateUniversity*,\&2036Neil9AvenueUUMall,Columbus,Ohio43210,Phone:q614-292-5813.!č98.43 VDe nitionsffofTferms9binaryTrationaln9umbQerWAUUrationalnumbGerUUwhosedenominatorisapowerUUof2.9in9terv\ral9/;AlistunivqariatepGolynomial,Fvariationsforstandardinterval.A43,C9iChapter 929cAlgebraic T{Num8b erArithmetic:99.13 VMathematicalffPreliminaries9AnalgebraicnumbGerisanumberthatsatis esarationalpolynomialequation./Analgebraic 9numbGerԫ %isrepresentedbyanirreduciblepGolynomial,A(x),suchԫthatA( z)Q=0.AԊreal9algebraicTnumbGer,!isarealnumbGerthatisalsoanalgebraicnumbGer,!anditisrepresentedby9anirreduciblepGolynomialandanisolatingintervqaltodistinguishitfromitsrealconjugates.9ThecollectionofalgebraicnumbGersformsa eldcontainingtherealalgebraicnumbGersasa9sub eld.o]SinceNA(x)isirreducible,Otheextension eldQ( z)obtainedbyadjoining Wtothe9rationalbnumbGer eldisisomorphictoQ[x]=(A(x))andelementsofQ( z)arerepresented9by/pGolynomialswhosedegreesarelessthanthedegreeofA(x).eIf 8isrealthenQ( z)isan9orderedUU eldandsigncomputationscanbGeperformedusingtheisolatingintervqalfor z.!č99.23 VPurps3ose9Then`SACLIB)Όalgebraicn`numbGerarithmeticpackqageprovidesalgorithmsforpGerformingarith-9meticvwithalgebraicnumbGers,>withvelementsofanalgebraicnumbGer eld,>andwithpoly-9nomials AwhosecoGecientsbelongtoanalgebraicnumber A eld.Therearealgorithmsfor9computingOthegcdoftwoOpGolynomialswithalgebraicnumberOcoecientsOandforfactoring9a pGolynomialwithalgebraicnumber coecients.YAlgorithms arealsoprovidedforperform-9ingsigncomputationsinarealalgebraicnumbGer eldandforisolatingtherealrootsofa9pGolynomialUUwithrealalgebraicnumberUUcoecients.!č99.33 VMethos3dsffandAlgorithms9AlgorithmsI0forpGerformingalgebraicnumberI0arithmeticuseresultantcomputations.MYLet9A(x)C=Pލ Ѿm% Ѿi=0aiTLx^iϲ=am CCQލ m% i=1 )[(xj i)bGetheintegralminimalpolynomialfor L=C 1oand9letdBq(y[ٲ)=Pލ USn% USjg=0Vbj6y^jY=bn&Qލn%jg=1䞲(yX j6)dbGetheintegralminimalpolynomialfor N4= 1|s.!The9minimalpGolynomialfor 爐+* 3isafactorofres2x(A(x);Bq(yBx))andtheminimalpGolynomial9for' k Cisafactorofresg`xpD(A(x);x^nq~Bq(y[=x)).:LetBq^U(y[ٲ)=Norm(Bq( z;y)),ٜandletQލ ,wt% ,wi=1KnB^q;ZiU(y)9bGe\theirreduciblefactorizationofBq^U(y[ٲ).Providedthenormissquarefreetheirreducible9factorization~ofBq( z;y[ٲ)o=Qލ zt% zi=1qgcd+s(B( z;y[ٲ);B^;ZiU(y[ٲ)).BIf~B^(y[ٲ)~isnotsquarefree,atransla-9tion,7oBq( z;yI!s ),is/computedwhosenormissquarefree.eRThefactorizationofBq( z;y[ٲ)can9bGeUUrecoveredfromthefactorizationofthetranslatedpGolynomial.9SACLIBFalsoqprovidesanalgorithmforcomputingaprimitiveelementofamultiple9extension eld.XLet and bGealgebraicnumbers andconsiderthemultipleextension eld9Q( z; ).^]Theprimitiveelementtheoremstatesthatthereexistsaprimitiveelement Psuch9that,VQ( z; )=Q( 8).dThealgorithmsANPEDE,LandANREPEprovideaconstructiveversionof9thisUUtheorem.9References:IR.G.K.LoGos:ComputingJinAlgebr}'aicExtensions,In\ComputerAlgebra,9SymbGolicUUandAlgebraicComputation",pages173{187.9JeremyʨR.Johnson:\mAlgorithmsforp}'olynomialrealrootisolation.T*echnicalʨResearch9RepGortDOSU-CISRC-8/91-TR21,H1991.lCTheOhioStateUniversity*,H2036NeilAvenueMall,9Columbus,UUOhio43210,Phone:q614-292-5813.A45.ȳC9BarryT*rager:Algebr}'aicF;actoringandRationalF;unctionIntegration,nIn\SYMSAC'76: 9ProGceedingsVofthe1976ACM1SymposiumonSymbolicandAlgebraicComputation",pages9219{226. 099.43 VDe nitionsffofTferms9algebraicTn9umbQerjRA^solution^ofarationalpGolynomialequation.lAnalgebraicnumber^ '9isиrepresentedeitherbyarationalminimalpGolynomialoranintegralminimalpGoly-'9nomial. 9algebraicTin9tegerfHAUUsolutionofamonicintegralpGolynomialequation.9realTalgebraicn9umbQerAArealRnumbGerthatisalsoanalgebraicnumbGer.ZqAArealalgebraic '9numbGer visrepresentedbyanintegralminimalpGolynomialandanacceptableisolating'9intervqal. 9rationalTminimalpQolynomial.ThezrationalminimalpGolynomialforanalgebraicnumber'9 ^ϲisUUtheuniquemonic,irreduciblerationalpGolynomialA(x)suchthatA( z)=0.9in9tegralTminimalpQolynomialRTheQintegralminimalpGolynomialforanalgebraicnumbGer'9 ^ϲisUUtheunique,pGositive,primitive,integralpGolynomialA(x)suchthatA( z)=0.9acceptableTisolatingin9terv\ralOnanisolatingintervqal,jI,forarealalgebraicnumbGer z,'9whereҵIiseitheraleft-opGenandright-closedstandardintervqaloraone-pGointintervqal.9algebraicT eldelemen9tanNrelementoftheextension eldQ( z).o{ N42Q( )Nrisrepresented'9byalist(r;Bq(y[ٲ)),#where N4=rGB( z)andrisarationalnumbGerandB(y[ٲ)isaprimitive'9integralpGolynomialwhosedegreeislessthanthedegreeoftheminimalpolynomial'9ofUU z. 099.53 VRepresentation9Thereareseveraldi erentrepresentationsforelementsofQ( z).LetA(x)bGetheintegral9minimalpGolynomialforanalgebraicnumber Zwithdego(A(x))=m.RAnelement ~ofQ( z)9canUUbGeuniquelyrepresentedby:r1.'9AUUrationalpGolynomial,Bq(x),whosedegreeislessthanmandsuchthatB( z)= .r2.'9Awpairؙ(r;}fe9B (x)),jwhererisarationalnumbGer,}fe9B (x)ؙisapGositiveprimitiveintegral'9pGolynomial,UUand N4=Bq( z)=r}fe9B]V( z).9Theݖdefaultrepresentationis(2). ThealgorithmAFCRrconvertsrepresentation(1)to(2),9andUUthealgorithmAFICRconvertsUUrepresentation(2)to(1).9LetXZ[ z]denotetheZ-moGdulewithbasis1; z; ^2;:::; ^m1މ. iElementsXofZ[ ]are9representedWbyintegralpGolynomialswhosedegreeislessthanm. KIf Ѳisanalgebraic9integer,?thenZ[ z]isaring.IfanalgorithmdoGesnotrequiredivisionorreductionbythe9minimalpGolynomial,0operationsinQ( z)canbereplacedwithoperationsinZ[ z].When9thisispGossible,CeciencyisgainedbyusingtheintegralrepresentationZ[ z].PAnimpGortant9exampleispGolynomialrealrootisolation.nRLetPc( z;y[ٲ)beapolynomialinQ( z)[y[ٲ]andlet9d0bGethegreatestcommondivisorofthedenominatorsofthecoecientsofPc( z;y[ٲ).YThen9dPc( z;y[ٲ)hisinZ[ ;y[ٲ]andhasthesameroGotsasPc( ;y[ٲ).Moreover,cthehcoGecientsign9vqariationRmethoGdforrealrootisolationonlyusesoperationswhichcanbeperformedin9Z[ z].9ThenameofalgorithmswhichopGerateinZ[ z]beginwiththelettersAM.Thealgorithm9AMPSAFP2޲(r;Pc)ҰcomputesapGolynomial}feP9Ѹ2Z[ z;X1;:::;XrG]Ұwhichissimilartothepoly-9nomialO P*2Q( z)[X1;:::;XrG].oThealgorithmAIFANOcomputesanalgebraicinteger~feog ]such9thatUUQ( z)=Q(~feog o).A46/C99.63 VFfunctions9AlgebraicTNum9bQerArithmetic'9ANIIPE(M,I,N,J,t,L;?S,k,K)Algebraic5numbGerisolatingintervqalforaprimitive =9element'9ANPROD(A,I,B,J;?C,K)yAlgebraicUUnumbGerproduct'9ANSUM(A,I,B,J;C,K)AlgebraicUUnumbGersum'9ANPEDE(A,B;C,t)9ŲAlgebraicUUnumbGerprimitiveelementforadoubleextension'9b?<-ANREPE(M,A,B,t)yAlgebraic}numbGerrepresentelementofaprimitiveexten-=9sion9AlgebraicTFieldArithmetic'9c?<-AFDIF(a,b)9ŲAlgebraicUUnumbGer eldelementdi erence'9b?<-AFINV(M,a)9ŲAlgebraicUUnumbGer eldelementinverse'9b?<-AFNEG(a)u˲AlgebraicUUnumbGer eldnegative'9c?<-AFPROD(P,a,b)AlgebraicUUnumbGer eldelementproGduct'9c?<-AFQ(M,a,b)9ŲAlgebraicUUnumbGer eldquotient'9c?<-AFSUM(a,b)9ŲAlgebraicUUnumbGer eldelementsum9RealTAlgebraicNum9bQerSignandOrderComputation'9t?<-AFCOMP(M,I,a,b)yAlgebraicUUnumbGer eldcomparison'9s?<-AFSIGN(M,I,a)AlgebraicUUnumbGer eldsign'9s?<-AMSIGN(M,I,a)AlgebraicUUmoGdulesign'9AMSIGNIR(M,I,a;s,Is)yAlgebraicUUmoGdulesign,intervqalre nement9AlgebraicTP9olynomialArithmetic'9C?<-AFPAFP(r,M,a,B)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld =9elementUUproGduct'9C?<-AFPAFQ(r,M,A,b)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld=9elementUUquotient'9C?<-AFPDIF(r,A,B)AlgebraicUUnumbGer eldpolynomialdi erence'9Ap?<-AFPMON(r,M,A)9AlgebraicUUnumbGer eldpolynomialmonic'9B?<-AFPNEG(r,A)y²AlgebraicUUnumbGer eldpolynomialnegative'9C?<-AFPPR(r,M,A,B)9AlgebraicUUnumbGer eldpolynomialproduct'9AFPQR(r,M,A,B;?Q,R)9AlgebraicUUnumbGer eldpolynomialquotientandremainder'9C?<-AFPSUM(r,A,B)AlgebraicUUnumbGer eldpolynomialsum9AlgebraicTP9olynomialDi erentiationandIntegration'9B?<-AFPDMV(r,M,A)AlgebraicUUnumbGer eldpolynomialderivqative,mainvariable'9B?<-AFPINT(r,M,A,b)yAlgebraicUUnumbGer eldpolynomialintegration'9B?<-AMPDMV(r,M,A)AlgebraicUUmoGdulepolynomialderivqative,mainvariable9AlgebraicTP9olynomialF actorization'9F?<-AFUPFAC(M,B)AlgebraicUUnumbGer eldunivqariatepolynomialfactorizationA470=C'9L?<-AFUPSF(M,A)y²Algebraic:^numbGer eldunivqariatepolynomialsquarefreefactor- =9ization9AlgebraicTP9olynomialGreatestCommonDivisors'9AFUPGC(M,A,B;?C,Ab,Bb)Algebraic2&numbGer eldunivqariatepolynomialgreatest=9commonUUdivisorandcofactors'9B?<-AFUPGS(M,A)y²AlgebraicUUnumbGer eldpolynomialgreatestsquarefreedivisor9AlgebraicTP9olynomialNormComputation'9L?<-AFPNIP(M,A)y²Algebraic+numbGer eldpolynomialnormalizetointegralpoly-=9nomial'9Bs?<-AFPNORM(r,M,B)yAlgebraicUUnumbGer eldpolynomialnorm.9AlgebraicTP9olynomialSubstitutionandEv\raluation'9C?<-AFPCMV(r,M,A,B)yAlgebraicY1numbGer eldpolynomialcompositioninmain=9vqariable'9B?<-AFPEMV(r,M,A,a)yAlgebraicnumbGer eldpolynomialevqaluationofmainvari-=9able'9B?<-AFPEV(r,M,A,i,a)AlgebraicUUnumbGer eldpolynomialevqaluation'9B?<-AFPME(r,M,A,b)9AlgebraicUUnumbGer eldpolynomialmultipleevqaluation'9s?<-AFUPSR(M,I,A,c)yAlgebraic|numbGer eldunivqariatepolynomial,$signatara-=9tionalUUpGoint'9s?<-AMUPBES(M,I,A,c)Algebraic moGduleunivqariatepolynomial,<binaryrational=9evqaluationUUofsign.'9s?<-AMUPSR(M,I,A,c)yAlgebraic:imoGduleunivqariatepolynomial,?signatarational=9pGoint'9B?<-IPAFME(r,M,A,b)yIntegralpGolynomial,*malgebraicnumbGer eldmultipleevqalu-=9ation'9B?<-RPAFME(r,M,A,b)yRationalzpGolynomial,5algebraicnumberz eldmultipleevqal-=9uation9AlgebraicTP9olynomialT ransformations'9B?<-AMUPBHT(A,k)Algebraic8moGduleunivqariatepolynomialbinaryhomothetictrans-=9formation'9B?<-AMUPNT(A)zȲAlgebraicUUmoGduleunivqariatepolynomialnegativetransformation'9B?<-AMUPTR(A,h)y²AlgebraicUUmoGduleunivqariatepolynomialtranslation'9B?<-AMUPTR1(A)9ŲAlgebraicUUmoGduleunivqariatepolynomialtranslationby19RealTAlgebraicP9olynomialRealRoQotIsolation'9N?<-AFUPBRI(M,I,L)9Algebraic%numbGer eldunivqariatepolynomialbasisrealroot=9isolation'9AFUPMPR(M,I,B,J,L;?Js,j)yAlgebraicnumbGer eldpolynomialminimalpolyno-=9mialUUofarealroGot'9b?<-AFUPRB(M,I,A)AlgebraicUUnumbGer eldunivqariatepolynomialrootbound'9L?<-AFUPRICL(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso-=9lation,UUCollins-LoGosalgorithmA4815C'9L?<-AFUPRICS(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso- =9lation,UUcoGecientsignvqariationmethod'9a?<-AFUPRL(M,A)y²Algebraic- numbGer eldunivqariatepolynomial,brootofalinear=9pGolynomial'9n?<-AFUPVAR(M,I,A)9AlgebraicUUnumbGer eldunivqariatepolynomialvqariations'9AMUPMPR(M,I,B,J,L;?Js,j)yAlgebraicW moGduleunivqariatepolynomialminimalpoly-=9nomialUUofarealroGot'9L?<-AMUPRICS(M,I,A)yAlgebraicmoGduleunivqariatepolynomialrealrootisolation,=9coGecientUUsignvqariationmethod'9AMUPRICSW(M,I,A;L,Is)AlgebraicmoGduleunivqariatepolynomialrealrootisola-=9tion,UUcoGecientsignvqariationmethod,weaklydisjointintervqals'9AMUPRINCS(M,I,A,a,b;L,Is)AlgebraicmoGduleunivqariatepolynomialrootisola-=9tion,UUnormalizedcoGecientsignvqariationmethod'9AMUPVARIR(M,I,A;?n,J)Algebraic>moGduleunivqariatepolynomialvqariations,Binter-=9vqalUUre nement9AlgebraicTP9olynomialRealRoQotRe nement'9Js?<-AFUPIIR(M,I,B,J)AlgebraicnumbGer eldpolynomialisolatingintervqalre- =9 nement'9AFUPIIWS(M,I,A,L)Algebraicf9numbGer eldunivqariatepolynomialisolatinginter-=9vqalsUUweaklydisjointtostronglydisjoint'9AFUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹AlgebraicnumbGer eldunivqariatepolyno-=9mialUUrealroGotlistseparation'9Js?<-AFUPRRI(M,I,A,B,J,s1,t1)Algebraic~numbGer eldunivqariatepolynomial=9relativeUUrealroGotisolation'9AFUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicnumbGer eldunivqariatepoly-=9nomialUUrealroGotseparation'9Js?<-AMUPIIR(M,I,B,J)Algebraic^=moGdulepolynomialisolatingintervqalre ne-=9ment'9AMUPIIWS(M,I,A,L)Algebraic8moGduleunivqariatepolynomialisolatingintervqalsweakly=9disjointUUtostronglydisjoint'9AMUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹Algebraic8moGduleunivqariatepolynomialreal=9roGotUUlistseparation'9AMUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicmoGduleunivqariatepolynomial=9realUUroGotseparation9Con9version'9Ap?<-AFCR(A)u˲AlgebraicUUnumbGer eldelementconvertrepresentation'9a?<-AFFINT(M)zȲAlgebraicUUnumbGer eldelementfrominteger'9a?<-AFFRN(R)u˲AlgebraicUUnumbGer eldelementfromrationalnumbGer'9Ap?<-AFICR(A)zȲAlgebraicUUnumbGer eldelementinverseconvertrepresentation'9B?<-AFPCR(r,A)9ŲAlgebraicUUnumbGer eldpolynomialconvertrepresentation'9B?<-AFPFIP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromintegralpolynomial'9B?<-AFPFRP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromrationalpolynomial'9B?<-AFPICR(r,A)y²AlgebraicHnumbGer eldpolynomialinverseconvertrepresenta- =9tionA492 }C'9AIFAN(M;?mh,Mh)9ŲAlgebraicUUintegerfromalgebraicnumbGer'9B?<-AMPSAFP(r,A)Algebraic}moGdulepolynomialsimilartoalgebraic eldpolyno- =9mial'9ANFAF(M,I,a;?N,J)AlgebraicUUnumbGerfromalgebraicnumbGer eldelement9Input/Output'9AFDWRITE(M,I,b,n)AlgebraicUUnumbGer eld,decimalwrite'9AFPWRITE(r,A,V,v)AlgebraicUUnumbGer eldpolynomialwrite'9AFUPWRITE(A,vA,vc)AlgebraicUUnumbGer eldunivqariatepolynomialwrite'9AFWRITE(A,v)pyβAlgebraicUU eldelementwrite'9ANDWRITE(M,I,n)9ŲAlgebraicUUnumbGerdecimalwriteA503C9iAppendix A29cCalling T{GDtHGcmr17GSAYCLIBgW$cFunctions T{from9C49ThischapterdescribGeshowtheSACLIB*&environmenthastobGesetupforSACLIB*&functions 9toUworkcorrectly*.sOWeUwillstartwithaquickintroGductiontothebasicsusingasample9programinSectionA.1.InSectionA.2wedescribGethestepsnecessaryforcombining9dynamicalloGcationwithSACLIB*Wlistprocessing.;SpecialcarehastobetakenwithSACLIB9datastructuresaddressedbyglobalvqariables.мThisisexplainedinSectionA.3.Finally*,9SectionA.4describGeshowSACLIB*c`canbGeinitializedwithoutusingsacMain(),andSection9A.5UUgivessomeinformationonerrorhandlinginSACLIB(G!.!č9A.17ByAffSampleProgram9FigureUUA.1showsthebasiclayoutofaprogramusingSACLIB+vfunctions.9Note%3thattheonlythingwhichisdi erentfromordinaryC%'programsarethe#include9"saclib.h"ܲstatementandthefactthatthemainroutineiscalledsacMaininsteadofmain.9OneimpGortantpointisthattheargcandargvvqariablespassedtosacMainwillnot9contain allcommandlineparameters.Parametersstartingwith\+"are lteredoutand9usedforinitializingsomeSACLIB-globalvqariables.VInformationontheseparametersis9writtenUUoutwhenaprogramiscalledwiththeparameter\+h".9InSectionA.4wegivesomemoredetailsontheinitializationsdonebGeforesacMainis9called.9A.27ByDynamicffMemoryAllos3cationinSACLIB9WhenHoneneedstor}'andomly(asoppGosedtosequentially)accesselementsinadatastructure,9onemayprefertousearraysinsteadoflists.7IfthesizeandthenumbGerofthesearraysis9determinedatruntime,theyhavetobGedynamicallyallocated.W`F*urthermore,onemayneed9toUUmixthemwithlists,inwhichcasethegarbagecollectormustbGeabletohandlethem.9TheQconceptoftheGCAQc(GarbageCollectedArray)handleprovidesthiskindofdynamic9dataUUstructure.9Neverthelessitisrecommendedto rstcheckwhetheritmightbGepossibletoreformulate9the0algorithmsothatlistscanbGeusedinsteadofarrays.BInmanycasesoneusesarraysonly9bGecause {oneismorefamiliarwiththem,talthoughlistsmaybebettersuitedtotheproblem9atUUhand.9ThehfollowingfunctionsaretobGeusedforinitializingGCA39=9GCEff&fǫCHECKe...WThiswillcausethegarbagecollectortocheckthecontentsofthe=9arrayUUforlistorGCAhandles.>39=9GCEff&fǫNOEff&fCHECKm...Withthissetting,thegarbagecollectorwillignorethecontents=9ofthearray*.$Therefore,ߤGCEff&fǫNOEff&fCHECKvshouldonlybGeusedifitisguaranteed=9thatthearraywillnevercontainlistorGCAhandles(e.g.ifitisusedtostore=9BETA-digits).'9If^youarenotsurewhichonetochoGose,HuseGCEff&fǫCHECK,asinappropriateuseof'9GCEff&fǫNOEff&fCHECKUUmaycausetheprogramtocrash.9GCASET(A,i,a)Wy̲setsp!thei-thelementofthearrayreferencedbytheGCAphandleAtothe'9vqalueUUa.qHere,acanbGeanyWord.9a?<-GCAGET(A,i)g9òreturns^_thevqalueofthei-thelementofthearrayreferencedbythe'9GCAUUhandleA.A525*C9FigureUUA.2showshowthemechanismofGCAhandlesisused.I9Hff4. 4.4.4Word,A,L,I,i;4.4.4.9Step2: s,/*Herewedosomeallocation.*/4L=NIL;4do{=ySWRITE("Enteraninteger(0toquit):");I=IREAD();=yA=GCAMALLOC(10,GC_CHECK);=yfor(i=0;i<10;i++)FGCASET(A,i,IDPR(I,i+1));=yL=COMP(A,L);4}4until(ISZERO(I));4.4.4.OGffp\FigureUUA.2:qSamplecoGdeusingGCAhandles.99The6UcoGdeinsidethedo/untilloopreadsanintegerI,allocatesanarrayAof10Words, 9storesothevqalueI8(i+1)3atpGositioniinthearrayusingGCASET(),vandthenappendsa9newUUelementcontainingtheGCAhandleofthearrayAtothebGeginningofthelistL.9Alwaysn\remembGerthatGCAn"handlesmustbGeusedwheneveryouwanttostorereferences9toHSACLIB.$\structuresH(i.e.lists)indynamicallyalloGcatedmemory*.=Usingthestandard9UNIX=functionTmalloc()maycrashyourprogramsometimeafteragarbagecollectionor9atUUleastcausesomestrangebugs.9F*urthermore,GCA~handlesarealsoimplementedinsuchawaythattheycanbGeused9as{inputtolistproGcessingfunctionsinplaceswhereob8jectsareregardedasdata.E.g.9intheCOMP()function,aGCAȢhandlecanbGeusedasthe rstargument(theelementto9bGeUappendedtothelist)butnotasthesecondargument(thelistbeingappendedto).9Nevertheless)notethatthefunctionsLWRITE(),?EXTENT(),^andORDER()arenotde ned9forUUlistscontainingGCAhandles.9ThereEaretwoEmorefunctionstakingGCA6handlesasinput.%It isnotr}'ecommended to9c}'allthesefunctionsdirectly.qDzTheyUUarelistedhereonlyforcompleteness.9p?<-GCA2PTR(A)aƲgives0accesstothearrayreferencedbyaGCA!handle.%YIttakesaGCA'9handleSasinputandreturnsaCCpGointertothearrayofWordsalloGcatedbyaprevious'9callPtoGCAMALLOC().p=ThisCp}'ointermustnotbeusedasinputtoSACLIB,functions'9or'stor}'edinSACLIB+Ajlists.JRather,VitcanbGeusedtoaddresstheelementsofthearray'9directly*.'9Notesthatthisisnottherecommendedwaysofaccessingarrayelements.̿Ifyouover-'9writethevqariablecontainingtheGCAQhandle(e.g.anoptimizingcompilermight'9removeVitifitisnotusedanymore),youVcanstillaccessthearrayusingtheC8pGointer,'9butUUthegarbagecollectorwillfreethealloGcatedmemorythenexttimeitisinvoked.9GCAFREE(A)Gղcan8bGeusedtoexplicitlyfreethememoryallocatedbyGCAMALLOC().hIttakes'9aUUGCAhandleasinputwhichbGecomesinvqalidafterthecall.A5365C'9Y*ouf7shouldconsidercallingGCAFREE()onlyincaseswhereyouaresureyouwillnot '9need(thememoryreferencedbyaGCAhandleanymoreandwanttodealloGcateit'9immediatelyinsteadofputtingthiso untilthenextgarbagecollectionoruntilthe'9SACLIBOcleanup.!č9A.37ByDeclaringffGlobalVfariablestoSACLIB9Ifyouareusingglobalvqariables,arrays,orstructurescontainingSACLIB.OBlistorGCA9handles*otherthanthosede nedwithinSACLIB+F(in\external.c"),2youhavetomakethem9visibleUUtothegarbagecollector.qThisisdonebythefunctionGCGLOBAL().9FigureUUA.3showshowthesemacrosareused:UI9Hff9#include"saclib.h" 9Word!GL=NIL;9Word!GA=NIL;9char!buffer[81];9int%̰flag;9intsacMain(argc,argv)4intargc;4char**argv;9{.../*Variabledeclarations.*/9Step1: s,/*Declareglobalvariables.*/4GCGLOBAL(&GL);4GCGLOBAL(&GA);9Step2: s,/*Initializeglobalvariables.*/4GA=GCAMALLOC(10,GC_CHECK);4.4.4.OGffŲFigureUUA.3:qDeclaringglobalvqariables.99First0twoglobalvqariablesGLandGAoftypGeWord,kaglobalarraybufferof81characters,9andUUaglobalvqariableflagoftypGeintaredeclared.9TheNvqariablesGL(andGAaredeclaredtothegarbagecollectorbycallstoGCGLOBAL()9b}'eforetheyareinitialized.Notethatforthevqariablesbufferandflagthisisnotneces-9saryJbGecausetheywillnotholdSACLIB+`listorGCA?handlesatanytimeduringprogram9execution.9Calling GCGLOBAL onapGointertoaglobalvqariabletellsthegarbagecollectornottofree9cells5orarraysreferencedbythecorrespGondingvqariable.fY*oushouldbecarefulaboutnot9missinganyglobalvqariableswhichoughttobGedeclared:?whiledeclaringtoomuchdoesnot9reallyUUmatter,declaringtoGolittlewillcauseweirdbugsandcrashes...A547BݠC9A.47ByInitializingffSACLIB>HbyffHand9IfnitisdesiredtohavencompletecontrolovercommandlineparametersorifSACLIB*isused 9onlyVaspartofsomebiggerapplication,WWthenthenecessaryinitializationscanalsobGedone9directlyUUwithoutusingsacMain().9ThereUUarethreefunctionswhichareofinterest:9ARGSACLIB(argc,argv;ac,av)doGesrargumentprocessingforSACLIB*commandlineargu-'9ments.bThese&muststartwitha\+"andareusedtosetvqariousglobalvariables.bThe'9argument\+h"causesausagemessagetobGeprinted(byINFOSACLIB()).Thenthe'9programUUisabGorted.'9ARGSACLIBtakes.theargcandargvparametersofmain()asinput.TRItreturnsthe'9numbGerc!ofnon-SACLIB)Tcommandlineargumentsinacandapointertoanarray'9ofnon-SACLIB*commandlineargumentsinav. gThismeansthattheoutputof'9ARGSACLIB()issimilartoargcandargvwiththeexceptionthatallargumentsstart-'9ingUUwith\+"haveUUbGeenremoved.9BEGINSACLIB(p)\ɲinitializessSACLIB-bysalloGcatingmemory*, settingthevqaluesofvarious'9global2vqariables,9etc.f>ItmustbGepassedtheaddressofavariableloGcatedonthestack'9bGeforeanyvqariablecontainingSACLIB+'jstructuressuchaslistsorGCAhandles.^EOne'9vqariableUUwhichful llsthisrequirementisargc,forexample.9ENDSACLIB(f)R9ϲfreesthememoryalloGcatedbyBEGINSACLIB().ItmustbGepassedoneof'9theUUfollowingvqalues(whichareconstantsde nedin\saclib.h"):39=9SACEff&fǫFREEMEMֲ..._ThiswillcauseittoalsofreeallremainingmemoryalloGcated=9byUUGCAMALLOC().39=9SACEff&fǫKEEPMEM3...1ThiswillcauseitnottofreetheremainingmemoryalloGcatedby=9GCAMALLOC().]Nevertheless,#allMGCA=handlesbGecomeinvqalidafterENDSACLIB()=9hasbGeencalled,qsothememorycanonlybeaccessedbyCpointerswhichwere=9initializedkbycallstoGCA2PTR()b}'eforekcallingENDSACLIB().HF*urthermore, if=9anyofthearrayscontainslistorGCAhandles, thesewillalsobGecomeinvqalid, so=9keepingWthealloGcatedmemoryonlymakessensewhenthearrayscontainBETA-=9orUUGAMMA-digits.=9DealloGcationR\thenhastobedonebythestandardUNIXRfunctionfree(),(because=9GCAFREE()UUonlyworkswhentheSACLIB+venvironmentisvqalid.9FigureA.4givesanexampleofhowtheSACLIB,environmentcanbGeinitialized,Cused,9andUUremovedinsideafunction.9ThefunctionsymbolicEff&fǫcomputation()inthisexampleencapsulatesSACLIB*Maspartof9somefbiggerapplicationwhosemainroutineismain()insteadofsacMain().F*romStep29on`theSACLIB+*environment`isinitializedandanySACLIB+*functionmaybGeused.^Outside9theareaenclosedbyBEGINSACLIB?/ENDSACLIB,callstoSACLIB+functionsmaycrashthe9program.!č9A.57BySACLIBp[ErrorffHandling9SACLIB7Xfunctions,donotcheck,whethertheparameterspassedtothemarecorrectand9ful lltheirinputspGeci cations.Callingafunctionwithinvqalidinputswillmostprobably9causeUUtheprogramtocrashinsteadofabGortinginacontrolledway*.9Nevertheless,there_aresituationswhereSACLIB)functionsmayfailandexittheprogram9cleanlyٖwithanerrormessage.F*orexample,:thisisthecasewhenaninputfunctions9discoversUUasyntaxerror.A558LCiX-9Hff9#include"saclib.h" 9voidsymbolic_computation()9{4WordXstack;9Step1: s,/*InitialiseSACLIB.*/4BEGINSACLIB(&stack);9Step2: s,/*UseSACLIB.*/4.4.4.9Step3: s,/*RemoveSACLIB.*/4ENDSACLIB(SAC_FREEMEM);9}OGffTiFigureUUA.4:qSamplecoGdeforinitializingSACLIBbyhand.9AlljEerrorhandling(i.e.writingamessageandabGortingtheprogram)isdonebythe 9functionCFAIL().IfsomemoresophisticatederrorproGcessingisdesired,thesimplestway9isUUtoreplaceitbyacustomwrittenfunction.!č9A.67ByCompiling9TheSACLIB*header lesmustbGevisibletothecompilerandthecompiledSACLIB*library9must4bGelinked.cHowthisisdoneisexplainedinthe\AddendumtotheSACLIB-4User's9Guide",UUwhichshouldbGesuppliedbythepGersoninstallingSACLIB(G!.9A9{pGoint9worthmentioningisthefactthatseveralSACLIB+dfunctionsarealsode nedas9macros.uBydefault,themacroversionsareused,butthereisaconstantforswitchingon9theCfunctionversions:NOEff&fǫSACLIBEff&fMACROSswitcheso allmacrosexceptforFIRST,RED,9SFIRST,SRED,ISNIL,GCASET,GCAGET.TheseelementarylistandGCA²functionsarealways9de nedUUasmacros.9IfUUyouwanttousethisconstant,youmustaddthestatement'9#define?NOEff&fǫSACLIBEff&fMACROS9b}'eforeUUyouincludethe le\saclib.h". 9Alternatively*,,you"canusethe\-D"optionoftheCcompiler(seethe\Addendumto9theUUSACLIB+vUser'sUUGuide"formoreinformation).A569]NC9iAppendix B29GISAYCDLc: pAn T{In8teractiveInterface9to T{GSAYCLIB:9B.16WhatffisISAC&j?9ISAC(Jis8asmallexpGerimentalinteractiveinterfacetoSACLIB'*,qallowingsimpleread--eval--write 9cyclesUUofinteraction.9Thesystemisdesignedandimplementedinthemoststraightforwardway*, sothatits9sourcecoGdecanbeusedasanexampleoratutorialforthosewhowanttoquicklywrite9aninteractivetestenvironmentfortheirSACLIB.basedfunctionsorintendtodevelop9professionalUUinterfacestoSACLIB(G!. $9B.26Supps3ortedffSACLIB>HAlgorithms9AlltheSACLIB,libraryalgorithmsandmacrosareaccessible.,kNILandBETAareavqailable9asUUconstants. $9B.36CommandffLineOptions9ISAC(atakes thestandardSACLIB+ commandlineoptionsforinitializingvqariousglobalvari-9ables.qInUUorderto ndoutwhatisavqailable,issuethecommandM9isac?+h $9B.46InterfaceffFfunctionality9AnEnISAC 'PsessionEnconsistsofoneormorestatements.BEveryEnstatementmustendwitha9semicolonUU`;'.qAstatementcanbGeoneofthethreekinds:9'9commandP9'9call9'9assignment9TheUUcommandssuppGortedinthisversionare:N8,9quit;:F*orUUquittingthesession.p,9vars;:F*ordisplayingthecontentsofthevqariables.V*aluesare :displayedUUininternalSACLIB+vformat.A57:eYC,9help?[ algName]?;:F*ordisplayingageneralhelporanalgorithm.23Forexam- :ple,inordertodisplaythealgorithmIPRODݲ,issuethethe:command: help?IPROD;p,9view?algName;:F*orUUdisplayinganalgorithmwiththeeditorvi(1).,9save?fileName;:F*orsavingthecurrentstateofthesession(i.e.Uthevqariable :binding)UUtoa le.,9restore?fileName;:F*orUUrestoringthestateofasessionfroma le.N89AccallcstatementisacalltoanyproGceduresorfunctionsintheSACLIB)rlibrary*.!GForcexample,-IPFAC(r,A;?s,c,F);-IPWRITE(r,IPSUM(r,A,B),V);9AnUUassignmentstatementisoftheform:-var?:=expression;9F*orUUexample,-A?:=IPROD(a,ISUM(b,c));-a?:=2*3+4;-a?:=3%2;!č9B.56InterfaceffGrammar9Belowקwegiveacontext-freegrammarforasession.W*ehavefollowedthefollowingcon-9ventions:9'9UppGer-caseUUstringsandquotedstringsdenotetokens,9'9Lower-caseUUstringsdenotenon-terminals.9session89:?statement89|?sessionstatement89;9statement89:?command';'89|?proc_call';'89|?assignment';'89;9command89:?IDENT89|?IDENTCMDARGS89;9proc_call89:?IDENT'('proc_arg_star')'89;9assignment89:?IDENT':='exprA58;lРC89; 9proc_arg_star89:?val_star89|?val_star';'ref_star89;9val_star89:?/*empty*/89|?val_plus89;9val_plus89:?expr89|?val_plus','expr89;9ref_star89:?/*empty*/89|?ref_plus89;9ref_plus89:?ref89|?ref_plus','ref89;9ref89:?IDENT9expr89:?expr'+'expr89|?expr'-'expr89|?expr'*'expr89|?expr'/'expr89|?expr'%'expr89|?'+'expr89|?'-'expr89|?'('expr')'89|?func_call89|?atom89;9func_call89:?IDENT'('func_arg_star')'89;9func_arg_star89:?val_star89;9atom89:?IDENT89|?INTEGERA59<sC89;A60=wC9iAppendix C29cNotes T{ontheIn8ternalWorkings9of T{GSAYCLIB:9C.16Lists,ffGCAHandles,andGarbageCollection9C.1.1:yImplementationofListsuT9When*CSACLIB+FRis*Cinitialised,2thearraySPACEcontainingNU+1WordsisalloGcatedfromthe 9heap.ewThis0farrayisusedasthememoryspaceforlistproGcessing.Listsarebuiltfromc}'ells,9whicharepairsofconsecutiveWordsthe rstofwhichisatanoGddpositionintheSPACE9array*.BList;handlesb(\pGointers"tolists)arede nedtobGeBETAplustheindexofthe rstcell9ofthelistintheSPACEarraywiththehandleoftheemptylistbGeingNIL(whichisequal9toUUBETA).FigureC.1showsthestructureoftheSPACEarray*.`~99.SPACE.32fdGO line10QVV*eSfeiʟfeifefefeiʎtfefefefefefe932fdй32fd932fdӹ32fd932fd932fdй32fd932fdӹ32fd932fdع< lcircle10p9pp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdSfeKʟfeKfefefeKʎfefefe-fe8卍9V*alueUUofthe T9SACLIB Ǎ9listUUhandle:qBETA+j0y135tfe32v32fe32Ήfe|932fe32Ήfe32fefe32932feǍ|cellfe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe3232fe32Ήfe932fe32Ήfe32feΆfe32932feǍcellKNU-3KNU-1fe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe32 32fe32--Ήfe&932fe32--Ήfe/32fe<fe325932feǍ&cell FigureUUC.1:qTheSPACEarray*.r9The rstWordofeachcellisusedtostorethehandleofthenextcellinthelist(i.e.9thevqaluereturnedbyRED()),RwhilethesecondWordcontainsthedataofthelistelement9representedbythecell(i.e.thevqaluereturnedbyFIRST()).FigureC.2givesagraphical9representationUUofthecellstructureforasamplelist.qThearrowsstandforlisthandles.L~9L"fe"9?ppp32fd932fd32fd932fd 32fd32fd932fd32fd932fd 32fd!ӎfe(ʟfe(fefefe(ʎ6feJ932fdK32fdM932fdN32fdP932fdJ932fdK32fdM932fdN32fdP932fdQpVp[pQpVp[p[32fd]932fd^32fd`932fda32fd[32fd]932fd^32fd`932fda32fdbӎfe(ʟfe(fefefe(ʎwfe932fd32fd932fd32fd932fd932fd32fd932fd32fd932fdpppppp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe932fd͹32fd932fdй32fd932fd932fd͹32fd932fdй32fd932fdӹpعpݹpӹpعpݹpݹ32fd932fd32fd932fd32fdݹ32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe 932fd32fd932fd32fd932fd 932fd32fd932fd32fd932fdpppppp32fd 932fd!32fd#932fd$32fd32fd 932fd!32fd#932fd$32fd%ӎfe(ʟfe(fefefe(ʎ:feN932fdO32fdQ932fdR32fdT932fdN932fdO32fdQ932fdR32fdT932fdUpZp_p,9q,fe,932fd7cfec9?m9qmfem932fd7fe9?9qfe932fd7&fe&9?㍑=19YNIL㍒8㍒99(YNIL㍒A69qfe92fddfe96V>FigureUUC.2:qThecellstructureofthelistL=(1;(9;6);8).9AspalreadymentionedinChapter2,vatomsarerequiredtobGeintegersawithBETA<9a7w]C9tothememoryaddressesofSPACE[BETA]andSPACE[BETA+1],respGectively*.AThisis 9usedqbythefunctionsFIRST(L),whichreturnsSPACEB1[L],andRED(L),whichreturns9SPACEB[L].9C.1.2:yImplementationofGCAHandlesuT9When'SACLIB.Vis'initialised, [thearrayGCASPACEcontainingNUp+!k1structuresoftypGe9GCArray<>isalloGcated.&A<GCAh!handleisde nedtobeBETApplustheindexofthecorre-9spGondingUUGCArraystructureintheGCASPACEarray*,withthenullhandlebGeingNIL.9TheUUGCArraystructurecontainsthefollowing elds:Cy9'9nextoʲ...taWord,usedforlinkingemptyGCArraystotheGCAAVAILlistandformarking'9(seeUUSectionC.1.3).!9'9flagUU...aWord,settooneofGCEff&fǫCHECKandGCEff&fNOEff&fCHECK(seeSectionC.1.3).9'9lenUU...aWord,thelengthofthearrayinWords.9'9arrayUU...aCpGointertoanarrayofWordsofsizelen.9When9GCAMALLOC()(iscalled,rittakesthe rstGCArrayfromtheGCAAVAILlistand 9initializesUUits elds.9GCA2PTR()UUsimplyreturnstheCpGointerinthearray eld.9GCAFREE()iSdealloGcatesthememoryaddressedbythearray eld,nRsetsall eldstozero,9andUUlinkstheGCArraytothebGeginningoftheGCAAVAILlist.9C.1.3:yTheGarbageCollectoruT9Garbage]Xcollectionisinvoked]XwhenCOMP()orGCAMALLOC()callGC()inthecaseofAVAIL9orUUGCAAVAILbGeingNIL.ThegarbagecollectorconsistsoftwoUUparts:9'9The'functionGC()issystemdepGendent. T=Itmustensurethatthecontentsofall'9proGcessor registersarepushedontothestackandpassalignmentinformationandthe'9addressUUoftheendofthestacktoGCSI().!9'9GCSI()visthesystemindepGendentpartofthegarbagecollector.ժItusesamark-and-'9sweepUUmethoGdforidentifyingunusedcells:'9Marking:ZTheproGcessorregisters,Wthesystemstack,andthevqariablesandGCA=9arraysItowhichpGointersarestoredintheGCGLOBALSlistaresearchedfornon-=9NIL listandGCAhandles.AAllthecellsaccessiblefromthesehandlesaremarked=9byUUacalltoMARK(). ލ=9If̓alisthandleisfound,thisfunctiontraverses̓thecellsofthelist,markingthem=9bynegatingthecontentsoftheir rstWord.\IfthesecondWordofacellcontains=9aUUlistorGCAhandle,MARK()callsitselfrecursivelyonthishandle.=9InCcaseofaGCAChandle,ZtheGCAcelladressedbythehandleismarkedby=9negating~thecontents~ofitsnext eld. AIfthecell'sflag eldisnotsetto=9GCEff&fǫNOEff&fCHECK,theWordsinthearraypGointedtobythearray eldaresearched=9forUUlistorGCAhandleswithMARK()callingitselfrecursivelyonvqalidhandles.!'9Sw9eeping:^:InUUthesweepstep,theAVAILandGCAAVAILlistsarebuilt:=9Cells~inSPACEwhose rstWordcontainsapGositivevqaluearelinkedtotheAVAIL=9list.[If/the rstWordofacellcontainsanegativevqalue, jitismadepGositiveagain=9andUUthecellisnotchangedinanyotherway*.=9CellsinGCASPACEwhosenext eldcontainsapGositivevqaluearelinkedtothe=9GCAAVAILlistandthearraypGointedtobythearray eldisdealloGcated.Ifthe=9next4Ų eldcontainsanegativevqalue,;HitismadepGositiveagainandthecellisnot=9changedUUinanyotherway*.A62?C9IfmtheAVAILlistcontainsnomorethanNU g=RHOdcellsattheendofgarbagecollection,an 9errorUUmessageiswrittentotheoutputstreamandtheprogramisabGorted.!9C.26ConstantsffandGlobalVfariables9This+sectionlistsSACLIB,R"typGes,constants,and+globalvqariables.HAlltypGesandconstants9areqde nedin\saclib.h",?8\sactypGes.h",andq\sacsys.h".Externalvqariablesarede nedin9\external.c"UUanddeclaredasexternalin\saclib.h".9Thei%averageuserofSACLIB-functionsshouldnot nditneccessarytodealdirectly9withanyofthesevqalues(exceptforWord,hBETA,andNIL,whicharealsomentionedinother9sections).CXIfyoumoGdifyanyofthevqalueslistedbGelowwithoutknowingwhatyouaredoing,9youUUmayeithercrashSACLIB+vorcauseittoproGducefalseresults,sopleasetakecare![9Notation:r,InՈthedescriptionbGelow,5p}'ointermeansaC%pointer(i.e.anactualmemory9address)®andp}'ointertoanarray®meansaC‘pGointertothe rstelementofanarray*.List9handleVmeansaSACLIB-Blisthandle(i.e.anintegerLwithBETAĸtL "5-:2LThis٠isequaltoSBETA.FJorhistoricalreasons,ڲinsomeSAÎCLIB%functionsSBETAisexplicitlyusedinsteadofXSNIL.A63@C9BelowUUwegivealistoftheSACLIB+vglobalvqariablesasde nedin\external.c":}9ListTproQcessingandgarbagecollection:ԍ39=9AVAILUU...aWord,thelisthandleofthefreelist.ԍ39=9GCGLOBALSUU...aWord,thelisthandleofthelistofglobalvqariables.39=9BACSTACKUU...apGointertothebeginningofthesystemstack.39=9GCCUU...aWord,thenumbGerofgarbagecollections.39=9GCACUU...aWord,thenumbGerofGCAcellscollectedinallgarbagecollections.39=9GCCCUU...aWord,thenumbGerofcellscollectedinallgarbagecollections.39=9GCMN...?aWord,OifGCMNis1,amessageiswrittentotheoutputstreameachtime =9theUUgarbagecollectoriscalled.39=9NU...9eaWord,onelessthanthesizeoftheSPACEarrayinWords,i.e.twicethe=9numbGerUUofcellsinSPACE.39=9RHOT...taWord,!thegarbagecollectorabGortstheprogramifnomorethanNU JN=RHO=9cellsUUwerereclaimed.39=9SPACEBUU...apGointertoanarrayofwords,SPACEB%[=SPACE?8BETA8Բ.39=9SPACEB1UU...apGointertoanarrayofwords,SPACEB1*X=SPACE?8BETA1xѲ.39=9GCAAVAILUU...aWord,theGCAhandleofthefreelistofGCAcells.39=9GCASPACE #...apGointertoanarrayofGCArraystructures,thememoryspacefor=9GCAUUcells.39=9GCASPACEBpݲ...tapGointertoanarrayofGCArraystructures,&GCASPACEBp>ٲ==9GCASPACEir8BETApxѲ.39=9NUp,...aWord, onelessthanthenumbGerofGCArraystructuresintheGCASPACE=9array*.39=9BETApM...aWord,*thebGoundusedtodistinguishbetweenlistandGCA@handles.=9BETApZ@=BETA+8NU+81.39=9BETApp7...EaWord,=theuppGerboundonGCA7GCAhandles.gBETApp&=BETApu+=9NUpO2̲+81.ԍ9Timing:39=9TAUUU...aWord,thetime(inmilliseconds)spGentforgarbagecollections.ԍ39=9TAU0ł...p,aWord,thesystemtime(inmilliseconds)justbGeforeSACLIB,|initial-=9ization.39=9TAU1Y...aWord,thesystemtime(inmilliseconds)immediatelyafterSACLIB=9initialization.ԍ9In9tegerTarithmetic:ќ39=9DELTAUU...aWord,DELTA \^=2^bZETA=2c&L.ќ39=9EPSILUU...aWord,EPSIL \^=2^dZETA=2e)d=BETA =DELTA?.39=9ETAUU...aWord,ETAd=blog ꬟qƱ10:BETA,.c.39=9RINCUU...aWord,theincrementfortherandomnumbGergenerator.39=9RMULTUU...aWord,themultiplierfortherandomnumbGergenerator.39=9RTERMUU...aWord,thelastvqalueproGducedbytherandomnumbGergenerator.39=9TABP2UU...apGointertoanarrayofWords,TABP2F[i]=2^i1for1iZETA .39=9THETAUU...aWord,THETA \^=10^fCscmtt8fETA .A64A=C39=9UZ210UU...aWord,thelisthandleofthelistofunitsofZ210 uY.39=9ZETAUU...aWord,ZETAa=logğqƱ2BETA*Ӳ.9PrimeTn9umbQers:39=9NPFDSUU...aWord,thenumbGerofprimesusedbytheSACLIB+vfunctionIUPFDS.39=9NPRIMEUU...aWordcontrollingthenumbGerofprimesinPRIME.39=9PRIMEp...+aWord,wKthelisthandleofthelistofprimesbGetweenBETArJNPRIME$ =9ZETATrɸ87=5UUandBETA.39=9NSMPRMUU...aWord,theuppGerboundonthesizeofprimesinSMPRM.39=9SMPRMUU...aWord,thelisthandleofthelistofprimes<NSMPRM"G.9Miscellaneous:39=9NPTR1UU...aWord,thenumbGerofWordsintheGCAPTR1array*.39=9GCAPTR1I[...aWord,KtheGCAIXhandleofthearrayusedbythefunctionIUPTR1.9Input/Output:39=9LASTCHARUU...aWord,thelastcharacterreadfromtheinputstream.A65BʱCG9cIndex.卍G9BETA,UU63 9NIL,UU4,639AADV,UU6,129absoluteUUvqalue"9ofUUapGolynomial,169ADV,UU59ADV2,UU69ADV3,UU69ADV4,UU69AFCOMP*,UU479AFCR,UU499AFDIF,UU479AFDWRITE,UU509AFFINT,UU499AFFRN,UU499AFICR,UU499AFINV,UU479AFNEG,UU479AFP*AFP,UU479AFP*AFQ,UU479AFPCMV,UU489AFPCR,UU499AFPDIF,UU479AFPDMV,UU479AFPEMV,UU489AFPEV,UU489AFPFIP*,UU499AFPFRP*,UU499AFPICR,UU499AFPINT,UU479AFPME,UU489AFPMON,UU479AFPNEG,UU479AFPNIP*,UU489AFPNORM,UU489AFPPR,UU479AFPQR,UU479AFPROD,UU479AFPSUM,UU479AFPWRITE,UU509AFQ,UU479AFSIGN,UU479AFSUM,UU479AFUPBRI,UU48GAFUPFAC,UU47 AFUPGC,UU48AFUPGS,UU48AFUPIGIR,UU49AFUPIGIWS,UU49AFUPMPR,UU48AFUPRB,UU48AFUPRICL,UU48AFUPRICS,UU49AFUPRL,UU49AFUPRLS,UU49AFUPRRI,UU49AFUPRRS,UU49AFUPSF,UU48AFUPSR,UU48AFUPVAR,UU49AFUPWRITE,UU50AFWRITE,UU50AIFAN,UU50algebraic eldUUelement,46integer,UU46numbGer,UU46numbGer,UUreal,46AMPSAFP*,UU50AMSIGN,UU47AMSIGNIR,UU47AMUPBES,UU48AMUPBHT,UU48AMUPIGIR,UU49AMUPIGIWS,UU49AMUPMPR,UU49AMUPNT,UU48AMUPRICS,UU49AMUPRICSW,UU49AMUPRINCS,UU49AMUPRLS,UU49AMUPRRS,UU49AMUPSR,UU48AMUPTR,UU48AMUPTR1,UU48AMUPVARIR,UU49ANDWRITE,UU50ANFAF,UU50ANIGIPE,UU47A66CC9ANPEDE,UU47 9ANPROD,UU479ANREPE,UU479ANSUM,UU479AREAD,UU79ARGSACLIB,UU559atom,UU49AWRITE,UU79baseUUdomain,169baseUUring,169basis"9coarsestUUsquarefree,32"9 nestUUsquarefree,329BEGINSACLIB,UU559binaryUUrationalnumbGer,UU419CCONC,UU69ceiling,UU109cell,UU49CINV,UU79coGecient"9leading,UU16"9leadingUUbase,16"9trailingUUbase,169cofactors,UU329COMP*,UU59COMP2,UU59COMP3,UU59COMP4,UU59compGosition,UU59CONC,UU69concatenation,UU59constantUUpGolynomial,169content,UU16,33"9integer,UU16"9univqariate,UU339DAND,UU129DEGCD,UU119degree,UU169denseUUrecursiverepresentation,159destructive,UU59DGCD,UU119digit,UU9"9BETA-,UU9"9GAMMA-,UU9"9moGdular,UU99DIGIPREAD,UU269DIGIPWRITE,UU279DIPDEG,UU279DIPFP*,UU269DIPINS,UU279DIRPREAD,UU27DIRPWRITE,UU27 discriminant,UU32disjointUUintervqals,41DLOG2,UU12DMPPRD,UU27DMPSUM,UU27DMUPNR,UU27DNIMP*,UU12DNOT,UU12DOR,UU12DPCC,UU12DPFP*,UU27DPGEN,UU11DPR,UU10DQR,UU10DRAN,UU11DRANN,UU11DSQR*TF,UU11elementofUUalist,4ENDSACLIB,UU55EQUAL,UU6EXTENT,UU6extent,UU5factorizationcomplete,UU37squarefree,UU17,33FIRST,UU6FIRST2,UU6FIRST3,UU6FIRST4,UU6 oGor,UU10FOUR*TH,UU6GC,UU62GCffCHECK,UU52GCffNOffCHECK,UU52GCA2PTR,UU53GCAFREE,UU53GCAGET,UU52GCAMALLOC,UU52GCASET,UU52GCSI,UU62handleofUUaGCA,51ofUUalist,4IABSF,UU11IBCIND,UU12IBCOEF,UU12IBCPS,UU12ICOMP*,UU11A67DQC9IDEGCD,UU11 9IDIF,UU109IDIPR2,UU129IDP2,UU129IDPR,UU109IDQ,UU109IDQR,UU109IDREM,UU119IEGCD,UU119IEVEN,UU119IEXP*,UU119IFACT,UU119IFACTL,UU129IFCL2,UU129IGCD,UU119IGCDCF,UU119IHEGCD,UU119ILCM,UU119ILCOMB,UU129ILOG2,UU129ILPDS,UU119ILWRITE,UU129IMAX,UU119IMIN,UU119IMP2,UU129IMPDS,UU119INEG,UU109in ectionlessUUisolatingintervqal,419in ectionlessUUisolationlist,419integer,UU9"9BETA-,UU9"9GAMMA-,UU9"9algebraic,UU46"9moGdular,UU99integerUUcontent,169integralUUpGolynomial,169intervqal,UU41"9isolating,UU41,9acceptable,UU46,9in ectionless,UU41,9strongly*,UU41,9weakly*,UU41"9standard,UU419intervqals"9disjoint,UU41,9strongly*,UU419INV,UU79inverse"9ofUUalist,59IODD,UU119IORD2,UU129IP*ABS,UU219IP*AFME,UU489IPBEILV,UU22IPBHT,UU22 IPBHTLV,UU22IPBHTMV,UU22IPBREI,UU22IPC,UU23,34IPCEVP*,UU38IPCONST,UU23IPCPP*,UU23,34IPCRA,UU24IPCSFB,UU35IPDER,UU22IPDIF,UU21IPDMV,UU22IPDSCR,UU35IPDWRITE,UU23IPEMV,UU22IPEVAL,UU22IPEXP*,UU21IPEXPREAD,UU23IPFAC,UU38IPFCB,UU38IPFLC,UU38IPFRP*,UU23IPFSD,UU24IPFSFB,UU35,38IPGCDC,UU34IPGFCB,UU38IPGSUB,UU22IPHDMV,UU22IPIC,UU23IPICPP*,UU23IPICS,UU23IPIHOM,UU24IPIGIWS,UU42IPINT,UU22IPIP*,UU21IPIPP*,UU23IPIPR,UU24IPIQ,UU21IPIQH,UU38IPLCPP*,UU23,34IPLRRI,UU42IPMAXN,UU23IPNEG,UU21IPNT,UU22IPONE,UU23IPOWER,UU11IPP2P*,UU21IPPGSD,UU35IPPNPRS,UU42IPPP*,UU23,34IPPROD,UU21IPPSC,UU35IPPSR,UU21A68EC9IPQ,UU21 9IPQR,UU219IPRAN,UU239IPRCH,UU419IPRCHS,UU419IPRCN1,UU419IPRCNP*,UU419IPREAD,UU239IPRES,UU359IPRICL,UU429IPRIM,UU429IPRIMO,UU429IPRIMS,UU429IPRIMU,UU429IPRIMW,UU429IPRIST,UU429IPROD,UU109IPRODK,UU109IPRPRS,UU369IPRRIGI,UU429IPRRLS,UU429IPRRRI,UU429IPRRS,UU429IPSCPP*,UU23,349IPSF,UU24,359IPSFBA,UU359IPSFSD,UU249IPSIFI,UU429IPSIGN,UU219IPSMV,UU229IPSPRS,UU369IPSRM,UU429IPSRMS,UU429IPSRP*,UU239IPSUB,UU229IPSUM,UU219IPSUMN,UU239IPTPR,UU249IPTR,UU239IPTR1,UU239IPTR1LV,UU239IPTRAN,UU229IPTRLV,UU239IPTRMV,UU229IPTRUN,UU249IPVCHT,UU429IPWRITE,UU239IQ,UU109IQR,UU109IRAND,UU119IREAD,UU129IREM,UU109IROOT,UU119ISA*TOM,UU6ISEG,UU12 ISFPF,UU38ISIGNF,UU11ISLIST,UU6ISNIL,UU6ISOBJECT,UU6ISPD,UU11ISPSFB,UU35ISPT,UU11ISQR*T,UU11ISSUM,UU12ISUM,UU10ITRUNC,UU12IUPBEI,UU22IUPBES,UU22IUPBHT,UU22IUPBRE,UU22IUPCHT,UU43IUPFAC,UU38IUPFDS,UU38IUPIHT,UU22IUPIGIR,UU42IUPNT,UU22IUPQH,UU38IUPQHL,UU38IUPQS,UU22IUPRB,UU42IUPRC,UU35IUPRLP*,UU42IUPSR,UU21IUPTPR,UU24IUPTR,UU23IUPTR1,UU23IUPVAR,UU43IUPVOI,UU43IUPVSI,UU43IUSFPF,UU38IWRITE,UU12LASTCELL,UU6LBIBMS,UU7LBIBS,UU7LBIM,UU7LCONC,UU6LDSMKB,UU29LDSSBR,UU29leadingUUbasecoGecient,16leadingUUcoGecient,16leadingUUterm,16LEINST,UU7LEL*TI,UU6LENGTH,UU6lengthofUUalist,5A69FĠC9LEROT,UU7 9LEXNEX,UU79LINS,UU79LINSR*T,UU79list,UU4"9empty*,UU4"9ofUUcharacters,17"9ofUUvqariables,179LIST1,UU59LIST10,UU59LIST2,UU59LIST3,UU59LIST4,UU59LIST5,UU59LMERGE,UU79LPERM,UU79LREAD,UU79LSRCH,UU69LWRITE,UU89mainUUvqariable,169MAIPDE,UU299MAIPDM,UU299MAIPHM,UU309MAIPP*,UU299MCPMV,UU389MDCRA,UU139MDDIF,UU139MDEXP*,UU139MDHOM,UU139MDINV,UU139MDLCRA,UU139MDNEG,UU139MDPROD,UU139MDQ,UU139MDRAN,UU139MDSUM,UU139MEMBER,UU69MIAIM,UU309MICINS,UU309MICS,UU309MIDCRA,UU139MIDIF,UU139MIEXP*,UU139MIHOM,UU139MIGINV,UU139MINEG,UU139MINNCT,UU309MIPDIF,UU249MIPFSM,UU259MIPHOM,UU259MIPIPR,UU249MIPISE,UU389MIPNEG,UU24MIPPR,UU24 MIPRAN,UU25MIPROD,UU13MIPSUM,UU24MIQ,UU13MIRAN,UU13MISUM,UU13MIUPQR,UU24MIUPSE,UU38MMDDET,UU29MMDNSB,UU29MMPDMA,UU29MMPEV,UU30MMPIQR,UU25moGdulardigit,UU9integer,UU9integralUUpGolynomial,16pGolynomial,UU16symmetric,UU9monicUUpGolynomial,16MPDIF,UU24MPEMV,UU25MPEVAL,UU25MPEXP*,UU25MPGCDC,UU34MPHOM,UU25MPINT,UU25MPIQH,UU39MPIQHL,UU39MPIQHS,UU39MPMDP*,UU24MPMON,UU25MPNEG,UU24MPPROD,UU24MPPSR,UU25MPQ,UU24MPQR,UU24MPRAN,UU25MPRES,UU35MPSPRS,UU36MPSUM,UU24MPUC,UU25,34MPUCPP*,UU25,34MPUCS,UU25,34MPUP*,UU24MPUPP*,UU25,34MPUQ,UU24MUPBQP*,UU39MUPDDF,UU39MUPDER,UU25MUPEGC,UU36MUPFBL,UU38MUPFS,UU39A70GC9MUPGCD,UU35 9MUPHEG,UU369MUPRAN,UU259MUPRC,UU359MUPRES,UU359MUPSFF,UU25,359name"9ofUUavqariable,179negative,UU109non-negative,UU109non-pGositive,UU109numbGer"9algebraic,UU46"9rational,UU10"9realUUalgebraic,469ob8ject,UU59ORDER,UU69order"9ofUUalist,5"9ofUUapGolynomial,169OREAD,UU89OWRITE,UU89P*AIR,UU89PBIN,UU209PCL,UU219PCONST,UU209PCPV,UU219PDBORD,UU209PDEG,UU209PDEGSV,UU209PDEGV,UU209PDPV,UU209PERMCY,UU79PERMR,UU79PFBRE,UU209PFDIP*,UU21,269PFDP*,UU21,279PICPV,UU219PINV,UU219PLBCF,UU209PLDCF,UU209PMDEG,UU209PMON,UU209PMPMV,UU209pGolynomial,UU16"9constant,UU16"9denseUUrecursiverepresentation,15"9integral,UU16"9integralUUminimal,46"9moGdular,UU16"9moGdularUUintegral,16monic,UU16 pGositive,UU16primitive,UU16,33rational,UU16rationalUUminimal,46sparsehdistributiverepresentation,115sparseUUrecursiverepresentation,15squarefree,UU17,33PORD,UU20pGositive,UU10pGositiveUUpolynomial,16PPERMV,UU21PRED,UU20primitiveUUpart,33univqariate,UU33primitiveUUpGolynomial,16,33PR*T,UU20PSDSV,UU20PTBCF,UU20PTMV,UU21PTV,UU21PUFP*,UU21PUNT,UU20rationalnumbGer,UU10pGolynomial,UU16RED,UU6RED2,UU6RED3,UU6RED4,UU6REDI,UU6reductumofUUalist,5ofUUapGolynomial,16RNABS,UU14RNBCR,UU14RNCEIL,UU14RNCOMP*,UU14RNDEN,UU14RNDIF,UU14RNDWRITE,UU14RNFCL2,UU14RNFLOR,UU14RNINT,UU14RNINV,UU14RNMAX,UU14RNMIN,UU14RNNEG,UU14RNNUM,UU14RNP2,UU14RNPROD,UU14RNQ,UU14RNRAND,UU14A71HOC9RNREAD,UU14 9RNRED,UU149RNSIGN,UU149RNSUM,UU149RNWRITE,UU149RP*AFME,UU489RPBLGS,UU269RPDIF,UU269RPDMV,UU269RPDWRITE,UU269RPEMV,UU269RPEXPREAD,UU269RPFIP*,UU269RPIMV,UU269RPMAIP*,UU269RPNEG,UU269RPPROD,UU269RPQR,UU269RPREAD,UU269RPRNP*,UU269RPSUM,UU269RPWRITE,UU269SACffFREEMEM,UU559SDIFF,UU79SECOND,UU69SEQUAL,UU79set"9unordered,UU59SFCS,UU79SFIRST,UU89sideUUe ects,59sign"9ofUUapGolynomial,169SINTER,UU79SLEL*TI,UU89SMFMI,UU139SMFMIP*,UU259sparseUUdistributiverepresentation,159sparseUUrecursiverepresentation,159squarefree"9basis,9coarsest,UU32,9 nest,UU32"9divisor,UUgreatest,33"9factorization,UU17,33"9pGolynomial,UU17,339SRED,UU89standardUUintervqal,419SUFFIX,UU79SUNION,UU79term"9leading,UU16THIRD,UU6 trailingUUbasecoGecient,16univqariateUUcontent,33univqariateUUprimitivepart,33USDIFF,UU7USINT,UU7USUN,UU7vqariablelistUUof,17main,UU16name,UU17VIAZ,UU29VIDIF,UU29VIERED,UU29VILCOM,UU29VINEG,UU29VISPR,UU30VISUM,UU30VIUT,UU30A72.;IOiNq cmbx12fCscmtt8cNH cmbx12SCscmtt8GDtHGcmr17>DtGGcmr17 cmmi10 0ercmmi7O \cmmi5K`y cmr10ٓRcmr7Zcmr5< lcircle10O line10u cmex10saclib2.2.8/doc/user_guide/cISAC.tex0000664002275300236100000001023214017255270016252 0ustar wcbrownscs%---------------------------------------------- \section{What is \isac?} %---------------------------------------------- \isac\ is a small experimental interactive interface to \saclib, allowing simple {\tt read--eval--write} cycles of interaction. The system is designed and implemented in the most straightforward way, so that its source code can be used as an example or a tutorial for those who want to quickly write an interactive test environment for their \saclib\ based functions or intend to develop professional interfaces to \saclib. %---------------------------------------------- \section{Supported \saclib\ Algorithms} %---------------------------------------------- All the \saclib\ library algorithms and macros are accessible. \NIL\ and \BETA\ are available as constants. %---------------------------------------------- \section{Command Line Options} %---------------------------------------------- \isac\ takes the standard \saclib\ command line options for initializing various global variables. In order to find out what is available, issue the command \begin{verbatim} isac +h \end{verbatim} %---------------------------------------------- \section{Interface Functionality} %---------------------------------------------- An \isac\ session consists of one or more statements. Every statement must end with a semicolon `\verb:;:'. A statement can be one of the three kinds: \begin{itemize} \item command \item call \item assignment \end{itemize} % The commands supported in this version are: \begin{glists}{3em}{10em}{1em}{1ex} \iteml{quit;} For quitting the session. \iteml{vars;} For displaying the contents of the variables. Values are displayed in internal \saclib\ format. \iteml{help \mbox{[}algName\mbox{]};} For displaying a general help or an algorithm. For example, in order to display the algorithm \mbox{\tt IPROD}, issue the the command: \verb: help IPROD;: \iteml{view algName;} For displaying an algorithm with the editor vi(1). \iteml{save fileName;} For saving the current state of the session (i.e. the variable binding) to a file. \iteml{restore fileName;} For restoring the state of a session from a file. \end{glists} % A call statement is a call to any procedures or functions in the \saclib\ library. For example, \begin{verbatim} IPFAC(r,A; s,c,F); IPWRITE(r,IPSUM(r,A,B),V); \end{verbatim} % An assignment statement is of the form: \begin{verbatim} var := expression; \end{verbatim} % For example, \begin{verbatim} A := IPROD(a,ISUM(b,c)); a := 2 * 3 + 4; a := 3 % 2; \end{verbatim} %---------------------------------------------- \section{Interface Grammar} %---------------------------------------------- Below we give a context-free grammar for a session. We have followed the following conventions: \begin{itemize} \item Upper-case strings and quoted strings denote tokens, \item Lower-case strings denote non-terminals. \end{itemize} \begin{verbatim} session : statement | session statement ; statement : command ';' | proc_call ';' | assignment ';' ; command : IDENT | IDENT CMDARGS ; proc_call : IDENT '(' proc_arg_star ')' ; assignment : IDENT ':=' expr ; proc_arg_star : val_star | val_star ';' ref_star ; val_star : /* empty */ | val_plus ; val_plus : expr | val_plus ',' expr ; ref_star : /* empty */ | ref_plus ; ref_plus : ref | ref_plus ',' ref ; ref : IDENT expr : expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | expr '%' expr | '+' expr | '-' expr | '(' expr ')' | func_call | atom ; func_call : IDENT '(' func_arg_star ')' ; func_arg_star : val_star ; atom : IDENT | INTEGER ; \end{verbatim} saclib2.2.8/doc/user_guide/saclib.tex0000664002275300236100000001546214017255270016637 0ustar wcbrownscs\documentclass{report} \usepackage{saclib} \usepackage{makeidx} \makeindex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{ \saclib\ 1.1 User's Guide\thanks{ RISC--Linz Report Series Technical Report Number 93-19 (Research Institute for Symbolic Computation, Johannes Kepler University, A-4040 Linz, Austria) } \\\bigskip \small \copyright\ 1993 by Kurt G\"{o}del Institute } \author{ Bruno Buchberger \and George E.\ Collins \and Mark J.\ Encarnaci\'{o}n \and Hoon Hong \and Jeremy R.\ Johnson \and Werner Krandick \and R\"{u}diger Loos \and Ana M. Mandache \and Andreas Neubacher \and Herbert Vielhaber } \date{March 12, 1993} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \vfill \begin{center} \saclib\ \copyright\ 1993 by Kurt G\"{o}del Institute \end{center} \bigskip The \saclib\ system source code and User's Guide are made available free of charge by the Kurt Goedel Institute on behalf of the \saclib\ Group. Persons or institutions receiving it are pledged not to distribute it to others. Instead, individuals wishing to acquire the system should obtain it by ftp directly from the Kurt Goedel Institute, informing the Institute of the acquisition. Thereby the \saclib\ Group will know who has the system and be able to inform all users of any corrections or newer versions. Users are kindly asked to cite their use of the system in any resulting publications or in any application packages built upon \saclib. Neither \saclib\ nor any part thereof may be incorporated in any commercial software product without the consent of the authors. Users developing non-commercial application packages are kindly asked to inform us. Requests or proposals for changes or additions to the system will be welcomed and given consideration. \saclib\ is offered without warranty of any kind, either expressed or implied. However reports of bugs or problems are encouraged. \vfill %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{abstract} This paper lists most of the algorithms provided by \saclib\ and shows how to call them from C. There is also a brief explanation of the inner workings of the list processing and garbage collection facilities of \saclib. \end{abstract} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \pagenumbering{roman} \tableofcontents \clearpage \listoffigures \clearpage \pagenumbering{arabic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:I} \input{cI.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{List Processing} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:LP} \input{cLP.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Arithmetic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:A} \section{Introduction} \label{c:A s:I} \input{cAsI.tex} \section{Integer Arithmetic} \label{c:A s:IA} \input{cAsIA.tex} \section{Modular Number Arithmetic} \label{c:A s:MA} \input{cAsMA.tex} \section{Rational Number Arithmetic} \label{c:A s:RA} \input{cAsRA.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Polynomial Arithmetic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:PA} \section{Introduction} \label{c:PA s:I} \input{cPAsI.tex} \section{Polynomial Input and Output} \label{cPAsPIO.tex} \input{cPAsPIO.tex} \section{Domain Independent Polynomial Arithmetic} \label{c:PA s:DIPA} \input{cPAsDIPA.tex} \section{Integral Polynomial Arithmetic} \label{c:PA s:IPA} \input{cPAsIPA.tex} \section{Modular Polynomial Arithmetic} \label{c:PA s:MPA} \input{cPAsMPA.tex} \section{Rational Polynomial Arithmetic} \label{c:PA s:RPA} \input{cPAsRPA.tex} \section{Miscellaneous Representations} \label{c:PA s:MR} \input{cPAsMR.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Linear Algebra} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:LA} \input{cLA.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Polynomial GCD and Resultants} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:GCD} \input{cGCD.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Polynomial Factorization} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:PF} \input{cPF.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Real Root Calculation} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:RRC} \input{cRRC.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Algebraic Number Arithmetic} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:AN} \input{cAN.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \appendix \clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Calling \saclib\ Functions from C} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:CFC} \input{cCFC.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{\isac: An Interactive Interface to \saclib} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:ISAC} \input{cISAC.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Notes on the Internal Workings of \saclib} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:NIW} \section{Lists, GCA Handles, and Garbage Collection} \label{c:NIW s:GC} \input{cNIWsGC.tex} \section{Constants and Global Variables} \label{c:NIW s:CGV} \input{cNIWsCGV.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Here we should have an extensive bibliography of Symbolic Algebraic % Computation literature. Any volunteers? % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The index. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clearpage \addcontentsline{toc}{chapter}{Index} \printindex \end{document} saclib2.2.8/doc/user_guide/cLA.tex0000664002275300236100000001533714017255270016042 0ustar wcbrownscs\section{Mathematical Preliminaries} A {\em matrix} $A$ of {\em order $m \times n$} over a domain $D$ is a rectangular array of elements of $D$ of the form $$A = \left[ \begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & & & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{array} \right]$$ which we will sometimes denote by $A = (a_{ij})$. If $A$ has order $n \times n$ then we say that $A$ is a {\em square} matrix. When appropriate, we will denote a matrix $A$ by $A_{m \times n}$ to indicate that the order of $A$ is $m \times n$. If $A$ is a square matrix then the {\em determinant} of $A$, denoted $\det(A)$, is defined to be $\det(A) = \sum \epsilon(\sigma)a_{\sigma(1),1}\cdots a_{\sigma(n),n}$, the sum being taken over all permutations $\sigma$ of $\{1,\ldots,n\}$ with $\epsilon(\sigma)$ equal to the sign\footnote{If $\sigma$ is the product of $m$ transpositions, then the {\em sign} of $\sigma$ is $\epsilon(\sigma) = (-1)^m$.} of $\sigma$. An {\em m-vector $V$} is a matrix of order $m \times 1$ and will be denoted by $V = (v_i)$. If $A$ is a matrix of order $m \times n$, $b$ is an $m$-vector and $x$ is an $n$-vector then the equation $Ax = b$ can be viewed as representing the system of linear equations $\sum_{j=1}^n a_{ij}x_j = b_i$, $i = 1,\ldots,m$. If a solution to the system $Ax = b$ exists then we say that the system is {\em consistent}. The {\em null space} of a matrix $A_{m \times n}$ is the set of all $n$-vectors $x$ that satisfy $Ax = 0$. A {\em basis} $B$ for the null-space of $A$ is a set of $n$-vectors such that each element of the null-space can be expressed as a linear combination of elements of $B$. \section{Purpose} The \saclib\ linear algebra package provides algorithms for solving systems of linear diophantine equations, for computing null-space bases, for computing determinants and for matrix multiplication. \section{Methods and Algorithms} To solve a system of linear diophantine equations one may use either of the two algorithms {\tt LDSMKB} and {\tt LDSSBR}. Both algorithms take as inputs a matrix $A_{m \times n}$ and an $m$-vector $b$, with $A$ represented column-wise, i.e.\ $A$ is a list of $n$ columns each of which is a list of $m$ integers. Either algorithm returns an $n$-vector $x^*$ and a list $N$ where $x^*$ is a particular solution of the system of linear diophantine equations $Ax = b$ and $N$ is a list of $n$-vectors that form a basis for the null space of $A$. In case the system $Ax = b$ is not consistent, both $x^*$ and $N$ are null lists. {\tt LDSMKB} implements a modification of the Kannan-Bachem algorithm while {\tt LDSSBR} implements an algorithm based on ideas of Rosser. Determinants of matrices over $\BbbZ[x_1,\ldots,x_r]$ may be computed by using either {\tt MAIPDE} or {\tt MAIPDM}. {\tt MAIPDE} implements an algorithm which is based on exact division while {\tt MAIPDM} is based on modular homomorphisms and Chinese remaindering. {\tt MMDDET} computes determinants of matrices over $\BbbZ_p$ while {\tt MMPDMA}, which is based on evaluation homomorphisms and interpolation, computes determinants of matrices over $\BbbZ_p[x_1,\ldots,x_r]$. \section{Functions} \begin{description} \item[Systems of linear equations:] \ \ \begin{description} \item[{\tt LDSMKB(A,b; xs,N) }]\index{LDSMKB} Linear diophantine system solution, modified Kannan and Bachem algorithm. {\em Given an integral matrix $A_{m \times n}$, represented column-wise, and an integral $m$-vector $b$, uses a modification of the Kannan and Bachem algorithm to compute $x^*$ and $N$ where $x^*$ is a particular solution of the system of linear equations $Ax = b$ and $N$ is a list of vectors which form a basis for the solution module of $Ax = 0$. If $Ax = b$ is not consistent then both $x^*$ and $N$ are null lists.} \item[{\tt LDSSBR(A,b; xs,N) }]\index{LDSSBR} Linear diophantine system solution, based on Rosser ideas. {\em Similar to {\rm LDSMKB} but the computations are performed using an algorithm based on ideas of Rosser.} \item[{\tt B <- MMDNSB(p,M) }]\index{MMDNSB} Matrix of modular digits null-space basis. {\em Given a matrix $A_{m \times n}$ over $\BbbZ _p$, represented row-wise, computes a list $B = (B_1,\ldots,b_r)$ of $m$-vectors representing a basis for the null-space of $A$.} \end{description} % systems of linear equations \item[Determinants:] \ \ \begin{description} \item[{\tt D <- MAIPDE(r,M) }]\index{MAIPDE} Matrix of integral polynomials determinant, exact division algorithm. {\em Given a square matrix $A$ over $\BbbZ$ computes $\det(A)$.} \item[{\tt D <- MAIPDM(r,M) }]\index{MAIPDM} Matrix of integral polynomials determinant, modular algorithm. {\em Similar to {\tt MAIPDE} but uses an algorithm based on modular homomorphisms and Chinese remaindering.} \item[{\tt d <- MMDDET(p,M) }]\index{MMDDET} Matrix of modular digits determinant. {\em Given a square matrix $A$ over $\BbbZ _p$, computes $\det(M)$.} \item[{\tt D <- MMPDMA(r,p,M) }]\index{MMPDMA} Matrix of modular polynomials determinant, modular algorithm. {\em Given a matrix $M$ over $\BbbZ _p[x_1,\ldots,x_r]$, computes $\det(M)$ using a method based on evaluation homomorphisms and interpolation.} \end{description} % determinants \item[Matrix arithmetic:] \ \ \begin{description} \item[{\tt C <- MAIPP(r,A,B) }]\index{MAIPP} Matrix of integral polynomials product. \end{description} % matrix arithmetic \item[Vector computations:] \ \ \begin{description} \item[{\tt B <- VIAZ(A,n) }]\index{VIAZ} Vector of integers, adjoin zeros. \item[{\tt C <- VIDIF(A,B) }]\index{VIDIF} Vector of integers difference. \item[{\tt W <- VIERED(U,V,i) }]\index{VIERED} Vector of integers, element reduction. \item[{\tt C <- VILCOM(a,b,A,B) }]\index{VILCOM} Vector of integers linear combination. \item[{\tt B <- VINEG(A) }]\index{VINEG} Vector of integers negation. \item[{\tt C <- VISPR(a,A) }]\index{VISPR} Vector of integers scalar product. \item[{\tt C <- VISUM(A,B) }]\index{VISUM} Vector of integers sum. \item[{\tt VIUT(U,V,i; Up,Vp) }]\index{VIUT} Vector of integers, unimodular transformation. \end{description} % vector computations \item[Miscellaneous functions:] \ \ \begin{description} \item[{\tt B <- MAIPHM(r,m,A) }]\index{MAIPHM} Matrix of integral polynomials homomorphism. \item[{\tt B <- MIAIM(A) }]\index{MIAIM} Matrix of integers, adjoin identity matrix. \item[{\tt B <- MICINS(A,V) }]\index{MICINS} Matrix of integers column insertion. \item[{\tt B <- MICS(A) }]\index{MICS} Matrix of integers column sort. \item[{\tt B <- MINNCT(A) }]\index{MINNCT} Matrix of integers, non-negative column transformation. \item[{\tt B <- MMPEV(r,m,A,k,a) }]\index{MMPEV} Matrix of modular polynomials evaluation. \end{description} % miscellaneous functions \end{description} % functions saclib2.2.8/doc/user_guide/sackwic.tex0000664002275300236100000000216514017255270017022 0ustar wcbrownscs\documentclass{article} \usepackage{saclib} \newcommand{\desclabel}[1]{\hspace\labelsep \bf #1} \renewenvironment{description}{ \begin{list}{}{ \labelwidth 0 pt \itemindent-\leftmargin \renewcommand{\makelabel}{\desclabel} \topsep 0 pt \parsep 0 pt \itemsep \parsep } }{\end{list}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{ A KWIC Index to \saclib\ Functions } \author{ Andreas Neubacher\thanks{ With the help of one {\tt csh} script, three {\tt awk} scripts, and one {\tt sed} script. } } \date{March 12, 1993} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{abstract} This paper solely consists of an automatically generated ``KeyWord In Context'' index of all functions provided by \saclib. \end{abstract} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \small \input{KWIC.tex} \normalsize \end{document} saclib2.2.8/doc/user_guide/cGCD.tex0000664002275300236100000004557114017255270016146 0ustar wcbrownscs\section{Mathematical Preliminaries} Given polynomials $A$ and $B$ in $R[x_1,\ldots,x_r]$, $R$ a unique factorization domain, a {\em greatest common divisor} (GCD) of $A$ and $B$ is a polynomial $C$ in $R[x_1,\ldots,x_r]$ such that $C$ divides both $A$ and $B$ and such that any other divisor of both $A$ and $B$ also divides $C$. GCDs of more than two polynomials are defined in a similar way. GCDs are not unique since any unit multiple of a GCD is itself a GCD. Polynomials $A$ and $B$ are {\em relatively prime} if $1$ is a GCD of $A$ and $B$. If $A = \sum_{i=0}^m{a_ix_r^i}$ and $B = \sum_{i=0}^n{b_ix_r^i}$, then the {\em Sylvester matrix} of $A$ and $B$ is the $(m+n) \times (m+n)$ square matrix $$ \left( \begin{array}{ccccccccccccc} a_m & a_{m-1} & \cdots & & & & \cdots & a_0 & 0 & \cdots & 0 \\ 0 & a_m & \cdots & & & & \cdots & a_1 & a_0 & \cdots & 0 \\ \vdots & & \ddots & & & & & & & \ddots & \vdots \\ 0 & \cdots & 0 & a_m & \cdots & & & & \cdots & a_1 & a_0 \\ b_n & b_{n-1} & \cdots & & & \cdots & b_0 & 0 & \cdots & \cdots & 0 \\ 0 & b_n & \cdots & & & \cdots & b_1 & b_0 & 0 & \cdots & 0 \\ \vdots & & \ddots & & & & & & \ddots & & \vdots \\ \vdots & & & \ddots & & & & & & \ddots & \vdots \\ 0 & \cdots & \cdots & 0 & b_n & \cdots & & & \cdots & b_1 & b_0 \end{array} \right) $$ in which there are $n$ rows of $A$ coefficients and $m$ rows of $B$ coefficients. The {\em resultant} of two polynomials $A$ and $B$, denoted by ${\rm res}(A,B)$, is the determinant of the Sylvester matrix of $A$ and $B$. The resultant will be an element of $R[x_1,\ldots,x_{r-1}]$ if $A$ and $B$ are elements of $R[x_1,\ldots,x_r]$. From a classic result we know that $A$ and $B$ are relatively prime just in case their resultant is nonzero. Let ${\rm deg}_{x_r}(A) = m$ and ${\rm deg}_{x_r}(B) = n$, with $m \geq n >0$. If $M$ is the Sylvester matrix of $A$ and $B$, then for $0 \leq i \leq j < n$ define $M_{ij}$ to be the matrix obtained by deleting from $M$ the last $j$ rows of the $A$ coefficients, the last $j$ rows of the $B$ coefficients and the last $2j+1$ columns except column $m+n-i-j$. The {\em $j$-th subresultant} of $A$ and $B$ is the polynomial $S_j(x_r) = \sum_{i=0}^{j}{\rm det}(M_{ij})x_r^i$ for $0 \leq j < n$. Note that $S_0$ is simply ${\rm res}(A,B)$. The {\em $k$-th principal subresultant coefficient} of $A$ and $B$ is the coefficient of $x_r^k$ in $S_k$ (which may be 0). $A$ and $B$ are {\em similar}, denoted $A \sim B$, if there exist $a$ and $b$, elements of $R[x_1,\ldots,x_{r-1}]$, such that $aA = bB$. % If $A$ and $B$ are nonzero and ${\rm deg}_{x_r}(A) \geq {\rm deg}_{x_r}(B)$ then a {\em polynomial remainder sequence} (PRS) of $A$ and $B$ is a sequence $A_1, \ldots, A_n$ of nonzero polynomials such that $A_1 = A$, $A_2 = B$, $A_i \sim {\rm prem}(A_{i-2},A_{i-1})$, for $i = 3,\ldots,n$, and ${\rm deg}_{x_r}(A_n) = 0$.\footnote{prem$(F,G)$ denotes the pseudo-remainder of $F$ when pseudo-divided by $G$ with respect to the main variable $x_r$.} Since there are many polynomials similar to a given one, there are many different PRSs $A_1, A_2, \ldots, A_n$ corresponding to $A$ and $B$. The {\em Euclidean} PRS is obtained by setting $A_i = {\rm prem}(A_{i-2},A_{i-1})$ for $i = 3,\ldots,n$. The {\em primitive} PRS is obtained by setting $A_i = {\rm prem}(A_{i-2}, A_{i-1})/g_i$, where $g_i$ is the content of ${\rm prem}(A_{i-2}, A_{i-1})$. In other words, we set $A_i$ to be equal to the primitive part of ${\rm prem}(A_{i-2}, A_{i-1})$. The {\em subresultant} PRS {\em of the first kind} is obtained by setting $A_i = S_{d_{i-1}-1}$ where $d_i$ is the degree of the $i$-th element of any PRS of $A$ and $B$. [For each $i$, $d_i$ is invariant over the set of PRSs of $A$ and $B$.] The {\em subresultant} PRS {\em of the second kind} is obtained by setting $A_i = S_{d_i}$ where $d_i$ is as in the previous definition. The {\em reduced} PRS is obtained by setting $A_i = {\rm prem}(A_{i-2}, A_{i-1}) / c_i^{\delta_i+1}$, where $c_i = {\rm ldcf}(A_{i-2})$ and $\delta_i = {\rm deg}_{x_r}(A_{i-3})-{\rm deg}_{x_r}(A_{i-2})$ for $3 \leq i \leq n$, with $\delta_3 = 0$. Although it is not immediately clear from the definitions, both subresultant PRSs as well as the reduced PRS can be shown to be, in fact, PRSs. For univariate polynomials over a field we may define what is known as the {\em natural} PRS defined by $A_i = A_{i-2} - Q_iA_{i-1}$, ${\rm deg}(A_i) < {\rm deg}(A_{i-1})$, for $i = 3,\ldots,n$. That is, we take $A_i$ to be the remainder obtained from dividing $A_{i-2}$ by $A_{i-1}$. \section{Purpose} The \saclib\ polynomial GCD and resultant package provides algorithms for the calculation of GCDs of $r$-variate polynomials over $R = \BbbZ$ or $R = \BbbZ_p$. Since GCDs are not unique, we will need to specify a canonical form in which to express the results of the computations. Over $R = \BbbZ$, the positive GCD is computed while over $R = \BbbZ_p$ it is the monic GCD that is computed. Henceforth, if we refer to {\em the} GCD of $A$ and $B$ we will mean the GCD defined by the algorithms and this will be denoted by ${\rm gcd}(A,B)$. Algorithms are also available for the computation of resultants of $r$-variate polynomials over $R = \BbbZ$ or $R = \BbbZ_p$. The package also provides algorithms for computing the subresultant PRS and the reduced PRS for $r$-variate polynomials over $R = \BbbZ$ and the subresultant PRS for $r$-variate polynomials over $R = \BbbZ_p$. \section{Definitions of Terms} \begin{description} \item[coarsest squarefree basis]\index{basis!coarsest squarefree}\index{squarefree!basis!coarsest} If $A = (A_1,\ldots,A_n)$ is a list of $r$-variate polynomials, a coarsest squarefree basis for $A$ is a list $B = (B_1,\ldots,B_m)$ of pairwise relatively prime squarefree $r$-variate polynomials such that each $A_i$ in $A$ can be expressed as the product of powers of elements of $B$. \item[discriminant]\index{discriminant} If $A$ is an $r$-variate polynomial of degree $n$ in its main variable, $n \geq 2$, the discriminant of $A$ is the $(r-1)$-variate polynomial equal to the quotient of $(-1)^{n(n-1)/2}{\rm res}(A,A^\prime)$ when divided by $a$, where $A^\prime$ is the derivative of $A$ with respect to its main variable and $a$ is the leading coefficient of $A$. \item[finest squarefree basis]\index{basis!finest squarefree}\index{squarefree!basis!finest} A finest squarefree basis $B = (B_1, \ldots, B_m)$ for a list $A$ of $r$-variate polynomials is a coarsest squarefree basis for $A$ with the additional condition that each $B_i$ is irreducible. \item[cofactors]\index{cofactors} If $C$ is the GCD of two polynomials $A$ and $B$ then the cofactors of $A$ and $B$, respectively, are $A/C$ and $B/C$. \item[content]\index{content} The content of a polynomial $A$ in $r$ variables is a polynomial in $r-1$ variables equal to the absolute value of the greatest common divisor of the coefficients of $A$. \item[greatest squarefree divisor]\index{squarefree!divisor, greatest} A greatest squarefree divisor of a polynomial $A$ is a squarefree polynomial $C$ that divides $A$ and is such that any other squarefree polynomial that divides $A$ also divides $C$. \item[primitive part]\index{primitive part} The primitive part of a polynomial $A$ is the absolute value of $A/c$ where $c$ is the content of $A$. \item[primitive polynomial]\index{primitive polynomial}\index{polynomial!primitive} A polynomial, the content of which is $1$. \item[squarefree factorization]\index{factorization!squarefree}\index{squarefree!factorization} The squarefree factorization of $A$ is $A = A_1^{e_1}\cdots A_k^{e_k}$ where $1 \leq e_1 < \cdots < e_k$ and each of the $A_i$ is a positive squarefree polynomial of positive degree. Note that if $A$ is squarefree then $A^1$ is the squarefree factorization of $A$. \item[squarefree polynomial]\index{polynomial!squarefree}\index{squarefree!polynomial} A polynomial $A$ is squarefree if each factor occurs only once. In other words, if $A = A_1^{e_1}\cdots A_k^{e_k}$ is a complete factorization of $A$ then each of the $e_i$ is equal to $1$. \item[univariate content]\index{univariate content}\index{content!univariate} If $A$ is an $r$-variate polynomial, $r \geq 2$, then the univariate content of $A$ is a univariate polynomial in the most minor variable equal to the GCD of the coefficients of $A$, where $A$ is considered as an element of $(R[x_1])[x_2,\ldots,x_r]$. \item[univariate primitive part]\index{univariate primitive part}\index{primitive part!univariate} Given an $r$-variate polynomial $A$, $r \geq 2$, the univariate primitive part of $A$ is the $r$-variate polynomial $A/a$, where $a$ is the univariate content of $A$. \end{description} \section{Methods and Algorithms} In this section we briefly discuss the main algorithms that might be of interest to the user and give a sketch of the mathematical ideas behind these algorithms. \subsection{GCD Computations} To compute the GCD of two univariate polynomials over $R =\BbbZ_p$, the algorithm {\tt MUPGCD} may be used. Making use of the fact that if $A_1,\ldots,A_n$ is a PRS of two polynomials $A$ and $B$ then ${\rm gcd}(A,B) \sim A_n$, this algorithm simply computes the natural PRS of the two input polynomials and returns the monic GCD. The GCD and cofactors of two $r$-variate polynomials over $\BbbZ_p$ are computed by {\tt MPGCDC} which employs evaluation homomorphisms and interpolation to reduce the problem to that of computing the GCDs of $(r-1)$-variate polynomials over $R = \BbbZ_p$. {\tt MPGCDC} proceeds recursively until it arrives at univariate polynomials whereupon {\tt MUPGCD} is called. The GCD computed is monic. To obtain the GCD of two $r$-variate integral polynomials $A$ and $B$ one would use the algorithm {\tt IPGCDC} which also computes the cofactors of $A$ and $B$. In this algorithm modular homomorphisms and Chinese remaindering are used to reduce the problem to GCD computations of $r$-variate polynomials over $R = \BbbZ_p$, which is solved by {\tt MPGCDC}. \subsection{Resultants} Using the algorithm suggested by the definition of the resultant, namely to construct the Sylvester matrix and compute its determinant, is not the most efficient way to proceed. Instead, {\tt MUPRES} computes the resultant of two univariate polynomials $A$ and $B$ over $R= \BbbZ_p$ by computing the natural PRS of $A$ and $B$ and by using the identity % $${\rm res}(A,B) = (-1)^\nu \left[ \prod_{i=2}^{n-1}c_i^{d_{i-1}-d_{i+1}}\right]c_n^{d_{n-1}}$$ % where $c_i = {\rm ldcf}(A_i)$, $d_i = {\rm deg}(A_i)$, $\nu = \sum_{i=1}^{k-2}d_id_{i+1}$ and $A_1,\ldots,A_n$ is the natural PRS. For calculating the resultant of $r$-variate polynomials over $R = \BbbZ_p$, {\tt MPRES} makes use of evaluation homomorphisms and interpolation to recursively reduce the problem to the calculation of resultants of univariate polynomials over $R = \BbbZ_p$ which can be done by {\tt MUPRES}. {\tt IPRES} computes the resultant of $r$-variate polynomials over $R = \BbbZ$ by applying modular homomorphisms and Chinese remaindering to simplify the problem to resultant computations over $R = \BbbZ_p$, computations which are performed by {\tt MPRES}. \section{Functions} \begin{description} \item[Integral polynomial GCDs:] \ \ \begin{description} \item[{\tt C <- IPC(r,A) }]\index{IPC} Integral polynomial content. {\em Given an $r$-variate polynomial $A$ over $R = \BbbZ$, computes the $(r-1)$-variate polynomial equal to the content of $A$.} \item[{\tt IPCPP(r,A; C,Ab) }]\index{IPCPP} Integral polynomial content and primitive part. {\em Computes the content and the primitive part of a given polynomial over $R = \BbbZ$.} \item[{\tt IPGCDC(r,A,B; C,Ab,Bb) }]\index{IPGCDC} Integral polynomial greatest common divisor and cofactors. {\em Given two $r$-variate polynomials $A$ and $B$ over $R = \BbbZ$, computes the GCD and the cofactors of $A$ and $B$.} \item[{\tt IPLCPP(r,A; C,P) }]\index{IPLCPP} Integral polynomial list of contents and primitive parts. {\em Given a list $(A_1,\ldots,A_n)$ of $r$-variate polynomials over $R = \BbbZ$, computes two lists, one consisting of the contents of the $A_i$ that have positive degree in at least one variable and another consisting of the primitive parts of the $A_i$ that that have positive degree in the main variable.} \item[{\tt Ab <- IPPP(r,A) }]\index{IPPP} Integral polynomial primitive part. {\em Given a polynomial $A$ over $R = \BbbZ$, computes the primitive part of $A$.} \item[{\tt IPSCPP(r,A; s,C,Ab) }]\index{IPSCPP} Integral polynomial sign, content, and primitive part. {\em Computes the sign, the content and the primitive part of a given polynomial over $R = \BbbZ$.} \end{description} \item[Modular Polynomial GCDs:] \ \ \begin{description} \item[{\tt MPGCDC(r,p,A,B; C,Ab,Bb) }]\index{MPGCDC} Modular polynomial greatest common divisor and cofactors. {\em Computes the GCD and cofactors of two given polynomials over $R = \BbbZ_p$.} \item[{\tt c <- MPUC(r,p,A) }]\index{MPUC} Modular polynomial univariate content. {\em Computes the univariate content of an $r$-variate polynomial, $r \geq 2$, over $R = \BbbZ_p$.} \item[{\tt MPUCPP(r,p,A; a,Ab) }]\index{MPUCPP} Modular polynomial univariate content and primitive part. {\em Giver an $r$-variate polynomial $A$, $r \geq 2$, computes the univariate content $a$ of $A$ and the univariate primitive part $A/a$.} \item[{\tt d <- MPUCS(r,p,A,c) }]\index{MPUCS} Modular polynomial univariate content subroutine. \item[{\tt Ab <- MPUPP(r,p,A) }]\index{MPUPP} Modular polynomial univariate primitive part. {Given $A$, an $r$-variate polynomial over $R = \BbbZ_p$, $r \geq 2$, computes the univariate primitive part of $A$.} \item[{\tt C <- MUPGCD(p,A,B) }]\index{MUPGCD} Modular univariate polynomial greatest common divisor. {\em Computes the GCD of two given univariate polynomials over $R = \BbbZ_p$.} \item[{\tt L <- MUPSFF(p,A) }]\index{MUPSFF} Modular univariate polynomial squarefree factorization. {\em Computes the squarefree factorization of a given univariate polynomial over $R = \BbbZ_p$.} \end{description} \item[Squarefree basis:] \ \ \begin{description} \item[{\tt B <- IPCSFB(r,A) }]\index{IPCSFB} Integral polynomial coarsest squarefree basis. {\em Given a list $A$ of positive and primitive $r$-variate polynomials over $R = \BbbZ$, each of which is of positive degree in the main variable, computes a coarsest squarefree basis for $A$.} \item[{\tt B <- IPFSFB(r,A) }]\index{IPFSFB} Integral polynomial finest squarefree basis. {\em Given a list $A$ of positive and primitive $r$-variate polynomials over $R = \BbbZ$, each of which is of positive degree in the main variable, computes a finest squarefree basis for $A$.} \item[{\tt B <- IPPGSD(r,A) }]\index{IPPGSD} Integral polynomial primitive greatest squarefree divisor. {\em Given a polynomial $A$ over $R = \BbbZ$, computes the positive and primitive greatest squarefree divisor of the primitive part of $A$.} \item[{\tt L <- IPSF(r,A) }]\index{IPSF} Integral polynomial squarefree factorization. {\em Given a primitive polynomial $A$, of positive degree in the main variable, computes the squarefree factorization of $A$.} \item[{\tt Bs <- IPSFBA(r,A,B) }]\index{IPSFBA} Integral polynomial squarefree basis augmentation. \item[{\tt B <- ISPSFB(r,A) }]\index{ISPSFB} Integral squarefree polynomial squarefree basis. \end{description} \item[Resultants:] \ \ \begin{description} \item[{\tt B <- IPDSCR(r,A) }]\index{IPDSCR} Integral polynomial discriminant. {\em Computes the discriminant of an $r$-variate polynomial over $R = \BbbZ$, the degree of which is greater than or equal to $2$ in its main variable.} \item[{\tt P <- IPPSC(r,A,B) }]\index{IPPSC} Integral polynomial principal subresultant coefficients. {\em Computes a list of the non-zero principal subresultant coefficients of two given $r$-variate polynomials over $R = \BbbZ$ each of which is of positive degree in the main variable.} \item[{\tt C <- IPRES(r,A,B) }]\index{IPRES} Integral polynomial resultant. {\em Given two $r$-variate polynomials over $R = \BbbZ$, each of which is of positive degree in the main variable, computes the $(r-1)$-variate polynomial over $R = \BbbZ$ equal to their resultant.} \item[{\tt IUPRC(A,B; C,R) }]\index{IUPRC} Integral univariate polynomial resultant and cofactor. {\em Given two univariate polynomials $A$ and $B$ over $R = \BbbZ$, where both $A$ and $B$ are of positive degree, computes ${\rm res}(A,B)$ and the univariate polynomial $C$ over $R = \BbbZ$ such that for some $D$, $AD + BC = {\rm res}(A,B)$ and ${\rm deg}(C) < {\rm deg}(A)$.} \item[{\tt C <- MPRES(r,p,A,B) }]\index{MPRES} Modular polynomial resultant. {\em Given two $r$-variate polynomials over $R = \BbbZ_p$, each of which is of positive degree in the main variable, computes the $(r-1)$-variate polynomial over $R = \BbbZ_p$ equal to their resultant.} \item[{\tt MUPRC(p,A,B; C,r) }]\index{MUPRC} Modular univariate polynomial resultant and cofactor. {\em Given two univariate polynomials $A$ and $B$ over $R = \BbbZ_p$, where both $A$ and $B$ are of positive degree, computes ${\rm res}(A,B)$ and the univariate polynomial $C$ over $R = \BbbZ_p$ such that for some $D$, $AD + BC = {\rm res}(A,B)$ and ${\rm deg}(C) < {\rm deg}(A)$.} \item[{\tt c <- MUPRES(p,A,B) }]\index{MUPRES} Modular univariate polynomial resultant. {\em Computes the resultant of two given univariate polynomials over $R = \BbbZ_p$, each of which is of positive degree in the main variable.} \end{description} \item[Polynomial Remainder Sequences:] \ \ \begin{description} \item[{\tt S <- IPRPRS(r,A,B) }]\index{IPRPRS} Integral polynomial reduced polynomial remainder sequence. {\em Computes a list representing the reduced polynomial remainder sequence of two given nonzero $r$-variate polynomials over $R = \BbbZ$.} \item[{\tt S <- IPSPRS(r,A,B) }]\index{IPSPRS} Integral polynomial subresultant polynomial remainder sequence. {\em Computes a list representing the subresultant polynomial remainder sequence of the first kind of two given nonzero $r$-variate polynomials over $R = \BbbZ$.} \item[{\tt S <- MPSPRS(r,p,A,B) }]\index{MPSPRS} Modular polynomial subresultant polynomial remainder sequence.{\em Computes a list representing the subresultant polynomial remainder sequence of the first kind of two given nonzero $r$-variate polynomials over $R = \BbbZ_p$.} \end{description} \item[Extended GCDs:] \ \ \begin{description} \item[{\tt MUPEGC(p,A,B; C,U,V) }]\index{MUPEGC} Modular univariate polynomial extended greatest common divisor. {\em Computes the GCD $C$ of two univariate polynomials $A$ and $B$ over $R = \BbbZ_p$ as well the univariate polynomials $U$ and $V$ such that $AU+BV=C$.} \item[{\tt MUPHEG(p,A,B; C,V) }]\index{MUPHEG} Modular univariate polynomial half-extended greatest common divisor.{\em Computes the GCD $C$ of two univariate polynomials $A$ and $B$ over $R = \BbbZ_p$ as well the univariate polynomial $V$ such that $AU+BV=C$ for some $U$.} \end{description} \end{description} % programs saclib2.2.8/doc/user_guide/cPAsMR.tex0000664002275300236100000000502414017255270016460 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Sparse Distributive Representation} \begin{description} \item[Conversion\footnotemark :] \ \ \footnotetext{ See Section \ref{c:PA s:I} for a description of the sparse recursive representation. } \begin{description} \item[{\tt B <- DIPFP(r,A) }]\index{DIPFP} Distributive polynomial from polynomial. {\em Computes a polynomial in sparse distributive representation from a polynomial in the sparse recursive representation.} \item[{\tt B <- PFDIP(r,A) }]\index{PFDIP} Polynomial from distributive polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the sparse distributive representation.} \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt A <- DIIPREAD(V) }]\index{DIIPREAD} Distributive integral polynomial read. \item[{\tt DIIPWRITE(r,A,V) }]\index{DIIPWRITE} Distributive integral polynomial write. \item[{\tt A <- DIRPREAD(V) }]\index{DIRPREAD} Distributive rational polynomial read. \item[{\tt DIRPWRITE(r,A,V) }]\index{DIRPWRITE} Distributive rational polynomial write. \end{description} \item[Miscellaneous:] \ \ \begin{description} \item[{\tt n <- DIPDEG(r,A) }]\index{DIPDEG} Distributive polynomial degree. \item[{\tt DIPINS(a,d,A; t,B) }]\index{DIPINS} Distributive polynomial, insert term. \end{description} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Dense Recursive Representation} \begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- DMPPRD(r,m,A,B) }]\index{DMPPRD} Dense modular polynomial product. \item[{\tt C <- DMPSUM(r,m,A,B) }]\index{DMPSUM} Dense modular polynomial sum. \item[{\tt C <- DMUPNR(p,A,B) }]\index{DMUPNR} Dense modular univariate polynomial natural remainder. \end{description} \item[Conversion\footnotemark :] \ \ \footnotetext{ See Section \ref{c:PA s:I} for a description of the sparse recursive representation. } \begin{description} \item[{\tt B <- DPFP(r,A) }]\index{DPFP} Dense polynomial from polynomial. {\em Computes a polynomial in dense recursive representation from a polynomial in the sparse recursive representation.} \item[{\tt B <- PFDP(r,A) }]\index{PFDP} Polynomial from dense polynomial. {\em Computes a polynomial in the sparse recursive representation from a polynomial in the dense recursive representation.} \end{description} \end{description} saclib2.2.8/doc/user_guide/cPAsMPA.tex0000664002275300236100000001045214017255270016560 0ustar wcbrownscsNote that the functions whose names begin with MI are based upon modular integer arithmetic, while those beginning with MP and MUP are based upon modular digit arithmetic with a prime modulus\footnote{ See Section \ref{c:A s:MA} for details on modular digit and integer arithmetic. }. \begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- MIPSUM(r,M,A,B) }]\index{MIPSUM} Modular integral polynomial sum. \item[{\tt C <- MPSUM(r,m,A,B) }]\index{MPSUM} Modular polynomial sum. \item[{\tt C <- MIPDIF(r,M,A,B) }]\index{MIPDIF} Modular integral polynomial difference. \item[{\tt C <- MPDIF(r,m,A,B) }]\index{MPDIF} Modular polynomial difference. \item[{\tt B <- MIPNEG(r,M,A) }]\index{MIPNEG} Modular integral polynomial negation. \item[{\tt B <- MPNEG(r,m,A) }]\index{MPNEG} Modular polynomial negative. \item[{\tt C <- MIPPR(r,M,A,B) }]\index{MIPPR} Modular integral polynomial product. \item[{\tt C <- MPPROD(r,m,A,B) }]\index{MPPROD} Modular polynomial product. \item[{\tt B <- MPUP(r,m,c,A) }]\index{MPUP} Modular polynomial univariate product. \item[{\tt C <- MPMDP(r,p,a,B) }]\index{MPMDP} Modular polynomial modular digit product. \item[{\tt C <- MIPIPR(r,M,D,A,B) }]\index{MIPIPR} Modular integral polynomial mod ideal product. \item[{\tt MIUPQR(M,A,B; Q,R) }]\index{MIUPQR} Modular integral univariate polynomial quotient and remainder. \item[{\tt MPQR(r,p,A,B; Q,R) }]\index{MPQR} Modular polynomial quotient and remainder. \item[{\tt C <- MPQ(r,p,A,B) }]\index{MPQ} Modular polynomial quotient. \item[{\tt C <- MPUQ(r,p,A,b) }]\index{MPUQ} Modular polynomial univariate quotient. \item[{\tt C <- MPPSR(r,p,A,B) }]\index{MPPSR} Modular polynomial pseudo-remainder. \item[{\tt MMPIQR(r,M,D,A,B; Q,R) }]\index{MMPIQR} Modular monic polynomial mod ideal quotient and remainder. \item[{\tt B <- MPEXP(r,m,A,n) }]\index{MPEXP} Modular polynomial exponentiation. \end{description} \item[Differentiation and Integration:] \ \ \begin{description} \item[{\tt B <- MUPDER(m,A) }]\index{MUPDER} Modular univariate polynomial derivative. \end{description} \item[Contents and Primitive Parts:] \ \ \begin{description} \item[{\tt MPUCPP(r,p,A; a,Ab) }]\index{MPUCPP} Modular polynomial univariate content and primitive part. \item[{\tt c <- MPUC(r,p,A) }]\index{MPUC} Modular polynomial univariate content. \item[{\tt Ab <- MPUPP(r,p,A) }]\index{MPUPP} Modular polynomial univariate primitive part. \item[{\tt d <- MPUCS(r,p,A,c) }]\index{MPUCS} Modular polynomial univariate content subroutine. \end{description} \item[Evaluation:] \ \ \begin{description} \item[{\tt B <- MPEMV(r,m,A,a) }]\index{MPEMV} Modular polynomial evaluation of main variable. \item[{\tt B <- MPEVAL(r,m,A,i,a) }]\index{MPEVAL} Modular polynomial evaluation. \end{description} \item[Transformation:] \ \ \begin{description} \item[{\tt Ap <- MPMON(r,p,A) }]\index{MPMON} Modular polynomial monic. {\em Computes the monic polynomial similar to a given modular polynomial.} \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt As <- MPINT(p,B,b,bp,r,A,A1) }]\index{MPINT} Modular polynomial interpolation. \item[{\tt B <- MIPHOM(r,M,A) }]\index{MIPHOM} Modular integral polynomial homomorphism. {\em Computes the homomorphism from $\BbbZ[x_1,\ldots,x_r]$ to $\BbbZ_m[x_1,\ldots,x_r]$.} \item[{\tt B <- MPHOM(r,m,A) }]\index{MPHOM} Modular polynomial homomorphism. \end{description} \item[Squarefree Factorization:] \ \ \begin{description} \item[{\tt L <- MUPSFF(p,A) }]\index{MUPSFF} Modular univariate polynomial squarefree factorization. \end{description} \item[Random Polynomial Generation:] \ \ \begin{description} \item[{\tt A <- MIPRAN(r,M,q,N) }]\index{MIPRAN} Modular integral polynomial, random. \item[{\tt A <- MPRAN(r,m,q,N) }]\index{MPRAN} Modular polynomial, random. \item[{\tt A <- MUPRAN(p,n) }]\index{MUPRAN} Modular univariate polynomial, random. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt B <- MIPFSM(r,M,A) }]\index{MIPFSM} Modular integral polynomial from symmetric modular. \item[{\tt B <- SMFMIP(r,M,A) }]\index{SMFMIP} Symmetric modular from modular integral polynomial. \end{description} \end{description} saclib2.2.8/doc/user_guide/cAsIA.tex0000664002275300236100000001710114017255270016312 0ustar wcbrownscs\begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt C <- ISUM(A,B) }]\index{ISUM} Integer sum. \item[{\tt C <- IDIF(A,B) }]\index{IDIF} Integer difference. \item[{\tt B <- INEG(A) }]\index{INEG} Integer negation. \item[{\tt C <- IPROD(A,B) }]\index{IPROD} Integer product. \item[{\tt C <- IDPR(A,b) }]\index{IDPR} Integer-digit product. \item[{\tt DPR(a,b; c,d) }]\index{DPR} Digit Product. \item[{\tt C <- IPRODK(A,B) }]\index{IPRODK} Integer product, Karatsuba algorithm. \item[{\tt C <- IQ(A,B) }]\index{IQ} Integer quotient. \item[{\tt C <- IDQ(A,b) }]\index{IDQ} Integer-digit quotient. \item[{\tt IQR(A,B; Q,R) }]\index{IQR} Integer quotient and remainder. \item[{\tt IDQR(A,b; Q,r) }]\index{IDQR} Integer-digit quotient and remainder. \item[{\tt DQR(a1,a0,b; q,r) }]\index{DQR} Digit quotient and remainder. \item[{\tt C <- IREM(A,B) }]\index{IREM} Integer remainder. \item[{\tt r <- IDREM(A,b) }]\index{IDREM} Integer-digit remainder. \item[{\tt c <- IMAX(a,b) }]\index{IMAX} Integer maximum. {\em Returns the greater of two integers.} \item[{\tt c <- IMIN(a,b) }]\index{IMIN} Integer minimum. {\em Returns the smaller of two integers.} \item[{\tt s <- ISIGNF(A) }]\index{ISIGNF} Integer sign function. \item[{\tt B <- IABSF(A) }]\index{IABSF} Integer absolute value function. \item[{\tt s <- ICOMP(A,B) }]\index{ICOMP} Integer comparison. {\em Compares two integers and returns $-1, 0,$ and $+1$ in case of $<, =,$ and $>$, respectively.} \item[{\tt t <- IEVEN(A) }]\index{IEVEN} Integer even. {\em Tests whether the argument is even.} \item[{\tt t <- IODD(A) }]\index{IODD} Integer odd. {\em Tests whether the argument is odd.} \end{description} \item[Exponentiation:] \ \ \begin{description} \item[{\tt B <- IEXP(A,n) }]\index{IEXP} Integer exponentiation. \item[{\tt IROOT(A,n; B,t) }]\index{IROOT} Integer root. \item[{\tt ISQRT(A; B,t) }]\index{ISQRT} Integer square root. \item[{\tt DSQRTF(a; b,t) }]\index{DSQRTF} Digit square root function. \item[{\tt IPOWER(A,L; B,n) }]\index{IPOWER} Integer power. {\em If the argument can be expressed as $b^n$, such integers $b$ and $n$ are computed.} \end{description} \item[Greatest Common Divisor:] \ \ \begin{description} \item[{\tt C <- IGCD(A,B) }]\index{IGCD} Integer greatest common divisor. \item[{\tt c <- DGCD(a,b) }]\index{DGCD} Digit greatest common divisor. \item[{\tt IGCDCF(A,B; C,Ab,Bb) }]\index{IGCDCF} Integer greatest common divisor and cofactors. \item[{\tt IEGCD(a,b; c,u1,v1) }]\index{IEGCD} Integer extended greatest common divisor algorithm. \item[{\tt DEGCD(a,b; c,u,v) }]\index{DEGCD} Digit extended greatest common divisor. \item[{\tt IDEGCD(a,b; c,u1,v1,u2,v2) }]\index{IDEGCD} Integer doubly extended greatest common divisor algorithm. \item[{\tt IHEGCD(A,B; C,V) }]\index{IHEGCD} Integer half-extended greatest common divisor. \item[{\tt C <- ILCM(A,B) }]\index{ILCM} Integer least common multiple. \end{description} \item[Factorization:] \ \ \begin{description} \item[{\tt F <- IFACT(n) }]\index{IFACT} Integer factorization. \item[{\tt s <- ISPT(m,mp,F) }]\index{ISPT} Integer selfridge primality test. {\em Returns 1 if the argument is prime, -1 if it is not prime, and 0 if the primality could not be determined.} \item[{\tt ILPDS(n,a,b; p,np) }]\index{ILPDS} Integer large prime divisor search. \item[{\tt IMPDS(n,a,b; p,q) }]\index{IMPDS} Integer medium prime divisor search. \item[{\tt ISPD(n; F,m) }]\index{ISPD} Integer small prime divisors. \end{description} \item[Prime Number Generation:] \ \ \begin{description} \item[{\tt L <- DPGEN(m,k) }]\index{DPGEN} Digit prime generator. \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt A <- IRAND(n) }]\index{IRAND} Integer, random. \item[{\tt a <- DRAN() }]\index{DRAN} Digit, random. \item[{\tt a <- DRANN() }]\index{DRANN} Digit, random non-negative. \end{description} \item[Combinatorial:] \ \ \begin{description} \item[{\tt A <- IFACTL(n) }]\index{IFACTL} Integer factorial. \item[{\tt A <- IBCOEF(n,k) }]\index{IBCOEF} Integer binomial coefficient. {\em Returns $\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{k}$}\right)$.} \item[{\tt B <- IBCIND(A,n,k) }]\index{IBCIND} Integer binomial coefficient induction. {\em Returns $\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{k+1}$}\right)$ given $n$, $k$, and $\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{k}$}\right)$.} \item[{\tt A <- IBCPS(n,k) }]\index{IBCPS} Integer binomial coefficient partial sum. {\em Returns $\sum_{i=0}^k\left(\raisebox{-.5ex}{$\stackrel{\textstyle n}{i}$}\right)$.} \end{description} \item[Binary Arithmetic:] \ \ \begin{description} \item[{\tt n <- ILOG2(A) }]\index{ILOG2} Integer logarithm, base 2. {\em Returns 1 + (the floor of the base 2 logarithm of the argument).} \item[{\tt n <- DLOG2(a) }]\index{DLOG2} Digit logarithm, base 2. \item[{\tt IFCL2(a; m,n) }]\index{IFCL2} Integer, floor and ceiling, logarithm, base 2. {\em Returns the floor and the ceiling of the base 2 logarithm of the argument.} \item[{\tt B <- IMP2(A,h) }]\index{IMP2} Integer multiplication by power of 2. {\em Multiplies the argument by a non-negative power of 2.} \item[{\tt B <- IDP2(A,k) }]\index{IDP2} Integer division by power of 2. {\em Divides the argument by a non-negative power of 2.} \item[{\tt B <- ITRUNC(A,n) }]\index{ITRUNC} Integer truncation. {\em Divides the argument by a positive or negative power of 2.} \item[{\tt n <- IORD2(a) }]\index{IORD2} Integer, order of 2. {\em Returns the largest $n$ such that $2^n$ divides the argument.} \end{description} \item[Boolean:] \ \ \begin{description} \item[{\tt c <- DAND(a,b) }]\index{DAND} Digit and. {\em Returns the bit-wise $\wedge$ of two digits.} \item[{\tt c <- DOR(a,b) }]\index{DOR} Digit or. {\em Returns the bit-wise $\vee$ of two digits.} \item[{\tt b <- DNOT(a) }]\index{DNOT} Digit not. {\em Returns the bit-wise $\neg$ of a digit.} \item[{\tt c <- DNIMP(a,b) }]\index{DNIMP} Digit non-implication. {\em Returns the bit-wise $\neg(a \Rightarrow b)$ of digits $a$ and $b$.} \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt A <- IREAD() }]\index{IREAD} Integer read. \item[{\tt IWRITE(A) }]\index{IWRITE} Integer write. \item[{\tt ILWRITE(L) }]\index{ILWRITE} Integer list write. {\em Writes a list of integers in the form \\$(n_1,n_2,\ldots,n_k)$ to the output stream.} \end{description} \item[Auxiliary Functions:] \ \ \begin{description} \item[{\tt C <- ISSUM(n,L) }]\index{ISSUM} Integer shifted sum. {\em Computes $\sum_{i=0}^k C_i \BETA^{in}$ given $n$ and the $C_i$.} \item[{\tt ISEG(A,n; A1,A0) }]\index{ISEG} Integer segmentation. {\em Splits an integer at a \BETA-digit boundary.} \item[{\tt C <- IDIPR2(A,B,a,b) }]\index{IDIPR2} Integer digit inner product, length 2. {\em Computes $Aa + Bb$ for integers $A, B$ and \BETA-digits $a, b$.} \item[{\tt C <- ILCOMB(A,B,u,v) }]\index{ILCOMB} Integer linear combination. {\em Computes $Aa + Bb$ for integers $A, B$ and \BETA-digits $a, b$ with $Aa + Bb \geq 0$.} \item[{\tt DPCC(a1,a2; u,up,v,vp) }]\index{DPCC} Digit partial cosequence calculation. \item[{\tt AADV(L; a,Lp) }]\index{AADV} Arithmetic advance. {\em Returns the first element and the reductum of a non-empty list, returns 0 as the first element if the list is empty.} \end{description} \end{description} saclib2.2.8/doc/user_guide/template.tex0000664002275300236100000000151014017255270017202 0ustar wcbrownscs\documentstyle[saclib]{report} \begin{document} \chapter{Foo} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Mathematical Preliminaries} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Purpose} The \saclib\ Foo package ... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Methods and Algorithms} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Definitions of Terms} \begin{description} \item[foofoo]\index{foofoo} \end{description} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Functions} \begin{description} \item[Boo] \ \ \begin{description} \item[{\tt FUBAR}]\index{FUBAR} \end{description} \end{description} \end{document} saclib2.2.8/doc/user_guide/cPAsRPA.tex0000664002275300236100000000362114017255270016565 0ustar wcbrownscs\begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- RPSUM(r,A,B) }]\index{RPSUM} Rational polynomial sum. \item[{\tt C <- RPDIF(r,A,B) }]\index{RPDIF} Rational polynomial difference. \item[{\tt B <- RPNEG(r,A) }]\index{RPNEG} Rational polynomial negative. \item[{\tt C <- RPPROD(r,A,B) }]\index{RPPROD} Rational polynomial product. \item[{\tt C <- RPRNP(r,a,B) }]\index{RPRNP} Rational polynomial rational number product. \item[{\tt RPQR(r,A,B; Q,R) }]\index{RPQR} Rational polynomial quotient and remainder. \end{description} \item[Differentiation and Integration:] \ \ \begin{description} \item[{\tt B <- RPDMV(r,A) }]\index{RPDMV} Rational polynomial derivative, main variable. \item[{\tt B <- RPIMV(r,A) }]\index{RPIMV} Rational polynomial integration, main variable. \end{description} \item[Evaluation:] \ \ \begin{description} \item[{\tt C <- RPEMV(r,A,b) }]\index{RPEMV} Rational polynomial evaluation, main variable. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt B <- RPFIP(r,A) }]\index{RPFIP} Rational polynomial from integral polynomial. \item[{\tt B <- RPMAIP(r,A) }]\index{RPMAIP} Rational polynomial monic associate of integral polynomial. \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt RPREAD(; r,A) }]\index{RPREAD} Rational polynomial read. \item[{\tt RPEXPREAD(r,V; A,t) }]\index{RPEXPREAD} Rational polynomial expression read. \item[{\tt RPWRITE(r,A,V) }]\index{RPWRITE} Rational polynomial write. \item[{\tt RPDWRITE(r,A,V) }]\index{RPDWRITE} Rational Polynomial Distributive Write. \end{description} \item[Normalization:] \ \ \begin{description} \item[{\tt RPBLGS(r,A; a,b,s) }]\index{RPBLGS} Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. \end{description} \end{description} saclib2.2.8/doc/user_guide/cI.tex0000664002275300236100000001632514017255270015734 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{What is \saclib?} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:I s:W} \saclib\ is a library of C programs for computer algebra derived from the SAC2 system. Hoon Hong was the main instigator. Sometime early in 1990 he proposed to translate SAC2 (which was written in the ALDES language) into C instead of Fortran (as it had been since 1976), and he quickly wrote the required translator. The results were rewarding in several ways. Hoon Hong, myself and Jeremy Johnson, working together at Ohio State University, observed a speedup by a factor of about two in most applications and the powerful debugging facilities associated with C became available. Later that year Hoon finished his doctorate and moved to RISC, where Bruno Buchberger was writing a book on Gr\"{o}bner bases and working on a set of programs to go with it. He found that SAC2 was the only computer algebra system in which he could write these programs without an unacceptable sacrifice in computational efficiency. It became apparent that for similar reasons other researchers would benefit greatly from the availability of a library of C programs derived from SAC2. Subsequently Bruno did much to promote and facilitate the preparation of the library for distribution. Although the translated programs were correct, they needed to be reformatted for user consumption, a users guide was required, and we had compulsions to make some minor improvements. Jeremy Johnson made many recent improvements to the algebraic number algorithms and wrote the corresponding chapter of this Guide, among other things. Werner Krandick made improvements to the polynomial real root algorithms and wrote the corresponding chapter. Mark Encarnaci\'{o}n wrote three chapters of the Guide and also converted the polynomial input and output algorithms to modern notation from the original "Fortran notation". Ana Mandache, Andreas Neubacher and Hoon Hong all toiled long hours editing and reformatting programs. Andreas deserves special recognition. He initiated the writing of the manual, wrote three chapters of the manual and two of the appendices, and did all the required system maintenance. To facilitate experimenting with the functions in the library, Herbert Vielhaber implemented \isac, the interactive shell for \saclib. He also wrote the corresponding appendix of the manual. Besides the above it would be unthinkable not to mention, collectively, all of my former doctoral students, who contributed to the development of the SAC2 algorithms and the research on which they were founded over a period of 26 years. During the last 20 of those years R\"{u}diger Loos was a frequent collaborator. He proposed creation of an "ALgorithm DEScription language" for SAC1, the predecessor of SAC2, and wrote an ALDES-to-Fortran translator. This initial version of SACLIB is just the beginning of what is to come. We know how to improve several of the programs in the current system and we will do it for subsequent versions. Some basic functionalities are largely undeveloped in the currrent system (e.g. linear algebra) but they will be supplied in subsequent versions. Some more advanced functionalities (e.g. polynomial complex roots and quantifier elimination) are nearly ready and will be forthcoming soon. Also we expect that users of the system will write programs based on the ones we distribute and offer them to other users. \begin{flushright} George E.\ Collins \end{flushright} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{About this Guide} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \label{c:I s:A} The main goal in writing this guide was to enable the reader to quickly discover whether \saclib\ provides a function for a given problem. The structure of the paper should facilitate searching for a function in the following way: \begin{itemize} \item Every chapter deals with functions operating over a certain domain (lists, numbers, polynomials, etc.) or with functions solving certain problems (GCD computation, factorization, real root calculation, etc.). \item Some chapters are split into sections covering more specific topics (integer arithmetic, rational number arithmetic, integral polynomial arithmetic, etc.) \item Inside a section, functions are divided into various areas (basic arithmetic, predicates, input/output, etc.). \item Inside these areas, closely related functions (a function and its inverse, functions solving essentially the same problem, a function and its auxiliary routines, etc.) are grouped. \end{itemize} This partitioning was done on a completely subjective basis. The intention always was that the neophyte user should be able to pinpoint a desired function by using simple heuristics. This approach may certainly fail in some cases, but with at most 50 functions per section browsing them sequentially should always succeed in an acceptable amount of time. Another rather subjectively designed feature is the function descriptions. The lists were generated automatically from the headers of the \saclib\ source files. For some functions additional remarks were added in {\em emphasized} type style. Readers who want to use \saclib\ functions in their C programs should read Appendix \ref{c:CFC}, which describes how initialization and cleanup are done, which files have to be {\tt \#include}d, etc. A detailed description of the input/output specifications of a given function can be found in the comment block at the beginning of the corresponding source file. Read the ``Addendum to the \saclib\ User's Guide'' for information on how to access these. Those who want to know more about the inner workings of \saclib\ should refer to Appendix \ref{c:NIW} which gives an overview of the internal representation of lists, the garbage collector and the constants and global variables used internally. Descriptions of the high level data structures used for implementing the elements of domains like integers, polynomials, etc.\ can be found at the beginnings of the corresponding sections. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\saclib\ Maintenance} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The recommended way for reporting problems with \saclib\ is sending e-mail to the maintenance account \begin{quote} {\tt saclib@risc.uni-linz.ac.at} \end{quote} or mail to \begin{verbatim} SACLIB Maintenance Research Institute for Symbolic Computation Johannes Kepler University 4020 Linz Austria \end{verbatim} Messages which might interest a greater audience should be sent to the mailing list \begin{quote} {\tt saclib-l@risc.uni-linz.ac.at} \end{quote} This list can be subscribed by sending a message with the body \begin{quote} subscribe saclib-l $<$first name$>$ $<$last name$>$ \end{quote} to {\tt listserv@risc.uni-linz.ac.at}. Note that \saclib\ is not sold for profit\footnote{ \saclib\ maintenance is sponsored by the Research Institute for Symbolic Computation. }. Therefore do not expect prompt service and extensive support. Nevertheless, \saclib\ is continuously maintained and extended, so do not hesitate getting in contact with us. saclib2.2.8/doc/user_guide/cAsRA.tex0000664002275300236100000000502614017255270016326 0ustar wcbrownscs\begin{description} \item[Basic Arithmetic:] \ \ \begin{description} \item[{\tt T <- RNSUM(R,S) }]\index{RNSUM} Rational number sum. \item[{\tt T <- RNDIF(R,S) }]\index{RNDIF} Rational number difference. \item[{\tt S <- RNNEG(R) }]\index{RNNEG} Rational number negative. \item[{\tt T <- RNPROD(R,S) }]\index{RNPROD} Rational number product. \item[{\tt T <- RNQ(R,S) }]\index{RNQ} Rational number quotient. \item[{\tt S <- RNINV(R) }]\index{RNINV} Rational number inverse. \item[{\tt s <- RNSIGN(R) }]\index{RNSIGN} Rational number sign. \item[{\tt S <- RNABS(R) }]\index{RNABS} Rational number absolute value. \item[{\tt t <- RNCOMP(R,S) }]\index{RNCOMP} Rational number comparison. \item[{\tt c <- RNMIN(a,b) }]\index{RNMIN} Rational number min. \item[{\tt c <- RNMAX(a,b) }]\index{RNMAX} Rational number max. \end{description} \item[Constructors:] \ \ \begin{description} \item[{\tt R <- RNINT(A) }]\index{RNINT} Rational number from integer. {\em Returns $\frac{n}{1}$ given an integer $n$.} \item[{\tt R <- RNRED(A,B) }]\index{RNRED} Rational number reduction to lowest terms. {\em Returns $\frac{n}{d}$ given two integers $n$ and $d$ with $d \neq 0$.} \end{description} \item[Selectors:] \ \ \begin{description} \item[{\tt a <- RNNUM(R) }]\index{RNNUM} Rational number numerator. \item[{\tt b <- RNDEN(R) }]\index{RNDEN} Rational number denominator. \end{description} \item[Random Number Generation:] \ \ \begin{description} \item[{\tt R <- RNRAND(n) }]\index{RNRAND} Rational number, random. \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt R <- RNREAD() }]\index{RNREAD} Rational number read. \item[{\tt RNWRITE(R) }]\index{RNWRITE} Rational number write. \item[{\tt RNDWRITE(R,n) }]\index{RNDWRITE} Rational number decimal write. {\em Approximates a rational number by a decimal fraction with a given accuracy and writes the approximation to the output stream.} \end{description} \item[Miscellaneous:] \ \ \begin{description} \item[{\tt a <- RNCEIL(r) }]\index{RNCEIL} Rational number, ceiling of. \item[{\tt a <- RNFLOR(r) }]\index{RNFLOR} Rational number, floor of. \item[{\tt RNBCR(A,B; M,N,k) }]\index{RNBCR} Rational number binary common representation. \item[{\tt RNFCL2(a; m,n) }]\index{RNFCL2} Rational number floor and ceiling of logarithm, base 2. \item[{\tt r <- RNP2(k) }]\index{RNP2} Rational number power of 2. {\em Computes $2^n$ given a \GAMMA-digit $n$.} \end{description} \end{description} saclib2.2.8/doc/user_guide/cAsI.tex0000664002275300236100000001136114017255270016213 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Purpose} \label{c:A s:I ss:P} The \saclib\ arithmetic packages support computations with integers, modular numbers, and rational numbers whose sizes are only bounded by the amount of memory available. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Definitions of Terms} \label{c:A s:I ss:D} \begin{description} \item[integer]\index{integer} Integers to be entered into \saclib\ must be of the following {\em external form}. \begin{itemize} \item $<$digit sequence$>$ or \item $+<$digit sequence$>$ or \item $-<$digit sequence$>$ , \end{itemize} where $<$digit sequence$>$ designates any non-empty word over the alphabet ${0,1,...,9}$. Note that there is no blank between the optional sign and the digit sequence; also note that leading zeros are allowed. Inputs of this form are interpreted in the usual way as decimal numbers. \saclib\ outputs the {\em canonical external representation} of integers. This is the integer in external form with both positive sign and leading zeros digits supressed. The {\em internal representation} \ttI\ of a number $n \in \BbbZ$ is defined as follows: \begin{itemize} \item If $-\BETA < n < \BETA$ then \ttI\ is the atom whose value is $n$. \item If $n \leq -\BETA$ or $\BETA \leq n$ then \ttI\ is the list $(d_0,d_1,\ldots,d_k)$ with $d_k \neq 0$, $d_i \leq 0$ if $n < 0$ and $0 \leq d_i$ if $0 < n$ for $0 \leq i \leq k$, and $n = \sum_{i=0}^k d_i \BETA^i$. \end{itemize} \item[digit, \BETA-digit, \BETA-integer]\index{digit}\index{digit!\BETA-}\index{integer!\BETA-} An atom $n$ with $-\BETA < n < \BETA$. \item[\GAMMA-digit, \GAMMA-integer]\index{digit!\GAMMA-}\index{integer!\GAMMA-} An atom $n$ with $-\gamma < n < \gamma$, where $\gamma$ is the largest integer which fits into a \Word\footnote{ See Section \ref{c:NIW s:CGV} for details on the type \Word. }. (E.g.\ if the size of a \Word\ is $32$ bits, then $\gamma = 2^{31}-1$.) \item[modular digit]\index{digit!modular}\index{modular!digit} An atom $n$ with $0 \leq n < m$, where $m$ is a positive \BETA-digit. \item[modular integer]\index{integer!modular}\index{modular!integer} An integer $n$ with $0 \leq n < m$, where $m$ is a positive integer. \item[symmetric modular]\index{modular!symmetric} An integer $n$ with $-\left\lfloor\frac{m}{2}\right\rfloor+1 \leq n \leq \left\lfloor\frac{m}{2}\right\rfloor$, where $m$ is a positive integer. In the input/output specifications of the corresponding algorithms these are denoted as elements of {\tt Z'\_M}, as opposed to the notation {\tt Z\_M}, which is used for (non-symmetric) modular integers. \item[rational number]\index{number!rational}\index{rational!number} Rational numbers to be entered into \saclib\ must be of the following {\em external form}. \begin{itemize} \item $<$integer $N>$ or \item $<$integer $N>/<$integer $D>$ , \end{itemize} where $<$integer $N>$ and $<$integer $D>$ are external forms of relatively prime integers $N$ and $D$, such that $D > 0$. Note that no blanks are permitted immediately before and after the $/$. Inputs of this form are interpreted in the usual way as rational numbers with numerator $N$ and denominator $D$. \saclib\ outputs the {\em canonical external representation} of rational numbers $r \in \BbbQ$. If $r \in \BbbZ$, the canonical external representation of $r$ is the canonical external representation of the integer $r$. Otherwise there are unique integers $N$ and $D$ such that $r = \frac{N}{D}$, $D > 1$, and $\gcd(N,D) = 1$. The canonical external representation of $r$ in this case is the canonical external representation of the integer $N$ followed by $/$ followed by the canonical external representation of the integer $D$. The {\em internal representation} \ttR\ of a number $r \in \BbbQ$ is defined as follows: \begin{itemize} \item If $r = 0$ then \ttR\ is the \BETA-digit 0. \item Otherwise, \ttR\ is the list $(\ttN,\ttD)$, where \ttN\ and \ttD\ are the internal representations of the numerator and the denominator of $r$, i.e.\ the unique integers $n$ and $d$ such that $r = \frac{n}{d}$, $d > 0$, and $\gcd(n,d) = 1$. \end{itemize} \item[ceiling]\index{ceiling} of a number $r$ is the smallest integer $n$ such that $r \leq n$. \item[floor]\index{floor} of a number $r$ is the largest integer $n$ such that $n \leq r$. \item[positive]\index{positive} $n$ is positive if $0 < n$. \item[non-negative]\index{non-negative} $n$ is non-negative if $0 \leq n$. \item[non-positive]\index{non-positive} $n$ is non-positive if $n \leq 0$. \item[negative]\index{negative} $n$ is negative if $n < 0$. \end{description} saclib2.2.8/doc/user_guide/cCFCsH.tex0000664002275300236100000000342114017255270016423 0ustar wcbrownscs\section{GCA Handles for Hackers} GCA handles can also be applied to C structures, but as they are interpreted as arrays by \saclib\ you must make sure that all fields lie on a \Word\ boundary. Figure \ref{f:GCA2} gives an example. \begin{figure}[htb] \ \hrulefill\ \small \begin{verbatim} . . . struct poly { Word p; /* the polynomial */ Word v; /* the list of variable names */ int r; /* the number of variables */ }; #define poly_words (sizeof(struct poly)+sizeof(Word))/sizeof(Word) . . . struct poly *ptrP; Word P, L; . . . Step2: /* Here we do some allocation. */ L = NIL; do { P = GCAMALLOC(poly_words,GC_CHECK); ptrP = (struct poly *)GCA2PTR(P); SWRITE("Enter a polynomial (0 to quit): "); IPREAD(&(ptrP->r),&(ptrP->p),&(ptrP->v)); L = COMP(P,L); } until (ISZERO(ptrP->p)); . . . \end{verbatim} \ \hrulefill\ \normalsize \caption{Sample code using GCA handles for C structures.} \label{f:GCA2} \end{figure} First a structure {\tt poly} is defined which contains the polynomial itself, the list of variable names to be used for output, and the number of variables. Then we define a constant giving size of this structure in \Word s (rounding up in case the size in bytes might not be an even multiple of the size of a \Word). Inside the loop, an instance of this structure is allocated. Then a polynomial and the accompanying information are read and stored in the corresponding fields of the structure. Finally a new element containing the GCA handle {\tt P} of the structure is appended to the beginning of the list \ttL. saclib2.2.8/doc/user_guide/fLIST.tex0000664002275300236100000000232514017255270016315 0ustar wcbrownscs\unitlength0.5pt \begin{picture}(700,80) \savebox{\cell}(0,0)[b]{ \multiput(-35, 15)(10,0){3}{\circle*{2}} \put(-15, 00){\usebox{\dline}} \put(-15, 30){\usebox{\dline}} \put( 0, 0){\framebox(80,30){}} \put( 40, 0){\line(0,1){ 30}} \put( 80, 00){\usebox{\dline}} \put( 80, 30){\usebox{\dline}} \multiput( 95, 15)(10,0){3}{\circle*{2}} } \savebox{\arrow}(0,0)[b]{ \put( 0, 0){\circle*{4}} \put( 0, 0){\line(0,1){ 30}} \put( 0, 30){\line(1,0){110}} \put(110, 30){\vector(0,-1){ 15}} } \put( 40, 50){\begin{picture}(20,30) \put( 0, 20){\makebox(0,0)[b]{\ttL}} \put( 0, 15){\vector(0,-1){ 15}} \end{picture}} \put( 40, 20){\begin{picture}(600,100) \multiput(0,0)(130, 0){5}{\usebox{\cell}} \multiput(20,15)(130, 0){2}{\usebox{\arrow}} \put(410,15){\usebox{\arrow}} \put( 60,15){\makebox(0,0){1}} \put(280,15){\makebox(0,0){\NIL}} \put(320,15){\makebox(0,0){8}} \put(450,15){\makebox(0,0){9}} \put(540,15){\makebox(0,0){\NIL}} \put(580,15){\makebox(0,0){6}} \put(190, 15){\begin{picture}(200,30) \put( 0, 0){\circle*{4}} \put( 0, 0){\line(0,-1){ 30}} \put( 0,-30){\line(1,0){200}} \put(200,-30){\vector(0,1){ 15}} \end{picture}} \end{picture}} \end{picture} saclib2.2.8/doc/user_guide/saclib.pdf0000664002275300236100000162575714017255270016627 0ustar wcbrownscs%PDF-1.5 %쏢 5 0 obj <> stream xWn[7k7ˤ<..;Nc.=CRCj p8sd ϓwGyzw2ӻ畭_N|zM6kgc6oWl:)ɧisUFdc.K6A=V[CՔN=8mSR9%gljz^FozSwMp֫h}>o|V@Du-~/Ožp B} S.$S)xGB?&%%O|f<=QbgZmH d&E_\ƻ H~Z#sr%7Rg"T&v8S\]/'M\F{,wY]:8NЃ'qh%GmMV+= KǦH b}bQ?V'}hd)j"厓=ͳGi[ZO社)b3og&9l5^b0g,j#1hrq{LnT9DŢaW(]8i*b 3 e&c|0}V5_Q(\5znrT:2Vr|Atd?M0ft?zauwtmݲ=ŃE/%~SC_8gcy$\\/^^ܶNg-rJUvmL eaϲ^v3Y]|JĺŸh$pQ ^gIMʁ5 c[q;D<Agڠx0ZCxC 0x_:(klfn*@۷JE_u*(PxCC>l>%sVb> stream xZKs3bo"cJYfNvHQDTt_O70m`J_ݘ;)Nҿۋ~w7rwsBݽvQD]oZw΃PvMRXoC:~BK觿5~So_. mm$ .pW8饣E(^;צYkB hS/r01? hA: vaPB:fVLLOA8oo"t:*t}Rz:-svwG@|(a1-\V6A+if< _F݄}N<FJy;#Un6˗3Swec䡖ձ_օPuRW?cByc :.\AfN|5ϣk3w2݋h?)${.@8=tu縧 J/LtV5{LtdvҨ,$X7?}oNOʔ$ST";(d*arKh$h| :GGWqU %% PP_.+"oc`Â׳\zk*۝PtМyi1Iw!Rn@oh {,yM$SD0 BʏZ }7[*sગU+÷y1tN*UX P3Kֺ=*˶ T;Н.vNT¢W>ۡ ~UwsUBx|1 cTKrGh\DHsHd߀`qZRntf?}2O %yeҒS+Tr"@#ǙZ~l|wiNBU[*'([Vj:Ep7\|C߼y2X<}$ZL"IΞ&8Oolxrj= M. ~E6|!،T=_e87O'i:V'JE㐔vAvwd5SV uK0oh#dCW-@󸡃9fDzJ#k^ޔFwh,,@>EU.`wqm i, =TY;YXdMB3m/x̦UX5SeE(]ƨ_]q[P! n nMƸ6ALm.d9+yZi.26HBe_EgH_W*RJ:^F;5|_ 4g]fL .`/VuVV+UBU"a4u\™zBU4,E6OwU! @z`]oj@Icú|*bJz۳.6zV'as0" 46IQ$W%Yըu*=qy}>~z=B܎k<6EDdk(% 6 ]` ` 9O3OCm|/ $Nf<:.c>w- kkDuTtzpI^腳`UamNrֻ8lP UC:jy._^Sc7+ bypui3n!4_N`4cIIՙ7dW8 yfto%}fҰd+[+ѥ}9G/NhZ01G9@Ƴ*2~~@ijH*5?z^{s ]Hbuƌ|hH(kZz@OwL]fWtQvÈ7GõOуt"z0@zg8"{TTn{Zr^aR &וrE찚_SO(נ:*IַrT}.WB`z4m dd㋚0}vƇΟ0n@B-/ʌoZق.GaU.1%jwHh5H4XV%}" .deҰC؆!l6+zܩ2-H%L3 2Se=Ak?%ꤱٰ@O*NaC&% 2gJY7ex֫;!?n hOT(/cZ24t7/-)z o\_( };`rl}endstream endobj 22 0 obj 2602 endobj 30 0 obj <> stream xUKs1 W9%ul0\1ڤ ǿGw9009US;mgg^>n0vu; tI'aoԑvnY]\/{}ߔyT0F\$uUZ"*vC 1P׃R5FALA} ׈nKbtJS`ՃpHBΘv)ZuSx]#C5x'6:+r`!՚<%Ƹ: ?<(=6 &l`ތnfYmKA3h*P|31a/yEGu0y̺Ep%MQN}q# !.tP]VqrJL3iijô !61+Ov߈s}KA.s_JLD:,3ZĈ#Jw<kP koYAb)x9Bb11& <1lʷpN(Jeƨc™J9]*Kk"'3o+ؘ >M4<:\Э7Oi8}U7|XCO5Ad3[IkH۪|$H&G¹-&5+'%")%cM'%vF)Q>l mҺM>kOXx[gm~34L/Zs3jk~=Ք=>עftbLU` Δ[6[{3,>}endstream endobj 31 0 obj 783 endobj 37 0 obj <> stream xYzThŻs Nba/٬^.nuOwϱKcku)van ]EAs2 4>4! C6).nD־E \ؙ=r(=SAKr5ctMMTDK;,c-7+JgEE*x& 2R}Enz?'-]OWGQ$2OV iWF^1ɹ%ݎ0UX0aLܖ9<:TCX83yKfRv2r ũӠצ5/qQ!S `m}&d7V({/;$Qw>t0֏+ .qyg)25Edq.Pȓ#)P2I6 θ<гmO~t%`W ,ަu6$ ZY Z&w?),40",{h^ۃyrm"Åݓ6 mawn:;'G`z.'ƿ^Ԝ @\wNLLkq}G9%e>#`ӗ9hca]bCשqgys˘u%9s6qր iU2=s@ڝnUQܟ?paWKH81.TD~' /`57JMOiohi}с"*|GԠ^?h#_+3=}QYpAFF"LEDgM2dG5L):}dsvQȩˁExWTW6m%_v7u20v[?)5X6l4/U2W: wXEaZZCl΋Kas-d@Qendstream endobj 38 0 obj 2414 endobj 46 0 obj <> stream x\KsOG̑4'$z*9rؕX֮Z43l3;,ƃǯnyZd'>Y|,lyy? @,]ry57,776jvBʚ՚*.t/3ͭ/k2劵̢+[4Vk6gפK$:6(_kk9m/0*BS1hl(*ˤzkl 5-#VWiC0 _9QpB1W{9/+x;f^LD<'U9Z;o!$燷LKc.I{m:trc*83ˬcO Z~õWεڲ,,$ JkHOq/rȈZ'9(;dBHPvƖZWׯGn7~{\3;!-7.6,"F2IGUJ\,%3%Kgh3g|uջPwFHIcm>)! T'L2E{Q9/q!V-#kUmH]s:pv.mĕw+FyשJ*6?DRfXTYA.U^kprp_B1^˨uˋ؈_~p\' %ұ<֨< p %ojAZQЩg~z&.CU>v k*zhC$&p:G>ώon$Co$ ORW2h2śbY!P9AsN jڵdu gd)I5Z/NGk~0\h}EǥnWP̢" Pz5E:k{$EvqwZO|*p0p$tfDQr9r&j8rLd|㹎@X>G=N4y4+Z, 6'i/dI[dEr;) sL PMKL´怞z> $n*Vc>q}>8Cp3R0qgeLV[>LwH{By'U(f9 қ=7V+;ˎ83h⭊+^=lB6 0vEy[KչbG O NU'sVV;[Lj߆U£uaI^yʒ}*0?:,Eci-pmiLRTes:DDʬ_ip")ADcj,rt&\ jv.=3`ZC^<[C\jV!V(t5WC 1N .+|;*KtFP C&!8TɫNn?463sB-PIϩtɂXI$E>?'[8HNм䪅c*q0Bm/qFmc&~1'0< 1!EhG54? tkQF QKقclDkG D8BӢJ2j 'W  Aj%?U"g OсhGK:y)싥Vh7AKrQ!p8MFr)9DjЙm 3HI_D EOK_}RK) FI;ôToQwqUJ+$}Yz$ǟH9>֍ d?}]`8rwnA4Dd84fK/7Y:ih~VɴR朓r5vaѡd^| e$߬ a):-)#r(SuBi(S9:(~V!<}K"h7%[_ߙCnq%Y;65]1ڶ"| a-N9ire.1as̎A140ΎIy3C.H&'82.mN摣:WmJh$^0╡>#C ߬#(aGtءMo?".$: m/r8YJ 6ʵ(әMgkqR< P4a; iCZy'F7BI }~Lj;2z/,MHY!_{?V Lendstream endobj 47 0 obj 2557 endobj 51 0 obj <> stream xWKo9ϯ[b*BH=8<ђ~>eww=LBF,B}jw\ PxJEPvk{2.,(ܭ$tI> stream xM6 :R`2=$iigm[C_ٙݤ٤I}AJ([ln&i Km,4.ӛ75+(yVMY_7h!&YY߬~3'm%vdوY̻2f$(DM7 mKOF" AXP$?6O;+ReO+(VȜj.K QzǙ]Вk*{.r$B+K(.TJN>jl6c â"cϠ')p,iqC>07 qx.8҄w|1@xgbG|J1RU+_.uC ,W }y֛#R: +'#~a5:9yQxb/NyU}m9tO^Wɟr$=z"[k>@ׁ Γy'c~Dkt>];~Zh(-*:j6Ypf=Y7hp;[>B쵗 %3gO'Rnj7ϲS c˨r?x_].'E1=ہ=X],jܼ5:Zk)86 D]c Vݜkɬm*χ>qI\ |C6ɼn *7KeeoE¦~N[? H <3ja̧w,X> stream x=ɒqwOovAѴeY"l$@  $R8םU/kɞ7 ZrWjW }zzGxU۫_?6_`Փʗ*MGsڜWO}7j6yOY9u7zS'}Gh==gQ~A4 1&?O~[㶘%Փ=zw< -ϧ7Vf)xsp83hL>*z oamtv1xzR&3>c\ILvOQyߪvuV}ḇmM66 {ٜdBpcp Lʦl \t6^ >i¥} [AtvJӯLZPo)eԙ`6*&8}=W϶76[M>fO7m]Luo:X |ldr>f)Dr0),p`#\ËV}Qp![w/Ϗ[E(S6 w*ħH#b-n|=?opyU%:M=;Pe.pxZ[6| ;KMc&X0LlU(6Y*?+΁]USoA$k2a pTܳK3`GOH 7G ;A33rqW;_J4U;* k_gLȟh8 evnB3<(1Y@Rg/[$N;1!/n8;ix@;Gt&+F\)(Sd.FR/\ AT.@Lg` ,߆[DZiPgtECx }ymQrUhhIN߰^ X~M [4`:rO |y[=".vq/ߓ5Sm'7ABc٭Ε ߖofxق '^@"u2D6/+J<!#>zQP}SL~Nxr F`NPk`y0.CH`Q-GppE3͐!mݝ7Me"Mȱ["4AaZg{YvCTdA\(12"vJN^Nh֋]3s|5>[P@ ey@F{G9$ϼt[=UttvwpNF'H[g@3&LV9؆["h#@VQBؓY9U 9LA`~]-fg(l,؍ƌz:E-3VZ5>JN9fҕD܎lwlgܵ½@\JRєܻ] -1>Wn!,?|,2T^þgD@^&.okT=nvkYɇ)ͪXUHF cʆNJw Acxwk!ue/ /?\3tQoiNY:|Wm`ޭqk౏.} pYw$a`'2.vX-5?b» z[Bc(hca)'n.wukT,$-WYPۗ"2Ev ɠ$wXHgH>|":waMDhPdſRp*d Z. NDO$v3Q]4` t 1D jA!|@0Q ݰLkN! < KZT5/)DTOI4̙33G** L !ˆ&"B h~U噌 }舁pV'rc_>4I`"J?izZ(gO5Jz] ۔dr>9ȹX`EN|W3F2̭5Fq}]H qBrUA mTg$C`SZԦ(B8V$*Q9Q@ρ0r61fdO򒜋,V R 뵊c\>E%Mwe ՞3ӷetB0IjwNhWf {IH=pc`s9%+esJubNzEqgv]?Qt >DNk&tZM^ow9\e^0_" qX"u腰+gj2y3F7@*.| r'Yt{V8>seR!4Sb`㤗S-8:z=a)wyOe7:t5!4k(E_,n1xGE#KD䳶Gy0]%lp!tITdAޟv[P@FQ gF/2<2g{L\L$3_ 'ڢ\c1'P0K؆Mrx?.sc2?P> >K;:k2ĽNWP@:Lv XewY I7Uyl=̜YvO-,Un pxMcqt; {4{REJ^w.'׸7I2ep$4 &Gz\cq{H48OңŌFd{fh0:Nz]|h OW.ռR4'f:aJDNM&Tk3{wajnᤈ Kd*BlE>V  Ʀ8ǚ= +.{,lbDQ1Ɍ{zÜm -U=B_tiLpo[Z:ug@kn찀B<\|=pH$]PFL₇0I++9&b*cA̲`:c%),Gİ{9]t1auֱ](߰@dh# 3Hrpv Nϲ /Jrݾ{zz_E!M [IZ;d8[(`rvDdXWԲp@H\k"1a;KeA-8? P>#p?ݝ[is^[75u]\ɧzq:6bhquQY,4y956+^@\1= F!S 2bW "sc+3`:2c-8Ũl|CEUL#6γoco8"M ^qmH`G,b=U쨅Eビ{~|-K*(3j r}#ea!_{HN_] C6^B]R+WȰ})iW«w-J!ZTҲ%ݣe>W:: #0wT.9AAY'\$.T4ŵ eyb"鱧dЪeCaa1$vAOhRrmC*Xub{ ϺCZҎTHAIP}i<.m|1~4SS9sڶSNkЦspH4KG} .X>Ha 皒95֐ X|$ )50jl#iS}"+w5Yj50[qiX}XkX"s gpmfc+>šB>,n5}4|lUak()*~W챷/Mrqd+ y r#S] @@7{ ۲Qk}\,E\$swrDYO}z!{® = KY5կsbV9.Ӈ{KBWYZENKWXv.N]}e0-xc9Y.&etr!,dдzZS.0[#ޠ/nr01 *w }%OZ3s UI=z [oLasgmD^> 5ҲIm|\e&Nj5ێX#L 0`g^{" #m sur}{i`ܗ%DmJ/<|t2y n9'13_e[ ?{އm,q r~x2c bJE U9[2YTrvjEo56B/K-q8EG)C:mBS ^pAs1-t&گ;5u,=a_M9bOUri,Lp[Y`XЏz1~ Y?aǰ>mtµQ 8Q{g>׆}N~צuȏH8ȡ-Oy Dp! ;(ؓФ>j8C>ׇz0xȖ{#'<7{jxЦBE?.Ϳ˂ 0b?`hˍi+KU *.9aѶKAt`hJKD}X }F]$u9yH] 劝"+xZ?yD-x Sls3hnĜ!M,d*=lAEƩ-;\2ɣ5endstream endobj 66 0 obj 6595 endobj 70 0 obj <> stream x=rGrwz" Ѫ}3e4H I(ɬ;kF <٬%+x&y&Ogwggx>Ktʙ/Ypy B,Z;mNo|*O8!>iVi0&zKqp)B#2 ÿ8^-=1ǔ)8$J"*;V6,|Z絍e#: $ yz+w,"K^@ؒn^g)=tuyQyK(/:v;AWȅ|IDuOPE"13h936F~c5eW¦Bi]bS6HHHǂ~_>%}GIWىTh h:@&: vahҤHؖx9#. uȲ▖nߟ](@-Yo-WEGy~//y7#Q9E)QW_x& ЌXOTȧ+#PIރQp pj|C~/wFdOiЙEemʂa ݅%LK"ZH?90P׀XѺ@s*X98p2B^Uw]x8< d SW|]z'yqbd[3|Ҙpp Pru9q=TͥZ/_m j(epМ"`@Jj뒱SnWHi@jeB@'QK{*'&U&@5k/ iQ<=&S딙D Ec6iDef\`JocVM%>HU\/ |Q~~v̠~8ʼ섲Z648O׿lk56yt pR٢ߙjJaE%:c̈<䛓3)q6m9eGyh1e>teVǼҸ͈|Ke=ML)مU.XG{p0>i!gi>5hauPkדvđX@ƃ̱.<:P\75 '[& Y[Ql@r쩯h@ "3G`Nwқ~ WQHL`C[xPm'4q*[&/4%Q]^ŁFPqY\p@A 5izbwn6j\0.9D|5ҫ{'RͦzH{D MIyu(/YLg*#T1;0R "9F2 UY:I*"mʆHOe۶Wy]p#4#!9nϩ.VtKk ->%:uqv^_U:rІJuMP_>4 `۵L;xwG<艠/v¬ʧe5OK1B't桙)2j*-D\TГu !+,&ѭ'=GȘ0<0XS(sN5S DlalQ,ۀJL ~q͑B]TyS#g%FH -qK nli20͉^#4*4UD|F3c:Jj?AӼD|31'L@O=L*y{f8/?M̬A^W@xv88d4V)gԼ;P풸I9&' 7sE\{a&ٜ,*N/=ɓBS]O$U` IS3ۊK>S\ܒVtE+UrnwjҒ)30v#p5]I$Nv!2|y0Okm -&f"*^#oĤMC>f\ɢ7YS}g1(F]`2# %sE9g'uwv|9Hm g*=N/؂20-( s`ұ e 5"UZz^1ꬿ-L%Wl̎X|8h]e33{GLzڳ4kw׌I\] \یn!Z>*o%I?MӬa$w鮄v1he8ARtZLCb7+gɰ 3g۶x9 #]f`R;k2M/&NЌv,@Zj3]2'Lt~Z4E_N@cm&8&\E T"20DIǴ!i%{ICF<и#n3SEb W$Wx3lV J IK` 24\ɶ4GJ$@&%^%(An>}huL^ ސYJ)墔 `rZq_ΐEqX~Kvl]ʭYK*n>㈨+a||Ԅ\-!dS}~SyV y[28S(07Eqbf]~z?e1C=r붋w>*y; #1a $)_rt~ݦIԢ+fLgơ`|$z"%iF! a;:DxlTYȹ2Q[n b3aV,f3<]ePsPo]x¦vV#q`gpT~)P`ڄwJ3|RԚe9gCap#ҋ*Xoi%o_3 krեPzA.{D' Uc@3t! GLLZ&}Qci:wDd%~]s ]lm'UZ`bSA#bb R/*7[\4{Hyٍ0)FRBD^kFTn𥴳JAIg :&fz9귾>ݳ} 2kzc( ݩO{GRx!;dL=&tB1UE,'l8lXƺΣa^_vƘ)yjI}/?ވoxfLMr}9Ծh=+練sQ4pD.}RtLȑB(U;Mtj/+w3AdnV3 U(*+ [>ffOҔ ]x*5bQL~Ř)_`A4҈h4K!NTk)f~s( M|+U\^U.o/G |GBg`7/* x*Ə]/G6XK8_(P=5][{eQUo.qT\^ IV gi:z`+O ޟH_r}Ʒb7.O4'j+WLmDN$ "1KLe.O'4\!JBzZ>O2 FPg1`ȯM#K]>5Ԋ!s+9+c\VmwpN9"rw`E>XNJ$0l)|$u9K.!>JNU1F) qs$a&#҈!-t buS`͌Hj!KW_I4Kymi4leOdͯ)2k1T(eQLWv~βlKd-Žw3GkNpOz.v w!rN"к@nW%T?T~hlҴ[3rCv?F JL~ V=O!uΓ[;m}dEѼN'[Nm~CM`>wZP:K˽+aOV3qTm 镙5m#4IJ}=wj.,.R4 ڶX>mI뜔FeVFE@ }b?$(/ oϘP49J}y %=]`a(5 B Itz8&Q~q > stream xYIo\E8FLEB!DHb8l-87]^ Juu_U=8ŋ}7.p?rxC`JE)opfN֗˃=HV۰|^RTꯙj\[iUn2VJǻpe wT,p6ۥn/b 'kS2 ˌaC5fN1PXPjyTD4$x<>POוz?-*ȭIʷ{]qRq D}ߦ u^tnj} $:q#]}LIZK /M E/ʑJ2ka#>TYP+8O=oV<49ΜJ9g8fgpHTH̙q'qV8k]:fQ#@vj3.=[J)=K7dR2͖bMiB9J:;iW1cB='I0*m+RLRXVf/N`~DUjʛ~|äenjw0I}>1FSn Z?,#ҜJD U(4\[ U|v/g h*Xޱ6UUôT`Zy\(%Zm5>.7+`^C)Զ ;^6 Z8HWODK 蒺Īe/1:{CTޮ="z]#ϥd9-%Dގ0}Jezޫf3v4b Me,yc :Rm;i-<ҹ" qL)?Zm0IWRu%1 Fmѽ#5NɰNLlyO6+WY[R+̴: fn~"Cp&s2wBX;3*x/| Q[õ̬)l}3[LtB](, M0Acba(3\,|IraRC)! ^p5NqLj%X_nX8z]XOci{戀DJ_t<ժD[(dvFt&;,@Va3h@ӓ8*o @]"Բ `M6Q؊5 y̚m/%P'9l=J0aFnŏt l$47Y\]!" ҒvB픅dRw=ڱɫ?M3 X>F{nAQxWc~^/ޡ}^ᗅ93 ؁t-bqA:#8<f_,2>#aѩ"p ۰Aa$OwN@IGHK8-3q^#Cցh<7V<idh?PŬ$)idY0sܗ%^өBqa`ǒLߤJ`i bBRmuGը$Ok"8$\EImfk3j螘׸ث0slsTy11?&tGٳLEE> stream x\KsΙ\Ly'@"'N)Ǽ9((&EIҿO73 0$U.4F?~ovb;A/o~w?7g2\>*@Lւ]|{;o'?icvg_p~RH= tn '጗C@f{C@*qLwaů?O y/C }=hI"E:w8DR/ϑZiNj 6yF=5_8B*{zRɹLiIKܛĭ5J*i}武%#;V>&ZgopҌ|ּdcnqx:2N2߈?`B^;Kio/3ڠl!@k8&+toP/PП!8%+-,~@YG%9.""I79mڰqz'm^gWB+ɹ% oQ<#8'Cm+>"EHXrJ'|EƞwlJ>//| ]U0FȾ󓳋ExBOҪ)KA|+wA &?Y&1PUDZ(xS&+!t:4Esڟ8QmJj8RϬ(y kXPgFgm"hbѦڢNԲDM>Q?R~ߤCe(sWN"tЇ=~z0= EWdO~ K*qxāC2v}jyp qWoUsu s |BQASIv>rD6mFsN6 O CLD_:3LjI#"wH4OzƍMBȮkMv|@G$.@M4:E[KqU)) zQIVE}b8z5G$3)ŴN cd6:a؜";QYhKp@Ag7z$?loE@8`A!vƍI|uU/oJLK =}2rSޒэUܨᛛsEPn>8 B-ʞ@c.!;#hfqҫkZ]& wL#,誾;7Q/ǟU>3L1GP%v;~V pj&I0#HΖL׭mǠ9UZ Xƃ1էFUu*QN֮sqݑR>9F_ۚ&ÇŇj,ZΑ#>ՈoSCI9+*":/ @4&8AEfIy8Bu3 Eә$1#W ʀNiĸ~UZ$K:`$a#;`\֓0fNF{Dv{?CO*|DȂ9%9:M!Z~JGr+p2"F4.hT$9 ZXQ^QxI XYz+K3kYD+#c._oN Eؘij(P/ѴUFiq/fҴT$" Н_p rĦ0 #tMm!>T#0˅`,G騎53cQͱS~\6"fRG)֋z~Ty5@9spw;~|@hh&b}bPK~䶪3,҇dGD`jhU ֧5"2꣕i2BNakc +YMidH C@{Cn#B,G.T!(_K1|Ѓ]`4+)Ѵƈ)lvZܘIYgʻ~ y"Gv܍Jopԡ<.Isvm./l[v㊕.yC'dL'}? Zn]5Z/Wu l9ﰼea-[q 673]n#S` /+YQ#"v%QLeXIG +qWEJL&B 13xHgT D&G 2ABs (9_1H!kx4Dͩչ|n!@nKTp,؈%e`Q1 [PCω֏fD<;;U\e۸=h렜%J~wpl͒ׄkJ|#Q iY GP8' +{M_*?G1vC #MԨ"k=ro|:wNUW]ԟ.BtH9{9G #E#.k2kF>g=EV:p@5N8VDfOw,=sTWRraz"0MmM\Cl_0,юd6(-8u&ѩzyJN2+k,1RVxu@=gwjT+2ٳ(⍅rkΐcL8î:Ej'՝VK-ٙ=ekԅU1g,$)Mm#. V^J̟/ϖ盕[iJ,Ӌ/ΨgÙ N2zw{*77g_;&yO@#m!4L'zAh{sde9C ")'E)QF25K20|* AٔQRHșy,䜵"ަd9nٵ Vga4h0s؊W|DWy;GP@}}lU1!3sK4n~<Ɯb/ 1yR.9dU!g endstream endobj 87 0 obj 4366 endobj 93 0 obj <> stream x\IsYVU8A7v;>xKURb9)ɖߧ̼G'J|Lup勉wgWg^Rg9N~΂35gWw>==WZ[™. o/6`ݿ֨,] `yRNH^>A9К5!?gJS|WntwWtކE'~zEN֣/?ν{:R_yGw_[Rp]4Ń44koLY;Q.`l}M7PE@7aގ~SQU#ЖQ6HhE%.8g;U*BcdSNk(GKqc#X<#䌨'm -"{tӲEk[NFj@WH|~Ű|>m:T:.3E4##aZ(\06UFYOYӘ Gb."o_؉%/c:󊶬ϒ/uw}cnIJ{/(/,9.4PjѥFYF$8ۚDB*Zvԩ^=dFvZx6ö_76V*(lZy2qwvkP ιzЂ7˽E >jᧂQuko`:.Zvɏv?Ou6sK\`4bΦ5jY2sgeXNkbr=!EXk.V-Um\5J[zhichj)r)I󅾅 YԒ8UhGH^c$c(kyǑ#5&__ ^!X&r6:fc!z%dDTY?!h]%hl~5K6Œi4sP۾$9K5vx9[]QuTGMTۤV@ePM|{-F G96Cpyf8J-%h$WmD'=IYq.aT3Ďީi[v#TvVOΙss2ZK2X0v$-ဪ ]c` "Q^y!479Xߖ+IH"R<[HAnp-]$@7Ŵlqc)$un!ߤcaLKv@dzkdh/Wܽ!QVJt|64!/JaL(: .#.+|jЄ-&LBƤ;TW"sUν͗t=*U_Mi΄HBY[ qt\-Gq ,*'@$y+RFCݷ`]dDI~b$T6`\rerr^s917K%f֢Lfb%eC@ȧl-EVZW $rŴ0Uœ} u~f^coAc<2Ղ.5sDZND83:$Za_FR 5ؓ^ɫ?oSeڴ' K[iȱ&[%UtBK=R=C>7ƨ' ѯ$܁腴=ihhc6XQ`|h67%>bBvz'흢$SrAXG;׼4uk&`$kjˮ= VZ&KvWɎjL%=`j5/dgǪFUdr)jO0[aBA[oB@hYϊF!k|Wa(YgL&8W!LB}CiHK\vK q]w0SeuO{:e ԖуVߠ[m-Ln9Sj}ܺŽ!`S䌧84]MJ}l&m uyQB/߹gR $Km(999Vk/, ?N K!b|o+Bq"tI([|1ݾ7]ޟ8b{-A Ka?gTJ3_gqsҐR)զҿ$ebs''ْv3v_N=#;[N5'.3mFil5*g.4‚&-] }(nπZ|ټ{_`y1r oK)c8⑁0S8@ ρJ>a̢=2P] [j'*L- ]lhrdNi1z۩ex>0$mxG2|Tt[Ch`! 773 d  Jt4U-t{lOŲzSҭY^EEĥRr{FO%M /&En C@oeO5qL22;l!Ӈ0ŧZƇYܬ-w58Q1QNÌhC_9*x_e/lj¾k_2'0+̯X֪O /iCrk@(TDZ(Wf_Hvmc[9U(K&f ؖGf 5*waRcoOj;`\T%,n"@1%anC!nP^v&?$Bh ;sO%.b`->Zę{O򐥟.ID ȵ(79眦SC_ )+LUOF4-NS 5ĕJf)uiAfL ZmWY8O6h[=脠g{*> stream x][sݶ~GǣiX\؉8$v:cיȗ8w %^$g AۉFk>:c{L^;dzK`.4*w/ғr'l;렑vWg;W?`=>x?904VQ]l/q- Zo`/Dc_ύnHp:_Fmmv˸vtC#S-Nq*jXx|ndT6$KjsDK)j[aMÅ0H#)Xl_PBUm%l!!G`-x<! H.$g0w Os.0r@+ P|G@r`7کƹY5%:9uAsA#b7Cv!"͸rr[fEZ 2""Ad?i#ƣai&,0ch,2Qp5Ǝ)p𰇈 N( 4Bږv/ɶ"eU`ǷґG89{c+\)v?,*+3o#uV!+7D⼷摸G]ꖘgVNWu7lYw2(пC,CeOrADAGq$5^t+h*GD(׾<:,w4gQH[C|K,,S';AP;#%vHm09 Eo`y}E$7/ݵ/=#紅8ȁg}D`_^"'y26H|^~pí=2mT.Gh^A1D`XnsLy;ᛘReqh!ߤ-D:cM%W 0q<#.]%x00 هBSq.&<>ԳDh)@='1>i1ӿŏFAEcAOs7u525-֭I::nU =XXe銑Q2sQ x{(F@;? vډ?#b^\ N$'S&}E..gΧX JR3tLd7Uz?G.=teLGU= YDjc"l17&r~ϕkT`RJ-OmȐG6R\C>u4*_rL k'ioꅩ2™v'IX}f2dZYU)*"Ш7I JrS8_2r= ^_)SXZmυmOf+jI/2r]=sO0:sDRyw56'M }}\.=S>뼹g s޿6s>37WƼ~vjF=pTzt #*ظ49#V$[n\ 3jϧэm-{ZC_:։h,J0y7OI!:%ֲ:@|zfK:vJgDAD m k tц@@/ۭ_Ϙ O2zY^~n~Y4tDAb!@ッ 2(0[-sVy8)j"7j`M% x:W, DX[Y.e@Q\GC҇:~JΉ 6f;eAJꅷoGӥz&ݤi.'TiqX.$bx2IR&KsBG^ 2-U=ҳjnfR퇜E/8xz#-* TT\&l*RTBoA5p@Y*Z k풼S~E+G‡Nw>f+]X) Xu8d>-s|16#Rzhw\\GZMH8凫qf ?C%ݳuN$\,nE(3WیTVtokt?H U!.PPGgx@Q"/C(Ąү` +Eл:2ᔾ1ȢYaQF{:''wQ 2|Ek TR\\y&@lof\#T(MG4c.y9(Ԣz;H ɍ+ שk@_ (Žq'Tl.CGT84je6vCP.9Kpfkozw+a;p FCAhM&~tjE T#lZӡFє2hkTآnΡTXܢz$s',}oEE0l8~٤\dI,)8*0(Y  8 ?:a6L @E ȬP85ζTvAZr.f&f8Y{tLrrD8~ݓB`e=^HVQx4NO~)(*_$_fŷƤ>4ܤpNRw?9Wmj*1@-W4܊; Bqm&b N s&=$C諫PB <~D 7E]lw0Z3hHUwE;mcAckD[>8|XQ>[4ککPmw]#ۍA%&FF)8!FlrƧ5j|ӖKl\ SG:]ЀFxv*S'LxSp>^:D> c#kTVVlaqe8 W ꑐРyr L]@}-k'2S@d1C@4\L< :4L 75Ns'"$sʇ-sh*/0NKNdVܖ#LQҀB*}cypy-?w endstream endobj 101 0 obj 3878 endobj 105 0 obj <> stream x\Y~ 8xۼ /+ɖU$yX ȗ}Hv&{fGAjpdX ɧvz}ꄇ?nN\N0I|rfݩrV^ܜ{so{Rla锶3UrY*+-VmӵJ,3t|vVAq7Og )Rmخ:dv9thRSis* +crH#KNs"% `.^'LKEI3 ~/v %fÌ?1ԗ^2TP FlrR &JDU$^&z/N!ā,rn1Z~SZ:8o~O]*mt/?~'MX0: TD`Y<*|:y^Y?ߐ1k'\peWse(~tCB_i!wW]e_{5Nng{HǬ; ΛI;C*1kB"1 Ŏ?q'$5\tF&{Q>^c߇MVNs+L[ qb16 0͆#щK{杻ڑlV=g5U.޹;?&3́3&o6h>d4L&3oN'J魛Evc]"馞;1/dAgчES!XAҤ LiNu]*il3up3X&M|M.ME *vR+-Q|Sǎ0,ˆ=[B"Ch$['2:%‹f,};ܥ^5*;!K1Y'_O"'t!֪Ӎu h!f ,B{1Km%#CH)pHHfUrj@K43ZS,a?S'/F:y/JG-ߦ&EnSa.ԙXL3ZWl>賶6XVΏ4fB&C#=J4AWu}Hn fT!%ǣGޯLt ~ g0h} f],EH$>n9-fTW*bV) .PLxW.]e[q_PpRGlw$}J!B5`qj5+?$_P6vɓd Yi^<Q0i# GW1>]Mm|\4sX{k50rę/*D] ~)Bxq8b{9_\| lendstream endobj 106 0 obj 3619 endobj 110 0 obj <> stream xWQo7 ~7#QjM$%QҬC=ifiWߏxvl 4%6Bʧ~_g^ps}?s unNRm}|=vBqj"ffhJ>]\ ֳaNs3˟$)$T`)$|٦(ѹhnʚ(0/kfOۘ|e6 )+zeˎ̫vvcZ@2tޛj-z1aD; ԑ\D !E㏶ZM^\ '-l0rLpڄ]V :KPlY%[| %=$]ǔm xQ yz4:+g4̀D."bTWT.idK}<9M{" ZCM=Om u%ɡ!]@c#m aq/;]`Y 1{'{)8K/vxH [d:Z6QT7ѥz)t<|\JODO(OM)~sфXc~ uIED3i$2]-]Emp6Ǔܽ U<&GdEBRS;sڗ)ݵd͕E^zerROOO'GhF<|AV?,^!O0J`S׺y;{JhSNeMv@~oՃf!lj+mѲt9E>XGendstream endobj 111 0 obj 1051 endobj 115 0 obj <> stream x\IǕsi?nU@Kd@IJ#6b[{d*6!*eGF}n'&O㛋w^_ݳ.d+,qrM nl vwus]Ĥu₩h/?J:R gV]~>o~OtQ7 9 MU5AA6(<Q@NAPlg$2eiCoeJp:dp)B.M0$+ֱ Idƻ/U }$R} [zSCDBg|6-h*6pܐIXFF˗mәrr>f*_*?YAҚje-?qNxሾ(&R{X6y :A%ԣncҭDr [Ɏyˎ)TQ4$ qpSSca*oujKHHc8-7H̨SH ༨pkH'>: Ig g@Z:+m޻I2\ A,J 'b&OaԾ&3WdӕgmKQL/"/  W&c8dN4pL٫^]uI*M d] m" :7vf }u9){i,,q1pZg@%UZU%sڗh&nz m#U+ȈZX`O2ۆ}" k\ԨwJRINW-NO:}r߰96s٫$MA7 -j INt~c` uP>OI0_[zA{rIF(-͞Ѕ G"/n0vH)t@WM{bѤzSl܂yAfNJ& Th>o<[ ó$F\WQ" D8m%#$+MhU{.\`P!aoْe@0f)cRF' P~ڑ NfM ,vf5qe󄕏UỼ#E+FòmF: xJR8CO,0$r̂Ak@nc(E &EgbXvf *C o͍c`A"e(@4٩>vCx%7|px4ElQI>@gL)9L`7>dS(Ab(-nGr`jQ*)[6HC(TQ6j$aT9 H=RpV$m 0<ɱK|~ L齘A ~WaD#%AgG6S.Zt2 #xy B.:h\b3 bu2jC,ҍ ?X5u~$!_\b5Z|!,YR*,Jަ3i7͈yNb^5,oDo]>ZajrRd|ەg& XmI\gX9Mdr##*}A7e q25դ_1LↂW78*f¬HcᏬmc2b/?v}Ж=‘ZP1rJ4}51lTF4mbA*m$ǥ>lOY`@`h90J+W 0(tZ6م&Bt2 ylpA6݈7eq$m* NC.:yhݰ(wۢV܃XFo%}-`X;E& 5UrqJVtR0FrHKEb;6yGfE#7Kv?a_la!Uzwhs8*uf "(qUY$Iင{Y(O?oRxMyMy fVE"8«FSؾ!4n9-樆)jAWniFf; ih.C'ݸ׃=t) Ъ.oғEV&m SUUi9fc4$g[&ƣGY)ěpg\)rc5pAp  |mB,g=VTKYEGs8[= e }9|wtH,/[aR2tŚJ%֋;=fAt)M~IK6#&w:u&:#˓gzd_m4g$h$F8L 8 wlvgْ@S}ӫb6‚8mce4#mS +{wy+lER@uz HlE$P5;ׇ6gF|k-NkLRxM_z',1v,$Ք \s c=`C$ǜ6VIiMJ{۰JrF[k ]`m~Z{yH3ag@ BL}7&epȱG{;X {o{~,VUq ے.GP Y21QL,Zrc"g$?_+=xO"RHvUV4AFΌ֐mɡdcv4M>lo=Vf8ۚA|aJqIAk6G][U{!`2g󍼒k40:w4+~j2{F> 2.T_ͱe&`N\;L`bnZvyƂ2<3M@f-Fney5.ՖwȦՖݽK%{1nшD n>'P{{q_ĝ`Gi#9w`u$QՓsUvlt*!pvtk]UVg3#(GդjSe[X;Sq74h0$Ƥ,DlDGoq8SY'fg5pNiJl!a8:wyxvh{_< r]cOe#NmMӅ4tQ["6~D4ӢeCOB=,Y,br^-O;;Es'h|\Y Ϧ̡y `cS39P 9>[LZOmθyzѭoI GGYRKD]d_7'[VzSUu32(h7O^l8-qj*,TJHnR/b9Ч2ӝx ,CgiڹCxD>ɼssƒ3Z4M▃G]vrm> a~ww#]Ϟ*4o%?/JnP}SUe\LWIګy;>te/.itM0_o =CΝH`e:孷]_P:' l\"Kѐd_3;ZG>-ol >Wxt_4x]n8+W+Y Zc7ͽU4u-+eJRT?m}LwEbDXUqbǥHZ_`j_,ϛ$:# |!tmPGP iDˢxϏ&6]<M|-t4Qc\8E;ӄ4iwlsp X3CDX;C}I~z~'Ezͻ+mY]/`æ '[?pPMu񠜦Ң,u,}N`4p 04i j)ӯ6⍏t$iF;yר:Q)0# s[w%Su}ME#3%?( 4~/AxWl/eC}R?\BeypZWwzq̰^uam9h^̀x~6Cj-;%=fMSn*nPBdéRх]ĕ{pYO* tW,y~FT#VO̩4c8L d;Rİendstream endobj 116 0 obj 5353 endobj 122 0 obj <> stream x\Iu@{rH:$,@b# RYˬ̪Y08Q[;A~⟟/.d׫ׇϟcV8D9<") ۃuJ %!j?^hiC}JK157_2AA: by__j9H+K U.VyOAi v65+`sZ{c^C!(&m߄A萷?}}yerNxۗp6{ -yUMb]>[HTLY?,V|Ҙ,N_>NG  )5km|ߦ0yB+)$|'1F@kllORP_Sb5F/:EAb6ɷV7ɕZ'9zK{6FO"7.5K}|=O%b;\I9@m$2(/1O'2ȖG*@$-B&1FԆUh$NC,ʷ 3AfG>r:嗜/a&is)m[7!iszQ熦[%6i'3/[UxQElvF BKɢq?[{]`fPvfVGp[ʍ ccbUa2oF:ƽs2_zhZ3oʃ'pЯ Cdӗ;N$w$1v:p1БuJQ-%LDxt1&`RV`m  {>Ug{?čmė@3r5IWZ2 ^;9GuICkZr%";A =+ՄZ٨&%kUM~%hD IffQ9 w 8a+"U&DEH\p@ֶ ti}.~zO, #YAPqQ > bgIؙF 5Ϗ; (< Bۍp6p3ӂ@<.ZhDePbډU "X [9JS=&M y8)`)2ȅlu-\/3Teu"q aYhGR]`E=qځ g,U"X- LcṉL`\V82xuɃK~J:91Lq`@gs opqu`}0 iKLu:ǵm=$Mı90LHZJÄ.p镖ca!tZO{+SCqck;@K cgPtpץTtC,=߁eʩ'W'.TCHNU"J:_Z;=[eXlXtUR"TKҺ {}K.AQ<F*'n*,9 c1e)l䶼Z6@g$Vcv9}T|qoا*V9 6T9K٠UD6wփa1 s~{Rif<;+E ܔGe =~F+X(s0(+1dp3h#;5,=V̶?+tg y)߶q ;;Qs2oj|H)ɥ0: My(4'#Ls?#|[,&g"RpX>!uffGRķ%i%K  QUvy֚ B65T,d{&p.F -\MdRٶMNtA$Ν^,̱j\M%.=O,+{ C-8'"p(gFLl ِf^C", ;!7DQ&;h*ruJO2@~\j m/ {|{EZпx 69Qa0֍(QQ" ֖GOPq0g!=ʉ8:#e”kR@D\[, I%7^(x3 ՋK&2#ǎ(XyGG ܿצ@{Bn8y6]폷% 1Kdۂ r1vUHbLe<\|2|(X,Nt6 _U@V&MLew@P% ܙjj,9P)*6dk߯)}tDOE'"ܸJV,1)X#7[szj}L-)4ÊX4Ϋ&&Mz؆VBm3fn%‘߼[iGWݥFwҽde@ idxΘf$7䰗jqVݡJ`])s v{hI=UvҕiY6}7j|l4ah .Dm60XBBf}Uk'P,>jXGPhlL>¢V[K: ]KݖN} 3俳6V@;GYJXӥ'!c6ѿ3Rͫn^g !6NkSfId>#J-$L ٤vr+W:d}MȬ/l)mWN"67n)Zw,. ߉ufIx'ia.GTԦ]HCJo7"=x? Cs`"#7KUEf-9GLdgm{ۢ 1bbw섾 )G)Hp릫6{}M[̞jk[-C'mVXw޾o[90- rYTs-{!s4Us@qQJ0^IK8[x`$\I,`YPI .sN5\Cܤ~5-Mgز7Qy>qv/tF\\|n..?Un`iKYV]͚q5.̤j{WQY v 4)4Y>ŠL/ng1 tWK{FtLY&_,ϛO0 W_{啥R"s፬ ݑL[~8.#/-?YvRd5]^s,ݢմ\ |.+?Gs2h&yUg8/BM0ր7|WmRz=1+uF̋=OG.qpCSYF+H#>_1[ag7b }DH>Ӈؑ}쏧)Bnh<}+&}6i2,Uqݔ38dOQJ\F~~B'LE\n DuY6 83Hf;c~&Np QG9v[N~z_zYıFB,SVt|ᖅ}Ӧ2=;]J_3Pxl6@':ZkrRUjoOj7xȎx|x$dߘ ElbTiv7; ˦)W 8t;qas$>${>AysX㙦eJSE镢!f A^H2endstream endobj 123 0 obj 4746 endobj 127 0 obj <> stream x\Yoγ~< V,*B YcKd%_"lLht`bŪu3qOpg?{rwz6;8lgSbvj/|IgҎh3SwT?N 1~p#^i?CߴʰQ}Ҁ_AjK#^_C`oN)#`K >$LwBp3pBKo+Zج PZWNH|RsW wKʹ[Z]6^ >#0F>yXQ¨l]4p*~d>n d$C$ aӈR`1tW%ˁ'V%\tL(tVd1_l3ƽ-$턥 "(%4d:Ig"4HYɳ/x:(ejgHDžts+28" q}OזyIIWa /Lʙ߂4['t@MX^ ^ͦ *x<:>?nwy wu(я)ZӅлl. ArFl 9RxWN7a$.d_ a)"޾E,{BNr&2o(wӠn۟I?&7oLp Gņ=29rJh ;k,KG'P3+MfDMz Zf)xlT l igL,YV2a!w~µUia ,eֆ1͙Vβt79pIl罵6HZLfYԂq~)kDP1kL7z ш Q'/|:5frI~L/ Q}BQ1lwhul]R;|pnY~Deni2PQVG ĩ(T he#R$jǛD}աnjwӺg82կ]]kI&QRyJ0@ ?x*#˝z ,ݭpvsn'F$EUvwg Vp)-mWGٍI-am'"ך{Ր卒z=(:KgΠ#dE(:2)d-/ a V9ˆ_7Fn8 z M(ܑ mI8Ҳ y!ؕ T;. ЌeH]o%&Ucmmq̶!;_3wtJJ^ l ֥+. 9l!jZXR"mhq? qWo=}ka]l/P|RbG+ S:sIP'Wz+eٚ,cNp: ='|w c Uȳ}Nz4Xw r9٣/= lZ þSQpM!Y^6ruwy,WRI Q8:Fo ]hm3jehU,þ@m\@uk9PXY(W(?< [kKM܏M/ 3tTh6 ((zʊY8 b|%֟~Ҥ[I'iLn[ԢmYazA|6BW AW~ps'mdf0Q@\^HkG"gxa%x5XN>Տly`g!ᾦXǏo}L,?ՏEo$-osr"L^WXV?w Vx^JkΪ, x_GBʕ*ȔUBC䋺*a8jV_5cR })B+' ;YsN7:6O8&.d&(nUR ϫHrQaxLc*7긿4K Q*aqlఠ}P?ٲ׍FQB_\9rM*tw S}P*mEA.* |VC Wd)I/7x2@(-LR%Pl܂c7qN7.qƉ>080F@W65[wegV#=ڎz)\#+19}Zv͋M vԱ"׫9bۆ/3_Pl*iSd1dAAi>lk:. C.uCwy $(6uQQV=^ɨȊlj'o8)wA-EWSTV;op~ ~Sc<-$aT6cXEƵ&}ꡏB/|N=ӡZx#qm[bg%Z%o=4}3 0IO7(B((#=ل`{8s<ō{2'E󖋜ԑ;6|06CrC0 x7A3< >=(3_S]]\#m3V'h yU>/5ā6Fs'fll(͞6oQs#p4f7_56jq_{厍?TW*XpȘv"hs(ǣ㽟{endstream endobj 128 0 obj 3545 endobj 132 0 obj <> stream x\K$qo('. rA92оW>Hj@U!BuW ;THd~ىA_~{b7dnyj!:ٽ7Howk{?:A imܿZ[u sG'߿g~e.ӳVW631ʸk(ݼUQ!B:VJmd!'kζڔPGGk7(~sud ?^TՊFla"WV&OAj3}H)]aU%i#0^#6Uh5樅IeE0H(ֻL~' i 3T"hv0DL^fC*w$MLM1;D$2+ܺ)oRqwP jǷZXߗ~Wڎ`ܣ'R`ix hI]ZUtuXUC0fuO%CwS i:|OڵҺ'E,FϤJ\񿮰kcS ~ZEJ\&rB )E e5# l`yˌdߗf=24CdTE{؁.N @-$h SokNF1F'eOJ{芦kTuvMS),vv4*tK,,Zcc*. xתqx-kSܮ_Τ'R |44Ïq?Orȝ`1X%@* 6/cX6!XdɖicX5?ˣ ;.0ŧy2R̹/}ɲN`ɴL<]MYɋ .sK4k/E*zS3j}\}iNVT3[Zn͙j'|PLi &^nĒo%)|Vgm<3oĜ˜^o܄ZtVG!ٲy˜y~ Vfti`^Z+b&6q_[Y &SGò`ш'=,i9;}֐&(GeFqFVP`/3dri# Av=z\6F( ;5IQLwP]2{Z4 (Nש&|cx9vi 313ә^(jU6eQ2[6+M iYٳ-2-yrBs+y<ݦ Y$!(ivw T8E2ZCO ŕ! xC pt4:&n{zj,30ҩً],+a )L8[rz˸=jx/`A l}"bOB (X'1yQpo[Aΐ qS!wvaI}iP 2k&?PKQjgAWl89p-.19ag{rn`ЫNV'sv qk0(F LߜDkĠV(sXQy<`%`x3gD0]D~C."tUvDFġ)XĚcqhas NG*, PZR-%SS 9njtc idF 3i'Hq,{'&>W-U%G 4>D+d#)D+ I_Qd+2PMZ?OS 2|Et #Rx À<(|-ZM@3v!|6G646_J AQqa֪^H_nH1mfe?.Sz:e>=n#kq[R.Sgk X-"=߁o&{UV/q^X26jȚcw/v5/d;n(`pHM.`'jQ Sh)4ǴmʱRg,L3}ĠYFn=4ѱn- yaK >fVG;+WϘ׍eL"y :`Άx&EUX-V)>ho!K# 4) mt?7NSofFep*Nv-{unvy).Ǔ_Y~˞߱g^~(Y~ⓩQam3ϳU.|\tIm ƙ*Q諮φ0$;N & 1&ZG)KZiӧ iVίZcLq3©'/UTv1\nCxWqt|>)Rs-U%[VNz2[e$S +eh;ٹ#l@@,㮃$Z1^* E:3]Ž9rrۚĩ 0̼$&fJX/ji=@e't:&f*PZ=CR RRQɷ.C9-VV`΢SZ#ur n.|B!9u.HdC`C9j_Mj]1%Ȁ>x]M]#5`/>ԋw2Q?ʚ*z3}@nTg|Tݟ3r&_AGJ 5.%+4Rv}K X<_#?)qQNGiz",JH-rop5hi/ϠO'i{ˏxzojRޒnQj rɦU nÉCsq˦HJhum rtolt yt өf%ک"R$+8z{9endstream endobj 133 0 obj 4911 endobj 137 0 obj <> stream x[YsCy%&FL"ۻ^lgm+TyQeY>ߧqLwHڒ*?jhϯF hdW>O{WyM89k hڪ"[4!}bstGK)r]+XsE:"q$ Xߞ,Q jOjR0|m{L{GZ笐RO 6@A{v @վ tX[[oNHBʷo2soѷn_'6&xhv7'z5VAʬ J.E!)RvSч>#˪>;ʼnφ៫^4@=RWyAQhtw*{-M^ۉb/Z~:_y%A{<Hs:r[Na%\s Üqy-arTqԀk$N'g%KKe|X*(>RDK1J}fQs*4r$_1kǕJ|6+2@Xc÷liRaIh:F_Q*EibXLKXe-Uvw y7:T%ˡj aڌrš 0!/SPO2l=m^ Go@dH(^#O']hPvEP9[Ð7l28Y]X:L,ͨ8ƣ@]4p#jFbN#%&̰{ҕC [F[Ev0&ܾ)'Tm1kѪlpSb5;9jӍŗN iIZ)s0.ѓ4ɮvQPY̽V}$=_NX^Mm j I7y UxIT:"*f FmzK{d,"L$$S!9i;fZ禙G7ŨF@txGZ |@*?5ƲS@׾A%t]ȳ!8/ih1]L%Xm\niIާ|χQHvu#u8Rh+iYg4د3׬f8guFuwWU=8 RguKo57zw;KBh W\>OVVmx-~* J]IuKկi^Qkӄ5jfIZsړu%X_{ۯ] ħ☸u5CUϼ?S׾u{m/Tvwt۪jѬ֮%Ûb7ᚫmk[[ նtLTӄuךzz#k+tNBzxwkyfZ; $vTXV.4OYwȍ$;jF7>JLaKc1nR2x9!6NH7|m` -/-hIsfo[IZ1Ӫ]'Vu/hkˏqJ!sA9q\h1y$"]&C6[pD>[ť=B&9(A9 G*o9/ٌ$4"+ dNNIC07NH S1= @$^)עh pf>У" pcF2RdCy/qż M y$BH-. l,ɂ(rb =_ӻw'" 4UBl]܄endstream endobj 138 0 obj 2462 endobj 142 0 obj <> stream x[Ys9~XޠkLI)`f`Gİ>`laR*6c6xBNI2Sy_5Ӎ]оK۳=ԝV#&(yu^!ɘ8,im?s0Zgս!W˓oQЄ.8p&Jtk,c{;[C#>r4R=kĂSk.Cg }t$I[ =3!oBDT@ͣf0?D'by~<QNXSlX2Dlqtz}>>G>~> XVug{9αtXO2`g0XX XD Xo#Q`jI{EE Đfg{Yk1*-Y 8EQiD@䢢KS(ֈYk -.5zJߍϻ_7J'by#t*8gC(_ ŸAg= GF7J}V<QUa.egq3`m{:q#Lo dJEJ%祯oKiARH6ʉIڂkB 'btHKy) ެTVN& 'g{?X\zv!6QO$̚Y K&}z>QoIW[Iۭ[?7 L h86S14ٮ>^ 1Pzsg6_CjZ]Cj&ƙ^~9Sg@=~;ȒrXu$3|U?4?&bq+3q4={=PQV/}ޛbG?e[;:D[["彲@!$b"]ѼՇt4)Կ'Ie!)ɴ0W5ecK (-̤E})X)-_! !j'V xjAI'8噣Q'po u:Q.5"@vVm"Sn4j֤G0e.h,~!2""G{1&Ww:e"]ѲsA=Z~}S Hc*ibzmyؑEURrC^kc>]/jl._ΐ̽Aga_Ӝ~\ի2X=#MyFÑbP`yGݓ/= ںObjU< 3hqXQ5U84[W/5!ؤ胺?zx˯F^! byH"Y0n*@ 5!1ˑ% #af Va^Yp()P} fY_Cb^Xy6as$\ dF) ) ϜpWH8N+j/Jux}BG5} Hendstream endobj 143 0 obj 2984 endobj 147 0 obj <> stream x]YqN^o %y?o97ЙDfzP&ʹK4WݳT,n 4]]]{UAt _/ qxy x+ DrKyl p/.O:X鏿ga\d' S@*9=Kw'mg<4DIwW݃c:$pL살pտ~{R |o3Q=;Lǟҳ&%AFS M_OsE) @QHeO> V T|8)>J8 i:m"TXy8|=v8 EuU:p\חZvVcmTޏ`D4ˆS嫼ez4%YEki* YlAl@=Rl!-Fk7d'JĞQ!CO>M(<%82Jb &Bt QBSa;~tB fxpʯ2PW4%wHV{3kmqܙ­S\DGxDPO[߾cc,KoB;dT:+yҢ>K~]*Yå5`V/>O}9kmQ9p{8N4>!=5=;35'NČtnCȇ,xa~Lm@( Lh@ɒyuzuĮFIjRUm [8AO\Bxˆ ٠ Quڀ48Y7 `l B颔(\ >a`31-焺hߠ[L'7) 6eXKGzrz#t=֫̍ "L=N45/|~.rD 7MÈhI$nS Έ!}^ GZ?{.54,[!.w7r>A׊hnvlMOkBVx %dah?0U|bUKe!6)v$xh:m ¿\kQz: &7> J|O$E碥pVҒC\2ిyHP%gdp$U:`?/!EIZƴ(6^'(zfIM=ٖ93S+tegǥ8*0aNRp]2\HMn/?˾jpEzFd8pNéL;׆z3NpW4 y"thE_LQ1c̣mt-D m%ԪHq kT/`~ `YLAO.M(qT0Cck Cz^C͗VW_|3GIY.s/fZ3;U$UjKqx .0'[RXش=e~h%#t&>f+Hmswi4j>_[ /oΚ!uqY=$]I ݩ0|ɒt U\p.gwͨw]1:C'BD9cK(Zd >]` &q=JOslDe% 4PȜԝТ͇P: ea֔!TLh 15Ew1@Q%]DG1?Wdoďߴ, 3^ Q$!s­J f9toW‘{$b JUgG6ߔ sf^דF/IhU&Wj:L3+:;SqΔ˚P!v ZTfRɹZ.DF< M^M(ڠi&C<5/:T`WQzJDd͜%VԦvd|*DϰOX#BS:`D5;˧q@^v0P]mbyb>v^|H䋁nTM SaJ|eIԏ`h~UOȇ?+6ŧ [@Rn\*E ;Loؘ+@Pb+@?0QtI(|_>O%@Q\_RlyJZMv7ۺ f0|^Qjey^OktFWzǛ@[{ 7,8mTͫ(6;jnU[w'SJ-RKFi pGCx$ #S;ҪpuLWYVEg;<̵J,V["phiLPc4dKE`WkĴwϪ.`.mу˳K%TBef ǕMrbe=󻵟n΢ϳ B˥zȭ3Ḿ~y-R!_]j;sfۇf/'y6tz|'uek~oyd`EQ M@cmFa12NE΅xvd55j}]^sn 07([db' cJNwtIFdlTJe]EͨgAȼB!v;9U@L茊qx4yLh" \z-=ȡ1Լ.[@k|Fa6' e?ȃ)ku1]xjA__f]#Z_ۘ:U6bupvU٘` Krؓ!3iaa[d+J|(CGm;[BT6c%MFN,luc)X4jab43ަq- ihqċv=BPeG8MJO4KxTmfk;VS~nu6[^aB|j0O9e Ixendstream endobj 148 0 obj 5570 endobj 156 0 obj <> stream x]IGCx;AK̉ KX6 KAzYˬ̪8 |P&+oޒ_^A^ o'?zz'2j˫On@٫8DIR^Iz^_ݾ|`&柦s4F>KFC'1G\` u9}𙶭e«C1n6>Ql A;;Zqlh3`HIG)Cqʩ'XUG+(+ʹr!:нIuښ?F\,dNӤN)qfOvyx~lMH!.uAk=S+/>tMRo!F ZE/.H3tѪϮ5L0u~XVTr32,WT58}Sj=x~bd&$MFl4qiE@-g㯹F4yEOO U/4^BBҎ $Pk'72/V95OI*i\$hl̮.8 ZL Ebv/6ԡ3Z̡aT P}Pq5G_Ev#yIpf r.Y {ǔ8ӫ-NĂ(`w6KhD7He\"شh=|MY$ iJ46 WIVx<rٳkb1ea9%SULii % $޳A{TY*B<%U>vPАy|A̩P|ߞ=jЭU4# MΥ8ԉ=YpYwu<uć1FdvʎތIO"P5+߆rENEWH5;&=Z=R[b(o&$YR-$L{,ٯ$ (!i"+VXo޶`3P 3j})OSG\w4QħJD$.N&hmi:Tk0ݩfυvL743s((Y ѹ!`Q҅Ba~nF?le#_oT 4ad.wst]3nrzzҧ/CeemϮJ(_oiu|lT`K5&WOFDuIըn.NWXĀR.z}gHĖf-=A5 /ӈ;1m.3 P،ԍ,uF~+ƘVp |m-14eʨ}.j/vz؟&֣کx< =7%}Ci:apB/wY'XOβ_,6$ caCZجCZSc iQiS")vaG } YW?[/g+DUD8kdR|ےffnaБC۩C%݂|6I75%12Kg~TWgmxӄRdrSH*X %{gE/aV܇'an&EittJ'K^nn>i^sR~iL5N5c+S55XҼ9\ xMsuM$"(Q5=Ws5Dι#$.!% Τ*e7DUM4QrDQLܖ0!VEtaѫ}7xLWӼMU|QP8]y,i'OP2?uHz#ܿc\b=)=q,,c#!RV:x([66SY7ə43yb7D(*XL.qe9C?9,;5!vksGr #tј[s2 '|p))#+3lr:>k_~j\!zWҽ*+8ι{ N/ &Kav=&[XR#\^ϯH7hld'{?\e`-98ND C9=p.:){.hچ ܑJ'b C0")זS谕J?Z Sa; DNW.弳N5Pʀ/[]Dx:rEy6WA 2&H5[)ҏE>n%ͭ/II%( pʂMF4F=/!ԣ+5zX=L4@*t}d' ӯӺKM+mY1՟98h8xIՍJ/N>GCշwoa@GuPܾI{B2?4$㹕1Yٌ먻OVkd n&aHy(Lendstream endobj 157 0 obj 5124 endobj 161 0 obj <> stream x]Iq &tӪ}(Q:DdъB4Z:_*Z%MH0M~FbjpQE(.JD @{0)=O秵71uc{E"&haAীgJ4MA&S7̇h50_-pewf{ 0ol6il{HM{6IMfÐJf&Oc[!])kkl]P8uvuBMx:0`SkL ~5y,NFjD6\][iZ~-\R.iْ9%f d$e#u&O]]p٪!K([BJ7iKv7xr޷n^"TDEvJx :!%cT2%H`Ի%c/*Z\z-PB!-`g@yNunjQ&i;CKj;1FX8j8q;jL!,DDH Kr/'*Jw "9 3'9WK#zy!@LL::p=$=uҦ19ZK̚+2kGi@Zh (&x%V~$ɘ_k0B9Ugbb?6c,xa4Jm*ŀ YhAь~sFbT*V7ChA]3Y ozdr@TEUE0:^N)r>{J &H)&Ǖ*'0~84&$x' oV`^J;?|hbtD2E4"(VP(y3A jjZ>@+nʆ : NI+cFHd.#YYwV֪C[ 6Pvk,n_٘Ʃ1N/BC%EJݩ*|9wipfu}(?9Xc 0@QȊF ]ZM˰0F|w`d*-ZMqNV<'$8؞^#$025EXҰ(-E `鋃I 4xҫáP pf#nƻ3\aNY&M̈\~R1NC,T6$+8@Ӫ>Pn^Ƚ}twzw8bn{?X\=-ֆZ]QX TY$!y:9}qJ+VUBk etKl=*E)j Xf@JUi Hf i_?=R(BaM1ܚj=杴?Y(`s39l^gTG‚ـ_%O\Iȭ0q: r2`FK|5sK\N$A<Β؉[WTځ/4&!Ϥ1hAvAnCr*)i . ہ!ʮg~vU Qz4Xɀ\`` +{{(R Bdm[L)Y 8zmB˳NAm$d%̱/ɭ7 wAy (M6uY;aL +'ӌRx<)Q,mzIP`ײlM<"1,@!AR7 ܜgZ52kj78;1:՜p{xS6"qqBHW0iA!UYt'v]ʃHޗ),soQ~c3&Ҧ07R3 ]QJ}@ZN0ۏ $JHd@JWV )LZ9d h{i8Q7+Aa ̭rD@}J=&zۻG6CoWW8 a P "`?;mb>UaD|pDE4ǮyaVͲn' OIiLlY{E7Y`) cYUltXxtX78G:aY0PN ΞP :K3=skPz$G15(yؖ1 ! =fM(Y<3BKbhZۍ"K$§63=azIz%yz7yhS[cϡ=Nf pGrH+3Aus9Fvl=q,pt,;ݙzJ]~fCctF7"~CISF t1J׸GhE5od_y2*7<-va +Đ;7-|u_x!?$lCWQэB F;%1eK<Xo$wvytw}"Tˣܑ=_5nL/A0Wg®*h l,6ʼQvp>q~@5ӹH6XM0 wQx!LC{A&)=qRi ?9O -B&7/PgUlCy;ǭVo[E+ ǀFXbFFvѤs[u}3 h* Hta H`6!N#%50<Ҭ],tH(Ff/cn[%jw/TMErrbS:ktHwF&n#wc!{e/nGdu[u󲒓ڢY&0Hj[[̜ ?4L|<: 8@E+nY#N5RB199o;ክ(\Ʈhv^Jz޺) a_s\͜7>=$Z6R4u3PNf:Q6MrD}>BdtRߤ.6^:x0)e u_0>V'ÛZn{{'}tgܿ˟._H8^j%-n} UgCDBVx D. (Ƥx;8 52הmz5ɨK8#DRAy2R'oMJoI9 'ò8.L>[|B3YZ7׌ qe}X??NEyƅMRpm*X[Vu`,HޓfCX0BC6E" ںrp༆>4fCT}A8zknȤ$FdLLv xfZ}\1}VYn(5;]!F[T( |WPOSu[{!6_\.6ҥL*F/p+VkDވrmϡ >Wnm̦z 0lWUûYK7F:gY$)KY7됲l-N)zx+כA稌w ^i.( v1Ѡ;3a8fqpV7g*IzOwdmpڪv 0۝9gUfT,ܱBfti(o[Ehۧ c ]BeP.]A+;xh\u,^@nf%mWx\wx38=MQݍ.բN ҡqlq]]rcaa* &bm27;-ɒ3y5jwE= z Rr>o3i-0Pw@!t<8BGٿ0IVt-;0`Ằk8^$,W-nW_TEDf@E>h0*P !%t>ڊt]b IGLfR6gs:J%;Oy+QF$j= kFeFVX?\&[?#%tԨ\J #+.Ll3POWRygO֟ا\lѕeWH2m7u]=_Fٛ⹐@6q1QfKe_)A+B[nΠ(| 70nQs'Ew\L-N,hq4A-ВigU'phm{:)l yA:] C 3kU\c̸Z{&/ij_EfN}54Zv颐'(E:#U܏Wo5rCry-w9j0 tR"*jѶş+U^=6`>PQތtXLlΧ%c=\FF\J_lr?HOEÎx]0BH CZVGih,P¼g2E- s/걁Rn |zw\W{,^*G̺Hl#'( !bHjKED w>&K w7ro|ݩmNqf?RazIE^@4UkLXfBYjt믧x@ޡ־~a_əxV,pxU.w.E nz֌B҆-̇6x3G=Oc?n[][l|_3dsكK|ivhl)3Դ8/;GlHIԏzzSbVб2J9t9Vb3@WpRN,>5EL̼{8x ]pvk}̃m-eG+p+y~\`'u78^meOKjϠ:մc)b^՜UqNv@pcW {sVu‹;G ; D6X@YX_2"J#ѩE݋=&^+]7nvцզQ2y8CEDZO(ҷLM"x]9P<4CCcN'yrnWfUsYR85F%jcj Z"_+KNNI;tE4s56{?E֍l9ws:!Oq9>xRo˱w o5[[g]k'LӍ]n}G=,R3ZTLՄ ̰W`}='w?#I'{EwoE$(, D ݡZ`/S7hIJG n^vTO_zjyFMLQL='}c8F*L }yM0&% *6B]ԥd?ݓ\?Qendstream endobj 162 0 obj 7711 endobj 166 0 obj <> stream x=ْ]qy S~s}I*#NR4%E.h_n砱9t08X}wby~ q xYOoҗqN9sy")/[k__<ŕ1ZVxx~" Wx7Nxp{Z{Or;{o4~YA!ѱ_(0{4 L aT}p?w+)S:%*-Ovѭ/~'Hӻn-*jWkߗ$.ؠw !rh^D4EMCP%c(gWvSD7|G70N|<JZA~b1~b ؉=q/ѨeHct.-w}"q{rI)(t|W"Ӻgg ;];(g J2(8'g5a.ƕ:K >ʋPMhHҹA>.)b22T?F $r"fX< :9m;2 @r|SYP K+Qu (4tF8LM6I&,X2@mNrzp* Obcc:lLw$ql~}P'ğFI8?]@jYvd>bڮtdqtm=qBFDIؔNd_686cO.:5?x3""|ki1AMkmŢ; 8iY;`A=O+:EE&k-Z}nDiXU815A;RDVǟץ)l!*CH wrYZv!t=l{zmak KuhRkeWx%sy0Tup(hmd sU_ϟ |9tM/{|8b]EzTNvJNӀ{$l52c3 wJ8bkW S.Uz4ސUi٤QtI("*ɛ|hfPUPͪ'2EpՈM.#Sd ˡv j]9lr:yl]x'tLo Cy2Mdp~TLqQ%`5,N?)J,"~ 2lj`wtmQ &v}6>)1j&${wW-kr͗ z):VFvw@o BSA+2` Q|mr? hc לPUUbhhlLz] ';n^J-C%Y,-.܉^dmWUrSUfU8e+z$k$A L) ψN(Wށ>emZܾV)ݢzš4w띧Jxӭ9c"[&B}*Ywʹ\p kP^vt_w$'S%i=έy W,} -^mPBPɡ`2fPc*^e92s#;(!˫H*,p (.IIh1Bz~I`nV}kZ2P s@1D~ow!mmƓ,;`33z =;ÙO/I{E)-qJռ.bFѠs0EU &F+!pX37KLgb?=?^{g6 =1~"%EQ\ZE c,54)2@_ tW@ j'1dumSHWBf0{ pB1j=0!v3@FVY"^%DQن.FMNʫSJqgy/xiۈ&w:ٗ aR]E*m~.><.,T/iiW%3 7qvfcw)l-SKU( ϯJm !&&\t,hfyD#O;'΁VB -=4kTډ~zBK'x^tsH9Z{ @~percz U[\с{:e#9& X0@'rLK-@ZŰKЁ)Zfi1lo@yfz ,Uwz3HP#QQ% TIzm+u)BZw!Bs4 t՞3{([|_QșxwǩbQ5e |ƀL+9 e><]Sfh\.QMAZͷ碪9 XQ\Y'% X9s\poX x+h@+M4Am\}Ѧ;`Z|Q,HC5=})ЅuG^89hbDT _-ps50CXb@*m9+(`3 0w#MD&ꪜXN3]6Lwao: Ddu@-/$2ыI<)BkC Rk c)y Y7Ce\mF@Jq!ކN""b:BpG?Ca#7Od,c!Ļ1_.̅}|PIL]D.( IZIɊk$&#<GmK&]]tufbR#-δ?XoL+p{7n 7<-ĐD?",ybc([**SG.+Fҗ7Ի-:WȹNH󅩫xHJf<В!l2Im:;)xEތaI* XaԒem%F=⧦сdOI)ym=>!AOö3ii^aP0+A(/X@0~ňirOb$9 Z`b{ș֋:Aw$OG¨NM-F B, 5Q{1b`C&Vs8%֋q$͓bJnO HϓNn œn{%QfPt7eZvrΖab+bgRwU 1*0,4R5Ħ+)v]sl[q#??YiMmlW3A܏D/jblUT(&pqZǽCBZ(S=7q9#u臣;'s;Mc$۬䈰h7aP5U2RÝ wT׹8`TbǞ?uhP(qW!{=#gHh-3?HC_قt!T\pHrsNa]eh|uIwUƛJr\[rԣdXu@p+^mYw`Os%K k{.$t ^6QZ!7mZжWT-Irw!ty9}Vcd!*+1u&d'5sQB(s#tluv\CihaGĴI3;Ovl7| !i'd}P&IkyP>>h5)j2a ~z( \ /'UPvLR 4gMkQxSLw W.?ybܜϥxvUukXMrQz,ùmWXmd8zTpĺ+h|^jE1BoHjaE*&~xFbΡK)ZN hM aR$nx"ݧU+Ɲ`!/8Ĕ6%WR up~2˵r;\ʫ u55V =crΑeаl˶ȴUϲ3s8 v-Bӊё҅'%/LKg݋L 4_ :W5Qk Ms8Up=ο_W!*pd'u:m|ȉdjuP6RT]'uZDsF59z&6? Ty t,&-}V7մ{XQZHYL_!ըҮO } 3wSk:9߀h==랾Y8ܱS *7C*pbHa-T|5"3,FfiVdRV.RkU˴x$eV­3F[kX0Z rbcQY9J"?|;oB GE2v=P#[E*smG^5QtNc2D޼ %}W K-]1\H2XE(}c*Mrrcx93?@R(ox~$IRJ9qq| O0P߇hWgcPSL %~8(ut϶DcdԜu1X.{ju36 Z;$^,A5>5PLֲQҒ\w4dUN;D]czi0JmXq\0rc 5}y2m9իPYp'*䳈ro\+%`bϏtQc봅TV0,9 AuX&r])a/ >Gtu^r&<^< zH2BǺ]PA`Ğv3l';1O E*FJpEFjX֗1mj&AdbA }:r VX-{,Ds ?be2ؓ+kG'ߡ'>ZY=G7+@"C+/Ś .1݄R.7yJjn.~}aa/v!.ՋחZc<;෗˟ `7a]G9`@\UkO+hbգuzFc߂TG&Jܣ@srDFfVWl'n.o5lGwn./PZ@Z~X`_]Ŀc/f N=kn#)<J^q E:}%x4=PNOZ:TO|:3]ןBW[kg_]'r:§ԟj-͝k7r].EsK/T`74DDn^;_>c[vK;wrx+ڨ;8p Uo^1/gQJ_3b4<'a9ˢ >e\[ַ٬_ta2]h)Db&)WL gkihjk$y- wUs+_d1ˆl*ḋAn^Xt}pƚKB6I' ]iA> stream x=Yq~f}NyM   V ZNKDkxWULW_3-O=}T}w$.f'呻x|w" Tb ƈ܋o o'̅u .'e?M[ g;\򹺼BӃf][ ;O/DhN?O Ë7jqJ9;yaOo৘qE|[O7;y|Kڠ«eIz 6Z9,SZ,6 qX_:Vu8@?iEpCR])Xi5ݐS;9=YNmanidmZn9x᧍21&hڈf~(2Z)ln6؉9ݯRIfe$L,{yÖaC՜K`!k0aV|u8 uqJIot캸/{UZ 6Kc" 8Q@p55moظU 6g&9Zd31s$@OlBVz.h95ߜM/W P;>?!nᡂKڍш@z bwq-:=2>dzM'QMyr-KIzCT#cYb&]= Żx/3{ w'uAcAh!ANlSF\f2Woث5ӤA4 /I"&0`'0j T|!5^7X pAB`%7fлhj̚DDXCD a`AG1e؝zK%mQ%J6>a$FS՗ Ѩד)#'!.k]* t 7\bwb (WEA^*t" <m^+V1{LL\m^e).VWh Е ;RjL&je ]eGRݙaY7T'9xI.(h]]YxI +5QF|˩&e 2VSk4oq4Hnd1mcEP$A"DUɇ7Im˸Iz ]* 2i|ٹpQ ; n Y8]Sprt.2w#ew=iGGRŭvX԰?qsrf7:7TojlhƂ#&SDSԣ,N\, &^:3߆hIgkgC{RgvԼ*WM׍"0ܱlmDN18PD#rϑCyW'ԘT2gqf$p!{LU52MۛWkS^$Yfq^ŧk"KN_q4ĭ0f*A-S˜r2.|=j=[P \I}e~0||.?} WBNjĵOm_xv=r{Gx4C uQ25i$̦H(׆ϯ#D\X=F3s5]m{>MQF$. (Z6ry &ڞL5h܂bX{a1!4y?FY}ПMUrfY 3)D5^u ?feM Ĝ o}9i phbx,EA/NhHdO\N\Ū :~ YZ?zS/!0<%e{9@ZصHM.- xO`Vuh9L$ZT-!;IqR1Z#:ă:^R,AS +晼sC+.gO[ZD*8L^X0'4aE[UdvddLF]',fA/6\9ˁ$+݂ >Euj a7lm}5ieGl r:jũkp# +\mYi0ݴFM&yHIU-$i %z9x5 bC/1jJD:`30[ސgyK.V&o*vB; <0&uLcܱ-nhfb"j'ՄnΛq0X>_Dt?\/ȚI4`̲4y̓$F+ DK`FsYZ ? Q;p 2x1qA˩0""lzIw,#e*,ő+npLKe[zv&$p ف ASC[@GuY۬fo 0c\pr#}*SnfVʙw R})YQʎأ[$%IPL̼"L~Vn@"̎- &LҪAKW4j@nIƿ9W5Y*]^RvX{Nz<-z{XKca^b^AO(Wk0+k`Ut桇9P ,Nuu hr9Dm1oӡ`'kQNҖpx1A#3}>pYq[biJY8|SjONGT*;J O&6a=)ڒK*n9~:} W@.W!^eTgaM(h*D%VùLʣiscnԨ㬟I[}h3 }@hD#e4F:(AuQP+?-c <<$ N%N*%W{ TSrbbh0v|V.0ېn?O{Ehނ+ÛXiN֓C,ӽ4c˓Q%^9D`[@sƊ 5, ]庶ʔ$e3qQo_ -KQs=Jrny&mg24aKY2s߬~7'| 0֏~1{;5Q4|:(p{~50}#jB蕨 j9jZ&Jhؑf$8t5ie*++qNa\Lj-Kzwjz︇)Y6D Ð wTT,Lܩw^4ZޖTjObGgSyea#v|wuUfG)~S^u8@B\jG}m/OQo|Acε9QFYVW>(>xX.b3vZڑۉ=4K!tvyEBX&MbxJ!L]o8/y!u.6f]I[n/*7N.C_JQE۔65TK¦ B(aYɬXXk\Sdjqp I}\XuQR<Fa:fVayq&a16׵ vawΉTɗ烣z_FC#u݇L|VCNf-Hz7mHG5W=/ەuoSX nQ[|,֔ri:Hۅt<[83]A__m~է^cUG.#g')'Wz^]m 3H=j̶8kBuɹF^ζa)^6ц+yѮFy-CΝzX\f }qbDji9,I@oPC9ҡ@DRxsbқ%J,,Rqfn#]Թ8Q:<3㭎:<=ӆH~t"1W S&Ρ^S{hs[LsmgiŖv5hmm,۴znN3nZ?Ε6N˜fkxxS)0?y:I ֝HrS {`5<ɼ`L~nGXRonG~O|Hk;] AJk<tOss_[g#L5DÏХ $61#ts ض1iRp-G3Q!aUe6NT%kF~hA_غ"8ҍ ŻCp"Y.j۠M/ ú}m*pľd? E|5[h(=uM$^BכoEXAu>ր h*I2F LSli#pz1vMC4Ϻ](),~rXuW AܮMQ-qw2$|*2|"}}Q5&TM8QUp?2|~{5G1wA]ywSsiH.#odԬn/Lo('ntmT$VFSȵ ;M9WAwCw l}6$ ްH$vѿNҰFϔ*|Kd#3 aTD_A/֕Z( @|Pհ5&YD1Cd٥y,kt;t a37Q ԁƫKvmRe:`]Q>fniԃN`:8W3~imMSsd&Lf^NUxl 񺞦SL!  uc|躀_}5tW~ u6;6~~+ABvT9ݴ:fZ8'yu\2+1qCRϒ HS&ƇրIdc?1 qoLF T\Xl›4UT86޳tmOP]]wM^b"a+t]m|l|lWPVeRwy 8 za?|O?;{endstream endobj 172 0 obj 7402 endobj 178 0 obj <> stream x]˖PjYf|,#h#{AlE 3Hd=G A$7".6bA?z/GbW'WFA6W//&Azq^Oz뭹W>j跑R*3D\'h跲K}:0&S^\jo' IB: }&]0m_39(X켷C\Y- .zG]fp:l7v>Gj8B83U[g y{Tl?J5lߤ/*_>-|3wZ:j:oş~K۬6qN9C۬\/~ڈIS59bpIoS sW% And՟bctcuiuz`V5Z%| !gys)QHh!XP GX`TjE{H zYՍ@_ܸrPD>囬g£ύҺe,c!zW8?)KJVX5BBY%ID1 XΧp Er2$~O$AjJ]D}Vu,sqXV2r4Jf$Uz&C&U0R>Q8 N Qh_!gն7 ᘕJ7+W4}T^)S=)DOpcT/NA}ֈxZ:h0W熄W;RJ/(׺\ZKa3֬t|\wt"ڴw\و ,AkFiEwNKsң,q1io ޒT%X5M_dz>X,7 J }k([ Y1 R@cqU`#տ]Lf:㙌i&qQ;K&)~y77{_9WX#_Ue6'y6_΢6`*@&E" {u(3䓑&9"_ށ% o7&*$n3 \(Kx2^g{ه2'b._\p KDYֽJDE-gFe+p#p@csn,w1Fy{Y1iaUU\eyȬg";`u4Fmb7 ц}mɋ֣ <!NFW|ֈȗ;gN>n)LX&?.4D[4a(q^-FL¦#,q;L ߳+C 9X/kֈK_Lλ' QC(ԉ*I/ZaHM#%CpNKXD\@X!Ȳ_S's({_KWl(JiL"ҌDݯhot`93̥l,&+5W;{+si&( ;5ul5>oә3gNwq K/5ZD>&L'Zji`|B{;Oŋsȃ8cte1 ~Q!dM]GH?_kjP7"5unh1'[5B^-:CTL9늉*Ȃ d:|z%Vꄎpgi5YN#udh  `q9Eм9KiO$јOW9m.Wib̡ɴ vf=4+|tqѦ~-`8b{: <ԓ dpZa*5&XWmX"`;t`_VO peœWY;N؇^/q&N`D{ ]W@1L\.!ѩ ;`nO9k"I7ɦ|N:' ~i GO!bgM6c$+ULwP7yb9wt`c\aJl+I<"vf|UDDy%[tg쿖&4K o$`bx*u!r^qx\pL;Ǵg_V6~@dk 69.Shs]F軸ةNCF1P ?;Ž}<?_ћfF[-.LT4#-S^klՅwVQ}KlCzgvtbئݮ#깕urE;T]d:N3>GQ%[^li\@>J %LJ[̩Rg'/EWM}GYE/ /-Ѐ?}x)p'S NWx]C r %> NA֍2o|rѯXڔGM-)`!Ϧ0LxYE Rz q #, ͽ U{-V%%,yp6e |m&!Ǹnq.n" &2(c)-C85c'gV^Mc.$~ۖ uD)ŸxI@-{*{іCY>B=wl`?9C#=y (M'(ͥL1Vy˸Jk-W CDCr_<d8F3s5*tFv0:㇐DKwau~㌏Eș^LuuP^f)|r:"N/[]^6ZF78hz9b2J#{j%4aؒfC2c/~^Do381,P9H7jBK;YqjF< 6ي{!oRHؚ5koҝpӜ~ea"ۣ-]_ jO#^f?k;i<@ې_J$z@d-YE%\/&Te_R0'$9@N_v"ծ@7E{ *ES>EB~:23Bπ|auȧ 2hooq/1pcR}rMq&aFP}AmxG4(R|LC[Oϻ`| +&Akk1 GaBjJ8fL a6'[x۠;P@ČfbtpmO^?5EH:橷O /;%j6{+Z^ mjXSd"znK55Ёcz!,Y3`vvȖ'-`za62؝XuT^痣Zjt}qʇ4t# 9nb"ve0o> stream x]I%>֎7k]־}l`33 0ӳ`ffRRUTo SKITa%:_џӋ#zzÑL??g/V@USάNr\']9^8z蔐c5ZtQ z}V4JM>sz*'\.z,gmg+9_>^H儊yL%ә^TσlNʩ<lY8Kzk:1~:>~1|_8>;B|0xx1WcB\08ńwz7q}:mzq@/ X;%T>2a52V$# tXwt1[OX{1JlcEOi~hY -ANU6`T-q~k'ՀG7v1NZ՟e@UL(HDObuPiD E=B&(SxH"QSe:NeA 9]D+B$s`0|™]U$0Vn,ctLC삌=){RB~SNxǁCHaG+%*Ű~2 U&SK}Ti I괆d-q>NK!0^֪=G^Og Ɉ@LOZEI:13کjLm8%1࿌#d*$3ʯA .I$2 +"AYa'XؒUgP,rY3E8h'9k73Z.l#-y68}[a­yjzϸjvᝁQ V/3ZtsGN}Vo%,4+d\gT꼹 pv2F*F֡q9Jۑŀ Xl2z:1+#v&3+XDn$ fZ`'Iē~W9 c&fØla# ~~ynUn-\T¦& +5(o^aɘ`A@¤L*bA1, ^IYRBՃ#+0]î(Z6]mq BUanjةԁō{8:0>r355R qV/{ S8O0{^5 ƭu8HAN឴RH߃Z؅oN3)j3VWP>D*1S"*cYHf%;5&y 'fTȄd.?N*edoy[1 3: #wa|7KRe^ێpݨPT%/Qht+j>o{x UrO"hvq$B)=uYBfK>orw2.nKZKLYNhVk(&-*3@L&W1!LW HC&%4 2.lPzXPwz0cLzғΞ܇N(_ٖVI }{)/9vMKTxJU։sPNl~9lZ܂>r><RN6]]s;:_2֩ :֭?9I2ti8bĝEdp$2OI+h!%݃gIqIbKMƬI-8/y y^l TUҿgaJ UVwcWMiEG><ӌ:rIr>j(煮O*Ұ*| D>8# 3tN())zHzjhBw 8u`r%zRօ&)šylICGx+cgҌ C{kC?0fk:HC$gdw= 5uR3`wy \zp ~M~9l۬5v,Xb Un"ՍFNl])tƻ*(NWŬ\ (ÊBfAvFhk93ï.bJJHXcV):1tÄ=J'3Μ~bgR~t5JMģc}RH% ]&2qeƐ{:)LM'EI)IR2S֌v` ܁ԧ_ mCϼ(7 -er]-;"ې5̡}scw50m0k6 +aT{^nur&;Vn`V^9C[Uo!pksa3CE7`ӫHw_](fl;1&&[7:"Ðel&|{=q5`-tl槳w-3c+P.7d{Ν @䩕=ϗ7zae&uB8ArZTԡҶL3Fӯf:q_Y6%񊿢dT \)PMNͷ/ކ?Axѩz'Df}iUʍ/l5C{>,qqw8r5\|96!?z6RҨe/*>.Uj)2ޭ+kc6Bܽ-l*¦{3.޻s 3w`~GHs[=;Exo6B #$~r6DTqߨ-4b_XhDM[7M<8q.qҖXG(s5,({Rd‚v2!8nKFZz\'d;pYn+a5;o+);%>'-mESK6`x\fiqٗrV~SRSaKl`}ݛu(u%.\,2)}P`Ѧq_SiaVwP=Kο{Tl*F*}t^ڶ/.,X{rvG:d8OPJT ̈>8Pk7gw3$[siW/v[aGPH>9 ]YE]fHC|`O'IyO&tR4Q\ybI6t WtL 2QA}\Q_Җ/>O-ُ2mvl_ޠ-;)rmKg: `]3I]" ~̿ %. +BA,_bA|k5";!}4 jD9e: GSMMs}|8RĢ5zb-/ `?o/CՊcX0DcsJyQOS%%v Ǽ|(B/GQ)TR >z+yy۠Wj -KVPnmP֨0½endstream endobj 184 0 obj 4618 endobj 188 0 obj <> stream x]Ks3bˊwb/qhI)$јp;@  H6~/ޜ}߼p&7~:S鏛׋7ǗXA&˳'5֛7gB q=hlߝ_(2(\ AZ}O5 AҷZh\LW^YݵfATv֑Z3Zoajm 6xNͷI+Ɵ& :ي+Dɲjn䃨Iʿ.o|0"X7* O~‚ΘퟰUŖ.}=KLJ?~Wn5>K;࠹!AI"Y:萧ʠHRzvf&,+!'+V`sۛ  whͬ1< ªGe !YK'H7X#YlZ.kHP>lsnPL yk/DeqIAo 9s6B>\&їU e6Ju_喙BsMc Oz_WA =R_R"gM1 ) GIr[pd7cWxetr GoТp~xש6VA]Y#oǻiK̪|e%:"g&FgH5poBԲG)OǣvCgHhӦQ^ͫ קSԣxþ=6rڼ|_V]T$u (K+[WZCCލ2`Sk|@{`jҡ&_lho542$d>XBCi%0 Bp;Y~ZcbgvHQ7`-j\ؖ!pp Zt&Ɂ `[O*X zN&X^%|Dkzz\B( F`*fqwy ~H*uOK`=U¿%PEyS;k@* &,:w !/φ=/Bǚ>qH0WoRC9';Xklv1\8i{8 Q&s ]=&*AS+67k \|_ԢcP(f9|~ޕF}4Z"3a H C`̌;VFGF= EzDŠ;oUc#E 3fYM~ B$Q [zM9ڧt} p@N2ٗ:ZljkU3pNjw|ځq \I{9[ |tq5(_RI"4uAmw&D'B,BX? PJJwI5U4 tGJ }{Vq4c30QM@9,2ƻ؅6!XI Q'*MM0CAPIx$}VWդP*fw[D3BBJQyЇ9rr&Nvq <7f9|_Y5[>cS&_<~\G/Y,5e1kUC's-c8ȼk? S(_n0{fV5ʂ{q$C.깵kI=Uk8ܺEJUmK2>Kv0-kH}׽:ޓ PnƯ~ U|/Y<7Y^P_c<.y_rd|rbdMW AeB9XםlE6b#4xdK\!vO}2vN/٧mS,vH'σhNmu3z .+|'?`lskd w;;O֧7Zo23.Ak?zMmd$>'~hq`Ao_yئʦ_*+Db@F}ɬU?R'g_' endstream endobj 189 0 obj 3950 endobj 193 0 obj <> stream x\Y~J7#Y%h +JJ.\Au;i\K$WTzXhc38_{qu={ ?}|⇧gHݩgNo)0nݩgW'}=_hQj9"vOR Oơ7NΆgūaxs Ov>!ϗ9O(duB!?=3ݙ/8+9{>)%Mx4\ƱᖛcYIi-/CF{?{0<}6_Hbbi׊ ;{r׎cX  )xIնH%a:E6-er#t/nFڈzRV^1dFJfs?{7׊i)=Y>/٫d Ȇ4Oy# ] |HSkǢ4:I6Z wD DDͅ9f;kޒۣW>-:&N@ҕrӻJZ } mLxFnø'3FNngQHs^A),{3)DLy#qYr\RK.ǎvzo\`^ko̰`L=[TRE9p KCY; wj[x.r$.ȝ@'|Bd>H냀 KcE2\$]˼k-TxyhJѦ:HPcFD!tb@2 Lp #%TA\3*H=5#n%f ke9'$m KN!֎ިx&rGW7+aH?TQ?ԑD[)Q T{ƭiQ,uEsmn\ o46q^B*_n&$zz$xG?~F<$ud8vEgi=G:==˹ԓp#)}+:c{sqs7cDޛc1ofu<ϴ?dBż%Qe™ 0%j<+e;(%Qr +qb] *u}%x^`+$ZIz=tB-C5!*L;Dq;hK#CX&UM0o mYaGL"YljaøL312$7ACJMhp5n-ZB)<~: 4M BE>s\PkXy5]%%Q<. [&/=+vPkmm %(%X|xƝ*5SȐ\[i#>t bOeJeufzhM&K|<% [KQV,?Y;6)aWRLwŮ9S$ys`Ȃ 9U}4  Z/vKi?k.וU- Yv Y_m۳lf4(ӮT,g5}ZwJb @ 1G(:^^ۍw0+ٷO37r##vTlen /Ǚ:W!p 9}(UҀަ`?JuN%c&Ue%V0 =LkHd]n>D\3U["V<Њ|0coo|<`b7yZ4RuQo70~M*Bޜ<;f C{9Hy%Sb =X ; U8٘Q)MAO+ ﻺ]kC047m> stream x]IwΙsy;ɲىdQ''%IV;W 4f$fV|\ W~=?~͑X=>zu$/WhMtʙG\HoWkԫG?<ވF im\?g~}J X4Z+a 5hh`?!T*Jǩ' \ң 18;f%R(}z5\E]ۉ5CP 8ZȻ{Il 31/idn`=|NFpRBg}W̎Yfv_00w5C4*yCg|b4 lnBigC2JZ>cԜT;dA y~4=IMd7l$ Y&L|ԡr" q.m0u ϊ0n3?QZ4Agt 4"-c xP7UCB_(9\Nu(B L ; -4Q7!"8f|f=C0 y\&dwyw -Qy,*:!Xڇz~{>8z.1w}`V D(p00;#I*Fg&UQ=Nr+P5G= z& @҃ՖW],f\O`VFX[\( ʂEmml2 #ޙN`'Pk%m; yMpz yaX;F=;[x{.#\ll<|m G8yoAg)0'`>OJz DI7%^#G I 9WK2nls4xGp"t0J#$")Ĩ&7w+!x'Mν8)i-FܶMG9INI&!%Akd11^k|53|yCvjp~6$|cڬې 6q4ƩR&F7,E󞜜Oi@tj!xxU<:H`28mq/c.Ξ]nH-k;X'pn$۰_A1w9z3bɆId H<>`cI0eFڵ_k3_׆k0; ;̴lw]GulؑQ ӚO ƕ|K'VbɹM"` ܕz%a4n}cHrLKm\iӌ4ZMziWp"dj-c;<*4VMQSw&x qWFtqEqBjJ&S :-<ٍ ՗["7S ( &w7.JEVTw ;U.3q`>oβ]]!uҾ!t"FybT%Y +JόSn%0.&D}@_[rC:IbK&ELU8{1b zA0Ƅ\B]aJA0N]=[f:+Z W*?)3yKo(\Q{ڞiηy_M'J&T! 8;Y\HNc.DuRQ$Rl5.x~[envP\C&hMɀտSѮWRG~. ;J.A`"əqFh>ZPCEt3nڣLM5W02xI/x)nMnr۹a5m]|! /R㛈e${3LKd JVj1t!\Sa 1sX5S=Ɖ r;R /V.&=.܃@R3 y:icv|۾B#`bJ$:CnW&ؐ{N`!p%#Bd.%u '(.-N֖J r/KpZt߁jA87TzK\y;ӴZ0:jXج&IiRu?ZJi% %8?C\ N auhN]TL"BoT.;џ_Rٙ bCVD -3~Kh|79kKaB=Rzh:Ɛ#Sט ]ÝiΆJ=ɖ SLT'T%en|{bu G [4/wo"|2/7ټp6p?3lԾ]Y,=R]9D:uOVrMYر,ͥem6[ҾD!H^zR ٮVDJؠC٨>G΅7wڨTֿwq1W ;|V`D8ݦEy^ q<rxp ꊦ`7aĘuрީҗ7F=tV<Μe-1Ef_]nn3O=EsxewR0ՠc/~w֥!)-[j ms ޫ< `u9"0K+t0N铤rU >S\Ƌxa1zTUx*!/YG}c?'-7홳 e1I %[Snq'_p|I{09 M`*?*ӲXiG,=6c`i/,(鐮WТSPBtE:!G>K 8'~ַyanf0D.4>rJE#&y:-0 @Ӫcza]Ϛj׮t˪-+4t;?6endstream endobj 199 0 obj 4071 endobj 205 0 obj <> stream x\Ks3bU" sd)rlv *z0VEi> Wb%ic\>g^rf/-V8 k2==|nQVy\>bJ z_:vȯ'i+cǽs2!?GcoGpaʞExV xᖛn,L'RZ˸ /P,T( &mߩk_hNk6m@l_dLF( bs j΀tUqPRuUH-U WoW(%)k `l[B$hL ,Hk::e kf#-W5梾C=J+b Nt"Hb=Z7@C\KA8*|ޑ\hK~lïH ) {:ru(<ǡ;TZYu4 0B$ ^s໬ӻN?yv{ "yڌ.k D|<"Z$`t^%EΑ[ b#&ЙbƎF)0i]hf`y'SҒ(ivCm)FyֹnB%zIO9vש"F&M&%fc4>OFE8 8P4 iPϩ:x"&}|R͘ڣπ/j;@/W L\t i#q yЖ`aVȣXHa#1|HxMJI iވj~!!iݦ_.-5\sQ,oPyȢ2-wgwv` U#E/&$ D\mvSMqwV;om:O,6oUW/: ڹ)ֹm F y$Ȁqoԁv=ւA'EH#1Ho&ݣԲլ2+z=kI BZiVҌC6P42 UᛞZ"QVMm _7SyLS| %}ZSQ.& GE&2ns6)8k\5ԩ">F;??:t%D_~՜A-w}w !Z߆:e֠u)@E  q%D juQnU@h/_N><ɧ〓NTE5*6 R_ח-!6+12#J~R傂2%jAg @z. lĴۙopoVfPmۨ/*4 GIۗ)mjݰT< :ZUV]h!nǒa Wǡ ))\IFZAޜAq+~W9qwk:w+=Ma?r*݇ܘ#RzDG1oP޴eJ[7)kJumdr ,oNKʻR+3m-}O2㍫wϩ?bjNcD;X3g ua'Ϛvڦ pe7M]^H]+h `0\]glx/)g&nM9=fN}p't:td#wƟg)XJ?migW @㦾 #n vV'ez;)w |ra(D>>mUխGCh}V`"+*fܳpдvw8 VO|^pcR/}wzWԤ?Ii5Lȧ>.{XCFPd)rWendstream endobj 206 0 obj 2768 endobj 210 0 obj <> stream x\Ys~T7l;}8y,%e`Ty )RrHQHn`fspT,=p h4Oz_FVNj^BT~.XIhT{H=e\#WWNj_k\+6k\ILUupZza7GlV6ZSO%A;],Ang&rml-h6qC'};cffoIm-ЇQ(퍩?PO mO3,8/7|C. r.߻f*6)gp3ltݿZ?$zaP`>vؔEϕ1ƷJ3.YPdK#LAU BKt"(RC 4%49`Ш}c,WVSqVa]3.eiO[7?wzߖw|>16!D^VFX~XBTZ6cy  04D.4[oCP}?vXrh13qvsc)M UȱWp!cjx\%Lm]Mn?[M+ƄS% r,`~>t.o>a@9`j2Ǿq5ASq`@@xp&i/mP֯{j1QoynK&)"~#bKekMcZdeT;9~CGjLckUvܓ{rK0waI\?rIIæ o#8%=8 -o:gƾFg+Wߨ$_v yM~>RH`los>P $cPfTua.;9Io}2Ip6Ѯ#0©"s*g^ߴ;u7L8N1`aJM ^3r&lOR˔ RQ"u:=9wl<5:i#GʺFfywwz{SB~;D,T^]Vd'w0ʸך}P꾉΂95uúvSnj/GŅ>|YZ;x> 0 [*7ϟ_ lrKX@;K17˭N0(7:Y)+^9f^ڲ3t9~=mtX/::wҷDw9opvP0q$J-I'TBn|l$0ȂYBV9Єs儊S0{Ar6wZA9(˭-r kxf;g2w 0pm3J2Rpn 8lF8Bw|MhUc)ðVK!LnO\ֻe0 "ݚAjC!qbe1 ,d52- KY"&B-ӯd`j) @h<@ӂ)T2eEƽ\+(NR+;` [] W]"EV(x b)LG¶`t%֪ Vn/\,jN$`l a.c{.6HwH `x 8:Tvr ΐ b#.G/ =M!#Ԁ]v ׉7lv+拚U]ƁX6g_HMW74Af rt43S&;Yr2 sHRI HLSZ -$A+cL)9 \wlDƦ7hC:Z<<܎?^i¼ }ұQekaW'U5Ϻ(Q;0{Q%7).x|QVʿa4@%i@g)TiN`q;d/̈́P}/IMZUSkPt;Pvqpk&wmVv4vG Q_aĘNu#5=y dʮH2y2Vݾ;,yȃ%bx9A#Ϙ@}W$'ޟ^niX| cAQtDޣO 7V๵G 52X-p<R4QQRM!%M#:8Lɔl?HhSHUW tʷ,amz%ؑD`wGXDd >߅)40\^,m|d5" 3LR9h=J>:t6ɇdaPŴh?<8g/23&=F)a*ٜOYS sU7t4׌*ի>;x-endstream endobj 211 0 obj 3331 endobj 215 0 obj <> stream xZMsﯘlʃ$ɒ]IE)Z''$W+Zʿ4fgEұ)&QIUFu7?tRP'ӿr߽ { ])gMYI Cu|?By]Pugÿ'eyγw,fTl'*OErw4Pָ:u{1Qjq5?zm4Xȗr[1:Ak+VYiT\䱓^Ni&FyMl鯶 ߿2%sJNOURy&fZdEԑ=>Vf, i𞬂dY"Lo(D\=<iEE|C^i8ƊS9D̮9$`W_Tn nQ>ʹ'8'~LZxM> stream x]K$qۄ#|c]apئ8a$re ݳ;( Hd~냚A:CFM!p|)L:ir^ۓM^:㧷'=>ѳV(d|GMݿ)9}|s<~\J1.[tή Y Gz!mKLLU|{cu 1|Y/ŘOD5^7<`2Pr1v9MK!۰`}{n V5IUy?ӳ&Tk!ORꈻFO096V.`=3dbYC0p91 ):z8>@Y[ JdU\)DhtoD+Q_ݒ˲S; jZ圉jaX3#i2boHrJ!y BJjܹ ^(f٤N0IDnMPLErYbf1& L?rVlI_auo[չu>*{FA 1ZZxp"ox >gzto^ŗ+tvd~,J`WH\#VW/Gj$efNyDm]hzk̷[z21]ຘ}!O$*PS&F]rIZm\X`4O$o'g`fӀ;eNvjh}H9-#Yu$(Pv^ sWc%+>X]4y&C+l'-6+i8&(sUzJC;jAϺ!+!@Ll.UFp[|d1ZNjx |u :%`%Ơ݄M5?2˸#aXS:Jn>eiOze+P{8DHK؝Z(ts2sr _2X ^*0 b ™h/SuI'rmugf;f]@*^,\d/gT':HQ2R(alj9ҳҋ#Hx T;Sk'A@ ޷RO{{qcq>Dw;?Ϟ]5תt+l&I<啳v&aō b97Rz[Eb: T/nܤG:|ބWzo'V)zl`W<0Hvf|/ߞOYL rE51k8٘),{Zb1ǯ9nax8R̲{FB)a^@:3AQPEvF3ZXé旌~u#Tz!OsE糛tW.$ y2^H4;4 5S8\/ ^[s1 \y"s!0I-B`oŻ~Wk(!^lF/_e8Gp)kݸA?%UgV ^Y,zb7dQM!*" T˗Z([k&@ m\0{ݧ^ 4*Q̀QNX9/ҔFC*g_$ʀM՗[mn7A|[a)vP䀋󳔟 'Xƅ;eAg<9?3sc뢁Ef_|;[$9I̵/ V8[Ȥ($roLZumb>zqsyYSf+#nCLEl f/̅|9n)%p{|deVw*[ʙE26N7Nv*z5RB~Q͝J<5,9:.Rd8 ouIO #a2?Lk?o4_ӔsdAH۬T.%2}G `"`"X˘ SDj&rB+"01SsuIkXGم̻2֢Rjv!ul1wa4lCE/.Dνw'YRk5y7 *<ǁ % tCWEeiѥ!9,0Zqʨt ;RsN;qr0?~uk>+&y4(X P|=/K/.܁&*)<ᙦR}鲑Wcz4Sԇ%(ڏhn9|Z`y)\0niˁ_džşpFşZĢ꣝oG 9ԌcFevov`~i:\׊6=۵ӆY.u uQtћuz6@UUW\ܦ; C9Z9ϨaMa\&I Qʣs9[dS{YftE֏Tcx\I2KI3aKHGZŕӑ@ _ m}I.(DnkCޓwy͉* ݨ DZć{"Sa :)Httْ3Ӫ-NG(bRJacCmy"0۰>|ߵ25 #l.],gk7QJ Osњ7ݞ/z=gOW\# :r3})D=f겹]wwqՐWU0-&gځosɽkV{TpGdl}Nw RO]J e.Νx67ߕ(f׳0v Ģs%:l盲ƶa]2KbK}5*$Ve-PJwnTf2sӎYA>; f}0pbl,ox_( ܕlBfÖx⣍OZíΓ'%Qm4;GUի (]K_CjE6:Bm5MLD7bRIЀ uΏ@5l/<L82qcTW=>]$tcdMEJ_9x ՛A^O4373Ne+K8W"{t43O7+o6sM\dXTGno4[Qnn ni+eI ot0ҝȣE93 ⰸ &uY_Y!M~/ᮘ "S#YC-ݲ[ϑޒzUfKo%(¼ز_H4 Nu~Wj<*U;!sQ:' N˹*|"ќmF.aio,3xck_5?RxI͛H,~Yo62]F1PjpA`x}i aO9ӸwǦޒ;Yl7]#ifvf)MR*| o\%F>Qb8EݻrY%F;kbkRh77)鈃w^^o^|2[:hӂk,8,YeߺJryսgw)&1T֞tH(<Ϲ"FCh@q=A%)] YGc},HQ0R$[&A,rLR)939-K4y#zym)2!X4MJlI>jLN67M-9!Iy⒂-s*,p"!M?MR.> stream x]Yq`}u`Zu@(Ě`Xŵ E;+뚞% Ѭ#+/yw&~g׷wxg٣ h 䙟F]|gL3c%g7|8߲Iiټgm0~VJ7If6Z%-6zaI Jnޜ[򛗱sl,%ti7ߓi.Ή繗3"i/d̷+L:|}.8.'8,3J*lt&;4'zCLt6No/vװbwWA';gImVla&Ɩ=4fFH6Lxz=Hy]dӺ#z NdbPT/)&G%t&jFI'lŽZ̤^C{lozp;7Ʈ~SFy^94?W >1#K6Ͻj2|7Dʕuϳ`;p+r|@/I$n.7Lɂ`Z(ou}m}uoaN$@E3@$m𚂂G,`TmJDQ^3!&θ26M u~7ߓƝATsBn ƼBLl( Lc^CG5S1 ["|[ dpڇxh.(֫4B`tq"q>(^kahsS =K^;VFeQ ?ˏOq~|Jp [Ď<_`7=,ڝ@ؗS 6l_v $p)?wSplF=Y3˚c=o1jʍwd[R#"Ԋc еfZ)j+)s6L?/h2r)8%u6%d>bSxCCݱ#h5zkZg{x_#֛ISԯ[Ӊ짝ր4mwD#}u-[,]H+i"Cב-pV{-8fMEV#Or8Kt|`p`AqLW =ѧQ~.jL^6 o W( 0$vK;uƏ)g |R*a&u3+0ERxrQ- =^t(¦i^>P'l%V t(de=i5v ܣNHP@rwJ k"plhS[T JMז0mt$]&񻍋t -G:J"i2N4YG6ٓ8%팪Q/v`SRr5zKZ*LEJYG3/DoYi2&$ado Q1dmO@j~{d-ZITFbr0Ё@L(nݹ@V k"B$:rv}vZ ]7g|plac+AKn+"Ⱦ)TɊXXK)N~Ft|8״Ż8U*GGЙYmi1A`!>X3.]йRY'JmF\/[paQD8߉qDV~^%@[W50WxPS"'|- HCƔZޫ8u+ԜaV$=}.`'чawfh{B4h'cӭjNR]\jn5kҿ􍶷U (`&>y0Pq$ @D^QsF$sV?0w4{RkN35(4fL1hJ[k-Оb"?#1"NyfTUÚXU0 UK0OƱU@ZǬev7SU4c*DVy@뷄|!Tt魴^Npc | ._4y;a0d2}L;kDPJzacl0AU4 K %XLm|%A졳[a*4GI1ٯ5=*<@nISa@6c 7Y8K^3MHlda/|/Py]A u.\hj*=4 iH|J/6"e1QWōN5\i{JUfī M/ށiRr$G}(]l"!gE͌ cͮ_/ţLr,kB8 Wȭ%"P#M0CGY0M$.ț²6&SbsQy=eRRg2)kcjKQ׵yQ<ʼn%ԱCs0,/.[4`7Tޖ6" CYCե$ rHٺYWzb)RbSA) k h񵰍/̷%Ij,q2ִ4ú=l#': t.9"lc[QOp ATh" Yu [yE輦I_nc0~kF2!ֳd(v>üD㼙HhC]0XY:(xP `{表𷺯j+1gaBR[؄{50loɇ70t~x|Wvq9F{"em)Ϸy> 9zB*Slߑ3Tp> @g*ZL&\w&HRm5HbF#1IK"ctKLAڢ}߲[5YQ56>[M?Wq2O/'[b@of]Oۣ!>=oAXҊ*WʊqG.| ێL!ï01A5QIuu}ΗtA{tf lնgI@@u'9 i! @d]M**XγܻԚ)gx?ۖMT9?a]ʌ IMtAJ*#1H2TQTJY}Č*#DA$eV.,x+ ͽu}U6!t .LȃX~w{eNel6UUr \ Xˊnu\B9IU 1avLg[xWwo E1pLMׇOqA MStEtwǎclbޙ3tKϢʁ0O|ZząttdMكUU5 ZӪSozYQd8]ׁq(CUҪ/Zior/>>w?xPI:SMM ʂ?ODl<ui{Ss:N1Qp!22 Gv|Nu}[-[4Gu>>ڟO9/׉1xqI5̦>N+?W,qdQ䨖_gȰJ:Q`6}HFP}50uƤG&b5X>MKdjw>D\ɀwAI;qmBT,t6ݷ9#}̠__*_hĚGf]~9kD8IۋI_3(мf~G[[!Ҧ*#wz;!Tjvʰ\N̽_I<Ԟ˰VЇ4^T/=ǘuJWP-X9W_wj%\x񻎥 GF4Kc陇QyY:6Ri-:d *9ƫaG+_eOhA >= 94rǼj^șO07.y!ݞi!LnhR=O~3=sM5ڣ8y?.e9e{/";٢&?(=?#Ѕ1̉d泍9陏+<ÕZa_;`W )oկT!T}[Mjtv)}8S4[s$*7vht}$J5}tJ&_+qoIt3dhO껄B/7^3s;H:i[wu|ſURv#Xj C >䊚&nƯl?K_tV{N([S'חKtI "Ioze•czӎY-p:}?7p_Cx̿l9wJqwj1\2 eF;X(?pVX͈R{F]SFNgTF?sAu.ݥÈZ?!.YsVb_nr7-8^>O[_F'$}LTj#19HW䊚+LO}J4bW።xiKE/ŃYtrendstream endobj 232 0 obj 6301 endobj 236 0 obj <> stream xXKo9ϯc6v \iY)hrQBBv3Y S0Lx0V\ϯg=]=͌W3Y?` UyFUY)*!UJ&ph(U?锶uY)L}8ԿifxQgI>eL}1__.D@Rc8N,㹓 yÙ2rSxsYVݼR3 x+p 9,z)a¨‹,Q h뛤 Y'Q*vº80M`V; ]Cj4h־># Y*)&ò>j.K/R/񨌗"^~Wd.Q -XIʂĹ.rqf L}aFۉ7kE5\1ivl)tlvHX{Iҍe|M2IEAf[ {AL$ ([qnN5*oI:K&@BxUy\BQWhXK7nfAssz9e28#W Zpv0)j mG͊Vh{nE}E+g7JM6&@uMhجc>..drwn,R7!BAhۂ0F UO{y_(U0ai+s%V?aGM=Iޤ_bĒ8%eĮ뉮Fba̹.i9&pHpQYF0jTO 9vJ$FtSF%_9tvQS'-v FMqԺ jyE=)cw)@r ^2\Ndw>u2&%ݪ(6VhCS%]f?U]j T,0,!T~.[PP'kHם$ɰyaf?}d כ''xs2}bƚ{ ŶI}}Ag0eG/L+tm~hѵ}1mC2,RGߨ,S@+׽Y#]|8n |?B\EިQ2 ޘ?1?Zƿ/-endstream endobj 237 0 obj 1147 endobj 241 0 obj <> stream x]I%UW8q+}:S<7HoO6X{znnŠuҟ@h/??6?JѳJ {~{sg(c8i=[k=2h1 #z84%mPxUڷB 'd~i7٢OӣW"NN 92hT;z!d^gLPFg11M _i0)Ӯmx!*,q-Q+m\jxfVJ70|;e3 > 6&0?DMoJM ]0vuv=IwkJVΆ ]Oq%CUrNU[b_dBrڜQ'p-njDP* 'sC8Z[\UFyEÇ£oJiTރS9O,%>S/FdR*8 f >]{ J$&-d GXG s/& @;{xiy у&bD#M~I&SN[p9?>zL#H?kP_#-OF-=OF"8v;(`[Ĥg.H7"6ZNHBI`u1yF*p~815,4'ķ8 xM6!MAE:Aaӆ%?Z~ʻ AC{He􈦪_Rb˖dȬ?)-pBb;jv&H-dM1-EªYW1R"UX"F`F2@ t?3BZU&=PS?˲!]pᙶq F=eL3o[~㹪Y){`S}xzi<at̊UZ'(Gw c̀ڎO@>!X'.x~|4\A,Wʮ43,aƑM|Ĩ-qo* {d(n 7 NOF$jWHI(W$~mtR )N/q~:|QՠRl=VKпmd$0kG9MҲU=[mX79W a^ :nBU%n( fz> az} ]SSPwS)ԨcKSXg;V7&,\V)\L7DW -BVjpV[(YZ_^ }` X<9/]_!@R2FL-/-J o4<$&QP U:},S%9'E-q$"5t| LGJ)JFjI9sH/Yܲ~ADwQoQK\!p:VAFq!>b MAZZp.(8oq9q^ItGg2X6n?G'+rΧ΂Z bb󥭮+R\ciz;Fx#dK wzFN#" it+q+%` D%@ˤ[tⵉgAS&t|y_/}T92;`\_92Q[M…$(.WYruGmY{x;s^)Cnhy^u|٫节20al7)TlxAG_%\*Yb<-ׅ2?G,Bk)C'Uc•yM.҅fFbV5D8&G^A)UKV*L{NX"ajש:gC'ʫ#k9FB Ir/bkMQO؛%SexQEba5zlo9b?ͷ9soj\)2oي6{ AwJJ&g7 ,{G3L༭f [Z2eT4kPcܤ4SmUtU}̒)M2CGH{{>HV)-W֛BS6q f4w(;M"bG fdB fVWXiyR-kIr5?s\j認zP.փ. Om=(-RZ=bP6{ߒ@B='>$4K厹u"@SfJv#':Δ֦$7cؙCz|2HC6ht-RjSΣZ3a S*j*SV9MuŔb\ϣ BaجԥqfI&ҾapCc'mJ-鵴ݯtlU*&c԰?* ݌vaq3DfDۡQB$P.Ws:;x7JtLWi0Xr_GڄL.$qzx㔢h `Kb㠱^A|xڢ9PydkM m]Y:K?)C6$.eeZqwsE5vrX1Id8|'pDZ X $]m puixhFb5L `>7T%m|9pN]MIE"説G 0s3\/?СDV%gޡk +}*-% oi/-PAu`W Z|Ux &|MkxąI(RI2NIbst;khԅo>aP^a% +"<ʞ%2%2u>C/>5+SJ,Tӝ|IO\Ya]%^rJB+^;:SA)/ }*)183%vqۿHFgƍE`]WyŀvړoTӕnǼyC&P41A{h7rԈc1Wi[U,Hb:\E EʚmKluѬOH}Nŝ2׋FM}hmR}ha]d y3O60?HJ){Y70)Nl쁈^j A{#A!|>'Q;'8lWJkDtkB@ڟ^(UoCendstream endobj 242 0 obj 6194 endobj 246 0 obj <> stream x=I&U O_TZb#v}faz^3z- ?<7ث|!N^E}lB#-_pMn A~>>/hF8G5f*џ c0V(佌e+B>_X$蠭3I`:E ǃ1ZM6Zw]󏀖rßmg$_R5CT h X}jDn0A>pz}#=JA[DmNN6&xQ٤"VޝgGO|K|[ UЋ^}ҟ1㗁-#0nTTUie[MHdWn`) zϨ+ F\y!`=G'm43.m{%j?Vyt lXnXs7,l1J3;Q1jǀڏ a{Vv C[J9r B+`IQgіF[1)H&j2=q(.W^1wp[!oB!oT'f+ 28Pzˁ )gd|$M=Kg9&!aA򱤸٨BW؁F@Y E$8}|9KTgQeP0(ǠYJxmґZ #^H)I]%ɐD_=)p֝ cR쮂]KDOA (Ob"{$`:ج#H!  jAD\ *lXJGXoy~v+%Eʑn?&9I`[Ɋhq4HѫOV3# #݅P7;3ҫ/M"T`}a yR~LtwiLktaN|42i Q DE:=c9KXWv5<JTSZsMe.;`ΚhX 1Xgfϙ;-œ|la@Pw^ _3h}q*u8MF IZC,(VϓC& ,D}J1 oxL"a,$me鑍V:=p9XXw4fg 3 y !#hűwڒNfm- l~0l l&oschwwc*HfoIx: C:+1Jzw $=)icN f,@׺qZheNK qPl?sܛ?hd5FRZF  YO͞`cPw}% OOZIe}LP>ؙvMV 7@ȁ|,ؐ `+;F= l n2Ա%".&M#l=HMm`Vy&Ѕ lسў%HG@afxRd_z)¥Ď`ǟ aWTσn>DP,-VPR!I';9i^r~d ǘ˅M1zZ?AiC*W50|j#BB6 9Y(/^kWQ7nUU\ʝ:vV'I$N{wS >E,@x֑ *@JǕ>uJ\!hNcţx 1_1٪Sz5Xo͖p7ʹK #`p@pXtx6H=f́AjvZ8~ 0?F|Es[fGXsCJA4};qmQVYW me&r C@ <(%0Ŋ<:"O+ACvSw %*R<<_,Bk˵{>0W6| kP=G:O>+W2J }_8K-76k%~Ώ;);T -o+[_-,NbV=}2 7wiBeFxܨH9s೏h^8$V:c 0s᧹ O!.rQvv9fc`T /LIXUD\je٧Kfͽǵ#*pw)X6EX4ͲV!2h~HE%K᪷1mh+O?:/n@7"uCc]c7Dpi x9&lM٠֪;L)= UMH)61"X8Ku ^_5W ~aݬHӳӺh>ňMJFq=PN5"gvmEUO#*0*?mub._dq\bHÂn"5eP+pE#7Bl{&>,tЈԕ .6sipZRCN/9|**NV@xTߘTyl^Q*B|XOJǀFhMn9f'E7} T ?=X*mWUDSco 6αDK,1*@}_stxNЬUPu 82?|ocg7lA`iG~F*7ku6<K3=#@\bI{̮GD'E0I&J::}iNH h[ZbK`wWW~+o O~EyBh= `P@W$mF5>1ZjǗWs Z[Xr*5f`C*s時erd}>l}d -l~kJ.`.ӷ-Z*Ӹsx:axk`W!d|֩KCY@RXwcHRm5՚O|joqbi>p#'K}L$]؆-%rYkkddvm-iՌa' V6ܴ:l,k>3/9Kmj`&8GLoYR֞M/!5zi)C \zZF7e~ZTt\4p <ع/Mr2*PSu'V),5gps#U<͹Gr*u_!>*qMbex cȜsg.-$g\UhŔC/L?) e)&Xeijn&B0eТxYRhnMNWu*h: o=Ư`۷ʁ< .9tc̸ AXۀuyeG>G5)2"@M. g?e#- "~0P;$8 l\jJU-}ޭWmVҊ74~}?ӛFGps Q?3jxgDE8L~igk[EoA4gw *bt&^ݘrKoRV7~h[1tkqDy9(IPrUk W9XһMu{4^q41kk _ 'bE ?"t_jniu{S;^{SI\sC<'г7TwM8C[%!ˌ[,'b(6X@cnيdƢ Î);u_p:R/Ȝ7u2ǹ}_&촷0{u`U[7Q؜+.0 [2JPAF9/qaF͝bڹGq,{S-.^sÿ,)ϻf2V0\ tKM`vɾװN"EK"tAľnJ 6E:/E(TbIZ-@T ؍WĮ3qr3R!GWJ~ȣwv"vToajK>'b7QG궳?"S[`&J(`*ɨN⍃m|"ǕP{*j|GIJR,q-*^>F)8X_eXnHksbf|:@[Ғ c7b0Ԣ eGiհ·*O+m:]&cbÓxkwU˨Iˣ>Қ0F:,6";tj\:"I"ȬػvZ2`\i8RgM5JM &6H)exhԮv atbGW(L~tqK8¨U޲pXzVK:dXIAEoQEc' oh9Hܻ똤& *I{}P{?~A;e4au XRM.5{49'/j_de Zb+5C,bee+,)\%[~6FٗR; l ^@8ƥD\ʹ\ Wo}Хoz^ ^2pa8ܒJD3\t|1r.b ~Ch@r=04hCq>wG]N' zuzJp )*A~o"ڙ1̖?߁gk<,e.fnwQV Vq`EtCk@+0~gx;<“ 9}"FPG'endstream endobj 247 0 obj 8637 endobj 251 0 obj <> stream x]IuvTVIUo`{a)SvJM,/A"wt |,WM43|g 1 A^?Ow=/_^_ hu3O|ߔM 5O^?峇WbR8/>Z[sST1\@ VhVZ)/O+7jc'1_~EYoCPJG=^W*C?gFrG=یVZʋɉEZ+hBJs${mTB$=_+t`>$cOrڜ_a)D!S\df,u.YOg"'3Q!wC+b`;Qy|)\&UEv7`o'm.XT 6NWj0tAIV%g} CGr0|?>+]ϹE2ު:<W&3 zeLVY=.!,B6*.R.WX>lbMZjbdi--vcw S` ɿTKJZTc #gqlwNH}GmnEeXx,:qlLU&9R p>f]UV͈ /rgٱ F`-w~x=hn9юax|ms%QYTCe*qy1wym4a:4J1voRnJ`A]&zcÃ"4jY V]}W` ,lM Zh;@y yZ' 8X,pNIO9U; %jU2Ztac2C&dc{wyդ|BۛT  awޤdzLJIaNX7kM_b]U&(ωE4nXZ GW}ћޕ6f"ɩW%^n-pw Ѹg2* R4}1TǺTRR޿.jbzoجX2 XUs"NNEdZJ{d~R 1)=Ŕ!r7P|-Z#{A\9ɞegjS_B 9;`7̷`9cT2G5{-=1FWMv$>UgYgtDP@T23sy omg~ *x׉I G-d8aSx|ea~C],@۾o*2QLR|h h qɅH{yW[&{}nVw9GN~F41T E&hWνEke{N o[؏J6/4உpN&9sٚk;(<$l 䑒f HKί[B2E ^MIG0ϯ)Oqz%}kcʲ灧l|TlWIg?I:aX[fmC/W<-)md&ԄTTEFzT xB0ǭqDUtp9Ty >q)3ņ/> zRNܸv#$XQWð;gF:Ig@%4Ik\U/ .%g`L'13=Y#Gfw.wߗ74LցD>/μ=Tڴj9 /B[w3}J2cya\~ܐ<\rj:q{l'}^6V|'$`uBJ,Kͱ8-6;g98!aC#pM8O% =E^;z׮Nz^=@۞WE|miaL GG]O5J)972|pQ9> EdkOɊf!;ʽH@J9 詑6F3Hy/ρppJ(jx]|g XIgqWpmS09MF94991wrj#)02R+>)XqĒ#G@ʩ- 9/5xwqWvHxP@澒|{-*!*` Z/-Ɗ)VZu~~Mb'hB Lל@Uqbm5ruzf[ QLrc:ӤUTz"לi툞DՁ:$XRGNWM {=ZJst pGΕJ!4޵ΏR˯k 6-# ';0Zۄ>*7`eˣ4uҷaqɺɨntmy^y*7#UE.^P{/X/k;ЫkDգ-B}xtC%DpȩWaa^|¯' _-IMC||s ǒy~m9Onу7(PL."v&')#fB-'c׆ 6/ Ah`\R#DY Y.Vv;g||9:>F>`~:hFqOAo8un*>:յPK_]ItY[m{t7=Ǧ<ސM9"GВŒ^ѝ{6o{K1qIZ9A&%ߓz `EҧH}$mnYH<;+`y&j "e삲wFU7S3n'6'\)U&᱅xAvƩԟ"ڀRҥi@@IauDŽ%dɧC;U0-EQJ%YѱFZmwSrik DUw+|:bntm{SF<Y~'ܣ@ٛ22s|x2bO W* f=q"4,SpX \)''VWRk`9L@ i♉ 8TDPu8Ra)+=4Χ\3?2/iTL -ὀۏfXGGz%^{GGӜI2;U:]JOH)7!3b1I,׹*o:us ıv#szP6 *;?#A;.smy;Uq/#\qM~_iZM> ͝ye27De,k0W57-1g!>tkkp^OSaDE0`G9w2):ҧO"Mc9MM=/@BjON N<.qقF/)Dn>/!Tqkٝ 1.[~t> Ϸq(TZ&;6M Uu+Zwk{No_,^]^ќ%vѹh?._KI8}ĆQbm-}5X@MN^ $J#zX`wCumӿk~Q ZC$NrP4ɚTU}16*t VmWCcXC_J{* ";.mK>&V9pD=<5O$kdu+oFVK)}ms*t4`;M!NBWK8J>Ѐ`sTsP @(1.JsN],th9n?-/PhN,sJrz-%\s=[C'xw*ʈ[LmsѬЌ}TuvO!OVs5%ժش݉dW_@~x M3`[]J+%n[q;8ǵE_bqBS0Pۖ_&؟QM[y[qIup > c|6{th?~3s$24})(K:a ~̜NnT\&tG$1j2xSGG "kJ[ I:Ǒ澤k02dqTtn':C֔dG,ҵ4 <PU5nA*ih`/`> stream x]Iqw/K?k}fB9b̡LJr6K$gYB_ ~KXl˗ P?܈IS~oo>7(&mчWh AҳFpURW9pOZ{/؛ϳ16pbt oC`?Gz]|t}dmk>c_zgVy||k P6EvtR @#o XrwKZj38E5f~=1WtsI9y8Ɉ3AAK'R렃;D[}ĘيhkzCwu戙DrO tt.B)]H5Bsk#o1~BF z&4$&d ?E2-QXHk3I?2Δ䑼ĭ,~ΜйO"Dk 5`^=1BQ~FM4V(4:3H}e-D72dVQI4"`3 )N8O+/jsʎ6WPȋYq+{̕tU^/z(%?9BYp h֑m[oѹ#maO^ZއKIX!DJ+b&XkL Aϭ4z=Nq3 wbI/Z ͇s#ڠ!DZފps$q^^H_ t{P²EX27vR`u @>Hd*}^fq$E ~!%wCyY A5\WMh\A.ifRDsc'eI"L4hۗ^Jݤ|>%o$iו͐Vv2l'gz 8ۭl9$β: F1ja!e(%*پKb.CEͪJX04GKjCڨQAQGZde-}kf/tA+W}n2]+Vdj(l?Օk*v6h49$4y,N5 nnqMWz o "N2}V7Pf0'MoGWP+,t.tmhv4'ge^!zg<͜@9;kU!O[ XS\Qp('&*Cg~*n@,%c`BCVRY ߤxr:D*w$GNOw IQzE$DH Ab7rY ]ʋeĀe#L Vǩ!FyuLBjJGQ:_3mON*% "eui+=_??o5QUQ\:rfS2*^KJ%=׫-|o&ZAY%Y)D9Gl&>$fR Q$%{RFO :jz~װޱ' % x # odVN2k8my7[MR1$y$0COL/ f0,)a+6,TPjzz3^+m!'-L:9NJQ~OE<( DXURȌ"45Ao#ĹҪ)p4Z_@Tq^oS˳[[w]Sm$pXfAgqR) -_sai~XgyRzOŚ!^gzeS"!hҭ!zn7]->&PN!(b0aJ֎/I4u# 3}(X&t=cQ:|Kۧ@iaYM}|cr$R_d >-lNo {Щ]^ ЦSo ʡo+e-M.Z7هŹAˊ՟5)LakL'\:×rBD3$Pq}cj-Y:R0T{] 0" 5%-hw|<]5hyUAm*lgnGexWtkoJ3 XJ8.m˥?JAt*|jc.p ~i=)mn[*L/8w끸c:x3IՐwl|&t8S]Dr*nDG)N@ttgn[V(vb\} S|DG'l,(\hp+Z]kFW/H@er3_Մ1$UyȑMEl[-D-$\&܊O;!ҝK[mw҉# B+H\ ޤ#ØDxHH+/*q7D9*ot{ZUR{е٢RKncy}-Q~ wϾ\_-cMmgS=gx5l}tJ΃<)|ت :=yiPtSi}#r<%:ޖ~;9zrIx؍^S^q6{Vv4V EX:}0+@daZe:LPmu:Mir҄6q"r:G\AC1>u%?,{ttuF}v7Kǯ==;zp-Y].ea?&vFaqК zoQM,ľT!xamI!6{zv xxQ͇! Ŧ3s/Mh6g*ǦKD0}*vKrшr熦$j*x39&2{] R|Mb]g~N@N6$k =&;R@=M'ZE S%*"ieEx$TDt_eĴJK# :\N-Og@=k0*` 0ZJzsn +V^hAF[t|!Sxiɹ$>[X%xY2+3t랱Q=NaYw 6D&N!Z+{X4>0hPt~w+Ϧk:`fWE*P|1^$퀊j0+$W#64|(,El/\=^ ޲H/gn~0W7V6w߹({BxzdɽsLx??uo4E][S3DZ\h2]N6^$;|.?EejXݪXJ?jTWTNefݒgWk4w='Q6;>)7w 轿&IzOflƟ\A^]A)L<${pߛU,gJEZAd!єje%"{EUrfIyeB9G?!4b=!lT7G#օb*gOHendstream endobj 257 0 obj 6241 endobj 261 0 obj <> stream x]I%qy 7.h9hHʐa49ҁU9 %C"Ȭzar%݈Nͣ߼HܼzL{S4&v)gn|ߔ7RNp7O<3wwEc==5N? O??|>=ͧOXwc>Pbt?XӟER~w|gԷ6`hy:Hn8Fko{tZ7؛coΚZUu-w6ơ?ccE(/h@!%^wi04= ~ K ޔy9ouPo0SZN{0^*w6*b.ӕVaKaKAPiچN_xzyAM5xћtn$&<7VS{y ;R!g,R Il-m?=>~ک;E>P Foާyx,65qދWMY&r>R* I\];)09l](knMidl˾΀ֿO} ͭZ[Rke6u`т; (y`6ĭAtyJ uBvQGϳu?N xn=nDXꥵgBXm'!wB:.hW(wCl+Zeh qiJlk,Sl#$`Y!EPoZ~i`xM{mqjKjj7fn 3|$N; Pތ5ľy~y?*HA>Fd^C?4 Y`Sхa{?ʪoZ\ȁ_X<!YFGa:)X ]9V;i5SVg+_kJ.ٔw+&l_^#$W\Z12rrq:D.ig#<>,9fvI9i3N u=s/S 7GRh,3yi C[ښ?M\t  N0=ODXSsTPsf^ϒq6*01=ZЩװD ; l"SoW971]Mo6L`q6e޴/n?U0cHy゙VXrtGyմ@+9gTRhIcr8$ӕR,%SP}u`+wBA3I&X>:w#i*2-P$f '#:TѼRGC* fs]:/fKWT@"aKTȏzNo@[B!:)s&1A#H./_Jkw$?Ֆd8QƯ6rV&sm,ÃPXn1&o,%ο|YQFp5 bre̔+/Ώ };_cJnz*6e[.x>WEJ1}7K)9RX79#̥K.C /8n&1:%7PV̡a;jk Shk0|%NR̜Xjasw8=i/ 07uB %{Xs4/$U~NaR \T,d%/)8k&XK!Ջ[i2yBS5.-Y:Ɋ<ڋu%DEuW"{,<@]p[/]:% QeUiɲt.U\Fnd󒠘@󲈤4(t+!M0 !#/@_k]\R(WvPjMAT@07w]udتgc SM^a ZZߘ$G*SlzqYLbhHf{7fߴ6;yWj Ueu0+ACԚ1_ٺl y.k;e,rtƵ SG0MSr،rN 19I^($ǂjDi5nV,5k6NJE>մxSMu=DAzuXxЇ ]x9 UnYЧE7;*.Ozl~ ;g#zywޅ+~ [M2;}C00yM"eXds1r3hu(C4܈J-D ߒ0gV=?>*ZiT!Rە Ј8~XM <Ƥ;W=û O7>h"gG) x[BG;oFI\&gJTkT[Ԯuǩ]Zʙo *i.T_b=|}@PrK֋Aa;V?@FpWYK5mJו"\u`QAJξk^su;>Ugq2g`[$fO@pmXtQc9ֹֹVmR+8U0J7lLtbGM0 T:4Jn @N1L҄<-H,cڈO @Np noC塟<bjJ\!ǔ>#)Q<]aGGG>R[@#~2a!?M! ~g˜j[Emdu^y*,h}W "`x=GaVY%1cSXؗ&kYu,W^Պ6+`2{0\zBVX*2R> nK8Q~w^Qˆw7WOgմʟr00v1:'^Y1g닕o2eA#/eKtrf̡]˝o< Pz찚ZrL0옽3ȿe"JVn+|tso"ynzvI}&endstream endobj 262 0 obj 5617 endobj 266 0 obj <> stream xݛIs|wV&kCdUE ku%V+N> ҘO8tR<9Vt)|;&es*JE(uژn^Ym֐a"{z)Vh՝!gU>e֘ߗf&;,FݖY^(}ұ 4R6P?_rpy)L)KktBhiYӭCt>X%1,+uBWQi1`Jai2GbɷdeDߵzxQL#eޖ񜟘517h,)bMTagZ]JcI]@ q^ű_FP9qVOG (!&[ S.[=Ħ0%15^kMK}ҧ4cNCJr|<Š)AEFX7]e\jK;٨w~aKj՚^( ^]C[yCHH;ifUJ"]ѐf7"X]Okɡ̞ԁm ФB,.+"&PԦSy*j&uOHݶ_9{sנ.6ls5X)UW!G"­ꍠC4LWl2܊X-KAO )←, Zr" 2aj4I^M7Z$eQ;rXȚ瘛 ɇWUm7 6s6Hzn,P* X%qxIA#T8# g?N_Pݯƞ;@pܝOWZq'E8!().".[E8s6 9=̩:3 =*tFAc+Yu#\]gHkiFM]T'̮a6Š#("eڠ}LJDf|(pg,F-^#љN߰~p>_r\OQ( a&=8Rп4|VfJ8\ydÒvW}ǼCicczvLYDFQk(˜,yˌ Ec<7q'agZ o4y@TN7I&)Mdx"i?C>4Y!H3o&I|iB%f縊4)~:ip i"Pt=ilmJmDzfFD} &_pt&`$"GVws+/O^5|DcDRl1QtST*LpWl 5fAO[7={(`WAwQe卻1{6XڇS^!FnwV Z~/Z~8wHLx'w< Dv Ly'-ԃs>R.3 @1%/}{@DWc/r,D ®/?rf`C k>#k}ڌ=>lj%d*Q95C߹rK磣5k~2Pmq K(*XY>V:DV>^g`rqQA9=h݊r˨4;YU2+#&2 |)Vw;gbłƬ#-]@a,w.0!m~pf9d=0s> ;C7^= | SQEwe:kƚp' #ʟJІۺ쎹OwOw݆KfQAoqMpv$T ڛyPypcmlqjx揃gyYDWg??c9un ϣϨVU1̻U윰~u?%~CKFvh''M/H#rFQ Q:Me ?&/5Fc Pw/ޜendstream endobj 267 0 obj 2574 endobj 271 0 obj <> stream x]Ks$2|{߶1,Çb'lJŲpjF/Ɩ~3@UT7&*P@>|~'&O˷gnn3IsKN9vқr$&cٗ/Ĥu^z:6w;zA*B)a?_ho'%u0}^|cUO.Zkz-f0o q>([o+`"┸@yԓvV^BIEڥU6C?Kesyx>粧ZL8Բ~>B-W>jh`J{ UMQ@\ZhL*(xS687͗l Q JC,R`K528ʌ.jW9!9+ʳB5:y`-1@+gCһ8E Ur >?P^M k*BVio8 QER(:u'pAB"J*6\y؃18@ P>& teIZkAzX/b(LUwD''8$!-3$8`r *OQz |?H}@J}ܹ)zQH@$+'T}Lkaw;Irȥ0|j}F Ae>U#-J^S̠f}>G)gqSWBH@5eLr[6"Gf3݃M.N $)ƛgQBjWR@ik㮊 G2Uz(.;I ;J#[_.m,o+ W8!y͆'r8F ˆ)}!Z&l¼ tAn)"@\mʍ%3$+J0H0u  $+(\s+;xxE5UD-b. OH*Ya, KmTFk ",ud&D他!Gl<;竕s&)w/AEVH'Ymp.C ǐ\I)~/qii @cg([~ llNwiu~ f3I/F+>Դ)Z _édpSS8[Ĥ-B5ȸiszEtxxx1ޅ<(DVzxkEU^[.n}Xcop1MFCfCfi4aN!(S︠5˼<{S0Mu~>ETuAWJ sTVq_ ǚ%MH"` IP2ruE%;ɔ1ܺy}1O&+DL+m\{%`HetNʸk`[7JG$aB5<+~:x59qh(v]e ^)k-EY.%q)k97R #A$dRF)Xj6\o:A0r±W)EVG _S6LP28zt.@@ 'gtpa#_\S'NO1YAHhl r$ e[Hv޵O c4m*dmx@XHa#VcZ%AoCȬd\p=Sr1j`pߖ([dNaDwcA<.@`̝iiG Pe qSmia̬}-0N}} ȣ'! XK *̖>t$ёjPA8zjcD<nKDŶa7‚цS1 ֫LL- P񜑉<ۜ]>٫oQwa[槷PR=e(OSIKOuUѬ>2([GX1<`N&vA U"zP+j  OS SD;AqAI>m+&fl4jԉȝFrMB@tU~g䝽1X- bvZUMI"R"R Ȗ&w:˛ ٩HZ2 jYet"#='h._ DZ:;Dbe'r^E7EYAٕL k.lɢP[08C?Yz%AwygT;xe)MiX\cXrM#9Qh7eHCJmt᫸Co-_5Q3,I?KK砐K( B/X!|fVmb&Ã!Ҳ ,4q+>n6/a`ODnkCXC zSl@E@Gz Wt_,??]~~|$ֳ]^` 6Ոy}S`L&^B#8ӹ( tقr:&!4)@u!jتq_;/GO6}n#Ңa(ymV]qK W}0T gUR:cs;)6u!@;fgMVU`[X|3;=q/`ඒFYRnj:ʆ8pd*?Pd{lR-͆?_~~-SkHw8P *nnBQ{gu} 4klC^`O4a}Uڱ 0@Z?J%Ħ]HZǯ t2}9REWuvsܖJs nmm?IA]؊Vm Aۼsq#M qn̄li%v(uT1^ʖcE"͵0s)i#0iS𞺻cs9!CX˰t4BW]X"/L4 Z@a5(m^wAˆ5~sc[]D:=uۄG=X@w>$g4vA7:dƛݤF֕Z/??κ+w@A[=luo8]x*dؔ<ƀyagþ[<^: g.Et4o]ƴwCN=w@}ge6$1NF`"NOhʏzBb2W;)ޔAw!T-|\2M|HZ~(&u+daFX\L?j뎙G8Dwzƥrkѥ d eI-5vjtTJ0%~d}oRxLb+7FY,"Uqu VOD%۱C&ĵJKM1Ygn:tke?: a,x~^ɯnMs/2>9J Vz߫6Ǔ_33=y ~CG y_is["1Nv J`8+fN e5meriYe6=рG΂*F=ʇ\ m{_7M~ڏNOCwT7i&Gpitxx!gZ}&;]yUdW0]И\//eŅߑ[ 7pm \'kkaL,pjmiߌ]u&H[Dti]iέM=% [0)'p1g5-Zkvua>vt$Yf)|x " Y;!*+۞Vq@i7dF/U.'endstream endobj 272 0 obj 5844 endobj 276 0 obj <> stream x]Ys~WLq' %Unjrk9Bӧv{X8Xwy ybי.6ҺyУmD|+њփr`p8# c=pwl73Kh`p͑9륟fɗ n0bM?a8sE Y}d>hO\Pf`/R2y6&R+'bQ$Gb4%γ,eY!Vye܂##}&Y%(6_dX)d+GGj&WlQzNjxJ} 'i 6篕ǮQ/h( ^iX{$Kxte45\^۴\(~ZVpߕ D\\I_:Qisc+!x:TzCw}Іw=X cZJe-E׉҆L{i ԧ0a<6UBo1پL-)-L2 OVZ9"5jD<6#iUkyQd$R xvGPWdLG Q1,)V@iImC|ab#VGI__+G{ ]F=hmR 7σ8`-VK4"KF1i6( oFIDbub Q?_ppͺTyBH!ܨDJ$B'H Ov@fXG-zG0뭀3Iq+(k9sgnwϋ}-8@UJ??gO- Y9$ eTW)ԩ8a~h= fi t_P=>wHt+p~o s䥅ETФ /@=GJÛIP$064a"ޒ(o4Ӥ\NȤ8el=b0!/*@挈nKC$gӿ&+gN 8Mc)3Kidc`  y0"a &bc[S`'Wgƫ&H;%)Dlm!Y,3nN1uaˆs+7a"+!e!u<Ε ]ߝ UDg17q@%NjA`={H2[%A nGp| pF*u܂έQ\8Sp#g7K(7? MP4~HSSh>4-UioзL,iɢy ˿[a)yr{4|6y33c3cN5?5CX YOPZ)~S |I )Ni$8k| G$ΌSQLAVrhmy:\p=kLĝ:`pN_kia@d*,/PC^U,|6A) ƍ]E떎08bv>~+yw8(|!$#m&n/]Ny6Y+T㛴BcCg0wH'wOW|s8C$vTtll NaY픳ʀ5&a^o p u 8by{?+$J8Upآ>h 8k \IHhrUKb| Ҝ,Ẍ́O _ѯ6Hr_Ԇ%7~ՌJ(s"fNc`=70Op1(/][Yxa)Bde@tѝڽ";n걱qʣX~#7ONS2b-Ґ!*;>M<`غ,T&!*z* PysTN r8fU,،K6ʃz(̔( G W`4k}1 & /+t0;sϨ#+z͟![E`{-Tʛ9O'8:}'vr&ʾL_ bO,: X@ @eV*'@¥rsU}> FNb[A7*HPb(rj{l':?2]`-/A=5h5V>f 0\^I4-NwK3,.ͺRhVV ͧU 'k͋Ϸ7)uDGCQTF~!IO0Jq?MiH͵=v.UϚ)g Vyq0Ca8ʅE&Z$ bKs,. *>H:<7* _രs<6;Q[*jSXqRjn,-<WT O~UL7>\mLoTy]-kE헡+I+yZcYUgϮfV΃2!r0ĵkD+㶛\i3{D!y7BE+ʪ\x6V]GM>vPmH:\8F% Qu8 M;~JPnWmơlYDBP3]9Wx" 9.L ګrBv1BP)\N.kiŒ@/ѰqRcc&,AaE)F`gQ)'S8'j9sz_CW)/dYS_OzWWpUCoS4Mq|l87%Xo$cwuv,?Egs06T 9ֽr+ݻG]׸F̜Njc$_)܏~9|<Û+_OX' w~P)Kjp^oS9Y^4b*pS+}\m h*1;\ӻ駵lֆbz~JsR5)7Iظ | L˯r|{7o 5kbCfoZ5 w4"{c'Uk1 1T'y4+MwPn*,p+%8.u'`%vb %LعB0joUvWk9s:h=ڰxarRP'.G4zoa0N/56I̟-r7C'n}4@kOhk ?8B.JHqwόw^ z$tL{r֫dhѲb*iZ"fbH" :N {1b:]+d  oqTv 9!q/„\Q B 7XW;2K$W+-D~(~j{"XS W*8*:XP8I5tOTсܿbYA3SZ._3(%iG[@Q4L)O0r!&6N(]G]领d.wKps!'$Z ڻgMn%fxP ۧʂCn2poӿu 8mSeQ^6[@LC,ޫލn5 8!+_"XA,"P#Ĭe{#V(j)y[׼q/q ZP( UrsryCNI?nT˨jvMU#!8z8ҝ`p-2j Z'.`:0qU$vZWm.EW\,t<|v5waw` nn)eGby0| !|:Qp[p oC7˗^(noǑE]'<0"4q{ uiY)?R0վ3/bu\=yYxk(䣾l }TTl6샇IoҬ9P!qy( ~NH-M͠ې F62SZ[Q^+}R+m+ uC5꧟H_z Jendstream endobj 277 0 obj 5331 endobj 281 0 obj <> stream xYr\-oVq`g,D*Kb6HlL)s۸!)RBWP+JOՋzq\N_O *lpuYci")iuoq]!WYy4K\ W,WYP d!!'K S|X,Znl۬#鐐=~]H.e9)vrV*@ƮnlT>Z>AoMLLp#.#Ok ' }>ڸ98GƧƚvJlhWHC>XK*1L%s]Q؜;/]XMh;τ䝔uԙu:iۘ*]s\ctӥ \Ar!Ed`ca%ګLT}uU 7nxթX4WwC4K3bv;nСbMHPX&4~nNlwzЛ2&b{ Ø˦ZΏZfe&'&!tMLFls%`i[B-M]rhuugxf/dCrrI%]H2 9e-iAi7sO V?-*r$-^~^7a W ]rӱ8':w -xA5q^WkVeQ|sBb\1S[oF=Gsvw2[^>.$niQgR)rv-NPlL*\|%vzn)-吝"?&ˡ x/,a]/ 3dOu;"Oc,peit*s=ACqL^¢dn/+ qPBv*)y`3t _}\hv-{gx˽4vpDW K/%ObOU k_7bw%Y%_zh;ǕnZ [°Uu s%C13>ܧh&>\'PʊR.{JQz:ubx+Lhp5JmCs 6fw~^ϡTE q*Q!т/xd'WR}ucדEBN.ȓ'pIUџ+P >t;`JM.M&LW֔-<+xrQ Liû!bd2[NC JiFN>}2g_`)l=f꠸]SfڝIf&єB: +N0ZrqtRV,ڛ Cvˋ X ^V+N.K̇v;XRdL`X\%/Ei7U0.Qq#Je~iIe\.ɚ!r<'lL8>+syzdn[P|SӅqsen5 "!*I,l z 1b1E<_Dv_Ph+xm9o&<ܚJQT)(g|:9b 1c([B SP{U5eDHkYh6,o?YG_mendstream endobj 282 0 obj 2142 endobj 286 0 obj <> stream x][q3K߰o֓w1O|( [I&W*2S6óK8!p6c YoxNzwa !L!p$A#4-Kfm3_,-[Gx 3s:Ś9J >IyT6L.7eyW&w*y!V|@2 3u\)[.)+hIv.EA//P{ ?70NXm(PQ߈gw(q?_:;9Fce ;E]cA<^:!qWby*!=I(-*/C:2&-{E_Ѡ]5ߛK@*ikۯYDź|.3 *ȱ>F +9r܊?o ]ćI+!&(jo̥zhd$[ݔ"y-AhA 5Z+i)lWj_hd;4vH~JuK6Nh#Xe+H=@,*مBrܸl764EOӪ N6(N6jd$@O4MeBR6?6>TFQ6Rn)$iX;&T4D#tDΡefkTJI.CFá:mQ1ƹ.Ta,,;*k4:2)֦Ly4Ӱ@„)L0Gu<&xh^iH6bpц`e Q4ր|WG?Ut03G,iHg )]RTV=**sjn?R*ìبb36#^0JL1}(D_b Cuq+[0 .~o$ !V=bk7G!0SGa׫ǟjQ;Bo\ Q Ij?~ر5s8r*U|ݴglj|pC{ n'yV^ C+ojvQC(萀8f_42"M6N$n9c4d`Y1 GL4w1Ƃ-(o-0gh^ R*KF1""C4* rڕ l >N;AJU [CӶt=rcY&NY֤Q'wKXGa TƉ] YUit2VTC 4ߜ(&b "D5mujx#^[kzI[ZұݏbQfcP% !JiƸҌF V PR{Qk j\.K.+|":D&I2ÛkW9*F4{W(= NX?5Zu (7Z}E-IXcgqQ>5ʎ#ǿd48a'Ф7g:)PV&n&Hu)ȅ߻'JmE.Ě ZtfrybvV-Q݁Ɔ iP ׇfue  c F=hJ ?DLVߎdȄl\,iO3*'MmS9'Y$~$TX+_vW4JJ V4l?k>hNv(YXWҨ|)9=B<4LO0&m1;(jN'o)7Pљ~Pi=",aIMs"V.{& ٝQ`1~T쮣g bhOQ xR>)CTnjl8AԹzaa I'ʕҼ* :ixS 6Bz=$y&gyyN vD=ʙ nuP ͊ߊFI__^9 [R܂L pd xv-" lb3h kA=mCicÌ5 vhvS,m<л](A6j Uh:D5xK\OE^>+ⅮcmF͐v_kW&˞&q sqȮsmG,K" H!۟Oos[6{6˙Fqy7g o>|d$}:vy$<Xi8:6p1ZGMm!Dj'nא Ph563QbX%'*Xru v-<[s4:EP//: %ڭϖCXk!OE҉mbHSߍ=t* ƏB1Te]NIsQ&eWZ]UY3rř:Y>n; nmԬR+tgMMFna.OV̧rnm͛ j]%j\I|wahM 2@6}[vLf<a+)Se65dn0 g $p֧Y+D*< s,ON\X 5 }6˩%^T_)P8)q7 BS?ZY M5UB[ P%p#X(M"\FQx5[wԠ;,ỷ=Furu#m8Z66*Ukl`c`PtKZFU5_<~K/;r~QgsKzZCum sbkI5ʖR)8% @bP@W7vF$j?]Qy.m̙q7jUo;BZX'Ži;p>򝾦(q֝􄩯~V:9Fn2R[OeHˋ1Nb $@@lmwn[H6eGh[<"i-VĞ2M^;aK.rܐ_i`vdOLS qoTe낙6M5t eSҰOx-nZ?Ȑ6tJn]|BcGIeLT!P!c̢MnwZp^K(VHDd Omj҃ ..֭ )ԜPX~E?N,?{Y HY,M]sy{tjݔ׽Rdf Q ac"%4+(u`5 u+Csa%9'<+rZC;! //"aWT~5L@T49RmԎtq;DBmC.]k \ɒ퀅OMTRyMˠN$Ƅɛ R27{ Ǹ#j 䫌kT!3|;PpOgz|N+G<م7h{*6KgF덍 8l=UІ!_mP;KaNh欶eq#Uڝ3FjZ>wE^vφA1#~<ǝ_ zaC46N'$AF8t~kXpH:F=C:uv#<.a|6Ϡ:M"Yy,8vce m9c{dãf0☦,l O!xqS :tQgU[)=™\"w{̍Ms׽5y^;X_V*{l U'#.~ blp $!h=W߬?\~PrM`vBx36fy3 &,W]ͷѥ}7ݩ]Fz-B@| {zOܟ%> stream x]Iq3Z]Kx[^(Sq^YYP-HѲ]U ho&Cx!&y!O;>xG^@8ExNRB#9Ii/ד;:<ZGxqy6uxzy:sbi6Xk땯̞_ }8Rc,AGHڛ_jo'%Л4Chℇg+"tW; `/)K 4&eAǷAY;׫KHc4-7F߇_ŽPht@ K$at⯖hԚ7by??1jf1>KG9 -],S&z m( -[*Q߾e<|ˈddS'Nwښ/e xz H=瞵oa&ܙT1x[֢WdTmB՚9_ Ge8J9EsJ7RD}xH%/3s{iZ=$.Yd%9jΜ=4IYj> 5X)g#oZeM 5x1Z"s8ig{*4961q Iȩ,mpUD-g. _<80tFbbeB'=K-\=5 ̝(>6 tgwQϿf"r<2h .yS)ּCFʟfGr 4k9 v0N&v"nP]k+n]ăȬ5(TIECMTT44Dꑿ])z6?br,sEi3O$Fhae)qinL'Zh*i7]-#>є-|!53`ENʦHeҝNTSLXFm &LkgEۢ(X#ōƀV"zM+/*xLLaLL!y2&SaK"D\.%OAf:4sLvfr?S\@˾%_+H4jwNvb`'-k6A> 7\H"u]ye 63(vnX_c- !-V:ptEJDyf@?\#JLR>=hnQv$trB+|rҵZHAB}m{ ]=_;k M,ǁ᥂ :v{I}.FV#/ j^NH[2o+- 421Z?kkWHncƷJ!'z6;VY%}ͽ {sa&6VSip~}gQv'صzTȕshEjx ^X5''oS喐+WL-=Scp Pȶ<"e.#t2Z{3jy<>>ޛu1-#9M0sq[qB4c5(P FӇ/ƮCK"tBWS=k I]L2Z}R ?Tx1D2I!D$kLIg EsZpR4o K!BʴOӦ{l).i%>^V AB= BZd 1JE/|8YMSSuw k5;d 9oe5hFHkR;UTGH1c2YAOZv7fV7ymŮ׀]c D-:=LLxA+3 Fu`M^p+}ز2<D=,?[aҧc\ȿc!Inт; ?0Mfe鄭HǛ!?,ZFအ't 3@T}ou9"\$&HA-\/G<2i:,'G[IN^he[YĈQ _G0rّ#z)|~`'J{`4/hC*Ͳп7<:QWs?iF}S~pk J3+W Vi@vRFқe9 ,3Ql@:5AfcႣh Kbd?[6`*1"|哎qO\t,KVoY <0XGo`*|sX7xo<-4 ɁiXqk03!DJrR۞CPL= = S T,Z&(@n Uͤe~Q #ȇzM 9ZFLt1ڬ q_{h]ն=E 1&̰sx*k\ƑUQ vȓL:ª:U8G#&SP6%@8>/qek ~6 &r&7T1du!J*Q+V[As$wI[0QF N Saf.@ڒ 3>naf >oU¬>P>`iemGI,PP HEBøj:s<|N8:02Tpt%i^Cs$W'}{gDK 450Ah#X}&Rq3eQ =z9 G/Z#,}3E z9~rh@mŃT&E%'+s/V&X^׉0x?<|;w?]1OqO JX)>>cn`W~b@!|OG9B+*W+;+u=% \3jeā)F|kձ>]4ȌzGASXQ:Qʤ v>3Fg-(wUaa<<.8 yZ`T2mV^*9΃)Z޸Rzq3u0x!/e9:yE&ۦ}$wf(qm%NՀ 'b06$4bV<  Q%թ.l2|jw Pb ,eCxH<4^B#|N襄RdRRyߔSͦ>4 @#lViFہN͜! wfiLaIc_v)CR@/qr>cSͱZ3 7%T{4,x'Z!QӘS闳 K/Qi蠌f),-EG4`vWkOib3\C7J h3[{0_fe J+b8]ܻ6N[<_'D;d> I+jxvcѶ ԼIF[/%;z+nnvR,˥a2֎l*12x\z`)Kp omDA՗RJaSF=r=>rKe嚗m6 f [{:?)`lbwGEp)X+wealXLNY7ݨ g'tۚƤk^ֆK`,AR? p7U?2]8m5wEu('d-4k!4VڏXUl,n"UoT\!"ӋQhǧ >Xۚ$Xɧ0lÚ?-!ʁ^ks &CD=hPRu(]GFEw+ܖP\]*_5ڻ7r( oocy{11_uIASbMc,+}b&ݜmM=+%8jԊׄg?wx@YG`c𬂑Pr\MWgʸ={Rę1hiC޷"rrVMFk|MP>1SәJ6E!UkoG~Yk2/G dž(;2.ÊꛓA#VY=/P{^rkNxVnW}>u(mǁET=>fh6Q'.:m>u\!ۉe\v?2,?rC]s]5~uYʖ~^$0s;,"moe Y+.BG9Wy7gv媆_u'A^fwenc/'L|/}<~ic~xwiq-_Mt &BGQ"8~=›mFuM-KgWp!:)ZwXRxMjjc:8~q vjf|Vh8H Pz҃xR~D!96Y<wR:u'}:::o|h[(n~?Sk#X &2!^5+s@-.ou߮8$^Év.>ALhŚ}[\I0JYm/Y.u)m2|If٢ª.%\p3>p ].첍F+Zߊ0AGPE - [ !G?_X5p|㠧*utʼS8pɗDvKǦgOp ӕҾcD]}r+(;!mp]E{'Q X.8a yV/> stream x\IsR *r}qr]qE.yDه8YdǢPK?n3ob\*8{4_7O[=?{}?WדէW@ wVW|Lǭ^+\]ݜk%ZK;_?=gi#R($_?Gɹ|>[s:/Zޜ8Hkf=R+x/Pߞ{Yc1r猗7al\>4%y-g4/012 _8#:̻_c󿯾֎.PZ]rl(~Rh^bꬔ{c7'VBHzl@($uLX BvJJ3` ]*;fC X*K:0[[aY[Nx"7ȠM05Z;$t$6"v d䷑S |drܺqAi=Jȃiz qQ5=2,@8u4GX|R%0n,d*):s,%H:&O?@IfS$i7<'86exED}Og{Vk;-(ux&wTc*LJo{ O[,2a 칌2@{#"BC4uMA`cKG02-lτ:2kwJߗcwpHP觜O44?M,Mq)ZM u E*ȶRGȱҒ_ %Ag*$R׀:"آCN:r3vt[M^%.$հj 㺘S~Kx1> .]8-:لᛸN[:7yJ e]nc .J&*[v3z`/%(d )" ;L/7k&oM& Zn=Hxi`7Dc1KXVW`dZVW`DgN?Z%j/7/ÀJ2aF@Ū&LtA-pAs !"-U^v LJ`+ ֠m׬9a"ͷDxf)*HwX|6[i!nHpMQ0rtJ+-(Em%ӎȉקTd~'w1]GjRc5)7 ;& [Yq*Q* ԋRn!*IU6@V;7hqg*L5vU! `.2QGH!H 롁,q6J:Np9do?=GM+!n;&&x+v:i&k kl/ڄxoSzAqɴl"lb#rF؏F ~SuW ]IT ƀt˰l@]H. Ja`" n;>N8s OLȊS:9xIIAd)^hΰmYO &~PwRHp]r P *{7։"¯fD1`NpCz Eb9C%H3L >Fb[{B, N. 1\ơz ]\7?@X6!3ڃAq+EZ=Ae`4Նm(Jl~Xl$H4=)_!ǡ_F梯A.eI%(F(pQ0ck)ż27QOG Z[XVeF͆pV4cs?Mꧩg,*͚ `IӴaA\.n%G5:Wհtq+q$|r!ivWavPnOSzoKF0b Lˬv6av{V0MB_HXӫGA$*7hNk;-caa|E #x85-Do㤄.ΩaH?XYQZbsuvAQlbz4I JVY+1Y 0criDIyHӎv ! _VPU;ϛ TG=|ev0QMrDyx苔CZhUI(S7wb] 6̳큅zg"Z7rQK\Rxs,ҧ\xw$$9_>J5Kp!xriIscsB]Bg"̸3@J~9M 7vu$?brnx&ܱÊ_,y\\)Q{!i^'[$53d#&LCz |(2!ox^WںؿZ:W}ng`yGo}lW띷Ka.vmbg:l8quiRlOM^2~JeB lrbe!ц cGkhgT Wz;76|{KQ˕$BVJ]1<"߯ ?Sendstream endobj 297 0 obj 3905 endobj 301 0 obj <> stream xVMo1 ϯ1#uBbSB(S.jiݥ-TW( 5 ήldfĂّbT ս ( CH_gD%'#E0g/E[zj{Q,~us/CMŬQ^c h0F)Sbc|D|>m0?i 2endstream endobj 302 0 obj 699 endobj 306 0 obj <> stream x]KqgY[ۮ#<RH4)O @,)${YՏꪞpfuUVV+31A>_o=7O~|"y{ F9n_>oʛ퍍a0ܿz;1h0Kn ?^*}~KCLC|}3%cU7}rON;[)~-2y!#-֔Ok&X^`#߳igU/Zyխci<ҡXqܚv\]*cJD,C8.FM7ps!Hf)BI=CSCTߥÒZ0V 3x;e38p/mٚ٘u ;<2 $ao@P078[8MhO L2.J{Yn:˒DpMo@N B޿^i6ؤyB!?0lRr[87hIxP?Tۊkv>,G, >4O=&!nDIad&jjV= A3;];R a:K_K6H hUMZ-X-Hq޶8P>@g`@3pV+̧Es6ȅo3Tt#-$~̔eHd 7"[<4p6>fZ35\ta?޲&ttC\<'2$Î) mKx|dFZ9_ 9~Y`E@\]ȐAA{.8%]LZÚnL:?PbneO7Ļ|`Gz1ldK)EוbbKY2LkG"lYƙM"s?ELҧ8l# 9s곕%k(u1.f᏷j 1f`o( 6fR>ȘKlD\a:R"7HFۊ."_,Fu= ֔[d^>!tm5؉$nf^M4{y :a ;?Z.QW|QSH{[|۲ʽ̫sY])>"oqi0c<6K`|AOlgsf{'EP 9:B'kE=Hs* +W9 C,eD[oh9_N+8ɱ\AnɧCxx߄;FP.zFJmb}1ђv=0KP2Hhyt$3gqDB>n0pFPVĴ1N7w 9fFH1J0:#Tör!{? f LUhZq+1y,o<)mJ@48= ~dh-"[ϲOBџAPR!6HW2k*Z^2^*¿^ j:V%>=!WFZmH51/e9;ob)'[|DzXnEye16]+v8/=Goӳh9;UEAU00OwAĐYEoJO%.TBʽ0]U7dBZRqIx(QQ͖6EzyJJ-EX[&p6+"(q_\MX*t3"ȡT3:sujv! چ(VR]@ە>OGGs ^r|$B\ў>Ԫם@ZfѥqoNC1յȂT(E rqF~c҂{P-!)4 ~Рݗě֕gЖsXժ/r=@3%:9ּ_UxzRZ3wj>n~.`!}/J@JfʧC2x?QȧPdJHIGERAŕE:$0W6=il)(Xiv^eҍлnis>~= ڤ<{7Ɲ ߛE=Ԟ%cI*n?SGTZ?Zfy՝&bNR 3#X d( wfƎѷէ2'HJ^>%aAkXa6-JД3N `  eǾKڢjj3n`!/\VT:23^yYsZFұI./W@ٻoE&.HR^ da6.#:7c7r[*R@̑> ;tl1hZ$!]q+ Iڛ4+_e2 5I{+Q斶L5] ͣÁNоhwLjִ_EAx1S!l$Rj+n&\$)ېxx*M#;2‰NC6땥 1j+SS[o:5 35Lr !FU%NI˼s~qNgCDh:PN\܍4tE)?/*߀gGl:0LnR?RVzTd}a1gjeƵ]EDCqh[K[M'&*r o^ns0Hg) E5K@`J)ꔺYEVKDh $ 88:ʯ/8XVTAp;ܑ@(E$(›+hEqʘIzq4 _PZXwe%#R hW <6ҁ*;Ni} 1Yz-t3HX-9&4n(FjB3ܓ8+==<*[?E}WUIxF>fJէނe#f5:=M }‚ǃ ܞD:KՆθ5^1DܝYdOcrL^?IcY螈1l"ښ?|}ܟ,|c*3 n2BR$M-EBendstream endobj 307 0 obj 6032 endobj 311 0 obj <> stream x=ْGD̛ :x;]060 y^<Ȗ-%f~~9Yɵ1Jy+3O}˯$G?}쯞~$?˫r/Upy '_>7bRFx_N8ᅻFL"Dc޿Q~27֊([#a+ڛxEt4B +vyXg?imMO1zi=ZGk}M oߤ8{t77rx1NޖoW }EyZ!{}hW|3>4p}ZSp'Wvk?WD ۖʆJ uWӧK^_F(vu7utگ yu%, " mC_.Il\PalLv ִrG*D0-܌P߭xl=h8Z[/Vxu+%`J a/GZ\KZez aG1Ɋqg572©bR`Ajplƅw_FR~%$8=&@~823;p9{76#|cFZW샜>cd #'Ԁ\Tq`Ipa*."bjށV-P1=OO{۴Z-|$ڕȜvP.r:>HLNϧ%hԙB'mix.AO6> <_):iC%J8!ƛW8@ʸC➄ nrF: %&m&"=6 GAMBfE#<_QĞPaa%.OJ/F'bK剜q]na pqZ=zc.P*(%G}+z>o".QW]x!8NmqʧLsL_DA 2AX] Q- -ߍ?48 əU%l5 g.>;)_owfhT\t .g+ A7yp݃]GC󭃓/Wfs:f@EXsFgl2a.4v,Mbʙ? k# 6p]iLlІ;@aMH%o"{BJMjĚׇ }hx4K2 6?umdƀMQ&9ȃG|y٘:`OhdlӤa7qCpF6);g(vt/kF[2TMJ$e`\#:EDB&2NQgՐ"h}j5w?Ն\+8M{+L\[|3t Lʢu߿֔,ʸ~Z dcHjw?=؂*IRuÜit0]n%)fLP6gGtxX<.Ekh{hyO*7i"<\=!'1KL0 _JVJhXFDX3?| 4ε[0,@?mFO+̓F rDX]dqRut^6S;G1=՝nNtfUʤ! >I¤a6NbprC5H8{Ya~T}%\sd&u Bq Ι5%c@8$E4J;W_AX }0   ɷ#oU,(@R%`o?:uV_߶ x}Sx9ZqrR#,A/”p9EYTk;I\4IP]j*R{HzBʁv^s88Yf6|l|.iY |cAtU7Gr^V|N5eߤ`K3BnH~r7Iy _( V -p\!qȿcZW:tt$FĞ^:/a} sz_F" n'V `x#j G| c3N:΋jT} S68=b4ΪyNSB3= %r0D(*SF8<[`ۓ zy1P s+~GP&D?-?aJv #%M! J4`fےW4O#N va X dv]I pV +qڟu(M$0pz"\_rS#z6QДFޑ9uWiJޙΗ@f=^f;#Csj7M@ZDّ̜3O)F-g^fX`F\';sd _v#OÜVƁ^^&>3d" @ܳl Y[By,נFyi*Do;!urj{$QK.B*7txGB256[K5A 0^{u0u 4/ vue9wtXZTS')bݟ/PE;0u 'I ]G(b`-v$kd uh`wұJ, v^R,Y[j4iUBLbʕ[H ?oq~:?SpFPhMVj>1 d U*Nd+ʑeU1*9Aʀ+I[PR|<V;r@p* 9Wy89V{D⹫$4C2sY1g<)\ ]zPҼch''*8iqR9w;PL*F8i"fKc '3fiͿW)Ɇé*Kkyf9afъټ.<p /S@%Dr˴."?znY܊'k婊1BLT[N U>@;cuWcLU& Y;*q]`()[Pp_$C=(j1n Xғ?/WRcO.a3:d.̸?l?Xʎ?5IaY sb\@Y(yuJɽ6&qNII1FJIRҠ0p1̀vPPlY*,C|o ;ph^fqge'訤r4"`B3G=N;Ӕ٠11J;4f0@1'8Ud|M>¨Plvorec^=VļiooK~d3y?>paQܬ^ۇnAϘLռVu_Fiã~`T3U"2Cp^3}amW:K_CfKLRٶ`0)_װ/{[ +򇛓hbP+}*Vfά6(}P $\Dr H&p6F2ä\eai#Pf9>gG軤C)gUXe¹U=(O:xnYH(A:|47$CiVSVYȻ*%*-NL[ь F1Թ#uN)x8N,e,[M$7^TL6WgVɾ]/*Z^J8|:^GTyg-O`.gUٻN*A(Y\rR4M G.>N+lH䢸HmLa]T*DžX?sfK"jrb\\ yt9f6|ֹ^/ Ь# =v}l)FN7MZ2&i}bxhx`&Xv|Z}:/:9w/ &s{z3&k G,G >( ni7|&bȑĠ07e(4SԱ,zPL ]gSLmvּ\ 68굪Sy%SgWhuW,qSFy9.z@1zMSУfuM ^7D;Hb0 ,5X9\:_9XQy7hy[J2LZBXD}TyDK7)5+'"*Q;q`v2qCG eԨ>F ) $#gG*o|V!~iRPOlj|eUI/I4O;t'5cmZv& L/0{Yy"[_ Y:'STwiN29o^t8^LaZiR.٧LDC2L =bjF:-arXxBx=hz[_ΉxɌjeö +XERN;4=Xqf1Kdg:LSeՊ@N:Ǿ"82{$g N Io{Ub%< ZIdHgU[#P8\BKF&T ~k ]TM䷏?Yb5!64&TM nZRDۨ z C5.`WlO߈%i53Zo0f?9lRtP@i&XF6пї!nucP@1],߮E6Q4 )&>Y1Q{1ǞK6@Nx;"҄hr˰e9Hu3:U!,vAH^(w^2&-nL?H*mY̹)!Tz{C&SpUlXHC 1nЀi_{nt0I6svFy-'1XRI,sX~?8 0 U'U*rrRT0i{$F HD#&P(U2alJ]%CVP 2}%>'c'" ` kQ1h`\v߰P+8R[gFg9`;U<\gNqSJyRx (KM2S@ [DXqO´BygC ;٭oFe׃ nǎx=RАG GG_,>3N!./ù Kqpqmf^;rǭCWS`Ղ1Rql,+Vg5hzy=l+R- 32ȸrU~Ubo읆:5~ؔ$pcU*_+u"Bɡ#@*"<6@R86M(`X JHwbew^a<"ǒXw׻*A[>I"N;Ӏ\vx%ֻT]WCwfAt{(w/ۼ鲎zeuk彽.e":@}uk"]w],LicI½()rs[2=%~e~-$&3sZHqEBuWb$1l@~}uu ͆ʫ.4~̙;3_jM[%ڜ5 SBKy7}4¥!,6zπr\`-0t*KR贅{V[z*5Bme//@!|ȃ,V61m=qpuyѱ&^,"F>; WzBev3 y}U!EO=pSOQX,9A 8(]Ed(bfP3X!-A1\p1;3:d⇽.W+QHߘK-"a,=.[VǷNJFx;{=o!\Cn,Pxs N-4us 0r$?*\'zю#[D"iFY:pՑ2:9PD!a&}g?z{CMB?9^Dr]Z$n\.j+ϓ}w,.`XHM =rmh3$;ny^srfd`kQ".6gZBv'[`+|hWORb^c;§apL*9CF2sTLDB@z}Is}zy1lwe-p7n_R#uDG!kE(X퇾()J4(QXh,#B.Ɩ>fEY4 A` T T/u"t˜Q|(DD:@`pUQH VՇ&va9qt(Mҭ4v~Wu"&l2;܄H @L Jo1ۏ!z}8CA+"K\p֧ Bw;zqZ>~MX߼~tf.FՎdbF9JIc}{c w|_:^`n-<Ϙq 밫e IנL[ sDkpQ7q$v+b_<+a!6]}#MS(JD.utّJV~~gUR4bؠ*lc9_}džEʭ|PE9 ]mg@k訹|>^8vڿi0 .:Q'a IM&:@i͑]~䁔2I_&өIբ*K?/]jj'0Z‡2BrH\q~c|ÝV2 ەvm)3XhzX.Hl\a{ +CY}Ky-G&O KԣOR[y\,_nNo k꫈E1>V0^BpBz UVnf o=M4e"Q}V6/F *WX(_;]ohLyUru8W.a 3zL*!Nh^Et/Eq)Z_a״})|KU Nw#nau8x:kR< m;OQ4 }[46Vuv-6JKgsJ?aݔs 09^O:|b*M258L_₎ D^5ˎ8_fH orw^G#8n4 _5]Lٌ;_6 rG=ƆeRH!8+$!31aN + =|}ˢNj 춵!㌅Yxc\ 6YS~R/:| 1w>a2ޓ|O_Ļm9<fs!#6UsoP`BČs74T%>MwAQG'7rwD,Mn9|b\Uw$H[(;xW*as{W(ju4*AE{EPgu2wSux(Aϩ'%eQ>xjönq3ǺqX&{/ōY,')e1,}ٟ3 _m994*OgA#{2äD6HS @ݬNx ݌S1Y4ŏg{2i3|5^i̻pϴ>#|K8|s̀(*\hL̈́.޻)QnLtצ y$QӑKz;^d5ranюijҜj&Fg0X`le:D8'R_endstream endobj 312 0 obj 9189 endobj 316 0 obj <> stream x]Y$7rs[o(tdÆ]c%5C\0=;w 2ɬꮚ5Х&8? w> {}ㅌ<(؅!XeEzSb#9Hiv o.J Ja٥4aJšj.7n}aewKB[?)iY$s88Tz"z q %hcOe7?}wi81Kb qA 39j;).CK]l"R$l |[Y\-*JiΩB;ؿH .th;wvfwoo?8o"(YrĴuf=vZ~I ^Xm"D>Op^!E4Q0 vg+~ V*l50"h=b 6vԝğ{7l矟-hWCzwEJcZpxbupቀ3o%>3A^ǽLx]@yeaD9 Ead"i * GΉx\}Z ς("&Ѹ^ I x,7 bx. cJ3+p.s8pN,@Q`d *?7GHo"y |>o ͓Ap߀?Dtڛ1 ;FA {Jc"'Y"7yAq7!+'RoyN!*Kon'3uH>5^m|~" @ОRPy4بhX:i aڃ_x;H__Y<5h̺tIP,)#*M]+2R()@S&OQDP28NgGQU4VGFAID{CyC؁% }N(UqMȑI3rF_VSk Q4om4gBxS/v WPd# F7l:B$f\hY"ȲV=jiC֤aW*{SSeѦv 7CnA?H jYHS*PEUSSSHsIZ󘸑zęS?Аh;t]P$Zhxes,c;ف;^&7%XU(0tĎi"[<;3b _LԶT9PY29d>)ZIgD9J5_hu}ogufe^bz9WMh?J䥵~DqBs8$ WV&U6eQ0{>c AY;WRN|H\[ȿ;#Z"ZPrz͈~уk)ΓKia`g'Ż=r8IxZ8OBuNV*  lPL!rMy?SkDɝ_PX|NgW}4S5g#e, m?xlKʅhQ~A"f 5.SiQEWu|۝3]VWţE6VT sq 1&GΪc7igRZ)yr L1JK6nvT/érҙ 3Q1A/$o?~*HesI;`HD"X'o)h<2>\~p2)s'Pu0BBO dѮUriUjZPC/^?ŵ L50̧uCI !d]P٨imR#X&=RZb/l PStoUap'A֬J<)ؘXưų_MQ~hjp71?M )umƉ hQ:Lc2"0H|gh^͈{;ʁBS RiTo-`ɋ/ 2|fbR%ga<SY=2T?FpA NS ԡudIz&A5/-7?3Y\HAr+C 35Nz\B#qEA%' @fKخJbQ g^|?[]e6uBu N; M ހy$BV9iSrlLB2OKEJR6 "&>fDoUؓe&PkICDK/8Am`]N=5y'ժ18Ȏ)cm&qyޥɠqP3obȃM@5\i1筝G,*IӒCX_ōCl?1uřؕlT y8I5ARyTx+kj26VU q"8m ,[:}|Bu@ 9m3%x%qG4Y/n{'F=9K_{&SښgS5(QGDi}C2!Pۋ7$vbt͆(EMeVpWL<$C%im%0詬ji4ZLX'>u0iߓg>7Xsͭ5.L(7ht&Y^Gz*=sJO(8a\U[zo/sX hEV XSg<ݶ)2߼TGOd}NרK\#B"ixѢ\VnW~5OUțRו~Hvʆ̖9( Y}ʜ+ez\ ][Pqb~" QfHG'.*l }& n BKFr:n&a !k֔;_Vov|SZ ާoFlcfWRu[.좭26i,A09Y*+$[Bؘw:JӲ8-ݐ+f h& &DF~ȍepV!hEG_8.AUSl)Yb9r m2Wl*[}Ye}RL r/@kS&@w25]W#Qpΰ{ݓ@C|R-FIz!l hu@#4ҝl(PKXfF ~Ke#Q!杏yGrjq@==ӛc -)&2QҔ)FD*OZ,f: ]@2/⍲fJac\xW|CORt@4e3Ctv_gVJܫn1*ӟgQfszWIJ3/ekS_)4 BeD=Zh9\~d=u|0df-,>lX-`S4JyELԬbrX^~J iH4فt"PD9xU.mROLK !3¢Z {1ȟt!.Ra!Uc]S# F=_aA\1A|_x= giq-☶j%`gY-ʆ^WQ~w+BEe}k rfѣ8^HNIe\)[ݨ}x}H~ rU6~iN4>׼w)ٸ Z)SC+#&Ozj_Qdh ?dF!\2+)vh=P,mtk 6IKDD9Tg8T=mV!c铔+*23΋tڪ51LƵ&@ȡf/qP4 Qe j$=Ldf} ._(RwwgGtuuz!ONʧx?V,q᫴ VGi18Is,#->-Aᳮ#* 2$?tfm*_(= B{Yo LQ;kQT뎛EB%ڪ+&5L+Uh㶆c 7ZeZV8D031>/iZ)Aw:0@rY[ OCM 3t\g6`yD/ q>v$%}MwL;DtTB"P~p%BKnˆRe2KMٲ SQ:Pxew'JǭN|~UD詠lY7¹nhЎX: ¦(3]PD4=MAIڏ :Dvb߼Trfk.H@}H+o:U7 t<3]FaQ/kڢ-4+'QݝsoFV7Dծ>[>:(i郊Hq`M|<oM{YS[#OOc uX2j6bk~W,mW3i *S ]~ *%!tƝ10]1Pmi[ʴxP@F(;$!2-ls8?z~/`mgkPcZ֫Eƺt! a>]\xTGU(`X ǗÍpPŔV ?9dʐ4jnGq0%fYJaIu_6DO% >nȀtr !;} ,'p[@9,4:BI"Sr 婽r%ΞUĒmQEbhF,j=/Kd7'*\Qe6wLΟ!Z /S{#JmzSF.40@063-~F6TؐCus"'_"뱳 W!BtV &d P͖>TXP‹)E6e0A4?( `FF" !D~'w~r)E}G~ Zb+S8weiV25 L+-5yE%y>E)oCPoQ7E Ag(/^"S1W3!Pb!~Va e3BU~yLQendstream endobj 317 0 obj 7000 endobj 321 0 obj <> stream x\IwD~5LK c&&oI T/hl2χ(֮J؄yzy屙<,$}^NO@ DH''olb5aFM)&'?n:p)Kf58^M ^96WֿǕSwq.Vh?Jp'O<|\K-g2=9䋟a'a&J*`(\o< ^|cek?d++8΄Æ$iI4S FO-8L۴ E hA$0%\{mj/KK nt:"U%lMRp<0d!g}'KSqL8 S=ዊ/E5~ZQ4mv_Mg",^5i?W_qXzLj Qt 'eF a?;eRs(kZ9S(Э9g\Mqi)Q煑ʦ45TJڼA ZPҘȑcR9~G 3(D9 5+ETI@ҌpVE]WRk?]q';09UPi7wzub".6/P50y"9.,,>[/yE(ha&#&K}}z d-=x{?^"hn {d˃yr"HK]i>Xf,^UO̚6g80|-,$@`B{ mkv52 MU?uy?p|YK[;=E$V?U~x8Fd_2E$>$}H%u_nDӶfː ]P^go 9!Rp7F"*KW]Wx? 3tU"+Oܽ_HkW70$#m o20֦Mqk۸kנE%ٕlMƅqb21U)?̨b r 2'M3d~ޤ [˳QV~oĢ^ &W9z s>^c.{Yϐvn C6!. a u~inp(5UZ<P|]35a!岳@\um!{:6_ ~#]ؒ 4|oEFcoܕ-!>\ZA,e]'uާĠh6QyL q 緷Z2t{)+dl0\4BEWZ3]c*i5gI`<< `Yn]FCu`EAL/|SdQ|i4f+m*\Lv@eYK♱w ݫ(r2ؤ"j Vk=\|\eA֊}0 0>w d!xGL$0+~n8d.:4taN:UA@%mNe㕟Xwf%9 9Y jDCyCY,pDOP.D_p]ίuBȊYvuBoV.`!Cw8WWHg˻%Ol.'lwSA)WL^lbhKIy[djIҶ]C YE}vβVY46IxH]2ߝ)u(\Q|{]M.SOG}Oh 5~I9ȧv hA\z܉Z999߶-wқ$E b1m-rwLs୧!0cpej$ ߍ=MNg\mlpgRd6yuoni>d|\+vG}owg3|]/i_+h1Z7ѪV0X? IlcE3>@V7 퓶{n<𥴭}f-Ng~N-& z|58h4ԛ{,tz?=/זA~* _[iՕPӺ2󽉺#u%a)E~9Hgܞ$͵}gQAbŕxbOhIƭ*T 8YZ݃{O'zےcv|ś?ʽrw~c-g;1/E\yǵ8e?Hh8lSUZEn0e:q}YE:ZPjݝW0@ j*mPTM;z;,Ni>مĿ>N*]2D׽_b~&ĵy/T73fapPjCf>ߞ)+yendstream endobj 322 0 obj 2555 endobj 326 0 obj <> stream x\Ks #Sa~Tr{-ۻdse[DKkUm~}`7[ӣii-Ԣ$+ĊO/∯N>U|_zu()VBƝ_Ypju|~zcaVkEym\V͜Rq| ]ˎqs=?(u֟m󿏿HEx7}|1xlupWЬr:ToY/^q8_5!T:_R'IW7 eMa-Z+|-=\adp;nq@PF9LAr#}!?Gm˱pH ) .}+yNo ک)rHdH!NS5/X&m : :,lbwZq/1Wг`d 45iDB9-x %Vle^:؀&B!6iQQ#zrG *q@z` P%fR+lQ(z<#y/(&vC (y;_cv[ Vf빀mbp¨@IAIp.a|. 3 9 )?:pҊ6TX+D[]G𚶚>2#u._;GBP{|.y^L(+}vm[z!s 8AP!QAݨ,8Zc[3R2 *Olgݒ4L0elnO#>>7Z*\vy/S;ivl)Y!o1NNJMEU{%= Hމ$DJ%,~2T hQLdD4סQ'MG4u;JvmԈ]ffBfG T)҂0w=Vy`wț-}J,yk٣Pp "RȖ㻦5yϻ'E߯ *>|o±o5@5-KLHWbǷ aN-xb$k@cX rpiZA %gv+Q`8U` ޘ%yRA*\Z?t/J8R|)Hϊj= Dr1TBsdw5wjq]tzɻ_>O~MI6pP_=}8N*H\{QH"̐*X0\ee ChNgC}s ~*C/Ehqj1*u@^nFw7h@4XFy`Mk\ħӰ "h;yC0hC@O|G[2 @շ2d΍ *~;ሹzhY|uKR͸#$3nyM|AiK.F m&-窈#"i}$!20I-v 1}o?NDeӠ@/}3CX=#H^LM{&F.f}a'{Y`optRJ±ΐ9A>u2Թ%&e-s֐zrq&ٞ}Rl-#[Y3) eEX\NPgᠻm{N3MiӨPB(Hw $KWT# ,au^I&YҝO8I]Bd@\2u,7 yK;]Lͅx9^9|N}ceOl>['}]GөHw>R3\ӣ ycP^Tзtbmd01(A) JT<(XS5S~,4BpOB3nYh |.;w~qWG´xSfkeV8911t@C{ck Sv4Ϲ75G@+o"&a{_L0; : `۷MȮҌ}[8X )Tn'@֬=wg.َwZN-奀vq-t~-}H&,@XI-Sh W'qiQ }"h7Ojܣa6-F4fkX* ӫ4RޛWXLVX`rmˆ0{9WJ?xġ6J %)lhZAz 'D8ZcXe1bSM6Px˺n#IN bw37~o\E+1%LgNoQ90.]/-c3 Q[v:UFk$ZU îqRpXZƓ!ƞnm (*4SAرolDjɂȈ?bFaZl#R;c;g#fyj!^G,[LtnG=(<m#EZ0<[İI*:MVT@(/t錳t:}Q!WK2)d!خ`x1ѣo\m^c]T:D;0 bOE-]F^g?ӭKs3\aW@ [X]oh iHP{dt1#<\B/zgSaJ%^LxkhNQ4;4!}:j\R\.ڙ]-3PG4 йacV`*ò6Cǎ N?XoG8] HJ/TG*@ʟL:doGBô7 еa]}DGG;endstream endobj 327 0 obj 3136 endobj 331 0 obj <> stream x]K/9p.YoC&V+{7_nrYM6pcVM?HTO˫ߟY\;ha!W>˿2]JG+e09@{tttZx2݋uz`K`<:`p0 SLI+fqR ̺+{UJ:aeIoR:61"q`g?iAih;z4cArLxgv- 31ݰ;(M1\1vALײ s1 b8c۬àU= PQٍWQhr3fLē|V9/ieUlt.%.F59)4̓Oul4i5kӦeEk"X۹|GE8}l/]ae}t2d*,}1%Ll}ۧI /MslBr~x3aa>g YӭYW T\!Hyp;n^ePo05c ΝgoO`;9lc DSa&J ʼA^FE)6[˵+yЅzYD@]iK9eW <`1FCхiD}(bkGHy||H*QC@:Al|:0(i]EGw z(Q]/Zo}LKU%5kccȶ}Gzbr2*9zoy0=T@'=% xR!˫QrC}gN2 ƦrS?B`K (u~!jb}v^)¥ H4Z2P"li%t(ʁ [k}C -R/!;(A)C3;8c\2fڻ ZZIIIᒆI?TK4)p?N6ub`9_ ~}&9ND_48TTyvX`vM2 h9ȍcUb8* 7SkH\a@Ң DHH !TN8!14䩻w=CGJ:ߚԳ%FxHz|SLrC\$qJŬ]A Ѳ\G:Vp&N)) @c'(73:);qQPBk//@t=UFb&cIk*+V,s*; u|'Z$J`pCQAVfS_h%q5gR=0Nv1n.Idϊ8sIblxgۍX:r:J]/9i YT:MkSfK<4T8ja6Ď8A䃈|F@inSCtm^ $u 3vz@䅲%b©"Z5K 'Lq|!ZǷYh4Ubz8?C|D?P sЯE3?@ɜ]3B,@4ϙ0,^>L[KK ; D(vnꁁ8nҹyٌ@cHb%KcU|u-<)RJd~T>0QجbLפ\6 >~%~枤8F6r 9N<w)rjz(1R,UTRkb>jza]f2NyZM@iboZ2w#ٝudjg?O iL_Xߋ`z?nnB/eE{~:R7D쯝7m*n(m=.zj Fܑ7A'y\/ =KԜbd9TzH%YǓlDiG)j]sֺqU;!P􀨧ӴmWOpmtCt \?p^V~H0V2 E+fӎaF`Rx{Gj/Ḣٓ@96s1aINj3m,iwa |yf꥓ϰFr*zxWo {HF}P dȽw@4x4uB9Fs+^󟬉rk" #3{$n,!EФFѴ kjFO$i74Mb cYԤF:|VhB?:_9"kQ1> stream xXݏ7#+{C:$Zzx>@.Uۻw pU!d

4FOXL43~lŲy8GY))%7).j+EkI:=*Tkax I9v,72eYU1=֣;uWK9RN.` {jm&p-O 7"Zp\K?YBjWm홼I<[F^D f\2bлge Kx>\qAs0Bb."Usܓl )d oı.B%v`/.¡'0R:x  D:LҰ3"OJLy8nc^9 KDC>e1Z;ƨ+؏+RuM+2-wrJDB$BDdE^lWfq&ٔsQn@Պh!30԰nNJ갥~ՊjZPvR{'Uyk>5_Wc_bpFL3K)6 9j FЗ8~>R#PLN:V]z쾩nΟ9iN(HbLK,-Z_˾C4:eltIv[*YRr<oZWSj:<{ozfz嫦.&Z&ΰ BhkV2r {z[WqU]]`5GACe9FPxYNl^-NaDr Rhx(\LjY6Iarl&o H+9y& ,t ol+sT aE*oN<hF|^;0Fqp r}_$>nI-!yw{ހV5 0JSԈ12g?9endstream endobj 337 0 obj 1033 endobj 341 0 obj <> stream x\Ks+,L ޏd'N%e'N*(T(Y3> `fAh4uc:<'}폮nG?=GG_Sţ< n&cG?I;%MؽgaTjwPJ r~FY<齎9{L>x8vtG;!ڝc^HJWhAFi1i""0*;hC"+`i30olETj>m,jXEWB;ow:^;Gwi e3жT4:Oov^& vRV_N;ɰH {(8|w99#r pN%~f6 &փWV|vGI k 8|J$y8rKGA<Y}*'+ Ìavm}sP7 QVľBb6I8n $aM&a8†S d%}L]ڈ3s&)H-m)91fo[ZЫVY EK0^=lSfYm,ڀ0"0b"Yg~+3af7l9BF0=T<'a>b>eRJXq"%J\sJ+q c4/#X`ak&dwAtߦoY_ Ib,P< :G o\k6-)~ae$ހM?q$|dJT3/Xi Nᵯ_pD!B#%vS Xn([TlJF|5?h,4atb\)t Bڈ-č[65IqҬ̆JQRZ 't6+ r^Xtec-&'_Uӛ~U9I`sF7 TjYa_`LAhp#N xC:f5I,gcd3l'y$m^Lv8c} 3&ШFB7蜆 ˕qa ;:ځ1z7lqUxI,xnw(N=3jeu۰a Q>P"$/#:̤/tQ;HA@-2,VwF) + ׂG\.EJKR)Nux>Kj*\cFYPXFcERFV/&kaV686p0ؒI&ψ qB9>)Tu/E0AI7@^CgpQ2@isYL?_hix<]gnM?{ӷ(-Q=ڦjinP Q]]xŽcX* *,} nk(£%}Y[?mC~3Ƀ1aJk~!u&$8 v~Y,;VzjY@ E&wj6r;@ϩə0%4{<,a.Ulw-䝺EQB " -qZ\>v֐{Bݓ.Do\^USB)rG-P]Fu0y*U`6.3vq"ˎMY(hl qZ ȷ#İMVfDtɈzRp.li=7@9vn ƨ3)?c-ѡإLd# M>8(kۂLF8Ln8H}*(RYICUN7A7F"k .)6"sg]w"f9J)x>/K&lEp ma x|6;揿+fbb1{P^V6YfzcMAOVd:hfjMްǪA9ڷe |݁z8ّ2?lx g@BgEzjxB:zTe3uG;a+ȗe*=x`Ϟm*6Y>NJ1y3qB\peJj.|g. [m U-M+S0j?\b)/bSv ;K# هƯhJ8%K7*9}ۏ0 nCqBkHs?oG5>ekA+/6eG6MvX/q¨6 ]FX e~A58\5}L-°ۿA{(Kh$јVVfBn|bAE@£nPRTif24eMk-}._193Ƹ]ߡ!o AסOX;c#R a_qS-?ߥ,6˛,| Ę=t{˔UW5ҥ4D2 TOӡzi`>-`2z^Uӛ)CҦs[cS'SEVb@qn-tFgiq)\g? ?)x! `U"v:5@UA[ :"gnʦMrRL-u[׆ڨG y,]sK:}uM68j:H,Ҷ}́\9gl/"Anhzix ]SNҵWl̝L}71[ݲK[# WPHp ָc3ς̕OInݿv?1 M.U1Z>6E>'iaȊ> U*ox N Rwa:BQpA O0{Hd9>M޵`:nF)F/m;U6 K+XΐKkuo#[|vWsʴ?N9s'FHٞA'g趩`Q)'bssNӵÍvVB[b%1;:$ϡvmK%b6O~ƀ! 5Ҕrb ;D؅ ̈X~v YENl_, 11Ĵg&aԂp/8UmOb?99RrBv/zH䟖U&FyщQ:5|!>endstream endobj 342 0 obj 5250 endobj 346 0 obj <> stream xrJU~ռ])IQdrdS"!  (ʿ{fvgE|r ~O=<:DLO?OyU{ç _+9(lmDr1y '<`N/OTnnznSgjnkr[lwm޿1Ѽ?Z,7 Қ -'t?~: %Эp%M ,0U"x5"w߬v:bPo":<,X/˓P?{p\=z*MVzh[d@Ilr3owڼw{ZoҜϯ7Gw!oNKGϟBFZ*c}2tz(ʂ ~\}nrj$6rƮ}!ew9E~ŀZNLѤ%zճ:JwjkqZ|oAeG09W}pV;(TTzE'T9 WS_ m@yqnEz)1pr$[ۭ Gs0y^9S'8xּmэ^$mԞfq9_wFY>EbY-\bCn9:oUX=nz|?WHVO!>Cbiq(% 9(WRY3k7bRj+lu J|uj"BhfV(MJLz;8qPp+ej0Z8ZE;Kdp`Jr݀::|tmz y tE[{2Y}AHHUN-=u\\|VYzRuny|@j#0UK` X%/jʦtdT0Lu+{!PT ]_*K*Z j[k\uJ!;7aY3ܓӗ02Uh9z>ṙ=CiD,'}_g5='1>u7zySUz6㹺ב"L<3 D7T`-)-j]b }bjp>>/:VNI0㐏@c5GSWV=I 6hHjLvh4ء5(ު7RʨCeA14Qՠ dj[{Kw-bSђAӊ, `9 RJ[N+vQ$9k @)k<m@VuP,3ĴBd5$q캃`Vn-eB 1e7l*m ƱZ pH0GTPϠևZ1[Y@:[2XѲ\&+/[ }ޅtE@@( 10d0s<eb 6gzMґ;@0]CjaBtYw\ g06 ?`Fz1֬1bAGPN\BZ > ~ڪUT8$.t8 $Z;N//YURs PMFDJ>k mc#!s}V8J 182Bͫ ң&(1`M v)hn 9MBUҵܰ{˴ Xo!Cql [wYe;jL (KB)4"Kl N0>iҚZ/aRAjwTbϷ*QD!zMx8)^pviO#fYI TP$5ڍq;2 Y@pAIB>}( 'TV#c:0B:QwkG /E7x Br1ܢאGNG0Y@!#GUMNJh3 ÈCvhB jǫܟ;M;cT7lP43BׂT| :v(;kHvfH')s7sKwq@\f^P@ߟzlY_T1NNV5\q(qY,5/pb վbh@8Ԫs{t6؟ߒc7OԡvbՖL1dEw k4"8 =:iW?1H>d7\qcx2+#lF*9_ZphuMdŀɻkLX?E$ڤAX똨oH}g&@UtXZhL+wS}PɚS* "NTUNŽFce׍XK;U]3I/8e-LJ08,}lF Xڎ4".蘛pS !b.v>@pIz 8-X9Mml_;>Ł xɽiʐ2d }y;8 g(C HX° ' '͢eh ?Ih hBˠf04% a#Q)߶8qw/Xo6t1hm]c?%ʐyh'fOUWQ?m1K)rοmyqI↟8݀7U=  b4@ƩmCBCj `6;qIyv|svB\['ݰm! US$|7W$,nC)E7ɉ^{53kx~̺44D > stream x\Ys7v~k~k^Ҵ6e5JhC1 S)Ze%R()J*=`\h9*rp,_}r?:goQ?79t3zX9s+O_}Z|<8d ;=?`*?fmsbhgRq;݇{+41Pe|z*i@8!bg|s-jJ3dYb^  0@Y+Ux6ntEe`˴RXBcrz%ѲtS_t'`zfWgxutt:98{C{lvjrF{O)w𾑮bO$aP '0 -16s^>7~;8htLݻnhې? ai 1Onɘϖ YM-\\㳆g5~IzxqjNO}YpWpWyyq#Ng3f?ytlg7i0U~_N#4(3MlzyrO9g3=Z/vӣ:g^㣳{/2tggG! .?`HɃ3`{ s~vSVooábN[]V-|l<R27op/'dy1+ ܲ&$ؗ; ̊Sd}XNS@IOFկ*vJHpR J!05Z\ڌT*WdU\qµ X CP`9}e1)bf ;R{֩a,g ϋM}qeO`Yа %>K X,Wx<(qZ.Xb|O3.­JX \D#J"xC+:pjD IH (@X7h*zy;ߋ)^{Ah_Lt`/e83 Bv"wɁWB\2JO|ie75Pz&hߗǛbum`\,\J4x<7-Vs%UZ,;HĵG%ɔZ"V\4Ff2x%Wy.@ak`oAhxBڀKJվ&h }]mj0D}GhP~S WPR4@ߝqKt%.|tetq4CQ  /Q T*ul>'v/@Tg>~ r?N虃oKnG4/p[< 4A#Xyޕy#_MeȖF %66!PPP ѦO 7Ľ]m*G{&">o,4?=NJh.ri1J}6*O5f`}nGY&=rr%a0m'D+%H/-eMvcЛl t""<ou|R%5GPEB:KU Wi A Z±+[ n^Na\rr!@`KD 4|x*u Ҩx(QkD`e븄fz ZV q3{Ⱥ (ž:G7G& q[NbU<  xiJ/h"@: dOpz-9HJB&JDI+k #C^V#]$HeI1B Fz!H(-4"G*%9SONaKG J4h40!QzF/D)VӋYzuhkVA1 g<tJ̉&ScwpT߾bK1z]hbbj,\ jD4MOD2YM(A0YŖg q`Ә,)fQ&4Sr%OY<^OlT`peņI9j/,Bۼov(\c]eq5;n_6wް/z;ގ1D+0Ȳa<W;$2KطK)Osٜ=(nbTGe: *nWaՈvb]Nq@ ]< ./6d/M4NLͬ9" '!~GGQʵtqCUw/'kQE8>]m37-Wa"Cip ѡSH.u@lrU)5G^B_1aqjփMF=˘Rȱj'sVHvؚ !cIµN'VO7'h#;폼zU{9\i'qY<)ĊZ1T!)c X@FX&,X]K ZLt'˰|pY@'A3R1 oN ,i"pFM-:9ɚ te!WHmR$Z2p)k}e &N/Tt`Ȃ|A$o^)ɛ_༴ =8{u8V^5ZkJblz ִԀ*!p5w.Աno5z8Es3>R548eڥ+PzP5ԌTPQ˺j|sC0IZ^ś7&S. TaEKdጭ"PZO%2$v)ԣ-IFi'fsom].n ٌlZ1d>cg/ Vcۅ @5 # 0 N{*qD`'Lj[G '}T-g(Vr.bne)8%xBCu)dNl.;IfC<.fk̠syˡ.SYXM"H$QE切!^JKM*PnbUmQ ,!*FSqg%>Nn~<!yKuLY|h ^(ٶdX +vdOh DH*2-WF%r#[WpVx2 Xu`΃BDl %#5N (3g80+r%/ߦW?؛QңqkCxN~W7%[##; BtʹWx&[J"%5(,3JΥ,eځ % = B>LRg's0JRz-uotvk!NPTX/*h9 0B-u8!#|//%[#l_hMgx#-ϓ|1tP);i+;=b%mYZ-ՆTvBqI6M ~k8:$&<ؾTVK0A Kb(:/HObIGO_6 eޡ^m; c>c(3NHežlK΀g>k[+Gebјjp zD> qJrpN64E6fXF-/anZI} "}('<>pêW6^p|Q]r $wQߖގEFˬtgw,;KZI)qG1e|x=obXBzЪ$jKN0Wn)*#_[ǁ@f HS&4ҟxdFe89\jaeQtHq!Տ*;qRqCáu*x?ud7*q6fU&ƾ 4TlڥwLqڈw.pl&@$$ @Ǘ#F6[QP͝1fR ^- U|Kǝo}:2$ybr"Tz3K La3X-ŠS Y: ^4iBK]reDIF,e͢u7UKbmZt& o(eJí}TKՆQ`3kM`r9)eW|rD~.AIN[wòY>GI֯ 2w!Q9Qg}?af_hNYZŻZ`(Cr$r*skb<cG`:ݠoZf\b]{Gc|Pw>{/۴$앪%Nױ'#?qZMDRLFgpPB]G$~fڋ.qzb>vs"ܘ- mm?y|^ƑU:,|={K9dendstream endobj 354 0 obj 5406 endobj 358 0 obj <> stream x[[o~W#RcX/) +VDHDAqtZ]IwJ؀Ep.pZM?>ڮ|-~J?V/`+{#Zm7s3Vʞ[:~d/<͚JJ|f-6z*i] jD1{||c);+,3k&]"29%dn:xF}3Qu)jIQ <8d.vRvMOVG05ؘ S*ɳ%z-vO%>z TwQ hقIm1>9Gu\]4e#ޏϘK$H=Lˉq9r\xܰD$51v\ zaװm&y03ZnAs="M<g<,HĩEuS)qnPtsK=™D>`3@`/!ĹBň9/Hs.SȏbBL:Mӎ=Z-Ǚ7o֨O^O7\?YoÂʛRڧ%4=):u5T-uE%*_g H$;^9(1cNkB 9v-_ȣOXHZk"_@a&# \FA̝vO|μ +pOjïA,j$?h}2U3"쨻Jd(ؚHdmjBHj`0 `a(o1ςa8}p4S{ HkXʡp[{eE hDH+!F x bm)@r,"^_NpvF`$6A#sEi5"*Vf =[$?'75'h۵74@LAځӴKlYVƧh t^1`"bC s :♳! a C4iȹu@}[0ֈ:F=a.9S`JR* a?ӱVr<ҠGP&0[aeޮ5؈A[Ԉq7]| +oA#ߢ1̍&Q3Bei8M \%(ؠt"J s VK* 6" <@aE %/yE2?D(hgI9zKdv3/Gxe|wRE S˘e#gZ2RV.Zn:DP(`;W c+@<srp\>,đLG<[]od \.)M%i(?!D.]!8-wǧPeXiMBvs{9rs gŅGC"zvrlOa@7GDZmbn`Qaݽ/v?W! ˋO{@&v}hvA_ٽݝ/v_v=>^&8?D?p^@h+!tN>=XF+LC/;,\@04B p)84(<#>ABCՄ,@2$ C1A[L(.kb&-h* Vfa!y,]6rwr, 1)-`D;`=!4)ɡњkʨ6 uX仉ix;̓E)}7I˞fnFm1Ѵ7lOS(g Be禧݈!_nix?jqx%˼s, ʔb6 4% "olE}y ހP 8>X0V ^~ag5{< nؐΊk^ⵍLZ5 y e/vtj"-/TY; irBNunq9CxMAhbu܃CqO(y1i\4YhSw,xc*E  ֨Rn,=l:g' -SO2a)jvmceie'Ěw%{͢~"|Plҳ_D A(aI|+oX. ɴ/ɠXBf3*)} Q$>aSl/e i -\ sǂ:"ݘJvjjQ`?4՟ya,5HNw/sFzbżkDN4=v54  Z2Oa%PI@y056(r<`/!F#.g}vqy@M3`aeJHpM[ 3e֗nߨMYk!hD܊23 M"^R.[tEG#R=$xkaHDɞs;dNgA65*,r)Gʺy蚡 D\0i;bya);4W-= y->uYC`Y;H3Z(u*ᣑW,{ r3"<g?pvDb-k k{8Л7D(({D!M%2~f!7IFf_*zĀ:ve[C0Kj24_EDdkI]0bF?DsHꗝ(mGmڧ46Tׅiu}obw{7"4jS]q;XFǯkq9zAZ>-Z[ Be^1,bR= 'ddA 3tfI!2/2HYYWcmI`YD{27NxM ʷG'N3?tm­]} ^3 D3}l}VU(aqSDV9Z3*U0IbkOJ. E*ph5.kސC07{,0k`߂㯅K[Ĵrp7嫭~Hendstream endobj 359 0 obj 3890 endobj 363 0 obj <> stream x]IsGr#῀Ӄ}Hj1mJGX>PI'+k׏,ԫ%3˵=f?fgo=~q}Ď_z={{ :H$gϏ/3X gowwMJ(n xivs'mwqbp{w0J{E:g:;Tҝ?6[ᤑw$X!]wuvx=sVsX07>fcW{Ř= /K[Xi'OZXrr*?Zf8]f\.£fv^%wr')q_&)w힟'  Z8=1SYA x/j2la;jx;QRxJ3;wåܽ$9??;;,g*w4`[l炉8TGZ+IK=])@VK9)}Z$>oY}>s˫ ;m&$7X^MxWi8Xʄ-lA{ޟQ>)+xg $NI {#Ƽ2\ Aq'20o:47`GV.-O'/dyx:;} Xcؼqرbz-S://#a8H11dJ(3P'P"ݯù=K_]\>f ipxza"/zdOk'lh qʞSq<.ϻLߔH5R$)2d=7(di&0hZL% {ѳKCEy\~ ;8"2Hso.;o,qVGE @rB:oqdaKtx_vಋY9OcK &iYYؖ8"1=K?<,| R`szLGF^Ax^G"`[5~țe>d,H Wj˭>B"GȲ*|#m1`ٟ3y~[Q R=.2Q9wgYp{73W좐:H,(^y58.<-h@O~0#T5d2J\z"=6 ]n( [<f^xKčhIt~u[/8= ݓc\v?/lcU= O/-¼]A\@:>?$)>ɏ ,=jMͪs^*pn J'NkQ^;}_QȢMGe9ѐH!F\UXyVTC E{|to TN9Ơ{z_~[7 6C#[3Dg4>N޻3|ȌZCwb6G&[$ގ qݫ~H419I)?T Qmc) \qCR!'kf&pAꗀ>6J J 'dFxÜWI?T8+XR**[~D)PJ.o֕cC"-W#xG˯ l_n 2B}<:JV7t] z*$%9L4]pٗZNF/Z3:ÈZ3 w=5vGyD/QDLO:k%]$7:KDTW_ǓԦ:IppwE%L*C{uZQgbZ`DHjKػG `0HzL¹IZ[SAۂ4@vSwd6+f c'J{Vpg)k7KUwi*|&pvzx5F=BZ"2;(o4v_5L\167gpCJٟ$6JqN6E62EOo 6^i :|2 o$Gu ~o '; G3PDD3~ȽhnEL yM [ƹC]*StCQc}9qb=L{f_fyzBՊx]0OMTN^A1+rBLm9̈́ (SRΞأot`c-GMit7700䵉0oX +PW2bj:pi4'x;HiO O;nhh)LGTVza-UpT= 'h0CSyL7T5xU@ 畖$ ;:n` b2tGE[=jG0e[f(g>1Syrtlt:T pOxrOtuHfK~$~Inq4Xڑ,-Ob;/Dw@y@ b)G_/v ~GCO16| =f@Lߖ̀M/˽uʭCa=p\Dm}#lT|5"Mn]sҼe1>'m.Aq0?eԶST*Pz^Ia HP ?gme]ޏ[Ќ@v3[K ˘&ɏì?έe fs<4ڵ9l;-P9&JJHMSUu8{I"dG-ee&k$ b ~.],i3*Ma; [å@bau(XrAfs1U(BiK7}'CgNyys&XV݊6Ƽ %`XѭE\Yo)LU/O8pD pz\$Dr~2Gy6Ϋ4鄴m&k{+xƠbѕyه9 Ώ՞hF S3>Z&3Rjve$ Z`W߅[)Ķ}ڬOuw"z}qYѱƕYF<=tA󕷪Xxqi*žbKEL we뱢/ٹQr)pQeoWG[ܓ94I\CiD|)~f'YBc3 7ͧ*PaţqFl({I1̪wS1:Ae!,tN7q\҆=xI\m⟄㾋 W);h<~[Ѩ>z77+qD k3rP0!:~C0h'i%]g\[W9viŦJ~ NdЩm^UF~9t6EwvRV>NS7eхG%T+UQB5Y/hyS SA!\Uf*EJb"#endstream endobj 364 0 obj 6711 endobj 368 0 obj <> stream x[Yo~G,d 5QGR Lȃ$1ecz{m0͞ǿ-Yϗ M?wBL/?/y{× +<_(loİr؅-xL?ΗOTn逆nvy3=z ˽rwjK `Ggm!xyqj]w藣77*z~0.?.?Ao~>5Gq (8{uqzszpvzwO~O{ȗԻ/_ow쯾_k* wF4:*ȥܬ=r>\ 3bȆ;'痟$JM7ϳ9//va&៶?^)Tҏ qˇ\zjuaM/Z*e>4w-Kݻ&*}emsw`)1l6s`葆i}WؼKFt*nJ,&.2T*,3%q;&tLvo Ōp{нP9%oO<+t-VPkJ;gG0)@q:޽ 4| ltݗhyfx*_?p>/$]i;ψbgx" =9Q<UyW6%.>cb0 IJgly<&RhD) LZ`.?+ aH$ڠBTGu$<I׎Id%7VL8O-WLZ l=TԊ*hR`Hd4{%f YPz (0턩)̛Na`Ck1J9 Sz8s-_V>ю{T ]]-=a2Ȥ5`ԶG|1&*P]Zpbze,1[[ȁt'eАʹP6Nφx!NC@TR"^wQ!-Hp 5*R%}#Sj3S bRiQc'Q);1@R˸ B^{*n4ҩ\>#{H&:+B /x71<ӄ =(bmbx P$* 3PVkKPVFjzy XMdnI bK\t>Bi(- %IEgw+x Q͔(hdv=SW'H@ Ƅ~Bi⛊/Mg@UMdz mr ' Ihf[l۠p^n⅊)z5a\1lF}˯C3ת 4h؏]zp?#; 7o$Pdm2Pe}Yk$O^(-THlą[f88 ']e?F)_;^=4Y89&)$b&~}ܠI$ǟ)]!H<$E<>5KcPv#!_q﹂xHt͙ǫ7 _ wYkSBp˼VX'|+PJ7ݱs2kRĕp"yz/%6wѲD݀,D>OvsE$_+=ݪ{)jf@)9'1p$APJUW ' ;7 XQC>YނXfjr /̈-v+tP}:p=g2Nlڕ}6Q/7+|ECxVɅ>HekdW *8YC*^Qh*_7rG5/_M ASZaĆ7Zi~6aXP@-FZG'aR`|;&1՞oqŸ]5pП*%y@(BReo:׻+(YlދA'u:'W=y4E,Cmn2ɽ74ՃF-ov/PAnbc}74l2ٙ|!'ߙq/0[-ñ\#@endstream endobj 369 0 obj 3387 endobj 373 0 obj <> stream xZ[o~ /ڜ-HHah#AR|Adٖd7$wwCVP9773ܷ;1˝W'=='oOdwj6SbvNٳ|R;lݝ:it/f4azCkaTZFJ5L?K5rY^z?LtQVMY^X~C?{ή:3$ ;ef$LvΞlETj =DTvDMMFzn䬞9;j_DZ:#~r"؈^MwIe3Ys#vI JTΓttq #(Ⴉ&{8LS߽DP{;ӏYbnPahEtY|$C,*ܜnzN\6*,-#%(cۙ-**f)_k!3o - bM`nO.mPM/h vLlwJ1E$VΆ, $}vRDF!H2A6@O-!])GbTzᎸd +`qWr2 Cfm=..Y?!CY{Z[ 9-cz{ +d1htň\I(m,H/9 "  Hb Ֆtά"ʏ^fAUYGӲvzް$.YJ[ SVE |fl'#yCR*&#YvJ%- & GT\CN$p)`d%Mr{ʘhXa4ĝz꧌ .z憺(f>.vطY[c2yz5 LYYF'Hrvs*):P&K9Ȋ9 +Rˠ{#cҳIT^OGSM@k- r#Z c[p>U 7hˏ۸ݶ|.u$}yUNH EZ;esv32"j&ED0}L@&_7F]:`x =CX?d\Gi~hs :sӨ_2o*eT%(EV&Z1][$fЖ<>ƽDbÆ>_?fzܧL_-5>/9dQ9 -ñ֋DJaw\ƃ03hi=h#nD7RGDZi4fP 0Ҽ޼QƸVIpud {r"n3wtl[~}tB7p-R+V7KBjuxOz4C)q7 o|U2i|dr A.\>9zo2vx,Pyi5_o`sYt A.y7  Z鯉V1p9^o|MYZ1%]mk&a8A8(t\K᫖0wQUviG8c@D Їy$6e *Q57Os$y@-y㽹d߈pi֑Uks|iGV$$z6[5sOق=}? @D2@mVɜoBJKO?lXv_ԝ+j ͆_'XO\u>pX`iKǘP!8elxoV]AAoAGhM=UFkUѠB#K{EÙugFʪC\Y8q>@ A-AFRyAGo=uӓH:S8#xT%3hKq~PZt!V;Uwgk nˣlhbkhg}šو|4 9`7cjѯݱǥ==Ts%_\j 4&pMHhMz[ïً֤|;+ڿ1 Χh|jICǞOnWs#}1md>X֤WQyɤV#۳W RvձwiV"XԕsaJ(#=,ӋUǤ1|SU P>4߃$̦h+\Qev| cl_tB)>ȠeŻt#pa=*795Ai:}Jm逿oV"n[~ͬQ61UMi߲,[,>zkKC襱eSއ}QuА,+dS7o7pӶ) `C؇WGcF>;20(`L8:6#ܱ;œz5 )֛#ߍ3yM:B448Jפ =t _)&skC/]jR=J;&_ڇeGJ`hqc0 4=Z~a,9EPo?-mxendstream endobj 374 0 obj 3252 endobj 378 0 obj <> stream xZY7~_E_i| (2IE{eYvaCv!SSU_錸?ӽ[zvrGf'{oq::_43[Ŕ-_텝tF =|<{9Rw/*úU^S=/H%tcdyyN?XIChwg X~oax 4޳< 6[6;/e=;vK- \ڭ9_A"xy Bp858 :]ʁ_FX^Ѡ(K,DJL)HZuw*V1lIY})>M-+F$(VȻ 'Q [̌/c`mg(GSfXHeNuСpd{˯%+{;n\aNxڜn#: p \18д,Ԗ/!s"pJm ?[ F7?yfpa LTrNIԜi *3=W鍱-]&]M,p]PlHtB! cDuMAZڗV J3A(oi)O}weЂ=8l@dnx2׵HwcYV 3 w9`ٿ F`3¹|̿ǭ!oK{_‘GԩӫxwIsOkCjJZH {d\4!w!7U&< #(#GԢZY@6@J+Ihωhp`a=$Z΂>;va=-*j+|Dy֥#h)0fqЅ1TI@L|߈8Q\Ę$R&A I#}Hx!#hqC̹|5* -M`9Λ>»\g*D3@"v&~'Nþp-E@eu﬽Ptz7hr(F(?/Ao2$mb^@UWτP7_0n BKlR4uy7a<:iĆSX- 2 Wi N}mRוJQ;-'qSK]E:1ꀝnw,Nнbny?>$Kh/5LY:,eUqz4Oϫ5!-D~PZ{ȭ{B{I"xw?8.ci'At\rsYYʏ5mH.tc9ɠkU !j]t`)Z3^^> P8 dXnfNL7,xj_>Fͧ24wi?LKe.3Q^G >/f_3MH{m}mЙ?hH)4  fSܨz…8HRiE}EgN*y[8Wݦ]`YFTh! w \}Κݮ0UL}m%XbjVTZ\*?V?~E] j]\P)/( WTkCϦxOfd9jǍUgsBt_g^dE%&F+/̯2/:>3\aa;t@! ZC')\lEIm LL b^_1 thӵq= >L!hXZ&na`2TX#tisMQI bgWGqd&)7`j1@4e"Bhnkbh2׽V*5~̶#˘blIyP%zCv aw҂Ldr"ũ^Xl)h_(hU!q5 `ɗXTs= D[0sapjՐ*y\Ds {FC'ǵE@!gjVhK3|iZ jǩ֠Tve DoA)^'@t k+]jcds?EP690rni ƦeyIZE?NeyLMj3xZB%j;> stream xXKo0 W2zX۰b0 X[;EҴi?XvlC/H~| )#a)k/dd=x,_5 QB4Պ+IҥWH2xBCe ڻO'h(~fD22Ph0{6*o= @ T%ܿ`uB!sg&cͰ4dqIP3ofQaN/ף)5*1z b'b. ,Rr&JK1 U{'E/d@NzX 8Ј*!K"rt 6"տJP*4h10'!. џ&`#bqbv[3 AbY+IӃbl5srz篔th94CakF]Dx,C3Rsi-Tܸ^Zl'ZaQLL0mlʵڻF0jScmRhU/F6VvOc_goE.l_Niؖ?WBc^I9ؙtH;@Gqcw_TNwz =lj=mV48G[8ݏ_]k` i@ԫllϛ"A)OVMЂcB* MD“H!b}]-3f>:endstream endobj 384 0 obj 684 endobj 388 0 obj <> stream xU1 @ =uL.wI&N;PAɗfbL4|j8v{ ah E_)qEtZQ.FCrLCfGy6c$UOCǿqBז7C%!endstream endobj 389 0 obj 134 endobj 393 0 obj <> stream x]Y%5v/7tkMk_03AL0e4n-tY&Pٺ_JGgӑt y?}^]ódP| :XSpU~S[b=uG*M Z?ޢorԅFwP_NEcC*cKh R&tu?cJRKT^r6<~(2j8MDRB F胲KVgAD|[bx#RwQEeu46NQ+z4-dnOi;.ك $67,"3[ $jl",oe ЉߥbLеU|R_tI"4;hӣ^dt(6n4Ty}Ҹw;7%N(j)ʃrSk%M3N+ZL>HB9biSV!g7jök-9,@Y,"x&(FX{;N@-bmJ|kCE8QӼ![&Fג/2dYU!]ϘH0Iө̙:ÏoV=6 >Lz%J ]fLIz'EڰK,={:$,qf+I(@w:@}Va9 [Vͻ ©l4?"_ϯԍ$ŅeNSx*f//kK ļ9~mU"i/Ek՝MD+;S. %Bw?ss۫aLaz WƕAM0g( @5JS!ZP2O0y wܚZ3&XM+e>CH[鴥c˨7,6fp`L0U|jrM/jȅR26(xO ^l`ns-`V/>[ .'$$4$ a}ѵI C8cD" 2KmԂ zSa\ jO&Iřwv:(g9.a9bR+;D/W@~#6ޡlpjb 8F^KX'=}JQc?w;ÁKy: m{T7ȍċ3ENm%KVx55Sᓏuh9w gIA34~;YAx}`w, a$ ӢIAbrǵ1fke/fr.]MƩ2Zr#ߒj܎;aZiDR.e煸bLJkJ_hi qq{f]5O:I?5XdC=AY@4n˝jzwjpt8`|p>?^ī^ﮤ wPyWҐ[7W~'j0h㯯or!ѓԕCڗA] r}p6:nKO<7-1Xϯ{`6Z +=WԩZ"'ޤZ C[o$C o[b-(D8pE[ G^rT-(iߓjI/C6\Do%iՕ6@CjPD;Se̢|2xOtG"1KIGsT PPUgB=Cm[Y BY0A)ACsVqYfZX=G5Z( >`z}3ս>$>`G}h76G UPz*wB=C9R*JAp:}W+a7C򍮊-6ZdNqJx]P,' UK8ʣGCڲ!Sq!Q6h>X"MMP,@eK?->I5]cZl˜*sȨz}g#q2:[7ޙc#KKꩂmC曝B3 [645 JMy XY~!}/#}DM{ txg=@çLAQ0xP>ZbOaEZyj^{c LTRWHÕͧ'hi/8KGIG'%]6g>Agٶh3L1:ђAc+ET b)sڊϲflw 1%JNO4"ܘKoZy2&;rY$ ^jlsi;RRyucl` 698*ұed9 {\- b~ORPUgB=GUWTCPPM岴N*^$ݾ|AHI!2; LXBU (7JzQd xopX.i)P߅v.B;;P PUhgB;G6JVANs[%-+I֒Z 3\s9:.jI\J [E"{"UoQdPz2cEpC49|1U(oi34Pޡt eƊ2 Q(@r*?e(03˘~2 wJŨ۴ 9|ct50_i2Ne$Cq\ɁBJ=K~EU9RPUgB}*3TC# oSj~(C%fȔ층GJ2 %]{fufetNEj8*QX Cc5|PRSgB}*3TCWT* UIcr ~ԃGFn?b~*n?b~D/|7`ts G!<Rr;QR(gBy*3TCPޡ U(Pg~C >49:1MOE 6PvN(K)Qt,bJ#̴攠JL[8JJlɗj) L^SezR7U٫ aȭ>ٰtgd&޾.ɷgS=7{ŷm`7#,"/˷IK8}ֿ]hEi[F7C3Xkg5. vΒ/1#_ \Iba)I;FrcYE ~y7/ΩGuFE}|Ɲ sSH9ʲިIʘm 7Nom{\\s;9>SB oLU(Z`k>c!zM&͍d?YYf;yMs\ݙeDqoڊNo> v˵kUwȩYD˵z[%/2@^9Qn7GܚI!_7dIwo]َTVj?K`{@Ӳdn[nll&TmOqO4(Zje1DS%lH~$zf3hoqo>ұ6Ι~cL~heLG7/l_d]|x }7Ex`{Rd]!DITa詭؍s b<U( "mf~#Ufk(y{Y/.7Iq mc8i*^!*}DoyfƜ80_ɚ<3[=r+OcǣU.{zUdDj&'-ƈ؏ P :h }}Ɏȏ12&n7Wb 0O_P&nq,XH;!ctTH94?s\G~ߏ]˖|c3r?_c&jyaˆYh6Y6]!4ow9Go'իe?Puo\n㎵~Aj[f-s v.F6{7;un#6}J.GYj >>mOg|;ElB-)Ql Ckciy@vL2{l|)>5?lHWξ%Ef2ʗ ×8g ߗD=U-d!ng{x <)}Lݵɝ~?{Kgendstream endobj 394 0 obj 7315 endobj 402 0 obj <> stream x]Is?7nQ`_t42P$j6п2@jӡSI$@,_,@u&c_=7glg<.yz4r'oQgKsfVW^}{MJsۋK$_3ᳶ9q,5,YV JJ =3؉sk2 }Nj0+w~jLJZWǑd"ϱTXfb>C.)?G%__o8t 'i7 Iݚ899U=$1Fi|!q,;&{&_*^4ϖjz$䤕Zˆ:uz5 .GГ/|vq8rz^XLMژRgdK/5/_/|4ZX'!p &* Z [p)<̜%".q~%2R (Ο5(aP('/HwkPvTO؃ 5o{8*wI淏*֍ߝŐٔPUJo >Ejk8wR',sT4Dd=Y1̺S@Wx؜ >4iRΓN;?/V]johڜRf_JFRK$`$^~e~bH();>eш߅Ijf>7D *|%~%v ŭ8{}@6.8h;Z QҋӇqOC,@o.)i`^!97Γ.H_%ӅL`5d}~? v*@c.iR0"\* ]P&{kzpvoϿ ,.:fX2~RGD_ݻ CiIo>`l+$r~]Xv&V{&(Wu5R%fVJA AhfQb(t"Ꮡ>`5fyǛE)ϲHt8տ쫡ݧEf=$X% Y?UT޿"G^E1/㻡w Z%Wn,YzsRB^UGr#dmHȔq~ql ⨅okjBo#4&8WP|I N)Keۀ@"ɛ‹Ks?j]ύYYC $A Y<* q*  4&@!0vH20"Nh}hmc7–,6`D&ɬZ#(}'jwd-K&HUږk"~%p+t*xYZ>X^FL2룇*xl"nZ5l.\SfJûB Q[(MV,ң GmwQأA5'|M)(8;Ⱑ1?Y5ڏTBC~ Z,Z)0%'(M 'VH"؄'\xLNK]vl">5[5֝bNӦV}-s]˕4%>yVK&XYO)UˣfnQ'DOH#]!r({ݰB㭉o *?w?30 Ns^\޼:{ԭTtlT&{0q,U 跕'ap{}뼷4B-ɝ@H$ $&guI"+4$,(: i8-vN'[j4*53sУ3ѣdD_+vQ$qY D RDD_5蛡vѸ\s{k&uSk5{|}T,<\'JCq.o75]孠4Uf[tꙺ +ߦ7ry&0+0U3`s/I.{4>3~$Ppip͌3[ćN nv ]?E֌A >BX\NjV˙mE#1|e",i\c93*3.ԽdU#Lj#q5C u;$0^Լ 6uj|ur=l"0(r UA$5.V3WbR!{m$@1pӲxթ*\FA`~f+VrKR( !ikM74#v[q=-7ç45@iu7]%#I\jfV֊S5b{tl'FZt4hm&(Z4pWWhw`JC7um HV++ 6ғ;4?oԼIRl|A-օh{p]2vSc'E!G9ΠTyQ:_ق}dOLmٸ@k'ܮDzgq]f+u46ZKL(+bA<ڜ,2}=rIp7YvrN q],0Y9 p)%Vc,ؐmW8ѠG|j/{Dd( J#Rut[.(nbA8p ¯5 gk\Y> ʍ2xd6yAƟ{tliw*nOv.+֪kCdTe$:EHwWI^x19k V7R-[tr9ULQ";ӈLq!8%RH_g$.@:uj2ibI|*c#4͞Ep.} Q Lgqi Yي02X _7[^Uk}#uh;=HiV$=coFqeٿD+d U7ufr][6*"JXҎ?!GZ 3bBF(_f(kD X~^i/3ZEOuK;CG\%E1Lj͕rN*,^gyJn<}e|jd@XZxmH&X>Fz!;70FzO7cF(іdHd v^3&#k4dx\_2.)0Ô(uB@ή|kհgJ+YN>7]2&*x[/UXb;3+^0 y}NdƷ.\64xBaxu ^ D7[]J^Q1׮U(4Mp%(t0RTF8+[^ʣnej7yT)dGW&? krSq>`Ӕ N%sV-`o]8[M#.CoAeފ؛91 8+THlQ CRD@J+ɑ=9y̿3opp@ױ9ф•-ED.aK"=AT5^-̵XmNnTFZ`\p!Fq!gE_U?e;qaD4~ܳg9%z)*E˨s򼺊gu,G o]&7@ޫI5.Lcq`pV`MX徐-[:wp7@4)㗚  ,K]ӥ9m?aGf|Rz~6N[U /8ָ-. }]h՛Ps];99þ0d͓[sSJ%_;K#|BhҺxI!pu]9_v\~"7^<6䎆!}aakO锩[ MmuNB`6 r)V;Rs V˥Ҕgt5iNߑ'(oY%Ղ3oSR:`Tf:+ދ͗=X.m;ZP/<8':m\{s䄍J,WTi> /R.`}_TY!}1hy0=eIj: PS\CT`}"2{ /YQ' #߾tsw`4M:nqfYXUP.pʢ+r=5 ݫz;wCZmJUyOUN3>V2>@=ؖ`e,'8S2x ,l N^:CN+J:,,EJNKED?ƯΟkE#M̳K\%j`ߕi! e-O{Gt|'9uH|muE3;iB;Pwׂgnɝ9Tj 1狅C` ^jD8nœF:#|/a\tACM?yV1BrKt '98y߫I &kNKRZ[A#(Uxqс먰qaW<ߏ c' c( 0uT8 |͔?~0٨*p-4QT V;x b+ 'u3_IXHWEV+,`w\OWky 20/eiR̾d 89 2xS\1'Ccd(!NajMŘ BZkJ5젹/BS=H33t\9ѕ<+-5Z7Ѳ%~10!w+ B&.%3糿{&endstream endobj 403 0 obj 6586 endobj 407 0 obj <> stream x=ɒqmuz4k_ "[! 0 f`Z7LЯ3+Wgcw/ogqwʉ[|ul)B211+wTimmsb"<72? 3iGgfR|aGl锶Mo` r 5yhI*inA29yʪ70*}.,{U:С_(ơS? `OhC`_ѥRIރ;fnՀհ=׺'I:wL'l*#we)c!Unj;'M:gƃ<籋Wo/ëy~G==֠&mCWԖ֠IjW-8#y&O`G0=zOWGzq]NtZc#ӆYc8 6i*{DJ7C/U0)}"ڙbEj }Z!p<'jq|Liy; wқC#QtВ&Y>vBk WqB Gzq7C"H%Cf5$&NzX^BIjdDyUțaq8W0:09z.& g%4 hfeif}m$ZY#P5}W$] Ω5 + O+Lā`湍Sq5]˳1EW,2bG0#2ŷ3ȋb-Ys@\,7e E0r@Cq0HO{LXSHbY*nbFXYe2/n*y?NP>{#1B2@1)Pbp,AOV4[B=8 0  (>PhnL݇i<i vI \Vb̶ Ly mnb>-G8(FKO")m[Č. UVjfx`($5,aEͯЛbv<=nʹ]56yyaN2b'Anra_YFl&ˑ&Ř!&k70⟠$D6#调At`ͨ*`Ұ#FzY>Bp[05)6\bd#!]X(ӟG˪/Aq XloKui^BiﻪsRIt#]qm&lm 2xp82RuH{aDP j+ĜQ$۩5@Yy\{ReGMNl& Į'Y^_;kd% <pJ{@M5DH(o2HFo?05-,[ZZK+b grzYݨwCZO6FW>=Ɣl^9dtYH86Et>>J(|waZָ֦dٷr9K3+s Ii=% CSL W@[a g)FDpә+5^f:iU:/qY]LhJA3^.[d%c*iGK$Jx :\d8\p;9i}Bpka jsyéd\rߕ.]c)};:z` X;vj3P/F X+'eձd TYysĽfZA3m(IIEtI$`,F@FC)0+Ӂ)?M|" k'L7ZUp gkDn 0&Vd6r(#1qaY @i}f'0I%@@|vWGV (P=v ֶMOUSϘeKL <%b*€҃2T9NuŘ^8AwhkPgXiJr`\VA871e ᪃O!d)0%BvU77K dVG$C&7)#`*e}\[)v_f -NLZ9`$Dh3b8 8|4yQ?zE9s&RIEF+IHˠAxt̖BC怒ȪIZ ;c} `ou0pp0c2LN!VxPh6>ŹYgyvgVvsLWO̮ tz*G;S Q84 a-+>)|TofP1>敩J0*b[Q$B7r vAF6ah^M}z󅢴&>56(2i]]zk*iIϏdxezmA﾿v .)h4?xY\*IbZGT|QE "|MR (I)reDEMFEMMj~4:0Tr'{Qzq1FLtg4e[M. Ar aԸZrf*=`4`4Okx(:Cw53 0G8]L~!7$ޣYcw$nj|-ڊʝcE>Q^s0Jx qMYBo]NsU - CW7G2̷l|Mr;l-}-4[ibi6K&hAY3Xk2[F8 Y{Ө0:- xcN0z GsXn Q!wF JAIT-e!zN1R&)[>Ns@$エqC(1gGɃ=~Uٰ6;LJG,ǚet5>gD)Zw׊ ?)Ƒ;5IN(R%Ћhj-HNPۊ|R+FCSXfGUm}QnSoR  )/&E֮~^gb)xJ'Fx1D!]>\ m!<rK6ԉ(|CX!qF'_gp`"8t=a%Pjz% p ثR®.Z_]M҂HL^,O@eK ,W1|&w R\@MJ7/=%u㯅ITj⠃clnjf\/*ՌaXk] D 8Hay- SC]JT )rk0]*sk8vՁVԢX LӲ7&_֛)_Y9NƳ3DDjz.#h58ռ/ӪP`z4tJ]M!(Vx@v̀Cnjܘ!&W3R=345\-ýf3:qN@<&T]mdݖUu]i>k|vbEjJup!C>xI`^r2Y+E×'ߧFνF iEbj;%EhcOAsS|%1_$~F<6On XmIUǘZUV]79͜ʉ#. ECR\:s =1r30]QEGZ08z]&pwsn: /V`엘%%qOf,X"b~d(NӋ9|K[jZ1mZɡs1 '8܋8[^Qۢ '> J@&F{E~k$r[/Ta,n(fJlv*Gq*!upi%?\X©wwUAEI0醨eb>#6)ݸI+77E|lXdInFD FQPdM.W0Ǵ! @8 a B(/JHYxؗ[Rdx3_6@h1TUR^<P2=ښvKa*,@G[ Y[GMmM3PmЋj0F1~Xm̵Ͱ@:CkAD31yX}JAH ^yDpߴs^!FNΟu5{1-SJs 9m=}k[y==֌t5a?j+fϜ<<zwggX)f2f}4<cfOϾ~L1-}G蘌⵻t!$c^X'׀pNar dز8MKȡU{ASv0'FP M _κSPP[zes^az2JՓu%49b0 ';'ؙ]poOXRdmY<`J4%KhJ-BYM+eKLg^͘cз¤<5?Qz>*Y%+^Q饦6zEcb\DCy06̉i&^r}`Cb:FV0P1_smnٙ{^!ׄ5g#áb;}\âodUNq UғT9.cPD=i_$(Y6b ӍgwF5F2d'Cx2Ѝ sY.u )nAh-ˏppj*m`-p(.|o,bmW[\Z[(]G0cA~0!@AZ >`=o*)֔ CE]˫¶p~N.j%=. OI[lI2gZx ~P)\{XX ɰZdxj1Je|QVDDk<iةrS8s~NE0wǮSdva+9a~eie~{$YLE!z$`WVIc伈fگ/@D5R2>K +nT S+fsQo־M\D;{-V̑W u' p~Хb%&SŲ6uq AQ˟86cq͔֔beRd$ RG)ĹɚAX[~+N( t9t<0s 6!GXEn^W/߆l}z5ZE8v~T OJy'*ϩu} %rv,>u~ F5]uGS)tϦ}e |{0IZ.y'^FAS;xa"ؤe7a%cZ*RJV T'L~.{]wqA/ѡp~ЯI̜5'ҙy~ϋ)~AIЖ~>U6.yCGzqK&?S 6 /\g%Dd5W%Os$,2dM8%c܁2fVS*T֠BP*:[0nrj.vv^!(5oSR%GrvfjZNxm ִ_\CdʟB8~=+ uH~?P̹=_'pvxr즏`OߦO7b"4A-K.h- .qPM` <):<:)υ"uUi.JD^bS+\ #f&.!9>*dK:MnEZnHt,2 yTsggnҵ8`*5,Kt*W"C,QJ@V[;Wa*G-FXhdf\ׂo$h&]7Txd *Pݾ  ~ֆNMXŬ<*I4PRlfJ_>)uȆnW+n];;h-~endstream endobj 408 0 obj 7557 endobj 412 0 obj <> stream x]Iy ANoO,|Av-8b0c;ŒG"_m<tF?6Y,V}ԏǢǂ/_<ǗG?q6u`oҗFJsljSgWG_Ʈӳ 2|_NNMƿK ^);O5ZjTφ⟽gr~Sa@jփ|:~ǷFVҳq{Hz{TpTy(aVġ8>?O YklEfT6š31K4BY)YcVcG&iDB=Ng~_K`xM|{'^`FXxݠ%&Z@SZD>G#pFT-If?z"nz*_oM,פ@MB"K;B4E ą̇̄0@y-؟V9ƴX:(}F?lktB☩ il{mr̊QBIܥ7<DGRAM7M&jo[$ 3ާ&Bc ?6|oWB 8xg3j#-J*EMt|"J=b`EaE hgL)`QC ڃ7.0-!]kQN!A3 {Da*[cO]/ef},F)(ۋRZljEr4m;bb1HY@SԎ =Hiÿ8Xd7)fm4㠾Ƶ)yr(w #a8i@_NSFV̓G9Q}՜WcT#5wҏy6a:~b\ܜQ ;8\3*9uǷ=?/|fqh\k\aus` ŏXX6 v#҆mJ΋Nz OM E!qk{lE4nO`=`mg50a&_aLBT\6" Yiδ`=i0!K6Dռr0{0/Y:A:n&-OF(ʶw^a R5Ek׭RMuÙ~+50_ly1*U ZF;̦tWyiƩ7R\6{ucgN`&eb&Y>NlUu%G71'dJ>z*.& `w.M'S4<6L :e{vX.k޵~܃wL(|>t0)D|a\K3rK@/ރoy pv^Pmm .4 C{dxdiGq z2hp3  ^dhV+qȷœ#FfL{H,}yY*0Cre''' Y7Y~[YrmwjH|C?Y@)o23xA  ONRIy-BKެJɆY~*OcǒPwҡNJL:J ҳ@~!a8\m4 psźL2ݗ[ˎJe{r36,M3m)/eU{)N6Mq?+9|Q]@X #׋n-sOܺp%_C6k3k贡 n&qV6Z Hٗ;Eh9@|HZ 35&1 S־A'-*jmcG^Ml:k5W^}@R|3IK溜vg&@;# AK1pO4UEH \(T<~?Ƹnad~-]h(ܿiZ렀CrEN_F5H2.jV⑰vmDruë-%P"cdU޻c mn#zCk:~%bآ!?q2=3MvE1gIWfl=6yqf^X%(AI>*q(ȳ; 'R&յe|&=r FLM#VG!Tf+ #5AɋTt1Hl`$ S}uuȵs] X&4e tE wp1\w(\V8^Exa ˡASTzE1>.O)̺joHIF.; -W.~ ꞐXkYG$We׏TwJd1Lˏ &cU팳zzU{}?~vYŞor`^P^i,x3UIFhR݂jeN蠧AZro ME.`G8 i̪,I*@|@PzWdșj!>4'd<;vendstream endobj 413 0 obj 4404 endobj 417 0 obj <> stream xZKo7 .Л/ s(Y4պS7ޠ@R;qdSNPffEigk"r3+q(Hwdwk.dsnҏMɲ4AnЀB!14֡b[L t}m5oM}qJb@k'1XZBjAX!Wzl y߾h"Aۯو秧Mmeڷ9c~6'+ ?le\۾S}o/G5Q Ѫ-{xde)ع}n|`{Q# -qRJ!֒EU`'L!yWӿ=hpizW;!BAAwTJY aDv\\YwdtD3J  $^^*}Y L-ZbIfޭ|w6W 0XpK 4R^5sJp6q 34Ş{;<ٱΒKs!nM87HKіB5XO+;M02RJrb=z *H\ hT.pOӃ,yt0鹛K[nƬhMX5{Λγb+ >_Lq,`b+-&m2TuclIR}6g2k9QrƙDx QL 9M##6V0&vOk4ҬQ߂{Nvi81 '"TevGE%\\fq8F%,ҭQRGO\=̧Yd2Wϲ}f*cөv~͋a@YYZ̉;\JlݨZlJW)nB L R`M nTڛ|y<Q|ڛ&8gæ./9oz X~tTKKruOVWyo;ZDyJY䆄lM_$nL,Ak_=UFa0VүrŚN҅|0 )5ݺ5~ sOfbaD;0sb^n(COt-ail )vcdtGzU$U]$c6b8֘фAMC~G9f!ɨVtg4"J+kڏ3(9{\ ]V?dhnXkvP}_pwWKi!bۮ6zflo1r6~ܭ8SRn8AqwWC[RL֓G&1RuXuDcx2cx6`4hy@*bB+(L%8Pwr9-Qtғ/Q ':?86\aytaXuon[Κ>iO`"=X`8HXXdk(>ɍ)YeSOErX'?rpu>RPZe{П4endstream endobj 418 0 obj 1818 endobj 422 0 obj <> stream xZI5sSxоB,N88*{Zy2_`<_7}-cC: ߷wi> _waFn׿I:e(|Sv'1ҶB }1nZ|pilgS*Ls|^9!eG~h1>f{icit*Pj\tVks-lˇaJCqn"0RN9[NuQӬVy 'I*1tFX~giԌFQ6l}2B_(U%|rc o(w7˹La>6$̺8q*h*tᔞPJ2RD3>Cs0Sds`sJ .w0$07jf cfdqumEŰH[e6 u9|aU׳D&r%)2)Ic?)F8ѹŸlpc$x73FL18ϝl)! ,4cWlH !—!V\p׽`-\?R/(KBGhퟀkRxlIي>ZBaqFH۬@R U3/ZhI6ypH2tgQ|3K3$ OP<#N*j4Kt #'DUX؜x͆* R?Nu3ۚ)d)/i|gOKWcq Ԑ!^ĺPW|+3oTZɵ4r@a[Zr6sRh/؎87hW?D%Cau36U`W;ywq릐Bd2#7%!ő]0lz(UΥV}Yװ LDžC,})XS5S.Rw_p "ܽs-%H%@7R1E洍teEꇒH`WOpFEk$NN†Ka8Ճ)➠v:&  xJNU 38B>rɬ߳fs#mlu%/>Qܕi59 rؾhpK(Ӯ2!'V?7 %A A lB?v mP|$ҡ BS 6|Ws' 8ϫ[z) ֨†8ì`èJ8^) ï%QĨgmJkf g%^ ſ7}y/182Fy(.n ^sl}$H@rRy/ G`}<\$pkG,;|7D 1A3 ƓF\ak|x-76P"Es}AD4c(i{&2!W(ASlLgy8CJf% N;@GS'L dZZa R[GS{s9B%("fT3wFK6Nqs͒I#e쪾a> stream xZ[7~?EqLt<:1!6,PqKѧIMRPu> l ?^n0j~wH_[=+])os]$n|?:Ih9(VѮ́k1\~4_^ ;Y۰R#fdHHs"Z7NHg*lvN_e+,,{S@ Y*F2 |NAKzƎOL yt%$vcJ0) >/pYjq QgQu՛O.]Ii{zdĕ`"k5K THH* J:JH-qJ_Ψ QoòO6$'B >ÃEŽ_ 5o=\>o"`FY[rf۸V0g&4/Hv^ֆɸE?ap\ źn 7Y(M/uAC\nF(34JpwQ$Eε^Iګd(tȼyπbYo:V!fL81QclFUG`n0-5 !RpQlwKB_)Q>w}zԮ$0B dz<= KIj4㨴9 ϱNSBŔ%0/  Y%XO-<nؒu*HAs!x_sB"X(VPAn6`on/P(Gp-/a\Xְb!QX:}+6y:L!<4md m*Lݕo{ȕ'Ip%܄2FrA scE;Cll57. ϤP'Pgju)ECFSا$6tw{k檹G?̡N=s}L`5s!4YFI%w\-l۵C!HR}5,5"g~AʒZ\fRM S,md6Q]?4r}h%ƚ;hDO|K`p繉2~Mі#c5E(b"TpĆWYNTJآ[ K ehJ_ZUT)/,R)nn0K%yn^XϞ-7JF[GD*/.1aV辝 ڶapʾd!Njx􆠼ΫǴg9T6q31ոZ\/:{י]閃׳BE3Qx\>*TX3ү*ߧUl:=ol.(H,ڻ^4?NA'V*"XqQ?遴&(٦y_8EWVa8蜞D)e*/M-6OPuT*R]UZ \MN 椧tm.~z}e`Oiv{k(ha*57G8,^\0 jiu.ۓ׺a7ύ -߸SEoH!>̟ZrjΊA=jK).ЉxmHKsX, 84 BerO6u ĎE /lio O5)j?IGsirOfuSZ狋ߵnTms?1£'؉:`Fuv'j{180VoDf)! C71qUGd۳zp񔗇)٧V3j?C]CkCjUowjTnϷo8Fjw',?ʦO+XvY"c}LӴƭ͡Z^ jͲh%P҆qԣlQ hA2(?58,&z஥IU!zh&]kv$P;ĘӪhho`oZvOC2/{"Sf >tɇP6P~[(&@hzq[LՅx)~?1">ba#J^ƽΓ֫2d20̂Ԓ2) &sK.~Ze(<MXĔM.d{ u6ŦS8 Y,0)y_q-BUkuG.5?KXl\k@AnspG!\N d|QV7*Ŕ8k44e'<wdhVPРOjP*u+n%naxOSEWCߊ4`>1Аr)M&G!,WsEL/Rrendstream endobj 428 0 obj 2504 endobj 432 0 obj <> stream xZKs5,1'J,* ſ5Onj(<5O_Z~l^~4 k]\mh[W;͵^o7Fo=\m>ZHgJjWa.c?d`GԜsc՝^Qk*FF/6NYV)?L6FvymEM Yb̊3j2F27c ^Sh G[F*^ah.&,teXn9ee >ƚ yQvӌ51$89Bܰ- T5ÜN]g3>Y+UURzIPfbI/}c ӽaQZr=O[L覙s5qMp˔P:p/bDµ5k r;\56LґY*J=QITNQ LNPɥ`!v\`s(kad@27!T\ 1tsU#F18Ҩ/sCt1'_Ů7I>#> $PWx"+fMnp6G )`޴Bz/Sw',uc/Y5e~)(6F ~يl%_Nùub.;E pSS @cPS,bezMw:%$ Zk^"g K"%L1q9Lx4f":+ kyE'>'Ӵ3i i:A(Ń}/c?:xNOSKZk/Xe,!夭~G[Ӌ;)t'4$er=G@`EF?hӞ<V j&K 1bW:EǶzGb6ؒSH.Bew 5k%†LH0Gg6XoBy?asPtNgoa ?x0p_ [7b!фqx:d$2_gCXF#$u,*s`nY)>v&$J`y=A'~+Up19F;[ge{kퟮk2=gUA;hCBm¾=@K9ѻzbp~}̢epM>/(b)S;qL.q2tN0 M:nq /'0^7VGH񃣽k SEiwJQeЄV]tX@HTeWiuMZB,/_wVX-~Ek_<؞&ڱ:f#Y Xp&cc&d2gx}STb V1(Mʸ6I𡿕4Yw"\#U5Ji \(GYXܵ֠Uq0B6kr .)gZYMǡ'5@wFD< n^g,MKN6Y]zgb oHoYMNub9d %zRG(7AU0 v2/ M`Ly3?_qr7pe0|5{ .4bL=3e 52jEڅaص(m2/PVFy@ag@l5b=EU悽_E}4nFaJQY (odZ!m֖g}Ypԛ;/k5'izE'J G\`E;g;yxI6{rUЭKׇ;tCW>>CD"w嫚W9 MYײqv;ތ(6/+z endstream endobj 433 0 obj 2104 endobj 437 0 obj <> stream xZɒDoQM08664Á`llaUZTJvs2+)}HC+߾ջR;|:Ǫzpr lcS:=tOʨjY)^?HÅ5Է _kCx9o5;FpxJVN_I}ݷVA4BNn'KRjx}힢jFEx"vMGIJ"o.~.~2a7c'Ilfy Po5F^3ʼQwrޖkqljFQD wh#}Ѧ)Mew=-wk!\XymRޘú* GrXpiv:ΜE`q1EE]tPJX;F]Q,p@#-k6渫>(T<3c0ŜԼ\@ x;dP,x1Gٲ |lg펅.ZeٞFҌ*wbm-sld -3e^?؉5a쏙&$XC{dyWiPD$`UfFʗiev]K εVّR=8WWk 2g ؼegL*:*7r SV3ܶS7eDwGGʙcҲm+ mc!, I`zPQz:>wr(*:\Įgd iTN(;կYe\,c+F 0t&>I&AzL]vcIލ#hjWdI!ڎLe`>X]iȵ*LӐ2#ucv6M)h.QؒLɗջv/i 0ݓ+Y.YegY3e2K`1_q\ ȱWK#AaLشDt΃7E߀&b#':pGZ}dGS$8e m y`PLkv^jz =,u۝g֮w~~ m՞>r|ľ?x!\0ޔ.Pf(\,f5] 3=h%(Lt&7An#&S5ORZz Ae =ÈbL2u͎g״l}}a`!?a8=vj^uߦXfAm˱(m@ۣuWendstream endobj 438 0 obj 1815 endobj 442 0 obj <> stream xZ۲D}crbw>E p@, hD*N3YI_3)-N${u޽aoX/|4/mXrvÇj\вٿ،ohC/5Λ&ENWld+Lgt}2-H9~NiW~sJ4gY?Wp݀_ -_t`uV31kR0dkEgNG~jOdt4FZ*>ns~@sojfnȍV0/Rc? %4Qe7a j?ѿ;1-00cofp=|2X?l7BgG1o0Ws-v7[΁盼_3.(h[mкY!h^#pZ۲DH YU-3i1E\R/_NeZMoπK9E1;7e (-;SPU-~-L&]&tpgjrW%ByHf3` e0@K.'𱽌r#C;ݗ |ӗLȂ~ e̋ͽI2c_RuK*1ԭq>[s Aقb\5@b)!W抋a~Zz'ECw>\:sU*H^ZSӗgb @;ӛ4Q.. Z2jVf}~@ꌈ_uDЅ7_}.EP{ ۑ.G#RkձٖϒNgOv7qrYFh9j e:eN>uX?rĬ\ DR%ap6 #aD)Y0KVQ5=8 +%)H苉"\WJ」h!49_-q?_a B Z%G^hT:ZdϺ ʭɹ&H*^ޜ)Yj+7ՎF r%^+yQXAozH"YWU>oX [4oQL$1Nvs)X\+GR>}ezTxh{||R;WX/H>qL}t5=LOhSZyBͅLRO%ZB{FmvX7O.hWc_AVendstream endobj 443 0 obj 1884 endobj 447 0 obj <> stream x[IF;J;/G Eu `P KHye_UeO3q2oݖ|ŸGvm_mmx r[oQۓ|L˭+o=9۳ m';y^ ťkyˤEVhMom$*'?n8oۓ~?cZ$4 5Ӊ it#jjh'lk k5Q3*f|ΉW[ẆҼ*>J18"ʢ2n0U<riszd$`y(,3)"3(%zݓ$|`N݁(k?)Ir'M# Rn5 iYQwj$ӝЂ 1@QIʴ c˜+ތҚd-gg핫 <U育텣@U>l!k^ˏuo) dz&dQ޵l-[.zR.0M7RA u:eW./.[B~WVӛ,{:Sc.l)r Z!|6~̐YuN@˖S6+IuT1 Ȥ[j *Cy cz@^wB3p) ;lGy)8 p@ 軎qZ&ʻe'f bf?SJmpe!> +6 ÙݵX }e+NUZv휋ϷCt .*1@ST-,ԯ ERSV@63Lg ǤFRq>RN)MWa>tcrnt5b|"0w>vǀ|ǬaJ^wc{H/˔A-j5 2c2ٓ߯N5+)M#OQZ*qr1 NP70.Il"<܃Ѯ+/}EiO>B1udfx@AVP+~YAT |:|pu sdRp ΥrLmóamrW:ԕgHg2?$HpH(TUqwoFB教#| +3wFLU%\qLy*g*|>U0M>_ 8NTEV´xIzO3戊z'Batk\G>#î,^gײMrVY3)weӲR1ڤaR/_R)WpMdT#b<~[B/i6x|2SK]lضAdƫt4Y v 4C`}pF_^VQ˱Kj?,>!Qendstream endobj 448 0 obj 2244 endobj 452 0 obj <> stream xZێD}GbL/ $(\&x"e zn Ӯ:uTuoߧ盯݆5gc<=oiF5K8qc%|k`cLxIo9w?+ƵnMK8-QƷ_mwRxrZʷj|m{yhw6/O]iGW]< oΉ,L&Wq8_!,z\djgG_VPE1Tӊ!Z͔lX0)@N;phdme6fW̪,+ [w$K\HM{'%13hC :K`ogS!!1@I')(^lwjVi+l5Ɲ#w'e=.;ؙ%##Pe_pڬ],mu'N@$.ezG9 ~޲Xte' yqKǏRl,eRMY+bTIԲ_(P =J ۗu#v:Ig4z ɼθ ):VIχM~Dcendstream endobj 453 0 obj 1888 endobj 4 0 obj <> /Contents 5 0 R >> endobj 20 0 obj <> /Contents 21 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 45 0 obj <> /Contents 46 0 R >> endobj 50 0 obj <> /Contents 51 0 R >> endobj 55 0 obj <> /Contents 56 0 R >> endobj 64 0 obj <> /Contents 65 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 76 0 obj <> /Contents 77 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 92 0 obj <> /Contents 93 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 109 0 obj <> /Contents 110 0 R >> endobj 114 0 obj <> /Contents 115 0 R >> endobj 121 0 obj <> /Contents 122 0 R >> endobj 126 0 obj <> /Contents 127 0 R >> endobj 131 0 obj <> /Contents 132 0 R >> endobj 136 0 obj <> /Contents 137 0 R >> endobj 141 0 obj <> /Contents 142 0 R >> endobj 146 0 obj <> /Contents 147 0 R >> endobj 155 0 obj <> /Contents 156 0 R >> endobj 160 0 obj <> /Contents 161 0 R >> endobj 165 0 obj <> /Contents 166 0 R >> endobj 170 0 obj <> /Contents 171 0 R >> endobj 177 0 obj <> /Contents 178 0 R >> endobj 182 0 obj <> /Contents 183 0 R >> endobj 187 0 obj <> /Contents 188 0 R >> endobj 192 0 obj <> /Contents 193 0 R >> endobj 197 0 obj <> /Contents 198 0 R >> endobj 204 0 obj <> /Contents 205 0 R >> endobj 209 0 obj <> /Contents 210 0 R >> endobj 214 0 obj <> /Contents 215 0 R >> endobj 219 0 obj <> /Contents 220 0 R >> endobj 230 0 obj <> /Contents 231 0 R >> endobj 235 0 obj <> /Contents 236 0 R >> endobj 240 0 obj <> /Contents 241 0 R >> endobj 245 0 obj <> /Contents 246 0 R >> endobj 250 0 obj <> /Contents 251 0 R >> endobj 255 0 obj <> /Contents 256 0 R >> endobj 260 0 obj <> /Contents 261 0 R >> endobj 265 0 obj <> /Contents 266 0 R >> endobj 270 0 obj <> /Contents 271 0 R >> endobj 275 0 obj <> /Contents 276 0 R >> endobj 280 0 obj <> /Contents 281 0 R >> endobj 285 0 obj <> /Contents 286 0 R >> endobj 290 0 obj <> /Contents 291 0 R >> endobj 295 0 obj <> /Contents 296 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 305 0 obj <> /Contents 306 0 R >> endobj 310 0 obj <> /Contents 311 0 R >> endobj 315 0 obj <> /Contents 316 0 R >> endobj 320 0 obj <> /Contents 321 0 R >> endobj 325 0 obj <> /Contents 326 0 R >> endobj 330 0 obj <> /Contents 331 0 R >> endobj 335 0 obj <> /Contents 336 0 R >> endobj 340 0 obj <> /Contents 341 0 R >> endobj 345 0 obj <> /Contents 346 0 R >> endobj 352 0 obj <> /Contents 353 0 R >> endobj 357 0 obj <> /Contents 358 0 R >> endobj 362 0 obj <> /Contents 363 0 R >> endobj 367 0 obj <> /Contents 368 0 R >> endobj 372 0 obj <> /Contents 373 0 R >> endobj 377 0 obj <> /Contents 378 0 R >> endobj 382 0 obj <> /Contents 383 0 R >> endobj 387 0 obj <> /Contents 388 0 R >> endobj 392 0 obj <> /Contents 393 0 R >> endobj 401 0 obj <> /Contents 402 0 R >> endobj 406 0 obj <> /Contents 407 0 R >> endobj 411 0 obj <> /Contents 412 0 R >> endobj 416 0 obj <> /Contents 417 0 R >> endobj 421 0 obj <> /Contents 422 0 R >> endobj 426 0 obj <> /Contents 427 0 R >> endobj 431 0 obj <> /Contents 432 0 R >> endobj 436 0 obj <> /Contents 437 0 R >> endobj 441 0 obj <> /Contents 442 0 R >> endobj 446 0 obj <> /Contents 447 0 R >> endobj 451 0 obj <> /Contents 452 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 20 0 R 29 0 R 36 0 R 45 0 R 50 0 R 55 0 R 64 0 R 69 0 R 76 0 R 85 0 R 92 0 R 99 0 R 104 0 R 109 0 R 114 0 R 121 0 R 126 0 R 131 0 R 136 0 R 141 0 R 146 0 R 155 0 R 160 0 R 165 0 R 170 0 R 177 0 R 182 0 R 187 0 R 192 0 R 197 0 R 204 0 R 209 0 R 214 0 R 219 0 R 230 0 R 235 0 R 240 0 R 245 0 R 250 0 R 255 0 R 260 0 R 265 0 R 270 0 R 275 0 R 280 0 R 285 0 R 290 0 R 295 0 R 300 0 R 305 0 R 310 0 R 315 0 R 320 0 R 325 0 R 330 0 R 335 0 R 340 0 R 345 0 R 352 0 R 357 0 R 362 0 R 367 0 R 372 0 R 377 0 R 382 0 R 387 0 R 392 0 R 401 0 R 406 0 R 411 0 R 416 0 R 421 0 R 426 0 R 431 0 R 436 0 R 441 0 R 446 0 R 451 0 R ] /Count 79 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 18 0 obj <> endobj 19 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 253 0 obj <> endobj 254 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 268 0 obj <> endobj 269 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 278 0 obj <> endobj 279 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 293 0 obj <> endobj 294 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 439 0 obj <> endobj 440 0 obj <> endobj 444 0 obj <> endobj 445 0 obj <> endobj 449 0 obj <> endobj 450 0 obj <> endobj 454 0 obj <> endobj 455 0 obj <> endobj 484 0 obj <>stream x]1 D{N Pt4Cc 3$@8X)R,Ã;0^Gk"&"ƪۃp\YO endstream endobj 397 0 obj <> endobj 485 0 obj <> endobj 10 0 obj <> endobj 486 0 obj <> endobj 487 0 obj <>stream x]1 D{N Hؤq d( !7x,~a&Lѫ'$lVEx:RJ_UNȀpwor`/Wm )a RAn7{b50ىN> endobj 488 0 obj <> endobj 79 0 obj <> endobj 489 0 obj <> endobj 348 0 obj <> endobj 72 0 obj <> endobj 490 0 obj <> endobj 8 0 obj <> endobj 491 0 obj <> endobj 226 0 obj <> endobj 224 0 obj <> endobj 492 0 obj <> endobj 222 0 obj <> endobj 493 0 obj <>stream x]Ar0 E>ocƛdE;#gX0,z~EgI߲Uk6]|sM)+=It*+=Nq{/8B v~T|ڶr/HF3&t)Ey^C:R v4KDHf:"c*bD1  B41N\kYh edV 8F쀧 Q#]aUk;;Ɖvrg+W/Xp҆gg6X ${"3OuXel<)y* _y endstream endobj 60 0 obj <> endobj 494 0 obj <> endobj 200 0 obj <> endobj 495 0 obj <> endobj 58 0 obj <> endobj 496 0 obj <> endobj 497 0 obj <>stream x]PA  ~ЭmZMz14  z0e'C5'g^];-X#=+"&XUqVUY;OdV}Q3UЗVkz ){VhI#W4J&Q@MM*3vdIYNL{Y8ޖ+r|-%t XG >dO`e endstream endobj 173 0 obj <> endobj 498 0 obj <> endobj 499 0 obj <>stream x]r0 w? wt^ -<2+ҡӦOtL9T|Q/xKYo&E5׹|}Tq͇GyM~ (:b9{՞%;bAMi`]@0I{2t5@JMւ`Q2H: IH*iGJS:C+)䠁G gHϬrZ1o˙4~.^ endstream endobj 41 0 obj <> endobj 500 0 obj <> endobj 151 0 obj <> endobj 39 0 obj <> endobj 501 0 obj <> endobj 149 0 obj <> endobj 502 0 obj <> endobj 32 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <>stream x]An1 E9En03`*!oE+rLb,DaXGzp_D`0%҉knш0+Pqנꇠc/>ϒT\=](ȞAtw[/ JTdl׊y<5/)e|G^"Se2{u endstream endobj 117 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <>stream x]An E>70v*YI7Y^8""΢/34Uųt~>e7[^f^R|[9ƢKL귦=kcS> endobj 507 0 obj <> endobj 23 0 obj <> endobj 508 0 obj <> endobj 509 0 obj <>stream x]A ER[5iM^`X. Xc\|7'3O -aRwXN5(<#%ڪCU?^h4|#SCj0{ H2&ZcZM̏yED.#V")vhDqVuCZ-+0v>Uk:,_qF7b endstream endobj 95 0 obj <> endobj 510 0 obj <> endobj 16 0 obj <> endobj 88 0 obj <> endobj 14 0 obj <> endobj 511 0 obj <> endobj 81 0 obj <> endobj 512 0 obj <> endobj 12 0 obj <> endobj 513 0 obj <> endobj 398 0 obj <> endobj 456 0 obj <>stream xMMKaǟq"kॲDbB (lK!]VE,Ds^ YKPaf!Gdj_zj^{g/qNɰkӜ9Ϳٗ~UgXiMwxx|~O*Zkֱoq,㽢rTs5>UrYc״rbsVEh6Wa\+hyoe*_ZȨJQI>1ETsc !4o< &t~ +f.VjM$u"LXa!7Z]qB! ZC@,Gy!TڊR(J۝PeX~'I٬$~B?熷r endstream endobj 11 0 obj <> endobj 457 0 obj <>stream xW TS׺>1sMPE5P**KQ(w Փ҉REw{8)v_ڳץQ"ܦ˙L0#ǽB{=={g%w뿾yW lc۠2GAۯ3h]m v.b3 u*PNَC6ɢ)}h]P Z-;hl0!$9=MIIJu.Ae .*X.8QOh0"B9tN,,E,܇ZNi0 B1%xh,7͟6: C;tqWR })SwҡZ'HݝG7f}{[UYdwsZ94H㞉~ޫ`1?n-O`̑|?AYDuWQUma;g> Hz= B@-cMp@h}5aB8D]-Hb1vQ}!Z7 &u^NCB<|6 4Eh}Qj&O13g0s}ڇ^8<@[L1dZ~ g쨱^@A(UHboࡒn(*ҏ "&T!΍EZI7xC$]_Sf*$(֥k"EZt /g~.F#\#賸ԌH+K-ڍcsz$ jǡjѳt{H^Q[IfѮ(wMETEdo%y ^ MN)ǓUq"Ș1k{mQe72@ L2hy<M`q062`~=zzǖ)y|X}TwadbGG9CjdS&3?OiG;g߿!?ۜe:h\0$7i=MfRjjt0j&]_9՜1ya~6==m /슮m*F'd&=9HfѨ7JJ3j3 HgdaݹdW5CC.?H0m=timn!چWu.`1LVYY9C# ~{,^.&p3oc ƂR۞V{0u&Ձa|\DPVȂ2r$zNV^Lma7XxKdD¸j(<U!.*"F;lCrp"r$'~ay7<9):MlrbT^LaHuX2![uo9 4aHM &bxhjm+OP!Nm;SMH?O]7;*D WQ-1 aBaSlY~~io9֡>yyiMkb_0ӎ!4M+~OmBe1J`$Ey6 tpzcNstC5@ꕕC.A\ ]W$OU%|6*$>;uv}"H3btaoS4ol%a2/GW[ˋ4L]YR#JIhL壕 [*vv8  Hxw&xHɦ r{R~45*v^sSA$u5_e&`d =tc%a VBt7;:)Mw<y9Vi0%F(%?F!1}QlMVzNѓ ^f崡Eߘkw IۨpmEFuy"Zv&iNHNQC2O*5*̪U[U\dexn}!4?OJB0,mլ߱> V1s,CQ]Jxq=z L_Hru~J9X,,A͎*Ͱ/[aSBMVS>\csS5_Qs %?uIA TCHYo]zJ :NuV0 gv1-6>ҩvMC7Ccrlw(a.L֍%'5ՐҨԇRsk3vF'D׬(a+dqOT"J(f 2` W~FdZ"$"m8Kbh2*ҶVo0}IsK'Yܜ&I2aj慞-{ֈ:NK'(XȮ. h'|TI93XEs ؑm]{ڻpsiY[1onHߐz\U~H^˙+gO )-=qIKȧ6ia .+ژ['d*8%?=PO: ىbMv!3 \0@晎 2!tdDL_ۙx=>J߲́}#̕(sA5$^QU6w/etiӌ? Njs/'SZ;ߴ̝>b 7ؼ/IH/GtwRG%2tХ.+^#i H@!vrz4BIjR5P 2;Oxvtjg:u .Wji?Ra+cMm#mSN[ lm. {tI]$\Rw lNfؤD cP-ّQZ'ѱT=r=P!ȿ럮Ĭ<SMJ]]D61L%i Z;[,;EkM9$AÔndk8~O˽hl*mUVkR0(11Ve\nb?+AD"F2`6EtT ǔefHC1FPiF/ްuhLSˈv<Eml#DVm:,rfmqtEn2no/]eKrt{H,ޞx D}*pqQc+v妎#<]QGRʷ7;'p^sM>|&A"39}> endobj 458 0 obj <>stream xcd`ab`ddds541UH3a![ׄ_U<<,?Ԅ~O+Ș_ZUS_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@|CR#-MM͌MX8{{XYlz6USG|_K(7aRdiMS;:;Uhhknl4WǛgwoDݾ E~.ɖ[>o!nZ?TD/[roU~]߂K3Ögw?ѻ߹|\o86smf`| endstream endobj 80 0 obj <> endobj 459 0 obj <>stream xMkLSgQ׆P MS :Y^ n*&*jjihHd4f6]cibAkTHo6g.X,s49Q$bb0UZָGC\0ViҵnsFeU 1q[G37v^|Q<5 j"JM85j2F9)5S z}9 8 dg=X꓎{{is$1490 =M& /ߖL`26KEL̐# hj!XJ$N?nD_Gl Ӿ$"&[Q ΢r26<: 幮1qE[\f?X$ 6*";Ⲣ>ǟ )14(dT~F['7-\`a?@zW^&#<% 6056Aa>Km/=T78i_%~XYtHmU-ak ܄[nUp.֭M*UC,,R?^{o6BGȯXUX}QHL^ו88^_ҥ*fB a4>롗>f$'s=+-p?9=8nDBb#7)ll;+j_Z}'O.-^|N {IA~8@ 䣎_Giw})3،woT$DsMܪ:!M~ ǡ$~ԏ;C¼ mOo?_+YiBVtl(.a> endobj 460 0 obj <>stream xX TSW1psU :CCp NNs$!@c8aHGgUl֡CN$Szoe+{9g{vx+n]6SPw%+vss5B#+?d)v.\0n̙ Vx s' 'v[^>hKbѢO>J3D-2N mF*۰/p+!"'YJ•VX+^'Y)Ssߍ~l r v ٶxɤ&/b>cڮ3|23v9~<~A|L㉍bHl&&[[Ʉ+1p#mvF$;U XM|B!fkY:b=1p$'b>L, 6cq`1L,!ψ!Rb(&pb%1p__y;yQ-,, 'L,(S"@ :1|̊ 9C,zuN _>\3шU#~0[xđ#0k6lJmtֶllm,5qqC}9?\冩y ?澣 HĤ`4&@P`BYVZZ%l gTX6DpuP gdTd]L6up9.] =v0 22Nԯz u1]diCd~۩S$ O5蟲7{4'ZcW8HˌKgz%ad !y郋7gղ.SnCgpTJpzCh=t"8Faw XY^J\ ߐ%>Y#Z<f.wGdscp8xKd/&ԟ=D5/^يcƠd_8\^Ά Q}:C%1$-WRfFwopGRePt`XkXs~^q|N\']cR4 [mGp_+0ӛ"0z#Qi%د*-m(i/`iBR*idCԠP=@ ,fIZ 9p\ |p">g,3dzֲAf=NbxTyQl+A-(>H/9xC .6C>MBG-3ȴIMsi}Hn{SxCɩ COnNUXSJ*2%,wΕdw`@!ʘYgZ9:n)p,J`J13Wp@.ᮽ] OͼWo:W_ :Zhꥃ?geԂgzkpGD1kP^ Tjy:cUY(LW1 "|ܸ46GC;p< UK&Qz6+dmp5f2 #7U(H66*ev%PW<\Wil /0:Jռ?4m ;ȣ5I|(dY̾Հ3flVTeYUVߛ<Њ h482S\0'qtWgJ0*1Ym~dJ!}rЈ~>D@6 aM e_6@U}'R|Y"hM?!TTf]/wLQ}zlO&TEkc/*WCb}Giҫ T4 }] (7\GҮ-_ƣw{Nos5ݢE VW 3TdrrH#ΦGjpn+T,0_. 9spf`!ً&Z]AD&C8I0s *]/-б+o9o^䌜#EՈ3tG䉲y@\%?p|zpLcWhN(q-VIpKtU 9/k@3-x{Id4@U֕\^dK1դ/P$3j4>J ܥ0.|gVH> mL4Jrkm\; SgE\nWyZd\C+tIYz(% ˚̀YwECL[U\Y $bZYQS/ivI eEaoIPEM a`F\/Ȩ9pz~evB}ogwwg3{]]Ϊ* OV4šL6f#XWdZ>;=[-Qݨx>t|A;4AkwʛqYj2ê0gOVU5ƶrBf)J?Y88q*U0#[CӲ(dF7gG62}S_3ԍ@7BX(74TW704guchT:{ s ƊdƬpIeK6&{ߌWAm^E̮ʌj>hӯ*(icig Sw~|Ң8|>QP 8F:qf/ZWuӗz=^;'r.:y@/8o{FE)>q>ռypnn4؟C6<54dȢCn|AȒEM`Xi,W㇋ڹMC"EEd$U: kMadVTUgd&fгd>lɤS%>c)@bWN@zQ{^Ji:$x]h8 {kG$=#y,A"NG]F`6Y,b5Lp_[ QQeT}CR,mŕ98"Xa",$49 QZ#h3Frx;wnأ h3ZxLXEJpjKpTRpL(a;M!`'faG=VI%23 X8:{atI)PVQZ$qŝ,~$)S^"tYD B(iQB͑u5l闿M?\e:)99[|1GcHsǡw(8xW \xWKb&MR^jS~Xvv[.x<m3zUsHfcS7dc XEC>\ÁƦzfiB8bԥ4-ܦɀ^1> endobj 461 0 obj <>stream xy xeuBlxA%ЈAM6쥀B4;֦KtoJKKZBYPPguq'wߓquzqJ99&1 &9vٺ-<4f1߲i< &`}>;)0e"r>`19e9AFZz~9Q .|anO=0jIV #)!;j]B~zJVB>Gf朤/=dQQ9W̍*Oڔ"(LIz=';?j}BVJ,'_"Z"f0,^9sݏ hÇG;U^Xh ĿIIRZE6@Цm#TǥRҌK .zQXQ$^*bI9N6uAӶ/CM1Z{f}zB(UR"fqat ;?)pM" pl4}ӹ2WF<97 |H\pfyPZiD=m;,/ b;B 4UE_3d+u_X}G1Tx~1QeV6\z~3Y3ϭ=8ƏrSW4"V sP~ 7_0Meoy~&zS`3ae:5HK/m.HZBD1r@RBKm׾ ϜB368!{\5T,.LhnTwX's mc*-jՄ mЮ[.v:FsͲ6$.~l4oчwħedSr/` t>~I x |쵔Db;e&h‡5fë>f(2pigh#ڌ2Pzd_iE_b\0f߸GOݐMG?c򄗀y?Yy9NeH8F4-=GHJZr;vA\z+>lljxf+o!jmTtbVӶUтCf\/mbt?WK5 ;krBg6Vѩ09G{ۙk:Yï" `49@$ł/'7dj}&+el t:h .LDr%PE//.X"q䢉lhZ׉y^`1uhQIcʠDl (zPj(P@ ,֢K*1Qd!GOKo qjz\1dmx储9SwG(*±pA]cSqQb(+Z_  9OY9[$)@]6֣gn ֿ!UYR羝fʑKs VGph bW 6_[j dCgžgޥu2[Ačݛt/G8% dgkCC l͸t{ϓCh+ Ld&¥,Rf+tR_]:[8C{pZ!OgF6vW@\<_L]1ij'֓5[TچJMW &EU)\FQ~+@{q ZgH4T$h!M3ނYۅQ+VP%R"x@;x-( (Z6!v߁!)0+ LtH|MiU&99h3=vO*k/D'hE4zyO#w`B<eD4m+?"m/}R,02ym9jG+S zq?lj;&$f&"V0ԻPeٍdN3nyuIЫCS#>D=q,ť!>O֓}ż*޴{}p>L@6.znbtzN}1J];0zͫ\|m+npi,J|HSF(*1Kz ֗l w@5tfnj\JJDm2$A)'*]cУbf0+h#V{@3&f-6^^d}>oV< n:" ď/Is_G>MV ;8'IxƸxG7goٳXFaVzj~]`PM D'?)OCJI5/Ejw4@%Xh {{j&K(z{B5.69"~zWrVuk:yLU"nO^&BT&Vk ^b CFL=B鵲DHл=tGfJF!/Ԏs{j?8hAlVJoKwW{υw(8 L |qtX7pkSҾ) *}8X"^$.pVJb%{:&观iPYB'T> J}VP婩ߣFN pX v, RUDU"IVm8Wi p﵁aV&Eoul௯%?:%bVĪ0Z:B5w;>34(\ ^/SK=)bxw}t uDɣzˬhŃo)EOf`JK/FFn |:L^.oHhs$NUH% &PG3Y˕ ɨkJ[ q͑7RPV,6+0nLO9S =X?D.*cba9=x*8=%Q{6B(QRUZbI"Mg/7- ^Qd{p*RT(__ܼed Ft6wAUQe1κ_@Sꝣk؝PB[#Bb.5(@kCoC M @_n-zjCwT?ej1rCLd2S:a:=fdm$VU 8 ((:rI%U%'Px#_Z :7pq7XNz:~tz!i:(y17Y@7#{P?QR M{+:Ug {2!u^=GE;6~hu~4[YLe(#_\Q\x˽q3{u Pdr^i tf&yF^,7a  )֧E+kK\"WO-~^m"h0bʹt):^ʢ Ft79+:/;jzMjQQ4ؒP3*K۠y\RS@Ea,/Cp`Nxj`M<{n G7 JFW>sG&%/^u ,?tpjgၫ/ܪ%#A /4X%<׀9,dy7anlj @l#w1jLd+Zi0KBpq@8E8ۨJ6+#!YZ&L&h4Z]R'ǣH<].{}tP(7cpB{FAUBQ 9&،0NvRr[')i5;QS}6rA ;Ge|{=.=/^r7|]lPZ0@\\][?vz6AT"4kK'$eV $i?Dq|I '=" V ZR)(]Q#UBc`,m97x ^Wf>Fώ^}ѻkEYR'aǞ73.- |{64l}!`v0SBC6s"Ļg`*\%#ruz.;n3¨R!YEVA#.5ʌAcZzu*-y G7cG'Qyy F Mp+Qs"}#jC1kQ2U[M~@ayA+|)Wo 5)m  uo| =W'q87ҦۛL4 J>Q\XDn)gӘ06c3%1Lz D5 6: L r\;" T MFXhVKk Yku7ЌOI4-7MӍQ+J9v{- }n,*C":r ]Fآb(*:gi"Yivh]4 m _9s h=`;v6+*z+4.%]OP8pᠶA[w>AXLO%\>~*s 8#k~w(4 =ӭ!NBadʎJN+kw%I~$J zݿWȻKolܼy׼AhcΰÇ ͣ$$؅׫z68 %(~G/%0+'S4 j(0HzGЌ&,z/ S Nʏ+{jsNꇆ\G㭮pZH;^SOBsSjXru:4bJ]5A{&Bs6'kOnMicokp[<p8Prh Y.MO/L)_G/=_tAQrx}:q}Ykϥ vn|K1@0UfJ/\֪SJ\a8?e l1Ćʀ#0.l D~|Ѕh=. }sz5h!'ӳqkzфyXVE #$Dvh 9~fo y 1+^-trf_+ԛJK8@K]wלJj@]hN';2A3Nz߷4Y|̯~|w&Ho8dvٞAݢh*'MABl>ME'TUҪ蒕oD<;4yێ*qkf<8%k :4mb(#2x9E*O͵ϿP2@/=Ze,eNh5ym*TCje)zq3U#VGu4έ٪|COMOXN/ӓ^*Rn,Ha; 5i^Ss"5(V;=:+ىfYvbPQeQc`A#JPPԀ¹M>D^e͏zPo$2` گSQ鼸zc>Ҧ2jNM)a7$;T&QoSioEzE0>f4l3'-K[d(Lv/Pzkވ[hyҾ՟x^}7KSPk2ʤhOy ;NЛ̯*jnqՆ\| y77Ѭgnn ZZsyuF*W V}}RDeB"^QeZ@%h=eRmvd.knY*"f~}WhD\U(&̭4=J+aH^I#ZRVUo"(2,4 . *;057gwY~- zoF{CkfwXI4 khI:_>d]XJVa`tyƞRNzZ+%sG,,{C'qx ,O|hg( =֌|7 iث?I%[ ߳'/cc@ӏ8y$QJ\(Xc 'w8cd' endstream endobj 9 0 obj <> endobj 462 0 obj <>stream x}}PTeaM5`n#D@͠HH""H!,e ,.7}waY@>V%AR>3I R?KbDΘs7N{93w|,bY,6#fש&Vկ4m?ΖnKT5@7@INTcҳ5!Ea4iNSv˳|eʨm~d;jЂ.@4L~=fD<ȈO3h«^dG37N(FNPy$8]B_t \"d#2Kj^Q) <0?voQ +p8ЁQCkLSȂ8^9ŧS+s 0,rLИŔі2&oO+諛svIU俥/KAeg2 ܊P"ÚSls@K6oE/;YT9#נim-XO,yȳx5^}A J3WbdddH͚,Ҳ[m-g'x{hD^``&5k %Eg`^kZa-wrLНN? R_ɜ0^34MO4fs BL Ay>|hU+0U',qr #t+ nqЀN@> endobj 463 0 obj <>stream xcd`ab`ddds4T~H3a!k_nn? }=D19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;ML:)槤1000203100qƏ|bjIoo_o¢VMb)ݫ6Քtrd/mbMxuԝ]WS\V0}I'ͻxݚnUʪ[[ J[Z [Z#K4̝?or}7|מ?W3|uGCѶʹsϚ,;qʺ >ES֮;ayV8QP'ZR]3Ї%vMjh L樭rSO[;oQkC<ͼZri:/;20!ɏo-^cmoFu5>?ly?N`pq\kq endstream endobj 225 0 obj <> endobj 464 0 obj <>stream xcd`ab`ddds T~H3a!Rnn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##羗d|Sr -*sdaly?ξk'ι<<@Y\ endstream endobj 223 0 obj <> endobj 465 0 obj <>stream xMoLu;n&DDEEbñzr=zBKiR]۵l%NB226|151o|W͇$yIu_ڭkyNh=G;pIڝJ! k(/e:TgkkgYXqsĜ⛬(3ZD$6g/_HVrNNpqG]d6lkV6G L5 v vg NuDm'%ONFnER-}A)ϮdNľtkNZ,#v^EL&1Q򧭧̀Hz,E0o57Պnw`[Ї|0>J]YIޟ% uP`;&3.ScS\8N"2Uw?r ❫:uZ`!$Ǻ#ayfV+\8Pxhŗ >dk{Ws /Xats9=;>Ex#:F5\A)S_jfVjڼ_S#ji0<<aMx$OGS\= i/j>:l~>1@l~mh: k0RX ZzW+?)7-Ujw'Dgss;]P(@/[_I\d3MQOC 23RSS$3ZnTF=HPWgJdjǃ=2[9kUsD|6jetf@SB%l0Ŀ3 endstream endobj 61 0 obj <> endobj 466 0 obj <>stream xYy|SUOV\&[P;kM%͞鞶tIi -#[YDewy2(;eq{$mos= 7x^dєg¿>΍scq Ұ^)2㞸>_5ZehI<'%)Y5!nbԔӧMzgGHI͌Z+MNȈ?ңVJR 3ҬO?-ɞ}J4{(Y49jEBnBN~B|I4jilFB*-ʓ&D-'dƦg%nO'74=!775)6##63/7%)#6!+7%]9M src &[4ayRL򊔕Vɘ9F(<#eGy1yVVVV[ϋMm=ś{7,oo*Usży^-M-=cxxyM|os#ZA yu-aCV?GFF|8訄я>rOѽk墼&?xpl##/~M|㡎1ό)±?z -/ʖήw 6Nhc[?Tyf-#亠|+p!ل **c-++QL ZcAW%lbC`+q: zt} r|}Oy"X'=%|j'm8G:Vj2Bnnwb ET JjS[;.XzZJ @j=:w:օImS6,Ca3īE)%@<`A]q`;P^Ej>Te"z߆P/?Ӣih#2,GEUcKoml,kN2RR1{<7e 5ֱb@OLͰ]Ȩhr+ċ_bMi6Q xҤ6A!UIg@g>@,4.DH{޺-T7(3xt ֤+@N6 B"zM`OwExf&)y!ndP=sI/MշW/EH$,` LmL,[JU`,2,ֽ F"᭚[>? G0x%%*#*3kXb|DgUsMxI $PUvV^t4.gӎJ͐˅l[@0Qޖּխ$;e%+n WO'nHbAU.*:홃#:jq>:UTtY2Ifhj|[V^@ K}tVc};ṋ2:@DBh;莰_X93U؎WVz Y)YMC& e*T3x u2!0MROo&7|gi  ۭs~%Hc2a. 5#_b޺@FcՉj&~2Mppm zȘ|^pY\'iz]d].Su^%]#gCuҶ'n {|wڮcꁖZtӗ{krU@Z*K+gbJQwh?y}p0Y!E2'㓏/zRmK=mP[[R?_ tہbwT-.>ewHg#X![үbH/cqUۋ$@/9qτNw tΨ3I_RD4}D;j?vD/ˁ~[*;.$9V{2ruqY-n ݅V1 qS$9v+@ z{!Ul߅+KlHT~pѠ52Q/ji%v+]o(dcKe&Goy33hl#e;joX|SnN*%jT#?g(PP30MKRZ#-\\1zGڼf: 담t[josnu @w# {E$*i^nkY-D /jr߮g[o1{ȽA?)@p0q+`칌bm醸5) X ;!F eTԢ %hH#y j﹊2?pQ="rvIIQTnЦ],)f~ϡsa0Jz-PϞ[2'ʱ[Ȣ"2й'!P~+dp0LPZ{3rw5B6q:@´,WjMRYaVVC-8v"›?,fgb/8v'7w9]_|oCn Q0hT<aߝIjc! ?ʖal4wף52UᥒI&_$s͇<`&\d?$~XhX4hf7ZQLE-#m:0Uw3Yh5H eTS"Q\l? j_žX$~̿pR30M:L82S`;$ށΑM z[f # ~gU =LY b7;wƱ㓘[i\߇7#A.%2 %aJGNXEG'Y~^c6?[d/:e8(T \Y&۾K=etZ+eKs r"5닏v7phogP3z,)\Z=o}%^uӧhz~8ga.3ѣ6omXBXUAhAZ ^gs$sWܠNhV(]ށxW P_\zbV}@ٰ~̡sV)*I;rL*J¾ϳn==Y#bZ./t_lqvVwDkCUˆx(5#Hvt'.Ƃ ^gvf&v6m0$H}ޘJN%Iy;8Hkm9mww%VOE``URcx/pyg]A~?)e: o{V*x㵦ʖں=^g$Tg1bȪ㡴?=h v4KwnlּM$%S  zG;:l T6K;` L=+ݴ@ s˻~2f% i<:eN75R ?C1#n݇ACPN(.~ډY w>UP$^/ rԯ|Ur"3U#F.ee$6 ldMXtLJP\&W cHEzƢvZf9wK!P$D :ʼUfc .'y@yJ4S9:!G} "?T+bPQRU"s_^ZuM"m򳭒4{L [MX[4e?oVpN"i/U (=ԥ9r ү\FynWk/u0}Adˡ|w"N#@)jڮ h.}U@-V^+s~f- VBNG|,GU緹=b&OͦRSKSl |ǿ:&jʭ̬mjk"bk+'M"mh?.SVgXB"݁7\6RДp|{gW.מNLXxSgiYV2 IdT:[WCc5"7\Jy>ٴZhJ292ځx-GW^jo1kjAS0D Ao ~4'kΈe'ӫV=Y0Oat`׹b^DMU%^+p{-*\NՖ<`~/x[*E"|oƓ?@S};pJ7Խ죂umՊZQT}Y]yȚbzKmV7 -e|yͫ!Z_|jvhL;oe+CDLqMf7}aaf ayqKVXBW:zDI=Ԓ[pZ w2X/؃$9 E|(G/T_1y/g` )]򻂻to-;&v`ՁN{"qSt=3qz|<)] \Q]);MYRl40/P$݀Ƃ?%iL Ix0&RpSgQyW ۡ. .?\9zz~6 =U1XmkSi1oMOY/_ Bh|AJw>^}xmBŠrrPA& $xе߽FjLtYba"P1nv r^e8;44zi#;F羨 endstream endobj 201 0 obj <> endobj 467 0 obj <>stream xcd`ab`ddds 4T~H3a!K*nn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##֏_fn"˺//讖kV]Н{<_ ~+Og?uB e` [ endstream endobj 59 0 obj <> endobj 468 0 obj <>stream xYXWמEYGA GGѨPHoK]`u/.D ƮX,jZhb4hΘK ſ{==yeڋDENNS&k?ὄwLRL sk, 3 82CȤ6vg3e'LeA-P)Kj+%Q,5BYQ֔ 52QkIJ)z^U&&I&M?44͒^YA@10z>I}2_cmin0` ;x``t4I9>l6|C y`55gb]gPm܆U{:|po x_8KN#NԙbO9SW(s9W gpF W &pf *wQ?"_*T/c3e(? $jQ _E9ָ, "kא BcX^g# ]UG Di6'0]8@JGQ4gT9ڙ[+cr 5ӒF.R`vfU X7.t޴st,ԢјCV6ŦXD~,9gvwxꍛW&Or\`x+*FnUj~Yq*J*fxTsf2bBZt@.]ʒ-ߪ@ƒ- x0: B/O|6h;b&x:.j[gFdD6"}a>Põ.d搠[(c/^8s',qXczp|b@g_,%OҊqgcǛ4.0̾WBPBi @E$gY*8xIo+P zq5P1$eG _){`; C ̀3`<汸8+Y9{Ou"V; 6~7.a{jiKB QY_zaKR,"ގ" I.-ݞ\goC~7HV?]qAea5T)cڰL܉|O?e@=nkb`UNh󡞅[m^!p ରLi_Džsifr{D#^P<1sQp9?xXK&|n]^)+S ?^-\z8S=K?0ftpj ւ[%_xC|`,w/cψȉ2x͡ɱQGWb(< `k{PcAazOsMR T @0C<>݃Gq*=w#"4S8 F Z)+f=W1!`M?`3zs EMD{@Mo7fsnQ{<@C<3vBo= CXt` 3n]H+9Uj0 QD[\̡P(.e 'iu=H0#AK6#g7C2S$K ی<Ӑ1-]+ "TJnVopO-:E3zW,ZA'Wī+&AUu #8(M:;Z@yK"dv>; VY\ҽ"@ȸD.):|bf.z0(OW#ZUpk$r >çaF%~-bhTA aqK#9w|UK1kU&S.n0xB``\䖝PXPq^^qfSxI eIՅ5D, @nA] }ͪ陨KO>ɭ=Y b|)RQ^O teRAVJq7{\nuuGqrR>Ғۆa>|4i:TWbYzW_i]d6%>_-dcFe c-=WjN"RE-n, 95VEJ~ E4PM9ְ _`wX?,XT,!5<ٰ6-@ NF_bo]K V G8vmЩ0r&0RqK٬*4EΙu:nAw((9Q,3 ^";u%tF ,8XD(+8k7}evG󛚔|Mi>0C3\lx՟y U}['%)/oοs}1HQJ/rόHɋ)@DU7=ǝ? }DѹJcԁ# 7mE-LU|"= 1\“S3(N">41V{oCqL7v5BDk\5JB-0Ԥ#+7or^5_D7EKd~.%'ވ+CQrEȷ»̷>rb.W)vEcg.*.!X%/ɭ{,RbhoQv' AK i!!!!\77X Wݮj'o:>04Ym\MYu;8׺CrEܻV2);૎B+Î+br?*g$m] ݚqS'n@}r̐$ewd#|k L̝1oHx\y0D犗i+=4;ߧQr p!:dDer030I;Pk XuVo酇ĺS?b=e%٫M+XYQ2H x&h/ :Nk|Qe{oGsRk{;Ֆ?X#6?6ׯs8'?5j5FFc<{1Xpه}ft;4`}1XkaJʅ(}:]w~Yj'n*攲U?F~FYۭ5 :T[zImy jgp"a4d6|CޓȝŒ֎VG8pX.;o ?$q T;}^FF دejQ0; \#F] ++ClM`OZ0GZ-xK#([Qxv`czϧ7;դ'l23,Dg ^Y,KO˕֢\e73b}` @KW^ԞLZo7Ϯ5{[iFu JHJ'H&$`o{GHaD;vQs[{+g",z=ڝM<,,(1<&õ/IKKFᥑչDw]ܸqJ;'O\M_Ƅ9RQWXX]ζ͛V-5'Z_Y`ycQQvpmjS .JQ0Y{. *02>U/}#>):[݉v*T&7# N&#+&W]aHs&pGL6dh,`0Dp~m斦#cĨ$HB ֲeenIQNz$~nh{aӱWS+^! LP Uǃtw9vc4ݾu=<s}>:~AL}WxR aTc"iȟ'T봝,6(,&=05;Р1Ԍpvs8x;\n;v}À;?3w]e\=sӖlZeO3.i߀4;|*,s{X͗l^U#Wj'+NڝsC{xoG@(MsO[#] >۩OVX|y9txCҾK cN)0/ĺݷ}f߱N ?Qf=KVCWWe(<+{wWt$?aO?_wΟl5/l!447~) p?Lzl"yz #[ t!ڇJcO1Aa5ʲV ~ؙq`7=$z>y;6 vr9i9 B,D~:i>RVFBwR -hΓG$=q½9j.++hಡއ Th=DN*i=QH8%++PV5S(NvѶm'{~Վ. }oꎶwq_l\6~I~_l傡L#çw.کeߦQ_W,_3KGzT%?oJf̋F/6ӥXGe֣]^ }~3ۡDNjfԲqxG&]Zʘj2P]mA,DBID3EbI? $tOOeG2xTkn<\VznбqJFY(qZz0T0:#fa >deQt91;aF8%hwA)~(j[3 1d9-P R0՞̆ x0F*Uݕmj_4g-r>\SyoƼE7wͲ5 endstream endobj 174 0 obj <> endobj 469 0 obj <>stream x]mLSgP(.$Ɍ3dFэ6s*:PoRJ{n)}$|ĸdnSY0bdYV]r'9?98q]㽷i}f5Y$g\(`AA5UH_+`%bES'j[ZR]m#jjnH \T69H*PZn%ݱiZy{MFZHup \%hK/p_UuTI \M +"@`WK#ڹzmʰXwYXvO/bX9P{Fsi4;_='f0e4pBO4ݜyIaK=`gsoR* *"o:h-oUYe! ~k B\8oiZ [Z]b8bdvN)}yIaBcm 'G0D";p$V%J* \)u|(QxCF'2/i^ov{nM=vA)㌖ىV2awNID>>feW:F(cktQg@0xS$!7&\q6!iWZL]YjG2PE İ6)A%WcqС,~ &0zwT ͜ GC3_F!' eLe6 5hpu}#˛n.=>dzK {"'Rr0N6S3U[{Uh-Zʯhz$c<3s F[Zպwr&,f[ӈƿBx0잒L-;zaZ 8;>>{f-N#s`s86R"Ʀ? Βd.80I6i0o,em' <n endstream endobj 42 0 obj <> endobj 470 0 obj <>stream xV PSgO C^[}jk=:R۵j[T/\IA @BNII8hD[v:Zcw[]۝n >n켙I鴰Y4:%YZp'kR>wgEaZF-í?je/\:v}9WˎMa /eib:6{+VD^/ naYJVAl"-M-gg+xɜ]*pe,>-h4&TKJ_[]4Z*m3m1-NJˢ%ޤ%ޡ%6RhhӵtzTihaZ1a[¾m O XqG"?gܰ¹Cѓ@C?c3LUju9,&di5yMmCN3ۆÁ}G/6ˬJ!5D=G-1qȟ !:mCXm79Z8vuw+i&_䀠L"m&q3mjrJ.TB,:t#T\a\ JFA%zDtA0g,6CB.MM]}ۈ]Sp 0P(\HsC+jThD=h aN\olVpqf= F}HDy!Ob͗bb `R١@ሇQb%KPOLE?2hTZ캑ܣ3P'n 2rsd8QWIC ˴:LԡC~ 7 $E:szxoVz$r)1mh7sۮʬx+ ' 6'iFRric4z퀹3(  3hF(!Ŭh&A|)JQV;xU}NUBYa6H!X}}F_'j{%-؝z6؏ y}aS|9wnF_1)ȼ zCy!]x|N e(NgқZjJ\s&WI1z+|Y$fx 8bj5b٘NYz+=@99nQ,gʊKfB#Csa[60N#X>J #j21u[` <vz['KXBzx^jFɨ|`0? XzH%/4&(o' '1uztIm^QhxB[J 1P*.X!/N'9IbK&}A1h!mxT3䀥?f6зw?;kqѡBtoA#ǷU}]!O>N."]a #R'd]N_koqL\%.^) ߦz7IBJ/{hV>#->i[[(T., BAWe=fjyͪfQbf#:T 8bT(z>dSȭpkƐO(AקU{ ɩ^9K\1FY7>0CL;_l\Nب.pJ <Nj1j0Z 0V_EH\~g]1؋KK$ȗWky E54mF׬ #}W#a1Tq YK5C+nL(|ϧ tqr6%q Q83eژJJX+Lrڛ,>m]u`5$gd3]_(Z^2 RE F(Bxl.[c]8/3ʼn7M+[_o7w@ QUpKYCSPdE_;-1v $FaZΉLik(SS(BʈikNfX䢩3jhbjbqq?`tW6PJ#SRzlDh^TpiwC6`\E zs3`(gurdl|8,QʋnF[sKXH2Y2=0U"j$A=<~` ;H.); 7*mpe+Y=SQRFDdGtT`"eIo%Սfy2tg  txt*iI/1B AsI,bT§"oPP860Q ]d n 4zI.eœLx[t%[4&z-DY?^8*@ԇ[T:Z}N~wZK[;%7Tev7C:\5G)cݓ)c EC'D#gOM{lz&9J'6yxﺭ--?_Qd7971JGJΨ3 ӁFEJJSh6NA%RK,r9*[] qWWNnQj=zlzأpx>4$z=O~F)u_E`f&,Pb/Q"ܛߡGѳ( RAuWVT9ZZ*m"7=MĢzJZ 'ss{"{QQ4?r endstream endobj 152 0 obj <> endobj 471 0 obj <>stream x CMR5%;6/  y^WRmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR5.CMR5Computer Modern+12 P;zrp~oop}~poo}p<"jDKwz_̎Ťl!Y_ŋŋ‡ #Y!< ַ UaxM{7|Xͼdzŋ #(=)Wqlũ΋Q)7QK>JcmeuCnb  7 } endstream endobj 40 0 obj <> endobj 472 0 obj <>stream xX Xײq`EDi5=7qI1 l*6S Ⱦ, Qq&FM}Fc&zM59wn~>>#c 12_4}xqLO|Md(.C0Q#3r, $&`WDWֳ'ϰ6_onL_;y{G[ ִiaaaS]z=aywZ Pws`U.~Ǜ&oWHG}G?0s/ ٵym]В!B\]WFGXsZou>6.0VAc/f''KZg ] P:o%ľ ٿ-Gа.Μ^Y=6 ?aE'^*ŋʼǩIpuhhp|EIBR挆 mj]4qr?ߠP-m.f1&YFr y1GNw-Fyp򱳩8gU'i4F9CMwRZfɨx^\&^'4]|!mRCy  =ԛFB40Mp*EfORD5PRYiLFl1CF\g*XQ}z5L|ROPPZ;)(N+ʼn|v.h!+pw =Tn6. ,,q"%-bHg#fH E66t{fs2hvTwTEߛYCeS%U2pGTRV4)Oͨhmzbb]o򱹚0UTuMnt&̪ R)f"5@z,T)` JMN@&wNb#:۽9\t|eT%ڮtiu_#i7ǒ!NI^=DB%7V#O+k -GKW)GeME7u nh!ox"#$FOwe)nr_+=8_K\iTQSn;&Ϟre̜MvT&=Mc$$*Wɀru76.B9m-܃p؅翑oM٫dC<{{Z=(L8B|4^ fiJN*Β 8э:$A/3q.O> R<'9ڢbmJЂ J˫"\Tk{Mm[Voedx%EU=AsW[w߿՚>~>nYęIF/5t06m:]Lgzţr;pN۽D%j8׀{VfЉ[Rsx~^G࿟oEBxD!=pjBC٨瞽~ ݆E4<}(!bw7 R\;OzTcÂpMBF74V@Gн QƓHӬifJD.vcbcPoYQrTW"dmg0| 5Ջ}uc/N(?Z6?k)-+R>Cwɓ[r!-4}:T7HhDqK>ɍ_? SWG G fe4%;Ĥfl%MV|C" oJz˚e"gFY=$93իy'_bAlүg$_,9CC~XaaTuǾU''&SFq3Τǿl[W_Qif< [v@=1Ғb ܊O:zow=]bƕw ۫3sWWm r_=}ĥۋ>IA{XˀlMs ?\Omwݣ%$1eaϽ%+`lu*TzLXQ\/,fܕ&RRӀ:9NIu%KD_L}fw׺bG  Me1.#2M2DQDSvn)O,Z kxkt+\qt"I Mp0Rڞhj\yshd~7V7o-Mwl\UJGbh0H[F7E6nb?Kޥy9G9htQ֎C sU>~[+ nbژtevrZ> endobj 473 0 obj <>stream xeoLuh'b'*fzl3nd8`tvpk 1럧p-W +--L(llL|DؖhLw]®17O'><qs ?X` "jR,_oV/]"7٥rt)aMڝ}iy5HyH}n71޿K_+J. zͧ ^uXw8 a8x24vk.x2 f7v!TyƋ ip綃3v%m49Β:C@g>s'F9~<'_ 8N/n41pg{-k̑EL- u~!&2+ᅆ:si3;TpðÉքqQKPiM!7.] endstream endobj 33 0 obj <> endobj 474 0 obj <>stream xy \S׶J<'88TZk눢ℊ*  !d%̣2LAĈ󬭭ֶzV;XvhAg"az1]iG[{qDK!]M2:S̡>2Rtp@F*G- v̙3&Nuti;?'g2?@N}"bmyk<_ 06?'',vQpPr@۞ 80$2'vYOX0 9/ٸ09lQ%DE{xn[g\WX-p8~O8eӦ1͙o`Q f4ìbf2g0㘵ƌg1'fld21gf2qd3S%Tuf)3yθ0˘rMcz3}@?X0A%#g3<3bf(3LGҗq1a̘{^ z]J3[d`ǼU)ڱj*G'{?ۿڢEo0XiHV~p'5wVV?[k˭?en9|1xD;Bb#ťR1sܗq iDOkU:u.pQfq}spH}h#źNqc3Hf>6h/{x|+(#u$FfiI}z`2zyJN߈<ȝ=o\К>}XX5W ia nCmdX2/ܝ_oEEeKhVxG"։}y,ťӲYlZ6^8.miB"wd?][|ob:lG7YѣVK2,ďT- a qdyq,!ǷqOq@ OpQQ~He#U~6qӀ0D.XtTF5$;SrȏMhRwV.;l1=D'Dz\8ي4]\b iid(fÌ.O¹Ld_Gs<3FnNԒqAb0[brTNp-'d󺥻tP6k; !*[2fqKMQt*E+a|f>"BF QBW,̍<~mNCd]c&6P%dex]J,^Q|`P ^r X܀w`<٨rr/>@;}<ùi}bx $-`˦ů/B|k[+,)(M,Q<Ă:!j@68cOڠ(yu>nT #NCEG{I1.YWNʠo2bi1p:/eDJ'NĦ <+.1^X8Qaҟ3v)>^贔Y8zY9Zy+>ќ%o ;tc ]V~F Z|/hyGW^[N;ö .E/ݥڈU/ lY|CS8 8ڽ'5*dTݤ75Bܠ2-x$ˊ_4s &[%+ ՊXSeh [-\ VRhkVT$:o2D Ֆ$.A 6RrRALSP\hw@!]3x1\iDohiJ8jcc|;q' 4@19hX )WbĥYt17B.Ry7fgws9#OA>cwZfFI6QEϿ^s~=̝mg$+pF6L 0آҙ–תSZMFp$qlfVK)ޫ{5t+ +b)̂J7{v鬔vF].vj!=whjJV"D 猲:M x>{Erh@ QXhZzNت'uɍJ*-}EIG=yNe4⊃8`Y f X66(UDHT,Q9  #"M1+)U9">i𧙳PMrSءp`쇂<30Vp ?091lԒQ>3JKR'jyCKrr?ut @(-C5o1B.ѽ&ąX_6O鲡.h*K>]n1Jb.ۧozh4tZJqWp8c뱑8g.HX`:<&Iߒ4ߝ`CPx4Co:^{Ҭ&[Y}&y7hfEqd*Y ʟÌj" A@}lsK2{N!I*K Wt)`B]jf~Vu 4q {b.ݾp~<HL턃%Nc5Q½}"m9bD| 8\n.HjӅPM1)*폝|SZ]xK;-B/5O}Jj"i 3 "`uZCML x8:ej)pQbMדBYX/k]oeo^߾dh`0FFa4E4ZVtk)R z*wA%jkU[9 πw1)J)6P.BV]rb tYʡ6~#Zdş~Iwް.g0b7u2X=Q<^{j8jF2X5y!o3+j <Tq bi)+(+X1$vj U:݁̽z8\\)9{º-RmVB$@aK:>^s*u[N(sN6 "CqjҲHӤǫQ\#hsR`?;Rٰ7艕ΏNYkw1'I;[kwG #Ti#6%1P)tJp:+7>\Z/_H5އ-45sTE[#R?vE 1HhEd)W?!!k$l ہ0ĜDZeYFݵ׸]__P?xObx`!!# 8h}+JCWu׿lK^WdXIM c޹a kHأ8R_ӤkR@ŅWZ:iso[Y9o̚^^)dT;BBƖDSpCwtsԫKV!]5W eP;'BRա9,^K~tJh/#qI[Dm E=0`ze˴q}#y <pQC7O}ww;;h^9V8Lx'oߤ) tVa֤-o8ШtPtOzJPRS@_ Wm E3!̈u% o:a%Gcaq~& Qn%%ډSy2n[Flv='ëpм decK!LasecccJ97_RV;h\2RmdGꞖvwOz}npQ μO[ҷ:*I.vjtz1y;[ U[Sud7$,XJK+a7',?:\,ufm~MFJaxhI&stYT" nw!eg2iH/r';8 . GH⺳bKq&?4tF\r:/)O j.%w  ШmԘƱJCf5yZR{$SCaR}DLu^j48ӑ":zzq4:LF3F)ʿ\9C&MltC 2鴇 [61[kNM7e_X$/6+졂p/t?L={~݄+Us]M,)bonP!ə>0 \pM$;zpwn!}qF$|NN_Y=&1lX=NP$V[gqw&LȬ϶$O>"ɉsكN5:uῦ(|FiyӴ4Pȸ uҸm?~n~۽JD_µBc8DA^Kp`/ޭA6W=.V drq@5^7'WKʁ+,VgN񻧫K+^RtД+В n$@ٰL!4!露@WzPi8]93~ft? x EѦqBđS ,TgkAc#?j!N8PáښS[ѣ $cIo #K#Bz"RI2' ;*T"YJW0cOQ_Q_Q)2ʤLm+MѮȀ4z^> ?2G/*#ÒAO]گPGh4BrjCRVԞ svT鱤/H&:ɅIeeVX]!&JE}J>r@UJߵK%t ғ@Z=ʒ9a ~eScÏZL%*Ғq:*LcI'FVW%J9?Y;UF^ZK[cʷnIcں] 4pMOe){=v'KYƝ7p =y3q [n%B|ėʶ{g oTWGdž@ _|}W<$[Yo.245Eq("H iϹO*B[P3Ƴ`̷ΧJ1InC _Pzh∇,},ms\r >-.܅Rlٚ2 8sǘps+/6rƋw~ooRhn(P sC}trid2j[d(9p71G^D'ݒE;`s.cg&E%wQb/Oz%+c co#T콬,6_GgJtSU]*PPkB`;F%q#Cz(w4{Rٹg1=.qJ_)l9j*ф%h6[>&'OdoVW_؞r23`g,WʂBٜlFE-@~ D~ endstream endobj 118 0 obj <> endobj 475 0 obj <>stream xUmLSg/-)2?r lTt[tLFfkL3J)^@"o[ BuNc9 &5m0f14pc<} K)~GsssqOnbB\FRGDmQ<_[ףq ǨOsroJL&&2&q0MqAkz4^ a'AcqIa =kD዁,+@? QCnC|l=!p_ӄpn6>V1/t~tS(z$z=1ǔuOI峻1z[>n^mm}Ef ^{ lN|V&m&)$tߑ.H!է.bW?Z}3? nPVӑhrb^H^('Q?8p(Đc$lp: pni| PpuJ C#8ӯ3 Ol~N8))([6ӯlAHu_p)isІvcv<ֲ6kʒV,Ixrs9~z6K='kӮMLSWb7  endstream endobj 26 0 obj <> endobj 476 0 obj <>stream xu L[`u3:4ZFAX.m(B&Vb`km ،6!% MvCZ u6mn*I5t`4~DeAɶ3ͯ;H~gpx EP]yit+<[e$ C //{s#FϬxHWq}ƆfcjV+N*}Y) *wh~R0GSX>)ImV(fwjE9j87dV' =j^il_xOi4,=guHjz@7kjC=8&S0hցM`4i:Wg0u^qJkTԪuWzFŠ7锦> doBQugU?L4-Htf#$!%d#dL2!D%h'DtžpHCU5kV$/Y|QfeU3>xOzV~P4_ɕ0,q1H@ǍJK(Sg :\N4?`q]3 g*B,CWpWrtiAlySeh< 鍂:}U.\rpr3u7+qk$|h.PJXPw]+"󿓹&='0[Z؃Jcqv:N!9JI|Cy_'s  f㶺)(izn62A#(K<]9UrMQݒx.}>Hq')xӋ,> RL⊆ R\ K.?Zׯ@ kG1}[pX6 > )Mo܉eiG$χ×iAXW()RAPw#% T8+P'R4Uj-=*f|B r  "3:Oa; ܊˯ ,4e 4~M~p&Ԣ_920Q51ޑDm먾|u0': endstream endobj 24 0 obj <> endobj 477 0 obj <>stream xztWä́+@F {1 ܋p"\IH&۸!-&$$I4mzhШ~& J!G"4h:(!QfM2ItDGwe23I/QInS=("5]:ȡDٸlt,1X`áؙuWCȁ}pU:p`ҭ ֐T5h 0/+wئ=@!y_ XZ)'(<Qj.h!`Jϙi_R(/pwkJO![V|xQw.u)~_,AhcS޿!d/~t}bOV# br!+A$59`VͻGԎ6>&zNB`Ag$d $p[4n><ŏ*< On$x3ma&Qm{cߏ@_ʒJķ:zf][ UpDEm{"polpw2:\Ģpȡ#\>;No @zƖG,hWlV*)C$׹^$R( B3bE8UjHqǻJ&L%Q ` mGzwٹcPA`Dh(Ńd# Ι Vn Yf_ѝ1Hۨ0-,^sȟޓlď<ν73C7#C*50:!4GKCQn_FIH14jBcM: yEԆHy"ߧ#104Yn2Ju>+Bj}10&Q0tw[~P-?z}Ţ^4XpdeKHYsP[ -pZ=k }S#! 6KMuu5n<]FىyЌtބvxICMؠNZt7Nz4H.]nOӓv妡0+ ؖdF2zSG(BYXl=WQ@LFKyMYՂl~`>Ϗ&Kvyeg.oq wQZNC()2ɏֆNSAbT$%+Ggx_qpT"WZ-<$5'Q/kϱ<`r H:QWiZU}_',qo,N^6#qԟd<݆c)TV" 7+w& 3zlF3/s,f0zfh# G/NY J.a6[q~Ow?ڼk\Y䧜KF7|~֨'v@UQ25Uh'~ "Ԏ*B24KN<3aJ!xv 鷷-7]qC_usS$x =&q8쫮EHj_wD6#o#Sfq= ;n{g){fA/Fwٜ, %Bpخ隔MdB!{ g;ިN^@ulR@:U&:+s./@1rȌצ@TJPo~YЊzw8Nܲn|k+s/ϮI4d n-sdEWڙLm =tUjQGKXREVM>A0 8Bu|ET5ެ @ꉪ U i8aҧ响ѕlvqKAQ#jt 7,r,]Wn2c+O~xhvmC4e"_U1-%9^&T3M$_oWm\$PSY]O߮T5#:I)Zf̻qd p f#qwlh8|6IZ7,Zfg=rˢCvHؤT|;KO#8%ؐ^D:Xd_4nKo],#2̂|^#D-(ݳPE@u()FmB, zb+f;1" 3(GoCD YU@>:}YeZjMUѥ(cMϿ-+%KN Z ȆfumOڈJ.ÌȧGןEu8+t>2MvaAF|(m˕A=bmXDy69FV"@W|xv JZժ ];7 V7R2sl{y ddždoKgn(7|#KEYn,K SIV;)l ZiW}bԪX퀅ȨU.l2@1gH~hL!-!~x2H#f-Ԝmb28"R{\ɓ-LM&0dK Mh9o硔BZY]/tNxDL83\֡~I$ *WqA&#7N݋Il_+j;FF%g:J:[M!b P$|FH xu]vzRwwt^tUSW 4ijEhyƁdLFA }L=ɳSL43*kBp]gd 1>&}Qɸ.W̐z&::8F#q@5UnvIԨ)2 O B[U;a'lu)8H:] 4yF;ⓓ/YAehn`A^Eu" ?lxL8 |6HXMKVSTɐ[6)#$RieJQO!XbNEx<~{Y7OB R4ME. ÎA(hK'Jl)+٢d_ |~>>ڧ+".QaLDqdUMɧ~lazV |tp!p:fmGHyԈvf*/Pz΢|!ߨր0]؃!ցNJ&RfҌe1s}Lh-S7џC#}p:=@ .2}T;i}7! L" Dv,eK:5߱e熎!Dvlv/¦O5g ]m%:/E)W]xZuI0Yж[?Yo!+*CY%($?;D_>_fs\^vˡҿJ`p!$'6[@*@M8,I_re IN6NWe_{ * \dE֣랓`|_X9OejhyUHOAΝd]Rd|z3뗎](`@2ڋDy[_(SȒlnj QJ&5CMԨl - iЂFeiYC>  RdeA>S]'ǗDXl2j"hJKmȰG-hBDxa|t-*> %߉ 2 $x#[M󯢸o -K P+'5ZĪ=߭gLBZF󗯐$&/Pβa#C]L:272>I.*Z >?$rcd3>*\6VUrhm^ ~8%Dwp*KLS ;x@yU4! hwRcb1JDZK UzC#1<јZhrQ~wGOI%E^c%KK'Jƅy~r⿵iB$6c _lVW}\+AU-~I<79>x~ %tUL̽)掠^Hw׵"@}Z(ؖ1/=noGz ߂Mb,mՋ ,29\!IQz=ZArGOȕ;[Y,յ mxZj  ׇV\{es^Dk@ZatJ뼐vɱj ŷ*}臻-6&E9<b eŵ׷͝nE2z\5VϞ*ZF,xD.'RX) D)2k$ǼDg}6[ PkZB"7Xn?YTAr5MPΎ+.} \v$Mǿ٢h)A*=KgDT ;RKs!Z ^/pf3 ,%IIJyi De9y鹹:Bk=Ly;";(wCYvf*1alx>H:gﻗ#1°ۺ}e VpÅceÅQ`,'*hlYܸ.J&>!W`lh#˦?0<,"s/q2o__wcz2L8k_ _ZkR=lwr}uZ!>&!1xDob[l3wuAWҐZ]闢+X)`}w{[f_!N(QEhM(-05).5e Q՗T^ɮ ~'9O Rh/z~Yu3/;bΪ9;Q5f3qC i=.Z* ܶCNQR!E$F)eA OeӢx WJNIF4]'=Z84|0CW@3N~I;ɾmqps]N\ZV_?1䷑d&+-/D!%)Wl^ߣFd(ꞽ~΢3`j[/6zy}j~ S&&L^^xwVCO'JtQ7#ow) 5wniR1tOC*%ITBw8bq$Zn(a~vMzm[ϛᔓF;wB֥͙Kl 3tMдui3d_e۸(Clf;^]u0V:`i?}WvN9?Rȥ}K%֟ ö٠ˮ)1Ic Ȗ8ARGdSovq<\"f4͉9 ml,lsMp,t|TuxOA1;J\ӗvfƎ1S9kE$?pͮa$.\x_oyCN`D>:Lv[H゚e330gǬD=g ˶OUGS1HkªODtjZ[^??+/VE lS8P3.hpof<~8 Yҭd||!-R%C$HcK[_2"O\=]cN~ST~ endstream endobj 96 0 obj <> endobj 478 0 obj <>stream xM[OGg8HVpCwWBIVʅjF$',xuwll˰cNZI(/u?@>D"4љotGF\V.@G|E Un֚)d$cuW>.pB %;/ <;c>[?KCC 'ó6vil,#.}?E:aE;= ?L79Hߵ:99s"ӣûYaV#

y;Vs"Kл<'%aJeFdQ;&$dXXZy k/AwY Q@➷~򩹝FE~?"cc{ccBbLIIʄ^UO$kaΖֳZ9\5R>%,%fb4)eU.kry}uRpe#dD ?Is}5Œgᱣ^P;h]) XW_DUGPӫǞ^u4Su$Tkz*t64>kFm= OQ endstream endobj 17 0 obj <> endobj 479 0 obj <>stream xkHSq]QOAv9;ЬI .EB wr϶JDݿ,-JIӦSiDJ#C&#/ϗ}Q0<7r(+-v~vC%⑍ Hơm@a& JjUX3::.,j s᜴,#C2꣩irX팞>i6qteHҘYKXbH Ȁ$\A)ʰ!m+`ǽ}!a#No,UX!}$6o5QAiҩy8y8 x? X}C?Xb@]D(*]7 뛮HR{d`94OM$sA^ޱG×٧!>}$Er-nkSK[#yaB"@K)BT`C Fl5N*P"RU|bg_( 3)DQk.owtAMBb2d;]_鱴7CkݰJ/ƃE?dA!/aj$z:RQ&{c8+m^O W{ A|<@;}RA׍ccKFwb) endstream endobj 89 0 obj <> endobj 480 0 obj <>stream xmTLg땯Dm^D3Yܔu Ԩ0F(PB{宴'A?ڍ *6@ JYpe6&M1f31{?vdrO{y7GSZ E42|-UQzHP>)RIp6*qYrV239vh+8fjTPc,lVWqن*|FYmK嫌ʸ*YEpZVcѷI;\Vhʭ(}K3WRP5zJQ۩T!Jr jJT}RZJ~MƮ9h;s_Y@ &)A,OJT u؉kp#n+'HB[-Žw9N,4pXmmyωY,KW/iz9h>0\Fj)Or;voشymYvb0I'إ|ŵs:@Drø5Rщ@!<--'0+كiUD)\agÐ<2ٜE|n2i.ʦx*;gRi ('ecQ9y{;;uGvL͆ YP/նQ)|xˢ!uۄ۰]u1wс:Nv*XPSh󾦯#>‹q?>KS7y8p7aߠMjQL`S"]:ynxaAϑ> endstream endobj 15 0 obj <> endobj 481 0 obj <>stream xJQFdv6 +Mj 827&"QpanDn`mtħ~.RDJ/nӋv0ޥg9-NJ+]ە/} ojk-ǨE;L(JK;V [lŢgdl&Ty,Κ s瑗ٕ]Z8[%ZCp)v;Up4k AB_R4~ NGh?~_;-B?#@8yz0aNCBІ hylcs~9am$> endobj 482 0 obj <>stream xX TTW}EI"~F1hѨqFEb(@T%2SQ FDcMwLmN׬[:ݫ뱪`{=>gfd2%kϱLo'V?0c<b,tœ5dQYK1qa!*שn/ϝ묙3. v] P?"]aAdש*U̼^JJJ?C5)L>(>(.1h2eum@Tͷ%ʨUPha/^\,^21)`6A!ü6DDF1}/zymf"3YǬg)f#Lc|Mb]f 3̼,e1˙Jf*3d0kΌ`F1ь#3ˌc~33herYz{vX{}WMܳN៌X5:r;~Q 9jFO>u̶1NNNN?6dqIؿ*eIWHunA:z9;&q\v GG&ZY] Z^tr&i2՘ q6?ؔzBvIf;GH<& (`Xd82F]K)xc-(,p⮼"f2a55m8ԃ=Lq%#gVmH^؟G?k n$?ܿg賂ŧ`M!!\rW𿿾qQpcݛr<+or9Hr'6df炊lL75UtFXWoJ?( @\HbkPX=h=2|_=+Z5W.@/\t+ayl M2#܄W ECg yk-zE$C) f "Ѕ~.. Zw[CJ,fgx9XneP4v W()Э.->"4bGXr̖{ ׄFbZK飁ZF!;6mB|:-飇g=ԥ{igg2m7qV69"챝HlMAa&Fg2+`']@`eH bpY0W4ȹ8m'mJ(e,M3-`pzV5e72}ɮSP/~%(es'K=A栃.R<ݖ ʄisc};Eih:C /?j4m;͛;CeBddf{.rxYiT(Yd\_qr ޶PvYh[bJ+ ƦVsM7g.r㵜m@-]t Z7lcl7'ZmG@[y" 6E7>Kä 2P\Lm\Ӊ8H28't PhB^c pkfƩ8鳓JN@r˪Qx&f~c!l-&:cX:']ҟمO/riI@- ]1 PNƮ18 [}8g@_K/S 6?&Și#3F3蓆"uiF&/_#LN-[u(Z9/Aۍ]áLЩ8G2S"qĥom;XhW=sP[$$@[ܼ欍67&8V\qj fZ0ZG}Ga4,).9G>7=,V[ %Wd쮬2?_!n-M]-к$1!.7a)>'}v|vǮ8^#Ӷ܀+~πo껌*X`)o+x1! 6RF%Kq) )6~+"Y/SZ'Zx؂ֱ8geH="n7\惁0.Дuc8VXs["(O,Oz ;tA pL7[wBEj:di%lC8w&bvTYWh(ѵ /"與4:܆99HOUsxt*"%Yb4JiP!tdUq(1Tܥ|Z><'t-,wswqQy-(ty?)ڔWF'z{jubG;=!\d$UYMa[x:#( Zj'}Hy (]:}iPrgRGO7o~~q_޿H"ImJ| 4lְ>Q WtnЯ؃؉6)հuE%h$o hMa85rD8g)g8Ie=؋' `RXTTT i\u0H5ze*\$rhhCׯȰuytѶy=mg%_T!U0 |epڑs6m]u쿀C~yU&hh4ኴxPLP%"|U#}d{HKo͉/^&wx]P^eTȇZǑܱC:9caqv껛rr,qU@8EgF?B_b | : )MSouN%/wCYwuyS&~CZ:`L)ÑSPU1s}yumU{ B˥ MG(x}d%2sDE .Trܑ^9Kb+>0>3n^;.[445XU 1ʔ@?A|u[+/OY.ug&[0)fo銨L N]1|9wT1*RY[C#ްX%?O?KBs v%Rg ӧ9fҝjgT5[7%{=)fmI}7˩uT=|ISϑbED>Eu5#!t^>UfID OfK6BOpԈ# KPYNAX#^79 .W;b endstream endobj 13 0 obj <> endobj 483 0 obj <>stream xW XS׺=1sDD%^{BEتhiEQԪ8 2K L aN'<Q&DDDk[mkjj{Nھ/w>{-ӗ)!B І cmG#Hu%B(yn4yf͟;nU<3S ?v[e^>(o+!K̉6[&[>m]DnOYngimMopE#(jƪ`cmeohP9 ]F'bǢ|Y<#=^qA[!ig$t@Un]@o`"bY50z4ڊ;Fə+ vop W Ȍ2)8e9h F]5* >`6[sXhDxBJ_I-8:%XJ?]/ H"[H,b?NE#S4x' ]5n۴rCK{olnJYJm;mvb9[}f[5e5Imͩ:`,5ze@G8|r#ϸ - LA{<NC4+?;7 %&܂U ZA XDUbJ/Eͺ\Q { f:s_r9:!|ށ3 zXZA#kd6le!P (b-'NUC̥|=ıȷ;=JK+n8UBv<Ƴfn3ž^|ÚW8l6qZvw=)r&!}5~@[dQ?FyLr`'`^Qg5Hxݜ;b?cO}=^A9BSDOPTCz|s`'g'.[kȆ&X! qo=^9_WSzU7HbaT25>5q N 0QPӣ:>2{050355%o,cfјqI#hDN 9Ś;YpMEsow^,8Z0zA]" Nٜ<ҙxg"%^lae>+mF"8$YIt}B&؝x4&DzKfmu?"!+@u}o'жv8=5+{ ɏ D2iؔLedv0G?^QJF3~3GubNv1+B_&H0 At IZ`pL~NW"=HsvgOS <ώ JW eSψ \Շ4nb[{n!rsR]H̀>&j=mzu󪬔̄xURF0yZEÁ.Ehclࢧa`ZD:Y|[pdA?hUr$Pșв(}miYMm6a !P/=JD wf_,?=șGص_DX~U^eDzmA'.Ͼ3ڊQz΢\jt9e9#P}$!{E3!ӄD$e4LJNYXPp=#r5,l$8kCVQHU FO2y5'_UhO@1)AuN8&?M[ B\%7WWכ-s WѝB/d^̵W!̌)\Z6%H:v!;.IKbr .qz͝-#EQD樏h5 qڽrrL,!Af9FH+YZm~WP{Mw߰'%ι9?7 (!5ROZÉ":4t:Uj㉊ Uph"-5!B>xX~%6<=WW @(.( dkp_NKOA#^Azz zOh=]LVJzR>stream 2017-06-30T11:01:17-04:00 2017-06-30T11:01:17-04:00 dvips(k) 5.995 Copyright 2015 Radical Eye Software saclib.dvi endstream endobj 2 0 obj <>endobj xref 0 515 0000000000 65535 f 0000341362 00000 n 0000459337 00000 n 0000340690 00000 n 0000327627 00000 n 0000000015 00000 n 0000001544 00000 n 0000341428 00000 n 0000355026 00000 n 0000389618 00000 n 0000352381 00000 n 0000367449 00000 n 0000366211 00000 n 0000453141 00000 n 0000365434 00000 n 0000447544 00000 n 0000364994 00000 n 0000444940 00000 n 0000341469 00000 n 0000341499 00000 n 0000327787 00000 n 0000001564 00000 n 0000004238 00000 n 0000363413 00000 n 0000434636 00000 n 0000362657 00000 n 0000432259 00000 n 0000341573 00000 n 0000341603 00000 n 0000327949 00000 n 0000004259 00000 n 0000005114 00000 n 0000360648 00000 n 0000422871 00000 n 0000341646 00000 n 0000341676 00000 n 0000328111 00000 n 0000005134 00000 n 0000007620 00000 n 0000359722 00000 n 0000415312 00000 n 0000358988 00000 n 0000411292 00000 n 0000341719 00000 n 0000341749 00000 n 0000328273 00000 n 0000007641 00000 n 0000010270 00000 n 0000341814 00000 n 0000341844 00000 n 0000328435 00000 n 0000010291 00000 n 0000011285 00000 n 0000341887 00000 n 0000341917 00000 n 0000328597 00000 n 0000011305 00000 n 0000012378 00000 n 0000357305 00000 n 0000401887 00000 n 0000356412 00000 n 0000394485 00000 n 0000341960 00000 n 0000341990 00000 n 0000328759 00000 n 0000012399 00000 n 0000019066 00000 n 0000342055 00000 n 0000342085 00000 n 0000328921 00000 n 0000019087 00000 n 0000025227 00000 n 0000354425 00000 n 0000381452 00000 n 0000342139 00000 n 0000342169 00000 n 0000329083 00000 n 0000025248 00000 n 0000027298 00000 n 0000353572 00000 n 0000372957 00000 n 0000365676 00000 n 0000448186 00000 n 0000342256 00000 n 0000342286 00000 n 0000329245 00000 n 0000027319 00000 n 0000031757 00000 n 0000365159 00000 n 0000445943 00000 n 0000342373 00000 n 0000342403 00000 n 0000329407 00000 n 0000031778 00000 n 0000036078 00000 n 0000364445 00000 n 0000443763 00000 n 0000342556 00000 n 0000342586 00000 n 0000329569 00000 n 0000036099 00000 n 0000040051 00000 n 0000342717 00000 n 0000342748 00000 n 0000329734 00000 n 0000040073 00000 n 0000043766 00000 n 0000342847 00000 n 0000342878 00000 n 0000329900 00000 n 0000043788 00000 n 0000044913 00000 n 0000342944 00000 n 0000342975 00000 n 0000330066 00000 n 0000044935 00000 n 0000050362 00000 n 0000361565 00000 n 0000430180 00000 n 0000343041 00000 n 0000343072 00000 n 0000330232 00000 n 0000050384 00000 n 0000055204 00000 n 0000343239 00000 n 0000343270 00000 n 0000330398 00000 n 0000055226 00000 n 0000058845 00000 n 0000343380 00000 n 0000343411 00000 n 0000330564 00000 n 0000058867 00000 n 0000063852 00000 n 0000343510 00000 n 0000343541 00000 n 0000330730 00000 n 0000063874 00000 n 0000066410 00000 n 0000343664 00000 n 0000343695 00000 n 0000330896 00000 n 0000066432 00000 n 0000069490 00000 n 0000343829 00000 n 0000343860 00000 n 0000331062 00000 n 0000069512 00000 n 0000075156 00000 n 0000360293 00000 n 0000421551 00000 n 0000359548 00000 n 0000414468 00000 n 0000343981 00000 n 0000344012 00000 n 0000331228 00000 n 0000075178 00000 n 0000080376 00000 n 0000344183 00000 n 0000344214 00000 n 0000331394 00000 n 0000080398 00000 n 0000088183 00000 n 0000344337 00000 n 0000344368 00000 n 0000331560 00000 n 0000088205 00000 n 0000097243 00000 n 0000344515 00000 n 0000344546 00000 n 0000331726 00000 n 0000097265 00000 n 0000104741 00000 n 0000358162 00000 n 0000409615 00000 n 0000344667 00000 n 0000344698 00000 n 0000331892 00000 n 0000104763 00000 n 0000109725 00000 n 0000344843 00000 n 0000344874 00000 n 0000332058 00000 n 0000109747 00000 n 0000114439 00000 n 0000345019 00000 n 0000345050 00000 n 0000332224 00000 n 0000114461 00000 n 0000118485 00000 n 0000345219 00000 n 0000345250 00000 n 0000332390 00000 n 0000118507 00000 n 0000122032 00000 n 0000345349 00000 n 0000345380 00000 n 0000332556 00000 n 0000122054 00000 n 0000126199 00000 n 0000357071 00000 n 0000401322 00000 n 0000345457 00000 n 0000345488 00000 n 0000332722 00000 n 0000126221 00000 n 0000129063 00000 n 0000345670 00000 n 0000345701 00000 n 0000332888 00000 n 0000129085 00000 n 0000132490 00000 n 0000345800 00000 n 0000345831 00000 n 0000333054 00000 n 0000132512 00000 n 0000134714 00000 n 0000345941 00000 n 0000345972 00000 n 0000333220 00000 n 0000134736 00000 n 0000140749 00000 n 0000355856 00000 n 0000393317 00000 n 0000355623 00000 n 0000392753 00000 n 0000355452 00000 n 0000391841 00000 n 0000346082 00000 n 0000346113 00000 n 0000333386 00000 n 0000140771 00000 n 0000147146 00000 n 0000346321 00000 n 0000346352 00000 n 0000333552 00000 n 0000147168 00000 n 0000148389 00000 n 0000346473 00000 n 0000346504 00000 n 0000333718 00000 n 0000148411 00000 n 0000154679 00000 n 0000346559 00000 n 0000346590 00000 n 0000333884 00000 n 0000154701 00000 n 0000163412 00000 n 0000346726 00000 n 0000346757 00000 n 0000334050 00000 n 0000163434 00000 n 0000170038 00000 n 0000346965 00000 n 0000346996 00000 n 0000334216 00000 n 0000170060 00000 n 0000176375 00000 n 0000347132 00000 n 0000347163 00000 n 0000334382 00000 n 0000176397 00000 n 0000182088 00000 n 0000347347 00000 n 0000347378 00000 n 0000334548 00000 n 0000182110 00000 n 0000184758 00000 n 0000347477 00000 n 0000347508 00000 n 0000334714 00000 n 0000184780 00000 n 0000190698 00000 n 0000347596 00000 n 0000347627 00000 n 0000334880 00000 n 0000190720 00000 n 0000196125 00000 n 0000347774 00000 n 0000347805 00000 n 0000335046 00000 n 0000196147 00000 n 0000198363 00000 n 0000347915 00000 n 0000347946 00000 n 0000335212 00000 n 0000198385 00000 n 0000204125 00000 n 0000348056 00000 n 0000348087 00000 n 0000335378 00000 n 0000204147 00000 n 0000210829 00000 n 0000348197 00000 n 0000348228 00000 n 0000335544 00000 n 0000210851 00000 n 0000214830 00000 n 0000348360 00000 n 0000348391 00000 n 0000335710 00000 n 0000214852 00000 n 0000215625 00000 n 0000348457 00000 n 0000348488 00000 n 0000335876 00000 n 0000215646 00000 n 0000221752 00000 n 0000348532 00000 n 0000348563 00000 n 0000336042 00000 n 0000221774 00000 n 0000231037 00000 n 0000348675 00000 n 0000348706 00000 n 0000336208 00000 n 0000231059 00000 n 0000238133 00000 n 0000348829 00000 n 0000348860 00000 n 0000336374 00000 n 0000238155 00000 n 0000240784 00000 n 0000348992 00000 n 0000349023 00000 n 0000336540 00000 n 0000240806 00000 n 0000244016 00000 n 0000349089 00000 n 0000349120 00000 n 0000336706 00000 n 0000244038 00000 n 0000247169 00000 n 0000349175 00000 n 0000349206 00000 n 0000336872 00000 n 0000247191 00000 n 0000248298 00000 n 0000349261 00000 n 0000349292 00000 n 0000337038 00000 n 0000248320 00000 n 0000253644 00000 n 0000349347 00000 n 0000349378 00000 n 0000337204 00000 n 0000253666 00000 n 0000257816 00000 n 0000353942 00000 n 0000374820 00000 n 0000349464 00000 n 0000349495 00000 n 0000337370 00000 n 0000257838 00000 n 0000263318 00000 n 0000349574 00000 n 0000349605 00000 n 0000337536 00000 n 0000263340 00000 n 0000267304 00000 n 0000349684 00000 n 0000349715 00000 n 0000337702 00000 n 0000267326 00000 n 0000274111 00000 n 0000349805 00000 n 0000349836 00000 n 0000337868 00000 n 0000274133 00000 n 0000277594 00000 n 0000349924 00000 n 0000349955 00000 n 0000338034 00000 n 0000277616 00000 n 0000280942 00000 n 0000350034 00000 n 0000350065 00000 n 0000338200 00000 n 0000280964 00000 n 0000283610 00000 n 0000350151 00000 n 0000350182 00000 n 0000338366 00000 n 0000283632 00000 n 0000284390 00000 n 0000350248 00000 n 0000350279 00000 n 0000338532 00000 n 0000284411 00000 n 0000284619 00000 n 0000350323 00000 n 0000350354 00000 n 0000338698 00000 n 0000284640 00000 n 0000292029 00000 n 0000353181 00000 n 0000372240 00000 n 0000351868 00000 n 0000366718 00000 n 0000350398 00000 n 0000350429 00000 n 0000338864 00000 n 0000292051 00000 n 0000298711 00000 n 0000350552 00000 n 0000350583 00000 n 0000339030 00000 n 0000298733 00000 n 0000306364 00000 n 0000350671 00000 n 0000350702 00000 n 0000339196 00000 n 0000306386 00000 n 0000310864 00000 n 0000350856 00000 n 0000350887 00000 n 0000339362 00000 n 0000310886 00000 n 0000312778 00000 n 0000351008 00000 n 0000351039 00000 n 0000339528 00000 n 0000312800 00000 n 0000314590 00000 n 0000351127 00000 n 0000351158 00000 n 0000339694 00000 n 0000314612 00000 n 0000317190 00000 n 0000351213 00000 n 0000351244 00000 n 0000339860 00000 n 0000317212 00000 n 0000319390 00000 n 0000351288 00000 n 0000351319 00000 n 0000340026 00000 n 0000319412 00000 n 0000321301 00000 n 0000351363 00000 n 0000351394 00000 n 0000340192 00000 n 0000321323 00000 n 0000323281 00000 n 0000351427 00000 n 0000351458 00000 n 0000340358 00000 n 0000323303 00000 n 0000325621 00000 n 0000351491 00000 n 0000351522 00000 n 0000340524 00000 n 0000325643 00000 n 0000327605 00000 n 0000351555 00000 n 0000351586 00000 n 0000366957 00000 n 0000367786 00000 n 0000372469 00000 n 0000373254 00000 n 0000375385 00000 n 0000381859 00000 n 0000389892 00000 n 0000392073 00000 n 0000392964 00000 n 0000393553 00000 n 0000394857 00000 n 0000401533 00000 n 0000402476 00000 n 0000409855 00000 n 0000411569 00000 n 0000414695 00000 n 0000415703 00000 n 0000421794 00000 n 0000423299 00000 n 0000430682 00000 n 0000432684 00000 n 0000435219 00000 n 0000444053 00000 n 0000445169 00000 n 0000446218 00000 n 0000447767 00000 n 0000448549 00000 n 0000453502 00000 n 0000351619 00000 n 0000352274 00000 n 0000352827 00000 n 0000352928 00000 n 0000353467 00000 n 0000353849 00000 n 0000354917 00000 n 0000355359 00000 n 0000355769 00000 n 0000356044 00000 n 0000356904 00000 n 0000357218 00000 n 0000357799 00000 n 0000357892 00000 n 0000358551 00000 n 0000358660 00000 n 0000359414 00000 n 0000360208 00000 n 0000360560 00000 n 0000361154 00000 n 0000361263 00000 n 0000361943 00000 n 0000362332 00000 n 0000363080 00000 n 0000363970 00000 n 0000364179 00000 n 0000364825 00000 n 0000365581 00000 n 0000366126 00000 n 0000366615 00000 n 0000457881 00000 n trailer << /Size 515 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 459542 %%EOF saclib2.2.8/doc/user_guide/cPAsI.tex0000664002275300236100000002001614017255270016330 0ustar wcbrownscs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Purpose} \label{c:PA s:I ss:P} The \saclib\ polynomial arithmetic packages provide functions doing computations with multivariate polynomials over domains implemented by the \saclib\ arithmetic packages. Except for the functions listed in Section \ref{c:PA s:MR} and various conversion functions, only the {\em sparse recursive} representation is used. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Definitions of Terms} \label{c:PA s:I ss:D} \begin{description} \item[sparse recursive representation]\index{sparse recursive representation}\index{polynomial!sparse recursive representation} A polynomial $p \in \BbbD[x_1,\ldots,x_r]$ is interpreted as an element of $(\ldots(\BbbD[x_1])\ldots)[x_r]$, for some domain \BbbD. The \saclib\ {\em sparse recursive representation} \ttP\ of a polynomial $p = \sum_{i=1}^n p_i x_r^{e_i}$ with $e_1 > \ldots > e_n$, $p_i \in (\ldots(\BbbD[x_1])\ldots)[x_{r-1}]$, and $p_i \neq 0$ is defined recursively as follows: \begin{itemize} \item If $p = 0$ then \ttP\ is the \BETA-digit 0. \item If $r = 0$, then $p$ is in \BbbD\ and its representation \ttP\ is the representation of elements of the domain \BbbD. \item If $r > 0$, then \ttP\ is the list $(e_1, \ttP_1,\ldots, e_n, \ttP_n)$ where the $e_i$ are \BETA-digits and each $\ttP_i$ is the representation of $p_i$. \end{itemize} \item[sparse distributive representation]\index{sparse distributive representation}\index{polynomial!sparse distributive representation} A polynomial $p \in \BbbD[x_1,\ldots,x_r]$ is interpreted as $p = \sum_{i=1}^n d_i x^{e_i}$, where $d_i \in \BbbD$, $d_i \neq 0$, and $x^{e_i}$ stands for $x_1^{e_{i,1}} x_2^{e_{i,2}} \cdots x_r^{e_{i,r}}$ with $e_{i,j} \geq 0$. % Furthermore, we assume that $e_1 > e_2 > \ldots > e_n$, where $e_k > e_i$ iff there exists a $\hat{\jmath}$ such that $e_{k,j} = e_{i,j}$ for $\hat{\jmath} < j \leq r$ and $e_{k,\hat{\jmath}} > e_{i,\hat{\jmath}}$. The {\em sparse distributive representation} \ttP\ of such a polynomial $p$ is the list $(\ttD_1, \ttE_1, \ttD_2, \ttE_2,\ldots, \ttD_n, \ttE_n)$, where $\ttD_i$ is the \saclib\ internal representation of $d_i$ and $\ttE_i$ is the list $(e_{i,r}, e_{i,r-1},\ldots, e_{i,1})$ with $e_{i,j}$ being \BETA-digits. As always in \saclib, $\ttP = 0$ if $p = 0$. \item[dense recursive representation]\index{dense recursive representation}\index{polynomial!dense recursive representation} A polynomial $p \in \BbbD[x_1,\ldots,x_r]$ is interpreted as an element of $(\ldots(\BbbD[x_1])\ldots)[x_r]$, for some domain \BbbD. The {\em dense recursive representation} \ttP\ of a polynomial $p = \sum_{i=0}^n p_i x_r^i$ with $p_i \in (\ldots(\BbbD[x_1])\ldots)[x_{r-1}]$ is defined recursively as follows: \begin{itemize} \item If $p = 0$ then \ttP\ is the \BETA-digit 0. \item If $r = 0$, then $p$ is in \BbbD\ and its representation \ttP\ is the representation of elements of the domain \BbbD. \item If $r > 0$, then \ttP\ is the list $(n, \ttP_n, \ttP_{n-1},\ldots, \ttP_0)$ where the $n$ is a \BETA-digit and each $\ttP_i$ is the representation of $p_i$. \end{itemize} \item[polynomial]\index{polynomial} If this term appears in the parameter specifications of a function, this denotes a polynomial in the sparse recursive representation. Otherwise, it is used to denote a polynomial in arbitrary representation. \item[base domain, base ring]\index{base domain}\index{base ring} If $p$ is an element of $\BbbD[x_1,\ldots,x_r]$, \BbbD\ is its base domain. \item[integral polynomial]\index{integral polynomial}\index{polynomial!integral} A polynomial whose base domain is \BbbZ. \item[modular polynomial]\index{modular!polynomial}\index{polynomial!modular} A polynomial whose base domain is $\BbbZ_m$ with $m$ a prime positive \BETA-digit. \item[modular integral polynomial]\index{modular!integral polynomial}\index{polynomial!modular integral} A polynomial whose base domain is $\BbbZ_m$ with $m$ a positive integer. \item[rational polynomial]\index{rational!polynomial}\index{polynomial!rational} A polynomial whose base domain is \BbbQ. \item[main variable]\index{main variable}\index{variable!main} of a polynomial in $\BbbD[x_1,\ldots,x_r]$ is $x_r$. \item[degree]\index{degree} The degree of a polynomial w.r.t.\ a given variable is the highest power of this variable appearing with non-zero coefficient in the polynomial. If no variable is specified, the degree is computed w.r.t.\ the main variable. \item[order]\index{order!of a polynomial} The order of a polynomial $p = \sum_{i=0}^n p_i x_r^i$ is the smallest $k \geq 0$ such that $p_k \neq 0$. \item[constant polynomial]\index{constant polynomial}\index{polynomial!constant} A polynomial of degree 0 in every variable. \item[leading term]\index{leading term}\index{term!leading} of a polynomial is a polynomial equal to the term of highest degree w.r.t.\ the main variable. \item[reductum]\index{reductum!of a polynomial} of a polynomial is the polynomial minus its leading term. \item[leading coefficient]\index{leading coefficient}\index{coefficient!leading} The leading coefficient of a polynomial is the coefficient of its leading term. \item[leading base coefficient]\index{leading base coefficient}\index{coefficient!leading base} An element of the base domain equal to the coefficient of the leading power product of a polynomial where the ordering on the power products is the lexicographic ordering with $x_1 < \cdots < x_r$. \item[trailing base coefficient]\index{trailing base coefficient}\index{coefficient!trailing base} An element of the base domain equal to the coefficient of the smallest power product of a polynomial where the ordering on the power products is the lexicographic ordering with $x_1 < \cdots < x_r$. \item[monic polynomial]\index{monic polynomial}\index{polynomial!monic} A polynomial, the leading coefficient of which is $1$. \item[positive polynomial]\index{positive polynomial}\index{polynomial!positive} A polynomial, the leading base coefficient of which is positive. \item[sign]\index{sign!of a polynomial} An integer equal to $1$ if the leading base coefficient of the polynomial is positive, $-1$ otherwise. \item[absolute value]\index{absolute value!of a polynomial} of a polynomial $p$ is the positive polynomial $q$ such that $p = \sign(p) \cdot q$. \item[content]\index{content} of a polynomial $p$ is equal to the absolute value of the greatest common divisor of the coefficients of $p$. \item[integer content]\index{integer content}\index{content!integer} of an integral polynomial is an integer equal to the positive greatest common divisor of the integer coefficients of each power product of the polynomial. \item[primitive polynomial]\index{primitive polynomial}\index{polynomial!primitive} A polynomial, the content of which is $1$. \item[squarefree polynomial]\index{squarefree!polynomial}\index{polynomial!squarefree} A polynomial $p$ is squarefree if each factor occurs only once. In other words, if $p = p_1^{e_1} \cdots p_k^{e_k}$ is a complete factorization of $p$ then each of the $e_i$ is equal to $1$. \item[squarefree factorization]\index{squarefree!factorization}\index{factorization!squarefree} The squarefree factorization of $p$ is $p_1^{e_1} \cdots p_k^{e_k}$ where $1 \leq e_1 < \cdots < e_k$ and each of the $p_i$ is a positive squarefree polynomial of positive degree. Note that if $p$ is squarefree then $p^1$ is the squarefree factorization of $p$. \item[variable (name)]\index{variable!name}\index{name!of a variable}\index{list!of characters} A list $(c_1, \ldots, c_k)$, where the $c_i$ are C characters. Example: the name "fubar" would be represented by the character list ('f','u','b','a','r'). \item[list of variables]\index{list!of variables}\index{variable!list of} A list $(n_1, \ldots, n_r)$ giving the names of the corresponding variables of an $r$-variate polynomial for input and output. \end{description} saclib2.2.8/doc/user_guide/cPAsIPA.tex0000664002275300236100000002347214017255270016562 0ustar wcbrownscs\begin{description} \item[Basic arithmetic:] \ \ \begin{description} \item[{\tt C <- IPSUM(r,A,B) }]\index{IPSUM} Integral polynomial sum. \item[{\tt C <- IPDIF(r,A,B) }]\index{IPDIF} Integral polynomial difference. \item[{\tt B <- IPNEG(r,A) }]\index{IPNEG} Integral polynomial negative. \item[{\tt C <- IPPROD(r,A,B) }]\index{IPPROD} Integral polynomial product. \item[{\tt C <- IPIP(r,a,B) }]\index{IPIP} Integral polynomial integer product. {\em Computes $c * p$ given an integer $c$ and an integral polynomial $p$.} \item[{\tt C <- IPP2P(r,B,m) }]\index{IPP2P} Integral polynomial power of 2 product. \item[{\tt IPQR(r,A,B; Q,R) }]\index{IPQR} Integral polynomial quotient and remainder. \item[{\tt C <- IPQ(r,A,B) }]\index{IPQ} Integral polynomial quotient. \item[{\tt C <- IPIQ(r,A,b) }]\index{IPIQ} Integral polynomial integer quotient. {\em Computes $p/c$ given an integral polynomial $p$ and an integer $c$.} \item[{\tt C <- IPPSR(r,A,B) }]\index{IPPSR} Integral polynomial pseudo-remainder. \item[{\tt IUPSR(A,B; ab,bb,C) }]\index{IUPSR} Integral univariate polynomial semi-remainder. \item[{\tt B <- IPEXP(r,A,n) }]\index{IPEXP} Integral polynomial exponentiation. \item[{\tt s <- IPSIGN(r,A) }]\index{IPSIGN} Integral polynomial sign. \item[{\tt B <- IPABS(r,A) }]\index{IPABS} Integral polynomial absolute value. \end{description} \item[Differentiation and Integration:] \ \ \begin{description} \item[{\tt B <- IPDMV(r,A) }]\index{IPDMV} Integral polynomial derivative, main variable. \item[{\tt B <- IPDER(r,A,i) }]\index{IPDER} Integral polynomial derivative. {\em Computes the derivative of the argument w.r.t.\ the i-th variable.} \item[{\tt B <- IPHDMV(r,A,k) }]\index{IPHDMV} Integral polynomial higher derivative, main variable. {\em Computes the k-th derivative of the argument w.r.t.\ the main variable.} \item[{\tt B <- IPINT(r,A,b) }]\index{IPINT} Integral polynomial integration. {\em Computes the integral of the argument w.r.t.\ the main variable.} \end{description} \item[Substitution and Evaluation:] \ \ \begin{description} \item[{\tt C <- IPSMV(r,A,B) }]\index{IPSMV} Integral polynomial substitution for main variable. {\em Substitutes an integral polynomial for the main variable of an integral polynomial.} \item[{\tt C <- IPSUB(r,A,i,B) }]\index{IPSUB} Integral polynomial substitution. {\em Substitutes an integral polynomial for the i-th variable of an integral polynomial.} \item[{\tt C <- IPGSUB(r,A,s,L) }]\index{IPGSUB} Integral polynomial general substitution. {\em Substitutes an integral polynomials for all variables of an integral polynomial.} \item[{\tt B <- IUPQS(A) }]\index{IUPQS} Integral univariate polynomial quotient substitution. \item[{\tt B <- IPEMV(r,A,a) }]\index{IPEMV} Integral polynomial evaluation of main variable. {\em Substitutes a constant for the main variable of an integral polynomial.} \item[{\tt B <- IPEVAL(r,A,i,a) }]\index{IPEVAL} Integral polynomial evaluation. {\em Substitutes a constant for the i-th variable of an integral polynomial.} \item[{\tt b <- IUPBEI(A,c,m) }]\index{IUPBEI} Integral univariate polynomial binary rational evaluation, integer output. \item[{\tt s <- IUPBES(A,a) }]\index{IUPBES} Integral univariate polynomial binary rational evaluation of sign. \item[{\tt b <- IUPBRE(A,a) }]\index{IUPBRE} Integral univariate polynomial binary rational evaluation. \item[{\tt B <- IPBEILV(r,A,c,k,m) }]\index{IPBEILV} Integral polynomial binary rational evaluation, integral polynomial result, leading variable. \item[{\tt B <- IPBREI(r,A,i,c) }]\index{IPBREI} Integral polynomial binary rational evaluation, integral polynomial result. \end{description} \item[Transformation:] \ \ \begin{description} \item[{\tt B <- IPTRMV(r,A,h) }]\index{IPTRMV} Integral polynomial translation, main variable. {\em Computes $p(x+h)$ given $p$ and $h$, where $x$ is the main variable of $p$.} \item[{\tt B <- IPTRAN(r,A,T) }]\index{IPTRAN} Integral polynomial translation. {\em Computes $p(x_1+t_1,\ldots,x_r+t_r)$ given $p$ and the $t_i$.} \item[{\tt B <- IPBHT(r,A,i,k) }]\index{IPBHT} Integral polynomial binary homothetic transformation. \item[{\tt B <- IPBHTLV(r,A,k) }]\index{IPBHTLV} Integral polynomial binary homothetic transformation, leading variable. \item[{\tt B <- IPBHTMV(r,A,k) }]\index{IPBHTMV} Integral polynomial binary homothetic transformation, main variable. \item[{\tt B <- IUPBHT(A,k) }]\index{IUPBHT} Integral univariate polynomial binary homothetic transformation. \item[{\tt B <- IUPIHT(A,n) }]\index{IUPIHT} Integral univariate polynomial integer homothetic transformation. \item[{\tt B <- IPNT(r,A,i) }]\index{IPNT} Integral polynomial negative transformation. \item[{\tt B <- IUPNT(A) }]\index{IUPNT} Integral univariate polynomial negative transformation. \item[{\tt B <- IPTR(r,A,i,h) }]\index{IPTR} Integral polynomial translation, specified variable. \item[{\tt B <- IUPTR(A,h) }]\index{IUPTR} Integral univariate polynomial translation. \item[{\tt B <- IPTR1(r,A,i) }]\index{IPTR1} Integral polynomial translation by 1, specified variable. specified variable. \item[{\tt B <- IPTRLV(r,A) }]\index{IPTRLV} Integral polynomial translation, leading variable. \item[{\tt B <- IPTR1LV(r,A) }]\index{IPTR1LV} Integral polynomial translation by 1, leading variable. \item[{\tt B <- IUPTR1(A) }]\index{IUPTR1} Integral univariate polynomial translation by 1. \end{description} \item[Predicates:] \ \ \begin{description} \item[{\tt t <- IPCONST(r,A) }]\index{IPCONST} Integral polynomial constant. {\em Tests whether the argument is a constant.} \item[{\tt t <- IPONE(r,A) }]\index{IPONE} Integral polynomial one. {\em Tests whether the argument is 1.} \end{description} \item[Random Polynomial Generation:] \ \ \begin{description} \item[{\tt A <- IPRAN(r,k,q,N) }]\index{IPRAN} Integral polynomial, random. \end{description} \item[Conversion:] \ \ \begin{description} \item[{\tt IPSRP(r,A; a,Ab) }]\index{IPSRP} Integral polynomial similiar to rational polynomial. {\em Given a rational polynomial $q$, computes a rational number $c$ and an integral polynomial $p$ with $c p = q$.} \item[{\tt B <- IPFRP(r,A) }]\index{IPFRP} Integral polynomial from rational polynomial. {\em Computes an integral polynomial from a rational polynomial whose base coefficients are integers.} \end{description} \item[Input/Output:] \ \ \begin{description} \item[{\tt IPREAD(; r,A) }]\index{IPREAD} Integral polynomial read. \item[{\tt IPEXPREAD(r,V; A,t) }]\index{IPEXPREAD} Integral polynomial expression read. \item[{\tt IPWRITE(r,A,V) }]\index{IPWRITE} Integral polynomial write. \item[{\tt IPDWRITE(r,A,V) }]\index{IPDWRITE} Integral Polynomial Distributive Write. {\em Writes an integral recursive polynomial in distributive form.} \end{description} \item[Contents and Primitive Parts:] \ \ \begin{description} \item[{\tt IPICPP(r,A; a,Ab) }]\index{IPICPP} Integral polynomial integer content and primitive part. \item[{\tt c <- IPIC(r,A) }]\index{IPIC} Integral polynomial integer content. \item[{\tt Ab <- IPIPP(r,A) }]\index{IPIPP} Integral polynomial integer primitive part. \item[{\tt d <- IPICS(r,A,c) }]\index{IPICS} Integral polynomial integer content subroutine. \item[{\tt IPSCPP(r,A; s,C,Ab) }]\index{IPSCPP} Integral polynomial sign, content, and primitive part. {\em Computes the sign, content and primitive part of the argument w.r.t.\ the main variable.} \item[{\tt IPCPP(r,A; C,Ab) }]\index{IPCPP} Integral polynomial content and primitive part. \item[{\tt C <- IPC(r,A) }]\index{IPC} Integral polynomial content. \item[{\tt Ab <- IPPP(r,A) }]\index{IPPP} Integral polynomial primitive part. \item[{\tt IPLCPP(r,A; C,P) }]\index{IPLCPP} Integral polynomial list of contents and primitive parts. \end{description} \item[Polynomial Norms:] \ \ \begin{description} \item[{\tt b <- IPSUMN(r,A) }]\index{IPSUMN} Integral polynomial sum norm. \item[{\tt b <- IPMAXN(r,A) }]\index{IPMAXN} Integral polynomial maximum norm. \end{description} \item[Chinese Remainder Algorithm:] \ \ \begin{description} \item[{\tt As <- IPCRA(M,m,mp,r,A,a) }]\index{IPCRA} Integral polynomial chinese remainder algorithm. \end{description} \item[Squarefree Factorization:] \ \ \begin{description} \item[{\tt L <- IPSF(r,A) }]\index{IPSF} Integral polynomial squarefree factorization. \item[{\tt L <- IPFSD(r,A) }]\index{IPFSD} Integral polynomial factorization, second derivative. \item[{\tt L <- IPSFSD(r,A) }]\index{IPSFSD} Integral squarefree factorization, second derivative. \end{description} \item[Computations in Ideals:] \ \ \begin{description} \item[{\tt B <- IPTRUN(r,D,A) }]\index{IPTRUN} Integral polynomial truncation. {\em Computes $p \mod (x_1^{d_1},\ldots,x_r^{d_r})$ given $p$ and the $d_i$.} \item[{\tt C <- IPTPR(r,D,A,B) }]\index{IPTPR} Integral polynomial truncated product. {\em Computes $p q \mod \\(x_1^{d_1},\ldots,x_r^{d_r})$ given $p, q$, and the $d_i$.} \item[{\tt B <- IPIHOM(r,D,A) }]\index{IPIHOM} Integral polynomial mod ideal homomorphism. {\em Computes $p \mod \\(x_1^{d_1},\ldots,x_{r-1}^{d_{r-1}})$ given an r-variate polynomial $p$ and the $d_i$.} \item[{\tt C <- IPIPR(r,D,A,B) }]\index{IPIPR} Integral polynomial mod ideal product. {\em Computes $p q \mod \\(x_1^{d_1},\ldots,x_{r-1}^{d_{r-1}})$ given r-variate polynomials $p$ and $q$ and the $d_i$.} \item[{\tt C <- IUPTPR(n,A,B) }]\index{IUPTPR} Integral univariate polynomial truncated product. {\em Computes $p q \mod x^n$ given univariate polynomials $p$ and $q$ and a \BETA-digit $n$.} \end{description} \end{description} saclib2.2.8/doc/user_guide/Makefile0000664002275300236100000000206314017255270016311 0ustar wcbrownscs# # FILE # Makefile for SACLIB User's Guide. # SACSRC = \ saclib.tex\ cAN.tex\ cAsI.tex\ cAsIA.tex\ cAsMA.tex\ cAsRA.tex\ cCFC.tex\ cGCD.tex\ cI.tex\ cISAC.tex\ cLA.tex\ cLP.tex\ cNIWsCGV.tex\ cNIWsGC.tex\ cPAsDIPA.tex\ cPAsI.tex\ cPAsIPA.tex\ cPAsMPA.tex\ cPAsMR.tex\ cPAsPIO.tex\ cPAsRPA.tex\ cPF.tex\ cRRC.tex\ fLIST.tex\ fSPACE.tex # Files to be made. guide: ../saclib.dvi ../saclocal.dvi kwic: ../sackwic.dvi all: guide kwic # The User's guide. ../saclib.dvi: $(SACSRC) saclib.sty saclib.ind latex saclib.tex latex saclib.tex mv saclib.dvi ../saclib.dvi # The local guide. ../saclocal.dvi: saclocal.tex saclib.sty latex saclocal.tex latex saclocal.tex mv saclocal.dvi ../saclocal.dvi # The KWIC index. ../sackwic.dvi: sackwic.tex KWIC.tex saclib.sty latex sackwic.tex mv sackwic.dvi ../sackwic.dvi KWIC.tex: ${saclib}/bin/mktexkwic # The index file. # Requires 'makeindex'. saclib.ind: $(SACSRC) saclib.sty latex saclib.tex latex saclib.tex makeindex saclib.idx # Cleanup. clean: rm *.err *.log *.dvi *.aux *.toc *.lof *.lot *.idx cor[e] saclib2.2.8/doc/saclib.dvi0000664002275300236100000101075414017255270014466 0ustar wcbrownscs; TeX output 1998.07.08:1344CPWx>DtGGcmr17SAqCLIB1.17tUser'sGuide0XQ cmr121]jo cmr9cˤ cmsy9 1993Tb9yKurtG`odelInstitute,'`BrunoBucrhbSerger 2GeorgeE.CollinseMarkJ.Encarnaci on;[HoSonHong,JeremryR.Johnson WVernerKrandicrk3+RSvudigerLoosȬAnaM.MandacrheAndreasNeubacrherHerbSertVielhaberWMarcrh12,1993N-=Aacmr61TRISC{Linz"RepAortSeriesT:ec9hnicalReportNum9ber93-19(Researc9hInstituteforSymbAolic 9Computation,TJohannesKeplerUniv9ersity:,TA-4040Linz,Austria)*CyXK`y cmr10SACLIBgandshowshowtocallthem 9fromC.ThereisalsoabriefexplanationoftheinnerworkingsofthelistproGcessingand9garbageUUcollectionfacilitiesofSACLIB(G!. 'C9cNH cmbx12cCon8tents>919In9troQduction71 91.149WhatUUisSACLIB(G!?%................................191.249AbGoutUUthisGuide߁.................................291.349SACLIB\Maintenance*..............................2929ListTProQcessing*492.149MathematicalUUPreliminaries?N...........................492.249PurpGoseFȍ......................................492.349De nitionsUUofT*ermsTȍ...............................492.449F*unctions#1.....................................5939Arithmetic@1993.149IntroGduction....................................9493.1.1T9PurpGosec..................................9493.1.2T9De nitionsUUofT*ermsq...........................993.249IntegerUUArithmetic{................................1093.349MoGdularUUNumberArithmetic[..........................13493.3.1T9MoGdularUUDigitArithmetic"ō........................13493.3.2T9MoGdularUUIntegerArithmeticiۍ.......................1393.449RationalUUNumbGerArithmetic?F..........................14949P9olynomialTArithmeticZ1594.149IntroGduction....................................15494.1.1T9PurpGosec..................................15494.1.2T9De nitionsUUofT*ermsq...........................1594.249PolynomialUUInputandOutput..........................17494.2.1T9RecursiveUUpGolynomialsoverZ􍍑......................17494.2.2T9RecursiveUUpGolynomialsoverQT......................18494.2.3T9DistributiveUUpGolynomialsoverZp荍.....................19494.2.4T9DistributiveUUpGolynomialsoverQ....................19494.2.5T9ConversionUUBetweenRecursiveandDistributiveT9Representationm..............................19494.2.6T9PolynomialsUUoverZ 0ercmmi7m...........................1994.349DomainUUIndepGendentPolynomialArithmeticM8..................2094.449IntegralUUPolynomialArithmetic<.........................2194.549MoGdularUUPolynomialArithmetici䍍.........................2494.649RationalUUPolynomialArithmeticMs.........................2694.749MiscellaneousUURepresentationsJ..........................26494.7.1T9SparseUUDistributiveRepresentationJ...................26494.7.2T9DenseUURecursiveRepresentation捍....................27^i C959LinearTAlgebra&28 95.149MathematicalUUPreliminaries?N...........................2895.249PurpGoseFȍ......................................2895.349MethoGdsUUandAlgorithmsxA.............................2895.449F*unctions#1.....................................29969P9olynomialTGCDandResultants3196.149MathematicalUUPreliminaries?N...........................3196.249PurpGoseFȍ......................................3296.349De nitionsUUofT*ermsTȍ...............................3296.449MethoGdsUUandAlgorithmsxA.............................33496.4.1T9GCDUUComputations...........................33496.4.2T9Resultantsۍ.................................3396.549F*unctions#1.....................................34979P9olynomialTF actorization{3797.149MathematicalUUPreliminaries?N...........................3797.249PurpGoseFȍ......................................3797.349MethoGdsUUandAlgorithmsxA.............................3797.449F*unctions#1.....................................38989RealTRoQotCalculationZ4098.149MathematicalUUPreliminaries?N...........................4098.249PurpGoseFȍ......................................4098.349MethoGdsUUandAlgorithmsxA.............................4098.449De nitionsUUofT*ermsTȍ...............................4198.549F*unctions#1.....................................41999AlgebraicTNum9bQerArithmeticz4499.149MathematicalUUPreliminaries?N...........................4499.249PurpGoseFȍ......................................4499.349MethoGdsUUandAlgorithmsxA.............................4499.449De nitionsUUofT*ermsTȍ...............................4699.549Representationc..................................4699.649F*unctions#1.....................................479A9CallingTSACLIB,tF unctionsTfromCE519A.149AUUSampleProgram................................519A.249DynamicUUMemoryAlloGcationinSACLIB)F2....................519A.349DeclaringUUGlobalV*ariablestoSACLIB*.....................549A.449InitializingUUSACLIB+vbyUUHand ~..........................559A.549SACLIB\ErrorUUHandling퍍.............................559A.649Compilingڍ.....................................569B9ISAC4h:pAnTIn9teractiveInterfacetoSACLIB%{579B.149WhatUUisISAC?qS..................................579B.249SuppGortedUUSACLIB+vAlgorithmsFX.........................579B.349CommandUULineOptions.............................579B.449InterfaceUUF*unctionality..............................579B.549InterfaceUUGrammar................................58zii7C9C9NotesTontheIn9ternalW orkingsofSACLIBd61 9C.149Lists,UUGCAHandles,andGarbageCollection⍍.................6149C.1.1T9ImplementationUUofListsx$.........................6149C.1.2T9ImplementationUUofGCAHandles{....................6249C.1.3T9TheUUGarbageCollector..........................629C.249ConstantsUUandGlobalV*ariables͍.........................639IndexdV66AiiinC9cList T{ofFigures49A.149AUUsampleprogram.\................................52 9A.249SampleUUcoGdeusingGCAhandles.p........................539A.349DeclaringUUglobalvqariables.M............................549A.449SampleUUcoGdeforinitializingSACLIBbyhand..................569C.149TheUU$ cmmi10;(9;6);8).ML.................61:ivtC9iNq cmbx12iChapter 129cIn8tro duction:9AnaMandache,QAndreasNeubacherandHoGonHongalltoiledlonghoursediting9and_reformattingprograms.AndreasdeservesspGecialrecognition.Heinitiatedthewriting9ofthemanual,/wrotethreechaptersofthemanualandtwooftheappGendices,/anddidall9theqYrequiredsystemmaintenance.T*ofacilitateexpGerimentingwiththefunctionsinthe9library*,,HerbGertVielhaberimplementedISAC&,,theinteractiveshellforSACLIB(~.vHealso9wroteUUthecorrespGondingappendixofthemanual.9Besides$theabGove$itwouldbeunthinkqablenottomention,.collectively*,all$ofmyformer9doGctoralTLstudents, whocontributedtothedevelopmentoftheSAC2algorithmsandthe9research>onwhichtheywerefoundedoverapGeriod>of26years.jCDuringthelast20ofthose9yearsRGudigerLooswasafrequentcollabGorator.Heproposedcreationofan"ALgorithm9DEScription[?language"forSAC1,DthepredecessorofSAC2,DandwroteanALDES-to-F*ortran9translator.9ThisoinitialversionofSACLIBoisjustthebGeginningofwhatistocome.sW*eknowhow9toRimproveseveraloftheprogramsinthecurrentsystemandwewilldoitforsubsequent9versions.Some5basicfunctionalitiesarelargelyundevelopGedinthecurrrentsystem(e.g.1|C9linearalgebra)buttheywillbGesuppliedinsubsequentversions.Somemoreadvqanced 9functionalitiesT(e.g.qpGolynomialcomplexrootsandquanti erelimination)arenearlyready9and<#willbGeforthcomingsoon.iaAlsoweexpectthatusersofthesystemwillwriteprograms9basedUUontheoneswedistributeando erthemtootherusers.MTGeorgeUUE.Collins!č91.23 VAbs3outffthisGuide9Theʈmaingoalinwritingthisguidewastoenablethereadertoquicklydiscoverwhether9SACLIB5yprovidesMafunctionforagivenproblem.ThestructureofthepapGershouldfacilitate9searchingUUforafunctioninthefollowingway:9'9EveryZchapterdealswithfunctionsopGeratingoveracertaindomain(lists,[numbGers,'9pGolynomials,etc.)or~Dwithfunctionssolvingcertainproblems(GCD}computation,'9factorization,UUrealroGotcalculation,etc.).9'9SomechaptersaresplitintosectionscoveringmorespGeci ctopics(integerarithmetic,'9rationalUUnumbGerarithmetic,integralpGolynomialarithmetic,etc.)9'9Insideasection,functionsaredividedintovqariousareas(basicarithmetic,predicates,'9input/output,UUetc.).9'9InsideUtheseareas,bUcloselyrelatedfunctions(afunctionanditsinverse,functions'9solvingessentiallythesameproblem,afunctionanditsauxiliaryroutines,etc.)`qare'9groupGed.9Thispartitioningwasdoneonacompletelysub8jectivebasis. 8Theintentionalways9wasthattheneophyteusershouldbGeabletopinpointadesiredfunctionbyusingsimple9heuristics.ThisCapproachmaycertainlyfailinsomecases,?butwithatmost50functions9pGersectionbrowsingthemsequentiallyshouldalwayssucceedinanacceptableamountof9time.9Anotherrathersub8jectivelydesignedfeatureisthefunctiondescriptions.QAThelistswere9generatedautomaticallyfromtheheadersoftheSACLIB,3source les.SF*orsomefunctions9additionalUUremarkswereaddedin!': cmti10emphasize}'dtypGestyle.9Readers.whowant.touseSACLIB+MfunctionsintheirC.programsshouldreadAppGendix9A,rwhich:describGeshowinitializationandcleanuparedone,rwhich leshavetobGe#included,9etc.A!detailed!descriptionoftheinput/outputspGeci cationsofagivenfunctioncanbe9found inthecommentbloGckatthebGeginningofthecorrespondingsource le.gReadthe9\AddendumUUtotheSACLIB+vUser'sGuide"forinformationonhowtoaccessthese.9ThoseVwhowantVtoknowmoreabGouttheinnerworkingsofSACLIB-shouldreferto9AppGendixo6Cwhichgivesanoverviewoftheinternalrepresentationoflists,thegarbage9collector94andtheconstantsandglobalvqariablesusedinternally*.Descriptionsofthehighlevel9datastructuresusedforimplementingtheelementsofdomainslikeintegers,8pGolynomials,9etc.UUcanbGefoundatthebeginningsofthecorrespondingsections.!č91.33 VSACLIBl8Maintenance9The recommendedway forrepGortingproblemswithSACLIB+ 2issendinge-mailtothemain-9tenanceUUaccount'9saclib@risc.uni-linz.ac.at9orUUmailto2C9SACLIB?Maintenance 9Research?InstituteforSymbolicComputation9Johannes?KeplerUniversity94020?Linz9Austria9MessagesUUwhichmightinterestagreateraudienceshouldbGesenttothemailinglist'9saclib-l@risc.uni-linz.ac.at9ThisUUlistcanbGesubscribedbysendingamessagewiththebody'9subscribGeUUsaclib-l< rstname>9toUUlistserv@risc.uni-linz.ac.at. 9NotenthatSACLIB+isnotsoldforpro t^ٓRcmr71|s.ThereforedonotexpGectpromptserviceand9extensivesuppGort.SnNevertheless,ZSACLIB,Eiscontinuouslymaintainedandextended,Zsodo9notUUhesitategettingincontactwithus.97ffl) J= "5-:1L|{Ycmr8SAÎCLIB1mainÎtenanceXisspAnUUintegerasuchthatBETA <aAUUtermdenotingbGothatomsandlists.9compQositionO8ofUUanob8jectlandalist(l1|s;l2;:::;lnq~)UUisthelist(l2`;l1|s;l2;:::;lnq~).9reductumCof+alist(l1|s;l2;:::;lnq~)+isthelist(l2|s;l3;:::;lnq~).cThe+reductumoftheemptylist '9isUUunde ned.9concatenationXofUUlists(l1|s;l2;:::;lnq~)UUand(m1|s;m2;:::;mk됲)UUisthelist(l1|s;:::;'9lnq~;m1|s;:::;mk됲).9in9verse6 ѲofUUalist(l1|s;l2;:::;lnq~)UUisthelist(ln;ln O!cmsy71;:::;l1|s).9length2ofUUalist(l1|s;l2;:::;lnq~)UUisn.qThelengthoftheemptylistis0.9exten9t2TheUUnumbGerofcellsusedbyanob8ject.qMoreprecisely:39=9EXTENT\(a)=0UUifaisanatom.39=9EXTENT\(NIL)=0.39=9EXTENT\(L)=1 +EXTENT (l1|s)+EXTENT((l2|s;:::;lnq~)),;where4Listhenon-emptylist=9(l1|s;l2;:::;lnq~).9order.TheUUdepthofanob8ject.qMoreprecisely:39=9ORDERWy(a)=0UUifaisanatom.39=9ORDERWy(NIL)=1.39=9ORDERWy(L)Q=MAX(ORDER?(l1|s)֪+1;ORDER꙲((l2;:::;lnq~))),}0whereBListhenon-empty=9listUU(l1|s;l2;:::;lnq~).9sideTe ectsIѲWhen afunctionmoGdi esthecontent ofoneormorecellsoftheinputlist(s),'9itUUissaidtocausesidee e}'cts.qThisisalwaysUUnotedinthefunctionspGeci cations.9destructiv9eJXAnUUopGerationonlistscausingsidee ectsiscalleddestructive.9(unordered)Tseta5AnUU(unordered)listofatoms.!č92.43 VFfunctions9Constructors:'9M?<-COMP(a,L)zȲCompGosition.qPr}'e xesanobjecttoalist.'9M?<-COMP2(a,b,L)CompGositionUU2.qPr}'e xes2objectstoalist.'9M?<-COMP3(a1,a2,a3,L)CompGositionUU3.qPr}'e xes3objectstoalist.'9M?<-COMP4(a1,a2,a3,a4,L)CompGositionUU4.qPr}'e xes4objectstoalist.'9L?<-LIST1(a)u˲List,UU1element.qBuildsalistfr}'omoneobject.'9L?<-LIST2(a,b)9ŲList,UU2elements.qBuildsalistfr}'om2objects.'9L?<-LIST3(a1,a2,a3)yList,UU3elements.qBuildsalistfr}'om3objects.'9L?<-LIST4(a1,a2,a3,a4)9List,UU4elements.qBuildsalistfr}'om4objects.'9L?<-LIST5(a1,a2,a3,a4,a5)List,UU5elements.qBuildsalistfr}'om5objects.'9L?<-LIST10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)9qList,10elements.6Builds/alist=9fr}'om10objects.9Selectors:'9ADV(L;?a,Lp)pyβAdvqance.qR}'eturnsthe rstelementandthereductumofalist.5C'9ADV2(L;?a,b,Lp)9ŲAdvqanceh2.[xR}'eturnsVUthe rst2elementsandthe2ndreductumof =9alist.'9ADV3(L;?a1,a2,a3,Lp)yAdvqance D3.`R}'eturnscthe rst3elementsandthe3rdreduc-=9tumofalist.'9ADV4(L;?a1,a2,a3,a4,Lp)9Advqance4.#R}'eturnsthe rst4elementsandthe4th=9r}'eductumofalist.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.'9a?<-FIRST(L)u˲First.qR}'eturnsthe rstelementofalist.'9FIRST2(L;?a,b)zȲFirstUU2.qR}'eturnsthe rst2elementsofalist.'9FIRST3(L;?a1,a2,a3)9FirstUU3.qR}'eturnsthe rst3elementsofalist.'9FIRST4(L;?a1,a2,a3,a4)FirstUU4.qR}'eturnsthe rst4elementsofalist.'9a?<-SECOND(L)zȲSecond.qR}'eturnsthe2ndelementofalist.'9a?<-THIRD(L)u˲Third.qR}'eturnsthe3rdelementofalist.'9a?<-FOURTH(L)zȲF*ourth.qR}'eturnsthe4thelementofalist.'9Lp?<-LASTCELL(L)LastUUcell.qR}'eturnsthelisthandleofthelastcellofalist.'9a?<-LELTI(A,i)9ŲListUUelement.qR}'eturnsthei-thelementofalist.'9Lp?<-RED(L)pyβReductum.qR}'eturnsthereductumofalist.'9Lp?<-RED2(L)u˲ReductumUU2.qR}'eturnsthe2ndreductumofalist.'9M?<-RED3(L)pyβReductumUU3.qR}'eturnsthe3rdreductumofalist.'9M?<-RED4(L)pyβReductumUU4.qR}'eturnsthe4threductumofalist.'9B?<-REDI(A,i)zȲReductum.qR}'eturnsthei-threductumofalist.9InformationTandPredicates:'9t?<-ISOBJECT(a)y²T*estW\forob8ject.T;estsAwhetherthear}'gumentrepresentsanobject.'9t?<-ISATOM(a)zȲT*estUUforatom.qT;estswhetherthear}'gumentrepresentsanatom.'9t?<-ISLIST(a)zȲT*estUUforlist.qT;estswhetherthear}'gumentrepresentsalist.'9t?<-ISNIL(L)u˲T*estAforemptylist.T;estswhetherthear}'gumentrepresentstheempty =9list.'9t?<-EQUAL(a,b)9ŲEqual.qT;estswhethertwoobje}'ctsareequal.'9t?<-MEMBER(a,L)y²MembGershipXtest.{uT;estsdwhetheranobje}'ctisanelementofa=9list.'9i?<-LSRCH(a,A)9ŲListUUsearch.qR}'eturnstheindexofanobjectinalist.'9n?<-EXTENT(a)zȲExtent.'9n?<-LENGTH(L)zȲLength.'9n?<-ORDER(a)u˲Order.9Concatenation:'9L?<-CCONC(L1,L2)ConstructiveUUconcatenation.qBuildsalist(l1|s;:::;lm; =9lm+1;:::;lnq~)fr}'omlists(l1|s;:::;lm)and(lm+1;:::;lnq~).'9L?<-CONC(L1,L2)y²Concatenation.qConc}'atenatestwolistsdestructively.'9M?<-LCONC(L)u˲List?concatenation.(Conc}'atenatestheelementsofalistoflistsde-=9structively.9In9version:6C'9M?<-CINV(L)pyβConstructiveHinverse.Buildsײalistc}'ontainingtheelementsofthe =9ar}'gumentininverseorder.'9M?<-INV(L)k9ѲInverse.qInvertsalistdestructively.9Insertion:'9LINS(a,L)`ײListUUinsertion.qInsertsanobje}'ctafterthe rstelementofalist.'9L?<-LEINST(A,i,a)List|elementinsertion.?Inserts anobje}'ctafterthei-thelement =9ofalist.'9Lp?<-SUFFIX(L,b)Sux.qApp}'endsanobjectafterthelastelementofalist.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.9Com9binatorial:'9M?<-LEROT(L,i,j)Listd:elementrotation.wR}'otatessomeconsecutiveelementsofa =9list.'9Lp?<-LPERM(L,P)y²ListUUpGermute.qPermutestheelementsofalist.'9Pp?<-PERMCY(P)9ŲPermutation,UUcyclic.qR}'otatesalisttotheleft.'9L?<-PERMR(n)u˲Permutation,random.?Builds alistofthe rstninte}'gersinrandom=9or}'der.'9B?<-LEXNEX(A)zȲLexicographicallyzHnext.Computesthelexic}'ographicalsuccessorof=9ap}'ermutation.9SetTOpQerations:'9b?<-SEQUAL(A,B)y²SetVequality*.u_T;estswhethertwosetsr}'epresentedasunor}'dered =9r}'edundantlistsar}'eequal.'9C?<-SDIFF(A,B)9ŲSetUUdi erence.'9B?<-SFCS(A)pyβSetUUfromcharacteristicset.'9C?<-SINTER(A,B)y²SetUUintersection.'9C?<-SUNION(A,B)y²SetUUunion.'9C?<-USDIFF(A,B)y²UnorderedUUsetdi erence.'9C?<-USINT(A,B)9ŲUnorderedUUsetintersection.'9C?<-USUN(A,B)zȲUnorderedUUsetunion.9Sorting:'9M?<-LBIBMS(L)zȲListyofBET*A-integersbubble-mergesort.4Sortsalistofatoms =9intonon-desc}'endingorder.'9LBIBS(L)[yڲList8ofBET*A-integersbubblesort.Sorts8alistofatomsintonon-desc}'ending=9or}'der.'9L?<-LBIM(L1,L2)y²ListUUofBET*A-integersmerge.qMer}'gestwosortedlistsofatoms.'9B?<-LINSRT(a,A)y²ListUUinsertion.qInsertsanatomintoasorte}'dlistofatoms.'9C?<-LMERGE(A,B)y²Listmerge.Constructively@9mer}'gestwolistsavoidingduplicate=9elements.9Input/Output:'9A?<-AREAD()pyβAtomUUread.'9AWRITE(A)`ײAtomUUwrite.'9L?<-LREAD()pyβListUUread.7$C'9LWRITE(L)`ײListUUwrite.'9B?<-OREAD()pyβOb8jectUUread.'9OWRITE(B)`ײOb8jectUUwrite.9Miscellaneous:'9C?<-PAIR(A,B)zȲPair.qBuildsalistbyinterle}'avingtheelementsoftwolists.'9SFIRST(L,a)k9ѲSetUU rstelement.qSetsthe rstelementofalist.'9SLELTI(A,i,a)u˲SetUUlistelement.qSetsthei-thelementofalist.'9SRED(L,Lp)eԲSetUUreductum.qSetsther}'eductumofalist.8 ҦC9iChapter 329cArithmetic:93.13 VIntros3duction95N cmbx123.1.17yPurp`oseuT9TheSACLIB, arithmeticpackqagessuppGortcomputationswithintegers,moGdularnumbGers, 9andUUrationalnumbGersUUwhosesizesareonlyboundedbytheamountofmemoryavqailable.獍93.1.27yDe nitionsofTerms9in9teger5wIntegersUUtobGeenteredintoSACLIB+vmustbGeofthefollowingexternalform.ڠ39=9orڠ39=9+or39=9,'9wherejdesignatesanynon-emptywordoverthealphabGet0;1;:::;9(. '9Note'thatthereisnoblankbGetween'theoptionalsignandthedigitsequence;also'9notethatleadingzerosareallowed.Inputsofthisformareinterpretedintheusual'9wayUUasdecimalnumbGers.mP'9SACLIBOC{outputsthec}'anonical[:externalr}'epresentationofintegers.]>Thisistheinteger'9inUUexternalformwithbGothpositivesignandleadingzerosdigitssupressed.'9TheUUinternalr}'epresentationIofanumbGern2Zisde nedasfollows:ڠ39=9IfUUBETA <norЍ39=9=,'9whereandareexternalformsofrelativelyprimeintegers'9NandzDG,suchthatD5>0.(Notethatnoblanksarepermittedimmediatelybeforeand'9aftersthe=.&InputsofthisformareinterpretedintheusualwayasrationalnumbGers'9withUUnumeratorNlpanddenominatorDG.荍'9SACLIBOoutputsi;thec}'anonical5externalr}'epresentationi;ofrationalnumbGersi;r/^2AQ.xIf'9r52Z,4the,canonicalexternalrepresentationofrsisthecanonicalexternalrepresenta-'9tionHoftheintegerrG.mOtherwisethereareuniqueintegersN_andDsuchthatr5= KNK&fe*]D C/,'9D0T>71,nandigcdi(N;DG)=1.2Theicanonicalexternalrepresentationofrinthiscaseis'9thecanonicalexternalrepresentationoftheintegerNfollowedby=followedbythe'9canonicalUUexternalrepresentationoftheintegerDG.'9TheUUinternalr}'epresentationRofanumbGerr52Qisde nedasfollows:Ѝ39=9IfUUr5=0thenRistheBETA-digit0.Ѝ39=9Otherwise,0,UUandgcdUW(n;d)=1.9ceiling3TofUUanumbGerUUrristhesmallestintegernsuchthatr5n.9 oQor*+ofUUanumbGerUUrristhelargestintegernsuchthatnrG.9pQositiv9e:@nUUispGositiveif0,respectively.'9t?<-IEVEN(A)u˲IntegerUUeven.qT;estswhetherthear}'gumentiseven.'9t?<-IODD(A)pyβIntegerUUoGdd.qT;estswhetherthear}'gumentisodd.9ExpQonen9tiation:'9B?<-IEXP(A,n)zȲIntegerUUexpGonentiation.'9IROOT(A,n;?B,t)9ŲIntegerUUroGot.'9ISQRT(A;?B,t)u˲IntegerUUsquareroGot.'9DSQRTF(a;?b,t)zȲDigitUUsquareroGotfunction.'9IPOWER(A,L;?B,n)y²Integer%pGower.6Ifithear}'gumentcanbeexpressedasb^nq~,*such=9inte}'gersbandnarecomputed.9GreatestTCommonDivisor:'9C?<-IGCD(A,B)zȲIntegerUUgreatestcommondivisor.'9c?<-DGCD(a,b)zȲDigitUUgreatestcommondivisor.'9IGCDCF(A,B;?C,Ab,Bb)yIntegerUUgreatestcommondivisorandcofactors.'9IEGCD(a,b;?c,u1,v1)9IntegerUUextendedgreatestcommondivisoralgorithm.'9DEGCD(a,b;?c,u,v)DigitUUextendedgreatestcommondivisor.'9IDEGCD(a,b;?c,u1,v1,u2,v2)Integerdoublyextendedgreatestcommondivisor=9algorithm.'9IHEGCD(A,B;?C,V)y²IntegerUUhalf-extendedgreatestcommondivisor.'9C?<-ILCM(A,B)zȲIntegerUUleastcommonmultiple.9F actorization:'9F?<-IFACT(n)u˲IntegerUUfactorization.'9s?<-ISPT(m,mp,F)Integer-selfridgeprimalitytest.OR}'eturnsA1iftheargumentis=9prime,-1ifitisnotprime,and0iftheprimalityc}'ouldnotbedetermined.'9ILPDS(n,a,b;?p,np)IntegerUUlargeprimedivisorsearch.'9IMPDS(n,a,b;?p,q)IntegerUUmediumprimedivisorsearch.'9ISPD(n;?F,m)pyβIntegerUUsmallprimedivisors.9PrimeTNum9bQerGeneration:'9L?<-DPGEN(m,k)9ŲDigitUUprimegenerator.9RandomTNum9bQerGeneration:'9A?<-IRAND(n)u˲Integer,UUrandom.'9a?<-DRAN()k9ѲDigit,UUrandom.'9a?<-DRANN()pyβDigit,UUrandomnon-negative.A11 ﮠC9Com9binatorial:|'9A?<-IFACTL(n)zȲIntegerUUfactorial.IH'9A?<-IBCOEF(n,k)y²IntegerUUbinomialcoGecient.qR}'eturns`.: n⍍ mke`I.pd'9B?<-IBCIND(A,n,k)IntegerbinomialcoGecientinduction.PR}'eturns6`5Vpnƍ /kw+81ן`)ygiven =9n,kP,and`.: n⍍ mke`I.ׇ'9A?<-IBCPS(n,k)9ŲIntegerUUbinomialcoGecientpartialsum.qR}'eturnsPލ""k%""i=0A`Z썑#9n0$P1i):`/3{.II9BinaryTArithmetic:'9n?<-ILOG2(A)u˲Integer^logarithm,base2.R}'eturns1+(the oorofthebase2 =9lo}'garithmoftheargument).|'9n?<-DLOG2(a)u˲DigitUUlogarithm,base2.'9IFCL2(a;?m,n)u˲Integer, oGorJandceiling,logarithm,base2.4R}'eturnsϪthe oorand=9thec}'eilingofthebase2logarithmoftheargument.'9B?<-IMP2(A,h)zȲInteger multiplicationbypGowerof2.YXMultipliesPwthear}'gumentbya=9non-ne}'gativepowerof2.'9B?<-IDP2(A,k)zȲIntegerBdivisionbypGowerof2.:gDividesnqthear}'gumentbyanon-=9ne}'gativepowerof2.'9B?<-ITRUNC(A,n)y²IntegerW/truncation.wTDividesthear}'gumentbyapositiveornega-=9tivep}'owerof2.'9n?<-IORD2(a)u˲Integer,orderޒof2. R}'eturns*thelargestnsuchthat2^n dividesthe=9ar}'gument.|9BoQolean:'9c?<-DAND(a,b)zȲDigitUUand.qR}'eturnsthebit-wise^oftwodigits.|'9c?<-DOR(a,b)u˲DigitUUor.qR}'eturnsthebit-wise_oftwodigits.'9b?<-DNOT(a)pyβDigitUUnot.qR}'eturnsthebit-wise:ofadigit.'9c?<-DNIMP(a,b)9ŲDigitnon-implication.8R}'eturnsthebit-wise:(a5)b)ofdigitsa=9andb.|9Input/Output:'9A?<-IREAD()pyβIntegerUUread.|'9IWRITE(A)`ײIntegerUUwrite.'9ILWRITE(L)eԲIntegerUUlistwrite.qWritesalistofinte}'gersintheform=9(n1|s;n2;:::;nk됲)totheoutputstr}'eam.|9AuxiliaryTF unctions:'9C?<-ISSUM(n,L)9ŲInteger shiftedsum.OComputes=Pލk%i=0ٵCiTLBETAT@\pin$ױgiven=nandthe=9CiTL.|'9ISEG(A,n;?A1,A0)y²IntegerHJsegmentation.Splitscaninte}'gerataBETA-digitboundary.'9C?<-IDIPR2(A,B,a,b)yIntegerdigitinnerproGduct, length2.(kComputeskAaY+Bqb=9forinte}'gersA;BXandBETA-digitsa;b.'9C?<-ILCOMB(A,B,u,v)yInteger~linearcombination.N*Computes1Aac3+Bqbforinte}'gers=9A;BXandBETA-digitsa;bwithAa8+Bqb0.'9DPCC(a1,a2;?u,up,v,vp)DigitUUpartialcosequencecalculation.'9AADV(L;?a,Lp)u˲ArithmeticY9advqance.}sR}'eturns{the rstelementandthereductumof=9anon-emptylist,r}'eturns0asthe rstelementifthelistisempty.A12 `C93.33 VMos3dularffNumberArithmetic93.3.17yMo`dularDigitArithmeticuT9BasicTArithmetic:'9c?<-MDSUM(m,a,b)MoGdularUUdigitsum.'9c?<-MDDIF(m,a,b)MoGdularUUdigitdi erence.'9b?<-MDNEG(m,a)9ŲMoGdularUUdigitnegative.'9c?<-MDPROD(m,a,b)MoGdularUUdigitproduct.'9c?<-MDQ(m,a,b)9ŲMoGdularUUdigitquotient.'9b?<-MDINV(m,a)9ŲMoGdularUUdigitinverse.'9b?<-MDEXP(m,a,n)MoGdularUUdigitexponentiation.9ChineseTRemainderAlgorithm:'9a?<-MDCRA(m1,m2,mp1,a1,a2)9MoGdularUUdigitchineseremainderalgorithm.'9L?<-MDLCRA(m1,m2,L1,L2)yMoGdularUUdigitlistchineseremainderalgorithm.'9b?<-MDHOM(m,A)9ŲMoGdularUUdigithomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9a?<-MDRAN(m)u˲MoGdularUUdigit,random.693.3.27yMo`dularIntegerArithmeticuT9BasicTArithmetic:'9C?<-MISUM(M,A,B)MoGdularUUintegersum.'9C?<-MIDIF(M,A,B)MoGdularUUintegerdi erence.'9B?<-MINEG(M,A)9ŲMoGdularUUintegernegation.'9C?<-MIPROD(M,A,B)MoGdularUUintegerproduct.'9C?<-MIQ(M,A,B)9ŲMoGdularUUintegerquotient.'9B?<-MIINV(M,A)9ŲMoGdularUUintegerinverse.'9B?<-MIEXP(M,A,N)MoGdularUUintegerexponentiation.9ChineseTRemainderAlgorithm:'9As?<-MIDCRA(M,m,mp,A,a)yMoGdularUUintegerdigitchineseremainderalgorithm.'9As?<-MIHOM(M,A)y²MoGdularUUintegerhomomorphism.qComputesnmodm.9RandomTNum9bQerGeneration:'9R?<-MIRAN(M)u˲MoGdularUUinteger,random.9Con9version:'9B?<-SMFMI(M,A)9ŲSymmetric7moGdularfrommodularinteger./Computestheisomor- =9phismfr}'omZm ,tofb m&fe2⍟bQ+81;:::;b m&fe2⍟bqg.A13 C93.43 VRationalffNumbs3erArithmetic9BasicTArithmetic:'9T?<-RNSUM(R,S)9ŲRationalUUnumbGersum.'9T?<-RNDIF(R,S)9ŲRationalUUnumbGerdi erence.'9S?<-RNNEG(R)u˲RationalUUnumbGernegative.'9T?<-RNPROD(R,S)y²RationalUUnumbGerproduct.'9T?<-RNQ(R,S)u˲RationalUUnumbGerquotient.'9S?<-RNINV(R)u˲RationalUUnumbGerinverse.'9s?<-RNSIGN(R)zȲRationalUUnumbGersign.'9S?<-RNABS(R)u˲RationalUUnumbGerabsolutevqalue.'9t?<-RNCOMP(R,S)y²RationalUUnumbGercomparison.'9c?<-RNMIN(a,b)9ŲRationalUUnumbGermin.'9c?<-RNMAX(a,b)9ŲRationalUUnumbGermax.9Constructors:'9R?<-RNINT(A)u˲RationalUUnumbGerfrominteger.qR}'eturns n&fe~z1givenanintegern.'9R?<-RNRED(A,B)9ŲRationaldnumbGerreductiontolowestterms.P"R}'eturns j=nj=&fe~cd given7 two =9inte}'gersnanddwithd6=0.9Selectors:'9a?<-RNNUM(R)u˲RationalUUnumbGernumerator.'9b?<-RNDEN(R)u˲RationalUUnumbGerdenominator.9RandomTNum9bQerGeneration:'9R?<-RNRAND(n)zȲRationalUUnumbGer,random.9Input/Output:'9R?<-RNREAD()u˲RationalUUnumbGerread.'9RNWRITE(R)eԲRationalUUnumbGerwrite.'9RNDWRITE(R,n)u˲RationalHInumbGerdecimalwrite.JAppr}'oximatesslarationalnumber =9byade}'cimalfractionwithagivenaccuracyandwritestheapproximationtothe=9outputstr}'eam.9Miscellaneous:'9a?<-RNCEIL(r)zȲRationalUUnumbGer,ceilingof.'9a?<-RNFLOR(r)zȲRationalUUnumbGer, oorof.'9RNBCR(A,B;?M,N,k)RationalUUnumbGerbinarycommonrepresentation.'9RNFCL2(a;?m,n)zȲRationalUUnumbGer oorandceilingoflogarithm,base2.'9r?<-RNP2(k)pyβRationalUUnumbGerpowerof2.qComputes2^n egivenaGAMMA-digitn.A14̠C9iChapter 429cP8olynomial T{Arithmetic:94.13 VIntros3duction94.1.17yPurp`oseuT9The ;SACLIB-BpGolynomial ;arithmeticpackqagesprovidefunctionsdoingcomputationswith 9multivqariateUUpGolynomialsoverdomainsimplementedbytheSACLIB+varithmeticpackqages.9Except.forthefunctionslistedinSection4.7andvqariousconversion.functions,6Qonlythe9sp}'arserecursiveUUrepresentationisused.694.1.27yDe nitionsofTerms9sparseTrecursiv9erepresentationApGolynomial墵p2D[x1|s;:::;xrm]isinterpretedasanel-'9ementof(::: UO(D[x1|s]):::)[xrm],forsomedomainD.TheSACLIB*#sp}'arserecursiverepre-'9sentation8PofapGolynomialp=Pލ USn% USi=1tJpiTLx^eO \cmmi5i፴r &with8e1C>:::8>enq~,qǵpid2(::: UO(D[x1|s]):::)[xr71],'9andUUpid6=0isde nedrecursivelyasfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.39=9Ifr!}>`0,#thenPisthelist(e1|s;P1;:::;enq~;Pn)wheretheeiNͲareBETA-digitsand=9eachUUPiistherepresentationofpiTL.9sparseTdistributiv9erepresentationβA^pGolynomialp2D[x1|s;:::;xrm]isinterpretedas'9pԲ=Pލin%ii=1diTLx^eivC,#whereadi/ 2D,di/ 6=0,andax^ei standsforxWei;Zcmr51O1 (xWei;2O2ҷ(xWei;rrwith'9ei;j '0.+F*urthermore, {weassumethate19>e2>:::#>enq~, {where觵ek/>eiei;3^|O.'9The8sp}'arse8distributiverepresentation8PofsuchapGolynomialpisthelist(D1|s;E1;D2;E2;:::;Dnq~;En),'9where8Di/istheSACLIB)cinternalrepresentationofdi/andEiisthelist(ei;r ;ei;r71b;:::;ei;1 )'9withUUei;j MbGeingBETA-digits.'9AsUUalwaysinSACLIB(G!,P=0ifp=0.9denseTrecursiv9erepresentation㵲ApGolynomialdpHظ2D[x1|s;:::;xrm]isinterpretedasan'9elementvof(::: UO(D[x1|s]):::)[xrm],DforvsomedomainD.Thedense!r}'ecursiverepresentation'9PofapGolynomialp=Pލ USn% USi=0tJpiTLx^ir.withpid2(::: UO(D[x1|s]):::)[xr71]isde nedrecursively'9asUUfollows:39=9IfUUp=0thenPistheBETA-digit0.39=9If Zr5=0,thenpisinDanditsrepresentationPistherepresentationofelements=9ofUUthedomainD.A15C39=9Ifɵr>vٲ0,&thenPisthelist(n;Pnq~;Pn1;:::;P0|s)wherethenisaBETA-digitand =9eachUUPiistherepresentationofpiTL.9pQolynomialJPIfthistermappGearsintheparameterspeci cationsofafunction,thisdenotes'9a6pGolynomialinthesparserecursiverepresentation.gOtherwise,=itisusedtodenotea'9pGolynomialUUinarbitraryrepresentation.9baseTdomain,baseringu'IfUUpisanelementofD[x1|s;:::;xrm],Disitsbasedomain.9in9tegralTpQolynomialt³AUUpGolynomialwhosebasedomainisZ.9moQdularTpolynomialxo#AipGolynomialwhosebasedomainisZm ,withmaprimepositive'9BETA-digit.9moQdularTin9tegralpolynomialA pGolynomialMwhosebasedomainisZm :withmapositive'9integer.9rationalTpQolynomialuf?AUUpGolynomialwhosebasedomainisQ.9mainTv\rariableW6JofUUapGolynomialinD[x1|s;:::;xrm]isxr.9degree3The9degreeofapGolynomialw.r.t.agivenvqariableisthehighestpower9ofthisvqari-'9able#appGearingwithnon-zerocoecientinthepolynomial.aMIfnovqariableisspeci ed,'9theUUdegreeiscomputedw.r.t.themainvqariable.9order.TheUUorderofapGolynomialp=Pލ USn% USi=0tJpiTLx^irisUUthesmallestk0suchthatpk6=0.9constan9tTpQolynomialx|AUUpGolynomialofdegree0ineveryvqariable.9leadingTtermROofǦapGolynomialisapolynomialequaltothetermofhighestdegreew.r.t.'9theUUmainvqariable.9reductumCofUUapGolynomialisthepolynomialminusitsleadingterm.9leadingTcoQecien9tlbThe#cleadingcoGecientofapolynomialisthecoecientofitsleading'9term.9leadingTbasecoQecien9tAndelementofthebasedomainequaltothecoGecientofthe'9leadingUpGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9trailingTbasecoQecien9tZ$AnelementofthebasedomainequaltothecoGecientofthe'9smallest\pGowerproGductofapolynomialwheretheorderingonthepowerproGductsis'9theUUlexicographicorderingwithx1C<8׵<xrm.9monicTpQolynomiallAUUpGolynomial,theleadingcoecientofwhichis1.9pQositiv9eTpolynomialu[AUUpGolynomial,theleadingbasecoecientofwhichispGositive.9sign'Anxintegerequalto1iftheleadingbasecoGecientofthepGolynomialispositive,1'9otherwise.9absoluteTv\ralueZofUUapGolynomialpisthepositivepolynomialq.suchthatp=sign7(p)8q[ٲ.9con9tent8qof apGolynomialpisequaltotheabsolutevqalueofthegreatestcommondivisorof'9theUUcoGecientsofp.9in9tegerTcontent_ ۲ofanintegralpGolynomialisanintegerequaltothepGositivegreatest'9commonUUdivisoroftheintegercoGecientsofeachpGowerproGductofthepolynomial.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.A16-C9squarefreeTpQolynomialݵApGolynomialpissquarefreeifeachfactoroccursonlyonce.,In '9otherwords,iifp1=p:e1l1 2bp~ekk hisacompletefactorizationofptheneachoftheei7Jis'9equalUUto1.N9squarefreeTfactorizationQ@Theysquarefreefactorizationofpisp:e1l1 2bp~ekk awhere1je1<'95<ek\andeachofthepiisapGositivesquarefreepGolynomialofpositivedegree.@DNote'9thatUUifpissquarefreethenp^1Ȳisthesquarefreefactorizationofp.9v\rariableT(name)b;Azlist(c1|s;:::;ck됲),wheretheciAareCcharacters.:Example:_thename'9"fubar"UUwouldbGerepresentedbythecharacterlist('f','u','b','a','r').9listTofv\rariables_|RAA&listA,(n1|s;:::;nrm)givingthenamesofthecorrespGondingvqariablesofan'9rG-vqariateUUpolynomialforinputandoutput. 􍍑94.23 VPolynomialffInputandOutput9In thissectionwewilldescribGethepolynomialinputandoutputroutinesthatareavqailable9inKSACLIB).RBeforeKproGceedingfurther, thereadershouldbefamiliarwiththeinternal9representationsUUofpGolynomialswhicharediscussedinSection4.1.2.f94.2.17yRecursivep`olynomialsoverZuT9Theexternalʊc}'anonicalrepresentationofsparser}'ecursivepGolynomialsoverZisde nedby9thefollowingrules.DFirstofall,eachpGolynomialisenclosedinparentheses.DA͝termisrepre-9sentedbythecoGecientimmediatelyfollowedbythevqariable(nospacenor'*'inbGetween).9ThecoGecients+1and1aresuppressedunlesstheexponentofthevqariableis0inwhich9casethevqariableissuppressed.PMThecaret'^'isusedtoindicateexpGonentiation.Exponents9withthevqalue1aresuppressedandifavariablehastheexpGonent0thenthevariable9issuppressed.ʀTheserulesapplyrecursivelytothecoGecientswhichmaythemselvesbGe9pGolynomials.qAUUfewexamplesareinorder.?%?L͉ff)hfdͤ fffdrecursiveUUpGolynomial ffSexternalUUcanonicalform# ffff)h͟ ffy_ ff(5 ff ͤ ff6fdx^4S+82x^3x+36 ff^(-x^4+2x^3-x+3)/̵ ff͟ ffy_ ff(5 ffͤ ff͟fd(x^2S+81)y[ٟ^3,+(x+8)y5 ff((x^2+1)y^3+(x+8)y+(-5)),ß ff͟ ffy_ ff(5 ffͤ fffd(x^2S84)y[ٟ^4,+y[ٟ^2yx ff^((-x^2+4)y^4+(1)y^2+(-1)y+(-x))͟ ff͟ ffy_ ff(5 ffff)h9NoteOthataconstantpGolynomialinr2lvqariableswillbeenclosedinr2lsetsofparentheses.NpF*or 9example,>Qthe8constantpGolynomial2in3vqariableswillberepresentedinexternalcanonical9formUUas(((2))).9The݇algorithmIPREADireadsanrG-vqariaterecursivepolynomialover݇Zinexternalcanon-9ical=formfromtheinputstream.OThepGolynomialthatisreadisstoredininternalcanonical9formandthenumbGerofvqariablesisalsorecorded.OThevariablesarenotstored.OInteger9coGecientsmaybGeofarbitrarylengthbutexponentsmustbGeBETA-digits.]Sincenosort-9ingPispGerformedontheterms,theymustbegiveninorderofdescendingdegree.иThisis9an>2impGortantremarksincealmostallalgorithmsthatmanipulatepolynomialsrequirethat9thejEtermsbGeorderedandviolatingthisrulewillundoubtedlycauseincorrectresultstobe9computedD)andmayevencrashthesystem.lAnotherimpGortantremarkisthattermswhose9coGecientsare0shouldnotbegivenasthesetermswillbestoredandmaycauseproblems,9forUUexampleinequalitytesting.9Although IPREADishappiestwhenapGolynomialisgiveninexternalcanonicalform9asexempli edbythepreviousexamples,theuserisallowedsomefreedom.AnarbitraryA17=ΠC9numbGer)ofspacesmayinterspGersedbetween)thecoecients,Ethevqariables,theexpGonents 9and=thesymbGols'+',B'-'and'^'.MSpacesmaynotbGeinsertedwithinavqariablenorwithinan9integer.F!CoGecientswithmagnitude1aswellastheexponents0and1maybGeexplicitly9given.Thus,forxexample,((x?^2+1)y^3+(1x+8)y^1-(5x^0)y^0)ispGerfectlyvqalid9andUUisequivqalenttothesecondexamplegiveninthetableabGove.9SincebIPREADbwasintendedtobGeusedmainlyforreadingoutputproducedbyprevious9computations,iitisdesignedtobGefastand,consequently*,verylittleerrorcheckingispGer-9formedontheinput. Amongotherthings,BIPREADdoGesnotcheckforconsistencyamong9the%vqariables,Ye.g.8((y)x^2+(z)y)willbGeacceptedasvalidinputandwouldbGeidentical9to((u)v^2+(u)v)ininternalrepresentation.Also,1IPREADdoGesnotcheckforconsistency9amongterms, Ji.e.[eachtermisproGcessedseparatelyanditisnotcheckedwhetherallterms9have~thesamenumbGer~ofrecursivenestings.gF*orexample,B(y^3+(x-1)y)willbeaccepted9althoughYthe rstterm,y^3,isYaunivqariatepGolynomialwhereasthesecond,(x-1)y,isYa9bivqariatepGolynomial.It7 isther}'efore7 ther}'esponsibility7 oftheusertose}'ethatpolynomials9ar}'einputproperly.9Theo~algorithmIPWRITEoxtakesasinputsanrG-vqariaterecursivepGolynomialAoxoverZand9aXlistV?=(v1|s;:::;vrm)XofrvqariablesandwritesAXtotheoutputstreamusingthevariables9spGeci edwithvr dEasthemainvqariableandv1 sasthemostminorvariable. UThelistV9maykbGeinitializedusingVLREADkewhichreadsavqariablelistfromtheinputstream.F*or9generatingByalistwitha xednumbGerByofvqariablesonecouldalsouseanexpressionsuch9asLIST3(LFS("X"),LFS("Y"),LFS("Z")).IHerethefunctionsLFSxisusedforconverting9a7pC76stringtoaSACLIBvqariable.ItispGossibletousethealgorithmIUPWRITEtowrite9univqariaterecursivepGolynomialsbutthisalgorithmwasintendedmainlyasasubroutine9toHbGecalledbyIPWRITE,whichalsohandlesunivqariatepGolynomials,Kandtheuserneednot9evenUUbGeawareofitsexistence.9TherezlisanadditionalsetofinputfunctionsofwhichthetoplevelfunctionisIPEXPREAD.9TheformatacceptedbythisfunctionisabitmoreconvenientasexpressionsmaybGeofthe9form(3?XY^2+X)^3-(YX+Y)(X-1)^2+5.fNotethatIPEXPREADalsotakesa9vqariableYlistasinputandthereforecandetecttheorderofthevariableswithoutrequiring9theUUrecursivestructuremadeexplicitbyparentheses.9T*o$bGemoreprecise, IPEXPREADacceptsanypolynomialexpressionbuiltfromintegers9andvqariablesusing+,>-,blanksformultiplication,>^forexpGonentiation,>andparenthesisfor9grouping.*TheexpressionmaybGeterminatedbyanycharacternotbGeingpartofthelegal9input+set(e.g.apGeriod,&a+semicolon,etc.).^dThisterminatingcharacterisnotremovedfrom9theUUinputstream.9ThetfunctionIPEXPREADRthasthesamespGeci cationasIPEXPREAD,withthedi erence9thatUUitdo}'esremoveUUtheterminatingcharacter.694.2.27yRecursivep`olynomialsoverQuT9F*or )9rG-vqariaterecursivepolynomialsover )9QthealgorithmsRPREAD &and9RPWRITEJ̲areJthecorrespGondinginputandoutputroutines.nEThesituationforrationalpoly-9nomials(isessentiallythesameasthatforintegralpGolynomialswiththeexceptionthatthe9base6coGecientsmaybGerationalnumbGers.kThesamefreedomsonvqalidinputapplyand9an>arbitrarynumbGer>ofspacesmaybeinsertedbeforeandafter'/'..Ifthedenominator9of}abasecoGecientis1thenonlythenumeratorisintheexternalcanonicalrepresen-9tation.ymustappGearinthesameorderthattheyappearinVandthetermsmustbeorderedin9descending'degreeinvrm.5F*orexample,×ifV=(x,y,z)then(4?z^5-y^2z^4+9xyz)9is:vqalidbut(4?z^5+9yxz-y^2z^4):isnotfortwo:reasons| rst,?yappGearsbefore9xintheterm9?yxzandsecond,֖theterm9?yxzappGearsbefore-?y^2z^4which9violatestherulethattermsmustappGearinorderofdescendingdegreeinz.Additionally*,9if"therearetwo"termswiththesamedegreeinvrQIJthentheyshouldbGeorderedaccording9todescendingdegreeinvr71Tandsoon.qCoGecientsmaybGeseparatedfromthevqariables9bytanarbitrarynumbGerofspaces(includingnospaceatall).gV*ariablesmustbGeseparated9by atleastonespaceifthereisnoexpGonentexplicitlygiven,otherwiseanarbitrarynum-9bGerofspacesmayseparatethem.F*orexample(4z^5?-y^2z^4+9xyz)isvqalidbut9(4z^5?-y^2z^4+9xyz)UUisnotsincexyzwillbGetreatedasasinglevqariable.694.2.47yDistributivep`olynomialsoverQ9DistributivepGolynomialsoverQmaybGereadinandwrittenoutusingthealgorithms9DIRPREADXuandXDIRPWRITE.Theonlydi erencebGetweenXrationaldistributivepolynomials9andPintegraldistributivepGolynomialsisthatthebasecoecientsmaybGerationalnumbGers9andnotjustintegers.ItshouldbGeclearafterreadingtheprecedingsubsectionswhat9constitutesUUvqalidinputandwewillnotdiscussthismatterfurther.694.2.57yConversionBetweenRecursiveandDistributive7yRepresentation9Converting recursivepGolynomialstodistributivepGolynomialscanbeachievedbyusing9DIPFPwhich,given5apGolynomialinrecursiveinternalrepresentation,computesanequiv-9alentoneindistributiveinternalrepresentation.YIntheotherdirection,namelytoconvert9from)Kdistributivetorecursiverepresentation,2thealgorithmPFDIP)?isprovided.cBothDIPFP9and˪PFDIPˌworkforpGolynomialsovereitherZorQbutthenumbGerofvqariablesmustbGe9spGeci ed.j=F*or>example,C=ifA>isapolynomialover>Qininternalrecursiverepresentationand9theUUuserwantsUUtodisplayAinexternaldistributiverepresentationthenthecoGdeDIRPWRITE(r,DIPFP(r,A),V);9whereUUrisequaltothenumbGerUUofvqariablesandVisalistofrvariables,willsuce.694.2.67yPolynomialsoverZ2cmmi8m9The6inputandoutputroutinesforpGolynomialsover6ZworkequallywellforpGolynomials 9overUUZm.A19hC94.33 VDomainffIndeps3endentPolynomialArithmetic9Constructors:'9A?<-PFBRE(r,a)9ŲPolynomial'fromBaseRingElement.NBuilds3$anr-variatep}'olyno- =9mialfr}'omanelementofsomedomain.'9A?<-PMON(a,e)zȲPolynomialUUmonomial.qBuildsax^e2fr}'omaande.'9A?<-PBIN(a1,e1,a2,e2)Polynomial8binomial.Builds8a1|sx^e12k+a2x^e2 fr}'oma1;a2;e1,=9ande2|s.9Selectors:'9a?<-PLDCF(A)u˲PolynomialպleadingcoGecient.G>R}'eturnstheleadingcoecientw.r.t.=9themainvariable.'9B?<-PRED(A)pyβPolynomialreductum.`R}'eturnsythereductum(thepolynomialminus=9itsle}'adingterm)w.r.t.themainvariable.'9a?<-PLBCF(r,A)9ŲPolynomial~leadingbasecoGecient.GR}'eturns "thecoecientofthe=9termofthehighestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).'9a?<-PTBCF(r,A)9ŲPolynomial3trailingbasecoGecient.@R}'eturns thecoecientofthe=9termofthelowestde}'greew.r.t.allvariables(anelementoftheb}'asedomain).9InformationTandPredicates:'9n?<-PDEG(A)pyβPolynomialdegree.yR}'eturns.thedegreeoftheargumentw.r.t.the=9mainvariable.'9n?<-PMDEG(A)u˲Polynomial6qmoGdi eddegree.R}'eturnscthedegreeoftheargument,=91ifthear}'gumentis0.'9n?<-PDEGSV(r,A,i)Polynomialdegree,/spGeci edvqariable.}R}'eturns4thedegreeof=9thear}'gumentw.r.t.thei-thvariable.'9V?<-PDEGV(r,A)9ŲPolynomialvtdegreevector.#R}'eturns_alist(d1|s;:::;drm)wherediis=9thede}'greeofargumentw.r.t.thei-thvariable.'9b?<-PCONST(r,A)y²Polynomialdconstant./T;ests"whetherthear}'gumentisaconstant=9p}'olynomial.'9b?<-PUNT(r,A)zȲPolynomialunivqariatetest.wT;estsPwhetherthear}'gumentisauni-=9variatep}'olynomial.'9k?<-PORD(A)pyβPolynomialp7order.mR}'eturns(thesmallestexponentappearinginthe=9ar}'gumentpolynomial(w.r.t.themainvariable).9T ransformation:'9B?<-PSDSV(r,A,i,n)9PolynomialspGecialdecomposition,speci edvqariable.&Com- c=9putesp(x1|s;:::;x:1=nZi յ;:::;xrm)givenp;i;n,andrG.'9B?<-PDPV(r,A,i,n)PolynomialdivisionbypGowerofvqariable.ComputesӴx䍷ni p=9givenp;i,andn.'9B?<-PMPMV(A,k)9ŲPolynomial multiplicationbypGowerofmainvqariable.Computes=9x^nq~pgivenpandn,withxb}'eingthemainvariableofp.'9B?<-PRT(A)k9ѲPolynomial!reciproGcaltransformation.*Computesx^nq~p(x^1 t)withnz==9degL](p).'9B?<-PDBORD(A)zȲPolynomial>dividedbyorder.DjComputesx^n pwher}'enistheorder=9ofp.A20{GC9Con9version^1|s:'9B?<-PFDIP(r,A)9ŲPolynomialdfromdistributivepGolynomial.![Computesap}'olynomial =9inthesp}'arserecursiverepresentationfromapolynomialinthesparsedistributive=9r}'epresentation.'9B?<-PFDP(r,A)zȲPolynomialfromdensepGolynomial.UComputesDap}'olynomialinthe=9sp}'arserecursiverepresentationfromapolynomialinthedenserecursiverepre-=9sentation.9Miscellaneous:'9B?<-PINV(r,A,k)y²PolynomialintroGductionofnewvqariables.GComputesap}'olyno-=9mialinRDz[y1|s;:::;ysF:;x1;:::;xrm]fr}'omapolynomialinRDz[x1|s;:::;xrm].'9B?<-PPERMV(r,A,P)PolynomialpGermutationofvqariables.PComputes82ap}'olynomial=9inCRDz[xp1r;:::;xpr ]fr}'omapolynomialinRDz[x1|s;:::;xrm],lwhere(p1|s;:::;prm)isa=9p}'ermutationof(1;:::;rG).'9B?<-PCPV(r,A,i,j)PolynomialUUcyclicpGermutationofvqariables.'9B?<-PICPV(r,A,i,j)9PolynomialUUinversecyclicpGermutationofvqariables.'9B?<-PTV(r,A,i)9ŲPolynomialUUtranspGosevqariables.'9B?<-PTMV(r,A)zȲPolynomialUUtranspGosemainvqariables.'9B?<-PUFP(r,A)zȲPolynomial,univqariate,fromxpGolynomial.1ComputesZaunivariate=9p}'olynomial0Mfromanr-variatepolynomialbysubstituting0forallvariablesexcept=9themainvariablexrm.'9L?<-PCL(A)k9ѲPolynomialcoGecientlist.ۺR}'eturnsalist(pnq~;:::;p0|s)wherenisthe=9de}'greeofpandthepi3ar}'ethecoecientsofp.!č94.43 VIntegralffPolynomialArithmetic9BasicTarithmetic:'9C?<-IPSUM(r,A,B)IntegralUUpGolynomialsum.'9C?<-IPDIF(r,A,B)IntegralUUpGolynomialdi erence.'9B?<-IPNEG(r,A)9ŲIntegralUUpGolynomialnegative.'9C?<-IPPROD(r,A,B)IntegralUUpGolynomialproduct.'9C?<-IPIP(r,a,B)y²IntegralpGolynomialintegerproGduct.ComputesGc&pgivenan=9inte}'gercandanintegralpolynomialp.'9C?<-IPP2P(r,B,m)IntegralUUpGolynomialpowerUUof2product.'9IPQR(r,A,B;?Q,R)y²IntegralUUpGolynomialquotientandremainder.'9C?<-IPQ(r,A,B)9ŲIntegralUUpGolynomialquotient.'9C?<-IPIQ(r,A,b)y²Integral[pGolynomialintegerquotient.Computesp=cgivenan=9inte}'gralpolynomialpandanintegerc.'9C?<-IPPSR(r,A,B)IntegralUUpGolynomialpseudo-remainder.'9IUPSR(A,B;?ab,bb,C)9IntegralUUunivqariatepGolynomialsemi-remainder.'9B?<-IPEXP(r,A,n)IntegralUUpGolynomialexponentiation.'9s?<-IPSIGN(r,A)y²IntegralUUpGolynomialsign.'9B?<-IPABS(r,A)9ŲIntegralUUpGolynomialabsolutevqalue.9X-ffl) J= "5-:1LSeeXSection4.7foradescriptionofthesparsedistributivÎeandthedenserecursiverepresentations.A21C9Di eren9tiationTandIntegration:؞'9B?<-IPDMV(r,A)9ŲIntegralUUpGolynomialderivqative,mainvqariable.؞'9B?<-IPDER(r,A,i)Integral/pGolynomialderivqative.e3Computesq1thederivativeofthe =9ar}'gumentw.r.t.thei-thvariable.'9B?<-IPHDMV(r,A,k)IntegralEZpGolynomialhigherderivqative,[mainvqariable.ACom-=9putesthek-thderivativeofthear}'gumentw.r.t.themainvariable.'9B?<-IPINT(r,A,b)Integral6pGolynomialintegration.jComputes theinte}'gral ofthe=9ar}'gumentw.r.t.themainvariable.؞9SubstitutionTandEv\raluation:'9C?<-IPSMV(r,A,B)Integral pGolynomialsubstitutionformainvqariable.YSubstitutes=9aninte}'gralpolynomialforthemainvariableofanintegralpolynomial.؞'9C?<-IPSUB(r,A,i,B)9Integral8pGolynomialsubstitution.Substitutes8aninte}'gral8poly-=9nomialforthei-thvariableofaninte}'gralpolynomial.'9C?<-IPGSUB(r,A,s,L)yIntegralpGolynomialgeneralsubstitution..Substitutes`anin-=9te}'gralpolynomialsforallvariablesofanintegralpolynomial.'9B?<-IUPQS(A)u˲IntegralUUunivqariatepGolynomialquotientsubstitution.'9B?<-IPEMV(r,A,a)Integral{~pGolynomialevqaluationofmainvariable.ASubstitutesa=9c}'onstantforthemainvariableofanintegralpolynomial.'9B?<-IPEVAL(r,A,i,a)yIntegralpGolynomialevqaluation.Substitutesac}'onstantfor=9thei-thvariableofaninte}'gralpolynomial.'9b?<-IUPBEI(A,c,m)Integral4univqariatepGolynomialbinaryrationalevaluation,;in-=9tegerUUoutput.'9s?<-IUPBES(A,a)y²IntegralLpunivqariatepGolynomialbinaryrationalevaluationofsign.'9b?<-IUPBRE(A,a)y²IntegralUUunivqariatepGolynomialbinaryrationalevaluation.'9B?<-IPBEILV(r,A,c,k,m)9IntegralpGolynomialbinaryrationalevqaluation,integral=9pGolynomialUUresult,leadingvqariable.'9B?<-IPBREI(r,A,i,c)yIntegral8pGolynomialbinaryrationalevqaluation,qintegralpGoly-=9nomialUUresult.؞9T ransformation:'9B?<-IPTRMV(r,A,h)IntegralYpGolynomialtranslation, mainvqariable. Computes=9p(x8+h)givenpandh,wher}'existhemainvariableofp.؞'9B?<-IPTRAN(r,A,T)IntegralpGolynomialtranslation.?Computes 7p(x1Բ+ at1|s;:::;xry+=9trm)givenpandthetiTL.'9B?<-IPBHT(r,A,i,k)9IntegralUUpGolynomialbinaryhomothetictransformation.'9B?<-IPBHTLV(r,A,k)9IntegralpGolynomialbinaryhomothetictransformation,lead-=9ingUUvqariable.'9B?<-IPBHTMV(r,A,k)9IntegralzrpGolynomialbinaryhomothetictransformation,9main=9vqariable.'9B?<-IUPBHT(A,k)y²IntegralunivqariatepGolynomialbinaryhomothetictransforma-=9tion.'9B?<-IUPIHT(A,n)y²IntegralDunivqariatepGolynomialintegerhomothetictransforma-=9tion.'9B?<-IPNT(r,A,i)y²IntegralUUpGolynomialnegativetransformation.'9B?<-IUPNT(A)u˲IntegralUUunivqariatepGolynomialnegativetransformation.A22/C'9B?<-IPTR(r,A,i,h)IntegralUUpGolynomialtranslation,speci edvqariable.ꍍ'9B?<-IUPTR(A,h)9ŲIntegralUUunivqariatepGolynomialtranslation.'9B?<-IPTR1(r,A,i)IntegralbpGolynomialtranslationby1,espGeci edvqariable.speci- =9 edUUvqariable.'9B?<-IPTRLV(r,A)y²IntegralUUpGolynomialtranslation,leadingvqariable.'9B?<-IPTR1LV(r,A)IntegralUUpGolynomialtranslationby1,leadingvqariable.'9B?<-IUPTR1(A)zȲIntegralUUunivqariatepGolynomialtranslationby1.ꍍ9Predicates:'9t?<-IPCONST(r,A)Integral"pGolynomialconstant.`T;estsewhetherthear}'gumentisa=9c}'onstant.ꍍ'9t?<-IPONE(r,A)9ŲIntegralUUpGolynomialone.qT;estswhetherthear}'gumentis1.9RandomTP9olynomialGeneration:'9A?<-IPRAN(r,k,q,N)9IntegralUUpGolynomial,random.9Con9version:'9IPSRP(r,A;?a,Ab)y²IntegralpGolynomialsimiliartorationalpolynomial.Givena=9r}'ationalpolynomialq[,computesarationalnumbercandanintegralpolynomial=9pwithcp=q[.ꍍ'9B?<-IPFRP(r,A)9ŲIntegralpGolynomialfromrationalpolynomial.Computes)anin-=9te}'gral>=polynomialfromarationalpolynomialwhosebasecoecientsareintegers.9Input/Output:'9IPREAD(;?r,A)u˲IntegralUUpGolynomialread.ꍍ'9IPEXPREAD(r,V;?A,t)9IntegralUUpGolynomialexpressionread.'9IPWRITE(r,A,V)zȲIntegralUUpGolynomialwrite.'9IPDWRITE(r,A,V)9ŲIntegralBPolynomialDistributiveW*rite.FWritesQaninte}'gralQrecur-=9sivep}'olynomialindistributiveform.ꍍ9Con9tentsTandPrimitiv9eParts:'9IPICPP(r,A;?a,Ab)IntegralUUpGolynomialintegercontentandprimitivepart.ꍍ'9c?<-IPIC(r,A)zȲIntegralUUpGolynomialintegercontent.'9Ab?<-IPIPP(r,A)y²IntegralUUpGolynomialintegerprimitivepart.'9d?<-IPICS(r,A,c)IntegralUUpGolynomialintegercontentsubroutine.'9IPSCPP(r,A;?s,C,Ab)9IntegralpGolynomialsign,#content,andprimitivepart.]0Com-=9putesxthesign,c}'ontentandprimitivepartoftheargumentw.r.t.themainvari-=9able.'9IPCPP(r,A;?C,Ab)y²IntegralUUpGolynomialcontentandprimitivepart.'9C?<-IPC(r,A)u˲IntegralUUpGolynomialcontent.'9Ab?<-IPPP(r,A)9ŲIntegralUUpGolynomialprimitivepart.'9IPLCPP(r,A;?C,P)y²IntegralUUpGolynomiallistofcontentsandprimitiveparts.ꍍ9P9olynomialTNorms:'9b?<-IPSUMN(r,A)y²IntegralUUpGolynomialsumnorm.ꍍ'9b?<-IPMAXN(r,A)y²IntegralUUpGolynomialmaximumnorm.A23lC9ChineseTRemainderAlgorithm:'9As?<-IPCRA(M,m,mp,r,A,a)IntegralUUpGolynomialchineseremainderalgorithm.9SquarefreeTF actorization:'9L?<-IPSF(r,A)zȲIntegralUUpGolynomialsquarefreefactorization.'9L?<-IPFSD(r,A)9ŲIntegralUUpGolynomialfactorization,secondderivqative.'9L?<-IPSFSD(r,A)y²IntegralUUsquarefreefactorization,secondderivqative.9ComputationsTinIdeals:'9B?<-IPTRUN(r,D,A)Integral8pGolynomialtruncation.Computes8pmod(x:d1l1ҵ;:::;x^dr፴ri) =9givenpandthediTL.'9C?<-IPTPR(r,D,A,B)9IntegralUUpGolynomialtruncatedproduct.qComputespqmod=9(x:d1l1ҵ;:::;x^dr፴ri)givenp;q[,andthediTL.'9B?<-IPIHOM(r,D,A)IntegralDpGolynomialmodidealhomomorphism. ?Computes=9pmoGd U=9(x:d1l1ҵ;:::;x㍴dr,r 0ncmsy51Ír718)givenanr-variatep}'olynomialpandthediTL.'9C?<-IPIPR(r,D,A,B)9IntegralUUpGolynomialmodidealproduct.qComputespqmod=9(x:d1l1ҵ;:::;x㍴dr,r1Ír718)givenr-variatep}'olynomialspandqandthediTL.'9C?<-IUPTPR(n,A,B)IntegralgGunivqariatepGolynomialtruncatedproduct.Computes =9pqmoGdصx^n egivenunivariatep}'olynomialspandqandaBETA-digitn. o94.53 VMos3dularffPolynomialArithmetic9NotethatthefunctionswhosenamesbGeginwithMI|arebaseduponmodularintegerarith-9metic,~hwhilev1thosebGeginningwithMPv(andMUParebasedupGonmodulardigitarithmetic9withUUaprimemoGdulus^2|s.>w9BasicTarithmetic:'9C?<-MIPSUM(r,M,A,B)yMoGdularUUintegralpolynomialsum.'9C?<-MPSUM(r,m,A,B)9MoGdularUUpolynomialsum.'9C?<-MIPDIF(r,M,A,B)yMoGdularUUintegralpolynomialdi erence.'9C?<-MPDIF(r,m,A,B)9MoGdularUUpolynomialdi erence.'9B?<-MIPNEG(r,M,A)MoGdularUUintegralpolynomialnegation.'9B?<-MPNEG(r,m,A)MoGdularUUpolynomialnegative.'9C?<-MIPPR(r,M,A,B)9MoGdularUUintegralpolynomialproduct.'9C?<-MPPROD(r,m,A,B)yMoGdularUUpolynomialproduct.'9B?<-MPUP(r,m,c,A)MoGdularUUpolynomialunivqariateproduct.'9C?<-MPMDP(r,p,a,B)9MoGdularUUpolynomialmodulardigitproduct.'9C?<-MIPIPR(r,M,D,A,B)MoGdularUUintegralpolynomialmodidealproduct.'9MIUPQR(M,A,B;?Q,R)MoGdularintegralunivqariatepolynomialquotientandremain-=9der.'9MPQR(r,p,A,B;?Q,R)MoGdularUUpolynomialquotientandremainder.'9C?<-MPQ(r,p,A,B)MoGdularUUpolynomialquotient.'9C?<-MPUQ(r,p,A,b)MoGdularUUpolynomialunivqariatequotient.9Qffl) J= "5-:2LSeeXSection3.3fordetailsonmoandB =PލQn%Qi=0:HbiTLx^ir/,thentheSylvestermatrixofAandB-isthe9(m8+n)(m+n)UUsquarematrixC{0.IfM8istheSylvestermatrixof9AIandBq,Kthenfor0ijYSdi >}wherediisas9inUUthepreviousde nition.9Ther}'educedPRSkisobtainedbysettingAi>=prem(Ai2 ;Ai1)=c:i*+1;Zimy,n:whereci>=9ldcfh(Ai2 )UUandid=deg꧟qƴxrB(Ai3)8deg\oqƴxrm (Ai2)UUfor3in,UUwith3C=0.9Althoughitisnotimmediatelyclearfromthede nitions,NabGothsubresultantPRSsas9wellUUasthereducedPRScanbGeshowntobGe,infact,PRSs.9F*orunivqariatepGolynomialsovera eldwemayde newhatisknownasthenatur}'alPRS9de nedHbyAid=Ai2UȵQiTLAi1 ,°Jt(Ai)werefertotheGCDz4ofAandBwewillmeantheGCDz4de ned9byUUthealgorithmsandthiswillbGedenotedbygcdUW(A;Bq).9Algorithms(arealsoavqailableforthecomputationofresultantsofrG-vqariatepolynomials9overRR߲=ZorR=ZpR.Thepackqagealsoprovidesalgorithmsforcomputingthesubresultant9PRS',and'7thereducedPRSforrG-vqariatepolynomialsover'7R߲=ZandthesubresultantPRS9forUUrG-vqariatepolynomialsoverUUR߲=ZpR.96.33 VDe nitionsffofTferms9coarsestTsquarefreebasis5If,A=(A1|s;:::;Anq~)isalistofrG-vqariatepolynomials,4acoars-'9estsquarefreebasisforAisalistB=/(B1|s;:::;Bm)ofpairwiserelativelyprime'9squarefreerG-vqariatepolynomialssuchthateachAi4EinAcanbGeexpressedastheprod-'9uctUUofpGowersUUofelementsofBq.H9discriminan9tQIfkAisanrG-vqariatepolynomialofdegreeninitsmainvqariable,밵n2,'9the?discriminantofAisthe(r1)-vqariatepGolynomialequaltothequotientof'9(1)^n(n1)=2"ɲres/C(A;A^09)Hwhendividedbya,whereA^0{isthederivqativeofAwithrespGect'9toUUitsmainvqariableandaistheleadingcoGecientofA.9 nestTsquarefreebasisA< nestsquarefreebasisBK=(B1|s;:::;Bm)foralistAofrG-'9vqariateZpGolynomialsisacoarsestsquarefreebasisforAwiththeadditionalcondition'9thatUUeachBiisirreducible.9cofactors?If_C{istheGCD9oftwo_pGolynomialsAandBiвthenthecofactorsofAandBq,'9respGectively*,UUareA=C qandBq=C.9ffl) J= "5-:1Lprem(FdAogreatestsquarefreedivisorofapGolynomialAisasquare-'9free+pGolynomialCGthatdividesAandissuchthatanyothersquarefreepGolynomial'9thatUUdividesAalsodividesC.9primitiv9eTpartZTheprimitivepartofapGolynomialAistheabsolutevqalueofA=cwhere'9cUUisthecontentUUofA.9primitiv9eTpQolynomial|DyAUUpGolynomial,thecontentUUofwhichis1.9squarefreeTfactorizationQ@The<]squarefreefactorizationofAisA=A:e1l1 2bA~ekk Dzwhere<]1'9e1C<8׵<ekandÎeachoftheAiڲisapGositivesquarefreepGolynomialofpositivedegree.'9NoteUUthatifAissquarefreethenA^1ȲisthesquarefreefactorizationofA.9squarefreeTpQolynomialݵAcpGolynomialcAissquarefreeifeachfactoroccursonlyonce.!In'9otherZwords,\]ifAx=A:e1l1 2bA~ekk _isZacompletefactorizationofAtheneachoftheeiAis'9equalUUto1.9univ\rariateTcon9tentn IfAisanrG-vqariatepolynomial,Q|r^hK2,thentheunivqariatecontent'9ofAisaunivqariatepGolynomialinthemostminorvariableequaltotheGCDwofthe'9coGecientsUUofA,whereAisconsideredasanelementof(RDz[x1|s])[x2;:::;xrm].9univ\rariateTprimitiv9epartGivenD.anrG-vqariatepolynomialA,Gr52,theD.univqariateprim-'9itiveLpartofAistherG-vqariatepolynomialA=a,IwhereaistheunivqariatecontentLof'9A.!č96.43 VMethos3dsffandAlgorithms9Injthissectionwebrie ydiscussthemainalgorithmsthatmightbGeofinteresttotheuser9andUUgiveasketchofthemathematicalideasbGehindthesealgorithms.696.4.17yGCDComputationsuT9T*otcomputetheGCDIoftwotunivqariatepGolynomialsovertRg=ݠZpR,&aMPGCDC5proceeds9recursivelyJuntilitarrivesatunivqariatepGolynomialswhereuponMUPGCD*iscalled.FnTheGCD9computedUUismonic.9T*obobtaintheGCD>oftwobrG-vqariateintegralpolynomialsAandB_Ӳonewouldusethe9algorithm IPGCDCwhichalsocomputesthecofactorsofAandBq.InthisalgorithmmoGd-9ularZhomomorphismsandChineseremainderingareusedtoreducetheproblemtoGCD9computationsUUofrG-vqariatepolynomialsoverUUR߲=ZpR,whichissolvedbyMPGCDC.96.4.27yResultantsuT9Using4thealgorithmsuggestedbythede nitionoftheresultant,lnamelytoconstructthe9SylvesterUUmatrixandcomputeitsdeterminant,isnotthemostecientwaytoproGceed.A33")נC9Instead,MUPRESJ#computesJbtheresultantoftwounivqariatepGolynomialsAandBӲover 9R߲=ZpbyUUcomputingthenaturalPRSofAandBƲandbyusingtheidentityK{res>G(A;Bq)=(1)q\" yȴn1  2Y t i=2Rbc㍴di1 Ƿdi+1i&؟\#Ocdn1፴n!9whereUUcid=ldcfc(AiTL),di=deg(AiTL),j=Pލ USk+B2% USi=1'didi+1ɤandA1|s;:::;AnӲisthenaturalPRS.9F*orpcalculatingtheresultantofrG-vqariatepolynomialsoverpR&=ZpR,N6MPRESOp}'olynomialAoverR߲=Z,Oncomputesthepositiveandprimitivegreatestsquare-=9fr}'eedivisoroftheprimitivep}'artofA.'9L?<-IPSF(r,A)zȲIntegralunivqariatepolynomialextendedgreatestcommon =9divisor. ComputestheGCDICoftwounivariatep}'olynomialsAandBfover=9R߲=Zp39aswelltheunivariatep}'olynomialsUandVsuchthatAUO+8BqV=C.'9MUPHEG(p,A,B;?C,V)MoGdular4univqariatepolynomialhalf-extendedgreatestcom-=9monm$divisor.ComputestheGCDɵC`oftwounivariatep}'olynomialsAandB*@over=9R1/=hZpbasÌwelltheunivariatep}'olynomialVpsuchthatAUr+[fBqVVL=Czforsome=9U.A36%_ C9iChapter 729cP8olynomial T{Factorization:97.13 VMathematicalffPreliminaries9Anon-constantpGolynomialA(x1|s;:::;xrm)inRDz[x1;:::;xrm],٣whereR}isauniquefactorization 9domain,issaidtobGeirr}'educibleifAcannotbeexpressedastheproductoftwonon-constant9pGolynomials+inRDz[x1|s;:::;xrm].5dTheproblemoffactoringapolynomialA(x1|s;:::;xrm)isthatof9 ndingFdistinctirreduciblepGolynomialsAiTL(x1|s;:::;xrm)andintegersei,|޵i=1;:::;kP,suchFthat9A=A:e1l1 2bA~ekkj. Suchaanexpressioniscalledac}'ompletefactorizationofA.ThepGolynomials9AiareUUcalledtheirr}'educiblefactorsUUofAandtheintegereiiscalledthemultiplicityofAiTL.!č97.23 VPurps3ose9TheCSACLIB)y4pGolynomialCfactorizationpackqageprovidesfactorizationalgorithmsforR߲=ZpR,9p[asingle-precisionprimeandrE=1,?andforR=ZforrE1.F*orR=Zoneobtains9theqsign,5wintegercontentandpGositiveprimitiveirreduciblefactorsofA,5waswellasthe9multiplicityBofeachirreduciblefactor.kTheintegercontentisnotfactored.kF*orR߲=Zp/the9irreducibleUUfactorsobtainedaremonic.!č97.33 VMethos3dsffandAlgorithms9T*obfactoranarbitraryunivqariatepGolynomialmoduloaprime,$oneshould rstobtaina9similarmonicpGolynomialbyusingthealgorithmMPMON.Havingdonethis,wonethencom-9putesR-thesquarefreefactorsofthemonicpGolynomialbyusingthealgorithmMUPSFF.In9orderɞtofactoreachsquarefreefactoronewoulduseMUPFBL,whichimplementsBerlekqamp's9algorithm.qTheUUirreduciblefactorsreturnedbyMUPFBLaremonic.9F*orfactoringaunivqariateintegralpGolynomial,IUPFACI rstcomputesthesquarefree9factorizationusingthealgorithmIPSF.Thesquarefreefactorsareinturnfactoredusing9IUSFPFffwhichfj rstcomputesafactorizationmoGduloaprimeandthemodularfactorsthus9obtainedEarethenliftedbythequadraticversionoftheHenselconstruction.:IUPFACreturns9theQsign,Rtheintegercontentandalistofirreduciblefactors,Rwithmultiplicities,Roftheinput9pGolynomial.qTheUUirreduciblefactorsreturnedbyIUPFACarepositiveandprimitive.9MultivqariateƜintegralpGolynomialsarefactoredbyusingIPFAC.Thisalgorithm rstcom-9putesthecontentaswellasthesquarefreefactorsoftheprimitivepartoftheinputpGoly-9nomialIandsubsequentlyfactorseachoftheseseparately*.mThefactorizationofasquarefree9primitivepGolynomialisperformedbythealgorithmISFPF֨whichimplementsamultivqariate9lifting{techniquebasedontheHensellemma.9Theliftingisdoneonevqariableatatimeas9oppGosedUUtoliftingseveralvqariablessimultaneously*.A37&fC9If7thepGolynomialAtobefactoredhasrationalbasecoecientsthenitmust rstbGe 9convertedMPtoanintegralpGolynomialbymultiplyingAbytheleastcommonmultipleofthe9denominators` ofthebasecoGecientsandthenconvertingthepGolynomialthusobtainedto9integralrepresentation.RThiscanbGeachievedbyusingIPSRPwhichcomputestheprimitive9andUUpGositiveintegralpGolynomialA^0#aswellastherationalnumbGerasuchthatA=aA^09.!č97.43 VFfunctions9F actorization:'9IPFAC(r,A;?s,c,L)Integral^$pGolynomialfactorization.3F;actorsr-variatep}'olynomi-=9alsoverZ.'9IUPFAC(A;?s,c,L)y²IntegralunivqariatepGolynomialfactorization._QF;actors`univariate=9p}'olynomialsoverZ.'9L?<-MUPFBL(p,A)y²MoGdular8univqariatepolynomialfactorization-Berlekqampalgorithm.=9F;actorsmonicsquar}'efreeunivariatep}'olynomialsoverZpR.9AuxiliaryTF unctionsforFactorization:'9IPCEVP(r,A;?B,L)y²IntegralpGolynomial,#choiceofevqaluationpGoints.]GivenZaninte- =9gr}'al\polynomialAthatissquarefreeinitsmainvariable,gcomputesintegersthat,=9whensubstitute}'dfortheminorvariables,DmaintainthedegreeofAinthemain=9variableanditssquar}'efreeness.'9b?<-IPFCB(V)u˲IntegralspGolynomialfactorcoecientbound.͈Given thede}'gree vec-=9tor*Sofaninte}'gral*SpolynomialA,Ocomputesanintegerbsuchtheproductofthe=9in nity normsofanydivisorsofAislessthanore}'qualto2^bPtimesthein nity=9normofA.'9Lp?<-IPFLC(r,M,I,A,L,D)yIntegralUUpGolynomialfactorlistcombine.'9B?<-IPFSFB(r,A)y²IntegralUUpGolynomial nestsquarefreebasis.'9a?<-IPGFCB(r,A)y²IntegralUUpGolynomialGelfondfactorcoecientbound.'9IPIQH(r,p,D,Ab,Bb,Sb,Tb,M,C;?A,B)޹Integral8pGolynomialmodidealquadraticHensel=9lemma.'9L?<-ISFPF(r,A)9ŲIntegralsquarefreepGolynomialfactorization.o2Given#ap}'ositive,=9primitiveinte}'gralpolynomialAthatissquarefreewithrespecttothemainvari-=9able,c}'omputesalistofthedistinctpositiveirreduciblefactorsofA.'9IUPFDS(A;?p,F,C)y²IntegralUUunivqariatepGolynomialfactordegreeset.'9IUPQH(p,Ab,Bb,Sb,Tb,M,C;?A,B)ɹIntegral%univqariatepGolynomialquadraticHensel=9lemma.'9Fp?<-IUPQHL(p,F,M,C)IntegralunivqariatepGolynomialquadraticHensellemma,=9list.'9L?<-IUSFPF(A)zȲIntegralQunivqariatesquarefreepGolynomialfactorization.fGiven{a=9univariate,qp}'ositive,primitive,squarefreeintegralpolynomialA,qcomputesalist=9ofthep}'ositiveirreduciblefactorsofA.'9M?<-MCPMV(n,L)9ŲMatrix>ofcoGecientsofpolynomials,ywithrespecttomainvqari-=9able.'9MIPISE(r,M,D,A,B,S,T,C;?U,V)yMoGdular}integralpolynomialmodideal,solution=9ofUUequation.'9MIUPSE(M,A,B,S,T,C;?U,V)yMoGdularUintegralunivqariatepolynomial,solutionof=9equation.A38't۠C'9MPIQH(r,p,D,Ab,Bb,Sb,Tb,M,Dp,C;?A,B)yMoGdular8polynomialmodideal,qquadratic =9HenselUUlemma.'9Fp?<-MPIQHL(r,p,F,M,D,C)MoGdular8polynomialmodideal,qquadraticHensellemma,=9list.'9MPIQHS(r,M,D,Ab,Bb,Sb,Tb,s,n,C;?A,B,S,T,Dp)9qMoGdularSpolynomialmodideal,=9quadraticUUHensellemmaonasinglevqariable.'9Q?<-MUPBQP(p,A)y²MoGdularunivqariatepolynomialBerlekqampQ-polynomialscon-=9struction.'9L?<-MUPDDF(p,A)y²MoGdular8polynomialdistinctdegreefactorization.Given8amonic,=9squar}'efreepolynomialAoverRy=eZpR,vcomputesalist((n1|s;A1),v:::,v(nk됵;Ak)),=9wher}'ethenijarepositiveintegerswithn1P<)R<)nkandeachAijistheproduct=9ofallmonicirr}'educiblefactorsofAofde}'greeniTL.'9L?<-MUPFS(p,A,B,d)9MoGdularUUunivqariatepolynomialfactorization,special.A39(ؠC9iChapter 829cReal T{Ro otCalculation:98.13 VMathematicalffPreliminaries9Let׵A(x)bGeaunivqariatepolynomialwithintegercoecients. MAqrealnumbGerx0 ]Jwith 9A(x0|s)9=0iscalledar}'ealhrootofA(x).ArealnumbGerx0DvisarootofA(x)ifandonlyif9A(x)isdivisibleby(x}x0|s),i.e.lifthereisapGolynomialBq(x)withrealcoecientssuch9that A(x)'I=(x_Zx0|s)Bq(x).F*oranyrealroGotx0 ofA(x)thereisanaturalnumbGerkߣsuch9that A(x)isdivisibleby(xθx0|s)^kKbut notby(xθx0|s)^k+B+1 .This numbGerk^Riscalledthe9multiplicityroftheroGotx0ofA(x).Rootsofmultiplicityr1arecalledsimpler}'oots.An9intervqalIșcontainingx0|*butnootherrealroGotofA(x),iscalledanisolatingE#intervalforx0|s.9F*orexample, ifA(x)=x^22,theintervqal(2;2)isnotanisolatingintervqalforarealroGot9ofUUA(x),but(0;1000)is.!č98.23 VPurps3ose9TheSACLIB,realroGotcalculationpackqagesolvesnon-linearequationsinonevqariable:FIt9computes!OisolatingintervqalsfortherealroGotsofunivariateintegralpGolynomialsalongwith9theUUmultiplicityofeachroGot,anditre nestheisolatingintervqalstoanyspGeci edsize.!č98.33 VMethos3dsffandAlgorithms9F*orroGotisolationthreemethodsareavqailable./uThec}'oecientsignvariationmetho}'d(or:9mo}'di edUspenskymethod),is-basedonDescartes'ruleofsigns.OOTheCollins-L}'oosmethod9isUUbasedonRolle'stheorem.qSturm'smetho}'disbasedonSturmsequences.9Generally*,&theIcoGecientsignvqariationmethodismanytimesfasterthantheothertwo9methoGds.F*orhthecoecientsignvqariationmethodvqariousmainprogramsareprovidedto9accommoGdateUUdetailsofinputandoutputspeci cations.9F*orXthere nementofisolatingintervqalstoanyspGeci edprecisionasymbGolicversionof9Newton'sUUmethoGdisused.9GivenanarbitraryintegralpGolynomialIPRCH willcalculateallitsrealrootstospeci ed9accuracy*.FTheӣmultiplicityofeachroGotisalsocomputed.FThealgorithmusesthecoecient9sign^vqariationmethoGdtoisolatetherootsfromeachotherandthenappliesNewton'smethod9toUUre netheisolatingintervqalstothedesiredwidth.9GivenlasquarefreeintegralpGolynomialIPRIMXisolatesalltherealrootsfromeachother.9TheroGotsinsideaspeci edopenintervqalareisolatedbyIPRIMO.BothIPRIMandIPRIMO9usethecoGecientsignvqariationmethod.LOthermainalgorithmswhichusethismethod9areUUIPRIMSandIPRIMW.A40)C9TheCollins-LoGosmethodisimplementedinIPRICL:Givenanarbitraryunivqariatein- 9tegralpGolynomialIPRICLgproducesalistofisolatingintervqalsforitsrealroots.>These9intervqalsJhavetheadditionalpropGertythatthe rstderivqativeofAismonotoneoneachof9them.9AneimplementationofSturm'smethoGdisprovidedbyIPRIST:Givenasquarefreeuni-9vqariateUUintegralpGolynomialIPRISTproducesalistofisolatingintervqalsforitsrealroots.9RoGotsWofdi erentpolynomialscanbeisolatedfromeachotherusingtheprogramIPLRRI.9Reference:[QJeremy(hR.Johnson:Algorithmsjforp}'olynomialrealrootisolation.bT*echnical9ResearchcRepGortOSU-CISRC-8/91-TR21,\&1991. NTheOhioStateUniversity*,\&2036Neil9AvenueUUMall,Columbus,Ohio43210,Phone:q614-292-5813.!č98.43 VDe nitionsffofTferms9binaryTrationaln9umbQerWAUUrationalnumbGerUUwhosedenominatorisapowerUUof2.9in9terv\ral9/;AlistunivqariatepGolynomial,Fvariationsforstandardinterval.A43,C9iChapter 929cAlgebraic T{Num8b erArithmetic:99.13 VMathematicalffPreliminaries9AnalgebraicnumbGerisanumberthatsatis esarationalpolynomialequation./Analgebraic 9numbGerԫ %isrepresentedbyanirreduciblepGolynomial,A(x),suchԫthatA( z)Q=0.AԊreal9algebraicTnumbGer,!isarealnumbGerthatisalsoanalgebraicnumbGer,!anditisrepresentedby9anirreduciblepGolynomialandanisolatingintervqaltodistinguishitfromitsrealconjugates.9ThecollectionofalgebraicnumbGersformsa eldcontainingtherealalgebraicnumbGersasa9sub eld.o]SinceNA(x)isirreducible,Otheextension eldQ( z)obtainedbyadjoining Wtothe9rationalbnumbGer eldisisomorphictoQ[x]=(A(x))andelementsofQ( z)arerepresented9by/pGolynomialswhosedegreesarelessthanthedegreeofA(x).eIf 8isrealthenQ( z)isan9orderedUU eldandsigncomputationscanbGeperformedusingtheisolatingintervqalfor z.!č99.23 VPurps3ose9Then`SACLIB)Όalgebraicn`numbGerarithmeticpackqageprovidesalgorithmsforpGerformingarith-9meticvwithalgebraicnumbGers,>withvelementsofanalgebraicnumbGer eld,>andwithpoly-9nomials AwhosecoGecientsbelongtoanalgebraicnumber A eld.Therearealgorithmsfor9computingOthegcdoftwoOpGolynomialswithalgebraicnumberOcoecientsOandforfactoring9a pGolynomialwithalgebraicnumber coecients.YAlgorithms arealsoprovidedforperform-9ingsigncomputationsinarealalgebraicnumbGer eldandforisolatingtherealrootsofa9pGolynomialUUwithrealalgebraicnumberUUcoecients.!č99.33 VMethos3dsffandAlgorithms9AlgorithmsI0forpGerformingalgebraicnumberI0arithmeticuseresultantcomputations.MYLet9A(x)C=Pލ Ѿm% Ѿi=0aiTLx^iϲ=am CCQލ m% i=1 )[(xj i)bGetheintegralminimalpolynomialfor L=C 1oand9letdBq(y[ٲ)=Pލ USn% USjg=0Vbj6y^jY=bn&Qލn%jg=1䞲(yX j6)dbGetheintegralminimalpolynomialfor N4= 1|s.!The9minimalpGolynomialfor 爐+* 3isafactorofres2x(A(x);Bq(yBx))andtheminimalpGolynomial9for' k Cisafactorofresg`xpD(A(x);x^nq~Bq(y[=x)).:LetBq^U(y[ٲ)=Norm(Bq( z;y)),ٜandletQލ ,wt% ,wi=1KnB^q;ZiU(y)9bGe\theirreduciblefactorizationofBq^U(y[ٲ).Providedthenormissquarefreetheirreducible9factorization~ofBq( z;y[ٲ)o=Qލ zt% zi=1qgcd+s(B( z;y[ٲ);B^;ZiU(y[ٲ)).BIf~B^(y[ٲ)~isnotsquarefree,atransla-9tion,7oBq( z;yI!s ),is/computedwhosenormissquarefree.eRThefactorizationofBq( z;y[ٲ)can9bGeUUrecoveredfromthefactorizationofthetranslatedpGolynomial.9SACLIBFalsoqprovidesanalgorithmforcomputingaprimitiveelementofamultiple9extension eld.XLet and bGealgebraicnumbers andconsiderthemultipleextension eld9Q( z; ).^]Theprimitiveelementtheoremstatesthatthereexistsaprimitiveelement Psuch9that,VQ( z; )=Q( 8).dThealgorithmsANPEDE,LandANREPEprovideaconstructiveversionof9thisUUtheorem.9References:IR.G.K.LoGos:ComputingJinAlgebr}'aicExtensions,In\ComputerAlgebra,9SymbGolicUUandAlgebraicComputation",pages173{187.9JeremyʨR.Johnson:\mAlgorithmsforp}'olynomialrealrootisolation.T*echnicalʨResearch9RepGortDOSU-CISRC-8/91-TR21,H1991.lCTheOhioStateUniversity*,H2036NeilAvenueMall,9Columbus,UUOhio43210,Phone:q614-292-5813.A45.ȳC9BarryT*rager:Algebr}'aicF;actoringandRationalF;unctionIntegration,nIn\SYMSAC'76: 9ProGceedingsVofthe1976ACM1SymposiumonSymbolicandAlgebraicComputation",pages9219{226. 099.43 VDe nitionsffofTferms9algebraicTn9umbQerjRA^solution^ofarationalpGolynomialequation.lAnalgebraicnumber^ '9isиrepresentedeitherbyarationalminimalpGolynomialoranintegralminimalpGoly-'9nomial. 9algebraicTin9tegerfHAUUsolutionofamonicintegralpGolynomialequation.9realTalgebraicn9umbQerAArealRnumbGerthatisalsoanalgebraicnumbGer.ZqAArealalgebraic '9numbGer visrepresentedbyanintegralminimalpGolynomialandanacceptableisolating'9intervqal. 9rationalTminimalpQolynomial.ThezrationalminimalpGolynomialforanalgebraicnumber'9 ^ϲisUUtheuniquemonic,irreduciblerationalpGolynomialA(x)suchthatA( z)=0.9in9tegralTminimalpQolynomialRTheQintegralminimalpGolynomialforanalgebraicnumbGer'9 ^ϲisUUtheunique,pGositive,primitive,integralpGolynomialA(x)suchthatA( z)=0.9acceptableTisolatingin9terv\ralOnanisolatingintervqal,jI,forarealalgebraicnumbGer z,'9whereҵIiseitheraleft-opGenandright-closedstandardintervqaloraone-pGointintervqal.9algebraicT eldelemen9tanNrelementoftheextension eldQ( z).o{ N42Q( )Nrisrepresented'9byalist(r;Bq(y[ٲ)),#where N4=rGB( z)andrisarationalnumbGerandB(y[ٲ)isaprimitive'9integralpGolynomialwhosedegreeislessthanthedegreeoftheminimalpolynomial'9ofUU z. 099.53 VRepresentation9Thereareseveraldi erentrepresentationsforelementsofQ( z).LetA(x)bGetheintegral9minimalpGolynomialforanalgebraicnumber Zwithdego(A(x))=m.RAnelement ~ofQ( z)9canUUbGeuniquelyrepresentedby:r1.'9AUUrationalpGolynomial,Bq(x),whosedegreeislessthanmandsuchthatB( z)= .r2.'9Awpairؙ(r;}fe9B (x)),jwhererisarationalnumbGer,}fe9B (x)ؙisapGositiveprimitiveintegral'9pGolynomial,UUand N4=Bq( z)=r}fe9B]V( z).9Theݖdefaultrepresentationis(2). ThealgorithmAFCRrconvertsrepresentation(1)to(2),9andUUthealgorithmAFICRconvertsUUrepresentation(2)to(1).9LetXZ[ z]denotetheZ-moGdulewithbasis1; z; ^2;:::; ^m1މ. iElementsXofZ[ ]are9representedWbyintegralpGolynomialswhosedegreeislessthanm. KIf Ѳisanalgebraic9integer,?thenZ[ z]isaring.IfanalgorithmdoGesnotrequiredivisionorreductionbythe9minimalpGolynomial,0operationsinQ( z)canbereplacedwithoperationsinZ[ z].When9thisispGossible,CeciencyisgainedbyusingtheintegralrepresentationZ[ z].PAnimpGortant9exampleispGolynomialrealrootisolation.nRLetPc( z;y[ٲ)beapolynomialinQ( z)[y[ٲ]andlet9d0bGethegreatestcommondivisorofthedenominatorsofthecoecientsofPc( z;y[ٲ).YThen9dPc( z;y[ٲ)hisinZ[ ;y[ٲ]andhasthesameroGotsasPc( ;y[ٲ).Moreover,cthehcoGecientsign9vqariationRmethoGdforrealrootisolationonlyusesoperationswhichcanbeperformedin9Z[ z].9ThenameofalgorithmswhichopGerateinZ[ z]beginwiththelettersAM.Thealgorithm9AMPSAFP2޲(r;Pc)ҰcomputesapGolynomial}feP9Ѹ2Z[ z;X1;:::;XrG]Ұwhichissimilartothepoly-9nomialO P*2Q( z)[X1;:::;XrG].oThealgorithmAIFANOcomputesanalgebraicinteger~feog ]such9thatUUQ( z)=Q(~feog o).A46/C99.63 VFfunctions9AlgebraicTNum9bQerArithmetic'9ANIIPE(M,I,N,J,t,L;?S,k,K)Algebraic5numbGerisolatingintervqalforaprimitive =9element'9ANPROD(A,I,B,J;?C,K)yAlgebraicUUnumbGerproduct'9ANSUM(A,I,B,J;C,K)AlgebraicUUnumbGersum'9ANPEDE(A,B;C,t)9ŲAlgebraicUUnumbGerprimitiveelementforadoubleextension'9b?<-ANREPE(M,A,B,t)yAlgebraic}numbGerrepresentelementofaprimitiveexten-=9sion9AlgebraicTFieldArithmetic'9c?<-AFDIF(a,b)9ŲAlgebraicUUnumbGer eldelementdi erence'9b?<-AFINV(M,a)9ŲAlgebraicUUnumbGer eldelementinverse'9b?<-AFNEG(a)u˲AlgebraicUUnumbGer eldnegative'9c?<-AFPROD(P,a,b)AlgebraicUUnumbGer eldelementproGduct'9c?<-AFQ(M,a,b)9ŲAlgebraicUUnumbGer eldquotient'9c?<-AFSUM(a,b)9ŲAlgebraicUUnumbGer eldelementsum9RealTAlgebraicNum9bQerSignandOrderComputation'9t?<-AFCOMP(M,I,a,b)yAlgebraicUUnumbGer eldcomparison'9s?<-AFSIGN(M,I,a)AlgebraicUUnumbGer eldsign'9s?<-AMSIGN(M,I,a)AlgebraicUUmoGdulesign'9AMSIGNIR(M,I,a;s,Is)yAlgebraicUUmoGdulesign,intervqalre nement9AlgebraicTP9olynomialArithmetic'9C?<-AFPAFP(r,M,a,B)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld =9elementUUproGduct'9C?<-AFPAFQ(r,M,A,b)yAlgebraic WnumbGer eldpolynomialalgebraicnumbGer eld=9elementUUquotient'9C?<-AFPDIF(r,A,B)AlgebraicUUnumbGer eldpolynomialdi erence'9Ap?<-AFPMON(r,M,A)9AlgebraicUUnumbGer eldpolynomialmonic'9B?<-AFPNEG(r,A)y²AlgebraicUUnumbGer eldpolynomialnegative'9C?<-AFPPR(r,M,A,B)9AlgebraicUUnumbGer eldpolynomialproduct'9AFPQR(r,M,A,B;?Q,R)9AlgebraicUUnumbGer eldpolynomialquotientandremainder'9C?<-AFPSUM(r,A,B)AlgebraicUUnumbGer eldpolynomialsum9AlgebraicTP9olynomialDi erentiationandIntegration'9B?<-AFPDMV(r,M,A)AlgebraicUUnumbGer eldpolynomialderivqative,mainvariable'9B?<-AFPINT(r,M,A,b)yAlgebraicUUnumbGer eldpolynomialintegration'9B?<-AMPDMV(r,M,A)AlgebraicUUmoGdulepolynomialderivqative,mainvariable9AlgebraicTP9olynomialF actorization'9F?<-AFUPFAC(M,B)AlgebraicUUnumbGer eldunivqariatepolynomialfactorizationA470=C'9L?<-AFUPSF(M,A)y²Algebraic:^numbGer eldunivqariatepolynomialsquarefreefactor- =9ization9AlgebraicTP9olynomialGreatestCommonDivisors'9AFUPGC(M,A,B;?C,Ab,Bb)Algebraic2&numbGer eldunivqariatepolynomialgreatest=9commonUUdivisorandcofactors'9B?<-AFUPGS(M,A)y²AlgebraicUUnumbGer eldpolynomialgreatestsquarefreedivisor9AlgebraicTP9olynomialNormComputation'9L?<-AFPNIP(M,A)y²Algebraic+numbGer eldpolynomialnormalizetointegralpoly-=9nomial'9Bs?<-AFPNORM(r,M,B)yAlgebraicUUnumbGer eldpolynomialnorm.9AlgebraicTP9olynomialSubstitutionandEv\raluation'9C?<-AFPCMV(r,M,A,B)yAlgebraicY1numbGer eldpolynomialcompositioninmain=9vqariable'9B?<-AFPEMV(r,M,A,a)yAlgebraicnumbGer eldpolynomialevqaluationofmainvari-=9able'9B?<-AFPEV(r,M,A,i,a)AlgebraicUUnumbGer eldpolynomialevqaluation'9B?<-AFPME(r,M,A,b)9AlgebraicUUnumbGer eldpolynomialmultipleevqaluation'9s?<-AFUPSR(M,I,A,c)yAlgebraic|numbGer eldunivqariatepolynomial,$signatara-=9tionalUUpGoint'9s?<-AMUPBES(M,I,A,c)Algebraic moGduleunivqariatepolynomial,<binaryrational=9evqaluationUUofsign.'9s?<-AMUPSR(M,I,A,c)yAlgebraic:imoGduleunivqariatepolynomial,?signatarational=9pGoint'9B?<-IPAFME(r,M,A,b)yIntegralpGolynomial,*malgebraicnumbGer eldmultipleevqalu-=9ation'9B?<-RPAFME(r,M,A,b)yRationalzpGolynomial,5algebraicnumberz eldmultipleevqal-=9uation9AlgebraicTP9olynomialT ransformations'9B?<-AMUPBHT(A,k)Algebraic8moGduleunivqariatepolynomialbinaryhomothetictrans-=9formation'9B?<-AMUPNT(A)zȲAlgebraicUUmoGduleunivqariatepolynomialnegativetransformation'9B?<-AMUPTR(A,h)y²AlgebraicUUmoGduleunivqariatepolynomialtranslation'9B?<-AMUPTR1(A)9ŲAlgebraicUUmoGduleunivqariatepolynomialtranslationby19RealTAlgebraicP9olynomialRealRoQotIsolation'9N?<-AFUPBRI(M,I,L)9Algebraic%numbGer eldunivqariatepolynomialbasisrealroot=9isolation'9AFUPMPR(M,I,B,J,L;?Js,j)yAlgebraicnumbGer eldpolynomialminimalpolyno-=9mialUUofarealroGot'9b?<-AFUPRB(M,I,A)AlgebraicUUnumbGer eldunivqariatepolynomialrootbound'9L?<-AFUPRICL(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso-=9lation,UUCollins-LoGosalgorithmA4815C'9L?<-AFUPRICS(M,I,A)yAlgebraicnumbGer eldunivqariatepolynomialrealrootiso- =9lation,UUcoGecientsignvqariationmethod'9a?<-AFUPRL(M,A)y²Algebraic- numbGer eldunivqariatepolynomial,brootofalinear=9pGolynomial'9n?<-AFUPVAR(M,I,A)9AlgebraicUUnumbGer eldunivqariatepolynomialvqariations'9AMUPMPR(M,I,B,J,L;?Js,j)yAlgebraicW moGduleunivqariatepolynomialminimalpoly-=9nomialUUofarealroGot'9L?<-AMUPRICS(M,I,A)yAlgebraicmoGduleunivqariatepolynomialrealrootisolation,=9coGecientUUsignvqariationmethod'9AMUPRICSW(M,I,A;L,Is)AlgebraicmoGduleunivqariatepolynomialrealrootisola-=9tion,UUcoGecientsignvqariationmethod,weaklydisjointintervqals'9AMUPRINCS(M,I,A,a,b;L,Is)AlgebraicmoGduleunivqariatepolynomialrootisola-=9tion,UUnormalizedcoGecientsignvqariationmethod'9AMUPVARIR(M,I,A;?n,J)Algebraic>moGduleunivqariatepolynomialvqariations,Binter-=9vqalUUre nement9AlgebraicTP9olynomialRealRoQotRe nement'9Js?<-AFUPIIR(M,I,B,J)AlgebraicnumbGer eldpolynomialisolatingintervqalre- =9 nement'9AFUPIIWS(M,I,A,L)Algebraicf9numbGer eldunivqariatepolynomialisolatinginter-=9vqalsUUweaklydisjointtostronglydisjoint'9AFUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹AlgebraicnumbGer eldunivqariatepolyno-=9mialUUrealroGotlistseparation'9Js?<-AFUPRRI(M,I,A,B,J,s1,t1)Algebraic~numbGer eldunivqariatepolynomial=9relativeUUrealroGotisolation'9AFUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicnumbGer eldunivqariatepoly-=9nomialUUrealroGotseparation'9Js?<-AMUPIIR(M,I,B,J)Algebraic^=moGdulepolynomialisolatingintervqalre ne-=9ment'9AMUPIIWS(M,I,A,L)Algebraic8moGduleunivqariatepolynomialisolatingintervqalsweakly=9disjointUUtostronglydisjoint'9AMUPRLS(M,I,A1,A2,L1,L2;?Ls1,Ls2)޹Algebraic8moGduleunivqariatepolynomialreal=9roGotUUlistseparation'9AMUPRRS(M,I,A1,A2,I1,I2;?Is1,Is2,s)9AlgebraicmoGduleunivqariatepolynomial=9realUUroGotseparation9Con9version'9Ap?<-AFCR(A)u˲AlgebraicUUnumbGer eldelementconvertrepresentation'9a?<-AFFINT(M)zȲAlgebraicUUnumbGer eldelementfrominteger'9a?<-AFFRN(R)u˲AlgebraicUUnumbGer eldelementfromrationalnumbGer'9Ap?<-AFICR(A)zȲAlgebraicUUnumbGer eldelementinverseconvertrepresentation'9B?<-AFPCR(r,A)9ŲAlgebraicUUnumbGer eldpolynomialconvertrepresentation'9B?<-AFPFIP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromintegralpolynomial'9B?<-AFPFRP(r,A)y²AlgebraicUUnumbGer eldpolynomialfromrationalpolynomial'9B?<-AFPICR(r,A)y²AlgebraicHnumbGer eldpolynomialinverseconvertrepresenta- =9tionA492 }C'9AIFAN(M;?mh,Mh)9ŲAlgebraicUUintegerfromalgebraicnumbGer'9B?<-AMPSAFP(r,A)Algebraic}moGdulepolynomialsimilartoalgebraic eldpolyno- =9mial'9ANFAF(M,I,a;?N,J)AlgebraicUUnumbGerfromalgebraicnumbGer eldelement9Input/Output'9AFDWRITE(M,I,b,n)AlgebraicUUnumbGer eld,decimalwrite'9AFPWRITE(r,A,V,v)AlgebraicUUnumbGer eldpolynomialwrite'9AFUPWRITE(A,vA,vc)AlgebraicUUnumbGer eldunivqariatepolynomialwrite'9AFWRITE(A,v)pyβAlgebraicUU eldelementwrite'9ANDWRITE(M,I,n)9ŲAlgebraicUUnumbGerdecimalwriteA503C9iAppendix A29cCalling T{GDtHGcmr17GSAYCLIBgW$cFunctions T{from9C49ThischapterdescribGeshowtheSACLIB*&environmenthastobGesetupforSACLIB*&functions 9toUworkcorrectly*.sOWeUwillstartwithaquickintroGductiontothebasicsusingasample9programinSectionA.1.InSectionA.2wedescribGethestepsnecessaryforcombining9dynamicalloGcationwithSACLIB*Wlistprocessing.;SpecialcarehastobetakenwithSACLIB9datastructuresaddressedbyglobalvqariables.мThisisexplainedinSectionA.3.Finally*,9SectionA.4describGeshowSACLIB*c`canbGeinitializedwithoutusingsacMain(),andSection9A.5UUgivessomeinformationonerrorhandlinginSACLIB(G!.!č9A.17ByAffSampleProgram9FigureUUA.1showsthebasiclayoutofaprogramusingSACLIB+vfunctions.9Note%3thattheonlythingwhichisdi erentfromordinaryC%'programsarethe#include9"saclib.h"ܲstatementandthefactthatthemainroutineiscalledsacMaininsteadofmain.9OneimpGortantpointisthattheargcandargvvqariablespassedtosacMainwillnot9contain allcommandlineparameters.Parametersstartingwith\+"are lteredoutand9usedforinitializingsomeSACLIB-globalvqariables.VInformationontheseparametersis9writtenUUoutwhenaprogramiscalledwiththeparameter\+h".9InSectionA.4wegivesomemoredetailsontheinitializationsdonebGeforesacMainis9called.9A.27ByDynamicffMemoryAllos3cationinSACLIB9WhenHoneneedstor}'andomly(asoppGosedtosequentially)accesselementsinadatastructure,9onemayprefertousearraysinsteadoflists.7IfthesizeandthenumbGerofthesearraysis9determinedatruntime,theyhavetobGedynamicallyallocated.W`F*urthermore,onemayneed9toUUmixthemwithlists,inwhichcasethegarbagecollectormustbGeabletohandlethem.9TheQconceptoftheGCAQc(GarbageCollectedArray)handleprovidesthiskindofdynamic9dataUUstructure.9Neverthelessitisrecommendedto rstcheckwhetheritmightbGepossibletoreformulate9the0algorithmsothatlistscanbGeusedinsteadofarrays.BInmanycasesoneusesarraysonly9bGecause {oneismorefamiliarwiththem,talthoughlistsmaybebettersuitedtotheproblem9atUUhand.9ThehfollowingfunctionsaretobGeusedforinitializingGCA39=9GCEff&fǫCHECKe...WThiswillcausethegarbagecollectortocheckthecontentsofthe=9arrayUUforlistorGCAhandles.>39=9GCEff&fǫNOEff&fCHECKm...Withthissetting,thegarbagecollectorwillignorethecontents=9ofthearray*.$Therefore,ߤGCEff&fǫNOEff&fCHECKvshouldonlybGeusedifitisguaranteed=9thatthearraywillnevercontainlistorGCAhandles(e.g.ifitisusedtostore=9BETA-digits).'9If^youarenotsurewhichonetochoGose,HuseGCEff&fǫCHECK,asinappropriateuseof'9GCEff&fǫNOEff&fCHECKUUmaycausetheprogramtocrash.9GCASET(A,i,a)Wy̲setsp!thei-thelementofthearrayreferencedbytheGCAphandleAtothe'9vqalueUUa.qHere,acanbGeanyWord.9a?<-GCAGET(A,i)g9òreturns^_thevqalueofthei-thelementofthearrayreferencedbythe'9GCAUUhandleA.A525*C9FigureUUA.2showshowthemechanismofGCAhandlesisused.I9Hff4. 4.4.4Word,A,L,I,i;4.4.4.9Step2: s,/*Herewedosomeallocation.*/4L=NIL;4do{=ySWRITE("Enteraninteger(0toquit):");I=IREAD();=yA=GCAMALLOC(10,GC_CHECK);=yfor(i=0;i<10;i++)FGCASET(A,i,IDPR(I,i+1));=yL=COMP(A,L);4}4until(ISZERO(I));4.4.4.OGffp\FigureUUA.2:qSamplecoGdeusingGCAhandles.99The6UcoGdeinsidethedo/untilloopreadsanintegerI,allocatesanarrayAof10Words, 9storesothevqalueI8(i+1)3atpGositioniinthearrayusingGCASET(),vandthenappendsa9newUUelementcontainingtheGCAhandleofthearrayAtothebGeginningofthelistL.9Alwaysn\remembGerthatGCAn"handlesmustbGeusedwheneveryouwanttostorereferences9toHSACLIB.$\structuresH(i.e.lists)indynamicallyalloGcatedmemory*.=Usingthestandard9UNIX=functionTmalloc()maycrashyourprogramsometimeafteragarbagecollectionor9atUUleastcausesomestrangebugs.9F*urthermore,GCA~handlesarealsoimplementedinsuchawaythattheycanbGeused9as{inputtolistproGcessingfunctionsinplaceswhereob8jectsareregardedasdata.E.g.9intheCOMP()function,aGCAȢhandlecanbGeusedasthe rstargument(theelementto9bGeUappendedtothelist)butnotasthesecondargument(thelistbeingappendedto).9Nevertheless)notethatthefunctionsLWRITE(),?EXTENT(),^andORDER()arenotde ned9forUUlistscontainingGCAhandles.9ThereEaretwoEmorefunctionstakingGCA6handlesasinput.%It isnotr}'ecommended to9c}'allthesefunctionsdirectly.qDzTheyUUarelistedhereonlyforcompleteness.9p?<-GCA2PTR(A)aƲgives0accesstothearrayreferencedbyaGCA!handle.%YIttakesaGCA'9handleSasinputandreturnsaCCpGointertothearrayofWordsalloGcatedbyaprevious'9callPtoGCAMALLOC().p=ThisCp}'ointermustnotbeusedasinputtoSACLIB,functions'9or'stor}'edinSACLIB+Ajlists.JRather,VitcanbGeusedtoaddresstheelementsofthearray'9directly*.'9Notesthatthisisnottherecommendedwaysofaccessingarrayelements.̿Ifyouover-'9writethevqariablecontainingtheGCAQhandle(e.g.anoptimizingcompilermight'9removeVitifitisnotusedanymore),youVcanstillaccessthearrayusingtheC8pGointer,'9butUUthegarbagecollectorwillfreethealloGcatedmemorythenexttimeitisinvoked.9GCAFREE(A)Gղcan8bGeusedtoexplicitlyfreethememoryallocatedbyGCAMALLOC().hIttakes'9aUUGCAhandleasinputwhichbGecomesinvqalidafterthecall.A5365C'9Y*ouf7shouldconsidercallingGCAFREE()onlyincaseswhereyouaresureyouwillnot '9need(thememoryreferencedbyaGCAhandleanymoreandwanttodealloGcateit'9immediatelyinsteadofputtingthiso untilthenextgarbagecollectionoruntilthe'9SACLIBOcleanup.!č9A.37ByDeclaringffGlobalVfariablestoSACLIB9Ifyouareusingglobalvqariables,arrays,orstructurescontainingSACLIB.OBlistorGCA9handles*otherthanthosede nedwithinSACLIB+F(in\external.c"),2youhavetomakethem9visibleUUtothegarbagecollector.qThisisdonebythefunctionGCGLOBAL().9FigureUUA.3showshowthesemacrosareused:UI9Hff9#include"saclib.h" 9Word!GL=NIL;9Word!GA=NIL;9char!buffer[81];9int%̰flag;9intsacMain(argc,argv)4intargc;4char**argv;9{.../*Variabledeclarations.*/9Step1: s,/*Declareglobalvariables.*/4GCGLOBAL(&GL);4GCGLOBAL(&GA);9Step2: s,/*Initializeglobalvariables.*/4GA=GCAMALLOC(10,GC_CHECK);4.4.4.OGffŲFigureUUA.3:qDeclaringglobalvqariables.99First0twoglobalvqariablesGLandGAoftypGeWord,kaglobalarraybufferof81characters,9andUUaglobalvqariableflagoftypGeintaredeclared.9TheNvqariablesGL(andGAaredeclaredtothegarbagecollectorbycallstoGCGLOBAL()9b}'eforetheyareinitialized.Notethatforthevqariablesbufferandflagthisisnotneces-9saryJbGecausetheywillnotholdSACLIB+`listorGCA?handlesatanytimeduringprogram9execution.9Calling GCGLOBAL onapGointertoaglobalvqariabletellsthegarbagecollectornottofree9cells5orarraysreferencedbythecorrespGondingvqariable.fY*oushouldbecarefulaboutnot9missinganyglobalvqariableswhichoughttobGedeclared:?whiledeclaringtoomuchdoesnot9reallyUUmatter,declaringtoGolittlewillcauseweirdbugsandcrashes...A547BݠC9A.47ByInitializingffSACLIB>HbyffHand9IfnitisdesiredtohavencompletecontrolovercommandlineparametersorifSACLIB*isused 9onlyVaspartofsomebiggerapplication,WWthenthenecessaryinitializationscanalsobGedone9directlyUUwithoutusingsacMain().9ThereUUarethreefunctionswhichareofinterest:9ARGSACLIB(argc,argv;ac,av)doGesrargumentprocessingforSACLIB*commandlineargu-'9ments.bThese&muststartwitha\+"andareusedtosetvqariousglobalvariables.bThe'9argument\+h"causesausagemessagetobGeprinted(byINFOSACLIB()).Thenthe'9programUUisabGorted.'9ARGSACLIBtakes.theargcandargvparametersofmain()asinput.TRItreturnsthe'9numbGerc!ofnon-SACLIB)Tcommandlineargumentsinacandapointertoanarray'9ofnon-SACLIB*commandlineargumentsinav. gThismeansthattheoutputof'9ARGSACLIB()issimilartoargcandargvwiththeexceptionthatallargumentsstart-'9ingUUwith\+"haveUUbGeenremoved.9BEGINSACLIB(p)\ɲinitializessSACLIB-bysalloGcatingmemory*, settingthevqaluesofvarious'9global2vqariables,9etc.f>ItmustbGepassedtheaddressofavariableloGcatedonthestack'9bGeforeanyvqariablecontainingSACLIB+'jstructuressuchaslistsorGCAhandles.^EOne'9vqariableUUwhichful llsthisrequirementisargc,forexample.9ENDSACLIB(f)R9ϲfreesthememoryalloGcatedbyBEGINSACLIB().ItmustbGepassedoneof'9theUUfollowingvqalues(whichareconstantsde nedin\saclib.h"):39=9SACEff&fǫFREEMEMֲ..._ThiswillcauseittoalsofreeallremainingmemoryalloGcated=9byUUGCAMALLOC().39=9SACEff&fǫKEEPMEM3...1ThiswillcauseitnottofreetheremainingmemoryalloGcatedby=9GCAMALLOC().]Nevertheless,#allMGCA=handlesbGecomeinvqalidafterENDSACLIB()=9hasbGeencalled,qsothememorycanonlybeaccessedbyCpointerswhichwere=9initializedkbycallstoGCA2PTR()b}'eforekcallingENDSACLIB().HF*urthermore, if=9anyofthearrayscontainslistorGCAhandles, thesewillalsobGecomeinvqalid, so=9keepingWthealloGcatedmemoryonlymakessensewhenthearrayscontainBETA-=9orUUGAMMA-digits.=9DealloGcationR\thenhastobedonebythestandardUNIXRfunctionfree(),(because=9GCAFREE()UUonlyworkswhentheSACLIB+venvironmentisvqalid.9FigureA.4givesanexampleofhowtheSACLIB,environmentcanbGeinitialized,Cused,9andUUremovedinsideafunction.9ThefunctionsymbolicEff&fǫcomputation()inthisexampleencapsulatesSACLIB*Maspartof9somefbiggerapplicationwhosemainroutineismain()insteadofsacMain().F*romStep29on`theSACLIB+*environment`isinitializedandanySACLIB+*functionmaybGeused.^Outside9theareaenclosedbyBEGINSACLIB?/ENDSACLIB,callstoSACLIB+functionsmaycrashthe9program.!č9A.57BySACLIBp[ErrorffHandling9SACLIB7Xfunctions,donotcheck,whethertheparameterspassedtothemarecorrectand9ful lltheirinputspGeci cations.Callingafunctionwithinvqalidinputswillmostprobably9causeUUtheprogramtocrashinsteadofabGortinginacontrolledway*.9Nevertheless,there_aresituationswhereSACLIB)functionsmayfailandexittheprogram9cleanlyٖwithanerrormessage.F*orexample,:thisisthecasewhenaninputfunctions9discoversUUasyntaxerror.A558LCiX-9Hff9#include"saclib.h" 9voidsymbolic_computation()9{4WordXstack;9Step1: s,/*InitialiseSACLIB.*/4BEGINSACLIB(&stack);9Step2: s,/*UseSACLIB.*/4.4.4.9Step3: s,/*RemoveSACLIB.*/4ENDSACLIB(SAC_FREEMEM);9}OGffTiFigureUUA.4:qSamplecoGdeforinitializingSACLIBbyhand.9AlljEerrorhandling(i.e.writingamessageandabGortingtheprogram)isdonebythe 9functionCFAIL().IfsomemoresophisticatederrorproGcessingisdesired,thesimplestway9isUUtoreplaceitbyacustomwrittenfunction.!č9A.67ByCompiling9TheSACLIB*header lesmustbGevisibletothecompilerandthecompiledSACLIB*library9must4bGelinked.cHowthisisdoneisexplainedinthe\AddendumtotheSACLIB-4User's9Guide",UUwhichshouldbGesuppliedbythepGersoninstallingSACLIB(G!.9A9{pGoint9worthmentioningisthefactthatseveralSACLIB+dfunctionsarealsode nedas9macros.uBydefault,themacroversionsareused,butthereisaconstantforswitchingon9theCfunctionversions:NOEff&fǫSACLIBEff&fMACROSswitcheso allmacrosexceptforFIRST,RED,9SFIRST,SRED,ISNIL,GCASET,GCAGET.TheseelementarylistandGCA²functionsarealways9de nedUUasmacros.9IfUUyouwanttousethisconstant,youmustaddthestatement'9#define?NOEff&fǫSACLIBEff&fMACROS9b}'eforeUUyouincludethe le\saclib.h". 9Alternatively*,,you"canusethe\-D"optionoftheCcompiler(seethe\Addendumto9theUUSACLIB+vUser'sUUGuide"formoreinformation).A569]NC9iAppendix B29GISAYCDLc: pAn T{In8teractiveInterface9to T{GSAYCLIB:9B.16WhatffisISAC&j?9ISAC(Jis8asmallexpGerimentalinteractiveinterfacetoSACLIB'*,qallowingsimpleread--eval--write 9cyclesUUofinteraction.9Thesystemisdesignedandimplementedinthemoststraightforwardway*, sothatits9sourcecoGdecanbeusedasanexampleoratutorialforthosewhowanttoquicklywrite9aninteractivetestenvironmentfortheirSACLIB.basedfunctionsorintendtodevelop9professionalUUinterfacestoSACLIB(G!. $9B.26Supps3ortedffSACLIB>HAlgorithms9AlltheSACLIB,libraryalgorithmsandmacrosareaccessible.,kNILandBETAareavqailable9asUUconstants. $9B.36CommandffLineOptions9ISAC(atakes thestandardSACLIB+ commandlineoptionsforinitializingvqariousglobalvari-9ables.qInUUorderto ndoutwhatisavqailable,issuethecommandM9isac?+h $9B.46InterfaceffFfunctionality9AnEnISAC 'PsessionEnconsistsofoneormorestatements.BEveryEnstatementmustendwitha9semicolonUU`;'.qAstatementcanbGeoneofthethreekinds:9'9commandP9'9call9'9assignment9TheUUcommandssuppGortedinthisversionare:N8,9quit;:F*orUUquittingthesession.p,9vars;:F*ordisplayingthecontentsofthevqariables.V*aluesare :displayedUUininternalSACLIB+vformat.A57:eYC,9help?[ algName]?;:F*ordisplayingageneralhelporanalgorithm.23Forexam- :ple,inordertodisplaythealgorithmIPRODݲ,issuethethe:command: help?IPROD;p,9view?algName;:F*orUUdisplayinganalgorithmwiththeeditorvi(1).,9save?fileName;:F*orsavingthecurrentstateofthesession(i.e.Uthevqariable :binding)UUtoa le.,9restore?fileName;:F*orUUrestoringthestateofasessionfroma le.N89AccallcstatementisacalltoanyproGceduresorfunctionsintheSACLIB)rlibrary*.!GForcexample,-IPFAC(r,A;?s,c,F);-IPWRITE(r,IPSUM(r,A,B),V);9AnUUassignmentstatementisoftheform:-var?:=expression;9F*orUUexample,-A?:=IPROD(a,ISUM(b,c));-a?:=2*3+4;-a?:=3%2;!č9B.56InterfaceffGrammar9Belowקwegiveacontext-freegrammarforasession.W*ehavefollowedthefollowingcon-9ventions:9'9UppGer-caseUUstringsandquotedstringsdenotetokens,9'9Lower-caseUUstringsdenotenon-terminals.9session89:?statement89|?sessionstatement89;9statement89:?command';'89|?proc_call';'89|?assignment';'89;9command89:?IDENT89|?IDENTCMDARGS89;9proc_call89:?IDENT'('proc_arg_star')'89;9assignment89:?IDENT':='exprA58;lРC89; 9proc_arg_star89:?val_star89|?val_star';'ref_star89;9val_star89:?/*empty*/89|?val_plus89;9val_plus89:?expr89|?val_plus','expr89;9ref_star89:?/*empty*/89|?ref_plus89;9ref_plus89:?ref89|?ref_plus','ref89;9ref89:?IDENT9expr89:?expr'+'expr89|?expr'-'expr89|?expr'*'expr89|?expr'/'expr89|?expr'%'expr89|?'+'expr89|?'-'expr89|?'('expr')'89|?func_call89|?atom89;9func_call89:?IDENT'('func_arg_star')'89;9func_arg_star89:?val_star89;9atom89:?IDENT89|?INTEGERA59<sC89;A60=wC9iAppendix C29cNotes T{ontheIn8ternalWorkings9of T{GSAYCLIB:9C.16Lists,ffGCAHandles,andGarbageCollection9C.1.1:yImplementationofListsuT9When*CSACLIB+FRis*Cinitialised,2thearraySPACEcontainingNU+1WordsisalloGcatedfromthe 9heap.ewThis0farrayisusedasthememoryspaceforlistproGcessing.Listsarebuiltfromc}'ells,9whicharepairsofconsecutiveWordsthe rstofwhichisatanoGddpositionintheSPACE9array*.BList;handlesb(\pGointers"tolists)arede nedtobGeBETAplustheindexofthe rstcell9ofthelistintheSPACEarraywiththehandleoftheemptylistbGeingNIL(whichisequal9toUUBETA).FigureC.1showsthestructureoftheSPACEarray*.`~99.SPACE.32fdGO line10QVV*eSfeiʟfeifefefeiʎtfefefefefefe932fdй32fd932fdӹ32fd932fd932fdй32fd932fdӹ32fd932fdع< lcircle10p9pp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdSfeKʟfeKfefefeKʎfefefe-fe8卍9V*alueUUofthe T9SACLIB Ǎ9listUUhandle:qBETA+j0y135tfe32v32fe32Ήfe|932fe32Ήfe32fefe32932feǍ|cellfe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe3232fe32Ήfe932fe32Ήfe32feΆfe32932feǍcellKNU-3KNU-1fe3232fe32Ήfe932fe32Ήfe32fefe32932feǍcellfe32 32fe32--Ήfe&932fe32--Ήfe/32fe<fe325932feǍ&cell FigureUUC.1:qTheSPACEarray*.r9The rstWordofeachcellisusedtostorethehandleofthenextcellinthelist(i.e.9thevqaluereturnedbyRED()),RwhilethesecondWordcontainsthedataofthelistelement9representedbythecell(i.e.thevqaluereturnedbyFIRST()).FigureC.2givesagraphical9representationUUofthecellstructureforasamplelist.qThearrowsstandforlisthandles.L~9L"fe"9?ppp32fd932fd32fd932fd 32fd32fd932fd32fd932fd 32fd!ӎfe(ʟfe(fefefe(ʎ6feJ932fdK32fdM932fdN32fdP932fdJ932fdK32fdM932fdN32fdP932fdQpVp[pQpVp[p[32fd]932fd^32fd`932fda32fd[32fd]932fd^32fd`932fda32fdbӎfe(ʟfe(fefefe(ʎwfe932fd32fd932fd32fd932fd932fd32fd932fd32fd932fdpppppp32fd932fd32fd932fd32fd32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe932fd͹32fd932fdй32fd932fd932fd͹32fd932fdй32fd932fdӹpعpݹpӹpعpݹpݹ32fd932fd32fd932fd32fdݹ32fd932fd32fd932fd32fdӎfe(ʟfe(fefefe(ʎfe 932fd32fd932fd32fd932fd 932fd32fd932fd32fd932fdpppppp32fd 932fd!32fd#932fd$32fd32fd 932fd!32fd#932fd$32fd%ӎfe(ʟfe(fefefe(ʎ:feN932fdO32fdQ932fdR32fdT932fdN932fdO32fdQ932fdR32fdT932fdUpZp_p,9q,fe,932fd7cfec9?m9qmfem932fd7fe9?9qfe932fd7&fe&9?㍑=19YNIL㍒8㍒99(YNIL㍒A69qfe92fddfe96V>FigureUUC.2:qThecellstructureofthelistL=(1;(9;6);8).9AspalreadymentionedinChapter2,vatomsarerequiredtobGeintegersawithBETA<9a7w]C9tothememoryaddressesofSPACE[BETA]andSPACE[BETA+1],respGectively*.AThisis 9usedqbythefunctionsFIRST(L),whichreturnsSPACEB1[L],andRED(L),whichreturns9SPACEB[L].9C.1.2:yImplementationofGCAHandlesuT9When'SACLIB.Vis'initialised, [thearrayGCASPACEcontainingNUp+!k1structuresoftypGe9GCArray<>isalloGcated.&A<GCAh!handleisde nedtobeBETApplustheindexofthecorre-9spGondingUUGCArraystructureintheGCASPACEarray*,withthenullhandlebGeingNIL.9TheUUGCArraystructurecontainsthefollowing elds:Cy9'9nextoʲ...taWord,usedforlinkingemptyGCArraystotheGCAAVAILlistandformarking'9(seeUUSectionC.1.3).!9'9flagUU...aWord,settooneofGCEff&fǫCHECKandGCEff&fNOEff&fCHECK(seeSectionC.1.3).9'9lenUU...aWord,thelengthofthearrayinWords.9'9arrayUU...aCpGointertoanarrayofWordsofsizelen.9When9GCAMALLOC()(iscalled,rittakesthe rstGCArrayfromtheGCAAVAILlistand 9initializesUUits elds.9GCA2PTR()UUsimplyreturnstheCpGointerinthearray eld.9GCAFREE()iSdealloGcatesthememoryaddressedbythearray eld,nRsetsall eldstozero,9andUUlinkstheGCArraytothebGeginningoftheGCAAVAILlist.9C.1.3:yTheGarbageCollectoruT9Garbage]Xcollectionisinvoked]XwhenCOMP()orGCAMALLOC()callGC()inthecaseofAVAIL9orUUGCAAVAILbGeingNIL.ThegarbagecollectorconsistsoftwoUUparts:9'9The'functionGC()issystemdepGendent. T=Itmustensurethatthecontentsofall'9proGcessor registersarepushedontothestackandpassalignmentinformationandthe'9addressUUoftheendofthestacktoGCSI().!9'9GCSI()visthesystemindepGendentpartofthegarbagecollector.ժItusesamark-and-'9sweepUUmethoGdforidentifyingunusedcells:'9Marking:ZTheproGcessorregisters,Wthesystemstack,andthevqariablesandGCA=9arraysItowhichpGointersarestoredintheGCGLOBALSlistaresearchedfornon-=9NIL listandGCAhandles.AAllthecellsaccessiblefromthesehandlesaremarked=9byUUacalltoMARK(). ލ=9If̓alisthandleisfound,thisfunctiontraverses̓thecellsofthelist,markingthem=9bynegatingthecontentsoftheir rstWord.\IfthesecondWordofacellcontains=9aUUlistorGCAhandle,MARK()callsitselfrecursivelyonthishandle.=9InCcaseofaGCAChandle,ZtheGCAcelladressedbythehandleismarkedby=9negating~thecontents~ofitsnext eld. AIfthecell'sflag eldisnotsetto=9GCEff&fǫNOEff&fCHECK,theWordsinthearraypGointedtobythearray eldaresearched=9forUUlistorGCAhandleswithMARK()callingitselfrecursivelyonvqalidhandles.!'9Sw9eeping:^:InUUthesweepstep,theAVAILandGCAAVAILlistsarebuilt:=9Cells~inSPACEwhose rstWordcontainsapGositivevqaluearelinkedtotheAVAIL=9list.[If/the rstWordofacellcontainsanegativevqalue, jitismadepGositiveagain=9andUUthecellisnotchangedinanyotherway*.=9CellsinGCASPACEwhosenext eldcontainsapGositivevqaluearelinkedtothe=9GCAAVAILlistandthearraypGointedtobythearray eldisdealloGcated.Ifthe=9next4Ų eldcontainsanegativevqalue,;HitismadepGositiveagainandthecellisnot=9changedUUinanyotherway*.A62?C9IfmtheAVAILlistcontainsnomorethanNU g=RHOdcellsattheendofgarbagecollection,an 9errorUUmessageiswrittentotheoutputstreamandtheprogramisabGorted.!9C.26ConstantsffandGlobalVfariables9This+sectionlistsSACLIB,R"typGes,constants,and+globalvqariables.HAlltypGesandconstants9areqde nedin\saclib.h",?8\sactypGes.h",andq\sacsys.h".Externalvqariablesarede nedin9\external.c"UUanddeclaredasexternalin\saclib.h".9Thei%averageuserofSACLIB-functionsshouldnot nditneccessarytodealdirectly9withanyofthesevqalues(exceptforWord,hBETA,andNIL,whicharealsomentionedinother9sections).CXIfyoumoGdifyanyofthevqalueslistedbGelowwithoutknowingwhatyouaredoing,9youUUmayeithercrashSACLIB+vorcauseittoproGducefalseresults,sopleasetakecare![9Notation:r,InՈthedescriptionbGelow,5p}'ointermeansaC%pointer(i.e.anactualmemory9address)®andp}'ointertoanarray®meansaC‘pGointertothe rstelementofanarray*.List9handleVmeansaSACLIB-Blisthandle(i.e.anintegerLwithBETAĸtL "5-:2LThis٠isequaltoSBETA.FJorhistoricalreasons,ڲinsomeSAÎCLIB%functionsSBETAisexplicitlyusedinsteadofXSNIL.A63@C9BelowUUwegivealistoftheSACLIB+vglobalvqariablesasde nedin\external.c":}9ListTproQcessingandgarbagecollection:ԍ39=9AVAILUU...aWord,thelisthandleofthefreelist.ԍ39=9GCGLOBALSUU...aWord,thelisthandleofthelistofglobalvqariables.39=9BACSTACKUU...apGointertothebeginningofthesystemstack.39=9GCCUU...aWord,thenumbGerofgarbagecollections.39=9GCACUU...aWord,thenumbGerofGCAcellscollectedinallgarbagecollections.39=9GCCCUU...aWord,thenumbGerofcellscollectedinallgarbagecollections.39=9GCMN...?aWord,OifGCMNis1,amessageiswrittentotheoutputstreameachtime =9theUUgarbagecollectoriscalled.39=9NU...9eaWord,onelessthanthesizeoftheSPACEarrayinWords,i.e.twicethe=9numbGerUUofcellsinSPACE.39=9RHOT...taWord,!thegarbagecollectorabGortstheprogramifnomorethanNU JN=RHO=9cellsUUwerereclaimed.39=9SPACEBUU...apGointertoanarrayofwords,SPACEB%[=SPACE?8BETA8Բ.39=9SPACEB1UU...apGointertoanarrayofwords,SPACEB1*X=SPACE?8BETA1xѲ.39=9GCAAVAILUU...aWord,theGCAhandleofthefreelistofGCAcells.39=9GCASPACE #...apGointertoanarrayofGCArraystructures,thememoryspacefor=9GCAUUcells.39=9GCASPACEBpݲ...tapGointertoanarrayofGCArraystructures,&GCASPACEBp>ٲ==9GCASPACEir8BETApxѲ.39=9NUp,...aWord, onelessthanthenumbGerofGCArraystructuresintheGCASPACE=9array*.39=9BETApM...aWord,*thebGoundusedtodistinguishbetweenlistandGCA@handles.=9BETApZ@=BETA+8NU+81.39=9BETApp7...EaWord,=theuppGerboundonGCA7GCAhandles.gBETApp&=BETApu+=9NUpO2̲+81.ԍ9Timing:39=9TAUUU...aWord,thetime(inmilliseconds)spGentforgarbagecollections.ԍ39=9TAU0ł...p,aWord,thesystemtime(inmilliseconds)justbGeforeSACLIB,|initial-=9ization.39=9TAU1Y...aWord,thesystemtime(inmilliseconds)immediatelyafterSACLIB=9initialization.ԍ9In9tegerTarithmetic:ќ39=9DELTAUU...aWord,DELTA \^=2^bZETA=2c&L.ќ39=9EPSILUU...aWord,EPSIL \^=2^dZETA=2e)d=BETA =DELTA?.39=9ETAUU...aWord,ETAd=blog ꬟qƱ10:BETA,.c.39=9RINCUU...aWord,theincrementfortherandomnumbGergenerator.39=9RMULTUU...aWord,themultiplierfortherandomnumbGergenerator.39=9RTERMUU...aWord,thelastvqalueproGducedbytherandomnumbGergenerator.39=9TABP2UU...apGointertoanarrayofWords,TABP2F[i]=2^i1for1iZETA .39=9THETAUU...aWord,THETA \^=10^fCscmtt8fETA .A64A=C39=9UZ210UU...aWord,thelisthandleofthelistofunitsofZ210 uY.39=9ZETAUU...aWord,ZETAa=logğqƱ2BETA*Ӳ.9PrimeTn9umbQers:39=9NPFDSUU...aWord,thenumbGerofprimesusedbytheSACLIB+vfunctionIUPFDS.39=9NPRIMEUU...aWordcontrollingthenumbGerofprimesinPRIME.39=9PRIMEp...+aWord,wKthelisthandleofthelistofprimesbGetweenBETArJNPRIME$ =9ZETATrɸ87=5UUandBETA.39=9NSMPRMUU...aWord,theuppGerboundonthesizeofprimesinSMPRM.39=9SMPRMUU...aWord,thelisthandleofthelistofprimes<NSMPRM"G.9Miscellaneous:39=9NPTR1UU...aWord,thenumbGerofWordsintheGCAPTR1array*.39=9GCAPTR1I[...aWord,KtheGCAIXhandleofthearrayusedbythefunctionIUPTR1.9Input/Output:39=9LASTCHARUU...aWord,thelastcharacterreadfromtheinputstream.A65BʱCG9cIndex.卍G9BETA,UU63 9NIL,UU4,639AADV,UU6,129absoluteUUvqalue"9ofUUapGolynomial,169ADV,UU59ADV2,UU69ADV3,UU69ADV4,UU69AFCOMP*,UU479AFCR,UU499AFDIF,UU479AFDWRITE,UU509AFFINT,UU499AFFRN,UU499AFICR,UU499AFINV,UU479AFNEG,UU479AFP*AFP,UU479AFP*AFQ,UU479AFPCMV,UU489AFPCR,UU499AFPDIF,UU479AFPDMV,UU479AFPEMV,UU489AFPEV,UU489AFPFIP*,UU499AFPFRP*,UU499AFPICR,UU499AFPINT,UU479AFPME,UU489AFPMON,UU479AFPNEG,UU479AFPNIP*,UU489AFPNORM,UU489AFPPR,UU479AFPQR,UU479AFPROD,UU479AFPSUM,UU479AFPWRITE,UU509AFQ,UU479AFSIGN,UU479AFSUM,UU479AFUPBRI,UU48GAFUPFAC,UU47 AFUPGC,UU48AFUPGS,UU48AFUPIGIR,UU49AFUPIGIWS,UU49AFUPMPR,UU48AFUPRB,UU48AFUPRICL,UU48AFUPRICS,UU49AFUPRL,UU49AFUPRLS,UU49AFUPRRI,UU49AFUPRRS,UU49AFUPSF,UU48AFUPSR,UU48AFUPVAR,UU49AFUPWRITE,UU50AFWRITE,UU50AIFAN,UU50algebraic eldUUelement,46integer,UU46numbGer,UU46numbGer,UUreal,46AMPSAFP*,UU50AMSIGN,UU47AMSIGNIR,UU47AMUPBES,UU48AMUPBHT,UU48AMUPIGIR,UU49AMUPIGIWS,UU49AMUPMPR,UU49AMUPNT,UU48AMUPRICS,UU49AMUPRICSW,UU49AMUPRINCS,UU49AMUPRLS,UU49AMUPRRS,UU49AMUPSR,UU48AMUPTR,UU48AMUPTR1,UU48AMUPVARIR,UU49ANDWRITE,UU50ANFAF,UU50ANIGIPE,UU47A66CC9ANPEDE,UU47 9ANPROD,UU479ANREPE,UU479ANSUM,UU479AREAD,UU79ARGSACLIB,UU559atom,UU49AWRITE,UU79baseUUdomain,169baseUUring,169basis"9coarsestUUsquarefree,32"9 nestUUsquarefree,329BEGINSACLIB,UU559binaryUUrationalnumbGer,UU419CCONC,UU69ceiling,UU109cell,UU49CINV,UU79coGecient"9leading,UU16"9leadingUUbase,16"9trailingUUbase,169cofactors,UU329COMP*,UU59COMP2,UU59COMP3,UU59COMP4,UU59compGosition,UU59CONC,UU69concatenation,UU59constantUUpGolynomial,169content,UU16,33"9integer,UU16"9univqariate,UU339DAND,UU129DEGCD,UU119degree,UU169denseUUrecursiverepresentation,159destructive,UU59DGCD,UU119digit,UU9"9BETA-,UU9"9GAMMA-,UU9"9moGdular,UU99DIGIPREAD,UU269DIGIPWRITE,UU279DIPDEG,UU279DIPFP*,UU269DIPINS,UU279DIRPREAD,UU27DIRPWRITE,UU27 discriminant,UU32disjointUUintervqals,41DLOG2,UU12DMPPRD,UU27DMPSUM,UU27DMUPNR,UU27DNIMP*,UU12DNOT,UU12DOR,UU12DPCC,UU12DPFP*,UU27DPGEN,UU11DPR,UU10DQR,UU10DRAN,UU11DRANN,UU11DSQR*TF,UU11elementofUUalist,4ENDSACLIB,UU55EQUAL,UU6EXTENT,UU6extent,UU5factorizationcomplete,UU37squarefree,UU17,33FIRST,UU6FIRST2,UU6FIRST3,UU6FIRST4,UU6 oGor,UU10FOUR*TH,UU6GC,UU62GCffCHECK,UU52GCffNOffCHECK,UU52GCA2PTR,UU53GCAFREE,UU53GCAGET,UU52GCAMALLOC,UU52GCASET,UU52GCSI,UU62handleofUUaGCA,51ofUUalist,4IABSF,UU11IBCIND,UU12IBCOEF,UU12IBCPS,UU12ICOMP*,UU11A67DQC9IDEGCD,UU11 9IDIF,UU109IDIPR2,UU129IDP2,UU129IDPR,UU109IDQ,UU109IDQR,UU109IDREM,UU119IEGCD,UU119IEVEN,UU119IEXP*,UU119IFACT,UU119IFACTL,UU129IFCL2,UU129IGCD,UU119IGCDCF,UU119IHEGCD,UU119ILCM,UU119ILCOMB,UU129ILOG2,UU129ILPDS,UU119ILWRITE,UU129IMAX,UU119IMIN,UU119IMP2,UU129IMPDS,UU119INEG,UU109in ectionlessUUisolatingintervqal,419in ectionlessUUisolationlist,419integer,UU9"9BETA-,UU9"9GAMMA-,UU9"9algebraic,UU46"9moGdular,UU99integerUUcontent,169integralUUpGolynomial,169intervqal,UU41"9isolating,UU41,9acceptable,UU46,9in ectionless,UU41,9strongly*,UU41,9weakly*,UU41"9standard,UU419intervqals"9disjoint,UU41,9strongly*,UU419INV,UU79inverse"9ofUUalist,59IODD,UU119IORD2,UU129IP*ABS,UU219IP*AFME,UU489IPBEILV,UU22IPBHT,UU22 IPBHTLV,UU22IPBHTMV,UU22IPBREI,UU22IPC,UU23,34IPCEVP*,UU38IPCONST,UU23IPCPP*,UU23,34IPCRA,UU24IPCSFB,UU35IPDER,UU22IPDIF,UU21IPDMV,UU22IPDSCR,UU35IPDWRITE,UU23IPEMV,UU22IPEVAL,UU22IPEXP*,UU21IPEXPREAD,UU23IPFAC,UU38IPFCB,UU38IPFLC,UU38IPFRP*,UU23IPFSD,UU24IPFSFB,UU35,38IPGCDC,UU34IPGFCB,UU38IPGSUB,UU22IPHDMV,UU22IPIC,UU23IPICPP*,UU23IPICS,UU23IPIHOM,UU24IPIGIWS,UU42IPINT,UU22IPIP*,UU21IPIPP*,UU23IPIPR,UU24IPIQ,UU21IPIQH,UU38IPLCPP*,UU23,34IPLRRI,UU42IPMAXN,UU23IPNEG,UU21IPNT,UU22IPONE,UU23IPOWER,UU11IPP2P*,UU21IPPGSD,UU35IPPNPRS,UU42IPPP*,UU23,34IPPROD,UU21IPPSC,UU35IPPSR,UU21A68EC9IPQ,UU21 9IPQR,UU219IPRAN,UU239IPRCH,UU419IPRCHS,UU419IPRCN1,UU419IPRCNP*,UU419IPREAD,UU239IPRES,UU359IPRICL,UU429IPRIM,UU429IPRIMO,UU429IPRIMS,UU429IPRIMU,UU429IPRIMW,UU429IPRIST,UU429IPROD,UU109IPRODK,UU109IPRPRS,UU369IPRRIGI,UU429IPRRLS,UU429IPRRRI,UU429IPRRS,UU429IPSCPP*,UU23,349IPSF,UU24,359IPSFBA,UU359IPSFSD,UU249IPSIFI,UU429IPSIGN,UU219IPSMV,UU229IPSPRS,UU369IPSRM,UU429IPSRMS,UU429IPSRP*,UU239IPSUB,UU229IPSUM,UU219IPSUMN,UU239IPTPR,UU249IPTR,UU239IPTR1,UU239IPTR1LV,UU239IPTRAN,UU229IPTRLV,UU239IPTRMV,UU229IPTRUN,UU249IPVCHT,UU429IPWRITE,UU239IQ,UU109IQR,UU109IRAND,UU119IREAD,UU129IREM,UU109IROOT,UU119ISA*TOM,UU6ISEG,UU12 ISFPF,UU38ISIGNF,UU11ISLIST,UU6ISNIL,UU6ISOBJECT,UU6ISPD,UU11ISPSFB,UU35ISPT,UU11ISQR*T,UU11ISSUM,UU12ISUM,UU10ITRUNC,UU12IUPBEI,UU22IUPBES,UU22IUPBHT,UU22IUPBRE,UU22IUPCHT,UU43IUPFAC,UU38IUPFDS,UU38IUPIHT,UU22IUPIGIR,UU42IUPNT,UU22IUPQH,UU38IUPQHL,UU38IUPQS,UU22IUPRB,UU42IUPRC,UU35IUPRLP*,UU42IUPSR,UU21IUPTPR,UU24IUPTR,UU23IUPTR1,UU23IUPVAR,UU43IUPVOI,UU43IUPVSI,UU43IUSFPF,UU38IWRITE,UU12LASTCELL,UU6LBIBMS,UU7LBIBS,UU7LBIM,UU7LCONC,UU6LDSMKB,UU29LDSSBR,UU29leadingUUbasecoGecient,16leadingUUcoGecient,16leadingUUterm,16LEINST,UU7LEL*TI,UU6LENGTH,UU6lengthofUUalist,5A69FĠC9LEROT,UU7 9LEXNEX,UU79LINS,UU79LINSR*T,UU79list,UU4"9empty*,UU4"9ofUUcharacters,17"9ofUUvqariables,179LIST1,UU59LIST10,UU59LIST2,UU59LIST3,UU59LIST4,UU59LIST5,UU59LMERGE,UU79LPERM,UU79LREAD,UU79LSRCH,UU69LWRITE,UU89mainUUvqariable,169MAIPDE,UU299MAIPDM,UU299MAIPHM,UU309MAIPP*,UU299MCPMV,UU389MDCRA,UU139MDDIF,UU139MDEXP*,UU139MDHOM,UU139MDINV,UU139MDLCRA,UU139MDNEG,UU139MDPROD,UU139MDQ,UU139MDRAN,UU139MDSUM,UU139MEMBER,UU69MIAIM,UU309MICINS,UU309MICS,UU309MIDCRA,UU139MIDIF,UU139MIEXP*,UU139MIHOM,UU139MIGINV,UU139MINEG,UU139MINNCT,UU309MIPDIF,UU249MIPFSM,UU259MIPHOM,UU259MIPIPR,UU249MIPISE,UU389MIPNEG,UU24MIPPR,UU24 MIPRAN,UU25MIPROD,UU13MIPSUM,UU24MIQ,UU13MIRAN,UU13MISUM,UU13MIUPQR,UU24MIUPSE,UU38MMDDET,UU29MMDNSB,UU29MMPDMA,UU29MMPEV,UU30MMPIQR,UU25moGdulardigit,UU9integer,UU9integralUUpGolynomial,16pGolynomial,UU16symmetric,UU9monicUUpGolynomial,16MPDIF,UU24MPEMV,UU25MPEVAL,UU25MPEXP*,UU25MPGCDC,UU34MPHOM,UU25MPINT,UU25MPIQH,UU39MPIQHL,UU39MPIQHS,UU39MPMDP*,UU24MPMON,UU25MPNEG,UU24MPPROD,UU24MPPSR,UU25MPQ,UU24MPQR,UU24MPRAN,UU25MPRES,UU35MPSPRS,UU36MPSUM,UU24MPUC,UU25,34MPUCPP*,UU25,34MPUCS,UU25,34MPUP*,UU24MPUPP*,UU25,34MPUQ,UU24MUPBQP*,UU39MUPDDF,UU39MUPDER,UU25MUPEGC,UU36MUPFBL,UU38MUPFS,UU39A70GC9MUPGCD,UU35 9MUPHEG,UU369MUPRAN,UU259MUPRC,UU359MUPRES,UU359MUPSFF,UU25,359name"9ofUUavqariable,179negative,UU109non-negative,UU109non-pGositive,UU109numbGer"9algebraic,UU46"9rational,UU10"9realUUalgebraic,469ob8ject,UU59ORDER,UU69order"9ofUUalist,5"9ofUUapGolynomial,169OREAD,UU89OWRITE,UU89P*AIR,UU89PBIN,UU209PCL,UU219PCONST,UU209PCPV,UU219PDBORD,UU209PDEG,UU209PDEGSV,UU209PDEGV,UU209PDPV,UU209PERMCY,UU79PERMR,UU79PFBRE,UU209PFDIP*,UU21,269PFDP*,UU21,279PICPV,UU219PINV,UU219PLBCF,UU209PLDCF,UU209PMDEG,UU209PMON,UU209PMPMV,UU209pGolynomial,UU16"9constant,UU16"9denseUUrecursiverepresentation,15"9integral,UU16"9integralUUminimal,46"9moGdular,UU16"9moGdularUUintegral,16monic,UU16 pGositive,UU16primitive,UU16,33rational,UU16rationalUUminimal,46sparsehdistributiverepresentation,115sparseUUrecursiverepresentation,15squarefree,UU17,33PORD,UU20pGositive,UU10pGositiveUUpolynomial,16PPERMV,UU21PRED,UU20primitiveUUpart,33univqariate,UU33primitiveUUpGolynomial,16,33PR*T,UU20PSDSV,UU20PTBCF,UU20PTMV,UU21PTV,UU21PUFP*,UU21PUNT,UU20rationalnumbGer,UU10pGolynomial,UU16RED,UU6RED2,UU6RED3,UU6RED4,UU6REDI,UU6reductumofUUalist,5ofUUapGolynomial,16RNABS,UU14RNBCR,UU14RNCEIL,UU14RNCOMP*,UU14RNDEN,UU14RNDIF,UU14RNDWRITE,UU14RNFCL2,UU14RNFLOR,UU14RNINT,UU14RNINV,UU14RNMAX,UU14RNMIN,UU14RNNEG,UU14RNNUM,UU14RNP2,UU14RNPROD,UU14RNQ,UU14RNRAND,UU14A71HOC9RNREAD,UU14 9RNRED,UU149RNSIGN,UU149RNSUM,UU149RNWRITE,UU149RP*AFME,UU489RPBLGS,UU269RPDIF,UU269RPDMV,UU269RPDWRITE,UU269RPEMV,UU269RPEXPREAD,UU269RPFIP*,UU269RPIMV,UU269RPMAIP*,UU269RPNEG,UU269RPPROD,UU269RPQR,UU269RPREAD,UU269RPRNP*,UU269RPSUM,UU269RPWRITE,UU269SACffFREEMEM,UU559SDIFF,UU79SECOND,UU69SEQUAL,UU79set"9unordered,UU59SFCS,UU79SFIRST,UU89sideUUe ects,59sign"9ofUUapGolynomial,169SINTER,UU79SLEL*TI,UU89SMFMI,UU139SMFMIP*,UU259sparseUUdistributiverepresentation,159sparseUUrecursiverepresentation,159squarefree"9basis,9coarsest,UU32,9 nest,UU32"9divisor,UUgreatest,33"9factorization,UU17,33"9pGolynomial,UU17,339SRED,UU89standardUUintervqal,419SUFFIX,UU79SUNION,UU79term"9leading,UU16THIRD,UU6 trailingUUbasecoGecient,16univqariateUUcontent,33univqariateUUprimitivepart,33USDIFF,UU7USINT,UU7USUN,UU7vqariablelistUUof,17main,UU16name,UU17VIAZ,UU29VIDIF,UU29VIERED,UU29VILCOM,UU29VINEG,UU29VISPR,UU30VISUM,UU30VIUT,UU30A72.;IOiNq cmbx12fCscmtt8cNH cmbx12SCscmtt8GDtHGcmr17>DtGGcmr17 cmmi10 0ercmmi7O \cmmi5K`y cmr10ٓRcmr7Zcmr5< lcircle10O line10u cmex10saclib2.2.8/doc/desc.doc0000664002275300236100000015661414017255270014137 0ustar wcbrownscsAADV Arithmetic advance. ABS Absolute value. ACLOCK Clock minus garbage collection time. ADDTO Add array to array. ADV Advance. ADV2 Advance 2. ADV3 Advance 3. ADV4 Advance 4. AFCOMP Algebraic number field comparison. AFCR Algebraic number field element convert representation. AFDIF Algebraic number field element difference. AFDWRITE Algebraic number field, decimal write. AFFINT Algebraic number field element from integer. AFFRN Algebraic number field element from rational number. AFGEN Algebraic number field generator. AFICR Algebraic number field element inverse convert representation. AFINV Algebraic number field element inverse. AFNEG Algebraic number field negation. AFPAFP Algebraic number field polynomial algebraic number field element product. AFPAFQ Algebraic number field polynomial algebraic number field element quotient. AFPCMV Algebraic number field polynomial composition in main variable. AFPCR Algebraic number field polynomial convert representation. AFPDIF Algebraic number field polynomial difference. AFPDMV Algebraic number field polynomial derivative, main variable. AFPEMV Algebraic number field polynomial evaluation of main variable. AFPEV Algebraic number field polynomial evaluation. AFPFIP Algebraic number field polynomial from integral polynomial. AFPFRP Algebraic number field polynomial from rational polynomial. AFPHIIR Algebraic field polynomial hardware interval isolation and refinement. AFPHIP Algebraic field polynomial to hardware interval polynomial. AFPICR Algebraic number field polynomial inverse convert representation. AFPINT Algebraic number field polynomial integration. AFPME Algebraic number field polynomial multiple evaluation. AFPMON Algebraic number field polynomial monic. AFPNEG Algebraic number field polynomial negative. AFPNIP Algebraic number field polynomial normalize to integral polynomial. AFPNORM Algebraic number field polynomial norm. AFPPR Algebraic number field polynomial product. AFPQR Algebraic number field polynomial quotient and remainder. AFPROD Algebraic number field element product. AFPSIP Algebraic field polynomial to software interval polynomial. K Algebraic field polynomial software interval refinement. AFPSUM Algebraic number field polynomial sum. AFPWRITE Algebraic number field polynomial write. AFQ Algebraic number field quotient. AFSIGN Algebraic number field sign. AFSUM Algebraic number field element sum. AFUPBRI Algebraic number field univariate polynomial basis real root isolation. AFUPCSFB Algebraic number field univariate polynomial coarsest squarefree basis. AFUPFAC Algebraic number field univariate polynomial factorization. AFUPFMRC Algebraic number field univariate polynomial from modular residues, with comparison. AFUPFRPT Algebraic number field univariate polynomial fast relative-primality test. AFUPGC Algebraic number field univariate polynomial greatest common divisor and cofactors. AFUPGC1 Algebraic number field univariate polynomial greatest common divisor and cofactors, degree 1. AFUPGS Algebraic number field univariate polynomial greatest squarefree divisor. AFUPHIBRI Algebraic number field univariate polynomial hardware interval basis real root isolation. AFUPIIR Algebraic number field polynomial isolating interval refinement. AFUPIIWS Algebraic number field univariate polynomial isolating intervals weakly disjoint to strongly disjoint. AFUPMPR Algebraic number field univariate polynomial minimal polynomial of a real root. AFUPQR Algebraic number field univariate polynomial quotient and remainder. AFUPRB Algebraic number field univariate polynomial root bound. AFUPRICL Algebraic number field univariate polynomial real root isolation, Collins-Loos algorithm. AFUPRICS Algebraic univariate polynomial real root isolation, coefficient sign variation method. AFUPRII Algebraic number field univariate polynomial real root isolation induction. AFUPRL Algebraic number field univariate polynomial, root of a linear polynomial. AFUPRLS Algebraic number field univariate polynomial real root list separation. AFUPRRI Algebraic number field univariate polynomial relative real root isolation. AFUPRRS Algebraic number field univariate polynomial real root separation. AFUPSF Algebraic number field univariate polynomial squarefree factorization. AFUPSFBA Algebraic number field univariate polynomial squarefree basis augmentation. AFUPSFN Algebraic number field univariate polynomial squarefree norm. AFUPSIBRI Algebraic number field univariate polynomial software interval basis real root isolation. AFUPSR Algebraic number field univariate polynomial, sign at a rational point. AFUPVAR Algebraic number field univariate polynomial variations. AFUPWRITE Algebraic number field univariate polynomial write. AFUSPSFB Algebraic number field univariate squarefree polynomial squarefree basis. AFWRITE Algebraic field element write. AGIBL Array Gaussian integer bit length. AGICOPY Array Gaussian integer copy. AGIDP2 Array Gaussian integer division by a power of 2. D Array Gaussian integer greatest common divisor. D Array Gaussian integer greatest common divisor, approximative Euclidean. AGIGCDW Array Gaussian integer greatest common divisor, Weilert's method. AGIMD Array Gaussian integer minimal difference. AGIMP2 Array Gaussian integer multiplication by a power of 2. AGIMU Array Gaussian integer multiplication by a unit. AGINC Array Gaussian integer norm comparison. AGINORM Array Gaussian integer norm. AGIPROD Array Gaussian integer product. AGIQHQ Array Gaussian integer quadrant and half quadrant. AGIRP Array Gaussian integer reduced part. AGIRSUM Array Gaussian integer rotated sum. AGISUM Array Gaussian integer sum. AGITR Array Gaussian integer truncate and round. AGIWRITE Array Gaussian integer write. t Array Gaussian integer zero. AICOMP Array integer comparison. AICOPY Array integer copy. AIDP2 Array integer division by a power of 2. AIFAN Algebraic integer from algebraic number. AII Array integer to integer. AIMP2 Array integer multiplication by a power of 2. AINQ Array integer nearest quotient. AIPROD Array integer product. AIQR Array integer quotient and remainder. AISUM Array integer sum. AITR Array integer truncate and round. AITRS Array integer truncate and round, small result. AIWRITE Array integer write. t Array integer zero. ALSIL Attach labels to standard isolation list. AMLM Array matrix to list matrix. AMPDMV Algebraic module polynomial derivative, main variable. AMPSAFP Algebraic module polynomial similar to algebraic field polynomial. AMSIGN Algebraic module sign. AMSIGNIR Algebraic module sign, interval refinement. AMUPBES Algebraic module univariate polynomial, binary rational evaluation of sign. AMUPBHT Algebraic module univariate polynomial binary homothetic transformation. AMUPIIR Algebraic module polynomial isolating interval refinement. AMUPIIWS Algebraic module univariate polynomial isolating intervals weakly disjoint to strongly disjoint. AMUPMPR Algebraic module univariate polynomial minimal polynomial of a real root. AMUPNT Algebraic module univariate polynomial negative transformation. AMUPRBH Algebraic module univariate polynomial root bound and homothetic transformation. AMUPRICS Algebraic module univariate polynomial real root isolation, coefficient sign variation method. AMUPRICSW Algebraic module univariate polynomial real root isolation, coefficient sign variation method, weakly disjoint intervals. AMUPRINCS Algebraic module univariate polynomial root isolation, normalized coefficient sign variation method. AMUPRLS Algebraic module univariate polynomial real root list separation. AMUPRRS Algebraic module univariate polynomial real root separation. AMUPSR Algebraic module univariate polynomial, sign at a rational point. AMUPTR Algebraic module univariate polynomial translation. AMUPTR1 Algebraic module univariate polynomial translation by 1. AMUPVARIR Algebraic module univariate polynomial variations, interval refinement. ANDWRITE Algebraic number decimal write. ANFAF Algebraic number from algebraic number field element. ANHI Algebraic number to hardware interval. ANIIPE Algebraic number isolating interval for a primitive element. ANPEDE Algebraic number primitive element for a double extension. ANPROD Algebraic number product. ANR Algebraic number refinement. ANREPE Algebraic number represent element of a primitive extension. ANSI Algebraic number to software interval. ANSUM Algebraic number sum. AREAD Atom read. ARGSACLIB Process the command line arguments. ARIE Array remove indexed elements. ASSPR Assignment problem. AWCOPY Array of words copy. AWRITE Atom write. BDGCD Binary digit greatest common divisor. BEGINSACLIB Begin SACLIB. BERNOULLINUM Bernoulli numbers via tangent numbers. BERNOULLIPOL Bernoulli polynomial. The n-th Bernoulli polynomial is computed. BITRAN Bit, random. BKSP Backspace. BRILBRI Binary rational interval to logarithmic binary rational interval. CCONC Constructive concatenation. CHEBY Chebyshev polynomial. CINV Constructive inverse. CLEAR Clear array. CLOCK Clock. CLOUT Character list out. COMP Composition. COMP2 Composition 2. COMP3 Composition 3. COMP4 Composition 4. CONC Concatenation. COPYTO Copy array to array. CPLEXN Cartesian product, lexicographically next. CREAD Character read. CREADB Character read. c Characteristic set from array of members. CSFPAR Characteristic set from partition. CSFS Characteristic set from set. CSINT Characteristic set intersection. CSSUB Characteristic set subset. CSUN Characteristic set union. CTMI Create table of modular inverses. CWRITE Character write. DAND Digit and. DDPCC Double-digit partial cosequence calculation. DDRPCC Double-digit restricted partial cosequence calculation. DEGCD Digit extended greatest common divisor. DGCD Digit greatest common divisor. DIELOC Display Input Error Location. DIGIT Digit. DIIPREAD Distributive integral polynomial read. DIIPWRITE Distributive integral polynomial write. DIPDEG Distributive polynomial degree. DIPFP Distributive polynomial from polynomial. DIPINS Distributive polynomial, insert term. DIRPREAD Distributive rational polynomial read. DIRPWRITE Distributive rational polynomial write. DLINIT Discrete logarithm initialization of tables. DLINV Discrete logarithm inverse. DLNEG Discrete logarithm negative. DLOG2 Digit logarithm, base 2. DLPROD Discrete logarithm product. DLSUM Discrete logarithm sum. DMPPRD Dense modular polynomial product. DMPSUM Dense modular polynomial sum. DMUPNR Dense modular univariate polynomial natural remainder. DNIMP Digit non-implication. DNOT Digit not. DOR Digit or. DPCC Digit partial cosequence calculation. DPFP Dense polynomial from polynomial. DPGEN Digit prime generator. DPR Digit product. DPRNN Digit product. DQR Digit quotient and remainder. DRAN Digit, random. DRANN Digit, random non-negative. DRPCC Digit restricted partial cosequence calculation. DSMC Digit solution of modular congruence. DSQRTF Digit square root function. DVCMP Degree vector comparison. ENDSACLIB End saclib. EQUAL Equal. EVEN EVEN. EXPF Exponential function. EXTENT Extent. FAIL Failure handler. FCOMP Floating point comparison. FCOPY Floating point copy. FDIF Floating-point difference. FILINE Flush the input stream line. FIRST First. FIRST2 First 2. FIRST3 First 3. FIRST4 First 4. FIRST5 First 5. FIRST6 First 6. FLBRN Floating point to logarithmic binary rational number conversion. FOURTH Fourth. FPCATCH Floating-point catch. FPHAND Floating-point handler. FPROD Floating-point product. FPROD1 Floating-point product, precision 1. FPROD2 Floating-point product, precision 2. FPROD21 Floating-point product, precision 2 by precision 1. FQUOT Floating-point quotient. FRAPCR Finite ring array polynomial convert representation. FRAPFMD Finite ring array polynomial from modular digit. FRAPFREE Finite ring array polynomial free memory. FRAPGET Finite ring array polynomial get memory. FRAPMON Finite ring array polynomial monic. FRAPREM Finite ring array polynomial remainder. FREEARRAY Free array. FREEMATRIX Free matrix. FREINV Finite ring element inverse. FREPROD Finite ring element product. FRESL Fermat residue list. FRLSM Fermat residue list, single modulus. FRUPCR Finite ring univariate polynomial convert representation. FRUPGCD Finite ring univariate polynomial gcd. FSUM Floating-point sum. FSUMDEOS1 Floating-point sum, different exponents, opposite signs, exponent difference of 1. FSUMDEOS2 Floating-point sum, different exponents, opposite signs, exponent difference of 2 or more. FSUMDESS Floating-point sum, different exponents, same signs. FSUMSEOS Floating-point sum, same exponents, opposite signs. FSUMSESS Floating-point sum, same exponents, same signs. GC Garbage collection entry-point. GCA2PTR Convert garbage collected array handle to C pointer. GCAFREE Garbage collected array memory deallocation. GCAGET Garbage collected array get element. GCAMALLOC Garbage collected array memory allocation. GCASET Garbage collected array set element. GCATL GCA to list. GCGLOBAL Declare a global variable to the Garbage Collector. GCSI Garbage collection, system independent. GDPGEN Gaussian digit prime generator. GETAHIA Get array of hardware interval arrays. GETARRAY Get array. GETHIPARRAY Get hardware interval polynomial array. GETMATRIX Get matrix. B Gaussian integer to array Gaussian integer. GICONJ Gaussian integer conjugation. GIDIF Gaussian integer difference. GIFP Gaussian integer from parts. b Gaussian integer first quadrant associate. GIGCD Gaussian integer greatest common divisor. GIHQ Gaussian integer half quadrant. GIMS Gaussian integer minimal sum. GINEG Gaussian integer negation. GINORM Gaussian integer norm. q Gaussian integer nearest quotient. GINQR Gaussian integer nearest quotient and remainder. GIPGEN Gaussian integer prime generator. GIPROD Gaussian integer product. GIRP Gaussian integer reduced part. GISUM Gaussian integer sum. GIWRITE Gaussian integer write. GREAD C integer read. GWRITE C integer write. HEXP Hardware exponent. HIACC Hardware interval accuracy. HIDWRITE Hardware interval decimal write. HILBRI Hardware interval to logarithmic binary rational interval. HIPBHT Hardware interval polynomial binary homothetic transformation. HIPCHT Hardware interval polynomial circle to half-plane transformation. HIPCOPY Hardware interval polynomial copy. HIPDWRITE Hardware interval polynomial decimal write. HIPFES Hardware interval polynomial floating point evaluation of sign. HIPIEVAL Hardware interval polynomial interval evaluation. HIPIR Hardware interval polynomial interval refinement. HIPLWRITE Hardware interval polynomial logarithmic write. HIPNEGT Hardware interval polynomial negative transformation. HIPPRB Hardware interval polynomial positive root bound. HIPROD Hardware interval product. HIPRRID Hardware interval polynomial real root isolation, Descartes method. HIPRRISD Hardware interval polynomial real root isolation, standard interval, Descartes' method. HIPRT Hardware interval polynomial reciprocal transformation. HIPSV Hardware interval polynomial sign variations. HIPTR1 Hardware interval polynomial translation by 1. HIPVCHT Hardware interval polynomial, variations after circle to half-plane transformation. HIQUOT Hardware interval quotient. HISIGN Hardware interval sign. HISUM Hardware interval sum. HSIGN Hardware sign. IABSF Integer absolute value function. IACOMPA Integer absolute value comparison, array version. B Integer to array integer. IBCIND Integer binomial coefficient induction. IBCOEF Integer binomial coefficient. IBCOEFFS Integer binomial coefficients. IBCPS Integer binomial coefficient partial sum. IBPPOL Integral bivariate polynomial points on line. IBPPOS Integral bivariate polynomial points on sections. ICOMP Integer comparison. ICRAND Integer, controlled random. IDEGCD Integer doubly extended greatest common divisor algorithm. IDENTMAT Identity matrix. IDEQ Integer-digit exact quotient. IDIF Integer difference. IDIFA Integer difference, array version. IDIPR2 Integer digit inner product, length 2. IDLCOMB Integer double linear combination. IDP2 Integer division by power of 2. IDPR Integer-digit product. IDQ Integer-digit quotient. IDQR Integer-digit quotient and remainder. IDQRA Integer-digit quotient and remainder, array version. IDREM Integer-digit remainder. IEAS Integer Euclidean algorithm step. IEEEDWRITE IEEE decimal write. IEEELBRN IEEE to logarithmic binary rational number conversion. IEEENEIGH IEEE neighbor. IEEEROUND IEEE round. IEEEWRITE IEEE write. IEGCD Integer extended greatest common divisor algorithm. IEQ Integer exact quotient. IEVEN Integer even. IEXP Integer exponentiation. IF Integer to floating. IFACT Integer factorization. IFACTL Integer factorial. IFATL Integer from array to list. IFCL2 Integer, floor and ceiling, logarithm, base 2. IFEC Integer to floating, exact conversion. IFLTA Integer from list to array. IGCD Integer greatest common divisor. IGCDCF Integer greatest common divisor and cofactors. IHDREM Integer half-digit remainder. IHEAS Integer half-extended Euclidean algorithm step. IHEGCD Integer half-extended greatest common divisor. IHI Integer to hardware interval. IIC Isolating interval conversion. IIEEE Integer to IEEE double. IIEEET Integer to IEEE double - truncation. ILBRN Integer to logarithmic binary rational number. ILCM Integer least common multiple. ILCOMB Integer linear combination. ILENGTH Integer length. ILOG2 Integer logarithm, base 2. ILOG2A Integer logarithm, base 2, array version. ILOGB Integer logarithm, base BETA. ILPDS Integer large prime divisor search. ILSA Integer left shift in array. ILWORD Integer leading word. ILWORDS Integer leading words. ILWRITE Integer list write. IMAX Integer maximum. IMIN Integer minimum. IMP2 Integer multiplication by power of 2. IMPB Integer multiplication by power of BETA. IMPBAA Integer multiply by power of BETA and add to array. IMPDS Integer medium prime divisor search. INEG Integer negation. INEGA Integer negation, array version. INFOSACLIB Write out usage information for SACLIB. q Integer nearest quotient. INQR Integer nearest quotient and remainder. INSET Is the element in the set? INV Inverse. INVPERM Invert permutation. IODD Integer odd. IORD2 Integer, order of 2. IPABS Integral polynomial absolute value. IPAFME Integral polynomial, algebraic number field multiple evaluation. IPBEILV Integral polynomial binary rational evaluation, integral polynomial result, leading variable. IPBEZM Integral polynomial Bezout matrix. IPBHT Integral polynomial binary homothetic transformation. IPBHTLV Integral polynomial binary homothetic transformation, leading variable. IPBHTMV Integral polynomial binary homothetic transformation, main variable. IPBREI Integral polynomial binary rational evaluation, integral polynomial result. IPC Integral polynomial content. IPCA Integral polynomial coefficient analysis. IPCEVP Integral polynomial, choice of evaluation points. IPCONST Integral polynomial constant. IPCPP Integral polynomial content and primitive part. IPCRA Integral polynomial chinese remainder algorithm. IPCSFB Integral polynomial coarsest squarefree basis. IPDER Integral polynomial derivative. IPDIF Integral polynomial difference. IPDMV Integral polynomial derivative, main variable. IPDQNR Integral polynomial digit quotient and non-negative remainder. IPDQR Integral polynomial digit quotient and remainder. IPDSCR Integral polynomial discriminant. IPDSCRBEZ Integral polynomial discriminant, Bezout method. IPDWRITE Integral polynomial distributive write. IPEMV Integral polynomial evaluation of main variable. IPEQ Integral polynomial exact quotient. IPEVAL Integral polynomial evaluation. IPEXP Integral polynomial exponentiation. IPEXPREAD Integral polynomial expression read. IPEXPREADR Integral polynomial expression read, remove terminating character. IPFAC Integral polynomial factorization. IPFACTREAD Integral polynomial factor read. IPFCB Integral polynomial factor coefficient bound. IPFLC Integral polynomial factor list combine. IPFRP Integral polynomial from rational polynomial. IPFSD Integral polynomial factorization, second derivative. IPFSFB Integral polynomial finest squarefree basis. IPGCDC Integral polynomial greatest common divisor and cofactors. IPGFCB Integral polynomial Gelfond factor coefficient bound. IPGSUB Integral polynomial general substitution. IPGTDRAN Integral polynomial, guaranteed total degree, random. IPHDMV Integral polynomial higher derivative, main variable. IPIC Integral polynomial integer content. IPICPP Integral polynomial integer content and primitive part. IPICS Integral polynomial integer content subroutine. IPIHOM Integral polynomial mod ideal homomorphism. IPIIRB Integral polynomial isolating interval refinement - bisection. IPIIS Integral polynomial isolating interval separation. IPIISS Integral polynomial isolating interval search using a Sturm sequence. IPIIWS Integral polynomial isolating intervals weakly disjoint to strongly disjoint. IPINT Integral polynomial integration. IPIP Integral polynomial integer product. IPIPP Integral polynomial integer primitive part. IPIPR Integral polynomial mod ideal product. IPIQ Integral polynomial integer quotient. IPIQH Integral polynomial mod ideal quadratic hensel lemma. IPLCPP Integral polynomial list of contents and primitive parts. IPLEV Integral polynomial list evaluation of signs. Inputs S : a list (A_1,A_2,...,A_t) of univariate integral polynomials. a : a binary rational number. IPLRRI Integral polynomial list real root isolation. IPLSEVAL Integral polynomial list sign evaluation, logarithmic. IPLSILM Integral polynomial labeled standard isolation list merge. IPMAXN Integral polynomial maximum norm. IPMONFACT Integral polynomial monomial factors. IPNEG Integral polynomial negative. IPNT Integral polynomial negative transformation. IPONE Integral polynomial one. IPOWER Integer power. IPP2P Integral polynomial power of 2 product. IPPFAC2 Integral primitive polynomial factorization, degree 2. IPPGSD Integral polynomial primitive greatest squarefree divisor. IPPNPRS Integral polynomial primitive negative polynomial remainder sequence. IPPOWREAD Integral polynomial power read. IPPP Integral polynomial primitive part. IPPROD Integral polynomial product. IPPSC Integral polynomial principal subresultant coefficients. IPPSR Integral polynomial pseudo-remainder. IPPVED Integral polynomial powers-of-variables exact divisors. IPQ Integral polynomial quotient. IPQR Integral polynomial quotient and remainder. IPRAN Integral polynomial, random. IPRCH Integral polynomial real root calculation, high precision. IPRCHS Integral polynomial real root calculation, high-precision special. IPRCN1 Integral polynomial real root calculation, 1 root. IPRCNP Integral polynomial real root calculation, Newton method preparation. IPREAD Integral polynomial read. IPRES Integral polynomial resultant. IPRESBEZ Integral polynomial resultant, Bezout. IPRESPRS Integral polynomial resultant, polynomial remainder sequence method. IPRICL Integral polynomial real root isolation, Collins-Loos algorithm. IPRIM Integral polynomial real root isolation, modified Uspensky method. IPRIMO Integral polynomial real root isolation, modified Uspensky method, open interval. IPRIMS Integral polynomial real root isolation, modified Uspensky method, standard interval. IPRIMU Integral polynomial real root isolation, modified Uspensky method, unit interval. IPRIMW Integral polynomial real root isolation, modified Uspensky method, weakly disjoint intervals. IPRIP Integral polynomial real and imaginary parts. IPRIST Integral polynomial real root isolation using a Sturm sequence. Inputs A : in Z[X], non-zero, squarefree. IPRNME Integral polynomial, rational number multiple evaluation. IPROD Integer product. IPROD2X2 Integer product - 2x2-multiplication. IPROD3X2 Integer product - 3x2-multiplication. IPROD3X3 Integer product - 3x3-multiplication. IPRODA Integer product - array representation. Classical algorithm. IPRODAP Integer product - array multiplication in place. IPRPRS Integral polynomial reduced polynomial remainder sequence. IPRRID Integral polynomial real root isolation, Descartes method. IPRRII Integral polynomial real root isolation induction. IPRRIRDB Integral polynomial real root isolation and refinement, Descartes, bisection. IPRRIRSB Integral polynomial real root isolation and refinement, Sturm, bisection. IPRRIS Integral polynomial real root isolation, Sturm method. Inputs A : in Z[x], non-zero, squarefree. IPRRISD Integral polynomial real root isolation, standard interval, Descartes method. IPRRISI Integral polynomial real root isolation in standard interval. IPRRISS Integral polynomial real root isolation, standard interval, Sturm method. IPRRLS Integral polynomial real root list separation. IPRRRI Integral polynomial relative real root isolation. IPRRS Integral polynomial real root separation. IPSBLSIL Integral polynomial squarefree basis labeled standard isolation list. IPSBLSSIL Integral polynomial squarefree basis labeled strong standard isolation list. IPSCPP Integral polynomial sign, content, and primitive part. IPSF Integral polynomial squarefree factorization. IPSFBA Integral polynomial squarefree basis augmentation. IPSFSD Integral squarefree factorization, second derivative. IPSIFI Integral polynomial standard isolating interval from isolating interval. IPSIGN Integral polynomial sign. IPSIP Integral polynomial to soft-float interval polynomial. IPSMV Integral polynomial substitution for main variable. IPSPRS Integral polynomial subresultant polynomial remainder sequence. IPSQRT Integral polynomial square root. IPSRM Integral polynomial strong real root isolation, modified Uspensky method. IPSRMS Integral polynomial strong real root isolation, modified Uspensky method, standard interval. IPSRP Integral polynomial similar to rational polynomial. IPSTDRAN Integral polynomial, specified total degree, random. IPSUB Integral polynomial substitution. IPSUM Integral polynomial sum. IPSUMN Integral polynomial sum norm. IPTERMREAD Integral polynomial term read. IPTPR Integral polynomial truncated product. IPTR Integral polynomial translation, specified variable. IPTR1 Integral polynomial translation by one, specified variable. IPTR1LV Integral polynomial translation by one, leading variable. IPTRAN Integral polynomial translation. IPTRLV Integral polynomial translation, leading variable. IPTRMV Integral polynomial translation, main variable. IPTRUN Integral polynomial truncation. IPVCHT Integral polynomial variations after circle to half-plane transformation. IPVCHTP Integral polynomial variations after circle to half-plane transformation, partial count. IPVDEG12 Integral polynomial variable of degree 1 or 2. IPWRITE Integral polynomial write. IQ Integer quotient. IQR Integer quotient and remainder. IQRA Integer quotient and remainder, array version. IRAND Integer, random. IREAD Integer read. IREM Integer remainder. IRLSA Integer restricted left shift in array. IROOT Integer root. ISATOM Test for atom. ISCSELT Test for characteristic set membership. ISEM Integer sign, exponent and mantissa. ISFPF Integral squarefree polynomial factorization. ISFPIR Integral squarefree polynomial isolating interval refinement. ISGCA Test for GCA handle. ISI Integer to software interval. ISIGNA Integer sign function, array version. ISIGNF Integer sign function. ISLCOMB Integer special linear combination. ISLIST Is list. ISMC Integer solution of modular congruence. ISNIL Test for empty list. ISOBJECT Test for object. ISPD Integer small prime divisors. ISPFAC2 Integral squarefree polynomial factorization, degree 2. ISPROD Integer special short product. ISPSFB Integral squarefree polynomial squarefree basis. ISPT Integer selfridge primality test. ISQRT Integer square root. ISSUBSET Is subset? ISUM Integer sum. ISZERO Test for zero. ITRUNC Integer truncation. IUPBEI Integral univariate polynomial binary rational evaluation. Using arrays. IUPBES Integral univariate polynomial binary rational evaluation of sign. IUPBHT Integral univariate polynomial binary homothetic transformation. IUPBRE Integral univariate polynomial binary rational evaluation. IUPBREA Integral univariate polynomial binary rational evaluation - array version. IUPBRES Integral univariate polynomial binary rational evaluation of sign. IUPBREV Integral univariate polynomial binary rational evaluation. IUPCHT Integral univariate polynomial circle to half-plane transformation. IUPEFD Integral univariate polynomial early factor detection. IUPENF Integral univariate polynomial, estimate number of factors. IUPEVAL Integral univariate polynomial evaluation. IUPFAC Integral univariate polynomial factorization. IUPFCT Integral univariate polynomial factor combination test. IUPFT Integral univariate polynomial factor test. IUPFT2 Integral univariate polynomial factor test, degree at most 2. IUPHIP Integral univariate polynomial to hardware interval polynomial. IUPHLEFD Integral univariate polynomial Hensel lifting with early factor detection. IUPIHT Integral univariate polynomial integer homothetic transformation. IUPIIR Integral univariate polynomial isolating interval refinement. IUPILHS Integral univariate polynomial initial linear Hensel step. IUPLB Integral univariate polynomial lifting bound. IUPLHS Integral univariate polynomial linear Hensel step. IUPLHSL Integral univariate polynomial linear Hensel step, list. IUPLRB Integral univariate polynomial logarithmic root bound. IUPNT Integral univariate polynomial negative transformation. IUPPRB Integral univariate polynomial positive root bound. IUPQH Integral univariate polynomial quadratic hensel lemma. IUPQHL Integral univariate polynomial quadratic hensel lemma, list. IUPQS Integral univariate polynomial quotient substitution. IUPRB Integral univariate polynomial root bound. IUPRC Integral univariate polynomial resultant and cofactor. IUPRLP Integral univariate polynomial, root of a linear polynomial. IUPRRAFE Integral univariate polynomial real root approximation from estimates. IUPSQHL Integral univariate polynomial single-precion quadratic Hensel lifting. IUPSQHLL Integral univariate polynomial single-precision quadratic Hensel lifting, list. IUPSR Integral univariate polynomial semi-remainder. IUPSWN Integral univariate polynomial, square of the weighted norm. IUPTPR Integral univariate polynomial truncated product. IUPTR Integral univariate polynomial translation. IUPTR1 Integral univariate polynomial translation by 1. IUPVAR Integral univariate polynomial variations. IUPVART Integral univariate polynomial variation test. IUPVOI Integral univariate polynomial, variations for open interval. IUPVSI Integral univariate polynomial, variations for standard interval. IUPWRITE Integral univariate polynomial write. IUSFPF Integral univariate squarefree polynomial factorization. IUSFPF2 Integral univariate squarefree polynomial factorization, degree 2. IUSFPMF Integral univariate squarefree polynomial modular factorization. IWRITE Integer write. KARATSUBA Integer product - array representation. Karatsuba's and Maeder's method. LAST Last element of list. LASTCELL Last cell. LBIBMS List of BETA-integers bubble-merge sort. LBIBS List of BETA-integers bubble sort. LBIM List of BETA-integers merge. LBRIBRI Logarithmic binary rational interval to binary rational interval. LBRIDWRITE Logarithmic binary rational interval decimal write. LBRIHI Logarithmic binary rational interval to hardware interval. LBRIMID Logarithmic binary rational interval midpoint. LBRINPROD Logarithmic binary rational interval number product. LBRINSUM Logarithmic binary rational interval number sum. LBRIREAD Logarithmic binary rational interval read. LBRISI Logarithmic binary rational interval to software interval. LBRIW Logarithmic binary rational interval width. LBRIWRITE Logarithmic binary rational interval write. LBRN Logarithmic binary rational number. LBRNCOMP Logarithmic binary rational number comparison. LBRNDIF Logarithmic binary rational number difference. LBRNDWRITE Logarithmic binary rational number decimal write. LBRNF Logarithmic binary rational to floating. LBRNFEC Logarithmic binary rational to floating, exact conversion. LBRNFIE Logarithmic binary rational number from integer and exponent. LBRNIEEE Logarithmic binary rational number to IEEE conversion. LBRNIEEEE Logarithmic binary rational number to IEEE exact conversion. LBRNNEG Logarithmic binary rational number negative. LBRNP2PROD Logarithmic binary rational number power of 2 product. LBRNPROD Logarithmic binary rational number product. LBRNREAD Logarithmic binary rational number read. LBRNRN Logarithmic binary rational number to rational number. LBRNSIGN Logarithmic binary rational number sign. LBRNSUM Logarithmic binary rational number sum. LBRNWRITE Logarithmic binary rational number write. LCONC List concatenation. LCOPY List copy. LDELETE List delete element. LDSMKB Linear diophantine system solution, modified Kannan and Bachem algorithm. LDSSBR Linear diophantine system solution, based on Rosser ideas. LEINST List element insertion. LELTI List element. LENGTH Length. LEROT List element rotation. LETTER Letter. LEXNEX Lexicographically next. LEXNEXT Lexicographically next. LEXNEXTC Lexicographically next combination. M List from multilist. LFS List from String. LGIE List, get indexed elements. LIBS List of intervals bubble sort. LINS List insertion. LINSRT List insertion. LIST1 List, 1 element. LIST10 List, 10 elements. LIST2 List, 2 elements. LIST3 List, 3 elements. LIST4 List, 4 elements. LIST5 List, 5 elements. LIST6 List, 6 elements. LKAHEAD Character lookahead. LLCOPY List of lists copy. LLGIE List of lists, get indexed elements. LLTGCA List of lists to garbage-collected array. LMERGE List merge. LPBSD List of polynomials bubble-sort, by degrees. LPERM List permute. LREAD List read. LSHIFT1 Left shift one bit. LSICOMP Logarithmic standard interval comparison test. LSIIT Logarithmic standard interval inclusion test. LSILW Logarithmic standard interval - logarithm of width. LSIM Logarithmic standard interval midpoint. LSRCH List search. LWRITE List write. MAIPDE Matrix of integral polynomials determinant, exact division algorithm. MAIPDM Matrix of integral polynomials determinant, modular algorithm. MAIPDME Matrix of integral polynomials determinant, minors expansion method. MAIPHM Matrix of integral polynomials homomorphism. MAIPP Matrix of integral polynomials product. MAPASSIGN Modular array polynomial assignment. MAPCOPY Modular array polynomial copy. MAPDIF Modular array polynomial difference. MAPFMD Modular array polynomial from modular digit. MAPFMUP Modular array polynomial from modular univariate polynomial. MAPFMUPS Modular array polynomial from modular univariate polynomial, specify array size. MAPFV Modular array polynomial from vector. MAPGCD Modular array polynomial greatest common divisor. MAPHOM Modular array polynomial homomorphism. MAPIDIF Modular array polynomial in-place difference. MAPMADD Modular array polynomial multiply and add. B Modular array polynomial monic. MAPMPV Modular array polynomial multiplication by a power of variable. MAPPROD Modular array polynomial product. MAPQR Modular array polynomial quotient and remainder. MAPRS Modular array polynomial remainder step. MAPSE Modular array polynomial, solution of equation. MAPSEV Modular array polynomial special evaluation. MAPSUM Modular array polynomial sum. MAPTPR Modular array polynomial truncated product. MARK Mark. MAX Maximum. MCPMV Matrix of coefficients of polynomials, with respect to main variable. MDCRA Modular digit chinese remainder algorithm. MDDIF Modular digit difference. MDEXP Modular digit exponentiation. MDHOM Modular digit homomorphism. MDINV Modular digit inverse. MDINVB Modular digit inverse, modulo BETA. MDLCRA Modular digit list chinese remainder algorithm. MDNEG Modular digit negative. MDPROD Modular digit product. MDQ Modular digit quotient. MDRAN Modular digit, random. MDSUM Modular digit sum. MEMBER Membership test. MIAIM Matrix of integers, adjoin identity matrix. MICINS Matrix of integers column insertion. MICS Matrix of integers column sort. MIDCRA Modular integer digit chinese remainder algorithm. MIDIF Modular integer difference. MIEXP Modular integer exponentiation. MIHOM Modular integer homomorphism. MIINV Modular integer inverse. MIN Minimum. MINEG Modular integer negation. MINNCT Matrix of integers, non-negative column transformation. MIPDIF Modular integral polynomial difference. MIPEMV Modular integral polynomial evaluation of main variable. MIPFSM Modular integral polynomial from symmetric modular. MIPHOM Modular integral polynomial homomorphism. MIPIPR Modular integral polynomial mod ideal product. MIPISE Modular integral polynomial mod ideal, solution of equation. MIPMIP Modular integral polynomial modular integer product. MIPMON Modular integral polynomial monic. MIPNEG Modular integral polynomial negation. MIPPR Modular integral polynomial product. MIPRAN Modular integral polynomial, random. MIPROD Modular integer product. MIPSUM Modular integral polynomial sum. MIQ Modular integer quotient. MIRAN Modular integer, random. MISUM Modular integer sum. MIUPQR Modular integral univariate polynomial quotient and remainder. MIUPSE Modular integral univariate polynomial, solution of equation. MMAMNSB Medium modulus array matrix null space basis. MMAPBM Medium modulus array polynomial Berlekamp matrix. MMAPDEFL Medium modulus array polynomial deflation. MMAPEVAL Medium modulus array polynomial evaluation. MMAPEXP Medium modulus array polynomial exponentiation. MMAPFS Medium modulus array polynomial factorization, special. MMAPGCD Medium modulus array polynomial greatest common divisor. MMAPHEG Medium modulus array polynomial half-extended greatest common divisor. MMAPMADD Medium modulus array polynomial multiply and add. MMAPMDP Medium modulus array polynomial modular digit product. MMAPMON Medium modulus array polynomial monic. MMAPPROD Medium modulus array polynomial product. MMAPQR Medium modulus array polynomial quotient and remainder. MMAPRC Medium modulus array polynomial resultant and cofactor. MMAPREM Medium modulus array polynomial remainder. MMAPSE Medium modulus array polynomial, solution of equation. MMAPTPR Medium modulus array polynomial truncated product. MMDAH Matrix of modular digits array representation - convert to Hessenberg form. MMDAHCP Matrix of modular digits array representation Hessenberg form - characteristic polynomial. (A matrix is in Hessenberg form if its entries below the first diagonal are all zero.) MMDDET Matrix of modular digits determinant. MMPDDF Medium modulus polynomial distinct-degree factorization. MMPDMA Matrix of modular polynomials determinant, modular algorithm. MMPEGC Medium modulus polynomial extended greatest common divisor. MMPEV Matrix of modular polynomials evaluation. MMPFBL Medium modulus polynomial factorization, Berlekamp algorithm. MMPGCD Medium modulus polynomial greatest common divisor. MMPIQR Modular monic polynomial mod ideal quotient and remainder. MMUPIT Medium Modulus univariate polynomial irreducibility test. MPDIF Modular polynomial difference. MPEMV Modular polynomial evaluation of main variable. MPEVAL Modular polynomial evaluation. MPEXP Modular polynomial exponentiation. MPFFAP Medium prime finite field array of powers. MPFFAP1 Medium prime finite field array for plus 1. MPFFDP Medium prime finite field defining polynomial. MPFFDPGT Medium prime finite field defining polynomial, generator and table. MPFFEXP Medium prime finite field exponentiation. MPFFGEN Medium prime finite field generator. MPFFPROD Medium prime finite field product. MPGCDC Modular polynomial greatest common divisor and cofactors. MPHOM Modular polynomial homomorphism. MPINT Modular polynomial interpolation. MPIQH Modular polynomial mod ideal, quadratic Hensel lemma. MPIQHL Modular polynomial mod ideal quadratic hensel lemma, list. MPIQHS Modular polynomial mod ideal, quadratic Hensel lemma on a single variable. MPMDP Modular polynomial modular digit product. MPMON Modular polynomial monic. MPNEG Modular polynomial negative. MPPROD Modular polynomial product. MPPSR Modular polynomial pseudo-remainder. MPQ Modular polynomial quotient. MPQR Modular polynomial quotient and remainder. MPRAN Modular polynomial, random. MPRES Modular polynomial resultant. MPRESDB Modular polynomial resultant, degree bounds. MPSPRS Modular polynomial subresultant polynomial remainder sequence. MPSUM Modular polynomial sum. MPUC Modular polynomial univariate content. MPUCPP Modular polynomial univariate content and primitive part. MPUCS Modular polynomial univariate content subroutine. MPUP Modular polynomial univariate product. MPUPP Modular polynomial univariate primitive part. MPUQ Modular polynomial univariate quotient. MRFMAP Matrix row from modular array polynomial. MUPDER Modular univariate polynomial derivative. MUPEGC Modular univariate polynomial extended greatest common divisor. MUPFAC Modular univariate polynomial factorization. MUPFMAP Modular univariate polynomial from modular array polynomial. MUPFS Modular univariate polynomial factorization, special. MUPGCD Modular univariate polynomial greatest common divisor. MUPHEG Modular univariate polynomial half-extended greatest common divisor. MUPRAN Modular univariate polynomial, random. MUPRC Modular univariate polynomial resultant and cofactor. MUPRES Modular univariate polynomial resultant. MUPSFF Modular univariate polynomial squarefree factorization. NEXTSS Next subset. NORMEFD Norm polynomial early factor detection. NORMFAC Norm polynomial factorization. NORMFCT Norm polynomial factor combination test. NORMFCTS Norm polynomial factor combination test subroutine. NORMFL Norm polynomial flatten list. NORMFT Norm polynomial factor test. NORMHLEFD Norm polynomial Hensel lifting with early factor detection. NORMILHS Norm polynomial initial linear Hensel step. NORMLHS Norm polynomial linear Hensel step. NORMMF Norm polynomial modular factorization. NORMRL Norm polynomial regroup list. NORMSQHL Norm polynomial single-precision quadratic Hensel lifting. ODD Odd. ORDER Order. OREAD Object read. OWRITE Object write. PADV Polynomial advance. PAIR Pair. PARTN Partition, next. PARTR Partition, random. PARTSS Partition sumset. PBIN Polynomial binomial. PCL Polynomial coefficient list. PCOEFF Polynomial coefficient. PCONST Polynomial constant. PCPV Polynomial cyclic permutation of variables. PDBORD Polynomial divided by order. PDE Polynomial division of exponents. PDEG Polynomial degree. PDEGSV Polynomial degree, specified variable. PDEGV Polynomial degree vector. PDLOG2 Positive digit logarithm, base 2. PDPV Polynomial division by power of variable. PDVAR Polynomial divisibility by a variable. PERMCY Permutation, cyclic. PERMR Permutation, random. PFBRE Polynomial from base ring element. PFDIP Polynomial from distributive polynomial. PFDP Polynomial from dense polynomial. PFFAP Prime finite field array of powers. PFFAP1 Medium prime finite field array for plus 1. PFFGEN Prime finite field generator. PGCDE Polynomial greatest common divisor of exponents. PHDQR Positive half-digit quotient and remainder. PHDREM Positive half-digit remainder. PICPV Polynomial inverse cyclic permutation of variables. PINV Polynomial introduction of new variables. PLBCF Polynomial leading base coefficient. PLDCF Polynomial leading coefficient. PMDEG Polynomial modified degree. PME Polynomial multiplication of exponents. PMON Polynomial monomial. PMONSV Polynomial monomial, specified variable. PMPMV Polynomial multiplication by power of main variable. PMPSV Polynomial multiplication by power of specified variable. PNDQR Positive normalized digit quotient and remainder. n Polynomial number of monomials. PORD Polynomial order. PPERMV Polynomial permutation of variables. PPLT Polynomial prefix leading term. PRED Polynomial reductum. PRODUCT Integer product - array representation. Classical method. PRT Polynomial reciprocal transformation. PSDSV Polynomial special decomposition, specified variable. PTBCF Polynomial trailing base coefficient. n Polynomial total degree. PTMV Polynomial transpose main variables. PTRCF Polynomial trailing coefficient. PTV Polynomial transpose variables. PUFP Polynomial, univariate, from polynomial. PUNT Polynomial univariate test. QREM Quotient and remainder. RED Reductum 1. RED2 Reductum 2. RED3 Reductum 3. RED4 Reductum 4. REDI Reductum. REM Remainder. RHI Ratio to hardware interval. RIB Rational interval bisection. RIDWRITE Rational interval decimal write. RIL Rational interval length. RILC Rational interval length comparison. RINEG Rational interval negation. RINT Rational interval normalizing transformation. RIPROD Rational interval product. RIRNP Rational interval rational number product. RISIGN Rational interval sign. RISUM Rational interval sum. RIWRITE Rational interval write. RMDUP Remove duplicate elements from a list. RNABS Rational number absolute value. RNBCR Rational number binary common representation. RNCEIL Rational number, ceiling of. RNCOMP Rational number comparison. RNDDWRITE Rational number directed decimal write. RNDEN Rational number denominator. RNDIF Rational number difference. RNDWRITE Rational number decimal write. RNFCL2 Rational number floor and ceiling of logarithm, base 2. RNFLOR Rational number, floor of. RNFMR Rational number from modular residue. RNFMRPP Rational number from modular residue, modulus a power of a prime. RNINT Rational number from integer. RNINV Rational number inverse. RNLBRN Rational number to logarithmic binary rational number. RNMAX Rational number max. RNMIN Rational number min. RNNEG Rational number negative. RNNUM Rational number numerator. RNP2 Rational number power of 2. RNPROD Rational number product. RNQ Rational number quotient. RNRAND Rational number, random. RNREAD Rational number read. RNRED Rational number reduction to lowest terms. RNROUND Rational number rounding. RNSIGN Rational number sign. RNSUM Rational number sum. RNWRITE Rational number write. RPAFME Rational polynomial, algebraic number field multiple evaluation. RPBLGS Rational polynomial base coefficients least common multiple, greatest common divisor, and sign. RPDIF Rational polynomial difference. RPDMV Rational polynomial derivative, main variable. RPDWRITE Rational Polynomial Distributive Write. RPEMV Rational polynomial evaluation, main variable. RPEV Rational polynomial evaluation. RPEXPREAD Rational polynomial expression read. RPFACTREAD Rational polynomial factor read. RPFIP Rational polynomial from integral polynomial. RPIMV Rational polynomial integration, main variable. RPMAIP Rational polynomial monic associate of integral polynomial. RPME Rational polynomial multiple evaluation. RPNEG Rational polynomial negative. RPPOWREAD Rational polynomial power read. RPPROD Rational polynomial product. RPQR Rational polynomial quotient and remainder. RPRAN Rational polynomial, random. RPREAD Rational polynomial read. RPRNP Rational polynomial rational number product. RPSUM Rational polynomial sum. RPTERMREAD Rational polynomial term read. RPWRITE Rational polynomial write. RSI Ratio to software interval. RUPFMRC Rational univariate polynomial from modular residues, with comparison. RUPWRITE Rational univariate polynomial write. SDIFF Set difference. SDR System of distinct representatives. SECOND Second. SEQUAL Set equality. SFCS Set from characteristic set. SFIRST Set first element. SIAFEE Software interval algebraic field element evaluation. SICOPY Software interval copy. SIDWRITE Software interval decimal write. SIGN Sign. SILBRI Software interval to logarithmic binary rational interval. SINTER Set intersection. SIPBHT Soft-float interval polynomial binary homothetic transformation. SIPCOPY Software interval polynomial copy. SIPES Software interval polynomial evaluation of sign. SIPEVAL Softeare interval polynomial evaluation. M Software interval polynomial isolating interval refinement and merge sort. SIPIIS Software interval polynomial isolating interval separation. SIPIR Software interval polynomial interval refinement. SIPNT Software interval polynomial negative transformation. SIPPRB Software interval polynomial positive root bound. SIPR Software-float interval polynomial reciprocal transformation. SIPROD Software interval product. SIPRRID Software interval polynomial real root isolation, Descartes method. SIPRRISD Software interval polynomial real root isolation, standard interval, Descartes' method. SIPSIZE Software interval polynomial size. SIPTR1 Software interval polynomial translation by 1. SIPVCHT Software interval polynomial, variations after circle to half-plane transformation. SIQUOT Software interval quotient. SISIGN Software interval sign. SISUM Software interval sum. SLBRNIM Small logarithmic binary rational near interval midpoint. SLELTI Set list element. SLIWE Standard logarithmic interval width and endpoints. SMDM Sylvester matrix degree matrix. SMFMI Symmetric modular from modular integer. SMFMIP Symmetric modular from modular integral polynomial. SNLBRN Small nearby logarithmic binary rational number. SPOWER Sign power. SRED Set reductum. STATSACLIB Statistics of saclib. SUBFROM Subtract array from array. SUFFIX Suffix. SUNION Set union. SWRITE String write. TANGENTNUM Tangent numbers. THIRD Third. v Table lookup in list. TSVSLI Test sign variation on standard logarithmic interval. USDIFF Unordered set difference. USINT Unordered set intersection. USUN Unordered set union. VAR Variations. VCOMP Vector comparison. VIAZ Vector of integers, adjoin zeros. VIDIF Vector of integers difference. VIERED Vector of integers, element reduction. VILCOM Vector of integers linear combination. VINEG Vector of integers negation. VISPR Vector of integers scalar product. VISUM Vector of integers sum. VIUT Vector of integers, unimodular transformation. VLREAD Variable list read. VLSRCH Variable list search. VLWRITE Variable list write. VMAX Vector maximum. VMIN Vector minimum. VMPIP Vector of modular polynomial inner product. VREAD Variable read. VWRITE Variable write. external ===========================================================================*/ #include "sacsys.h" #include "sactypes.h" main Default main routine. saclib2.2.8/doc/saclib.pdf0000664002275300236100000162575714017255270014474 0ustar wcbrownscs%PDF-1.5 %쏢 5 0 obj <> stream xWn[7k7ˤ<..;Nc.=CRCj p8sd ϓwGyzw2ӻ畭_N|zM6kgc6oWl:)ɧisUFdc.K6A=V[CՔN=8mSR9%gljz^FozSwMp֫h}>o|V@Du-~/Ožp B} S.$S)xGB?&%%O|f<=QbgZmH d&E_\ƻ H~Z#sr%7Rg"T&v8S\]/'M\F{,wY]:8NЃ'qh%GmMV+= KǦH b}bQ?V'}hd)j"厓=ͳGi[ZO社)b3og&9l5^b0g,j#1hrq{LnT9DŢaW(]8i*b 3 e&c|0}V5_Q(\5znrT:2Vr|Atd?M0ft?zauwtmݲ=ŃE/%~SC_8gcy$\\/^^ܶNg-rJUvmL eaϲ^v3Y]|JĺŸh$pQ ^gIMʁ5 c[q;D<Agڠx0ZCxC 0x_:(klfn*@۷JE_u*(PxCC>l>%sVb> stream xZKs3bo"cJYfNvHQDTt_O70m`J_ݘ;)Nҿۋ~w7rwsBݽvQD]oZw΃PvMRXoC:~BK觿5~So_. mm$ .pW8饣E(^;צYkB hS/r01? hA: vaPB:fVLLOA8oo"t:*t}Rz:-svwG@|(a1-\V6A+if< _F݄}N<FJy;#Un6˗3Swec䡖ձ_օPuRW?cByc :.\AfN|5ϣk3w2݋h?)${.@8=tu縧 J/LtV5{LtdvҨ,$X7?}oNOʔ$ST";(d*arKh$h| :GGWqU %% PP_.+"oc`Â׳\zk*۝PtМyi1Iw!Rn@oh {,yM$SD0 BʏZ }7[*sગU+÷y1tN*UX P3Kֺ=*˶ T;Н.vNT¢W>ۡ ~UwsUBx|1 cTKrGh\DHsHd߀`qZRntf?}2O %yeҒS+Tr"@#ǙZ~l|wiNBU[*'([Vj:Ep7\|C߼y2X<}$ZL"IΞ&8Oolxrj= M. ~E6|!،T=_e87O'i:V'JE㐔vAvwd5SV uK0oh#dCW-@󸡃9fDzJ#k^ޔFwh,,@>EU.`wqm i, =TY;YXdMB3m/x̦UX5SeE(]ƨ_]q[P! n nMƸ6ALm.d9+yZi.26HBe_EgH_W*RJ:^F;5|_ 4g]fL .`/VuVV+UBU"a4u\™zBU4,E6OwU! @z`]oj@Icú|*bJz۳.6zV'as0" 46IQ$W%Yըu*=qy}>~z=B܎k<6EDdk(% 6 ]` ` 9O3OCm|/ $Nf<:.c>w- kkDuTtzpI^腳`UamNrֻ8lP UC:jy._^Sc7+ bypui3n!4_N`4cIIՙ7dW8 yfto%}fҰd+[+ѥ}9G/NhZ01G9@Ƴ*2~~@ijH*5?z^{s ]Hbuƌ|hH(kZz@OwL]fWtQvÈ7GõOуt"z0@zg8"{TTn{Zr^aR &וrE찚_SO(נ:*IַrT}.WB`z4m dd㋚0}vƇΟ0n@B-/ʌoZق.GaU.1%jwHh5H4XV%}" .deҰC؆!l6+zܩ2-H%L3 2Se=Ak?%ꤱٰ@O*NaC&% 2gJY7ex֫;!?n hOT(/cZ24t7/-)z o\_( };`rl}endstream endobj 22 0 obj 2602 endobj 30 0 obj <> stream xUKs1 W9%ul0\1ڤ ǿGw9009US;mgg^>n0vu; tI'aoԑvnY]\/{}ߔyT0F\$uUZ"*vC 1P׃R5FALA} ׈nKbtJS`ՃpHBΘv)ZuSx]#C5x'6:+r`!՚<%Ƹ: ?<(=6 &l`ތnfYmKA3h*P|31a/yEGu0y̺Ep%MQN}q# !.tP]VqrJL3iijô !61+Ov߈s}KA.s_JLD:,3ZĈ#Jw<kP koYAb)x9Bb11& <1lʷpN(Jeƨc™J9]*Kk"'3o+ؘ >M4<:\Э7Oi8}U7|XCO5Ad3[IkH۪|$H&G¹-&5+'%")%cM'%vF)Q>l mҺM>kOXx[gm~34L/Zs3jk~=Ք=>עftbLU` Δ[6[{3,>}endstream endobj 31 0 obj 783 endobj 37 0 obj <> stream xYzThŻs Nba/٬^.nuOwϱKcku)van ]EAs2 4>4! C6).nD־E \ؙ=r(=SAKr5ctMMTDK;,c-7+JgEE*x& 2R}Enz?'-]OWGQ$2OV iWF^1ɹ%ݎ0UX0aLܖ9<:TCX83yKfRv2r ũӠצ5/qQ!S `m}&d7V({/;$Qw>t0֏+ .qyg)25Edq.Pȓ#)P2I6 θ<гmO~t%`W ,ަu6$ ZY Z&w?),40",{h^ۃyrm"Åݓ6 mawn:;'G`z.'ƿ^Ԝ @\wNLLkq}G9%e>#`ӗ9hca]bCשqgys˘u%9s6qր iU2=s@ڝnUQܟ?paWKH81.TD~' /`57JMOiohi}с"*|GԠ^?h#_+3=}QYpAFF"LEDgM2dG5L):}dsvQȩˁExWTW6m%_v7u20v[?)5X6l4/U2W: wXEaZZCl΋Kas-d@Qendstream endobj 38 0 obj 2414 endobj 46 0 obj <> stream x\KsOG̑4'$z*9rؕX֮Z43l3;,ƃǯnyZd'>Y|,lyy? @,]ry57,776jvBʚ՚*.t/3ͭ/k2劵̢+[4Vk6gפK$:6(_kk9m/0*BS1hl(*ˤzkl 5-#VWiC0 _9QpB1W{9/+x;f^LD<'U9Z;o!$燷LKc.I{m:trc*83ˬcO Z~õWεڲ,,$ JkHOq/rȈZ'9(;dBHPvƖZWׯGn7~{\3;!-7.6,"F2IGUJ\,%3%Kgh3g|uջPwFHIcm>)! T'L2E{Q9/q!V-#kUmH]s:pv.mĕw+FyשJ*6?DRfXTYA.U^kprp_B1^˨uˋ؈_~p\' %ұ<֨< p %ojAZQЩg~z&.CU>v k*zhC$&p:G>ώon$Co$ ORW2h2śbY!P9AsN jڵdu gd)I5Z/NGk~0\h}EǥnWP̢" Pz5E:k{$EvqwZO|*p0p$tfDQr9r&j8rLd|㹎@X>G=N4y4+Z, 6'i/dI[dEr;) sL PMKL´怞z> $n*Vc>q}>8Cp3R0qgeLV[>LwH{By'U(f9 қ=7V+;ˎ83h⭊+^=lB6 0vEy[KչbG O NU'sVV;[Lj߆U£uaI^yʒ}*0?:,Eci-pmiLRTes:DDʬ_ip")ADcj,rt&\ jv.=3`ZC^<[C\jV!V(t5WC 1N .+|;*KtFP C&!8TɫNn?463sB-PIϩtɂXI$E>?'[8HNм䪅c*q0Bm/qFmc&~1'0< 1!EhG54? tkQF QKقclDkG D8BӢJ2j 'W  Aj%?U"g OсhGK:y)싥Vh7AKrQ!p8MFr)9DjЙm 3HI_D EOK_}RK) FI;ôToQwqUJ+$}Yz$ǟH9>֍ d?}]`8rwnA4Dd84fK/7Y:ih~VɴR朓r5vaѡd^| e$߬ a):-)#r(SuBi(S9:(~V!<}K"h7%[_ߙCnq%Y;65]1ڶ"| a-N9ire.1as̎A140ΎIy3C.H&'82.mN摣:WmJh$^0╡>#C ߬#(aGtءMo?".$: m/r8YJ 6ʵ(әMgkqR< P4a; iCZy'F7BI }~Lj;2z/,MHY!_{?V Lendstream endobj 47 0 obj 2557 endobj 51 0 obj <> stream xWKo9ϯ[b*BH=8<ђ~>eww=LBF,B}jw\ PxJEPvk{2.,(ܭ$tI> stream xM6 :R`2=$iigm[C_ٙݤ٤I}AJ([ln&i Km,4.ӛ75+(yVMY_7h!&YY߬~3'm%vdوY̻2f$(DM7 mKOF" AXP$?6O;+ReO+(VȜj.K QzǙ]Вk*{.r$B+K(.TJN>jl6c â"cϠ')p,iqC>07 qx.8҄w|1@xgbG|J1RU+_.uC ,W }y֛#R: +'#~a5:9yQxb/NyU}m9tO^Wɟr$=z"[k>@ׁ Γy'c~Dkt>];~Zh(-*:j6Ypf=Y7hp;[>B쵗 %3gO'Rnj7ϲS c˨r?x_].'E1=ہ=X],jܼ5:Zk)86 D]c Vݜkɬm*χ>qI\ |C6ɼn *7KeeoE¦~N[? H <3ja̧w,X> stream x=ɒqwOovAѴeY"l$@  $R8םU/kɞ7 ZrWjW }zzGxU۫_?6_`Փʗ*MGsڜWO}7j6yOY9u7zS'}Gh==gQ~A4 1&?O~[㶘%Փ=zw< -ϧ7Vf)xsp83hL>*z oamtv1xzR&3>c\ILvOQyߪvuV}ḇmM66 {ٜdBpcp Lʦl \t6^ >i¥} [AtvJӯLZPo)eԙ`6*&8}=W϶76[M>fO7m]Luo:X |ldr>f)Dr0),p`#\ËV}Qp![w/Ϗ[E(S6 w*ħH#b-n|=?opyU%:M=;Pe.pxZ[6| ;KMc&X0LlU(6Y*?+΁]USoA$k2a pTܳK3`GOH 7G ;A33rqW;_J4U;* k_gLȟh8 evnB3<(1Y@Rg/[$N;1!/n8;ix@;Gt&+F\)(Sd.FR/\ AT.@Lg` ,߆[DZiPgtECx }ymQrUhhIN߰^ X~M [4`:rO |y[=".vq/ߓ5Sm'7ABc٭Ε ߖofxق '^@"u2D6/+J<!#>zQP}SL~Nxr F`NPk`y0.CH`Q-GppE3͐!mݝ7Me"Mȱ["4AaZg{YvCTdA\(12"vJN^Nh֋]3s|5>[P@ ey@F{G9$ϼt[=UttvwpNF'H[g@3&LV9؆["h#@VQBؓY9U 9LA`~]-fg(l,؍ƌz:E-3VZ5>JN9fҕD܎lwlgܵ½@\JRєܻ] -1>Wn!,?|,2T^þgD@^&.okT=nvkYɇ)ͪXUHF cʆNJw Acxwk!ue/ /?\3tQoiNY:|Wm`ޭqk౏.} pYw$a`'2.vX-5?b» z[Bc(hca)'n.wukT,$-WYPۗ"2Ev ɠ$wXHgH>|":waMDhPdſRp*d Z. NDO$v3Q]4` t 1D jA!|@0Q ݰLkN! < KZT5/)DTOI4̙33G** L !ˆ&"B h~U噌 }舁pV'rc_>4I`"J?izZ(gO5Jz] ۔dr>9ȹX`EN|W3F2̭5Fq}]H qBrUA mTg$C`SZԦ(B8V$*Q9Q@ρ0r61fdO򒜋,V R 뵊c\>E%Mwe ՞3ӷetB0IjwNhWf {IH=pc`s9%+esJubNzEqgv]?Qt >DNk&tZM^ow9\e^0_" qX"u腰+gj2y3F7@*.| r'Yt{V8>seR!4Sb`㤗S-8:z=a)wyOe7:t5!4k(E_,n1xGE#KD䳶Gy0]%lp!tITdAޟv[P@FQ gF/2<2g{L\L$3_ 'ڢ\c1'P0K؆Mrx?.sc2?P> >K;:k2ĽNWP@:Lv XewY I7Uyl=̜YvO-,Un pxMcqt; {4{REJ^w.'׸7I2ep$4 &Gz\cq{H48OңŌFd{fh0:Nz]|h OW.ռR4'f:aJDNM&Tk3{wajnᤈ Kd*BlE>V  Ʀ8ǚ= +.{,lbDQ1Ɍ{zÜm -U=B_tiLpo[Z:ug@kn찀B<\|=pH$]PFL₇0I++9&b*cA̲`:c%),Gİ{9]t1auֱ](߰@dh# 3Hrpv Nϲ /Jrݾ{zz_E!M [IZ;d8[(`rvDdXWԲp@H\k"1a;KeA-8? P>#p?ݝ[is^[75u]\ɧzq:6bhquQY,4y956+^@\1= F!S 2bW "sc+3`:2c-8Ũl|CEUL#6γoco8"M ^qmH`G,b=U쨅Eビ{~|-K*(3j r}#ea!_{HN_] C6^B]R+WȰ})iW«w-J!ZTҲ%ݣe>W:: #0wT.9AAY'\$.T4ŵ eyb"鱧dЪeCaa1$vAOhRrmC*Xub{ ϺCZҎTHAIP}i<.m|1~4SS9sڶSNkЦspH4KG} .X>Ha 皒95֐ X|$ )50jl#iS}"+w5Yj50[qiX}XkX"s gpmfc+>šB>,n5}4|lUak()*~W챷/Mrqd+ y r#S] @@7{ ۲Qk}\,E\$swrDYO}z!{® = KY5կsbV9.Ӈ{KBWYZENKWXv.N]}e0-xc9Y.&etr!,dдzZS.0[#ޠ/nr01 *w }%OZ3s UI=z [oLasgmD^> 5ҲIm|\e&Nj5ێX#L 0`g^{" #m sur}{i`ܗ%DmJ/<|t2y n9'13_e[ ?{އm,q r~x2c bJE U9[2YTrvjEo56B/K-q8EG)C:mBS ^pAs1-t&گ;5u,=a_M9bOUri,Lp[Y`XЏz1~ Y?aǰ>mtµQ 8Q{g>׆}N~צuȏH8ȡ-Oy Dp! ;(ؓФ>j8C>ׇz0xȖ{#'<7{jxЦBE?.Ϳ˂ 0b?`hˍi+KU *.9aѶKAt`hJKD}X }F]$u9yH] 劝"+xZ?yD-x Sls3hnĜ!M,d*=lAEƩ-;\2ɣ5endstream endobj 66 0 obj 6595 endobj 70 0 obj <> stream x=rGrwz" Ѫ}3e4H I(ɬ;kF <٬%+x&y&Ogwggx>Ktʙ/Ypy B,Z;mNo|*O8!>iVi0&zKqp)B#2 ÿ8^-=1ǔ)8$J"*;V6,|Z絍e#: $ yz+w,"K^@ؒn^g)=tuyQyK(/:v;AWȅ|IDuOPE"13h936F~c5eW¦Bi]bS6HHHǂ~_>%}GIWىTh h:@&: vahҤHؖx9#. uȲ▖nߟ](@-Yo-WEGy~//y7#Q9E)QW_x& ЌXOTȧ+#PIރQp pj|C~/wFdOiЙEemʂa ݅%LK"ZH?90P׀XѺ@s*X98p2B^Uw]x8< d SW|]z'yqbd[3|Ҙpp Pru9q=TͥZ/_m j(epМ"`@Jj뒱SnWHi@jeB@'QK{*'&U&@5k/ iQ<=&S딙D Ec6iDef\`JocVM%>HU\/ |Q~~v̠~8ʼ섲Z648O׿lk56yt pR٢ߙjJaE%:c̈<䛓3)q6m9eGyh1e>teVǼҸ͈|Ke=ML)مU.XG{p0>i!gi>5hauPkדvđX@ƃ̱.<:P\75 '[& Y[Ql@r쩯h@ "3G`Nwқ~ WQHL`C[xPm'4q*[&/4%Q]^ŁFPqY\p@A 5izbwn6j\0.9D|5ҫ{'RͦzH{D MIyu(/YLg*#T1;0R "9F2 UY:I*"mʆHOe۶Wy]p#4#!9nϩ.VtKk ->%:uqv^_U:rІJuMP_>4 `۵L;xwG<艠/v¬ʧe5OK1B't桙)2j*-D\TГu !+,&ѭ'=GȘ0<0XS(sN5S DlalQ,ۀJL ~q͑B]TyS#g%FH -qK nli20͉^#4*4UD|F3c:Jj?AӼD|31'L@O=L*y{f8/?M̬A^W@xv88d4V)gԼ;P풸I9&' 7sE\{a&ٜ,*N/=ɓBS]O$U` IS3ۊK>S\ܒVtE+UrnwjҒ)30v#p5]I$Nv!2|y0Okm -&f"*^#oĤMC>f\ɢ7YS}g1(F]`2# %sE9g'uwv|9Hm g*=N/؂20-( s`ұ e 5"UZz^1ꬿ-L%Wl̎X|8h]e33{GLzڳ4kw׌I\] \یn!Z>*o%I?MӬa$w鮄v1he8ARtZLCb7+gɰ 3g۶x9 #]f`R;k2M/&NЌv,@Zj3]2'Lt~Z4E_N@cm&8&\E T"20DIǴ!i%{ICF<и#n3SEb W$Wx3lV J IK` 24\ɶ4GJ$@&%^%(An>}huL^ ސYJ)墔 `rZq_ΐEqX~Kvl]ʭYK*n>㈨+a||Ԅ\-!dS}~SyV y[28S(07Eqbf]~z?e1C=r붋w>*y; #1a $)_rt~ݦIԢ+fLgơ`|$z"%iF! a;:DxlTYȹ2Q[n b3aV,f3<]ePsPo]x¦vV#q`gpT~)P`ڄwJ3|RԚe9gCap#ҋ*Xoi%o_3 krեPzA.{D' Uc@3t! GLLZ&}Qci:wDd%~]s ]lm'UZ`bSA#bb R/*7[\4{Hyٍ0)FRBD^kFTn𥴳JAIg :&fz9귾>ݳ} 2kzc( ݩO{GRx!;dL=&tB1UE,'l8lXƺΣa^_vƘ)yjI}/?ވoxfLMr}9Ծh=+練sQ4pD.}RtLȑB(U;Mtj/+w3AdnV3 U(*+ [>ffOҔ ]x*5bQL~Ř)_`A4҈h4K!NTk)f~s( M|+U\^U.o/G |GBg`7/* x*Ə]/G6XK8_(P=5][{eQUo.qT\^ IV gi:z`+O ޟH_r}Ʒb7.O4'j+WLmDN$ "1KLe.O'4\!JBzZ>O2 FPg1`ȯM#K]>5Ԋ!s+9+c\VmwpN9"rw`E>XNJ$0l)|$u9K.!>JNU1F) qs$a&#҈!-t buS`͌Hj!KW_I4Kymi4leOdͯ)2k1T(eQLWv~βlKd-Žw3GkNpOz.v w!rN"к@nW%T?T~hlҴ[3rCv?F JL~ V=O!uΓ[;m}dEѼN'[Nm~CM`>wZP:K˽+aOV3qTm 镙5m#4IJ}=wj.,.R4 ڶX>mI뜔FeVFE@ }b?$(/ oϘP49J}y %=]`a(5 B Itz8&Q~q > stream xYIo\E8FLEB!DHb8l-87]^ Juu_U=8ŋ}7.p?rxC`JE)opfN֗˃=HV۰|^RTꯙj\[iUn2VJǻpe wT,p6ۥn/b 'kS2 ˌaC5fN1PXPjyTD4$x<>POוz?-*ȭIʷ{]qRq D}ߦ u^tnj} $:q#]}LIZK /M E/ʑJ2ka#>TYP+8O=oV<49ΜJ9g8fgpHTH̙q'qV8k]:fQ#@vj3.=[J)=K7dR2͖bMiB9J:;iW1cB='I0*m+RLRXVf/N`~DUjʛ~|äenjw0I}>1FSn Z?,#ҜJD U(4\[ U|v/g h*Xޱ6UUôT`Zy\(%Zm5>.7+`^C)Զ ;^6 Z8HWODK 蒺Īe/1:{CTޮ="z]#ϥd9-%Dގ0}Jezޫf3v4b Me,yc :Rm;i-<ҹ" qL)?Zm0IWRu%1 Fmѽ#5NɰNLlyO6+WY[R+̴: fn~"Cp&s2wBX;3*x/| Q[õ̬)l}3[LtB](, M0Acba(3\,|IraRC)! ^p5NqLj%X_nX8z]XOci{戀DJ_t<ժD[(dvFt&;,@Va3h@ӓ8*o @]"Բ `M6Q؊5 y̚m/%P'9l=J0aFnŏt l$47Y\]!" ҒvB픅dRw=ڱɫ?M3 X>F{nAQxWc~^/ޡ}^ᗅ93 ؁t-bqA:#8<f_,2>#aѩ"p ۰Aa$OwN@IGHK8-3q^#Cցh<7V<idh?PŬ$)idY0sܗ%^өBqa`ǒLߤJ`i bBRmuGը$Ok"8$\EImfk3j螘׸ث0slsTy11?&tGٳLEE> stream x\KsΙ\Ly'@"'N)Ǽ9((&EIҿO73 0$U.4F?~ovb;A/o~w?7g2\>*@Lւ]|{;o'?icvg_p~RH= tn '጗C@f{C@*qLwaů?O y/C }=hI"E:w8DR/ϑZiNj 6yF=5_8B*{zRɹLiIKܛĭ5J*i}武%#;V>&ZgopҌ|ּdcnqx:2N2߈?`B^;Kio/3ڠl!@k8&+toP/PП!8%+-,~@YG%9.""I79mڰqz'm^gWB+ɹ% oQ<#8'Cm+>"EHXrJ'|EƞwlJ>//| ]U0FȾ󓳋ExBOҪ)KA|+wA &?Y&1PUDZ(xS&+!t:4Esڟ8QmJj8RϬ(y kXPgFgm"hbѦڢNԲDM>Q?R~ߤCe(sWN"tЇ=~z0= EWdO~ K*qxāC2v}jyp qWoUsu s |BQASIv>rD6mFsN6 O CLD_:3LjI#"wH4OzƍMBȮkMv|@G$.@M4:E[KqU)) zQIVE}b8z5G$3)ŴN cd6:a؜";QYhKp@Ag7z$?loE@8`A!vƍI|uU/oJLK =}2rSޒэUܨᛛsEPn>8 B-ʞ@c.!;#hfqҫkZ]& wL#,誾;7Q/ǟU>3L1GP%v;~V pj&I0#HΖL׭mǠ9UZ Xƃ1էFUu*QN֮sqݑR>9F_ۚ&ÇŇj,ZΑ#>ՈoSCI9+*":/ @4&8AEfIy8Bu3 Eә$1#W ʀNiĸ~UZ$K:`$a#;`\֓0fNF{Dv{?CO*|DȂ9%9:M!Z~JGr+p2"F4.hT$9 ZXQ^QxI XYz+K3kYD+#c._oN Eؘij(P/ѴUFiq/fҴT$" Н_p rĦ0 #tMm!>T#0˅`,G騎53cQͱS~\6"fRG)֋z~Ty5@9spw;~|@hh&b}bPK~䶪3,҇dGD`jhU ֧5"2꣕i2BNakc +YMidH C@{Cn#B,G.T!(_K1|Ѓ]`4+)Ѵƈ)lvZܘIYgʻ~ y"Gv܍Jopԡ<.Isvm./l[v㊕.yC'dL'}? Zn]5Z/Wu l9ﰼea-[q 673]n#S` /+YQ#"v%QLeXIG +qWEJL&B 13xHgT D&G 2ABs (9_1H!kx4Dͩչ|n!@nKTp,؈%e`Q1 [PCω֏fD<;;U\e۸=h렜%J~wpl͒ׄkJ|#Q iY GP8' +{M_*?G1vC #MԨ"k=ro|:wNUW]ԟ.BtH9{9G #E#.k2kF>g=EV:p@5N8VDfOw,=sTWRraz"0MmM\Cl_0,юd6(-8u&ѩzyJN2+k,1RVxu@=gwjT+2ٳ(⍅rkΐcL8î:Ej'՝VK-ٙ=ekԅU1g,$)Mm#. V^J̟/ϖ盕[iJ,Ӌ/ΨgÙ N2zw{*77g_;&yO@#m!4L'zAh{sde9C ")'E)QF25K20|* AٔQRHșy,䜵"ަd9nٵ Vga4h0s؊W|DWy;GP@}}lU1!3sK4n~<Ɯb/ 1yR.9dU!g endstream endobj 87 0 obj 4366 endobj 93 0 obj <> stream x\IsYVU8A7v;>xKURb9)ɖߧ̼G'J|Lup勉wgWg^Rg9N~΂35gWw>==WZ[™. o/6`ݿ֨,] `yRNH^>A9К5!?gJS|WntwWtކE'~zEN֣/?ν{:R_yGw_[Rp]4Ń44koLY;Q.`l}M7PE@7aގ~SQU#ЖQ6HhE%.8g;U*BcdSNk(GKqc#X<#䌨'm -"{tӲEk[NFj@WH|~Ű|>m:T:.3E4##aZ(\06UFYOYӘ Gb."o_؉%/c:󊶬ϒ/uw}cnIJ{/(/,9.4PjѥFYF$8ۚDB*Zvԩ^=dFvZx6ö_76V*(lZy2qwvkP ιzЂ7˽E >jᧂQuko`:.Zvɏv?Ou6sK\`4bΦ5jY2sgeXNkbr=!EXk.V-Um\5J[zhichj)r)I󅾅 YԒ8UhGH^c$c(kyǑ#5&__ ^!X&r6:fc!z%dDTY?!h]%hl~5K6Œi4sP۾$9K5vx9[]QuTGMTۤV@ePM|{-F G96Cpyf8J-%h$WmD'=IYq.aT3Ďީi[v#TvVOΙss2ZK2X0v$-ဪ ]c` "Q^y!479Xߖ+IH"R<[HAnp-]$@7Ŵlqc)$un!ߤcaLKv@dzkdh/Wܽ!QVJt|64!/JaL(: .#.+|jЄ-&LBƤ;TW"sUν͗t=*U_Mi΄HBY[ qt\-Gq ,*'@$y+RFCݷ`]dDI~b$T6`\rerr^s917K%f֢Lfb%eC@ȧl-EVZW $rŴ0Uœ} u~f^coAc<2Ղ.5sDZND83:$Za_FR 5ؓ^ɫ?oSeڴ' K[iȱ&[%UtBK=R=C>7ƨ' ѯ$܁腴=ihhc6XQ`|h67%>bBvz'흢$SrAXG;׼4uk&`$kjˮ= VZ&KvWɎjL%=`j5/dgǪFUdr)jO0[aBA[oB@hYϊF!k|Wa(YgL&8W!LB}CiHK\vK q]w0SeuO{:e ԖуVߠ[m-Ln9Sj}ܺŽ!`S䌧84]MJ}l&m uyQB/߹gR $Km(999Vk/, ?N K!b|o+Bq"tI([|1ݾ7]ޟ8b{-A Ka?gTJ3_gqsҐR)զҿ$ebs''ْv3v_N=#;[N5'.3mFil5*g.4‚&-] }(nπZ|ټ{_`y1r oK)c8⑁0S8@ ρJ>a̢=2P] [j'*L- ]lhrdNi1z۩ex>0$mxG2|Tt[Ch`! 773 d  Jt4U-t{lOŲzSҭY^EEĥRr{FO%M /&En C@oeO5qL22;l!Ӈ0ŧZƇYܬ-w58Q1QNÌhC_9*x_e/lj¾k_2'0+̯X֪O /iCrk@(TDZ(Wf_Hvmc[9U(K&f ؖGf 5*waRcoOj;`\T%,n"@1%anC!nP^v&?$Bh ;sO%.b`->Zę{O򐥟.ID ȵ(79眦SC_ )+LUOF4-NS 5ĕJf)uiAfL ZmWY8O6h[=脠g{*> stream x][sݶ~GǣiX\؉8$v:cיȗ8w %^$g AۉFk>:c{L^;dzK`.4*w/ғr'l;렑vWg;W?`=>x?904VQ]l/q- Zo`/Dc_ύnHp:_Fmmv˸vtC#S-Nq*jXx|ndT6$KjsDK)j[aMÅ0H#)Xl_PBUm%l!!G`-x<! H.$g0w Os.0r@+ P|G@r`7کƹY5%:9uAsA#b7Cv!"͸rr[fEZ 2""Ad?i#ƣai&,0ch,2Qp5Ǝ)p𰇈 N( 4Bږv/ɶ"eU`ǷґG89{c+\)v?,*+3o#uV!+7D⼷摸G]ꖘgVNWu7lYw2(пC,CeOrADAGq$5^t+h*GD(׾<:,w4gQH[C|K,,S';AP;#%vHm09 Eo`y}E$7/ݵ/=#紅8ȁg}D`_^"'y26H|^~pí=2mT.Gh^A1D`XnsLy;ᛘReqh!ߤ-D:cM%W 0q<#.]%x00 هBSq.&<>ԳDh)@='1>i1ӿŏFAEcAOs7u525-֭I::nU =XXe銑Q2sQ x{(F@;? vډ?#b^\ N$'S&}E..gΧX JR3tLd7Uz?G.=teLGU= YDjc"l17&r~ϕkT`RJ-OmȐG6R\C>u4*_rL k'ioꅩ2™v'IX}f2dZYU)*"Ш7I JrS8_2r= ^_)SXZmυmOf+jI/2r]=sO0:sDRyw56'M }}\.=S>뼹g s޿6s>37WƼ~vjF=pTzt #*ظ49#V$[n\ 3jϧэm-{ZC_:։h,J0y7OI!:%ֲ:@|zfK:vJgDAD m k tц@@/ۭ_Ϙ O2zY^~n~Y4tDAb!@ッ 2(0[-sVy8)j"7j`M% x:W, DX[Y.e@Q\GC҇:~JΉ 6f;eAJꅷoGӥz&ݤi.'TiqX.$bx2IR&KsBG^ 2-U=ҳjnfR퇜E/8xz#-* TT\&l*RTBoA5p@Y*Z k풼S~E+G‡Nw>f+]X) Xu8d>-s|16#Rzhw\\GZMH8凫qf ?C%ݳuN$\,nE(3WیTVtokt?H U!.PPGgx@Q"/C(Ąү` +Eл:2ᔾ1ȢYaQF{:''wQ 2|Ek TR\\y&@lof\#T(MG4c.y9(Ԣz;H ɍ+ שk@_ (Žq'Tl.CGT84je6vCP.9Kpfkozw+a;p FCAhM&~tjE T#lZӡFє2hkTآnΡTXܢz$s',}oEE0l8~٤\dI,)8*0(Y  8 ?:a6L @E ȬP85ζTvAZr.f&f8Y{tLrrD8~ݓB`e=^HVQx4NO~)(*_$_fŷƤ>4ܤpNRw?9Wmj*1@-W4܊; Bqm&b N s&=$C諫PB <~D 7E]lw0Z3hHUwE;mcAckD[>8|XQ>[4ککPmw]#ۍA%&FF)8!FlrƧ5j|ӖKl\ SG:]ЀFxv*S'LxSp>^:D> c#kTVVlaqe8 W ꑐРyr L]@}-k'2S@d1C@4\L< :4L 75Ns'"$sʇ-sh*/0NKNdVܖ#LQҀB*}cypy-?w endstream endobj 101 0 obj 3878 endobj 105 0 obj <> stream x\Y~ 8xۼ /+ɖU$yX ȗ}Hv&{fGAjpdX ɧvz}ꄇ?nN\N0I|rfݩrV^ܜ{so{Rla锶3UrY*+-VmӵJ,3t|vVAq7Og )Rmخ:dv9thRSis* +crH#KNs"% `.^'LKEI3 ~/v %fÌ?1ԗ^2TP FlrR &JDU$^&z/N!ā,rn1Z~SZ:8o~O]*mt/?~'MX0: TD`Y<*|:y^Y?ߐ1k'\peWse(~tCB_i!wW]e_{5Nng{HǬ; ΛI;C*1kB"1 Ŏ?q'$5\tF&{Q>^c߇MVNs+L[ qb16 0͆#щK{杻ڑlV=g5U.޹;?&3́3&o6h>d4L&3oN'J魛Evc]"馞;1/dAgчES!XAҤ LiNu]*il3up3X&M|M.ME *vR+-Q|Sǎ0,ˆ=[B"Ch$['2:%‹f,};ܥ^5*;!K1Y'_O"'t!֪Ӎu h!f ,B{1Km%#CH)pHHfUrj@K43ZS,a?S'/F:y/JG-ߦ&EnSa.ԙXL3ZWl>賶6XVΏ4fB&C#=J4AWu}Hn fT!%ǣGޯLt ~ g0h} f],EH$>n9-fTW*bV) .PLxW.]e[q_PpRGlw$}J!B5`qj5+?$_P6vɓd Yi^<Q0i# GW1>]Mm|\4sX{k50rę/*D] ~)Bxq8b{9_\| lendstream endobj 106 0 obj 3619 endobj 110 0 obj <> stream xWQo7 ~7#QjM$%QҬC=ifiWߏxvl 4%6Bʧ~_g^ps}?s unNRm}|=vBqj"ffhJ>]\ ֳaNs3˟$)$T`)$|٦(ѹhnʚ(0/kfOۘ|e6 )+zeˎ̫vvcZ@2tޛj-z1aD; ԑ\D !E㏶ZM^\ '-l0rLpڄ]V :KPlY%[| %=$]ǔm xQ yz4:+g4̀D."bTWT.idK}<9M{" ZCM=Om u%ɡ!]@c#m aq/;]`Y 1{'{)8K/vxH [d:Z6QT7ѥz)t<|\JODO(OM)~sфXc~ uIED3i$2]-]Emp6Ǔܽ U<&GdEBRS;sڗ)ݵd͕E^zerROOO'GhF<|AV?,^!O0J`S׺y;{JhSNeMv@~oՃf!lj+mѲt9E>XGendstream endobj 111 0 obj 1051 endobj 115 0 obj <> stream x\IǕsi?nU@Kd@IJ#6b[{d*6!*eGF}n'&O㛋w^_ݳ.d+,qrM nl vwus]Ĥu₩h/?J:R gV]~>o~OtQ7 9 MU5AA6(<Q@NAPlg$2eiCoeJp:dp)B.M0$+ֱ Idƻ/U }$R} [zSCDBg|6-h*6pܐIXFF˗mәrr>f*_*?YAҚje-?qNxሾ(&R{X6y :A%ԣncҭDr [Ɏyˎ)TQ4$ qpSSca*oujKHHc8-7H̨SH ༨pkH'>: Ig g@Z:+m޻I2\ A,J 'b&OaԾ&3WdӕgmKQL/"/  W&c8dN4pL٫^]uI*M d] m" :7vf }u9){i,,q1pZg@%UZU%sڗh&nz m#U+ȈZX`O2ۆ}" k\ԨwJRINW-NO:}r߰96s٫$MA7 -j INt~c` uP>OI0_[zA{rIF(-͞Ѕ G"/n0vH)t@WM{bѤzSl܂yAfNJ& Th>o<[ ó$F\WQ" D8m%#$+MhU{.\`P!aoْe@0f)cRF' P~ڑ NfM ,vf5qe󄕏UỼ#E+FòmF: xJR8CO,0$r̂Ak@nc(E &EgbXvf *C o͍c`A"e(@4٩>vCx%7|px4ElQI>@gL)9L`7>dS(Ab(-nGr`jQ*)[6HC(TQ6j$aT9 H=RpV$m 0<ɱK|~ L齘A ~WaD#%AgG6S.Zt2 #xy B.:h\b3 bu2jC,ҍ ?X5u~$!_\b5Z|!,YR*,Jަ3i7͈yNb^5,oDo]>ZajrRd|ەg& XmI\gX9Mdr##*}A7e q25դ_1LↂW78*f¬HcᏬmc2b/?v}Ж=‘ZP1rJ4}51lTF4mbA*m$ǥ>lOY`@`h90J+W 0(tZ6م&Bt2 ylpA6݈7eq$m* NC.:yhݰ(wۢV܃XFo%}-`X;E& 5UrqJVtR0FrHKEb;6yGfE#7Kv?a_la!Uzwhs8*uf "(qUY$Iင{Y(O?oRxMyMy fVE"8«FSؾ!4n9-樆)jAWniFf; ih.C'ݸ׃=t) Ъ.oғEV&m SUUi9fc4$g[&ƣGY)ěpg\)rc5pAp  |mB,g=VTKYEGs8[= e }9|wtH,/[aR2tŚJ%֋;=fAt)M~IK6#&w:u&:#˓gzd_m4g$h$F8L 8 wlvgْ@S}ӫb6‚8mce4#mS +{wy+lER@uz HlE$P5;ׇ6gF|k-NkLRxM_z',1v,$Ք \s c=`C$ǜ6VIiMJ{۰JrF[k ]`m~Z{yH3ag@ BL}7&epȱG{;X {o{~,VUq ے.GP Y21QL,Zrc"g$?_+=xO"RHvUV4AFΌ֐mɡdcv4M>lo=Vf8ۚA|aJqIAk6G][U{!`2g󍼒k40:w4+~j2{F> 2.T_ͱe&`N\;L`bnZvyƂ2<3M@f-Fney5.ՖwȦՖݽK%{1nшD n>'P{{q_ĝ`Gi#9w`u$QՓsUvlt*!pvtk]UVg3#(GդjSe[X;Sq74h0$Ƥ,DlDGoq8SY'fg5pNiJl!a8:wyxvh{_< r]cOe#NmMӅ4tQ["6~D4ӢeCOB=,Y,br^-O;;Es'h|\Y Ϧ̡y `cS39P 9>[LZOmθyzѭoI GGYRKD]d_7'[VzSUu32(h7O^l8-qj*,TJHnR/b9Ч2ӝx ,CgiڹCxD>ɼssƒ3Z4M▃G]vrm> a~ww#]Ϟ*4o%?/JnP}SUe\LWIګy;>te/.itM0_o =CΝH`e:孷]_P:' l\"Kѐd_3;ZG>-ol >Wxt_4x]n8+W+Y Zc7ͽU4u-+eJRT?m}LwEbDXUqbǥHZ_`j_,ϛ$:# |!tmPGP iDˢxϏ&6]<M|-t4Qc\8E;ӄ4iwlsp X3CDX;C}I~z~'Ezͻ+mY]/`æ '[?pPMu񠜦Ң,u,}N`4p 04i j)ӯ6⍏t$iF;yר:Q)0# s[w%Su}ME#3%?( 4~/AxWl/eC}R?\BeypZWwzq̰^uam9h^̀x~6Cj-;%=fMSn*nPBdéRх]ĕ{pYO* tW,y~FT#VO̩4c8L d;Rİendstream endobj 116 0 obj 5353 endobj 122 0 obj <> stream x\Iu@{rH:$,@b# RYˬ̪Y08Q[;A~⟟/.d׫ׇϟcV8D9<") ۃuJ %!j?^hiC}JK157_2AA: by__j9H+K U.VyOAi v65+`sZ{c^C!(&m߄A萷?}}yerNxۗp6{ -yUMb]>[HTLY?,V|Ҙ,N_>NG  )5km|ߦ0yB+)$|'1F@kllORP_Sb5F/:EAb6ɷV7ɕZ'9zK{6FO"7.5K}|=O%b;\I9@m$2(/1O'2ȖG*@$-B&1FԆUh$NC,ʷ 3AfG>r:嗜/a&is)m[7!iszQ熦[%6i'3/[UxQElvF BKɢq?[{]`fPvfVGp[ʍ ccbUa2oF:ƽs2_zhZ3oʃ'pЯ Cdӗ;N$w$1v:p1БuJQ-%LDxt1&`RV`m  {>Ug{?čmė@3r5IWZ2 ^;9GuICkZr%";A =+ՄZ٨&%kUM~%hD IffQ9 w 8a+"U&DEH\p@ֶ ti}.~zO, #YAPqQ > bgIؙF 5Ϗ; (< Bۍp6p3ӂ@<.ZhDePbډU "X [9JS=&M y8)`)2ȅlu-\/3Teu"q aYhGR]`E=qځ g,U"X- LcṉL`\V82xuɃK~J:91Lq`@gs opqu`}0 iKLu:ǵm=$Mı90LHZJÄ.p镖ca!tZO{+SCqck;@K cgPtpץTtC,=߁eʩ'W'.TCHNU"J:_Z;=[eXlXtUR"TKҺ {}K.AQ<F*'n*,9 c1e)l䶼Z6@g$Vcv9}T|qoا*V9 6T9K٠UD6wփa1 s~{Rif<;+E ܔGe =~F+X(s0(+1dp3h#;5,=V̶?+tg y)߶q ;;Qs2oj|H)ɥ0: My(4'#Ls?#|[,&g"RpX>!uffGRķ%i%K  QUvy֚ B65T,d{&p.F -\MdRٶMNtA$Ν^,̱j\M%.=O,+{ C-8'"p(gFLl ِf^C", ;!7DQ&;h*ruJO2@~\j m/ {|{EZпx 69Qa0֍(QQ" ֖GOPq0g!=ʉ8:#e”kR@D\[, I%7^(x3 ՋK&2#ǎ(XyGG ܿצ@{Bn8y6]폷% 1Kdۂ r1vUHbLe<\|2|(X,Nt6 _U@V&MLew@P% ܙjj,9P)*6dk߯)}tDOE'"ܸJV,1)X#7[szj}L-)4ÊX4Ϋ&&Mz؆VBm3fn%‘߼[iGWݥFwҽde@ idxΘf$7䰗jqVݡJ`])s v{hI=UvҕiY6}7j|l4ah .Dm60XBBf}Uk'P,>jXGPhlL>¢V[K: ]KݖN} 3俳6V@;GYJXӥ'!c6ѿ3Rͫn^g !6NkSfId>#J-$L ٤vr+W:d}MȬ/l)mWN"67n)Zw,. ߉ufIx'ia.GTԦ]HCJo7"=x? Cs`"#7KUEf-9GLdgm{ۢ 1bbw섾 )G)Hp릫6{}M[̞jk[-C'mVXw޾o[90- rYTs-{!s4Us@qQJ0^IK8[x`$\I,`YPI .sN5\Cܤ~5-Mgز7Qy>qv/tF\\|n..?Un`iKYV]͚q5.̤j{WQY v 4)4Y>ŠL/ng1 tWK{FtLY&_,ϛO0 W_{啥R"s፬ ݑL[~8.#/-?YvRd5]^s,ݢմ\ |.+?Gs2h&yUg8/BM0ր7|WmRz=1+uF̋=OG.qpCSYF+H#>_1[ag7b }DH>Ӈؑ}쏧)Bnh<}+&}6i2,Uqݔ38dOQJ\F~~B'LE\n DuY6 83Hf;c~&Np QG9v[N~z_zYıFB,SVt|ᖅ}Ӧ2=;]J_3Pxl6@':ZkrRUjoOj7xȎx|x$dߘ ElbTiv7; ˦)W 8t;qas$>${>AysX㙦eJSE镢!f A^H2endstream endobj 123 0 obj 4746 endobj 127 0 obj <> stream x\Yoγ~< V,*B YcKd%_"lLht`bŪu3qOpg?{rwz6;8lgSbvj/|IgҎh3SwT?N 1~p#^i?CߴʰQ}Ҁ_AjK#^_C`oN)#`K >$LwBp3pBKo+Zج PZWNH|RsW wKʹ[Z]6^ >#0F>yXQ¨l]4p*~d>n d$C$ aӈR`1tW%ˁ'V%\tL(tVd1_l3ƽ-$턥 "(%4d:Ig"4HYɳ/x:(ejgHDžts+28" q}OזyIIWa /Lʙ߂4['t@MX^ ^ͦ *x<:>?nwy wu(я)ZӅлl. ArFl 9RxWN7a$.d_ a)"޾E,{BNr&2o(wӠn۟I?&7oLp Gņ=29rJh ;k,KG'P3+MfDMz Zf)xlT l igL,YV2a!w~µUia ,eֆ1͙Vβt79pIl罵6HZLfYԂq~)kDP1kL7z ш Q'/|:5frI~L/ Q}BQ1lwhul]R;|pnY~Deni2PQVG ĩ(T he#R$jǛD}աnjwӺg82կ]]kI&QRyJ0@ ?x*#˝z ,ݭpvsn'F$EUvwg Vp)-mWGٍI-am'"ך{Ր卒z=(:KgΠ#dE(:2)d-/ a V9ˆ_7Fn8 z M(ܑ mI8Ҳ y!ؕ T;. ЌeH]o%&Ucmmq̶!;_3wtJJ^ l ֥+. 9l!jZXR"mhq? qWo=}ka]l/P|RbG+ S:sIP'Wz+eٚ,cNp: ='|w c Uȳ}Nz4Xw r9٣/= lZ þSQpM!Y^6ruwy,WRI Q8:Fo ]hm3jehU,þ@m\@uk9PXY(W(?< [kKM܏M/ 3tTh6 ((zʊY8 b|%֟~Ҥ[I'iLn[ԢmYazA|6BW AW~ps'mdf0Q@\^HkG"gxa%x5XN>Տly`g!ᾦXǏo}L,?ՏEo$-osr"L^WXV?w Vx^JkΪ, x_GBʕ*ȔUBC䋺*a8jV_5cR })B+' ;YsN7:6O8&.d&(nUR ϫHrQaxLc*7긿4K Q*aqlఠ}P?ٲ׍FQB_\9rM*tw S}P*mEA.* |VC Wd)I/7x2@(-LR%Pl܂c7qN7.qƉ>080F@W65[wegV#=ڎz)\#+19}Zv͋M vԱ"׫9bۆ/3_Pl*iSd1dAAi>lk:. C.uCwy $(6uQQV=^ɨȊlj'o8)wA-EWSTV;op~ ~Sc<-$aT6cXEƵ&}ꡏB/|N=ӡZx#qm[bg%Z%o=4}3 0IO7(B((#=ل`{8s<ō{2'E󖋜ԑ;6|06CrC0 x7A3< >=(3_S]]\#m3V'h yU>/5ā6Fs'fll(͞6oQs#p4f7_56jq_{厍?TW*XpȘv"hs(ǣ㽟{endstream endobj 128 0 obj 3545 endobj 132 0 obj <> stream x\K$qo('. rA92оW>Hj@U!BuW ;THd~ىA_~{b7dnyj!:ٽ7Howk{?:A imܿZ[u sG'߿g~e.ӳVW631ʸk(ݼUQ!B:VJmd!'kζڔPGGk7(~sud ?^TՊFla"WV&OAj3}H)]aU%i#0^#6Uh5樅IeE0H(ֻL~' i 3T"hv0DL^fC*w$MLM1;D$2+ܺ)oRqwP jǷZXߗ~Wڎ`ܣ'R`ix hI]ZUtuXUC0fuO%CwS i:|OڵҺ'E,FϤJ\񿮰kcS ~ZEJ\&rB )E e5# l`yˌdߗf=24CdTE{؁.N @-$h SokNF1F'eOJ{芦kTuvMS),vv4*tK,,Zcc*. xתqx-kSܮ_Τ'R |44Ïq?Orȝ`1X%@* 6/cX6!XdɖicX5?ˣ ;.0ŧy2R̹/}ɲN`ɴL<]MYɋ .sK4k/E*zS3j}\}iNVT3[Zn͙j'|PLi &^nĒo%)|Vgm<3oĜ˜^o܄ZtVG!ٲy˜y~ Vfti`^Z+b&6q_[Y &SGò`ш'=,i9;}֐&(GeFqFVP`/3dri# Av=z\6F( ;5IQLwP]2{Z4 (Nש&|cx9vi 313ә^(jU6eQ2[6+M iYٳ-2-yrBs+y<ݦ Y$!(ivw T8E2ZCO ŕ! xC pt4:&n{zj,30ҩً],+a )L8[rz˸=jx/`A l}"bOB (X'1yQpo[Aΐ qS!wvaI}iP 2k&?PKQjgAWl89p-.19ag{rn`ЫNV'sv qk0(F LߜDkĠV(sXQy<`%`x3gD0]D~C."tUvDFġ)XĚcqhas NG*, PZR-%SS 9njtc idF 3i'Hq,{'&>W-U%G 4>D+d#)D+ I_Qd+2PMZ?OS 2|Et #Rx À<(|-ZM@3v!|6G646_J AQqa֪^H_nH1mfe?.Sz:e>=n#kq[R.Sgk X-"=߁o&{UV/q^X26jȚcw/v5/d;n(`pHM.`'jQ Sh)4ǴmʱRg,L3}ĠYFn=4ѱn- yaK >fVG;+WϘ׍eL"y :`Άx&EUX-V)>ho!K# 4) mt?7NSofFep*Nv-{unvy).Ǔ_Y~˞߱g^~(Y~ⓩQam3ϳU.|\tIm ƙ*Q諮φ0$;N & 1&ZG)KZiӧ iVίZcLq3©'/UTv1\nCxWqt|>)Rs-U%[VNz2[e$S +eh;ٹ#l@@,㮃$Z1^* E:3]Ž9rrۚĩ 0̼$&fJX/ji=@e't:&f*PZ=CR RRQɷ.C9-VV`΢SZ#ur n.|B!9u.HdC`C9j_Mj]1%Ȁ>x]M]#5`/>ԋw2Q?ʚ*z3}@nTg|Tݟ3r&_AGJ 5.%+4Rv}K X<_#?)qQNGiz",JH-rop5hi/ϠO'i{ˏxzojRޒnQj rɦU nÉCsq˦HJhum rtolt yt өf%ک"R$+8z{9endstream endobj 133 0 obj 4911 endobj 137 0 obj <> stream x[YsCy%&FL"ۻ^lgm+TyQeY>ߧqLwHڒ*?jhϯF hdW>O{WyM89k hڪ"[4!}bstGK)r]+XsE:"q$ Xߞ,Q jOjR0|m{L{GZ笐RO 6@A{v @վ tX[[oNHBʷo2soѷn_'6&xhv7'z5VAʬ J.E!)RvSч>#˪>;ʼnφ៫^4@=RWyAQhtw*{-M^ۉb/Z~:_y%A{<Hs:r[Na%\s Üqy-arTqԀk$N'g%KKe|X*(>RDK1J}fQs*4r$_1kǕJ|6+2@Xc÷liRaIh:F_Q*EibXLKXe-Uvw y7:T%ˡj aڌrš 0!/SPO2l=m^ Go@dH(^#O']hPvEP9[Ð7l28Y]X:L,ͨ8ƣ@]4p#jFbN#%&̰{ҕC [F[Ev0&ܾ)'Tm1kѪlpSb5;9jӍŗN iIZ)s0.ѓ4ɮvQPY̽V}$=_NX^Mm j I7y UxIT:"*f FmzK{d,"L$$S!9i;fZ禙G7ŨF@txGZ |@*?5ƲS@׾A%t]ȳ!8/ih1]L%Xm\niIާ|χQHvu#u8Rh+iYg4د3׬f8guFuwWU=8 RguKo57zw;KBh W\>OVVmx-~* J]IuKկi^Qkӄ5jfIZsړu%X_{ۯ] ħ☸u5CUϼ?S׾u{m/Tvwt۪jѬ֮%Ûb7ᚫmk[[ նtLTӄuךzz#k+tNBzxwkyfZ; $vTXV.4OYwȍ$;jF7>JLaKc1nR2x9!6NH7|m` -/-hIsfo[IZ1Ӫ]'Vu/hkˏqJ!sA9q\h1y$"]&C6[pD>[ť=B&9(A9 G*o9/ٌ$4"+ dNNIC07NH S1= @$^)עh pf>У" pcF2RdCy/qż M y$BH-. l,ɂ(rb =_ӻw'" 4UBl]܄endstream endobj 138 0 obj 2462 endobj 142 0 obj <> stream x[Ys9~XޠkLI)`f`Gİ>`laR*6c6xBNI2Sy_5Ӎ]оK۳=ԝV#&(yu^!ɘ8,im?s0Zgս!W˓oQЄ.8p&Jtk,c{;[C#>r4R=kĂSk.Cg }t$I[ =3!oBDT@ͣf0?D'by~<QNXSlX2Dlqtz}>>G>~> XVug{9αtXO2`g0XX XD Xo#Q`jI{EE Đfg{Yk1*-Y 8EQiD@䢢KS(ֈYk -.5zJߍϻ_7J'by#t*8gC(_ ŸAg= GF7J}V<QUa.egq3`m{:q#Lo dJEJ%祯oKiARH6ʉIڂkB 'btHKy) ެTVN& 'g{?X\zv!6QO$̚Y K&}z>QoIW[Iۭ[?7 L h86S14ٮ>^ 1Pzsg6_CjZ]Cj&ƙ^~9Sg@=~;ȒrXu$3|U?4?&bq+3q4={=PQV/}ޛbG?e[;:D[["彲@!$b"]ѼՇt4)Կ'Ie!)ɴ0W5ecK (-̤E})X)-_! !j'V xjAI'8噣Q'po u:Q.5"@vVm"Sn4j֤G0e.h,~!2""G{1&Ww:e"]ѲsA=Z~}S Hc*ibzmyؑEURrC^kc>]/jl._ΐ̽Aga_Ӝ~\ի2X=#MyFÑbP`yGݓ/= ںObjU< 3hqXQ5U84[W/5!ؤ胺?zx˯F^! byH"Y0n*@ 5!1ˑ% #af Va^Yp()P} fY_Cb^Xy6as$\ dF) ) ϜpWH8N+j/Jux}BG5} Hendstream endobj 143 0 obj 2984 endobj 147 0 obj <> stream x]YqN^o %y?o97ЙDfzP&ʹK4WݳT,n 4]]]{UAt _/ qxy x+ DrKyl p/.O:X鏿ga\d' S@*9=Kw'mg<4DIwW݃c:$pL살pտ~{R |o3Q=;Lǟҳ&%AFS M_OsE) @QHeO> V T|8)>J8 i:m"TXy8|=v8 EuU:p\חZvVcmTޏ`D4ˆS嫼ez4%YEki* YlAl@=Rl!-Fk7d'JĞQ!CO>M(<%82Jb &Bt QBSa;~tB fxpʯ2PW4%wHV{3kmqܙ­S\DGxDPO[߾cc,KoB;dT:+yҢ>K~]*Yå5`V/>O}9kmQ9p{8N4>!=5=;35'NČtnCȇ,xa~Lm@( Lh@ɒyuzuĮFIjRUm [8AO\Bxˆ ٠ Quڀ48Y7 `l B颔(\ >a`31-焺hߠ[L'7) 6eXKGzrz#t=֫̍ "L=N45/|~.rD 7MÈhI$nS Έ!}^ GZ?{.54,[!.w7r>A׊hnvlMOkBVx %dah?0U|bUKe!6)v$xh:m ¿\kQz: &7> J|O$E碥pVҒC\2ిyHP%gdp$U:`?/!EIZƴ(6^'(zfIM=ٖ93S+tegǥ8*0aNRp]2\HMn/?˾jpEzFd8pNéL;׆z3NpW4 y"thE_LQ1c̣mt-D m%ԪHq kT/`~ `YLAO.M(qT0Cck Cz^C͗VW_|3GIY.s/fZ3;U$UjKqx .0'[RXش=e~h%#t&>f+Hmswi4j>_[ /oΚ!uqY=$]I ݩ0|ɒt U\p.gwͨw]1:C'BD9cK(Zd >]` &q=JOslDe% 4PȜԝТ͇P: ea֔!TLh 15Ew1@Q%]DG1?Wdoďߴ, 3^ Q$!s­J f9toW‘{$b JUgG6ߔ sf^דF/IhU&Wj:L3+:;SqΔ˚P!v ZTfRɹZ.DF< M^M(ڠi&C<5/:T`WQzJDd͜%VԦvd|*DϰOX#BS:`D5;˧q@^v0P]mbyb>v^|H䋁nTM SaJ|eIԏ`h~UOȇ?+6ŧ [@Rn\*E ;Loؘ+@Pb+@?0QtI(|_>O%@Q\_RlyJZMv7ۺ f0|^Qjey^OktFWzǛ@[{ 7,8mTͫ(6;jnU[w'SJ-RKFi pGCx$ #S;ҪpuLWYVEg;<̵J,V["phiLPc4dKE`WkĴwϪ.`.mу˳K%TBef ǕMrbe=󻵟n΢ϳ B˥zȭ3Ḿ~y-R!_]j;sfۇf/'y6tz|'uek~oyd`EQ M@cmFa12NE΅xvd55j}]^sn 07([db' cJNwtIFdlTJe]EͨgAȼB!v;9U@L茊qx4yLh" \z-=ȡ1Լ.[@k|Fa6' e?ȃ)ku1]xjA__f]#Z_ۘ:U6bupvU٘` Krؓ!3iaa[d+J|(CGm;[BT6c%MFN,luc)X4jab43ަq- ihqċv=BPeG8MJO4KxTmfk;VS~nu6[^aB|j0O9e Ixendstream endobj 148 0 obj 5570 endobj 156 0 obj <> stream x]IGCx;AK̉ KX6 KAzYˬ̪8 |P&+oޒ_^A^ o'?zz'2j˫On@٫8DIR^Iz^_ݾ|`&柦s4F>KFC'1G\` u9}𙶭e«C1n6>Ql A;;Zqlh3`HIG)Cqʩ'XUG+(+ʹr!:нIuښ?F\,dNӤN)qfOvyx~lMH!.uAk=S+/>tMRo!F ZE/.H3tѪϮ5L0u~XVTr32,WT58}Sj=x~bd&$MFl4qiE@-g㯹F4yEOO U/4^BBҎ $Pk'72/V95OI*i\$hl̮.8 ZL Ebv/6ԡ3Z̡aT P}Pq5G_Ev#yIpf r.Y {ǔ8ӫ-NĂ(`w6KhD7He\"شh=|MY$ iJ46 WIVx<rٳkb1ea9%SULii % $޳A{TY*B<%U>vPАy|A̩P|ߞ=jЭU4# MΥ8ԉ=YpYwu<uć1FdvʎތIO"P5+߆rENEWH5;&=Z=R[b(o&$YR-$L{,ٯ$ (!i"+VXo޶`3P 3j})OSG\w4QħJD$.N&hmi:Tk0ݩfυvL743s((Y ѹ!`Q҅Ba~nF?le#_oT 4ad.wst]3nrzzҧ/CeemϮJ(_oiu|lT`K5&WOFDuIըn.NWXĀR.z}gHĖf-=A5 /ӈ;1m.3 P،ԍ,uF~+ƘVp |m-14eʨ}.j/vz؟&֣کx< =7%}Ci:apB/wY'XOβ_,6$ caCZجCZSc iQiS")vaG } YW?[/g+DUD8kdR|ےffnaБC۩C%݂|6I75%12Kg~TWgmxӄRdrSH*X %{gE/aV܇'an&EittJ'K^nn>i^sR~iL5N5c+S55XҼ9\ xMsuM$"(Q5=Ws5Dι#$.!% Τ*e7DUM4QrDQLܖ0!VEtaѫ}7xLWӼMU|QP8]y,i'OP2?uHz#ܿc\b=)=q,,c#!RV:x([66SY7ə43yb7D(*XL.qe9C?9,;5!vksGr #tј[s2 '|p))#+3lr:>k_~j\!zWҽ*+8ι{ N/ &Kav=&[XR#\^ϯH7hld'{?\e`-98ND C9=p.:){.hچ ܑJ'b C0")זS谕J?Z Sa; DNW.弳N5Pʀ/[]Dx:rEy6WA 2&H5[)ҏE>n%ͭ/II%( pʂMF4F=/!ԣ+5zX=L4@*t}d' ӯӺKM+mY1՟98h8xIՍJ/N>GCշwoa@GuPܾI{B2?4$㹕1Yٌ먻OVkd n&aHy(Lendstream endobj 157 0 obj 5124 endobj 161 0 obj <> stream x]Iq &tӪ}(Q:DdъB4Z:_*Z%MH0M~FbjpQE(.JD @{0)=O秵71uc{E"&haAীgJ4MA&S7̇h50_-pewf{ 0ol6il{HM{6IMfÐJf&Oc[!])kkl]P8uvuBMx:0`SkL ~5y,NFjD6\][iZ~-\R.iْ9%f d$e#u&O]]p٪!K([BJ7iKv7xr޷n^"TDEvJx :!%cT2%H`Ի%c/*Z\z-PB!-`g@yNunjQ&i;CKj;1FX8j8q;jL!,DDH Kr/'*Jw "9 3'9WK#zy!@LL::p=$=uҦ19ZK̚+2kGi@Zh (&x%V~$ɘ_k0B9Ugbb?6c,xa4Jm*ŀ YhAь~sFbT*V7ChA]3Y ozdr@TEUE0:^N)r>{J &H)&Ǖ*'0~84&$x' oV`^J;?|hbtD2E4"(VP(y3A jjZ>@+nʆ : NI+cFHd.#YYwV֪C[ 6Pvk,n_٘Ʃ1N/BC%EJݩ*|9wipfu}(?9Xc 0@QȊF ]ZM˰0F|w`d*-ZMqNV<'$8؞^#$025EXҰ(-E `鋃I 4xҫáP pf#nƻ3\aNY&M̈\~R1NC,T6$+8@Ӫ>Pn^Ƚ}twzw8bn{?X\=-ֆZ]QX TY$!y:9}qJ+VUBk etKl=*E)j Xf@JUi Hf i_?=R(BaM1ܚj=杴?Y(`s39l^gTG‚ـ_%O\Iȭ0q: r2`FK|5sK\N$A<Β؉[WTځ/4&!Ϥ1hAvAnCr*)i . ہ!ʮg~vU Qz4Xɀ\`` +{{(R Bdm[L)Y 8zmB˳NAm$d%̱/ɭ7 wAy (M6uY;aL +'ӌRx<)Q,mzIP`ײlM<"1,@!AR7 ܜgZ52kj78;1:՜p{xS6"qqBHW0iA!UYt'v]ʃHޗ),soQ~c3&Ҧ07R3 ]QJ}@ZN0ۏ $JHd@JWV )LZ9d h{i8Q7+Aa ̭rD@}J=&zۻG6CoWW8 a P "`?;mb>UaD|pDE4ǮyaVͲn' OIiLlY{E7Y`) cYUltXxtX78G:aY0PN ΞP :K3=skPz$G15(yؖ1 ! =fM(Y<3BKbhZۍ"K$§63=azIz%yz7yhS[cϡ=Nf pGrH+3Aus9Fvl=q,pt,;ݙzJ]~fCctF7"~CISF t1J׸GhE5od_y2*7<-va +Đ;7-|u_x!?$lCWQэB F;%1eK<Xo$wvytw}"Tˣܑ=_5nL/A0Wg®*h l,6ʼQvp>q~@5ӹH6XM0 wQx!LC{A&)=qRi ?9O -B&7/PgUlCy;ǭVo[E+ ǀFXbFFvѤs[u}3 h* Hta H`6!N#%50<Ҭ],tH(Ff/cn[%jw/TMErrbS:ktHwF&n#wc!{e/nGdu[u󲒓ڢY&0Hj[[̜ ?4L|<: 8@E+nY#N5RB199o;ክ(\Ʈhv^Jz޺) a_s\͜7>=$Z6R4u3PNf:Q6MrD}>BdtRߤ.6^:x0)e u_0>V'ÛZn{{'}tgܿ˟._H8^j%-n} UgCDBVx D. (Ƥx;8 52הmz5ɨK8#DRAy2R'oMJoI9 'ò8.L>[|B3YZ7׌ qe}X??NEyƅMRpm*X[Vu`,HޓfCX0BC6E" ںrp༆>4fCT}A8zknȤ$FdLLv xfZ}\1}VYn(5;]!F[T( |WPOSu[{!6_\.6ҥL*F/p+VkDވrmϡ >Wnm̦z 0lWUûYK7F:gY$)KY7됲l-N)zx+כA稌w ^i.( v1Ѡ;3a8fqpV7g*IzOwdmpڪv 0۝9gUfT,ܱBfti(o[Ehۧ c ]BeP.]A+;xh\u,^@nf%mWx\wx38=MQݍ.բN ҡqlq]]rcaa* &bm27;-ɒ3y5jwE= z Rr>o3i-0Pw@!t<8BGٿ0IVt-;0`Ằk8^$,W-nW_TEDf@E>h0*P !%t>ڊt]b IGLfR6gs:J%;Oy+QF$j= kFeFVX?\&[?#%tԨ\J #+.Ll3POWRygO֟ا\lѕeWH2m7u]=_Fٛ⹐@6q1QfKe_)A+B[nΠ(| 70nQs'Ew\L-N,hq4A-ВigU'phm{:)l yA:] C 3kU\c̸Z{&/ij_EfN}54Zv颐'(E:#U܏Wo5rCry-w9j0 tR"*jѶş+U^=6`>PQތtXLlΧ%c=\FF\J_lr?HOEÎx]0BH CZVGih,P¼g2E- s/걁Rn |zw\W{,^*G̺Hl#'( !bHjKED w>&K w7ro|ݩmNqf?RazIE^@4UkLXfBYjt믧x@ޡ־~a_əxV,pxU.w.E nz֌B҆-̇6x3G=Oc?n[][l|_3dsكK|ivhl)3Դ8/;GlHIԏzzSbVб2J9t9Vb3@WpRN,>5EL̼{8x ]pvk}̃m-eG+p+y~\`'u78^meOKjϠ:մc)b^՜UqNv@pcW {sVu‹;G ; D6X@YX_2"J#ѩE݋=&^+]7nvцզQ2y8CEDZO(ҷLM"x]9P<4CCcN'yrnWfUsYR85F%jcj Z"_+KNNI;tE4s56{?E֍l9ws:!Oq9>xRo˱w o5[[g]k'LӍ]n}G=,R3ZTLՄ ̰W`}='w?#I'{EwoE$(, D ݡZ`/S7hIJG n^vTO_zjyFMLQL='}c8F*L }yM0&% *6B]ԥd?ݓ\?Qendstream endobj 162 0 obj 7711 endobj 166 0 obj <> stream x=ْ]qy S~s}I*#NR4%E.h_n砱9t08X}wby~ q xYOoҗqN9sy")/[k__<ŕ1ZVxx~" Wx7Nxp{Z{Or;{o4~YA!ѱ_(0{4 L aT}p?w+)S:%*-Ovѭ/~'Hӻn-*jWkߗ$.ؠw !rh^D4EMCP%c(gWvSD7|G70N|<JZA~b1~b ؉=q/ѨeHct.-w}"q{rI)(t|W"Ӻgg ;];(g J2(8'g5a.ƕ:K >ʋPMhHҹA>.)b22T?F $r"fX< :9m;2 @r|SYP K+Qu (4tF8LM6I&,X2@mNrzp* Obcc:lLw$ql~}P'ğFI8?]@jYvd>bڮtdqtm=qBFDIؔNd_686cO.:5?x3""|ki1AMkmŢ; 8iY;`A=O+:EE&k-Z}nDiXU815A;RDVǟץ)l!*CH wrYZv!t=l{zmak KuhRkeWx%sy0Tup(hmd sU_ϟ |9tM/{|8b]EzTNvJNӀ{$l52c3 wJ8bkW S.Uz4ސUi٤QtI("*ɛ|hfPUPͪ'2EpՈM.#Sd ˡv j]9lr:yl]x'tLo Cy2Mdp~TLqQ%`5,N?)J,"~ 2lj`wtmQ &v}6>)1j&${wW-kr͗ z):VFvw@o BSA+2` Q|mr? hc לPUUbhhlLz] ';n^J-C%Y,-.܉^dmWUrSUfU8e+z$k$A L) ψN(Wށ>emZܾV)ݢzš4w띧Jxӭ9c"[&B}*Ywʹ\p kP^vt_w$'S%i=έy W,} -^mPBPɡ`2fPc*^e92s#;(!˫H*,p (.IIh1Bz~I`nV}kZ2P s@1D~ow!mmƓ,;`33z =;ÙO/I{E)-qJռ.bFѠs0EU &F+!pX37KLgb?=?^{g6 =1~"%EQ\ZE c,54)2@_ tW@ j'1dumSHWBf0{ pB1j=0!v3@FVY"^%DQن.FMNʫSJqgy/xiۈ&w:ٗ aR]E*m~.><.,T/iiW%3 7qvfcw)l-SKU( ϯJm !&&\t,hfyD#O;'΁VB -=4kTډ~zBK'x^tsH9Z{ @~percz U[\с{:e#9& X0@'rLK-@ZŰKЁ)Zfi1lo@yfz ,Uwz3HP#QQ% TIzm+u)BZw!Bs4 t՞3{([|_QșxwǩbQ5e |ƀL+9 e><]Sfh\.QMAZͷ碪9 XQ\Y'% X9s\poX x+h@+M4Am\}Ѧ;`Z|Q,HC5=})ЅuG^89hbDT _-ps50CXb@*m9+(`3 0w#MD&ꪜXN3]6Lwao: Ddu@-/$2ыI<)BkC Rk c)y Y7Ce\mF@Jq!ކN""b:BpG?Ca#7Od,c!Ļ1_.̅}|PIL]D.( IZIɊk$&#<GmK&]]tufbR#-δ?XoL+p{7n 7<-ĐD?",ybc([**SG.+Fҗ7Ի-:WȹNH󅩫xHJf<В!l2Im:;)xEތaI* XaԒem%F=⧦сdOI)ym=>!AOö3ii^aP0+A(/X@0~ňirOb$9 Z`b{ș֋:Aw$OG¨NM-F B, 5Q{1b`C&Vs8%֋q$͓bJnO HϓNn œn{%QfPt7eZvrΖab+bgRwU 1*0,4R5Ħ+)v]sl[q#??YiMmlW3A܏D/jblUT(&pqZǽCBZ(S=7q9#u臣;'s;Mc$۬䈰h7aP5U2RÝ wT׹8`TbǞ?uhP(qW!{=#gHh-3?HC_قt!T\pHrsNa]eh|uIwUƛJr\[rԣdXu@p+^mYw`Os%K k{.$t ^6QZ!7mZжWT-Irw!ty9}Vcd!*+1u&d'5sQB(s#tluv\CihaGĴI3;Ovl7| !i'd}P&IkyP>>h5)j2a ~z( \ /'UPvLR 4gMkQxSLw W.?ybܜϥxvUukXMrQz,ùmWXmd8zTpĺ+h|^jE1BoHjaE*&~xFbΡK)ZN hM aR$nx"ݧU+Ɲ`!/8Ĕ6%WR up~2˵r;\ʫ u55V =crΑeаl˶ȴUϲ3s8 v-Bӊё҅'%/LKg݋L 4_ :W5Qk Ms8Up=ο_W!*pd'u:m|ȉdjuP6RT]'uZDsF59z&6? Ty t,&-}V7մ{XQZHYL_!ըҮO } 3wSk:9߀h==랾Y8ܱS *7C*pbHa-T|5"3,FfiVdRV.RkU˴x$eV­3F[kX0Z rbcQY9J"?|;oB GE2v=P#[E*smG^5QtNc2D޼ %}W K-]1\H2XE(}c*Mrrcx93?@R(ox~$IRJ9qq| O0P߇hWgcPSL %~8(ut϶DcdԜu1X.{ju36 Z;$^,A5>5PLֲQҒ\w4dUN;D]czi0JmXq\0rc 5}y2m9իPYp'*䳈ro\+%`bϏtQc봅TV0,9 AuX&r])a/ >Gtu^r&<^< zH2BǺ]PA`Ğv3l';1O E*FJpEFjX֗1mj&AdbA }:r VX-{,Ds ?be2ؓ+kG'ߡ'>ZY=G7+@"C+/Ś .1݄R.7yJjn.~}aa/v!.ՋחZc<;෗˟ `7a]G9`@\UkO+hbգuzFc߂TG&Jܣ@srDFfVWl'n.o5lGwn./PZ@Z~X`_]Ŀc/f N=kn#)<J^q E:}%x4=PNOZ:TO|:3]ןBW[kg_]'r:§ԟj-͝k7r].EsK/T`74DDn^;_>c[vK;wrx+ڨ;8p Uo^1/gQJ_3b4<'a9ˢ >e\[ַ٬_ta2]h)Db&)WL gkihjk$y- wUs+_d1ˆl*ḋAn^Xt}pƚKB6I' ]iA> stream x=Yq~f}NyM   V ZNKDkxWULW_3-O=}T}w$.f'呻x|w" Tb ƈ܋o o'̅u .'e?M[ g;\򹺼BӃf][ ;O/DhN?O Ë7jqJ9;yaOo৘qE|[O7;y|Kڠ«eIz 6Z9,SZ,6 qX_:Vu8@?iEpCR])Xi5ݐS;9=YNmanidmZn9x᧍21&hڈf~(2Z)ln6؉9ݯRIfe$L,{yÖaC՜K`!k0aV|u8 uqJIot캸/{UZ 6Kc" 8Q@p55moظU 6g&9Zd31s$@OlBVz.h95ߜM/W P;>?!nᡂKڍш@z bwq-:=2>dzM'QMyr-KIzCT#cYb&]= Żx/3{ w'uAcAh!ANlSF\f2Woث5ӤA4 /I"&0`'0j T|!5^7X pAB`%7fлhj̚DDXCD a`AG1e؝zK%mQ%J6>a$FS՗ Ѩד)#'!.k]* t 7\bwb (WEA^*t" <m^+V1{LL\m^e).VWh Е ;RjL&je ]eGRݙaY7T'9xI.(h]]YxI +5QF|˩&e 2VSk4oq4Hnd1mcEP$A"DUɇ7Im˸Iz ]* 2i|ٹpQ ; n Y8]Sprt.2w#ew=iGGRŭvX԰?qsrf7:7TojlhƂ#&SDSԣ,N\, &^:3߆hIgkgC{RgvԼ*WM׍"0ܱlmDN18PD#rϑCyW'ԘT2gqf$p!{LU52MۛWkS^$Yfq^ŧk"KN_q4ĭ0f*A-S˜r2.|=j=[P \I}e~0||.?} WBNjĵOm_xv=r{Gx4C uQ25i$̦H(׆ϯ#D\X=F3s5]m{>MQF$. (Z6ry &ڞL5h܂bX{a1!4y?FY}ПMUrfY 3)D5^u ?feM Ĝ o}9i phbx,EA/NhHdO\N\Ū :~ YZ?zS/!0<%e{9@ZصHM.- xO`Vuh9L$ZT-!;IqR1Z#:ă:^R,AS +晼sC+.gO[ZD*8L^X0'4aE[UdvddLF]',fA/6\9ˁ$+݂ >Euj a7lm}5ieGl r:jũkp# +\mYi0ݴFM&yHIU-$i %z9x5 bC/1jJD:`30[ސgyK.V&o*vB; <0&uLcܱ-nhfb"j'ՄnΛq0X>_Dt?\/ȚI4`̲4y̓$F+ DK`FsYZ ? Q;p 2x1qA˩0""lzIw,#e*,ő+npLKe[zv&$p ف ASC[@GuY۬fo 0c\pr#}*SnfVʙw R})YQʎأ[$%IPL̼"L~Vn@"̎- &LҪAKW4j@nIƿ9W5Y*]^RvX{Nz<-z{XKca^b^AO(Wk0+k`Ut桇9P ,Nuu hr9Dm1oӡ`'kQNҖpx1A#3}>pYq[biJY8|SjONGT*;J O&6a=)ڒK*n9~:} W@.W!^eTgaM(h*D%VùLʣiscnԨ㬟I[}h3 }@hD#e4F:(AuQP+?-c <<$ N%N*%W{ TSrbbh0v|V.0ېn?O{Ehނ+ÛXiN֓C,ӽ4c˓Q%^9D`[@sƊ 5, ]庶ʔ$e3qQo_ -KQs=Jrny&mg24aKY2s߬~7'| 0֏~1{;5Q4|:(p{~50}#jB蕨 j9jZ&Jhؑf$8t5ie*++qNa\Lj-Kzwjz︇)Y6D Ð wTT,Lܩw^4ZޖTjObGgSyea#v|wuUfG)~S^u8@B\jG}m/OQo|Acε9QFYVW>(>xX.b3vZڑۉ=4K!tvyEBX&MbxJ!L]o8/y!u.6f]I[n/*7N.C_JQE۔65TK¦ B(aYɬXXk\Sdjqp I}\XuQR<Fa:fVayq&a16׵ vawΉTɗ烣z_FC#u݇L|VCNf-Hz7mHG5W=/ەuoSX nQ[|,֔ri:Hۅt<[83]A__m~է^cUG.#g')'Wz^]m 3H=j̶8kBuɹF^ζa)^6ц+yѮFy-CΝzX\f }qbDji9,I@oPC9ҡ@DRxsbқ%J,,Rqfn#]Թ8Q:<3㭎:<=ӆH~t"1W S&Ρ^S{hs[LsmgiŖv5hmm,۴znN3nZ?Ε6N˜fkxxS)0?y:I ֝HrS {`5<ɼ`L~nGXRonG~O|Hk;] AJk<tOss_[g#L5DÏХ $61#ts ض1iRp-G3Q!aUe6NT%kF~hA_غ"8ҍ ŻCp"Y.j۠M/ ú}m*pľd? E|5[h(=uM$^BכoEXAu>ր h*I2F LSli#pz1vMC4Ϻ](),~rXuW AܮMQ-qw2$|*2|"}}Q5&TM8QUp?2|~{5G1wA]ywSsiH.#odԬn/Lo('ntmT$VFSȵ ;M9WAwCw l}6$ ްH$vѿNҰFϔ*|Kd#3 aTD_A/֕Z( @|Pհ5&YD1Cd٥y,kt;t a37Q ԁƫKvmRe:`]Q>fniԃN`:8W3~imMSsd&Lf^NUxl 񺞦SL!  uc|躀_}5tW~ u6;6~~+ABvT9ݴ:fZ8'yu\2+1qCRϒ HS&ƇրIdc?1 qoLF T\Xl›4UT86޳tmOP]]wM^b"a+t]m|l|lWPVeRwy 8 za?|O?;{endstream endobj 172 0 obj 7402 endobj 178 0 obj <> stream x]˖PjYf|,#h#{AlE 3Hd=G A$7".6bA?z/GbW'WFA6W//&Azq^Oz뭹W>j跑R*3D\'h跲K}:0&S^\jo' IB: }&]0m_39(X켷C\Y- .zG]fp:l7v>Gj8B83U[g y{Tl?J5lߤ/*_>-|3wZ:j:oş~K۬6qN9C۬\/~ڈIS59bpIoS sW% And՟bctcuiuz`V5Z%| !gys)QHh!XP GX`TjE{H zYՍ@_ܸrPD>囬g£ύҺe,c!zW8?)KJVX5BBY%ID1 XΧp Er2$~O$AjJ]D}Vu,sqXV2r4Jf$Uz&C&U0R>Q8 N Qh_!gն7 ᘕJ7+W4}T^)S=)DOpcT/NA}ֈxZ:h0W熄W;RJ/(׺\ZKa3֬t|\wt"ڴw\و ,AkFiEwNKsң,q1io ޒT%X5M_dz>X,7 J }k([ Y1 R@cqU`#տ]Lf:㙌i&qQ;K&)~y77{_9WX#_Ue6'y6_΢6`*@&E" {u(3䓑&9"_ށ% o7&*$n3 \(Kx2^g{ه2'b._\p KDYֽJDE-gFe+p#p@csn,w1Fy{Y1iaUU\eyȬg";`u4Fmb7 ц}mɋ֣ <!NFW|ֈȗ;gN>n)LX&?.4D[4a(q^-FL¦#,q;L ߳+C 9X/kֈK_Lλ' QC(ԉ*I/ZaHM#%CpNKXD\@X!Ȳ_S's({_KWl(JiL"ҌDݯhot`93̥l,&+5W;{+si&( ;5ul5>oә3gNwq K/5ZD>&L'Zji`|B{;Oŋsȃ8cte1 ~Q!dM]GH?_kjP7"5unh1'[5B^-:CTL9늉*Ȃ d:|z%Vꄎpgi5YN#udh  `q9Eм9KiO$јOW9m.Wib̡ɴ vf=4+|tqѦ~-`8b{: <ԓ dpZa*5&XWmX"`;t`_VO peœWY;N؇^/q&N`D{ ]W@1L\.!ѩ ;`nO9k"I7ɦ|N:' ~i GO!bgM6c$+ULwP7yb9wt`c\aJl+I<"vf|UDDy%[tg쿖&4K o$`bx*u!r^qx\pL;Ǵg_V6~@dk 69.Shs]F軸ةNCF1P ?;Ž}<?_ћfF[-.LT4#-S^klՅwVQ}KlCzgvtbئݮ#깕urE;T]d:N3>GQ%[^li\@>J %LJ[̩Rg'/EWM}GYE/ /-Ѐ?}x)p'S NWx]C r %> NA֍2o|rѯXڔGM-)`!Ϧ0LxYE Rz q #, ͽ U{-V%%,yp6e |m&!Ǹnq.n" &2(c)-C85c'gV^Mc.$~ۖ uD)ŸxI@-{*{іCY>B=wl`?9C#=y (M'(ͥL1Vy˸Jk-W CDCr_<d8F3s5*tFv0:㇐DKwau~㌏Eș^LuuP^f)|r:"N/[]^6ZF78hz9b2J#{j%4aؒfC2c/~^Do381,P9H7jBK;YqjF< 6ي{!oRHؚ5koҝpӜ~ea"ۣ-]_ jO#^f?k;i<@ې_J$z@d-YE%\/&Te_R0'$9@N_v"ծ@7E{ *ES>EB~:23Bπ|auȧ 2hooq/1pcR}rMq&aFP}AmxG4(R|LC[Oϻ`| +&Akk1 GaBjJ8fL a6'[x۠;P@ČfbtpmO^?5EH:橷O /;%j6{+Z^ mjXSd"znK55Ёcz!,Y3`vvȖ'-`za62؝XuT^痣Zjt}qʇ4t# 9nb"ve0o> stream x]I%>֎7k]־}l`33 0ӳ`ffRRUTo SKITa%:_џӋ#zzÑL??g/V@USάNr\']9^8z蔐c5ZtQ z}V4JM>sz*'\.z,gmg+9_>^H儊yL%ә^TσlNʩ<lY8Kzk:1~:>~1|_8>;B|0xx1WcB\08ńwz7q}:mzq@/ X;%T>2a52V$# tXwt1[OX{1JlcEOi~hY -ANU6`T-q~k'ՀG7v1NZ՟e@UL(HDObuPiD E=B&(SxH"QSe:NeA 9]D+B$s`0|™]U$0Vn,ctLC삌=){RB~SNxǁCHaG+%*Ű~2 U&SK}Ti I괆d-q>NK!0^֪=G^Og Ɉ@LOZEI:13کjLm8%1࿌#d*$3ʯA .I$2 +"AYa'XؒUgP,rY3E8h'9k73Z.l#-y68}[a­yjzϸjvᝁQ V/3ZtsGN}Vo%,4+d\gT꼹 pv2F*F֡q9Jۑŀ Xl2z:1+#v&3+XDn$ fZ`'Iē~W9 c&fØla# ~~ynUn-\T¦& +5(o^aɘ`A@¤L*bA1, ^IYRBՃ#+0]î(Z6]mq BUanjةԁō{8:0>r355R qV/{ S8O0{^5 ƭu8HAN឴RH߃Z؅oN3)j3VWP>D*1S"*cYHf%;5&y 'fTȄd.?N*edoy[1 3: #wa|7KRe^ێpݨPT%/Qht+j>o{x UrO"hvq$B)=uYBfK>orw2.nKZKLYNhVk(&-*3@L&W1!LW HC&%4 2.lPzXPwz0cLzғΞ܇N(_ٖVI }{)/9vMKTxJU։sPNl~9lZ܂>r><RN6]]s;:_2֩ :֭?9I2ti8bĝEdp$2OI+h!%݃gIqIbKMƬI-8/y y^l TUҿgaJ UVwcWMiEG><ӌ:rIr>j(煮O*Ұ*| D>8# 3tN())zHzjhBw 8u`r%zRօ&)šylICGx+cgҌ C{kC?0fk:HC$gdw= 5uR3`wy \zp ~M~9l۬5v,Xb Un"ՍFNl])tƻ*(NWŬ\ (ÊBfAvFhk93ï.bJJHXcV):1tÄ=J'3Μ~bgR~t5JMģc}RH% ]&2qeƐ{:)LM'EI)IR2S֌v` ܁ԧ_ mCϼ(7 -er]-;"ې5̡}scw50m0k6 +aT{^nur&;Vn`V^9C[Uo!pksa3CE7`ӫHw_](fl;1&&[7:"Ðel&|{=q5`-tl槳w-3c+P.7d{Ν @䩕=ϗ7zae&uB8ArZTԡҶL3Fӯf:q_Y6%񊿢dT \)PMNͷ/ކ?Axѩz'Df}iUʍ/l5C{>,qqw8r5\|96!?z6RҨe/*>.Uj)2ޭ+kc6Bܽ-l*¦{3.޻s 3w`~GHs[=;Exo6B #$~r6DTqߨ-4b_XhDM[7M<8q.qҖXG(s5,({Rd‚v2!8nKFZz\'d;pYn+a5;o+);%>'-mESK6`x\fiqٗrV~SRSaKl`}ݛu(u%.\,2)}P`Ѧq_SiaVwP=Kο{Tl*F*}t^ڶ/.,X{rvG:d8OPJT ̈>8Pk7gw3$[siW/v[aGPH>9 ]YE]fHC|`O'IyO&tR4Q\ybI6t WtL 2QA}\Q_Җ/>O-ُ2mvl_ޠ-;)rmKg: `]3I]" ~̿ %. +BA,_bA|k5";!}4 jD9e: GSMMs}|8RĢ5zb-/ `?o/CՊcX0DcsJyQOS%%v Ǽ|(B/GQ)TR >z+yy۠Wj -KVPnmP֨0½endstream endobj 184 0 obj 4618 endobj 188 0 obj <> stream x]Ks3bˊwb/qhI)$јp;@  H6~/ޜ}߼p&7~:S鏛׋7ǗXA&˳'5֛7gB q=hlߝ_(2(\ AZ}O5 AҷZh\LW^YݵfATv֑Z3Zoajm 6xNͷI+Ɵ& :ي+Dɲjn䃨Iʿ.o|0"X7* O~‚ΘퟰUŖ.}=KLJ?~Wn5>K;࠹!AI"Y:萧ʠHRzvf&,+!'+V`sۛ  whͬ1< ªGe !YK'H7X#YlZ.kHP>lsnPL yk/DeqIAo 9s6B>\&їU e6Ju_喙BsMc Oz_WA =R_R"gM1 ) GIr[pd7cWxetr GoТp~xש6VA]Y#oǻiK̪|e%:"g&FgH5poBԲG)OǣvCgHhӦQ^ͫ קSԣxþ=6rڼ|_V]T$u (K+[WZCCލ2`Sk|@{`jҡ&_lho542$d>XBCi%0 Bp;Y~ZcbgvHQ7`-j\ؖ!pp Zt&Ɂ `[O*X zN&X^%|Dkzz\B( F`*fqwy ~H*uOK`=U¿%PEyS;k@* &,:w !/φ=/Bǚ>qH0WoRC9';Xklv1\8i{8 Q&s ]=&*AS+67k \|_ԢcP(f9|~ޕF}4Z"3a H C`̌;VFGF= EzDŠ;oUc#E 3fYM~ B$Q [zM9ڧt} p@N2ٗ:ZljkU3pNjw|ځq \I{9[ |tq5(_RI"4uAmw&D'B,BX? PJJwI5U4 tGJ }{Vq4c30QM@9,2ƻ؅6!XI Q'*MM0CAPIx$}VWդP*fw[D3BBJQyЇ9rr&Nvq <7f9|_Y5[>cS&_<~\G/Y,5e1kUC's-c8ȼk? S(_n0{fV5ʂ{q$C.깵kI=Uk8ܺEJUmK2>Kv0-kH}׽:ޓ PnƯ~ U|/Y<7Y^P_c<.y_rd|rbdMW AeB9XםlE6b#4xdK\!vO}2vN/٧mS,vH'σhNmu3z .+|'?`lskd w;;O֧7Zo23.Ak?zMmd$>'~hq`Ao_yئʦ_*+Db@F}ɬU?R'g_' endstream endobj 189 0 obj 3950 endobj 193 0 obj <> stream x\Y~J7#Y%h +JJ.\Au;i\K$WTzXhc38_{qu={ ?}|⇧gHݩgNo)0nݩgW'}=_hQj9"vOR Oơ7NΆgūaxs Ov>!ϗ9O(duB!?=3ݙ/8+9{>)%Mx4\ƱᖛcYIi-/CF{?{0<}6_Hbbi׊ ;{r׎cX  )xIնH%a:E6-er#t/nFڈzRV^1dFJfs?{7׊i)=Y>/٫d Ȇ4Oy# ] |HSkǢ4:I6Z wD DDͅ9f;kޒۣW>-:&N@ҕrӻJZ } mLxFnø'3FNngQHs^A),{3)DLy#qYr\RK.ǎvzo\`^ko̰`L=[TRE9p KCY; wj[x.r$.ȝ@'|Bd>H냀 KcE2\$]˼k-TxyhJѦ:HPcFD!tb@2 Lp #%TA\3*H=5#n%f ke9'$m KN!֎ިx&rGW7+aH?TQ?ԑD[)Q T{ƭiQ,uEsmn\ o46q^B*_n&$zz$xG?~F<$ud8vEgi=G:==˹ԓp#)}+:c{sqs7cDޛc1ofu<ϴ?dBż%Qe™ 0%j<+e;(%Qr +qb] *u}%x^`+$ZIz=tB-C5!*L;Dq;hK#CX&UM0o mYaGL"YljaøL312$7ACJMhp5n-ZB)<~: 4M BE>s\PkXy5]%%Q<. [&/=+vPkmm %(%X|xƝ*5SȐ\[i#>t bOeJeufzhM&K|<% [KQV,?Y;6)aWRLwŮ9S$ys`Ȃ 9U}4  Z/vKi?k.וU- Yv Y_m۳lf4(ӮT,g5}ZwJb @ 1G(:^^ۍw0+ٷO37r##vTlen /Ǚ:W!p 9}(UҀަ`?JuN%c&Ue%V0 =LkHd]n>D\3U["V<Њ|0coo|<`b7yZ4RuQo70~M*Bޜ<;f C{9Hy%Sb =X ; U8٘Q)MAO+ ﻺ]kC047m> stream x]IwΙsy;ɲىdQ''%IV;W 4f$fV|\ W~=?~͑X=>zu$/WhMtʙG\HoWkԫG?<ވF im\?g~}J X4Z+a 5hh`?!T*Jǩ' \ң 18;f%R(}z5\E]ۉ5CP 8ZȻ{Il 31/idn`=|NFpRBg}W̎Yfv_00w5C4*yCg|b4 lnBigC2JZ>cԜT;dA y~4=IMd7l$ Y&L|ԡr" q.m0u ϊ0n3?QZ4Agt 4"-c xP7UCB_(9\Nu(B L ; -4Q7!"8f|f=C0 y\&dwyw -Qy,*:!Xڇz~{>8z.1w}`V D(p00;#I*Fg&UQ=Nr+P5G= z& @҃ՖW],f\O`VFX[\( ʂEmml2 #ޙN`'Pk%m; yMpz yaX;F=;[x{.#\ll<|m G8yoAg)0'`>OJz DI7%^#G I 9WK2nls4xGp"t0J#$")Ĩ&7w+!x'Mν8)i-FܶMG9INI&!%Akd11^k|53|yCvjp~6$|cڬې 6q4ƩR&F7,E󞜜Oi@tj!xxU<:H`28mq/c.Ξ]nH-k;X'pn$۰_A1w9z3bɆId H<>`cI0eFڵ_k3_׆k0; ;̴lw]GulؑQ ӚO ƕ|K'VbɹM"` ܕz%a4n}cHrLKm\iӌ4ZMziWp"dj-c;<*4VMQSw&x qWFtqEqBjJ&S :-<ٍ ՗["7S ( &w7.JEVTw ;U.3q`>oβ]]!uҾ!t"FybT%Y +JόSn%0.&D}@_[rC:IbK&ELU8{1b zA0Ƅ\B]aJA0N]=[f:+Z W*?)3yKo(\Q{ڞiηy_M'J&T! 8;Y\HNc.DuRQ$Rl5.x~[envP\C&hMɀտSѮWRG~. ;J.A`"əqFh>ZPCEt3nڣLM5W02xI/x)nMnr۹a5m]|! /R㛈e${3LKd JVj1t!\Sa 1sX5S=Ɖ r;R /V.&=.܃@R3 y:icv|۾B#`bJ$:CnW&ؐ{N`!p%#Bd.%u '(.-N֖J r/KpZt߁jA87TzK\y;ӴZ0:jXج&IiRu?ZJi% %8?C\ N auhN]TL"BoT.;џ_Rٙ bCVD -3~Kh|79kKaB=Rzh:Ɛ#Sט ]ÝiΆJ=ɖ SLT'T%en|{bu G [4/wo"|2/7ټp6p?3lԾ]Y,=R]9D:uOVrMYر,ͥem6[ҾD!H^zR ٮVDJؠC٨>G΅7wڨTֿwq1W ;|V`D8ݦEy^ q<rxp ꊦ`7aĘuрީҗ7F=tV<Μe-1Ef_]nn3O=EsxewR0ՠc/~w֥!)-[j ms ޫ< `u9"0K+t0N铤rU >S\Ƌxa1zTUx*!/YG}c?'-7홳 e1I %[Snq'_p|I{09 M`*?*ӲXiG,=6c`i/,(鐮WТSPBtE:!G>K 8'~ַyanf0D.4>rJE#&y:-0 @Ӫcza]Ϛj׮t˪-+4t;?6endstream endobj 199 0 obj 4071 endobj 205 0 obj <> stream x\Ks3bU" sd)rlv *z0VEi> Wb%ic\>g^rf/-V8 k2==|nQVy\>bJ z_:vȯ'i+cǽs2!?GcoGpaʞExV xᖛn,L'RZ˸ /P,T( &mߩk_hNk6m@l_dLF( bs j΀tUqPRuUH-U WoW(%)k `l[B$hL ,Hk::e kf#-W5梾C=J+b Nt"Hb=Z7@C\KA8*|ޑ\hK~lïH ) {:ru(<ǡ;TZYu4 0B$ ^s໬ӻN?yv{ "yڌ.k D|<"Z$`t^%EΑ[ b#&ЙbƎF)0i]hf`y'SҒ(ivCm)FyֹnB%zIO9vש"F&M&%fc4>OFE8 8P4 iPϩ:x"&}|R͘ڣπ/j;@/W L\t i#q yЖ`aVȣXHa#1|HxMJI iވj~!!iݦ_.-5\sQ,oPyȢ2-wgwv` U#E/&$ D\mvSMqwV;om:O,6oUW/: ڹ)ֹm F y$Ȁqoԁv=ւA'EH#1Ho&ݣԲլ2+z=kI BZiVҌC6P42 UᛞZ"QVMm _7SyLS| %}ZSQ.& GE&2ns6)8k\5ԩ">F;??:t%D_~՜A-w}w !Z߆:e֠u)@E  q%D juQnU@h/_N><ɧ〓NTE5*6 R_ח-!6+12#J~R傂2%jAg @z. lĴۙopoVfPmۨ/*4 GIۗ)mjݰT< :ZUV]h!nǒa Wǡ ))\IFZAޜAq+~W9qwk:w+=Ma?r*݇ܘ#RzDG1oP޴eJ[7)kJumdr ,oNKʻR+3m-}O2㍫wϩ?bjNcD;X3g ua'Ϛvڦ pe7M]^H]+h `0\]glx/)g&nM9=fN}p't:td#wƟg)XJ?migW @㦾 #n vV'ez;)w |ra(D>>mUխGCh}V`"+*fܳpдvw8 VO|^pcR/}wzWԤ?Ii5Lȧ>.{XCFPd)rWendstream endobj 206 0 obj 2768 endobj 210 0 obj <> stream x\Ys~T7l;}8y,%e`Ty )RrHQHn`fspT,=p h4Oz_FVNj^BT~.XIhT{H=e\#WWNj_k\+6k\ILUupZza7GlV6ZSO%A;],Ang&rml-h6qC'};cffoIm-ЇQ(퍩?PO mO3,8/7|C. r.߻f*6)gp3ltݿZ?$zaP`>vؔEϕ1ƷJ3.YPdK#LAU BKt"(RC 4%49`Ш}c,WVSqVa]3.eiO[7?wzߖw|>16!D^VFX~XBTZ6cy  04D.4[oCP}?vXrh13qvsc)M UȱWp!cjx\%Lm]Mn?[M+ƄS% r,`~>t.o>a@9`j2Ǿq5ASq`@@xp&i/mP֯{j1QoynK&)"~#bKekMcZdeT;9~CGjLckUvܓ{rK0waI\?rIIæ o#8%=8 -o:gƾFg+Wߨ$_v yM~>RH`los>P $cPfTua.;9Io}2Ip6Ѯ#0©"s*g^ߴ;u7L8N1`aJM ^3r&lOR˔ RQ"u:=9wl<5:i#GʺFfywwz{SB~;D,T^]Vd'w0ʸך}P꾉΂95uúvSnj/GŅ>|YZ;x> 0 [*7ϟ_ lrKX@;K17˭N0(7:Y)+^9f^ڲ3t9~=mtX/::wҷDw9opvP0q$J-I'TBn|l$0ȂYBV9Єs儊S0{Ar6wZA9(˭-r kxf;g2w 0pm3J2Rpn 8lF8Bw|MhUc)ðVK!LnO\ֻe0 "ݚAjC!qbe1 ,d52- KY"&B-ӯd`j) @h<@ӂ)T2eEƽ\+(NR+;` [] W]"EV(x b)LG¶`t%֪ Vn/\,jN$`l a.c{.6HwH `x 8:Tvr ΐ b#.G/ =M!#Ԁ]v ׉7lv+拚U]ƁX6g_HMW74Af rt43S&;Yr2 sHRI HLSZ -$A+cL)9 \wlDƦ7hC:Z<<܎?^i¼ }ұQekaW'U5Ϻ(Q;0{Q%7).x|QVʿa4@%i@g)TiN`q;d/̈́P}/IMZUSkPt;Pvqpk&wmVv4vG Q_aĘNu#5=y dʮH2y2Vݾ;,yȃ%bx9A#Ϙ@}W$'ޟ^niX| cAQtDޣO 7V๵G 52X-p<R4QQRM!%M#:8Lɔl?HhSHUW tʷ,amz%ؑD`wGXDd >߅)40\^,m|d5" 3LR9h=J>:t6ɇdaPŴh?<8g/23&=F)a*ٜOYS sU7t4׌*ի>;x-endstream endobj 211 0 obj 3331 endobj 215 0 obj <> stream xZMsﯘlʃ$ɒ]IE)Z''$W+Zʿ4fgEұ)&QIUFu7?tRP'ӿr߽ { ])gMYI Cu|?By]Pugÿ'eyγw,fTl'*OErw4Pָ:u{1Qjq5?zm4Xȗr[1:Ak+VYiT\䱓^Ni&FyMl鯶 ߿2%sJNOURy&fZdEԑ=>Vf, i𞬂dY"Lo(D\=<iEE|C^i8ƊS9D̮9$`W_Tn nQ>ʹ'8'~LZxM> stream x]K$qۄ#|c]apئ8a$re ݳ;( Hd~냚A:CFM!p|)L:ir^ۓM^:㧷'=>ѳV(d|GMݿ)9}|s<~\J1.[tή Y Gz!mKLLU|{cu 1|Y/ŘOD5^7<`2Pr1v9MK!۰`}{n V5IUy?ӳ&Tk!ORꈻFO096V.`=3dbYC0p91 ):z8>@Y[ JdU\)DhtoD+Q_ݒ˲S; jZ圉jaX3#i2boHrJ!y BJjܹ ^(f٤N0IDnMPLErYbf1& L?rVlI_auo[չu>*{FA 1ZZxp"ox >gzto^ŗ+tvd~,J`WH\#VW/Gj$efNyDm]hzk̷[z21]ຘ}!O$*PS&F]rIZm\X`4O$o'g`fӀ;eNvjh}H9-#Yu$(Pv^ sWc%+>X]4y&C+l'-6+i8&(sUzJC;jAϺ!+!@Ll.UFp[|d1ZNjx |u :%`%Ơ݄M5?2˸#aXS:Jn>eiOze+P{8DHK؝Z(ts2sr _2X ^*0 b ™h/SuI'rmugf;f]@*^,\d/gT':HQ2R(alj9ҳҋ#Hx T;Sk'A@ ޷RO{{qcq>Dw;?Ϟ]5תt+l&I<啳v&aō b97Rz[Eb: T/nܤG:|ބWzo'V)zl`W<0Hvf|/ߞOYL rE51k8٘),{Zb1ǯ9nax8R̲{FB)a^@:3AQPEvF3ZXé旌~u#Tz!OsE糛tW.$ y2^H4;4 5S8\/ ^[s1 \y"s!0I-B`oŻ~Wk(!^lF/_e8Gp)kݸA?%UgV ^Y,zb7dQM!*" T˗Z([k&@ m\0{ݧ^ 4*Q̀QNX9/ҔFC*g_$ʀM՗[mn7A|[a)vP䀋󳔟 'Xƅ;eAg<9?3sc뢁Ef_|;[$9I̵/ V8[Ȥ($roLZumb>zqsyYSf+#nCLEl f/̅|9n)%p{|deVw*[ʙE26N7Nv*z5RB~Q͝J<5,9:.Rd8 ouIO #a2?Lk?o4_ӔsdAH۬T.%2}G `"`"X˘ SDj&rB+"01SsuIkXGم̻2֢Rjv!ul1wa4lCE/.Dνw'YRk5y7 *<ǁ % tCWEeiѥ!9,0Zqʨt ;RsN;qr0?~uk>+&y4(X P|=/K/.܁&*)<ᙦR}鲑Wcz4Sԇ%(ڏhn9|Z`y)\0niˁ_džşpFşZĢ꣝oG 9ԌcFevov`~i:\׊6=۵ӆY.u uQtћuz6@UUW\ܦ; C9Z9ϨaMa\&I Qʣs9[dS{YftE֏Tcx\I2KI3aKHGZŕӑ@ _ m}I.(DnkCޓwy͉* ݨ DZć{"Sa :)Httْ3Ӫ-NG(bRJacCmy"0۰>|ߵ25 #l.],gk7QJ Osњ7ݞ/z=gOW\# :r3})D=f겹]wwqՐWU0-&gځosɽkV{TpGdl}Nw RO]J e.Νx67ߕ(f׳0v Ģs%:l盲ƶa]2KbK}5*$Ve-PJwnTf2sӎYA>; f}0pbl,ox_( ܕlBfÖx⣍OZíΓ'%Qm4;GUի (]K_CjE6:Bm5MLD7bRIЀ uΏ@5l/<L82qcTW=>]$tcdMEJ_9x ՛A^O4373Ne+K8W"{t43O7+o6sM\dXTGno4[Qnn ni+eI ot0ҝȣE93 ⰸ &uY_Y!M~/ᮘ "S#YC-ݲ[ϑޒzUfKo%(¼ز_H4 Nu~Wj<*U;!sQ:' N˹*|"ќmF.aio,3xck_5?RxI͛H,~Yo62]F1PjpA`x}i aO9ӸwǦޒ;Yl7]#ifvf)MR*| o\%F>Qb8EݻrY%F;kbkRh77)鈃w^^o^|2[:hӂk,8,YeߺJryսgw)&1T֞tH(<Ϲ"FCh@q=A%)] YGc},HQ0R$[&A,rLR)939-K4y#zym)2!X4MJlI>jLN67M-9!Iy⒂-s*,p"!M?MR.> stream x]Yq`}u`Zu@(Ě`Xŵ E;+뚞% Ѭ#+/yw&~g׷wxg٣ h 䙟F]|gL3c%g7|8߲Iiټgm0~VJ7If6Z%-6zaI Jnޜ[򛗱sl,%ti7ߓi.Ή繗3"i/d̷+L:|}.8.'8,3J*lt&;4'zCLt6No/vװbwWA';gImVla&Ɩ=4fFH6Lxz=Hy]dӺ#z NdbPT/)&G%t&jFI'lŽZ̤^C{lozp;7Ʈ~SFy^94?W >1#K6Ͻj2|7Dʕuϳ`;p+r|@/I$n.7Lɂ`Z(ou}m}uoaN$@E3@$m𚂂G,`TmJDQ^3!&θ26M u~7ߓƝATsBn ƼBLl( Lc^CG5S1 ["|[ dpڇxh.(֫4B`tq"q>(^kahsS =K^;VFeQ ?ˏOq~|Jp [Ď<_`7=,ڝ@ؗS 6l_v $p)?wSplF=Y3˚c=o1jʍwd[R#"Ԋc еfZ)j+)s6L?/h2r)8%u6%d>bSxCCݱ#h5zkZg{x_#֛ISԯ[Ӊ짝ր4mwD#}u-[,]H+i"Cב-pV{-8fMEV#Or8Kt|`p`AqLW =ѧQ~.jL^6 o W( 0$vK;uƏ)g |R*a&u3+0ERxrQ- =^t(¦i^>P'l%V t(de=i5v ܣNHP@rwJ k"plhS[T JMז0mt$]&񻍋t -G:J"i2N4YG6ٓ8%팪Q/v`SRr5zKZ*LEJYG3/DoYi2&$ado Q1dmO@j~{d-ZITFbr0Ё@L(nݹ@V k"B$:rv}vZ ]7g|plac+AKn+"Ⱦ)TɊXXK)N~Ft|8״Ż8U*GGЙYmi1A`!>X3.]йRY'JmF\/[paQD8߉qDV~^%@[W50WxPS"'|- HCƔZޫ8u+ԜaV$=}.`'чawfh{B4h'cӭjNR]\jn5kҿ􍶷U (`&>y0Pq$ @D^QsF$sV?0w4{RkN35(4fL1hJ[k-Оb"?#1"NyfTUÚXU0 UK0OƱU@ZǬev7SU4c*DVy@뷄|!Tt魴^Npc | ._4y;a0d2}L;kDPJzacl0AU4 K %XLm|%A졳[a*4GI1ٯ5=*<@nISa@6c 7Y8K^3MHlda/|/Py]A u.\hj*=4 iH|J/6"e1QWōN5\i{JUfī M/ށiRr$G}(]l"!gE͌ cͮ_/ţLr,kB8 Wȭ%"P#M0CGY0M$.ț²6&SbsQy=eRRg2)kcjKQ׵yQ<ʼn%ԱCs0,/.[4`7Tޖ6" CYCե$ rHٺYWzb)RbSA) k h񵰍/̷%Ij,q2ִ4ú=l#': t.9"lc[QOp ATh" Yu [yE輦I_nc0~kF2!ֳd(v>üD㼙HhC]0XY:(xP `{表𷺯j+1gaBR[؄{50loɇ70t~x|Wvq9F{"em)Ϸy> 9zB*Slߑ3Tp> @g*ZL&\w&HRm5HbF#1IK"ctKLAڢ}߲[5YQ56>[M?Wq2O/'[b@of]Oۣ!>=oAXҊ*WʊqG.| ێL!ï01A5QIuu}ΗtA{tf lնgI@@u'9 i! @d]M**XγܻԚ)gx?ۖMT9?a]ʌ IMtAJ*#1H2TQTJY}Č*#DA$eV.,x+ ͽu}U6!t .LȃX~w{eNel6UUr \ Xˊnu\B9IU 1avLg[xWwo E1pLMׇOqA MStEtwǎclbޙ3tKϢʁ0O|ZząttdMكUU5 ZӪSozYQd8]ׁq(CUҪ/Zior/>>w?xPI:SMM ʂ?ODl<ui{Ss:N1Qp!22 Gv|Nu}[-[4Gu>>ڟO9/׉1xqI5̦>N+?W,qdQ䨖_gȰJ:Q`6}HFP}50uƤG&b5X>MKdjw>D\ɀwAI;qmBT,t6ݷ9#}̠__*_hĚGf]~9kD8IۋI_3(мf~G[[!Ҧ*#wz;!Tjvʰ\N̽_I<Ԟ˰VЇ4^T/=ǘuJWP-X9W_wj%\x񻎥 GF4Kc陇QyY:6Ri-:d *9ƫaG+_eOhA >= 94rǼj^șO07.y!ݞi!LnhR=O~3=sM5ڣ8y?.e9e{/";٢&?(=?#Ѕ1̉d泍9陏+<ÕZa_;`W )oկT!T}[Mjtv)}8S4[s$*7vht}$J5}tJ&_+qoIt3dhO껄B/7^3s;H:i[wu|ſURv#Xj C >䊚&nƯl?K_tV{N([S'חKtI "Ioze•czӎY-p:}?7p_Cx̿l9wJqwj1\2 eF;X(?pVX͈R{F]SFNgTF?sAu.ݥÈZ?!.YsVb_nr7-8^>O[_F'$}LTj#19HW䊚+LO}J4bW።xiKE/ŃYtrendstream endobj 232 0 obj 6301 endobj 236 0 obj <> stream xXKo9ϯc6v \iY)hrQBBv3Y S0Lx0V\ϯg=]=͌W3Y?` UyFUY)*!UJ&ph(U?锶uY)L}8ԿifxQgI>eL}1__.D@Rc8N,㹓 yÙ2rSxsYVݼR3 x+p 9,z)a¨‹,Q h뛤 Y'Q*vº80M`V; ]Cj4h־># Y*)&ò>j.K/R/񨌗"^~Wd.Q -XIʂĹ.rqf L}aFۉ7kE5\1ivl)tlvHX{Iҍe|M2IEAf[ {AL$ ([qnN5*oI:K&@BxUy\BQWhXK7nfAssz9e28#W Zpv0)j mG͊Vh{nE}E+g7JM6&@uMhجc>..drwn,R7!BAhۂ0F UO{y_(U0ai+s%V?aGM=Iޤ_bĒ8%eĮ뉮Fba̹.i9&pHpQYF0jTO 9vJ$FtSF%_9tvQS'-v FMqԺ jyE=)cw)@r ^2\Ndw>u2&%ݪ(6VhCS%]f?U]j T,0,!T~.[PP'kHם$ɰyaf?}d כ''xs2}bƚ{ ŶI}}Ag0eG/L+tm~hѵ}1mC2,RGߨ,S@+׽Y#]|8n |?B\EިQ2 ޘ?1?Zƿ/-endstream endobj 237 0 obj 1147 endobj 241 0 obj <> stream x]I%UW8q+}:S<7HoO6X{znnŠuҟ@h/??6?JѳJ {~{sg(c8i=[k=2h1 #z84%mPxUڷB 'd~i7٢OӣW"NN 92hT;z!d^gLPFg11M _i0)Ӯmx!*,q-Q+m\jxfVJ70|;e3 > 6&0?DMoJM ]0vuv=IwkJVΆ ]Oq%CUrNU[b_dBrڜQ'p-njDP* 'sC8Z[\UFyEÇ£oJiTރS9O,%>S/FdR*8 f >]{ J$&-d GXG s/& @;{xiy у&bD#M~I&SN[p9?>zL#H?kP_#-OF-=OF"8v;(`[Ĥg.H7"6ZNHBI`u1yF*p~815,4'ķ8 xM6!MAE:Aaӆ%?Z~ʻ AC{He􈦪_Rb˖dȬ?)-pBb;jv&H-dM1-EªYW1R"UX"F`F2@ t?3BZU&=PS?˲!]pᙶq F=eL3o[~㹪Y){`S}xzi<at̊UZ'(Gw c̀ڎO@>!X'.x~|4\A,Wʮ43,aƑM|Ĩ-qo* {d(n 7 NOF$jWHI(W$~mtR )N/q~:|QՠRl=VKпmd$0kG9MҲU=[mX79W a^ :nBU%n( fz> az} ]SSPwS)ԨcKSXg;V7&,\V)\L7DW -BVjpV[(YZ_^ }` X<9/]_!@R2FL-/-J o4<$&QP U:},S%9'E-q$"5t| LGJ)JFjI9sH/Yܲ~ADwQoQK\!p:VAFq!>b MAZZp.(8oq9q^ItGg2X6n?G'+rΧ΂Z bb󥭮+R\ciz;Fx#dK wzFN#" it+q+%` D%@ˤ[tⵉgAS&t|y_/}T92;`\_92Q[M…$(.WYruGmY{x;s^)Cnhy^u|٫节20al7)TlxAG_%\*Yb<-ׅ2?G,Bk)C'Uc•yM.҅fFbV5D8&G^A)UKV*L{NX"ajש:gC'ʫ#k9FB Ir/bkMQO؛%SexQEba5zlo9b?ͷ9soj\)2oي6{ AwJJ&g7 ,{G3L༭f [Z2eT4kPcܤ4SmUtU}̒)M2CGH{{>HV)-W֛BS6q f4w(;M"bG fdB fVWXiyR-kIr5?s\j認zP.փ. Om=(-RZ=bP6{ߒ@B='>$4K厹u"@SfJv#':Δ֦$7cؙCz|2HC6ht-RjSΣZ3a S*j*SV9MuŔb\ϣ BaجԥqfI&ҾapCc'mJ-鵴ݯtlU*&c԰?* ݌vaq3DfDۡQB$P.Ws:;x7JtLWi0Xr_GڄL.$qzx㔢h `Kb㠱^A|xڢ9PydkM m]Y:K?)C6$.eeZqwsE5vrX1Id8|'pDZ X $]m puixhFb5L `>7T%m|9pN]MIE"説G 0s3\/?СDV%gޡk +}*-% oi/-PAu`W Z|Ux &|MkxąI(RI2NIbst;khԅo>aP^a% +"<ʞ%2%2u>C/>5+SJ,Tӝ|IO\Ya]%^rJB+^;:SA)/ }*)183%vqۿHFgƍE`]WyŀvړoTӕnǼyC&P41A{h7rԈc1Wi[U,Hb:\E EʚmKluѬOH}Nŝ2׋FM}hmR}ha]d y3O60?HJ){Y70)Nl쁈^j A{#A!|>'Q;'8lWJkDtkB@ڟ^(UoCendstream endobj 242 0 obj 6194 endobj 246 0 obj <> stream x=I&U O_TZb#v}faz^3z- ?<7ث|!N^E}lB#-_pMn A~>>/hF8G5f*џ c0V(佌e+B>_X$蠭3I`:E ǃ1ZM6Zw]󏀖rßmg$_R5CT h X}jDn0A>pz}#=JA[DmNN6&xQ٤"VޝgGO|K|[ UЋ^}ҟ1㗁-#0nTTUie[MHdWn`) zϨ+ F\y!`=G'm43.m{%j?Vyt lXnXs7,l1J3;Q1jǀڏ a{Vv C[J9r B+`IQgіF[1)H&j2=q(.W^1wp[!oB!oT'f+ 28Pzˁ )gd|$M=Kg9&!aA򱤸٨BW؁F@Y E$8}|9KTgQeP0(ǠYJxmґZ #^H)I]%ɐD_=)p֝ cR쮂]KDOA (Ob"{$`:ج#H!  jAD\ *lXJGXoy~v+%Eʑn?&9I`[Ɋhq4HѫOV3# #݅P7;3ҫ/M"T`}a yR~LtwiLktaN|42i Q DE:=c9KXWv5<JTSZsMe.;`ΚhX 1Xgfϙ;-œ|la@Pw^ _3h}q*u8MF IZC,(VϓC& ,D}J1 oxL"a,$me鑍V:=p9XXw4fg 3 y !#hűwڒNfm- l~0l l&oschwwc*HfoIx: C:+1Jzw $=)icN f,@׺qZheNK qPl?sܛ?hd5FRZF  YO͞`cPw}% OOZIe}LP>ؙvMV 7@ȁ|,ؐ `+;F= l n2Ա%".&M#l=HMm`Vy&Ѕ lسў%HG@afxRd_z)¥Ď`ǟ aWTσn>DP,-VPR!I';9i^r~d ǘ˅M1zZ?AiC*W50|j#BB6 9Y(/^kWQ7nUU\ʝ:vV'I$N{wS >E,@x֑ *@JǕ>uJ\!hNcţx 1_1٪Sz5Xo͖p7ʹK #`p@pXtx6H=f́AjvZ8~ 0?F|Es[fGXsCJA4};qmQVYW me&r C@ <(%0Ŋ<:"O+ACvSw %*R<<_,Bk˵{>0W6| kP=G:O>+W2J }_8K-76k%~Ώ;);T -o+[_-,NbV=}2 7wiBeFxܨH9s೏h^8$V:c 0s᧹ O!.rQvv9fc`T /LIXUD\je٧Kfͽǵ#*pw)X6EX4ͲV!2h~HE%K᪷1mh+O?:/n@7"uCc]c7Dpi x9&lM٠֪;L)= UMH)61"X8Ku ^_5W ~aݬHӳӺh>ňMJFq=PN5"gvmEUO#*0*?mub._dq\bHÂn"5eP+pE#7Bl{&>,tЈԕ .6sipZRCN/9|**NV@xTߘTyl^Q*B|XOJǀFhMn9f'E7} T ?=X*mWUDSco 6αDK,1*@}_stxNЬUPu 82?|ocg7lA`iG~F*7ku6<K3=#@\bI{̮GD'E0I&J::}iNH h[ZbK`wWW~+o O~EyBh= `P@W$mF5>1ZjǗWs Z[Xr*5f`C*s時erd}>l}d -l~kJ.`.ӷ-Z*Ӹsx:axk`W!d|֩KCY@RXwcHRm5՚O|joqbi>p#'K}L$]؆-%rYkkddvm-iՌa' V6ܴ:l,k>3/9Kmj`&8GLoYR֞M/!5zi)C \zZF7e~ZTt\4p <ع/Mr2*PSu'V),5gps#U<͹Gr*u_!>*qMbex cȜsg.-$g\UhŔC/L?) e)&Xeijn&B0eТxYRhnMNWu*h: o=Ư`۷ʁ< .9tc̸ AXۀuyeG>G5)2"@M. g?e#- "~0P;$8 l\jJU-}ޭWmVҊ74~}?ӛFGps Q?3jxgDE8L~igk[EoA4gw *bt&^ݘrKoRV7~h[1tkqDy9(IPrUk W9XһMu{4^q41kk _ 'bE ?"t_jniu{S;^{SI\sC<'г7TwM8C[%!ˌ[,'b(6X@cnيdƢ Î);u_p:R/Ȝ7u2ǹ}_&촷0{u`U[7Q؜+.0 [2JPAF9/qaF͝bڹGq,{S-.^sÿ,)ϻf2V0\ tKM`vɾװN"EK"tAľnJ 6E:/E(TbIZ-@T ؍WĮ3qr3R!GWJ~ȣwv"vToajK>'b7QG궳?"S[`&J(`*ɨN⍃m|"ǕP{*j|GIJR,q-*^>F)8X_eXnHksbf|:@[Ғ c7b0Ԣ eGiհ·*O+m:]&cbÓxkwU˨Iˣ>Қ0F:,6";tj\:"I"ȬػvZ2`\i8RgM5JM &6H)exhԮv atbGW(L~tqK8¨U޲pXzVK:dXIAEoQEc' oh9Hܻ똤& *I{}P{?~A;e4au XRM.5{49'/j_de Zb+5C,bee+,)\%[~6FٗR; l ^@8ƥD\ʹ\ Wo}Хoz^ ^2pa8ܒJD3\t|1r.b ~Ch@r=04hCq>wG]N' zuzJp )*A~o"ڙ1̖?߁gk<,e.fnwQV Vq`EtCk@+0~gx;<“ 9}"FPG'endstream endobj 247 0 obj 8637 endobj 251 0 obj <> stream x]IuvTVIUo`{a)SvJM,/A"wt |,WM43|g 1 A^?Ow=/_^_ hu3O|ߔM 5O^?峇WbR8/>Z[sST1\@ VhVZ)/O+7jc'1_~EYoCPJG=^W*C?gFrG=یVZʋɉEZ+hBJs${mTB$=_+t`>$cOrڜ_a)D!S\df,u.YOg"'3Q!wC+b`;Qy|)\&UEv7`o'm.XT 6NWj0tAIV%g} CGr0|?>+]ϹE2ު:<W&3 zeLVY=.!,B6*.R.WX>lbMZjbdi--vcw S` ɿTKJZTc #gqlwNH}GmnEeXx,:qlLU&9R p>f]UV͈ /rgٱ F`-w~x=hn9юax|ms%QYTCe*qy1wym4a:4J1voRnJ`A]&zcÃ"4jY V]}W` ,lM Zh;@y yZ' 8X,pNIO9U; %jU2Ztac2C&dc{wyդ|BۛT  awޤdzLJIaNX7kM_b]U&(ωE4nXZ GW}ћޕ6f"ɩW%^n-pw Ѹg2* R4}1TǺTRR޿.jbzoجX2 XUs"NNEdZJ{d~R 1)=Ŕ!r7P|-Z#{A\9ɞegjS_B 9;`7̷`9cT2G5{-=1FWMv$>UgYgtDP@T23sy omg~ *x׉I G-d8aSx|ea~C],@۾o*2QLR|h h qɅH{yW[&{}nVw9GN~F41T E&hWνEke{N o[؏J6/4உpN&9sٚk;(<$l 䑒f HKί[B2E ^MIG0ϯ)Oqz%}kcʲ灧l|TlWIg?I:aX[fmC/W<-)md&ԄTTEFzT xB0ǭqDUtp9Ty >q)3ņ/> zRNܸv#$XQWð;gF:Ig@%4Ik\U/ .%g`L'13=Y#Gfw.wߗ74LցD>/μ=Tڴj9 /B[w3}J2cya\~ܐ<\rj:q{l'}^6V|'$`uBJ,Kͱ8-6;g98!aC#pM8O% =E^;z׮Nz^=@۞WE|miaL GG]O5J)972|pQ9> EdkOɊf!;ʽH@J9 詑6F3Hy/ρppJ(jx]|g XIgqWpmS09MF94991wrj#)02R+>)XqĒ#G@ʩ- 9/5xwqWvHxP@澒|{-*!*` Z/-Ɗ)VZu~~Mb'hB Lל@Uqbm5ruzf[ QLrc:ӤUTz"לi툞DՁ:$XRGNWM {=ZJst pGΕJ!4޵ΏR˯k 6-# ';0Zۄ>*7`eˣ4uҷaqɺɨntmy^y*7#UE.^P{/X/k;ЫkDգ-B}xtC%DpȩWaa^|¯' _-IMC||s ǒy~m9Onу7(PL."v&')#fB-'c׆ 6/ Ah`\R#DY Y.Vv;g||9:>F>`~:hFqOAo8un*>:յPK_]ItY[m{t7=Ǧ<ސM9"GВŒ^ѝ{6o{K1qIZ9A&%ߓz `EҧH}$mnYH<;+`y&j "e삲wFU7S3n'6'\)U&᱅xAvƩԟ"ڀRҥi@@IauDŽ%dɧC;U0-EQJ%YѱFZmwSrik DUw+|:bntm{SF<Y~'ܣ@ٛ22s|x2bO W* f=q"4,SpX \)''VWRk`9L@ i♉ 8TDPu8Ra)+=4Χ\3?2/iTL -ὀۏfXGGz%^{GGӜI2;U:]JOH)7!3b1I,׹*o:us ıv#szP6 *;?#A;.smy;Uq/#\qM~_iZM> ͝ye27De,k0W57-1g!>tkkp^OSaDE0`G9w2):ҧO"Mc9MM=/@BjON N<.qقF/)Dn>/!Tqkٝ 1.[~t> Ϸq(TZ&;6M Uu+Zwk{No_,^]^ќ%vѹh?._KI8}ĆQbm-}5X@MN^ $J#zX`wCumӿk~Q ZC$NrP4ɚTU}16*t VmWCcXC_J{* ";.mK>&V9pD=<5O$kdu+oFVK)}ms*t4`;M!NBWK8J>Ѐ`sTsP @(1.JsN],th9n?-/PhN,sJrz-%\s=[C'xw*ʈ[LmsѬЌ}TuvO!OVs5%ժش݉dW_@~x M3`[]J+%n[q;8ǵE_bqBS0Pۖ_&؟QM[y[qIup > c|6{th?~3s$24})(K:a ~̜NnT\&tG$1j2xSGG "kJ[ I:Ǒ澤k02dqTtn':C֔dG,ҵ4 <PU5nA*ih`/`> stream x]Iqw/K?k}fB9b̡LJr6K$gYB_ ~KXl˗ P?܈IS~oo>7(&mчWh AҳFpURW9pOZ{/؛ϳ16pbt oC`?Gz]|t}dmk>c_zgVy||k P6EvtR @#o XrwKZj38E5f~=1WtsI9y8Ɉ3AAK'R렃;D[}ĘيhkzCwu戙DrO tt.B)]H5Bsk#o1~BF z&4$&d ?E2-QXHk3I?2Δ䑼ĭ,~ΜйO"Dk 5`^=1BQ~FM4V(4:3H}e-D72dVQI4"`3 )N8O+/jsʎ6WPȋYq+{̕tU^/z(%?9BYp h֑m[oѹ#maO^ZއKIX!DJ+b&XkL Aϭ4z=Nq3 wbI/Z ͇s#ڠ!DZފps$q^^H_ t{P²EX27vR`u @>Hd*}^fq$E ~!%wCyY A5\WMh\A.ifRDsc'eI"L4hۗ^Jݤ|>%o$iו͐Vv2l'gz 8ۭl9$β: F1ja!e(%*پKb.CEͪJX04GKjCڨQAQGZde-}kf/tA+W}n2]+Vdj(l?Օk*v6h49$4y,N5 nnqMWz o "N2}V7Pf0'MoGWP+,t.tmhv4'ge^!zg<͜@9;kU!O[ XS\Qp('&*Cg~*n@,%c`BCVRY ߤxr:D*w$GNOw IQzE$DH Ab7rY ]ʋeĀe#L Vǩ!FyuLBjJGQ:_3mON*% "eui+=_??o5QUQ\:rfS2*^KJ%=׫-|o&ZAY%Y)D9Gl&>$fR Q$%{RFO :jz~װޱ' % x # odVN2k8my7[MR1$y$0COL/ f0,)a+6,TPjzz3^+m!'-L:9NJQ~OE<( DXURȌ"45Ao#ĹҪ)p4Z_@Tq^oS˳[[w]Sm$pXfAgqR) -_sai~XgyRzOŚ!^gzeS"!hҭ!zn7]->&PN!(b0aJ֎/I4u# 3}(X&t=cQ:|Kۧ@iaYM}|cr$R_d >-lNo {Щ]^ ЦSo ʡo+e-M.Z7هŹAˊ՟5)LakL'\:×rBD3$Pq}cj-Y:R0T{] 0" 5%-hw|<]5hyUAm*lgnGexWtkoJ3 XJ8.m˥?JAt*|jc.p ~i=)mn[*L/8w끸c:x3IՐwl|&t8S]Dr*nDG)N@ttgn[V(vb\} S|DG'l,(\hp+Z]kFW/H@er3_Մ1$UyȑMEl[-D-$\&܊O;!ҝK[mw҉# B+H\ ޤ#ØDxHH+/*q7D9*ot{ZUR{е٢RKncy}-Q~ wϾ\_-cMmgS=gx5l}tJ΃<)|ت :=yiPtSi}#r<%:ޖ~;9zrIx؍^S^q6{Vv4V EX:}0+@daZe:LPmu:Mir҄6q"r:G\AC1>u%?,{ttuF}v7Kǯ==;zp-Y].ea?&vFaqК zoQM,ľT!xamI!6{zv xxQ͇! Ŧ3s/Mh6g*ǦKD0}*vKrшr熦$j*x39&2{] R|Mb]g~N@N6$k =&;R@=M'ZE S%*"ieEx$TDt_eĴJK# :\N-Og@=k0*` 0ZJzsn +V^hAF[t|!Sxiɹ$>[X%xY2+3t랱Q=NaYw 6D&N!Z+{X4>0hPt~w+Ϧk:`fWE*P|1^$퀊j0+$W#64|(,El/\=^ ޲H/gn~0W7V6w߹({BxzdɽsLx??uo4E][S3DZ\h2]N6^$;|.?EejXݪXJ?jTWTNefݒgWk4w='Q6;>)7w 轿&IzOflƟ\A^]A)L<${pߛU,gJEZAd!єje%"{EUrfIyeB9G?!4b=!lT7G#օb*gOHendstream endobj 257 0 obj 6241 endobj 261 0 obj <> stream x]I%qy 7.h9hHʐa49ҁU9 %C"Ȭzar%݈Nͣ߼HܼzL{S4&v)gn|ߔ7RNp7O<3wwEc==5N? O??|>=ͧOXwc>Pbt?XӟER~w|gԷ6`hy:Hn8Fko{tZ7؛coΚZUu-w6ơ?ccE(/h@!%^wi04= ~ K ޔy9ouPo0SZN{0^*w6*b.ӕVaKaKAPiچN_xzyAM5xћtn$&<7VS{y ;R!g,R Il-m?=>~ک;E>P Foާyx,65qދWMY&r>R* I\];)09l](knMidl˾΀ֿO} ͭZ[Rke6u`т; (y`6ĭAtyJ uBvQGϳu?N xn=nDXꥵgBXm'!wB:.hW(wCl+Zeh qiJlk,Sl#$`Y!EPoZ~i`xM{mqjKjj7fn 3|$N; Pތ5ľy~y?*HA>Fd^C?4 Y`Sхa{?ʪoZ\ȁ_X<!YFGa:)X ]9V;i5SVg+_kJ.ٔw+&l_^#$W\Z12rrq:D.ig#<>,9fvI9i3N u=s/S 7GRh,3yi C[ښ?M\t  N0=ODXSsTPsf^ϒq6*01=ZЩװD ; l"SoW971]Mo6L`q6e޴/n?U0cHy゙VXrtGyմ@+9gTRhIcr8$ӕR,%SP}u`+wBA3I&X>:w#i*2-P$f '#:TѼRGC* fs]:/fKWT@"aKTȏzNo@[B!:)s&1A#H./_Jkw$?Ֆd8QƯ6rV&sm,ÃPXn1&o,%ο|YQFp5 bre̔+/Ώ };_cJnz*6e[.x>WEJ1}7K)9RX79#̥K.C /8n&1:%7PV̡a;jk Shk0|%NR̜Xjasw8=i/ 07uB %{Xs4/$U~NaR \T,d%/)8k&XK!Ջ[i2yBS5.-Y:Ɋ<ڋu%DEuW"{,<@]p[/]:% QeUiɲt.U\Fnd󒠘@󲈤4(t+!M0 !#/@_k]\R(WvPjMAT@07w]udتgc SM^a ZZߘ$G*SlzqYLbhHf{7fߴ6;yWj Ueu0+ACԚ1_ٺl y.k;e,rtƵ SG0MSr،rN 19I^($ǂjDi5nV,5k6NJE>մxSMu=DAzuXxЇ ]x9 UnYЧE7;*.Ozl~ ;g#zywޅ+~ [M2;}C00yM"eXds1r3hu(C4܈J-D ߒ0gV=?>*ZiT!Rە Ј8~XM <Ƥ;W=û O7>h"gG) x[BG;oFI\&gJTkT[Ԯuǩ]Zʙo *i.T_b=|}@PrK֋Aa;V?@FpWYK5mJו"\u`QAJξk^su;>Ugq2g`[$fO@pmXtQc9ֹֹVmR+8U0J7lLtbGM0 T:4Jn @N1L҄<-H,cڈO @Np noC塟<bjJ\!ǔ>#)Q<]aGGG>R[@#~2a!?M! ~g˜j[Emdu^y*,h}W "`x=GaVY%1cSXؗ&kYu,W^Պ6+`2{0\zBVX*2R> nK8Q~w^Qˆw7WOgմʟr00v1:'^Y1g닕o2eA#/eKtrf̡]˝o< Pz찚ZrL0옽3ȿe"JVn+|tso"ynzvI}&endstream endobj 262 0 obj 5617 endobj 266 0 obj <> stream xݛIs|wV&kCdUE ku%V+N> ҘO8tR<9Vt)|;&es*JE(uژn^Ym֐a"{z)Vh՝!gU>e֘ߗf&;,FݖY^(}ұ 4R6P?_rpy)L)KktBhiYӭCt>X%1,+uBWQi1`Jai2GbɷdeDߵzxQL#eޖ񜟘517h,)bMTagZ]JcI]@ q^ű_FP9qVOG (!&[ S.[=Ħ0%15^kMK}ҧ4cNCJr|<Š)AEFX7]e\jK;٨w~aKj՚^( ^]C[yCHH;ifUJ"]ѐf7"X]Okɡ̞ԁm ФB,.+"&PԦSy*j&uOHݶ_9{sנ.6ls5X)UW!G"­ꍠC4LWl2܊X-KAO )←, Zr" 2aj4I^M7Z$eQ;rXȚ瘛 ɇWUm7 6s6Hzn,P* X%qxIA#T8# g?N_Pݯƞ;@pܝOWZq'E8!().".[E8s6 9=̩:3 =*tFAc+Yu#\]gHkiFM]T'̮a6Š#("eڠ}LJDf|(pg,F-^#љN߰~p>_r\OQ( a&=8Rп4|VfJ8\ydÒvW}ǼCicczvLYDFQk(˜,yˌ Ec<7q'agZ o4y@TN7I&)Mdx"i?C>4Y!H3o&I|iB%f縊4)~:ip i"Pt=ilmJmDzfFD} &_pt&`$"GVws+/O^5|DcDRl1QtST*LpWl 5fAO[7={(`WAwQe卻1{6XڇS^!FnwV Z~/Z~8wHLx'w< Dv Ly'-ԃs>R.3 @1%/}{@DWc/r,D ®/?rf`C k>#k}ڌ=>lj%d*Q95C߹rK磣5k~2Pmq K(*XY>V:DV>^g`rqQA9=h݊r˨4;YU2+#&2 |)Vw;gbłƬ#-]@a,w.0!m~pf9d=0s> ;C7^= | SQEwe:kƚp' #ʟJІۺ쎹OwOw݆KfQAoqMpv$T ڛyPypcmlqjx揃gyYDWg??c9un ϣϨVU1̻U윰~u?%~CKFvh''M/H#rFQ Q:Me ?&/5Fc Pw/ޜendstream endobj 267 0 obj 2574 endobj 271 0 obj <> stream x]Ks$2|{߶1,Çb'lJŲpjF/Ɩ~3@UT7&*P@>|~'&O˷gnn3IsKN9vқr$&cٗ/Ĥu^z:6w;zA*B)a?_ho'%u0}^|cUO.Zkz-f0o q>([o+`"┸@yԓvV^BIEڥU6C?Kesyx>粧ZL8Բ~>B-W>jh`J{ UMQ@\ZhL*(xS687͗l Q JC,R`K528ʌ.jW9!9+ʳB5:y`-1@+gCһ8E Ur >?P^M k*BVio8 QER(:u'pAB"J*6\y؃18@ P>& teIZkAzX/b(LUwD''8$!-3$8`r *OQz |?H}@J}ܹ)zQH@$+'T}Lkaw;Irȥ0|j}F Ae>U#-J^S̠f}>G)gqSWBH@5eLr[6"Gf3݃M.N $)ƛgQBjWR@ik㮊 G2Uz(.;I ;J#[_.m,o+ W8!y͆'r8F ˆ)}!Z&l¼ tAn)"@\mʍ%3$+J0H0u  $+(\s+;xxE5UD-b. OH*Ya, KmTFk ",ud&D他!Gl<;竕s&)w/AEVH'Ymp.C ǐ\I)~/qii @cg([~ llNwiu~ f3I/F+>Դ)Z _édpSS8[Ĥ-B5ȸiszEtxxx1ޅ<(DVzxkEU^[.n}Xcop1MFCfCfi4aN!(S︠5˼<{S0Mu~>ETuAWJ sTVq_ ǚ%MH"` IP2ruE%;ɔ1ܺy}1O&+DL+m\{%`HetNʸk`[7JG$aB5<+~:x59qh(v]e ^)k-EY.%q)k97R #A$dRF)Xj6\o:A0r±W)EVG _S6LP28zt.@@ 'gtpa#_\S'NO1YAHhl r$ e[Hv޵O c4m*dmx@XHa#VcZ%AoCȬd\p=Sr1j`pߖ([dNaDwcA<.@`̝iiG Pe qSmia̬}-0N}} ȣ'! XK *̖>t$ёjPA8zjcD<nKDŶa7‚цS1 ֫LL- P񜑉<ۜ]>٫oQwa[槷PR=e(OSIKOuUѬ>2([GX1<`N&vA U"zP+j  OS SD;AqAI>m+&fl4jԉȝFrMB@tU~g䝽1X- bvZUMI"R"R Ȗ&w:˛ ٩HZ2 jYet"#='h._ DZ:;Dbe'r^E7EYAٕL k.lɢP[08C?Yz%AwygT;xe)MiX\cXrM#9Qh7eHCJmt᫸Co-_5Q3,I?KK砐K( B/X!|fVmb&Ã!Ҳ ,4q+>n6/a`ODnkCXC zSl@E@Gz Wt_,??]~~|$ֳ]^` 6Ոy}S`L&^B#8ӹ( tقr:&!4)@u!jتq_;/GO6}n#Ңa(ymV]qK W}0T gUR:cs;)6u!@;fgMVU`[X|3;=q/`ඒFYRnj:ʆ8pd*?Pd{lR-͆?_~~-SkHw8P *nnBQ{gu} 4klC^`O4a}Uڱ 0@Z?J%Ħ]HZǯ t2}9REWuvsܖJs nmm?IA]؊Vm Aۼsq#M qn̄li%v(uT1^ʖcE"͵0s)i#0iS𞺻cs9!CX˰t4BW]X"/L4 Z@a5(m^wAˆ5~sc[]D:=uۄG=X@w>$g4vA7:dƛݤF֕Z/??κ+w@A[=luo8]x*dؔ<ƀyagþ[<^: g.Et4o]ƴwCN=w@}ge6$1NF`"NOhʏzBb2W;)ޔAw!T-|\2M|HZ~(&u+daFX\L?j뎙G8Dwzƥrkѥ d eI-5vjtTJ0%~d}oRxLb+7FY,"Uqu VOD%۱C&ĵJKM1Ygn:tke?: a,x~^ɯnMs/2>9J Vz߫6Ǔ_33=y ~CG y_is["1Nv J`8+fN e5meriYe6=рG΂*F=ʇ\ m{_7M~ڏNOCwT7i&Gpitxx!gZ}&;]yUdW0]И\//eŅߑ[ 7pm \'kkaL,pjmiߌ]u&H[Dti]iέM=% [0)'p1g5-Zkvua>vt$Yf)|x " Y;!*+۞Vq@i7dF/U.'endstream endobj 272 0 obj 5844 endobj 276 0 obj <> stream x]Ys~WLq' %Unjrk9Bӧv{X8Xwy ybי.6ҺyУmD|+њփr`p8# c=pwl73Kh`p͑9륟fɗ n0bM?a8sE Y}d>hO\Pf`/R2y6&R+'bQ$Gb4%γ,eY!Vye܂##}&Y%(6_dX)d+GGj&WlQzNjxJ} 'i 6篕ǮQ/h( ^iX{$Kxte45\^۴\(~ZVpߕ D\\I_:Qisc+!x:TzCw}Іw=X cZJe-E׉҆L{i ԧ0a<6UBo1پL-)-L2 OVZ9"5jD<6#iUkyQd$R xvGPWdLG Q1,)V@iImC|ab#VGI__+G{ ]F=hmR 7σ8`-VK4"KF1i6( oFIDbub Q?_ppͺTyBH!ܨDJ$B'H Ov@fXG-zG0뭀3Iq+(k9sgnwϋ}-8@UJ??gO- Y9$ eTW)ԩ8a~h= fi t_P=>wHt+p~o s䥅ETФ /@=GJÛIP$064a"ޒ(o4Ӥ\NȤ8el=b0!/*@挈nKC$gӿ&+gN 8Mc)3Kidc`  y0"a &bc[S`'Wgƫ&H;%)Dlm!Y,3nN1uaˆs+7a"+!e!u<Ε ]ߝ UDg17q@%NjA`={H2[%A nGp| pF*u܂έQ\8Sp#g7K(7? MP4~HSSh>4-UioзL,iɢy ˿[a)yr{4|6y33c3cN5?5CX YOPZ)~S |I )Ni$8k| G$ΌSQLAVrhmy:\p=kLĝ:`pN_kia@d*,/PC^U,|6A) ƍ]E떎08bv>~+yw8(|!$#m&n/]Ny6Y+T㛴BcCg0wH'wOW|s8C$vTtll NaY픳ʀ5&a^o p u 8by{?+$J8Upآ>h 8k \IHhrUKb| Ҝ,Ẍ́O _ѯ6Hr_Ԇ%7~ՌJ(s"fNc`=70Op1(/][Yxa)Bde@tѝڽ";n걱qʣX~#7ONS2b-Ґ!*;>M<`غ,T&!*z* PysTN r8fU,،K6ʃz(̔( G W`4k}1 & /+t0;sϨ#+z͟![E`{-Tʛ9O'8:}'vr&ʾL_ bO,: X@ @eV*'@¥rsU}> FNb[A7*HPb(rj{l':?2]`-/A=5h5V>f 0\^I4-NwK3,.ͺRhVV ͧU 'k͋Ϸ7)uDGCQTF~!IO0Jq?MiH͵=v.UϚ)g Vyq0Ca8ʅE&Z$ bKs,. *>H:<7* _രs<6;Q[*jSXqRjn,-<WT O~UL7>\mLoTy]-kE헡+I+yZcYUgϮfV΃2!r0ĵkD+㶛\i3{D!y7BE+ʪ\x6V]GM>vPmH:\8F% Qu8 M;~JPnWmơlYDBP3]9Wx" 9.L ګrBv1BP)\N.kiŒ@/ѰqRcc&,AaE)F`gQ)'S8'j9sz_CW)/dYS_OzWWpUCoS4Mq|l87%Xo$cwuv,?Egs06T 9ֽr+ݻG]׸F̜Njc$_)܏~9|<Û+_OX' w~P)Kjp^oS9Y^4b*pS+}\m h*1;\ӻ駵lֆbz~JsR5)7Iظ | L˯r|{7o 5kbCfoZ5 w4"{c'Uk1 1T'y4+MwPn*,p+%8.u'`%vb %LعB0joUvWk9s:h=ڰxarRP'.G4zoa0N/56I̟-r7C'n}4@kOhk ?8B.JHqwόw^ z$tL{r֫dhѲb*iZ"fbH" :N {1b:]+d  oqTv 9!q/„\Q B 7XW;2K$W+-D~(~j{"XS W*8*:XP8I5tOTсܿbYA3SZ._3(%iG[@Q4L)O0r!&6N(]G]领d.wKps!'$Z ڻgMn%fxP ۧʂCn2poӿu 8mSeQ^6[@LC,ޫލn5 8!+_"XA,"P#Ĭe{#V(j)y[׼q/q ZP( UrsryCNI?nT˨jvMU#!8z8ҝ`p-2j Z'.`:0qU$vZWm.EW\,t<|v5waw` nn)eGby0| !|:Qp[p oC7˗^(noǑE]'<0"4q{ uiY)?R0վ3/bu\=yYxk(䣾l }TTl6샇IoҬ9P!qy( ~NH-M͠ې F62SZ[Q^+}R+m+ uC5꧟H_z Jendstream endobj 277 0 obj 5331 endobj 281 0 obj <> stream xYr\-oVq`g,D*Kb6HlL)s۸!)RBWP+JOՋzq\N_O *lpuYci")iuoq]!WYy4K\ W,WYP d!!'K S|X,Znl۬#鐐=~]H.e9)vrV*@ƮnlT>Z>AoMLLp#.#Ok ' }>ڸ98GƧƚvJlhWHC>XK*1L%s]Q؜;/]XMh;τ䝔uԙu:iۘ*]s\ctӥ \Ar!Ed`ca%ګLT}uU 7nxթX4WwC4K3bv;nСbMHPX&4~nNlwzЛ2&b{ Ø˦ZΏZfe&'&!tMLFls%`i[B-M]rhuugxf/dCrrI%]H2 9e-iAi7sO V?-*r$-^~^7a W ]rӱ8':w -xA5q^WkVeQ|sBb\1S[oF=Gsvw2[^>.$niQgR)rv-NPlL*\|%vzn)-吝"?&ˡ x/,a]/ 3dOu;"Oc,peit*s=ACqL^¢dn/+ qPBv*)y`3t _}\hv-{gx˽4vpDW K/%ObOU k_7bw%Y%_zh;ǕnZ [°Uu s%C13>ܧh&>\'PʊR.{JQz:ubx+Lhp5JmCs 6fw~^ϡTE q*Q!т/xd'WR}ucדEBN.ȓ'pIUџ+P >t;`JM.M&LW֔-<+xrQ Liû!bd2[NC JiFN>}2g_`)l=f꠸]SfڝIf&єB: +N0ZrqtRV,ڛ Cvˋ X ^V+N.K̇v;XRdL`X\%/Ei7U0.Qq#Je~iIe\.ɚ!r<'lL8>+syzdn[P|SӅqsen5 "!*I,l z 1b1E<_Dv_Ph+xm9o&<ܚJQT)(g|:9b 1c([B SP{U5eDHkYh6,o?YG_mendstream endobj 282 0 obj 2142 endobj 286 0 obj <> stream x][q3K߰o֓w1O|( [I&W*2S6óK8!p6c YoxNzwa !L!p$A#4-Kfm3_,-[Gx 3s:Ś9J >IyT6L.7eyW&w*y!V|@2 3u\)[.)+hIv.EA//P{ ?70NXm(PQ߈gw(q?_:;9Fce ;E]cA<^:!qWby*!=I(-*/C:2&-{E_Ѡ]5ߛK@*ikۯYDź|.3 *ȱ>F +9r܊?o ]ćI+!&(jo̥zhd$[ݔ"y-AhA 5Z+i)lWj_hd;4vH~JuK6Nh#Xe+H=@,*مBrܸl764EOӪ N6(N6jd$@O4MeBR6?6>TFQ6Rn)$iX;&T4D#tDΡefkTJI.CFá:mQ1ƹ.Ta,,;*k4:2)֦Ly4Ӱ@„)L0Gu<&xh^iH6bpц`e Q4ր|WG?Ut03G,iHg )]RTV=**sjn?R*ìبb36#^0JL1}(D_b Cuq+[0 .~o$ !V=bk7G!0SGa׫ǟjQ;Bo\ Q Ij?~ر5s8r*U|ݴglj|pC{ n'yV^ C+ojvQC(萀8f_42"M6N$n9c4d`Y1 GL4w1Ƃ-(o-0gh^ R*KF1""C4* rڕ l >N;AJU [CӶt=rcY&NY֤Q'wKXGa TƉ] YUit2VTC 4ߜ(&b "D5mujx#^[kzI[ZұݏbQfcP% !JiƸҌF V PR{Qk j\.K.+|":D&I2ÛkW9*F4{W(= NX?5Zu (7Z}E-IXcgqQ>5ʎ#ǿd48a'Ф7g:)PV&n&Hu)ȅ߻'JmE.Ě ZtfrybvV-Q݁Ɔ iP ׇfue  c F=hJ ?DLVߎdȄl\,iO3*'MmS9'Y$~$TX+_vW4JJ V4l?k>hNv(YXWҨ|)9=B<4LO0&m1;(jN'o)7Pљ~Pi=",aIMs"V.{& ٝQ`1~T쮣g bhOQ xR>)CTnjl8AԹzaa I'ʕҼ* :ixS 6Bz=$y&gyyN vD=ʙ nuP ͊ߊFI__^9 [R܂L pd xv-" lb3h kA=mCicÌ5 vhvS,m<л](A6j Uh:D5xK\OE^>+ⅮcmF͐v_kW&˞&q sqȮsmG,K" H!۟Oos[6{6˙Fqy7g o>|d$}:vy$<Xi8:6p1ZGMm!Dj'nא Ph563QbX%'*Xru v-<[s4:EP//: %ڭϖCXk!OE҉mbHSߍ=t* ƏB1Te]NIsQ&eWZ]UY3rř:Y>n; nmԬR+tgMMFna.OV̧rnm͛ j]%j\I|wahM 2@6}[vLf<a+)Se65dn0 g $p֧Y+D*< s,ON\X 5 }6˩%^T_)P8)q7 BS?ZY M5UB[ P%p#X(M"\FQx5[wԠ;,ỷ=Furu#m8Z66*Ukl`c`PtKZFU5_<~K/;r~QgsKzZCum sbkI5ʖR)8% @bP@W7vF$j?]Qy.m̙q7jUo;BZX'Ži;p>򝾦(q֝􄩯~V:9Fn2R[OeHˋ1Nb $@@lmwn[H6eGh[<"i-VĞ2M^;aK.rܐ_i`vdOLS qoTe낙6M5t eSҰOx-nZ?Ȑ6tJn]|BcGIeLT!P!c̢MnwZp^K(VHDd Omj҃ ..֭ )ԜPX~E?N,?{Y HY,M]sy{tjݔ׽Rdf Q ac"%4+(u`5 u+Csa%9'<+rZC;! //"aWT~5L@T49RmԎtq;DBmC.]k \ɒ퀅OMTRyMˠN$Ƅɛ R27{ Ǹ#j 䫌kT!3|;PpOgz|N+G<م7h{*6KgF덍 8l=UІ!_mP;KaNh欶eq#Uڝ3FjZ>wE^vφA1#~<ǝ_ zaC46N'$AF8t~kXpH:F=C:uv#<.a|6Ϡ:M"Yy,8vce m9c{dãf0☦,l O!xqS :tQgU[)=™\"w{̍Ms׽5y^;X_V*{l U'#.~ blp $!h=W߬?\~PrM`vBx36fy3 &,W]ͷѥ}7ݩ]Fz-B@| {zOܟ%> stream x]Iq3Z]Kx[^(Sq^YYP-HѲ]U ho&Cx!&y!O;>xG^@8ExNRB#9Ii/ד;:<ZGxqy6uxzy:sbi6Xk땯̞_ }8Rc,AGHڛ_jo'%Л4Chℇg+"tW; `/)K 4&eAǷAY;׫KHc4-7F߇_ŽPht@ K$at⯖hԚ7by??1jf1>KG9 -],S&z m( -[*Q߾e<|ˈddS'Nwښ/e xz H=瞵oa&ܙT1x[֢WdTmB՚9_ Ge8J9EsJ7RD}xH%/3s{iZ=$.Yd%9jΜ=4IYj> 5X)g#oZeM 5x1Z"s8ig{*4961q Iȩ,mpUD-g. _<80tFbbeB'=K-\=5 ̝(>6 tgwQϿf"r<2h .yS)ּCFʟfGr 4k9 v0N&v"nP]k+n]ăȬ5(TIECMTT44Dꑿ])z6?br,sEi3O$Fhae)qinL'Zh*i7]-#>є-|!53`ENʦHeҝNTSLXFm &LkgEۢ(X#ōƀV"zM+/*xLLaLL!y2&SaK"D\.%OAf:4sLvfr?S\@˾%_+H4jwNvb`'-k6A> 7\H"u]ye 63(vnX_c- !-V:ptEJDyf@?\#JLR>=hnQv$trB+|rҵZHAB}m{ ]=_;k M,ǁ᥂ :v{I}.FV#/ j^NH[2o+- 421Z?kkWHncƷJ!'z6;VY%}ͽ {sa&6VSip~}gQv'صzTȕshEjx ^X5''oS喐+WL-=Scp Pȶ<"e.#t2Z{3jy<>>ޛu1-#9M0sq[qB4c5(P FӇ/ƮCK"tBWS=k I]L2Z}R ?Tx1D2I!D$kLIg EsZpR4o K!BʴOӦ{l).i%>^V AB= BZd 1JE/|8YMSSuw k5;d 9oe5hFHkR;UTGH1c2YAOZv7fV7ymŮ׀]c D-:=LLxA+3 Fu`M^p+}ز2<D=,?[aҧc\ȿc!Inт; ?0Mfe鄭HǛ!?,ZFအ't 3@T}ou9"\$&HA-\/G<2i:,'G[IN^he[YĈQ _G0rّ#z)|~`'J{`4/hC*Ͳп7<:QWs?iF}S~pk J3+W Vi@vRFқe9 ,3Ql@:5AfcႣh Kbd?[6`*1"|哎qO\t,KVoY <0XGo`*|sX7xo<-4 ɁiXqk03!DJrR۞CPL= = S T,Z&(@n Uͤe~Q #ȇzM 9ZFLt1ڬ q_{h]ն=E 1&̰sx*k\ƑUQ vȓL:ª:U8G#&SP6%@8>/qek ~6 &r&7T1du!J*Q+V[As$wI[0QF N Saf.@ڒ 3>naf >oU¬>P>`iemGI,PP HEBøj:s<|N8:02Tpt%i^Cs$W'}{gDK 450Ah#X}&Rq3eQ =z9 G/Z#,}3E z9~rh@mŃT&E%'+s/V&X^׉0x?<|;w?]1OqO JX)>>cn`W~b@!|OG9B+*W+;+u=% \3jeā)F|kձ>]4ȌzGASXQ:Qʤ v>3Fg-(wUaa<<.8 yZ`T2mV^*9΃)Z޸Rzq3u0x!/e9:yE&ۦ}$wf(qm%NՀ 'b06$4bV<  Q%թ.l2|jw Pb ,eCxH<4^B#|N襄RdRRyߔSͦ>4 @#lViFہN͜! wfiLaIc_v)CR@/qr>cSͱZ3 7%T{4,x'Z!QӘS闳 K/Qi蠌f),-EG4`vWkOib3\C7J h3[{0_fe J+b8]ܻ6N[<_'D;d> I+jxvcѶ ԼIF[/%;z+nnvR,˥a2֎l*12x\z`)Kp omDA՗RJaSF=r=>rKe嚗m6 f [{:?)`lbwGEp)X+wealXLNY7ݨ g'tۚƤk^ֆK`,AR? p7U?2]8m5wEu('d-4k!4VڏXUl,n"UoT\!"ӋQhǧ >Xۚ$Xɧ0lÚ?-!ʁ^ks &CD=hPRu(]GFEw+ܖP\]*_5ڻ7r( oocy{11_uIASbMc,+}b&ݜmM=+%8jԊׄg?wx@YG`c𬂑Pr\MWgʸ={Rę1hiC޷"rrVMFk|MP>1SәJ6E!UkoG~Yk2/G dž(;2.ÊꛓA#VY=/P{^rkNxVnW}>u(mǁET=>fh6Q'.:m>u\!ۉe\v?2,?rC]s]5~uYʖ~^$0s;,"moe Y+.BG9Wy7gv媆_u'A^fwenc/'L|/}<~ic~xwiq-_Mt &BGQ"8~=›mFuM-KgWp!:)ZwXRxMjjc:8~q vjf|Vh8H Pz҃xR~D!96Y<wR:u'}:::o|h[(n~?Sk#X &2!^5+s@-.ou߮8$^Év.>ALhŚ}[\I0JYm/Y.u)m2|If٢ª.%\p3>p ].첍F+Zߊ0AGPE - [ !G?_X5p|㠧*utʼS8pɗDvKǦgOp ӕҾcD]}r+(;!mp]E{'Q X.8a yV/> stream x\IsR *r}qr]qE.yDه8YdǢPK?n3ob\*8{4_7O[=?{}?WדէW@ wVW|Lǭ^+\]ݜk%ZK;_?=gi#R($_?Gɹ|>[s:/Zޜ8Hkf=R+x/Pߞ{Yc1r猗7al\>4%y-g4/012 _8#:̻_c󿯾֎.PZ]rl(~Rh^bꬔ{c7'VBHzl@($uLX BvJJ3` ]*;fC X*K:0[[aY[Nx"7ȠM05Z;$t$6"v d䷑S |drܺqAi=Jȃiz qQ5=2,@8u4GX|R%0n,d*):s,%H:&O?@IfS$i7<'86exED}Og{Vk;-(ux&wTc*LJo{ O[,2a 칌2@{#"BC4uMA`cKG02-lτ:2kwJߗcwpHP觜O44?M,Mq)ZM u E*ȶRGȱҒ_ %Ag*$R׀:"آCN:r3vt[M^%.$հj 㺘S~Kx1> .]8-:لᛸN[:7yJ e]nc .J&*[v3z`/%(d )" ;L/7k&oM& Zn=Hxi`7Dc1KXVW`dZVW`DgN?Z%j/7/ÀJ2aF@Ū&LtA-pAs !"-U^v LJ`+ ֠m׬9a"ͷDxf)*HwX|6[i!nHpMQ0rtJ+-(Em%ӎȉקTd~'w1]GjRc5)7 ;& [Yq*Q* ԋRn!*IU6@V;7hqg*L5vU! `.2QGH!H 롁,q6J:Np9do?=GM+!n;&&x+v:i&k kl/ڄxoSzAqɴl"lb#rF؏F ~SuW ]IT ƀt˰l@]H. Ja`" n;>N8s OLȊS:9xIIAd)^hΰmYO &~PwRHp]r P *{7։"¯fD1`NpCz Eb9C%H3L >Fb[{B, N. 1\ơz ]\7?@X6!3ڃAq+EZ=Ae`4Նm(Jl~Xl$H4=)_!ǡ_F梯A.eI%(F(pQ0ck)ż27QOG Z[XVeF͆pV4cs?Mꧩg,*͚ `IӴaA\.n%G5:Wհtq+q$|r!ivWavPnOSzoKF0b Lˬv6av{V0MB_HXӫGA$*7hNk;-caa|E #x85-Do㤄.ΩaH?XYQZbsuvAQlbz4I JVY+1Y 0criDIyHӎv ! _VPU;ϛ TG=|ev0QMrDyx苔CZhUI(S7wb] 6̳큅zg"Z7rQK\Rxs,ҧ\xw$$9_>J5Kp!xriIscsB]Bg"̸3@J~9M 7vu$?brnx&ܱÊ_,y\\)Q{!i^'[$53d#&LCz |(2!ox^WںؿZ:W}ng`yGo}lW띷Ka.vmbg:l8quiRlOM^2~JeB lrbe!ц cGkhgT Wz;76|{KQ˕$BVJ]1<"߯ ?Sendstream endobj 297 0 obj 3905 endobj 301 0 obj <> stream xVMo1 ϯ1#uBbSB(S.jiݥ-TW( 5 ήldfĂّbT ս ( CH_gD%'#E0g/E[zj{Q,~us/CMŬQ^c h0F)Sbc|D|>m0?i 2endstream endobj 302 0 obj 699 endobj 306 0 obj <> stream x]KqgY[ۮ#<RH4)O @,)${YՏꪞpfuUVV+31A>_o=7O~|"y{ F9n_>oʛ퍍a0ܿz;1h0Kn ?^*}~KCLC|}3%cU7}rON;[)~-2y!#-֔Ok&X^`#߳igU/Zyխci<ҡXqܚv\]*cJD,C8.FM7ps!Hf)BI=CSCTߥÒZ0V 3x;e38p/mٚ٘u ;<2 $ao@P078[8MhO L2.J{Yn:˒DpMo@N B޿^i6ؤyB!?0lRr[87hIxP?Tۊkv>,G, >4O=&!nDIad&jjV= A3;];R a:K_K6H hUMZ-X-Hq޶8P>@g`@3pV+̧Es6ȅo3Tt#-$~̔eHd 7"[<4p6>fZ35\ta?޲&ttC\<'2$Î) mKx|dFZ9_ 9~Y`E@\]ȐAA{.8%]LZÚnL:?PbneO7Ļ|`Gz1ldK)EוbbKY2LkG"lYƙM"s?ELҧ8l# 9s곕%k(u1.f᏷j 1f`o( 6fR>ȘKlD\a:R"7HFۊ."_,Fu= ֔[d^>!tm5؉$nf^M4{y :a ;?Z.QW|QSH{[|۲ʽ̫sY])>"oqi0c<6K`|AOlgsf{'EP 9:B'kE=Hs* +W9 C,eD[oh9_N+8ɱ\AnɧCxx߄;FP.zFJmb}1ђv=0KP2Hhyt$3gqDB>n0pFPVĴ1N7w 9fFH1J0:#Tör!{? f LUhZq+1y,o<)mJ@48= ~dh-"[ϲOBџAPR!6HW2k*Z^2^*¿^ j:V%>=!WFZmH51/e9;ob)'[|DzXnEye16]+v8/=Goӳh9;UEAU00OwAĐYEoJO%.TBʽ0]U7dBZRqIx(QQ͖6EzyJJ-EX[&p6+"(q_\MX*t3"ȡT3:sujv! چ(VR]@ە>OGGs ^r|$B\ў>Ԫם@ZfѥqoNC1յȂT(E rqF~c҂{P-!)4 ~Рݗě֕gЖsXժ/r=@3%:9ּ_UxzRZ3wj>n~.`!}/J@JfʧC2x?QȧPdJHIGERAŕE:$0W6=il)(Xiv^eҍлnis>~= ڤ<{7Ɲ ߛE=Ԟ%cI*n?SGTZ?Zfy՝&bNR 3#X d( wfƎѷէ2'HJ^>%aAkXa6-JД3N `  eǾKڢjj3n`!/\VT:23^yYsZFұI./W@ٻoE&.HR^ da6.#:7c7r[*R@̑> ;tl1hZ$!]q+ Iڛ4+_e2 5I{+Q斶L5] ͣÁNоhwLjִ_EAx1S!l$Rj+n&\$)ېxx*M#;2‰NC6땥 1j+SS[o:5 35Lr !FU%NI˼s~qNgCDh:PN\܍4tE)?/*߀gGl:0LnR?RVzTd}a1gjeƵ]EDCqh[K[M'&*r o^ns0Hg) E5K@`J)ꔺYEVKDh $ 88:ʯ/8XVTAp;ܑ@(E$(›+hEqʘIzq4 _PZXwe%#R hW <6ҁ*;Ni} 1Yz-t3HX-9&4n(FjB3ܓ8+==<*[?E}WUIxF>fJէނe#f5:=M }‚ǃ ܞD:KՆθ5^1DܝYdOcrL^?IcY螈1l"ښ?|}ܟ,|c*3 n2BR$M-EBendstream endobj 307 0 obj 6032 endobj 311 0 obj <> stream x=ْGD̛ :x;]060 y^<Ȗ-%f~~9Yɵ1Jy+3O}˯$G?}쯞~$?˫r/Upy '_>7bRFx_N8ᅻFL"Dc޿Q~27֊([#a+ڛxEt4B +vyXg?imMO1zi=ZGk}M oߤ8{t77rx1NޖoW }EyZ!{}hW|3>4p}ZSp'Wvk?WD ۖʆJ uWӧK^_F(vu7utگ yu%, " mC_.Il\PalLv ִrG*D0-܌P߭xl=h8Z[/Vxu+%`J a/GZ\KZez aG1Ɋqg572©bR`Ajplƅw_FR~%$8=&@~823;p9{76#|cFZW샜>cd #'Ԁ\Tq`Ipa*."bjށV-P1=OO{۴Z-|$ڕȜvP.r:>HLNϧ%hԙB'mix.AO6> <_):iC%J8!ƛW8@ʸC➄ nrF: %&m&"=6 GAMBfE#<_QĞPaa%.OJ/F'bK剜q]na pqZ=zc.P*(%G}+z>o".QW]x!8NmqʧLsL_DA 2AX] Q- -ߍ?48 əU%l5 g.>;)_owfhT\t .g+ A7yp݃]GC󭃓/Wfs:f@EXsFgl2a.4v,Mbʙ? k# 6p]iLlІ;@aMH%o"{BJMjĚׇ }hx4K2 6?umdƀMQ&9ȃG|y٘:`OhdlӤa7qCpF6);g(vt/kF[2TMJ$e`\#:EDB&2NQgՐ"h}j5w?Ն\+8M{+L\[|3t Lʢu߿֔,ʸ~Z dcHjw?=؂*IRuÜit0]n%)fLP6gGtxX<.Ekh{hyO*7i"<\=!'1KL0 _JVJhXFDX3?| 4ε[0,@?mFO+̓F rDX]dqRut^6S;G1=՝nNtfUʤ! >I¤a6NbprC5H8{Ya~T}%\sd&u Bq Ι5%c@8$E4J;W_AX }0   ɷ#oU,(@R%`o?:uV_߶ x}Sx9ZqrR#,A/”p9EYTk;I\4IP]j*R{HzBʁv^s88Yf6|l|.iY |cAtU7Gr^V|N5eߤ`K3BnH~r7Iy _( V -p\!qȿcZW:tt$FĞ^:/a} sz_F" n'V `x#j G| c3N:΋jT} S68=b4ΪyNSB3= %r0D(*SF8<[`ۓ zy1P s+~GP&D?-?aJv #%M! J4`fےW4O#N va X dv]I pV +qڟu(M$0pz"\_rS#z6QДFޑ9uWiJޙΗ@f=^f;#Csj7M@ZDّ̜3O)F-g^fX`F\';sd _v#OÜVƁ^^&>3d" @ܳl Y[By,נFyi*Do;!urj{$QK.B*7txGB256[K5A 0^{u0u 4/ vue9wtXZTS')bݟ/PE;0u 'I ]G(b`-v$kd uh`wұJ, v^R,Y[j4iUBLbʕ[H ?oq~:?SpFPhMVj>1 d U*Nd+ʑeU1*9Aʀ+I[PR|<V;r@p* 9Wy89V{D⹫$4C2sY1g<)\ ]zPҼch''*8iqR9w;PL*F8i"fKc '3fiͿW)Ɇé*Kkyf9afъټ.<p /S@%Dr˴."?znY܊'k婊1BLT[N U>@;cuWcLU& Y;*q]`()[Pp_$C=(j1n Xғ?/WRcO.a3:d.̸?l?Xʎ?5IaY sb\@Y(yuJɽ6&qNII1FJIRҠ0p1̀vPPlY*,C|o ;ph^fqge'訤r4"`B3G=N;Ӕ٠11J;4f0@1'8Ud|M>¨Plvorec^=VļiooK~d3y?>paQܬ^ۇnAϘLռVu_Fiã~`T3U"2Cp^3}amW:K_CfKLRٶ`0)_װ/{[ +򇛓hbP+}*Vfά6(}P $\Dr H&p6F2ä\eai#Pf9>gG軤C)gUXe¹U=(O:xnYH(A:|47$CiVSVYȻ*%*-NL[ь F1Թ#uN)x8N,e,[M$7^TL6WgVɾ]/*Z^J8|:^GTyg-O`.gUٻN*A(Y\rR4M G.>N+lH䢸HmLa]T*DžX?sfK"jrb\\ yt9f6|ֹ^/ Ь# =v}l)FN7MZ2&i}bxhx`&Xv|Z}:/:9w/ &s{z3&k G,G >( ni7|&bȑĠ07e(4SԱ,zPL ]gSLmvּ\ 68굪Sy%SgWhuW,qSFy9.z@1zMSУfuM ^7D;Hb0 ,5X9\:_9XQy7hy[J2LZBXD}TyDK7)5+'"*Q;q`v2qCG eԨ>F ) $#gG*o|V!~iRPOlj|eUI/I4O;t'5cmZv& L/0{Yy"[_ Y:'STwiN29o^t8^LaZiR.٧LDC2L =bjF:-arXxBx=hz[_ΉxɌjeö +XERN;4=Xqf1Kdg:LSeՊ@N:Ǿ"82{$g N Io{Ub%< ZIdHgU[#P8\BKF&T ~k ]TM䷏?Yb5!64&TM nZRDۨ z C5.`WlO߈%i53Zo0f?9lRtP@i&XF6пї!nucP@1],߮E6Q4 )&>Y1Q{1ǞK6@Nx;"҄hr˰e9Hu3:U!,vAH^(w^2&-nL?H*mY̹)!Tz{C&SpUlXHC 1nЀi_{nt0I6svFy-'1XRI,sX~?8 0 U'U*rrRT0i{$F HD#&P(U2alJ]%CVP 2}%>'c'" ` kQ1h`\v߰P+8R[gFg9`;U<\gNqSJyRx (KM2S@ [DXqO´BygC ;٭oFe׃ nǎx=RАG GG_,>3N!./ù Kqpqmf^;rǭCWS`Ղ1Rql,+Vg5hzy=l+R- 32ȸrU~Ubo읆:5~ؔ$pcU*_+u"Bɡ#@*"<6@R86M(`X JHwbew^a<"ǒXw׻*A[>I"N;Ӏ\vx%ֻT]WCwfAt{(w/ۼ鲎zeuk彽.e":@}uk"]w],LicI½()rs[2=%~e~-$&3sZHqEBuWb$1l@~}uu ͆ʫ.4~̙;3_jM[%ڜ5 SBKy7}4¥!,6zπr\`-0t*KR贅{V[z*5Bme//@!|ȃ,V61m=qpuyѱ&^,"F>; WzBev3 y}U!EO=pSOQX,9A 8(]Ed(bfP3X!-A1\p1;3:d⇽.W+QHߘK-"a,=.[VǷNJFx;{=o!\Cn,Pxs N-4us 0r$?*\'zю#[D"iFY:pՑ2:9PD!a&}g?z{CMB?9^Dr]Z$n\.j+ϓ}w,.`XHM =rmh3$;ny^srfd`kQ".6gZBv'[`+|hWORb^c;§apL*9CF2sTLDB@z}Is}zy1lwe-p7n_R#uDG!kE(X퇾()J4(QXh,#B.Ɩ>fEY4 A` T T/u"t˜Q|(DD:@`pUQH VՇ&va9qt(Mҭ4v~Wu"&l2;܄H @L Jo1ۏ!z}8CA+"K\p֧ Bw;zqZ>~MX߼~tf.FՎdbF9JIc}{c w|_:^`n-<Ϙq 밫e IנL[ sDkpQ7q$v+b_<+a!6]}#MS(JD.utّJV~~gUR4bؠ*lc9_}džEʭ|PE9 ]mg@k訹|>^8vڿi0 .:Q'a IM&:@i͑]~䁔2I_&өIբ*K?/]jj'0Z‡2BrH\q~c|ÝV2 ەvm)3XhzX.Hl\a{ +CY}Ky-G&O KԣOR[y\,_nNo k꫈E1>V0^BpBz UVnf o=M4e"Q}V6/F *WX(_;]ohLyUru8W.a 3zL*!Nh^Et/Eq)Z_a״})|KU Nw#nau8x:kR< m;OQ4 }[46Vuv-6JKgsJ?aݔs 09^O:|b*M258L_₎ D^5ˎ8_fH orw^G#8n4 _5]Lٌ;_6 rG=ƆeRH!8+$!31aN + =|}ˢNj 춵!㌅Yxc\ 6YS~R/:| 1w>a2ޓ|O_Ļm9<fs!#6UsoP`BČs74T%>MwAQG'7rwD,Mn9|b\Uw$H[(;xW*as{W(ju4*AE{EPgu2wSux(Aϩ'%eQ>xjönq3ǺqX&{/ōY,')e1,}ٟ3 _m994*OgA#{2äD6HS @ݬNx ݌S1Y4ŏg{2i3|5^i̻pϴ>#|K8|s̀(*\hL̈́.޻)QnLtצ y$QӑKz;^d5ranюijҜj&Fg0X`le:D8'R_endstream endobj 312 0 obj 9189 endobj 316 0 obj <> stream x]Y$7rs[o(tdÆ]c%5C\0=;w 2ɬꮚ5Х&8? w> {}ㅌ<(؅!XeEzSb#9Hiv o.J Ja٥4aJšj.7n}aewKB[?)iY$s88Tz"z q %hcOe7?}wi81Kb qA 39j;).CK]l"R$l |[Y\-*JiΩB;ؿH .th;wvfwoo?8o"(YrĴuf=vZ~I ^Xm"D>Op^!E4Q0 vg+~ V*l50"h=b 6vԝğ{7l矟-hWCzwEJcZpxbupቀ3o%>3A^ǽLx]@yeaD9 Ead"i * GΉx\}Z ς("&Ѹ^ I x,7 bx. cJ3+p.s8pN,@Q`d *?7GHo"y |>o ͓Ap߀?Dtڛ1 ;FA {Jc"'Y"7yAq7!+'RoyN!*Kon'3uH>5^m|~" @ОRPy4بhX:i aڃ_x;H__Y<5h̺tIP,)#*M]+2R()@S&OQDP28NgGQU4VGFAID{CyC؁% }N(UqMȑI3rF_VSk Q4om4gBxS/v WPd# F7l:B$f\hY"ȲV=jiC֤aW*{SSeѦv 7CnA?H jYHS*PEUSSSHsIZ󘸑zęS?Аh;t]P$Zhxes,c;ف;^&7%XU(0tĎi"[<;3b _LԶT9PY29d>)ZIgD9J5_hu}ogufe^bz9WMh?J䥵~DqBs8$ WV&U6eQ0{>c AY;WRN|H\[ȿ;#Z"ZPrz͈~уk)ΓKia`g'Ż=r8IxZ8OBuNV*  lPL!rMy?SkDɝ_PX|NgW}4S5g#e, m?xlKʅhQ~A"f 5.SiQEWu|۝3]VWţE6VT sq 1&GΪc7igRZ)yr L1JK6nvT/érҙ 3Q1A/$o?~*HesI;`HD"X'o)h<2>\~p2)s'Pu0BBO dѮUriUjZPC/^?ŵ L50̧uCI !d]P٨imR#X&=RZb/l PStoUap'A֬J<)ؘXưų_MQ~hjp71?M )umƉ hQ:Lc2"0H|gh^͈{;ʁBS RiTo-`ɋ/ 2|fbR%ga<SY=2T?FpA NS ԡudIz&A5/-7?3Y\HAr+C 35Nz\B#qEA%' @fKخJbQ g^|?[]e6uBu N; M ހy$BV9iSrlLB2OKEJR6 "&>fDoUؓe&PkICDK/8Am`]N=5y'ժ18Ȏ)cm&qyޥɠqP3obȃM@5\i1筝G,*IӒCX_ōCl?1uřؕlT y8I5ARyTx+kj26VU q"8m ,[:}|Bu@ 9m3%x%qG4Y/n{'F=9K_{&SښgS5(QGDi}C2!Pۋ7$vbt͆(EMeVpWL<$C%im%0詬ji4ZLX'>u0iߓg>7Xsͭ5.L(7ht&Y^Gz*=sJO(8a\U[zo/sX hEV XSg<ݶ)2߼TGOd}NרK\#B"ixѢ\VnW~5OUțRו~Hvʆ̖9( Y}ʜ+ez\ ][Pqb~" QfHG'.*l }& n BKFr:n&a !k֔;_Vov|SZ ާoFlcfWRu[.좭26i,A09Y*+$[Bؘw:JӲ8-ݐ+f h& &DF~ȍepV!hEG_8.AUSl)Yb9r m2Wl*[}Ye}RL r/@kS&@w25]W#Qpΰ{ݓ@C|R-FIz!l hu@#4ҝl(PKXfF ~Ke#Q!杏yGrjq@==ӛc -)&2QҔ)FD*OZ,f: ]@2/⍲fJac\xW|CORt@4e3Ctv_gVJܫn1*ӟgQfszWIJ3/ekS_)4 BeD=Zh9\~d=u|0df-,>lX-`S4JyELԬbrX^~J iH4فt"PD9xU.mROLK !3¢Z {1ȟt!.Ra!Uc]S# F=_aA\1A|_x= giq-☶j%`gY-ʆ^WQ~w+BEe}k rfѣ8^HNIe\)[ݨ}x}H~ rU6~iN4>׼w)ٸ Z)SC+#&Ozj_Qdh ?dF!\2+)vh=P,mtk 6IKDD9Tg8T=mV!c铔+*23΋tڪ51LƵ&@ȡf/qP4 Qe j$=Ldf} ._(RwwgGtuuz!ONʧx?V,q᫴ VGi18Is,#->-Aᳮ#* 2$?tfm*_(= B{Yo LQ;kQT뎛EB%ڪ+&5L+Uh㶆c 7ZeZV8D031>/iZ)Aw:0@rY[ OCM 3t\g6`yD/ q>v$%}MwL;DtTB"P~p%BKnˆRe2KMٲ SQ:Pxew'JǭN|~UD詠lY7¹nhЎX: ¦(3]PD4=MAIڏ :Dvb߼Trfk.H@}H+o:U7 t<3]FaQ/kڢ-4+'QݝsoFV7Dծ>[>:(i郊Hq`M|<oM{YS[#OOc uX2j6bk~W,mW3i *S ]~ *%!tƝ10]1Pmi[ʴxP@F(;$!2-ls8?z~/`mgkPcZ֫Eƺt! a>]\xTGU(`X ǗÍpPŔV ?9dʐ4jnGq0%fYJaIu_6DO% >nȀtr !;} ,'p[@9,4:BI"Sr 婽r%ΞUĒmQEbhF,j=/Kd7'*\Qe6wLΟ!Z /S{#JmzSF.40@063-~F6TؐCus"'_"뱳 W!BtV &d P͖>TXP‹)E6e0A4?( `FF" !D~'w~r)E}G~ Zb+S8weiV25 L+-5yE%y>E)oCPoQ7E Ag(/^"S1W3!Pb!~Va e3BU~yLQendstream endobj 317 0 obj 7000 endobj 321 0 obj <> stream x\IwD~5LK c&&oI T/hl2χ(֮J؄yzy屙<,$}^NO@ DH''olb5aFM)&'?n:p)Kf58^M ^96WֿǕSwq.Vh?Jp'O<|\K-g2=9䋟a'a&J*`(\o< ^|cek?d++8΄Æ$iI4S FO-8L۴ E hA$0%\{mj/KK nt:"U%lMRp<0d!g}'KSqL8 S=ዊ/E5~ZQ4mv_Mg",^5i?W_qXzLj Qt 'eF a?;eRs(kZ9S(Э9g\Mqi)Q煑ʦ45TJڼA ZPҘȑcR9~G 3(D9 5+ETI@ҌpVE]WRk?]q';09UPi7wzub".6/P50y"9.,,>[/yE(ha&#&K}}z d-=x{?^"hn {d˃yr"HK]i>Xf,^UO̚6g80|-,$@`B{ mkv52 MU?uy?p|YK[;=E$V?U~x8Fd_2E$>$}H%u_nDӶfː ]P^go 9!Rp7F"*KW]Wx? 3tU"+Oܽ_HkW70$#m o20֦Mqk۸kנE%ٕlMƅqb21U)?̨b r 2'M3d~ޤ [˳QV~oĢ^ &W9z s>^c.{Yϐvn C6!. a u~inp(5UZ<P|]35a!岳@\um!{:6_ ~#]ؒ 4|oEFcoܕ-!>\ZA,e]'uާĠh6QyL q 緷Z2t{)+dl0\4BEWZ3]c*i5gI`<< `Yn]FCu`EAL/|SdQ|i4f+m*\Lv@eYK♱w ݫ(r2ؤ"j Vk=\|\eA֊}0 0>w d!xGL$0+~n8d.:4taN:UA@%mNe㕟Xwf%9 9Y jDCyCY,pDOP.D_p]ίuBȊYvuBoV.`!Cw8WWHg˻%Ol.'lwSA)WL^lbhKIy[djIҶ]C YE}vβVY46IxH]2ߝ)u(\Q|{]M.SOG}Oh 5~I9ȧv hA\z܉Z999߶-wқ$E b1m-rwLs୧!0cpej$ ߍ=MNg\mlpgRd6yuoni>d|\+vG}owg3|]/i_+h1Z7ѪV0X? IlcE3>@V7 퓶{n<𥴭}f-Ng~N-& z|58h4ԛ{,tz?=/זA~* _[iՕPӺ2󽉺#u%a)E~9Hgܞ$͵}gQAbŕxbOhIƭ*T 8YZ݃{O'zےcv|ś?ʽrw~c-g;1/E\yǵ8e?Hh8lSUZEn0e:q}YE:ZPjݝW0@ j*mPTM;z;,Ni>مĿ>N*]2D׽_b~&ĵy/T73fapPjCf>ߞ)+yendstream endobj 322 0 obj 2555 endobj 326 0 obj <> stream x\Ks #Sa~Tr{-ۻdse[DKkUm~}`7[ӣii-Ԣ$+ĊO/∯N>U|_zu()VBƝ_Ypju|~zcaVkEym\V͜Rq| ]ˎqs=?(u֟m󿏿HEx7}|1xlupWЬr:ToY/^q8_5!T:_R'IW7 eMa-Z+|-=\adp;nq@PF9LAr#}!?Gm˱pH ) .}+yNo ک)rHdH!NS5/X&m : :,lbwZq/1Wг`d 45iDB9-x %Vle^:؀&B!6iQQ#zrG *q@z` P%fR+lQ(z<#y/(&vC (y;_cv[ Vf빀mbp¨@IAIp.a|. 3 9 )?:pҊ6TX+D[]G𚶚>2#u._;GBP{|.y^L(+}vm[z!s 8AP!QAݨ,8Zc[3R2 *Olgݒ4L0elnO#>>7Z*\vy/S;ivl)Y!o1NNJMEU{%= Hމ$DJ%,~2T hQLdD4סQ'MG4u;JvmԈ]ffBfG T)҂0w=Vy`wț-}J,yk٣Pp "RȖ㻦5yϻ'E߯ *>|o±o5@5-KLHWbǷ aN-xb$k@cX rpiZA %gv+Q`8U` ޘ%yRA*\Z?t/J8R|)Hϊj= Dr1TBsdw5wjq]tzɻ_>O~MI6pP_=}8N*H\{QH"̐*X0\ee ChNgC}s ~*C/Ehqj1*u@^nFw7h@4XFy`Mk\ħӰ "h;yC0hC@O|G[2 @շ2d΍ *~;ሹzhY|uKR͸#$3nyM|AiK.F m&-窈#"i}$!20I-v 1}o?NDeӠ@/}3CX=#H^LM{&F.f}a'{Y`optRJ±ΐ9A>u2Թ%&e-s֐zrq&ٞ}Rl-#[Y3) eEX\NPgᠻm{N3MiӨPB(Hw $KWT# ,au^I&YҝO8I]Bd@\2u,7 yK;]Lͅx9^9|N}ceOl>['}]GөHw>R3\ӣ ycP^Tзtbmd01(A) JT<(XS5S~,4BpOB3nYh |.;w~qWG´xSfkeV8911t@C{ck Sv4Ϲ75G@+o"&a{_L0; : `۷MȮҌ}[8X )Tn'@֬=wg.َwZN-奀vq-t~-}H&,@XI-Sh W'qiQ }"h7Ojܣa6-F4fkX* ӫ4RޛWXLVX`rmˆ0{9WJ?xġ6J %)lhZAz 'D8ZcXe1bSM6Px˺n#IN bw37~o\E+1%LgNoQ90.]/-c3 Q[v:UFk$ZU îqRpXZƓ!ƞnm (*4SAرolDjɂȈ?bFaZl#R;c;g#fyj!^G,[LtnG=(<m#EZ0<[İI*:MVT@(/t錳t:}Q!WK2)d!خ`x1ѣo\m^c]T:D;0 bOE-]F^g?ӭKs3\aW@ [X]oh iHP{dt1#<\B/zgSaJ%^LxkhNQ4;4!}:j\R\.ڙ]-3PG4 йacV`*ò6Cǎ N?XoG8] HJ/TG*@ʟL:doGBô7 еa]}DGG;endstream endobj 327 0 obj 3136 endobj 331 0 obj <> stream x]K/9p.YoC&V+{7_nrYM6pcVM?HTO˫ߟY\;ha!W>˿2]JG+e09@{tttZx2݋uz`K`<:`p0 SLI+fqR ̺+{UJ:aeIoR:61"q`g?iAih;z4cArLxgv- 31ݰ;(M1\1vALײ s1 b8c۬àU= PQٍWQhr3fLē|V9/ieUlt.%.F59)4̓Oul4i5kӦeEk"X۹|GE8}l/]ae}t2d*,}1%Ll}ۧI /MslBr~x3aa>g YӭYW T\!Hyp;n^ePo05c ΝgoO`;9lc DSa&J ʼA^FE)6[˵+yЅzYD@]iK9eW <`1FCхiD}(bkGHy||H*QC@:Al|:0(i]EGw z(Q]/Zo}LKU%5kccȶ}Gzbr2*9zoy0=T@'=% xR!˫QrC}gN2 ƦrS?B`K (u~!jb}v^)¥ H4Z2P"li%t(ʁ [k}C -R/!;(A)C3;8c\2fڻ ZZIIIᒆI?TK4)p?N6ub`9_ ~}&9ND_48TTyvX`vM2 h9ȍcUb8* 7SkH\a@Ң DHH !TN8!14䩻w=CGJ:ߚԳ%FxHz|SLrC\$qJŬ]A Ѳ\G:Vp&N)) @c'(73:);qQPBk//@t=UFb&cIk*+V,s*; u|'Z$J`pCQAVfS_h%q5gR=0Nv1n.Idϊ8sIblxgۍX:r:J]/9i YT:MkSfK<4T8ja6Ď8A䃈|F@inSCtm^ $u 3vz@䅲%b©"Z5K 'Lq|!ZǷYh4Ubz8?C|D?P sЯE3?@ɜ]3B,@4ϙ0,^>L[KK ; D(vnꁁ8nҹyٌ@cHb%KcU|u-<)RJd~T>0QجbLפ\6 >~%~枤8F6r 9N<w)rjz(1R,UTRkb>jza]f2NyZM@iboZ2w#ٝudjg?O iL_Xߋ`z?nnB/eE{~:R7D쯝7m*n(m=.zj Fܑ7A'y\/ =KԜbd9TzH%YǓlDiG)j]sֺqU;!P􀨧ӴmWOpmtCt \?p^V~H0V2 E+fӎaF`Rx{Gj/Ḣٓ@96s1aINj3m,iwa |yf꥓ϰFr*zxWo {HF}P dȽw@4x4uB9Fs+^󟬉rk" #3{$n,!EФFѴ kjFO$i74Mb cYԤF:|VhB?:_9"kQ1> stream xXݏ7#+{C:$Zzx>@.Uۻw pU!d

4FOXL43~lŲy8GY))%7).j+EkI:=*Tkax I9v,72eYU1=֣;uWK9RN.` {jm&p-O 7"Zp\K?YBjWm홼I<[F^D f\2bлge Kx>\qAs0Bb."Usܓl )d oı.B%v`/.¡'0R:x  D:LҰ3"OJLy8nc^9 KDC>e1Z;ƨ+؏+RuM+2-wrJDB$BDdE^lWfq&ٔsQn@Պh!30԰nNJ갥~ՊjZPvR{'Uyk>5_Wc_bpFL3K)6 9j FЗ8~>R#PLN:V]z쾩nΟ9iN(HbLK,-Z_˾C4:eltIv[*YRr<oZWSj:<{ozfz嫦.&Z&ΰ BhkV2r {z[WqU]]`5GACe9FPxYNl^-NaDr Rhx(\LjY6Iarl&o H+9y& ,t ol+sT aE*oN<hF|^;0Fqp r}_$>nI-!yw{ހV5 0JSԈ12g?9endstream endobj 337 0 obj 1033 endobj 341 0 obj <> stream x\Ks+,L ޏd'N%e'N*(T(Y3> `fAh4uc:<'}폮nG?=GG_Sţ< n&cG?I;%MؽgaTjwPJ r~FY<齎9{L>x8vtG;!ڝc^HJWhAFi1i""0*;hC"+`i30olETj>m,jXEWB;ow:^;Gwi e3жT4:Oov^& vRV_N;ɰH {(8|w99#r pN%~f6 &փWV|vGI k 8|J$y8rKGA<Y}*'+ Ìavm}sP7 QVľBb6I8n $aM&a8†S d%}L]ڈ3s&)H-m)91fo[ZЫVY EK0^=lSfYm,ڀ0"0b"Yg~+3af7l9BF0=T<'a>b>eRJXq"%J\sJ+q c4/#X`ak&dwAtߦoY_ Ib,P< :G o\k6-)~ae$ހM?q$|dJT3/Xi Nᵯ_pD!B#%vS Xn([TlJF|5?h,4atb\)t Bڈ-č[65IqҬ̆JQRZ 't6+ r^Xtec-&'_Uӛ~U9I`sF7 TjYa_`LAhp#N xC:f5I,gcd3l'y$m^Lv8c} 3&ШFB7蜆 ˕qa ;:ځ1z7lqUxI,xnw(N=3jeu۰a Q>P"$/#:̤/tQ;HA@-2,VwF) + ׂG\.EJKR)Nux>Kj*\cFYPXFcERFV/&kaV686p0ؒI&ψ qB9>)Tu/E0AI7@^CgpQ2@isYL?_hix<]gnM?{ӷ(-Q=ڦjinP Q]]xŽcX* *,} nk(£%}Y[?mC~3Ƀ1aJk~!u&$8 v~Y,;VzjY@ E&wj6r;@ϩə0%4{<,a.Ulw-䝺EQB " -qZ\>v֐{Bݓ.Do\^USB)rG-P]Fu0y*U`6.3vq"ˎMY(hl qZ ȷ#İMVfDtɈzRp.li=7@9vn ƨ3)?c-ѡإLd# M>8(kۂLF8Ln8H}*(RYICUN7A7F"k .)6"sg]w"f9J)x>/K&lEp ma x|6;揿+fbb1{P^V6YfzcMAOVd:hfjMްǪA9ڷe |݁z8ّ2?lx g@BgEzjxB:zTe3uG;a+ȗe*=x`Ϟm*6Y>NJ1y3qB\peJj.|g. [m U-M+S0j?\b)/bSv ;K# هƯhJ8%K7*9}ۏ0 nCqBkHs?oG5>ekA+/6eG6MvX/q¨6 ]FX e~A58\5}L-°ۿA{(Kh$јVVfBn|bAE@£nPRTif24eMk-}._193Ƹ]ߡ!o AסOX;c#R a_qS-?ߥ,6˛,| Ę=t{˔UW5ҥ4D2 TOӡzi`>-`2z^Uӛ)CҦs[cS'SEVb@qn-tFgiq)\g? ?)x! `U"v:5@UA[ :"gnʦMrRL-u[׆ڨG y,]sK:}uM68j:H,Ҷ}́\9gl/"Anhzix ]SNҵWl̝L}71[ݲK[# WPHp ָc3ς̕OInݿv?1 M.U1Z>6E>'iaȊ> U*ox N Rwa:BQpA O0{Hd9>M޵`:nF)F/m;U6 K+XΐKkuo#[|vWsʴ?N9s'FHٞA'g趩`Q)'bssNӵÍvVB[b%1;:$ϡvmK%b6O~ƀ! 5Ҕrb ;D؅ ̈X~v YENl_, 11Ĵg&aԂp/8UmOb?99RrBv/zH䟖U&FyщQ:5|!>endstream endobj 342 0 obj 5250 endobj 346 0 obj <> stream xrJU~ռ])IQdrdS"!  (ʿ{fvgE|r ~O=<:DLO?OyU{ç _+9(lmDr1y '<`N/OTnnznSgjnkr[lwm޿1Ѽ?Z,7 Қ -'t?~: %Эp%M ,0U"x5"w߬v:bPo":<,X/˓P?{p\=z*MVzh[d@Ilr3owڼw{ZoҜϯ7Gw!oNKGϟBFZ*c}2tz(ʂ ~\}nrj$6rƮ}!ew9E~ŀZNLѤ%zճ:JwjkqZ|oAeG09W}pV;(TTzE'T9 WS_ m@yqnEz)1pr$[ۭ Gs0y^9S'8xּmэ^$mԞfq9_wFY>EbY-\bCn9:oUX=nz|?WHVO!>Cbiq(% 9(WRY3k7bRj+lu J|uj"BhfV(MJLz;8qPp+ej0Z8ZE;Kdp`Jr݀::|tmz y tE[{2Y}AHHUN-=u\\|VYzRuny|@j#0UK` X%/jʦtdT0Lu+{!PT ]_*K*Z j[k\uJ!;7aY3ܓӗ02Uh9z>ṙ=CiD,'}_g5='1>u7zySUz6㹺ב"L<3 D7T`-)-j]b }bjp>>/:VNI0㐏@c5GSWV=I 6hHjLvh4ء5(ު7RʨCeA14Qՠ dj[{Kw-bSђAӊ, `9 RJ[N+vQ$9k @)k<m@VuP,3ĴBd5$q캃`Vn-eB 1e7l*m ƱZ pH0GTPϠևZ1[Y@:[2XѲ\&+/[ }ޅtE@@( 10d0s<eb 6gzMґ;@0]CjaBtYw\ g06 ?`Fz1֬1bAGPN\BZ > ~ڪUT8$.t8 $Z;N//YURs PMFDJ>k mc#!s}V8J 182Bͫ ң&(1`M v)hn 9MBUҵܰ{˴ Xo!Cql [wYe;jL (KB)4"Kl N0>iҚZ/aRAjwTbϷ*QD!zMx8)^pviO#fYI TP$5ڍq;2 Y@pAIB>}( 'TV#c:0B:QwkG /E7x Br1ܢאGNG0Y@!#GUMNJh3 ÈCvhB jǫܟ;M;cT7lP43BׂT| :v(;kHvfH')s7sKwq@\f^P@ߟzlY_T1NNV5\q(qY,5/pb վbh@8Ԫs{t6؟ߒc7OԡvbՖL1dEw k4"8 =:iW?1H>d7\qcx2+#lF*9_ZphuMdŀɻkLX?E$ڤAX똨oH}g&@UtXZhL+wS}PɚS* "NTUNŽFce׍XK;U]3I/8e-LJ08,}lF Xڎ4".蘛pS !b.v>@pIz 8-X9Mml_;>Ł xɽiʐ2d }y;8 g(C HX° ' '͢eh ?Ih hBˠf04% a#Q)߶8qw/Xo6t1hm]c?%ʐyh'fOUWQ?m1K)rοmyqI↟8݀7U=  b4@ƩmCBCj `6;qIyv|svB\['ݰm! US$|7W$,nC)E7ɉ^{53kx~̺44D > stream x\Ys7v~k~k^Ҵ6e5JhC1 S)Ze%R()J*=`\h9*rp,_}r?:goQ?79t3zX9s+O_}Z|<8d ;=?`*?fmsbhgRq;݇{+41Pe|z*i@8!bg|s-jJ3dYb^  0@Y+Ux6ntEe`˴RXBcrz%ѲtS_t'`zfWgxutt:98{C{lvjrF{O)w𾑮bO$aP '0 -16s^>7~;8htLݻnhې? ai 1Onɘϖ YM-\\㳆g5~IzxqjNO}YpWpWyyq#Ng3f?ytlg7i0U~_N#4(3MlzyrO9g3=Z/vӣ:g^㣳{/2tggG! .?`HɃ3`{ s~vSVooábN[]V-|l<R27op/'dy1+ ܲ&$ؗ; ̊Sd}XNS@IOFկ*vJHpR J!05Z\ڌT*WdU\qµ X CP`9}e1)bf ;R{֩a,g ϋM}qeO`Yа %>K X,Wx<(qZ.Xb|O3.­JX \D#J"xC+:pjD IH (@X7h*zy;ߋ)^{Ah_Lt`/e83 Bv"wɁWB\2JO|ie75Pz&hߗǛbum`\,\J4x<7-Vs%UZ,;HĵG%ɔZ"V\4Ff2x%Wy.@ak`oAhxBڀKJվ&h }]mj0D}GhP~S WPR4@ߝqKt%.|tetq4CQ  /Q T*ul>'v/@Tg>~ r?N虃oKnG4/p[< 4A#Xyޕy#_MeȖF %66!PPP ѦO 7Ľ]m*G{&">o,4?=NJh.ri1J}6*O5f`}nGY&=rr%a0m'D+%H/-eMvcЛl t""<ou|R%5GPEB:KU Wi A Z±+[ n^Na\rr!@`KD 4|x*u Ҩx(QkD`e븄fz ZV q3{Ⱥ (ž:G7G& q[NbU<  xiJ/h"@: dOpz-9HJB&JDI+k #C^V#]$HeI1B Fz!H(-4"G*%9SONaKG J4h40!QzF/D)VӋYzuhkVA1 g<tJ̉&ScwpT߾bK1z]hbbj,\ jD4MOD2YM(A0YŖg q`Ә,)fQ&4Sr%OY<^OlT`peņI9j/,Bۼov(\c]eq5;n_6wް/z;ގ1D+0Ȳa<W;$2KطK)Osٜ=(nbTGe: *nWaՈvb]Nq@ ]< ./6d/M4NLͬ9" '!~GGQʵtqCUw/'kQE8>]m37-Wa"Cip ѡSH.u@lrU)5G^B_1aqjփMF=˘Rȱj'sVHvؚ !cIµN'VO7'h#;폼zU{9\i'qY<)ĊZ1T!)c X@FX&,X]K ZLt'˰|pY@'A3R1 oN ,i"pFM-:9ɚ te!WHmR$Z2p)k}e &N/Tt`Ȃ|A$o^)ɛ_༴ =8{u8V^5ZkJblz ִԀ*!p5w.Աno5z8Es3>R548eڥ+PzP5ԌTPQ˺j|sC0IZ^ś7&S. TaEKdጭ"PZO%2$v)ԣ-IFi'fsom].n ٌlZ1d>cg/ Vcۅ @5 # 0 N{*qD`'Lj[G '}T-g(Vr.bne)8%xBCu)dNl.;IfC<.fk̠syˡ.SYXM"H$QE切!^JKM*PnbUmQ ,!*FSqg%>Nn~<!yKuLY|h ^(ٶdX +vdOh DH*2-WF%r#[WpVx2 Xu`΃BDl %#5N (3g80+r%/ߦW?؛QңqkCxN~W7%[##; BtʹWx&[J"%5(,3JΥ,eځ % = B>LRg's0JRz-uotvk!NPTX/*h9 0B-u8!#|//%[#l_hMgx#-ϓ|1tP);i+;=b%mYZ-ՆTvBqI6M ~k8:$&<ؾTVK0A Kb(:/HObIGO_6 eޡ^m; c>c(3NHežlK΀g>k[+Gebјjp zD> qJrpN64E6fXF-/anZI} "}('<>pêW6^p|Q]r $wQߖގEFˬtgw,;KZI)qG1e|x=obXBzЪ$jKN0Wn)*#_[ǁ@f HS&4ҟxdFe89\jaeQtHq!Տ*;qRqCáu*x?ud7*q6fU&ƾ 4TlڥwLqڈw.pl&@$$ @Ǘ#F6[QP͝1fR ^- U|Kǝo}:2$ybr"Tz3K La3X-ŠS Y: ^4iBK]reDIF,e͢u7UKbmZt& o(eJí}TKՆQ`3kM`r9)eW|rD~.AIN[wòY>GI֯ 2w!Q9Qg}?af_hNYZŻZ`(Cr$r*skb<cG`:ݠoZf\b]{Gc|Pw>{/۴$앪%Nױ'#?qZMDRLFgpPB]G$~fڋ.qzb>vs"ܘ- mm?y|^ƑU:,|={K9dendstream endobj 354 0 obj 5406 endobj 358 0 obj <> stream x[[o~W#RcX/) +VDHDAqtZ]IwJ؀Ep.pZM?>ڮ|-~J?V/`+{#Zm7s3Vʞ[:~d/<͚JJ|f-6z*i] jD1{||c);+,3k&]"29%dn:xF}3Qu)jIQ <8d.vRvMOVG05ؘ S*ɳ%z-vO%>z TwQ hقIm1>9Gu\]4e#ޏϘK$H=Lˉq9r\xܰD$51v\ zaװm&y03ZnAs="M<g<,HĩEuS)qnPtsK=™D>`3@`/!ĹBň9/Hs.SȏbBL:Mӎ=Z-Ǚ7o֨O^O7\?YoÂʛRڧ%4=):u5T-uE%*_g H$;^9(1cNkB 9v-_ȣOXHZk"_@a&# \FA̝vO|μ +pOjïA,j$?h}2U3"쨻Jd(ؚHdmjBHj`0 `a(o1ςa8}p4S{ HkXʡp[{eE hDH+!F x bm)@r,"^_NpvF`$6A#sEi5"*Vf =[$?'75'h۵74@LAځӴKlYVƧh t^1`"bC s :♳! a C4iȹu@}[0ֈ:F=a.9S`JR* a?ӱVr<ҠGP&0[aeޮ5؈A[Ԉq7]| +oA#ߢ1̍&Q3Bei8M \%(ؠt"J s VK* 6" <@aE %/yE2?D(hgI9zKdv3/Gxe|wRE S˘e#gZ2RV.Zn:DP(`;W c+@<srp\>,đLG<[]od \.)M%i(?!D.]!8-wǧPeXiMBvs{9rs gŅGC"zvrlOa@7GDZmbn`Qaݽ/v?W! ˋO{@&v}hvA_ٽݝ/v_v=>^&8?D?p^@h+!tN>=XF+LC/;,\@04B p)84(<#>ABCՄ,@2$ C1A[L(.kb&-h* Vfa!y,]6rwr, 1)-`D;`=!4)ɡњkʨ6 uX仉ix;̓E)}7I˞fnFm1Ѵ7lOS(g Be禧݈!_nix?jqx%˼s, ʔb6 4% "olE}y ހP 8>X0V ^~ag5{< nؐΊk^ⵍLZ5 y e/vtj"-/TY; irBNunq9CxMAhbu܃CqO(y1i\4YhSw,xc*E  ֨Rn,=l:g' -SO2a)jvmceie'Ěw%{͢~"|Plҳ_D A(aI|+oX. ɴ/ɠXBf3*)} Q$>aSl/e i -\ sǂ:"ݘJvjjQ`?4՟ya,5HNw/sFzbżkDN4=v54  Z2Oa%PI@y056(r<`/!F#.g}vqy@M3`aeJHpM[ 3e֗nߨMYk!hD܊23 M"^R.[tEG#R=$xkaHDɞs;dNgA65*,r)Gʺy蚡 D\0i;bya);4W-= y->uYC`Y;H3Z(u*ᣑW,{ r3"<g?pvDb-k k{8Л7D(({D!M%2~f!7IFf_*zĀ:ve[C0Kj24_EDdkI]0bF?DsHꗝ(mGmڧ46Tׅiu}obw{7"4jS]q;XFǯkq9zAZ>-Z[ Be^1,bR= 'ddA 3tfI!2/2HYYWcmI`YD{27NxM ʷG'N3?tm­]} ^3 D3}l}VU(aqSDV9Z3*U0IbkOJ. E*ph5.kސC07{,0k`߂㯅K[Ĵrp7嫭~Hendstream endobj 359 0 obj 3890 endobj 363 0 obj <> stream x]IsGr#῀Ӄ}Hj1mJGX>PI'+k׏,ԫ%3˵=f?fgo=~q}Ď_z={{ :H$gϏ/3X gowwMJ(n xivs'mwqbp{w0J{E:g:;Tҝ?6[ᤑw$X!]wuvx=sVsX07>fcW{Ř= /K[Xi'OZXrr*?Zf8]f\.£fv^%wr')q_&)w힟'  Z8=1SYA x/j2la;jx;QRxJ3;wåܽ$9??;;,g*w4`[l炉8TGZ+IK=])@VK9)}Z$>oY}>s˫ ;m&$7X^MxWi8Xʄ-lA{ޟQ>)+xg $NI {#Ƽ2\ Aq'20o:47`GV.-O'/dyx:;} Xcؼqرbz-S://#a8H11dJ(3P'P"ݯù=K_]\>f ipxza"/zdOk'lh qʞSq<.ϻLߔH5R$)2d=7(di&0hZL% {ѳKCEy\~ ;8"2Hso.;o,qVGE @rB:oqdaKtx_vಋY9OcK &iYYؖ8"1=K?<,| R`szLGF^Ax^G"`[5~țe>d,H Wj˭>B"GȲ*|#m1`ٟ3y~[Q R=.2Q9wgYp{73W좐:H,(^y58.<-h@O~0#T5d2J\z"=6 ]n( [<f^xKčhIt~u[/8= ݓc\v?/lcU= O/-¼]A\@:>?$)>ɏ ,=jMͪs^*pn J'NkQ^;}_QȢMGe9ѐH!F\UXyVTC E{|to TN9Ơ{z_~[7 6C#[3Dg4>N޻3|ȌZCwb6G&[$ގ qݫ~H419I)?T Qmc) \qCR!'kf&pAꗀ>6J J 'dFxÜWI?T8+XR**[~D)PJ.o֕cC"-W#xG˯ l_n 2B}<:JV7t] z*$%9L4]pٗZNF/Z3:ÈZ3 w=5vGyD/QDLO:k%]$7:KDTW_ǓԦ:IppwE%L*C{uZQgbZ`DHjKػG `0HzL¹IZ[SAۂ4@vSwd6+f c'J{Vpg)k7KUwi*|&pvzx5F=BZ"2;(o4v_5L\167gpCJٟ$6JqN6E62EOo 6^i :|2 o$Gu ~o '; G3PDD3~ȽhnEL yM [ƹC]*StCQc}9qb=L{f_fyzBՊx]0OMTN^A1+rBLm9̈́ (SRΞأot`c-GMit7700䵉0oX +PW2bj:pi4'x;HiO O;nhh)LGTVza-UpT= 'h0CSyL7T5xU@ 畖$ ;:n` b2tGE[=jG0e[f(g>1Syrtlt:T pOxrOtuHfK~$~Inq4Xڑ,-Ob;/Dw@y@ b)G_/v ~GCO16| =f@Lߖ̀M/˽uʭCa=p\Dm}#lT|5"Mn]sҼe1>'m.Aq0?eԶST*Pz^Ia HP ?gme]ޏ[Ќ@v3[K ˘&ɏì?έe fs<4ڵ9l;-P9&JJHMSUu8{I"dG-ee&k$ b ~.],i3*Ma; [å@bau(XrAfs1U(BiK7}'CgNyys&XV݊6Ƽ %`XѭE\Yo)LU/O8pD pz\$Dr~2Gy6Ϋ4鄴m&k{+xƠbѕyه9 Ώ՞hF S3>Z&3Rjve$ Z`W߅[)Ķ}ڬOuw"z}qYѱƕYF<=tA󕷪Xxqi*žbKEL we뱢/ٹQr)pQeoWG[ܓ94I\CiD|)~f'YBc3 7ͧ*PaţqFl({I1̪wS1:Ae!,tN7q\҆=xI\m⟄㾋 W);h<~[Ѩ>z77+qD k3rP0!:~C0h'i%]g\[W9viŦJ~ NdЩm^UF~9t6EwvRV>NS7eхG%T+UQB5Y/hyS SA!\Uf*EJb"#endstream endobj 364 0 obj 6711 endobj 368 0 obj <> stream x[Yo~G,d 5QGR Lȃ$1ecz{m0͞ǿ-Yϗ M?wBL/?/y{× +<_(loİr؅-xL?ΗOTn逆nvy3=z ˽rwjK `Ggm!xyqj]w藣77*z~0.?.?Ao~>5Gq (8{uqzszpvzwO~O{ȗԻ/_ow쯾_k* wF4:*ȥܬ=r>\ 3bȆ;'痟$JM7ϳ9//va&៶?^)Tҏ qˇ\zjuaM/Z*e>4w-Kݻ&*}emsw`)1l6s`葆i}WؼKFt*nJ,&.2T*,3%q;&tLvo Ōp{нP9%oO<+t-VPkJ;gG0)@q:޽ 4| ltݗhyfx*_?p>/$]i;ψbgx" =9Q<UyW6%.>cb0 IJgly<&RhD) LZ`.?+ aH$ڠBTGu$<I׎Id%7VL8O-WLZ l=TԊ*hR`Hd4{%f YPz (0턩)̛Na`Ck1J9 Sz8s-_V>ю{T ]]-=a2Ȥ5`ԶG|1&*P]Zpbze,1[[ȁt'eАʹP6Nφx!NC@TR"^wQ!-Hp 5*R%}#Sj3S bRiQc'Q);1@R˸ B^{*n4ҩ\>#{H&:+B /x71<ӄ =(bmbx P$* 3PVkKPVFjzy XMdnI bK\t>Bi(- %IEgw+x Q͔(hdv=SW'H@ Ƅ~Bi⛊/Mg@UMdz mr ' Ihf[l۠p^n⅊)z5a\1lF}˯C3ת 4h؏]zp?#; 7o$Pdm2Pe}Yk$O^(-THlą[f88 ']e?F)_;^=4Y89&)$b&~}ܠI$ǟ)]!H<$E<>5KcPv#!_q﹂xHt͙ǫ7 _ wYkSBp˼VX'|+PJ7ݱs2kRĕp"yz/%6wѲD݀,D>OvsE$_+=ݪ{)jf@)9'1p$APJUW ' ;7 XQC>YނXfjr /̈-v+tP}:p=g2Nlڕ}6Q/7+|ECxVɅ>HekdW *8YC*^Qh*_7rG5/_M ASZaĆ7Zi~6aXP@-FZG'aR`|;&1՞oqŸ]5pП*%y@(BReo:׻+(YlދA'u:'W=y4E,Cmn2ɽ74ՃF-ov/PAnbc}74l2ٙ|!'ߙq/0[-ñ\#@endstream endobj 369 0 obj 3387 endobj 373 0 obj <> stream xZ[o~ /ڜ-HHah#AR|Adٖd7$wwCVP9773ܷ;1˝W'=='oOdwj6SbvNٳ|R;lݝ:it/f4azCkaTZFJ5L?K5rY^z?LtQVMY^X~C?{ή:3$ ;ef$LvΞlETj =DTvDMMFzn䬞9;j_DZ:#~r"؈^MwIe3Ys#vI JTΓttq #(Ⴉ&{8LS߽DP{;ӏYbnPahEtY|$C,*ܜnzN\6*,-#%(cۙ-**f)_k!3o - bM`nO.mPM/h vLlwJ1E$VΆ, $}vRDF!H2A6@O-!])GbTzᎸd +`qWr2 Cfm=..Y?!CY{Z[ 9-cz{ +d1htň\I(m,H/9 "  Hb Ֆtά"ʏ^fAUYGӲvzް$.YJ[ SVE |fl'#yCR*&#YvJ%- & GT\CN$p)`d%Mr{ʘhXa4ĝz꧌ .z憺(f>.vطY[c2yz5 LYYF'Hrvs*):P&K9Ȋ9 +Rˠ{#cҳIT^OGSM@k- r#Z c[p>U 7hˏ۸ݶ|.u$}yUNH EZ;esv32"j&ED0}L@&_7F]:`x =CX?d\Gi~hs :sӨ_2o*eT%(EV&Z1][$fЖ<>ƽDbÆ>_?fzܧL_-5>/9dQ9 -ñ֋DJaw\ƃ03hi=h#nD7RGDZi4fP 0Ҽ޼QƸVIpud {r"n3wtl[~}tB7p-R+V7KBjuxOz4C)q7 o|U2i|dr A.\>9zo2vx,Pyi5_o`sYt A.y7  Z鯉V1p9^o|MYZ1%]mk&a8A8(t\K᫖0wQUviG8c@D Їy$6e *Q57Os$y@-y㽹d߈pi֑Uks|iGV$$z6[5sOق=}? @D2@mVɜoBJKO?lXv_ԝ+j ͆_'XO\u>pX`iKǘP!8elxoV]AAoAGhM=UFkUѠB#K{EÙugFʪC\Y8q>@ A-AFRyAGo=uӓH:S8#xT%3hKq~PZt!V;Uwgk nˣlhbkhg}šو|4 9`7cjѯݱǥ==Ts%_\j 4&pMHhMz[ïً֤|;+ڿ1 Χh|jICǞOnWs#}1md>X֤WQyɤV#۳W RvձwiV"XԕsaJ(#=,ӋUǤ1|SU P>4߃$̦h+\Qev| cl_tB)>ȠeŻt#pa=*795Ai:}Jm逿oV"n[~ͬQ61UMi߲,[,>zkKC襱eSއ}QuА,+dS7o7pӶ) `C؇WGcF>;20(`L8:6#ܱ;œz5 )֛#ߍ3yM:B448Jפ =t _)&skC/]jR=J;&_ڇeGJ`hqc0 4=Z~a,9EPo?-mxendstream endobj 374 0 obj 3252 endobj 378 0 obj <> stream xZY7~_E_i| (2IE{eYvaCv!SSU_錸?ӽ[zvrGf'{oq::_43[Ŕ-_텝tF =|<{9Rw/*úU^S=/H%tcdyyN?XIChwg X~oax 4޳< 6[6;/e=;vK- \ڭ9_A"xy Bp858 :]ʁ_FX^Ѡ(K,DJL)HZuw*V1lIY})>M-+F$(VȻ 'Q [̌/c`mg(GSfXHeNuСpd{˯%+{;n\aNxڜn#: p \18д,Ԗ/!s"pJm ?[ F7?yfpa LTrNIԜi *3=W鍱-]&]M,p]PlHtB! cDuMAZڗV J3A(oi)O}weЂ=8l@dnx2׵HwcYV 3 w9`ٿ F`3¹|̿ǭ!oK{_‘GԩӫxwIsOkCjJZH {d\4!w!7U&< #(#GԢZY@6@J+Ihωhp`a=$Z΂>;va=-*j+|Dy֥#h)0fqЅ1TI@L|߈8Q\Ę$R&A I#}Hx!#hqC̹|5* -M`9Λ>»\g*D3@"v&~'Nþp-E@eu﬽Ptz7hr(F(?/Ao2$mb^@UWτP7_0n BKlR4uy7a<:iĆSX- 2 Wi N}mRוJQ;-'qSK]E:1ꀝnw,Nнbny?>$Kh/5LY:,eUqz4Oϫ5!-D~PZ{ȭ{B{I"xw?8.ci'At\rsYYʏ5mH.tc9ɠkU !j]t`)Z3^^> P8 dXnfNL7,xj_>Fͧ24wi?LKe.3Q^G >/f_3MH{m}mЙ?hH)4  fSܨz…8HRiE}EgN*y[8Wݦ]`YFTh! w \}Κݮ0UL}m%XbjVTZ\*?V?~E] j]\P)/( WTkCϦxOfd9jǍUgsBt_g^dE%&F+/̯2/:>3\aa;t@! ZC')\lEIm LL b^_1 thӵq= >L!hXZ&na`2TX#tisMQI bgWGqd&)7`j1@4e"Bhnkbh2׽V*5~̶#˘blIyP%zCv aw҂Ldr"ũ^Xl)h_(hU!q5 `ɗXTs= D[0sapjՐ*y\Ds {FC'ǵE@!gjVhK3|iZ jǩ֠Tve DoA)^'@t k+]jcds?EP690rni ƦeyIZE?NeyLMj3xZB%j;> stream xXKo0 W2zX۰b0 X[;EҴi?XvlC/H~| )#a)k/dd=x,_5 QB4Պ+IҥWH2xBCe ڻO'h(~fD22Ph0{6*o= @ T%ܿ`uB!sg&cͰ4dqIP3ofQaN/ף)5*1z b'b. ,Rr&JK1 U{'E/d@NzX 8Ј*!K"rt 6"տJP*4h10'!. џ&`#bqbv[3 AbY+IӃbl5srz篔th94CakF]Dx,C3Rsi-Tܸ^Zl'ZaQLL0mlʵڻF0jScmRhU/F6VvOc_goE.l_Niؖ?WBc^I9ؙtH;@Gqcw_TNwz =lj=mV48G[8ݏ_]k` i@ԫllϛ"A)OVMЂcB* MD“H!b}]-3f>:endstream endobj 384 0 obj 684 endobj 388 0 obj <> stream xU1 @ =uL.wI&N;PAɗfbL4|j8v{ ah E_)qEtZQ.FCrLCfGy6c$UOCǿqBז7C%!endstream endobj 389 0 obj 134 endobj 393 0 obj <> stream x]Y%5v/7tkMk_03AL0e4n-tY&Pٺ_JGgӑt y?}^]ódP| :XSpU~S[b=uG*M Z?ޢorԅFwP_NEcC*cKh R&tu?cJRKT^r6<~(2j8MDRB F胲KVgAD|[bx#RwQEeu46NQ+z4-dnOi;.ك $67,"3[ $jl",oe ЉߥbLеU|R_tI"4;hӣ^dt(6n4Ty}Ҹw;7%N(j)ʃrSk%M3N+ZL>HB9biSV!g7jök-9,@Y,"x&(FX{;N@-bmJ|kCE8QӼ![&Fג/2dYU!]ϘH0Iө̙:ÏoV=6 >Lz%J ]fLIz'EڰK,={:$,qf+I(@w:@}Va9 [Vͻ ©l4?"_ϯԍ$ŅeNSx*f//kK ļ9~mU"i/Ek՝MD+;S. %Bw?ss۫aLaz WƕAM0g( @5JS!ZP2O0y wܚZ3&XM+e>CH[鴥c˨7,6fp`L0U|jrM/jȅR26(xO ^l`ns-`V/>[ .'$$4$ a}ѵI C8cD" 2KmԂ zSa\ jO&Iřwv:(g9.a9bR+;D/W@~#6ޡlpjb 8F^KX'=}JQc?w;ÁKy: m{T7ȍċ3ENm%KVx55Sᓏuh9w gIA34~;YAx}`w, a$ ӢIAbrǵ1fke/fr.]MƩ2Zr#ߒj܎;aZiDR.e煸bLJkJ_hi qq{f]5O:I?5XdC=AY@4n˝jzwjpt8`|p>?^ī^ﮤ wPyWҐ[7W~'j0h㯯or!ѓԕCڗA] r}p6:nKO<7-1Xϯ{`6Z +=WԩZ"'ޤZ C[o$C o[b-(D8pE[ G^rT-(iߓjI/C6\Do%iՕ6@CjPD;Se̢|2xOtG"1KIGsT PPUgB=Cm[Y BY0A)ACsVqYfZX=G5Z( >`z}3ս>$>`G}h76G UPz*wB=C9R*JAp:}W+a7C򍮊-6ZdNqJx]P,' UK8ʣGCڲ!Sq!Q6h>X"MMP,@eK?->I5]cZl˜*sȨz}g#q2:[7ޙc#KKꩂmC曝B3 [645 JMy XY~!}/#}DM{ txg=@çLAQ0xP>ZbOaEZyj^{c LTRWHÕͧ'hi/8KGIG'%]6g>Agٶh3L1:ђAc+ET b)sڊϲflw 1%JNO4"ܘKoZy2&;rY$ ^jlsi;RRyucl` 698*ұed9 {\- b~ORPUgB=GUWTCPPM岴N*^$ݾ|AHI!2; LXBU (7JzQd xopX.i)P߅v.B;;P PUhgB;G6JVANs[%-+I֒Z 3\s9:.jI\J [E"{"UoQdPz2cEpC49|1U(oi34Pޡt eƊ2 Q(@r*?e(03˘~2 wJŨ۴ 9|ct50_i2Ne$Cq\ɁBJ=K~EU9RPUgB}*3TC# oSj~(C%fȔ층GJ2 %]{fufetNEj8*QX Cc5|PRSgB}*3TCWT* UIcr ~ԃGFn?b~*n?b~D/|7`ts G!<Rr;QR(gBy*3TCPޡ U(Pg~C >49:1MOE 6PvN(K)Qt,bJ#̴攠JL[8JJlɗj) L^SezR7U٫ aȭ>ٰtgd&޾.ɷgS=7{ŷm`7#,"/˷IK8}ֿ]hEi[F7C3Xkg5. vΒ/1#_ \Iba)I;FrcYE ~y7/ΩGuFE}|Ɲ sSH9ʲިIʘm 7Nom{\\s;9>SB oLU(Z`k>c!zM&͍d?YYf;yMs\ݙeDqoڊNo> v˵kUwȩYD˵z[%/2@^9Qn7GܚI!_7dIwo]َTVj?K`{@Ӳdn[nll&TmOqO4(Zje1DS%lH~$zf3hoqo>ұ6Ι~cL~heLG7/l_d]|x }7Ex`{Rd]!DITa詭؍s b<U( "mf~#Ufk(y{Y/.7Iq mc8i*^!*}DoyfƜ80_ɚ<3[=r+OcǣU.{zUdDj&'-ƈ؏ P :h }}Ɏȏ12&n7Wb 0O_P&nq,XH;!ctTH94?s\G~ߏ]˖|c3r?_c&jyaˆYh6Y6]!4ow9Go'իe?Puo\n㎵~Aj[f-s v.F6{7;un#6}J.GYj >>mOg|;ElB-)Ql Ckciy@vL2{l|)>5?lHWξ%Ef2ʗ ×8g ߗD=U-d!ng{x <)}Lݵɝ~?{Kgendstream endobj 394 0 obj 7315 endobj 402 0 obj <> stream x]Is?7nQ`_t42P$j6п2@jӡSI$@,_,@u&c_=7glg<.yz4r'oQgKsfVW^}{MJsۋK$_3ᳶ9q,5,YV JJ =3؉sk2 }Nj0+w~jLJZWǑd"ϱTXfb>C.)?G%__o8t 'i7 Iݚ899U=$1Fi|!q,;&{&_*^4ϖjz$䤕Zˆ:uz5 .GГ/|vq8rz^XLMژRgdK/5/_/|4ZX'!p &* Z [p)<̜%".q~%2R (Ο5(aP('/HwkPvTO؃ 5o{8*wI淏*֍ߝŐٔPUJo >Ejk8wR',sT4Dd=Y1̺S@Wx؜ >4iRΓN;?/V]johڜRf_JFRK$`$^~e~bH();>eш߅Ijf>7D *|%~%v ŭ8{}@6.8h;Z QҋӇqOC,@o.)i`^!97Γ.H_%ӅL`5d}~? v*@c.iR0"\* ]P&{kzpvoϿ ,.:fX2~RGD_ݻ CiIo>`l+$r~]Xv&V{&(Wu5R%fVJA AhfQb(t"Ꮡ>`5fyǛE)ϲHt8տ쫡ݧEf=$X% Y?UT޿"G^E1/㻡w Z%Wn,YzsRB^UGr#dmHȔq~ql ⨅okjBo#4&8WP|I N)Keۀ@"ɛ‹Ks?j]ύYYC $A Y<* q*  4&@!0vH20"Nh}hmc7–,6`D&ɬZ#(}'jwd-K&HUږk"~%p+t*xYZ>X^FL2룇*xl"nZ5l.\SfJûB Q[(MV,ң GmwQأA5'|M)(8;Ⱑ1?Y5ڏTBC~ Z,Z)0%'(M 'VH"؄'\xLNK]vl">5[5֝bNӦV}-s]˕4%>yVK&XYO)UˣfnQ'DOH#]!r({ݰB㭉o *?w?30 Ns^\޼:{ԭTtlT&{0q,U 跕'ap{}뼷4B-ɝ@H$ $&guI"+4$,(: i8-vN'[j4*53sУ3ѣdD_+vQ$qY D RDD_5蛡vѸ\s{k&uSk5{|}T,<\'JCq.o75]孠4Uf[tꙺ +ߦ7ry&0+0U3`s/I.{4>3~$Ppip͌3[ćN nv ]?E֌A >BX\NjV˙mE#1|e",i\c93*3.ԽdU#Lj#q5C u;$0^Լ 6uj|ur=l"0(r UA$5.V3WbR!{m$@1pӲxթ*\FA`~f+VrKR( !ikM74#v[q=-7ç45@iu7]%#I\jfV֊S5b{tl'FZt4hm&(Z4pWWhw`JC7um HV++ 6ғ;4?oԼIRl|A-օh{p]2vSc'E!G9ΠTyQ:_ق}dOLmٸ@k'ܮDzgq]f+u46ZKL(+bA<ڜ,2}=rIp7YvrN q],0Y9 p)%Vc,ؐmW8ѠG|j/{Dd( J#Rut[.(nbA8p ¯5 gk\Y> ʍ2xd6yAƟ{tliw*nOv.+֪kCdTe$:EHwWI^x19k V7R-[tr9ULQ";ӈLq!8%RH_g$.@:uj2ibI|*c#4͞Ep.} Q Lgqi Yي02X _7[^Uk}#uh;=HiV$=coFqeٿD+d U7ufr][6*"JXҎ?!GZ 3bBF(_f(kD X~^i/3ZEOuK;CG\%E1Lj͕rN*,^gyJn<}e|jd@XZxmH&X>Fz!;70FzO7cF(іdHd v^3&#k4dx\_2.)0Ô(uB@ή|kհgJ+YN>7]2&*x[/UXb;3+^0 y}NdƷ.\64xBaxu ^ D7[]J^Q1׮U(4Mp%(t0RTF8+[^ʣnej7yT)dGW&? krSq>`Ӕ N%sV-`o]8[M#.CoAeފ؛91 8+THlQ CRD@J+ɑ=9y̿3opp@ױ9ф•-ED.aK"=AT5^-̵XmNnTFZ`\p!Fq!gE_U?e;qaD4~ܳg9%z)*E˨s򼺊gu,G o]&7@ޫI5.Lcq`pV`MX徐-[:wp7@4)㗚  ,K]ӥ9m?aGf|Rz~6N[U /8ָ-. }]h՛Ps];99þ0d͓[sSJ%_;K#|BhҺxI!pu]9_v\~"7^<6䎆!}aakO锩[ MmuNB`6 r)V;Rs V˥Ҕgt5iNߑ'(oY%Ղ3oSR:`Tf:+ދ͗=X.m;ZP/<8':m\{s䄍J,WTi> /R.`}_TY!}1hy0=eIj: PS\CT`}"2{ /YQ' #߾tsw`4M:nqfYXUP.pʢ+r=5 ݫz;wCZmJUyOUN3>V2>@=ؖ`e,'8S2x ,l N^:CN+J:,,EJNKED?ƯΟkE#M̳K\%j`ߕi! e-O{Gt|'9uH|muE3;iB;Pwׂgnɝ9Tj 1狅C` ^jD8nœF:#|/a\tACM?yV1BrKt '98y߫I &kNKRZ[A#(Uxqс먰qaW<ߏ c' c( 0uT8 |͔?~0٨*p-4QT V;x b+ 'u3_IXHWEV+,`w\OWky 20/eiR̾d 89 2xS\1'Ccd(!NajMŘ BZkJ5젹/BS=H33t\9ѕ<+-5Z7Ѳ%~10!w+ B&.%3糿{&endstream endobj 403 0 obj 6586 endobj 407 0 obj <> stream x=ɒqmuz4k_ "[! 0 f`Z7LЯ3+Wgcw/ogqwʉ[|ul)B211+wTimmsb"<72? 3iGgfR|aGl锶Mo` r 5yhI*inA29yʪ70*}.,{U:С_(ơS? `OhC`_ѥRIރ;fnՀհ=׺'I:wL'l*#we)c!Unj;'M:gƃ<籋Wo/ëy~G==֠&mCWԖ֠IjW-8#y&O`G0=zOWGzq]NtZc#ӆYc8 6i*{DJ7C/U0)}"ڙbEj }Z!p<'jq|Liy; wқC#QtВ&Y>vBk WqB Gzq7C"H%Cf5$&NzX^BIjdDyUțaq8W0:09z.& g%4 hfeif}m$ZY#P5}W$] Ω5 + O+Lā`湍Sq5]˳1EW,2bG0#2ŷ3ȋb-Ys@\,7e E0r@Cq0HO{LXSHbY*nbFXYe2/n*y?NP>{#1B2@1)Pbp,AOV4[B=8 0  (>PhnL݇i<i vI \Vb̶ Ly mnb>-G8(FKO")m[Č. UVjfx`($5,aEͯЛbv<=nʹ]56yyaN2b'Anra_YFl&ˑ&Ř!&k70⟠$D6#调At`ͨ*`Ұ#FzY>Bp[05)6\bd#!]X(ӟG˪/Aq XloKui^BiﻪsRIt#]qm&lm 2xp82RuH{aDP j+ĜQ$۩5@Yy\{ReGMNl& Į'Y^_;kd% <pJ{@M5DH(o2HFo?05-,[ZZK+b grzYݨwCZO6FW>=Ɣl^9dtYH86Et>>J(|waZָ֦dٷr9K3+s Ii=% CSL W@[a g)FDpә+5^f:iU:/qY]LhJA3^.[d%c*iGK$Jx :\d8\p;9i}Bpka jsyéd\rߕ.]c)};:z` X;vj3P/F X+'eձd TYysĽfZA3m(IIEtI$`,F@FC)0+Ӂ)?M|" k'L7ZUp gkDn 0&Vd6r(#1qaY @i}f'0I%@@|vWGV (P=v ֶMOUSϘeKL <%b*€҃2T9NuŘ^8AwhkPgXiJr`\VA871e ᪃O!d)0%BvU77K dVG$C&7)#`*e}\[)v_f -NLZ9`$Dh3b8 8|4yQ?zE9s&RIEF+IHˠAxt̖BC怒ȪIZ ;c} `ou0pp0c2LN!VxPh6>ŹYgyvgVvsLWO̮ tz*G;S Q84 a-+>)|TofP1>敩J0*b[Q$B7r vAF6ah^M}z󅢴&>56(2i]]zk*iIϏdxezmA﾿v .)h4?xY\*IbZGT|QE "|MR (I)reDEMFEMMj~4:0Tr'{Qzq1FLtg4e[M. Ar aԸZrf*=`4`4Okx(:Cw53 0G8]L~!7$ޣYcw$nj|-ڊʝcE>Q^s0Jx qMYBo]NsU - CW7G2̷l|Mr;l-}-4[ibi6K&hAY3Xk2[F8 Y{Ө0:- xcN0z GsXn Q!wF JAIT-e!zN1R&)[>Ns@$エqC(1gGɃ=~Uٰ6;LJG,ǚet5>gD)Zw׊ ?)Ƒ;5IN(R%Ћhj-HNPۊ|R+FCSXfGUm}QnSoR  )/&E֮~^gb)xJ'Fx1D!]>\ m!<rK6ԉ(|CX!qF'_gp`"8t=a%Pjz% p ثR®.Z_]M҂HL^,O@eK ,W1|&w R\@MJ7/=%u㯅ITj⠃clnjf\/*ՌaXk] D 8Hay- SC]JT )rk0]*sk8vՁVԢX LӲ7&_֛)_Y9NƳ3DDjz.#h58ռ/ӪP`z4tJ]M!(Vx@v̀Cnjܘ!&W3R=345\-ýf3:qN@<&T]mdݖUu]i>k|vbEjJup!C>xI`^r2Y+E×'ߧFνF iEbj;%EhcOAsS|%1_$~F<6On XmIUǘZUV]79͜ʉ#. ECR\:s =1r30]QEGZ08z]&pwsn: /V`엘%%qOf,X"b~d(NӋ9|K[jZ1mZɡs1 '8܋8[^Qۢ '> J@&F{E~k$r[/Ta,n(fJlv*Gq*!upi%?\X©wwUAEI0醨eb>#6)ݸI+77E|lXdInFD FQPdM.W0Ǵ! @8 a B(/JHYxؗ[Rdx3_6@h1TUR^<P2=ښvKa*,@G[ Y[GMmM3PmЋj0F1~Xm̵Ͱ@:CkAD31yX}JAH ^yDpߴs^!FNΟu5{1-SJs 9m=}k[y==֌t5a?j+fϜ<<zwggX)f2f}4<cfOϾ~L1-}G蘌⵻t!$c^X'׀pNar dز8MKȡU{ASv0'FP M _κSPP[zes^az2JՓu%49b0 ';'ؙ]poOXRdmY<`J4%KhJ-BYM+eKLg^͘cз¤<5?Qz>*Y%+^Q饦6zEcb\DCy06̉i&^r}`Cb:FV0P1_smnٙ{^!ׄ5g#áb;}\âodUNq UғT9.cPD=i_$(Y6b ӍgwF5F2d'Cx2Ѝ sY.u )nAh-ˏppj*m`-p(.|o,bmW[\Z[(]G0cA~0!@AZ >`=o*)֔ CE]˫¶p~N.j%=. OI[lI2gZx ~P)\{XX ɰZdxj1Je|QVDDk<iةrS8s~NE0wǮSdva+9a~eie~{$YLE!z$`WVIc伈fگ/@D5R2>K +nT S+fsQo־M\D;{-V̑W u' p~Хb%&SŲ6uq AQ˟86cq͔֔beRd$ RG)ĹɚAX[~+N( t9t<0s 6!GXEn^W/߆l}z5ZE8v~T OJy'*ϩu} %rv,>u~ F5]uGS)tϦ}e |{0IZ.y'^FAS;xa"ؤe7a%cZ*RJV T'L~.{]wqA/ѡp~ЯI̜5'ҙy~ϋ)~AIЖ~>U6.yCGzqK&?S 6 /\g%Dd5W%Os$,2dM8%c܁2fVS*T֠BP*:[0nrj.vv^!(5oSR%GrvfjZNxm ִ_\CdʟB8~=+ uH~?P̹=_'pvxr즏`OߦO7b"4A-K.h- .qPM` <):<:)υ"uUi.JD^bS+\ #f&.!9>*dK:MnEZnHt,2 yTsggnҵ8`*5,Kt*W"C,QJ@V[;Wa*G-FXhdf\ׂo$h&]7Txd *Pݾ  ~ֆNMXŬ<*I4PRlfJ_>)uȆnW+n];;h-~endstream endobj 408 0 obj 7557 endobj 412 0 obj <> stream x]Iy ANoO,|Av-8b0c;ŒG"_m<tF?6Y,V}ԏǢǂ/_<ǗG?q6u`oҗFJsljSgWG_Ʈӳ 2|_NNMƿK ^);O5ZjTφ⟽gr~Sa@jփ|:~ǷFVҳq{Hz{TpTy(aVġ8>?O YklEfT6š31K4BY)YcVcG&iDB=Ng~_K`xM|{'^`FXxݠ%&Z@SZD>G#pFT-If?z"nz*_oM,פ@MB"K;B4E ą̇̄0@y-؟V9ƴX:(}F?lktB☩ il{mr̊QBIܥ7<DGRAM7M&jo[$ 3ާ&Bc ?6|oWB 8xg3j#-J*EMt|"J=b`EaE hgL)`QC ڃ7.0-!]kQN!A3 {Da*[cO]/ef},F)(ۋRZljEr4m;bb1HY@SԎ =Hiÿ8Xd7)fm4㠾Ƶ)yr(w #a8i@_NSFV̓G9Q}՜WcT#5wҏy6a:~b\ܜQ ;8\3*9uǷ=?/|fqh\k\aus` ŏXX6 v#҆mJ΋Nz OM E!qk{lE4nO`=`mg50a&_aLBT\6" Yiδ`=i0!K6Dռr0{0/Y:A:n&-OF(ʶw^a R5Ek׭RMuÙ~+50_ly1*U ZF;̦tWyiƩ7R\6{ucgN`&eb&Y>NlUu%G71'dJ>z*.& `w.M'S4<6L :e{vX.k޵~܃wL(|>t0)D|a\K3rK@/ރoy pv^Pmm .4 C{dxdiGq z2hp3  ^dhV+qȷœ#FfL{H,}yY*0Cre''' Y7Y~[YrmwjH|C?Y@)o23xA  ONRIy-BKެJɆY~*OcǒPwҡNJL:J ҳ@~!a8\m4 psźL2ݗ[ˎJe{r36,M3m)/eU{)N6Mq?+9|Q]@X #׋n-sOܺp%_C6k3k贡 n&qV6Z Hٗ;Eh9@|HZ 35&1 S־A'-*jmcG^Ml:k5W^}@R|3IK溜vg&@;# AK1pO4UEH \(T<~?Ƹnad~-]h(ܿiZ렀CrEN_F5H2.jV⑰vmDruë-%P"cdU޻c mn#zCk:~%bآ!?q2=3MvE1gIWfl=6yqf^X%(AI>*q(ȳ; 'R&յe|&=r FLM#VG!Tf+ #5AɋTt1Hl`$ S}uuȵs] X&4e tE wp1\w(\V8^Exa ˡASTzE1>.O)̺joHIF.; -W.~ ꞐXkYG$We׏TwJd1Lˏ &cU팳zzU{}?~vYŞor`^P^i,x3UIFhR݂jeN蠧AZro ME.`G8 i̪,I*@|@PzWdșj!>4'd<;vendstream endobj 413 0 obj 4404 endobj 417 0 obj <> stream xZKo7 .Л/ s(Y4պS7ޠ@R;qdSNPffEigk"r3+q(Hwdwk.dsnҏMɲ4AnЀB!14֡b[L t}m5oM}qJb@k'1XZBjAX!Wzl y߾h"Aۯو秧Mmeڷ9c~6'+ ?le\۾S}o/G5Q Ѫ-{xde)ع}n|`{Q# -qRJ!֒EU`'L!yWӿ=hpizW;!BAAwTJY aDv\\YwdtD3J  $^^*}Y L-ZbIfޭ|w6W 0XpK 4R^5sJp6q 34Ş{;<ٱΒKs!nM87HKіB5XO+;M02RJrb=z *H\ hT.pOӃ,yt0鹛K[nƬhMX5{Λγb+ >_Lq,`b+-&m2TuclIR}6g2k9QrƙDx QL 9M##6V0&vOk4ҬQ߂{Nvi81 '"TevGE%\\fq8F%,ҭQRGO\=̧Yd2Wϲ}f*cөv~͋a@YYZ̉;\JlݨZlJW)nB L R`M nTڛ|y<Q|ڛ&8gæ./9oz X~tTKKruOVWyo;ZDyJY䆄lM_$nL,Ak_=UFa0VүrŚN҅|0 )5ݺ5~ sOfbaD;0sb^n(COt-ail )vcdtGzU$U]$c6b8֘фAMC~G9f!ɨVtg4"J+kڏ3(9{\ ]V?dhnXkvP}_pwWKi!bۮ6zflo1r6~ܭ8SRn8AqwWC[RL֓G&1RuXuDcx2cx6`4hy@*bB+(L%8Pwr9-Qtғ/Q ':?86\aytaXuon[Κ>iO`"=X`8HXXdk(>ɍ)YeSOErX'?rpu>RPZe{П4endstream endobj 418 0 obj 1818 endobj 422 0 obj <> stream xZI5sSxоB,N88*{Zy2_`<_7}-cC: ߷wi> _waFn׿I:e(|Sv'1ҶB }1nZ|pilgS*Ls|^9!eG~h1>f{icit*Pj\tVks-lˇaJCqn"0RN9[NuQӬVy 'I*1tFX~giԌFQ6l}2B_(U%|rc o(w7˹La>6$̺8q*h*tᔞPJ2RD3>Cs0Sds`sJ .w0$07jf cfdqumEŰH[e6 u9|aU׳D&r%)2)Ic?)F8ѹŸlpc$x73FL18ϝl)! ,4cWlH !—!V\p׽`-\?R/(KBGhퟀkRxlIي>ZBaqFH۬@R U3/ZhI6ypH2tgQ|3K3$ OP<#N*j4Kt #'DUX؜x͆* R?Nu3ۚ)d)/i|gOKWcq Ԑ!^ĺPW|+3oTZɵ4r@a[Zr6sRh/؎87hW?D%Cau36U`W;ywq릐Bd2#7%!ő]0lz(UΥV}Yװ LDžC,})XS5S.Rw_p "ܽs-%H%@7R1E洍teEꇒH`WOpFEk$NN†Ka8Ճ)➠v:&  xJNU 38B>rɬ߳fs#mlu%/>Qܕi59 rؾhpK(Ӯ2!'V?7 %A A lB?v mP|$ҡ BS 6|Ws' 8ϫ[z) ֨†8ì`èJ8^) ï%QĨgmJkf g%^ ſ7}y/182Fy(.n ^sl}$H@rRy/ G`}<\$pkG,;|7D 1A3 ƓF\ak|x-76P"Es}AD4c(i{&2!W(ASlLgy8CJf% N;@GS'L dZZa R[GS{s9B%("fT3wFK6Nqs͒I#e쪾a> stream xZ[7~?EqLt<:1!6,PqKѧIMRPu> l ?^n0j~wH_[=+])os]$n|?:Ih9(VѮ́k1\~4_^ ;Y۰R#fdHHs"Z7NHg*lvN_e+,,{S@ Y*F2 |NAKzƎOL yt%$vcJ0) >/pYjq QgQu՛O.]Ii{zdĕ`"k5K THH* J:JH-qJ_Ψ QoòO6$'B >ÃEŽ_ 5o=\>o"`FY[rf۸V0g&4/Hv^ֆɸE?ap\ źn 7Y(M/uAC\nF(34JpwQ$Eε^Iګd(tȼyπbYo:V!fL81QclFUG`n0-5 !RpQlwKB_)Q>w}zԮ$0B dz<= KIj4㨴9 ϱNSBŔ%0/  Y%XO-<nؒu*HAs!x_sB"X(VPAn6`on/P(Gp-/a\Xְb!QX:}+6y:L!<4md m*Lݕo{ȕ'Ip%܄2FrA scE;Cll57. ϤP'Pgju)ECFSا$6tw{k檹G?̡N=s}L`5s!4YFI%w\-l۵C!HR}5,5"g~AʒZ\fRM S,md6Q]?4r}h%ƚ;hDO|K`p繉2~Mі#c5E(b"TpĆWYNTJآ[ K ehJ_ZUT)/,R)nn0K%yn^XϞ-7JF[GD*/.1aV辝 ڶapʾd!Njx􆠼ΫǴg9T6q31ոZ\/:{י]閃׳BE3Qx\>*TX3ү*ߧUl:=ol.(H,ڻ^4?NA'V*"XqQ?遴&(٦y_8EWVa8蜞D)e*/M-6OPuT*R]UZ \MN 椧tm.~z}e`Oiv{k(ha*57G8,^\0 jiu.ۓ׺a7ύ -߸SEoH!>̟ZrjΊA=jK).ЉxmHKsX, 84 BerO6u ĎE /lio O5)j?IGsirOfuSZ狋ߵnTms?1£'؉:`Fuv'j{180VoDf)! C71qUGd۳zp񔗇)٧V3j?C]CkCjUowjTnϷo8Fjw',?ʦO+XvY"c}LӴƭ͡Z^ jͲh%P҆qԣlQ hA2(?58,&z஥IU!zh&]kv$P;ĘӪhho`oZvOC2/{"Sf >tɇP6P~[(&@hzq[LՅx)~?1">ba#J^ƽΓ֫2d20̂Ԓ2) &sK.~Ze(<MXĔM.d{ u6ŦS8 Y,0)y_q-BUkuG.5?KXl\k@AnspG!\N d|QV7*Ŕ8k44e'<wdhVPРOjP*u+n%naxOSEWCߊ4`>1Аr)M&G!,WsEL/Rrendstream endobj 428 0 obj 2504 endobj 432 0 obj <> stream xZKs5,1'J,* ſ5Onj(<5O_Z~l^~4 k]\mh[W;͵^o7Fo=\m>ZHgJjWa.c?d`GԜsc՝^Qk*FF/6NYV)?L6FvymEM Yb̊3j2F27c ^Sh G[F*^ah.&,teXn9ee >ƚ yQvӌ51$89Bܰ- T5ÜN]g3>Y+UURzIPfbI/}c ӽaQZr=O[L覙s5qMp˔P:p/bDµ5k r;\56LґY*J=QITNQ LNPɥ`!v\`s(kad@27!T\ 1tsU#F18Ҩ/sCt1'_Ů7I>#> $PWx"+fMnp6G )`޴Bz/Sw',uc/Y5e~)(6F ~يl%_Nùub.;E pSS @cPS,bezMw:%$ Zk^"g K"%L1q9Lx4f":+ kyE'>'Ӵ3i i:A(Ń}/c?:xNOSKZk/Xe,!夭~G[Ӌ;)t'4$er=G@`EF?hӞ<V j&K 1bW:EǶzGb6ؒSH.Bew 5k%†LH0Gg6XoBy?asPtNgoa ?x0p_ [7b!фqx:d$2_gCXF#$u,*s`nY)>v&$J`y=A'~+Up19F;[ge{kퟮk2=gUA;hCBm¾=@K9ѻzbp~}̢epM>/(b)S;qL.q2tN0 M:nq /'0^7VGH񃣽k SEiwJQeЄV]tX@HTeWiuMZB,/_wVX-~Ek_<؞&ڱ:f#Y Xp&cc&d2gx}STb V1(Mʸ6I𡿕4Yw"\#U5Ji \(GYXܵ֠Uq0B6kr .)gZYMǡ'5@wFD< n^g,MKN6Y]zgb oHoYMNub9d %zRG(7AU0 v2/ M`Ly3?_qr7pe0|5{ .4bL=3e 52jEڅaص(m2/PVFy@ag@l5b=EU悽_E}4nFaJQY (odZ!m֖g}Ypԛ;/k5'izE'J G\`E;g;yxI6{rUЭKׇ;tCW>>CD"w嫚W9 MYײqv;ތ(6/+z endstream endobj 433 0 obj 2104 endobj 437 0 obj <> stream xZɒDoQM08664Á`llaUZTJvs2+)}HC+߾ջR;|:Ǫzpr lcS:=tOʨjY)^?HÅ5Է _kCx9o5;FpxJVN_I}ݷVA4BNn'KRjx}힢jFEx"vMGIJ"o.~.~2a7c'Ilfy Po5F^3ʼQwrޖkqljFQD wh#}Ѧ)Mew=-wk!\XymRޘú* GrXpiv:ΜE`q1EE]tPJX;F]Q,p@#-k6渫>(T<3c0ŜԼ\@ x;dP,x1Gٲ |lg펅.ZeٞFҌ*wbm-sld -3e^?؉5a쏙&$XC{dyWiPD$`UfFʗiev]K εVّR=8WWk 2g ؼegL*:*7r SV3ܶS7eDwGGʙcҲm+ mc!, I`zPQz:>wr(*:\Įgd iTN(;կYe\,c+F 0t&>I&AzL]vcIލ#hjWdI!ڎLe`>X]iȵ*LӐ2#ucv6M)h.QؒLɗջv/i 0ݓ+Y.YegY3e2K`1_q\ ȱWK#AaLشDt΃7E߀&b#':pGZ}dGS$8e m y`PLkv^jz =,u۝g֮w~~ m՞>r|ľ?x!\0ޔ.Pf(\,f5] 3=h%(Lt&7An#&S5ORZz Ae =ÈbL2u͎g״l}}a`!?a8=vj^uߦXfAm˱(m@ۣuWendstream endobj 438 0 obj 1815 endobj 442 0 obj <> stream xZ۲D}crbw>E p@, hD*N3YI_3)-N${u޽aoX/|4/mXrvÇj\вٿ،ohC/5Λ&ENWld+Lgt}2-H9~NiW~sJ4gY?Wp݀_ -_t`uV31kR0dkEgNG~jOdt4FZ*>ns~@sojfnȍV0/Rc? %4Qe7a j?ѿ;1-00cofp=|2X?l7BgG1o0Ws-v7[΁盼_3.(h[mкY!h^#pZ۲DH YU-3i1E\R/_NeZMoπK9E1;7e (-;SPU-~-L&]&tpgjrW%ByHf3` e0@K.'𱽌r#C;ݗ |ӗLȂ~ e̋ͽI2c_RuK*1ԭq>[s Aقb\5@b)!W抋a~Zz'ECw>\:sU*H^ZSӗgb @;ӛ4Q.. Z2jVf}~@ꌈ_uDЅ7_}.EP{ ۑ.G#RkձٖϒNgOv7qrYFh9j e:eN>uX?rĬ\ DR%ap6 #aD)Y0KVQ5=8 +%)H苉"\WJ」h!49_-q?_a B Z%G^hT:ZdϺ ʭɹ&H*^ޜ)Yj+7ՎF r%^+yQXAozH"YWU>oX [4oQL$1Nvs)X\+GR>}ezTxh{||R;WX/H>qL}t5=LOhSZyBͅLRO%ZB{FmvX7O.hWc_AVendstream endobj 443 0 obj 1884 endobj 447 0 obj <> stream x[IF;J;/G Eu `P KHye_UeO3q2oݖ|ŸGvm_mmx r[oQۓ|L˭+o=9۳ m';y^ ťkyˤEVhMom$*'?n8oۓ~?cZ$4 5Ӊ it#jjh'lk k5Q3*f|ΉW[ẆҼ*>J18"ʢ2n0U<riszd$`y(,3)"3(%zݓ$|`N݁(k?)Ir'M# Rn5 iYQwj$ӝЂ 1@QIʴ c˜+ތҚd-gg핫 <U育텣@U>l!k^ˏuo) dz&dQ޵l-[.zR.0M7RA u:eW./.[B~WVӛ,{:Sc.l)r Z!|6~̐YuN@˖S6+IuT1 Ȥ[j *Cy cz@^wB3p) ;lGy)8 p@ 軎qZ&ʻe'f bf?SJmpe!> +6 ÙݵX }e+NUZv휋ϷCt .*1@ST-,ԯ ERSV@63Lg ǤFRq>RN)MWa>tcrnt5b|"0w>vǀ|ǬaJ^wc{H/˔A-j5 2c2ٓ߯N5+)M#OQZ*qr1 NP70.Il"<܃Ѯ+/}EiO>B1udfx@AVP+~YAT |:|pu sdRp ΥrLmóamrW:ԕgHg2?$HpH(TUqwoFB教#| +3wFLU%\qLy*g*|>U0M>_ 8NTEV´xIzO3戊z'Batk\G>#î,^gײMrVY3)weӲR1ڤaR/_R)WpMdT#b<~[B/i6x|2SK]lضAdƫt4Y v 4C`}pF_^VQ˱Kj?,>!Qendstream endobj 448 0 obj 2244 endobj 452 0 obj <> stream xZێD}GbL/ $(\&x"e zn Ӯ:uTuoߧ盯݆5gc<=oiF5K8qc%|k`cLxIo9w?+ƵnMK8-QƷ_mwRxrZʷj|m{yhw6/O]iGW]< oΉ,L&Wq8_!,z\djgG_VPE1Tӊ!Z͔lX0)@N;phdme6fW̪,+ [w$K\HM{'%13hC :K`ogS!!1@I')(^lwjVi+l5Ɲ#w'e=.;ؙ%##Pe_pڬ],mu'N@$.ezG9 ~޲Xte' yqKǏRl,eRMY+bTIԲ_(P =J ۗu#v:Ig4z ɼθ ):VIχM~Dcendstream endobj 453 0 obj 1888 endobj 4 0 obj <> /Contents 5 0 R >> endobj 20 0 obj <> /Contents 21 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 45 0 obj <> /Contents 46 0 R >> endobj 50 0 obj <> /Contents 51 0 R >> endobj 55 0 obj <> /Contents 56 0 R >> endobj 64 0 obj <> /Contents 65 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 76 0 obj <> /Contents 77 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 92 0 obj <> /Contents 93 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 109 0 obj <> /Contents 110 0 R >> endobj 114 0 obj <> /Contents 115 0 R >> endobj 121 0 obj <> /Contents 122 0 R >> endobj 126 0 obj <> /Contents 127 0 R >> endobj 131 0 obj <> /Contents 132 0 R >> endobj 136 0 obj <> /Contents 137 0 R >> endobj 141 0 obj <> /Contents 142 0 R >> endobj 146 0 obj <> /Contents 147 0 R >> endobj 155 0 obj <> /Contents 156 0 R >> endobj 160 0 obj <> /Contents 161 0 R >> endobj 165 0 obj <> /Contents 166 0 R >> endobj 170 0 obj <> /Contents 171 0 R >> endobj 177 0 obj <> /Contents 178 0 R >> endobj 182 0 obj <> /Contents 183 0 R >> endobj 187 0 obj <> /Contents 188 0 R >> endobj 192 0 obj <> /Contents 193 0 R >> endobj 197 0 obj <> /Contents 198 0 R >> endobj 204 0 obj <> /Contents 205 0 R >> endobj 209 0 obj <> /Contents 210 0 R >> endobj 214 0 obj <> /Contents 215 0 R >> endobj 219 0 obj <> /Contents 220 0 R >> endobj 230 0 obj <> /Contents 231 0 R >> endobj 235 0 obj <> /Contents 236 0 R >> endobj 240 0 obj <> /Contents 241 0 R >> endobj 245 0 obj <> /Contents 246 0 R >> endobj 250 0 obj <> /Contents 251 0 R >> endobj 255 0 obj <> /Contents 256 0 R >> endobj 260 0 obj <> /Contents 261 0 R >> endobj 265 0 obj <> /Contents 266 0 R >> endobj 270 0 obj <> /Contents 271 0 R >> endobj 275 0 obj <> /Contents 276 0 R >> endobj 280 0 obj <> /Contents 281 0 R >> endobj 285 0 obj <> /Contents 286 0 R >> endobj 290 0 obj <> /Contents 291 0 R >> endobj 295 0 obj <> /Contents 296 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 305 0 obj <> /Contents 306 0 R >> endobj 310 0 obj <> /Contents 311 0 R >> endobj 315 0 obj <> /Contents 316 0 R >> endobj 320 0 obj <> /Contents 321 0 R >> endobj 325 0 obj <> /Contents 326 0 R >> endobj 330 0 obj <> /Contents 331 0 R >> endobj 335 0 obj <> /Contents 336 0 R >> endobj 340 0 obj <> /Contents 341 0 R >> endobj 345 0 obj <> /Contents 346 0 R >> endobj 352 0 obj <> /Contents 353 0 R >> endobj 357 0 obj <> /Contents 358 0 R >> endobj 362 0 obj <> /Contents 363 0 R >> endobj 367 0 obj <> /Contents 368 0 R >> endobj 372 0 obj <> /Contents 373 0 R >> endobj 377 0 obj <> /Contents 378 0 R >> endobj 382 0 obj <> /Contents 383 0 R >> endobj 387 0 obj <> /Contents 388 0 R >> endobj 392 0 obj <> /Contents 393 0 R >> endobj 401 0 obj <> /Contents 402 0 R >> endobj 406 0 obj <> /Contents 407 0 R >> endobj 411 0 obj <> /Contents 412 0 R >> endobj 416 0 obj <> /Contents 417 0 R >> endobj 421 0 obj <> /Contents 422 0 R >> endobj 426 0 obj <> /Contents 427 0 R >> endobj 431 0 obj <> /Contents 432 0 R >> endobj 436 0 obj <> /Contents 437 0 R >> endobj 441 0 obj <> /Contents 442 0 R >> endobj 446 0 obj <> /Contents 447 0 R >> endobj 451 0 obj <> /Contents 452 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 20 0 R 29 0 R 36 0 R 45 0 R 50 0 R 55 0 R 64 0 R 69 0 R 76 0 R 85 0 R 92 0 R 99 0 R 104 0 R 109 0 R 114 0 R 121 0 R 126 0 R 131 0 R 136 0 R 141 0 R 146 0 R 155 0 R 160 0 R 165 0 R 170 0 R 177 0 R 182 0 R 187 0 R 192 0 R 197 0 R 204 0 R 209 0 R 214 0 R 219 0 R 230 0 R 235 0 R 240 0 R 245 0 R 250 0 R 255 0 R 260 0 R 265 0 R 270 0 R 275 0 R 280 0 R 285 0 R 290 0 R 295 0 R 300 0 R 305 0 R 310 0 R 315 0 R 320 0 R 325 0 R 330 0 R 335 0 R 340 0 R 345 0 R 352 0 R 357 0 R 362 0 R 367 0 R 372 0 R 377 0 R 382 0 R 387 0 R 392 0 R 401 0 R 406 0 R 411 0 R 416 0 R 421 0 R 426 0 R 431 0 R 436 0 R 441 0 R 446 0 R 451 0 R ] /Count 79 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 18 0 obj <> endobj 19 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 253 0 obj <> endobj 254 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 268 0 obj <> endobj 269 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 278 0 obj <> endobj 279 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 293 0 obj <> endobj 294 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 439 0 obj <> endobj 440 0 obj <> endobj 444 0 obj <> endobj 445 0 obj <> endobj 449 0 obj <> endobj 450 0 obj <> endobj 454 0 obj <> endobj 455 0 obj <> endobj 484 0 obj <>stream x]1 D{N Pt4Cc 3$@8X)R,Ã;0^Gk"&"ƪۃp\YO endstream endobj 397 0 obj <> endobj 485 0 obj <> endobj 10 0 obj <> endobj 486 0 obj <> endobj 487 0 obj <>stream x]1 D{N Hؤq d( !7x,~a&Lѫ'$lVEx:RJ_UNȀpwor`/Wm )a RAn7{b50ىN> endobj 488 0 obj <> endobj 79 0 obj <> endobj 489 0 obj <> endobj 348 0 obj <> endobj 72 0 obj <> endobj 490 0 obj <> endobj 8 0 obj <> endobj 491 0 obj <> endobj 226 0 obj <> endobj 224 0 obj <> endobj 492 0 obj <> endobj 222 0 obj <> endobj 493 0 obj <>stream x]Ar0 E>ocƛdE;#gX0,z~EgI߲Uk6]|sM)+=It*+=Nq{/8B v~T|ڶr/HF3&t)Ey^C:R v4KDHf:"c*bD1  B41N\kYh edV 8F쀧 Q#]aUk;;Ɖvrg+W/Xp҆gg6X ${"3OuXel<)y* _y endstream endobj 60 0 obj <> endobj 494 0 obj <> endobj 200 0 obj <> endobj 495 0 obj <> endobj 58 0 obj <> endobj 496 0 obj <> endobj 497 0 obj <>stream x]PA  ~ЭmZMz14  z0e'C5'g^];-X#=+"&XUqVUY;OdV}Q3UЗVkz ){VhI#W4J&Q@MM*3vdIYNL{Y8ޖ+r|-%t XG >dO`e endstream endobj 173 0 obj <> endobj 498 0 obj <> endobj 499 0 obj <>stream x]r0 w? wt^ -<2+ҡӦOtL9T|Q/xKYo&E5׹|}Tq͇GyM~ (:b9{՞%;bAMi`]@0I{2t5@JMւ`Q2H: IH*iGJS:C+)䠁G gHϬrZ1o˙4~.^ endstream endobj 41 0 obj <> endobj 500 0 obj <> endobj 151 0 obj <> endobj 39 0 obj <> endobj 501 0 obj <> endobj 149 0 obj <> endobj 502 0 obj <> endobj 32 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <>stream x]An1 E9En03`*!oE+rLb,DaXGzp_D`0%҉knш0+Pqנꇠc/>ϒT\=](ȞAtw[/ JTdl׊y<5/)e|G^"Se2{u endstream endobj 117 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <>stream x]An E>70v*YI7Y^8""΢/34Uųt~>e7[^f^R|[9ƢKL귦=kcS> endobj 507 0 obj <> endobj 23 0 obj <> endobj 508 0 obj <> endobj 509 0 obj <>stream x]A ER[5iM^`X. Xc\|7'3O -aRwXN5(<#%ڪCU?^h4|#SCj0{ H2&ZcZM̏yED.#V")vhDqVuCZ-+0v>Uk:,_qF7b endstream endobj 95 0 obj <> endobj 510 0 obj <> endobj 16 0 obj <> endobj 88 0 obj <> endobj 14 0 obj <> endobj 511 0 obj <> endobj 81 0 obj <> endobj 512 0 obj <> endobj 12 0 obj <> endobj 513 0 obj <> endobj 398 0 obj <> endobj 456 0 obj <>stream xMMKaǟq"kॲDbB (lK!]VE,Ds^ YKPaf!Gdj_zj^{g/qNɰkӜ9Ϳٗ~UgXiMwxx|~O*Zkֱoq,㽢rTs5>UrYc״rbsVEh6Wa\+hyoe*_ZȨJQI>1ETsc !4o< &t~ +f.VjM$u"LXa!7Z]qB! ZC@,Gy!TڊR(J۝PeX~'I٬$~B?熷r endstream endobj 11 0 obj <> endobj 457 0 obj <>stream xW TS׺>1sMPE5P**KQ(w Փ҉REw{8)v_ڳץQ"ܦ˙L0#ǽB{=={g%w뿾yW lc۠2GAۯ3h]m v.b3 u*PNَC6ɢ)}h]P Z-;hl0!$9=MIIJu.Ae .*X.8QOh0"B9tN,,E,܇ZNi0 B1%xh,7͟6: C;tqWR })SwҡZ'HݝG7f}{[UYdwsZ94H㞉~ޫ`1?n-O`̑|?AYDuWQUma;g> Hz= B@-cMp@h}5aB8D]-Hb1vQ}!Z7 &u^NCB<|6 4Eh}Qj&O13g0s}ڇ^8<@[L1dZ~ g쨱^@A(UHboࡒn(*ҏ "&T!΍EZI7xC$]_Sf*$(֥k"EZt /g~.F#\#賸ԌH+K-ڍcsz$ jǡjѳt{H^Q[IfѮ(wMETEdo%y ^ MN)ǓUq"Ș1k{mQe72@ L2hy<M`q062`~=zzǖ)y|X}TwadbGG9CjdS&3?OiG;g߿!?ۜe:h\0$7i=MfRjjt0j&]_9՜1ya~6==m /슮m*F'd&=9HfѨ7JJ3j3 HgdaݹdW5CC.?H0m=timn!چWu.`1LVYY9C# ~{,^.&p3oc ƂR۞V{0u&Ձa|\DPVȂ2r$zNV^Lma7XxKdD¸j(<U!.*"F;lCrp"r$'~ay7<9):MlrbT^LaHuX2![uo9 4aHM &bxhjm+OP!Nm;SMH?O]7;*D WQ-1 aBaSlY~~io9֡>yyiMkb_0ӎ!4M+~OmBe1J`$Ey6 tpzcNstC5@ꕕC.A\ ]W$OU%|6*$>;uv}"H3btaoS4ol%a2/GW[ˋ4L]YR#JIhL壕 [*vv8  Hxw&xHɦ r{R~45*v^sSA$u5_e&`d =tc%a VBt7;:)Mw<y9Vi0%F(%?F!1}QlMVzNѓ ^f崡Eߘkw IۨpmEFuy"Zv&iNHNQC2O*5*̪U[U\dexn}!4?OJB0,mլ߱> V1s,CQ]Jxq=z L_Hru~J9X,,A͎*Ͱ/[aSBMVS>\csS5_Qs %?uIA TCHYo]zJ :NuV0 gv1-6>ҩvMC7Ccrlw(a.L֍%'5ՐҨԇRsk3vF'D׬(a+dqOT"J(f 2` W~FdZ"$"m8Kbh2*ҶVo0}IsK'Yܜ&I2aj慞-{ֈ:NK'(XȮ. h'|TI93XEs ؑm]{ڻpsiY[1onHߐz\U~H^˙+gO )-=qIKȧ6ia .+ژ['d*8%?=PO: ىbMv!3 \0@晎 2!tdDL_ۙx=>J߲́}#̕(sA5$^QU6w/etiӌ? Njs/'SZ;ߴ̝>b 7ؼ/IH/GtwRG%2tХ.+^#i H@!vrz4BIjR5P 2;Oxvtjg:u .Wji?Ra+cMm#mSN[ lm. {tI]$\Rw lNfؤD cP-ّQZ'ѱT=r=P!ȿ럮Ĭ<SMJ]]D61L%i Z;[,;EkM9$AÔndk8~O˽hl*mUVkR0(11Ve\nb?+AD"F2`6EtT ǔefHC1FPiF/ްuhLSˈv<Eml#DVm:,rfmqtEn2no/]eKrt{H,ޞx D}*pqQc+v妎#<]QGRʷ7;'p^sM>|&A"39}> endobj 458 0 obj <>stream xcd`ab`ddds541UH3a![ׄ_U<<,?Ԅ~O+Ș_ZUS_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@|CR#-MM͌MX8{{XYlz6USG|_K(7aRdiMS;:;Uhhknl4WǛgwoDݾ E~.ɖ[>o!nZ?TD/[roU~]߂K3Ögw?ѻ߹|\o86smf`| endstream endobj 80 0 obj <> endobj 459 0 obj <>stream xMkLSgQ׆P MS :Y^ n*&*jjihHd4f6]cibAkTHo6g.X,s49Q$bb0UZָGC\0ViҵnsFeU 1q[G37v^|Q<5 j"JM85j2F9)5S z}9 8 dg=X꓎{{is$1490 =M& /ߖL`26KEL̐# hj!XJ$N?nD_Gl Ӿ$"&[Q ΢r26<: 幮1qE[\f?X$ 6*";Ⲣ>ǟ )14(dT~F['7-\`a?@zW^&#<% 6056Aa>Km/=T78i_%~XYtHmU-ak ܄[nUp.֭M*UC,,R?^{o6BGȯXUX}QHL^ו88^_ҥ*fB a4>롗>f$'s=+-p?9=8nDBb#7)ll;+j_Z}'O.-^|N {IA~8@ 䣎_Giw})3،woT$DsMܪ:!M~ ǡ$~ԏ;C¼ mOo?_+YiBVtl(.a> endobj 460 0 obj <>stream xX TSW1psU :CCp NNs$!@c8aHGgUl֡CN$Szoe+{9g{vx+n]6SPw%+vss5B#+?d)v.\0n̙ Vx s' 'v[^>hKbѢO>J3D-2N mF*۰/p+!"'YJ•VX+^'Y)Ssߍ~l r v ٶxɤ&/b>cڮ3|23v9~<~A|L㉍bHl&&[[Ʉ+1p#mvF$;U XM|B!fkY:b=1p$'b>L, 6cq`1L,!ψ!Rb(&pb%1p__y;yQ-,, 'L,(S"@ :1|̊ 9C,zuN _>\3шU#~0[xđ#0k6lJmtֶllm,5qqC}9?\冩y ?澣 HĤ`4&@P`BYVZZ%l gTX6DpuP gdTd]L6up9.] =v0 22Nԯz u1]diCd~۩S$ O5蟲7{4'ZcW8HˌKgz%ad !y郋7gղ.SnCgpTJpzCh=t"8Faw XY^J\ ߐ%>Y#Z<f.wGdscp8xKd/&ԟ=D5/^يcƠd_8\^Ά Q}:C%1$-WRfFwopGRePt`XkXs~^q|N\']cR4 [mGp_+0ӛ"0z#Qi%د*-m(i/`iBR*idCԠP=@ ,fIZ 9p\ |p">g,3dzֲAf=NbxTyQl+A-(>H/9xC .6C>MBG-3ȴIMsi}Hn{SxCɩ COnNUXSJ*2%,wΕdw`@!ʘYgZ9:n)p,J`J13Wp@.ᮽ] OͼWo:W_ :Zhꥃ?geԂgzkpGD1kP^ Tjy:cUY(LW1 "|ܸ46GC;p< UK&Qz6+dmp5f2 #7U(H66*ev%PW<\Wil /0:Jռ?4m ;ȣ5I|(dY̾Հ3flVTeYUVߛ<Њ h482S\0'qtWgJ0*1Ym~dJ!}rЈ~>D@6 aM e_6@U}'R|Y"hM?!TTf]/wLQ}zlO&TEkc/*WCb}Giҫ T4 }] (7\GҮ-_ƣw{Nos5ݢE VW 3TdrrH#ΦGjpn+T,0_. 9spf`!ً&Z]AD&C8I0s *]/-б+o9o^䌜#EՈ3tG䉲y@\%?p|zpLcWhN(q-VIpKtU 9/k@3-x{Id4@U֕\^dK1դ/P$3j4>J ܥ0.|gVH> mL4Jrkm\; SgE\nWyZd\C+tIYz(% ˚̀YwECL[U\Y $bZYQS/ivI eEaoIPEM a`F\/Ȩ9pz~evB}ogwwg3{]]Ϊ* OV4šL6f#XWdZ>;=[-Qݨx>t|A;4AkwʛqYj2ê0gOVU5ƶrBf)J?Y88q*U0#[CӲ(dF7gG62}S_3ԍ@7BX(74TW704guchT:{ s ƊdƬpIeK6&{ߌWAm^E̮ʌj>hӯ*(icig Sw~|Ң8|>QP 8F:qf/ZWuӗz=^;'r.:y@/8o{FE)>q>ռypnn4؟C6<54dȢCn|AȒEM`Xi,W㇋ڹMC"EEd$U: kMadVTUgd&fгd>lɤS%>c)@bWN@zQ{^Ji:$x]h8 {kG$=#y,A"NG]F`6Y,b5Lp_[ QQeT}CR,mŕ98"Xa",$49 QZ#h3Frx;wnأ h3ZxLXEJpjKpTRpL(a;M!`'faG=VI%23 X8:{atI)PVQZ$qŝ,~$)S^"tYD B(iQB͑u5l闿M?\e:)99[|1GcHsǡw(8xW \xWKb&MR^jS~Xvv[.x<m3zUsHfcS7dc XEC>\ÁƦzfiB8bԥ4-ܦɀ^1> endobj 461 0 obj <>stream xy xeuBlxA%ЈAM6쥀B4;֦KtoJKKZBYPPguq'wߓquzqJ99&1 &9vٺ-<4f1߲i< &`}>;)0e"r>`19e9AFZz~9Q .|anO=0jIV #)!;j]B~zJVB>Gf朤/=dQQ9W̍*Oڔ"(LIz=';?j}BVJ,'_"Z"f0,^9sݏ hÇG;U^Xh ĿIIRZE6@Цm#TǥRҌK .zQXQ$^*bI9N6uAӶ/CM1Z{f}zB(UR"fqat ;?)pM" pl4}ӹ2WF<97 |H\pfyPZiD=m;,/ b;B 4UE_3d+u_X}G1Tx~1QeV6\z~3Y3ϭ=8ƏrSW4"V sP~ 7_0Meoy~&zS`3ae:5HK/m.HZBD1r@RBKm׾ ϜB368!{\5T,.LhnTwX's mc*-jՄ mЮ[.v:FsͲ6$.~l4oчwħedSr/` t>~I x |쵔Db;e&h‡5fë>f(2pigh#ڌ2Pzd_iE_b\0f߸GOݐMG?c򄗀y?Yy9NeH8F4-=GHJZr;vA\z+>lljxf+o!jmTtbVӶUтCf\/mbt?WK5 ;krBg6Vѩ09G{ۙk:Yï" `49@$ł/'7dj}&+el t:h .LDr%PE//.X"q䢉lhZ׉y^`1uhQIcʠDl (zPj(P@ ,֢K*1Qd!GOKo qjz\1dmx储9SwG(*±pA]cSqQb(+Z_  9OY9[$)@]6֣gn ֿ!UYR羝fʑKs VGph bW 6_[j dCgžgޥu2[Ačݛt/G8% dgkCC l͸t{ϓCh+ Ld&¥,Rf+tR_]:[8C{pZ!OgF6vW@\<_L]1ij'֓5[TچJMW &EU)\FQ~+@{q ZgH4T$h!M3ނYۅQ+VP%R"x@;x-( (Z6!v߁!)0+ LtH|MiU&99h3=vO*k/D'hE4zyO#w`B<eD4m+?"m/}R,02ym9jG+S zq?lj;&$f&"V0ԻPeٍdN3nyuIЫCS#>D=q,ť!>O֓}ż*޴{}p>L@6.znbtzN}1J];0zͫ\|m+npi,J|HSF(*1Kz ֗l w@5tfnj\JJDm2$A)'*]cУbf0+h#V{@3&f-6^^d}>oV< n:" ď/Is_G>MV ;8'IxƸxG7goٳXFaVzj~]`PM D'?)OCJI5/Ejw4@%Xh {{j&K(z{B5.69"~zWrVuk:yLU"nO^&BT&Vk ^b CFL=B鵲DHл=tGfJF!/Ԏs{j?8hAlVJoKwW{υw(8 L |qtX7pkSҾ) *}8X"^$.pVJb%{:&观iPYB'T> J}VP婩ߣFN pX v, RUDU"IVm8Wi p﵁aV&Eoul௯%?:%bVĪ0Z:B5w;>34(\ ^/SK=)bxw}t uDɣzˬhŃo)EOf`JK/FFn |:L^.oHhs$NUH% &PG3Y˕ ɨkJ[ q͑7RPV,6+0nLO9S =X?D.*cba9=x*8=%Q{6B(QRUZbI"Mg/7- ^Qd{p*RT(__ܼed Ft6wAUQe1κ_@Sꝣk؝PB[#Bb.5(@kCoC M @_n-zjCwT?ej1rCLd2S:a:=fdm$VU 8 ((:rI%U%'Px#_Z :7pq7XNz:~tz!i:(y17Y@7#{P?QR M{+:Ug {2!u^=GE;6~hu~4[YLe(#_\Q\x˽q3{u Pdr^i tf&yF^,7a  )֧E+kK\"WO-~^m"h0bʹt):^ʢ Ft79+:/;jzMjQQ4ؒP3*K۠y\RS@Ea,/Cp`Nxj`M<{n G7 JFW>sG&%/^u ,?tpjgၫ/ܪ%#A /4X%<׀9,dy7anlj @l#w1jLd+Zi0KBpq@8E8ۨJ6+#!YZ&L&h4Z]R'ǣH<].{}tP(7cpB{FAUBQ 9&،0NvRr[')i5;QS}6rA ;Ge|{=.=/^r7|]lPZ0@\\][?vz6AT"4kK'$eV $i?Dq|I '=" V ZR)(]Q#UBc`,m97x ^Wf>Fώ^}ѻkEYR'aǞ73.- |{64l}!`v0SBC6s"Ļg`*\%#ruz.;n3¨R!YEVA#.5ʌAcZzu*-y G7cG'Qyy F Mp+Qs"}#jC1kQ2U[M~@ayA+|)Wo 5)m  uo| =W'q87ҦۛL4 J>Q\XDn)gӘ06c3%1Lz D5 6: L r\;" T MFXhVKk Yku7ЌOI4-7MӍQ+J9v{- }n,*C":r ]Fآb(*:gi"Yivh]4 m _9s h=`;v6+*z+4.%]OP8pᠶA[w>AXLO%\>~*s 8#k~w(4 =ӭ!NBadʎJN+kw%I~$J zݿWȻKolܼy׼AhcΰÇ ͣ$$؅׫z68 %(~G/%0+'S4 j(0HzGЌ&,z/ S Nʏ+{jsNꇆ\G㭮pZH;^SOBsSjXru:4bJ]5A{&Bs6'kOnMicokp[<p8Prh Y.MO/L)_G/=_tAQrx}:q}Ykϥ vn|K1@0UfJ/\֪SJ\a8?e l1Ćʀ#0.l D~|Ѕh=. }sz5h!'ӳqkzфyXVE #$Dvh 9~fo y 1+^-trf_+ԛJK8@K]wלJj@]hN';2A3Nz߷4Y|̯~|w&Ho8dvٞAݢh*'MABl>ME'TUҪ蒕oD<;4yێ*qkf<8%k :4mb(#2x9E*O͵ϿP2@/=Ze,eNh5ym*TCje)zq3U#VGu4έ٪|COMOXN/ӓ^*Rn,Ha; 5i^Ss"5(V;=:+ىfYvbPQeQc`A#JPPԀ¹M>D^e͏zPo$2` گSQ鼸zc>Ҧ2jNM)a7$;T&QoSioEzE0>f4l3'-K[d(Lv/Pzkވ[hyҾ՟x^}7KSPk2ʤhOy ;NЛ̯*jnqՆ\| y77Ѭgnn ZZsyuF*W V}}RDeB"^QeZ@%h=eRmvd.knY*"f~}WhD\U(&̭4=J+aH^I#ZRVUo"(2,4 . *;057gwY~- zoF{CkfwXI4 khI:_>d]XJVa`tyƞRNzZ+%sG,,{C'qx ,O|hg( =֌|7 iث?I%[ ߳'/cc@ӏ8y$QJ\(Xc 'w8cd' endstream endobj 9 0 obj <> endobj 462 0 obj <>stream x}}PTeaM5`n#D@͠HH""H!,e ,.7}waY@>V%AR>3I R?KbDΘs7N{93w|,bY,6#fש&Vկ4m?ΖnKT5@7@INTcҳ5!Ea4iNSv˳|eʨm~d;jЂ.@4L~=fD<ȈO3h«^dG37N(FNPy$8]B_t \"d#2Kj^Q) <0?voQ +p8ЁQCkLSȂ8^9ŧS+s 0,rLИŔі2&oO+諛svIU俥/KAeg2 ܊P"ÚSls@K6oE/;YT9#נim-XO,yȳx5^}A J3WbdddH͚,Ҳ[m-g'x{hD^``&5k %Eg`^kZa-wrLНN? R_ɜ0^34MO4fs BL Ay>|hU+0U',qr #t+ nqЀN@> endobj 463 0 obj <>stream xcd`ab`ddds4T~H3a!k_nn? }=D19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;ML:)槤1000203100qƏ|bjIoo_o¢VMb)ݫ6Քtrd/mbMxuԝ]WS\V0}I'ͻxݚnUʪ[[ J[Z [Z#K4̝?or}7|מ?W3|uGCѶʹsϚ,;qʺ >ES֮;ayV8QP'ZR]3Ї%vMjh L樭rSO[;oQkC<ͼZri:/;20!ɏo-^cmoFu5>?ly?N`pq\kq endstream endobj 225 0 obj <> endobj 464 0 obj <>stream xcd`ab`ddds T~H3a!Rnn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##羗d|Sr -*sdaly?ξk'ι<<@Y\ endstream endobj 223 0 obj <> endobj 465 0 obj <>stream xMoLu;n&DDEEbñzr=zBKiR]۵l%NB226|151o|W͇$yIu_ڭkyNh=G;pIڝJ! k(/e:TgkkgYXqsĜ⛬(3ZD$6g/_HVrNNpqG]d6lkV6G L5 v vg NuDm'%ONFnER-}A)ϮdNľtkNZ,#v^EL&1Q򧭧̀Hz,E0o57Պnw`[Ї|0>J]YIޟ% uP`;&3.ScS\8N"2Uw?r ❫:uZ`!$Ǻ#ayfV+\8Pxhŗ >dk{Ws /Xats9=;>Ex#:F5\A)S_jfVjڼ_S#ji0<<aMx$OGS\= i/j>:l~>1@l~mh: k0RX ZzW+?)7-Ujw'Dgss;]P(@/[_I\d3MQOC 23RSS$3ZnTF=HPWgJdjǃ=2[9kUsD|6jetf@SB%l0Ŀ3 endstream endobj 61 0 obj <> endobj 466 0 obj <>stream xYy|SUOV\&[P;kM%͞鞶tIi -#[YDewy2(;eq{$mos= 7x^dєg¿>΍scq Ұ^)2㞸>_5ZehI<'%)Y5!nbԔӧMzgGHI͌Z+MNȈ?ңVJR 3ҬO?-ɞ}J4{(Y49jEBnBN~B|I4jilFB*-ʓ&D-'dƦg%nO'74=!775)6##63/7%)#6!+7%]9M src &[4ayRL򊔕Vɘ9F(<#eGy1yVVVV[ϋMm=ś{7,oo*Usży^-M-=cxxyM|os#ZA yu-aCV?GFF|8訄я>rOѽk墼&?xpl##/~M|㡎1ό)±?z -/ʖήw 6Nhc[?Tyf-#亠|+p!ل **c-++QL ZcAW%lbC`+q: zt} r|}Oy"X'=%|j'm8G:Vj2Bnnwb ET JjS[;.XzZJ @j=:w:օImS6,Ca3īE)%@<`A]q`;P^Ej>Te"z߆P/?Ӣih#2,GEUcKoml,kN2RR1{<7e 5ֱb@OLͰ]Ȩhr+ċ_bMi6Q xҤ6A!UIg@g>@,4.DH{޺-T7(3xt ֤+@N6 B"zM`OwExf&)y!ndP=sI/MշW/EH$,` LmL,[JU`,2,ֽ F"᭚[>? G0x%%*#*3kXb|DgUsMxI $PUvV^t4.gӎJ͐˅l[@0Qޖּխ$;e%+n WO'nHbAU.*:홃#:jq>:UTtY2Ifhj|[V^@ K}tVc};ṋ2:@DBh;莰_X93U؎WVz Y)YMC& e*T3x u2!0MROo&7|gi  ۭs~%Hc2a. 5#_b޺@FcՉj&~2Mppm zȘ|^pY\'iz]d].Su^%]#gCuҶ'n {|wڮcꁖZtӗ{krU@Z*K+gbJQwh?y}p0Y!E2'㓏/zRmK=mP[[R?_ tہbwT-.>ewHg#X![үbH/cqUۋ$@/9qτNw tΨ3I_RD4}D;j?vD/ˁ~[*;.$9V{2ruqY-n ݅V1 qS$9v+@ z{!Ul߅+KlHT~pѠ52Q/ji%v+]o(dcKe&Goy33hl#e;joX|SnN*%jT#?g(PP30MKRZ#-\\1zGڼf: 담t[josnu @w# {E$*i^nkY-D /jr߮g[o1{ȽA?)@p0q+`칌bm醸5) X ;!F eTԢ %hH#y j﹊2?pQ="rvIIQTnЦ],)f~ϡsa0Jz-PϞ[2'ʱ[Ȣ"2й'!P~+dp0LPZ{3rw5B6q:@´,WjMRYaVVC-8v"›?,fgb/8v'7w9]_|oCn Q0hT<aߝIjc! ?ʖal4wף52UᥒI&_$s͇<`&\d?$~XhX4hf7ZQLE-#m:0Uw3Yh5H eTS"Q\l? j_žX$~̿pR30M:L82S`;$ށΑM z[f # ~gU =LY b7;wƱ㓘[i\߇7#A.%2 %aJGNXEG'Y~^c6?[d/:e8(T \Y&۾K=etZ+eKs r"5닏v7phogP3z,)\Z=o}%^uӧhz~8ga.3ѣ6omXBXUAhAZ ^gs$sWܠNhV(]ށxW P_\zbV}@ٰ~̡sV)*I;rL*J¾ϳn==Y#bZ./t_lqvVwDkCUˆx(5#Hvt'.Ƃ ^gvf&v6m0$H}ޘJN%Iy;8Hkm9mww%VOE``URcx/pyg]A~?)e: o{V*x㵦ʖں=^g$Tg1bȪ㡴?=h v4KwnlּM$%S  zG;:l T6K;` L=+ݴ@ s˻~2f% i<:eN75R ?C1#n݇ACPN(.~ډY w>UP$^/ rԯ|Ur"3U#F.ee$6 ldMXtLJP\&W cHEzƢvZf9wK!P$D :ʼUfc .'y@yJ4S9:!G} "?T+bPQRU"s_^ZuM"m򳭒4{L [MX[4e?oVpN"i/U (=ԥ9r ү\FynWk/u0}Adˡ|w"N#@)jڮ h.}U@-V^+s~f- VBNG|,GU緹=b&OͦRSKSl |ǿ:&jʭ̬mjk"bk+'M"mh?.SVgXB"݁7\6RДp|{gW.מNLXxSgiYV2 IdT:[WCc5"7\Jy>ٴZhJ292ځx-GW^jo1kjAS0D Ao ~4'kΈe'ӫV=Y0Oat`׹b^DMU%^+p{-*\NՖ<`~/x[*E"|oƓ?@S};pJ7Խ죂umՊZQT}Y]yȚbzKmV7 -e|yͫ!Z_|jvhL;oe+CDLqMf7}aaf ayqKVXBW:zDI=Ԓ[pZ w2X/؃$9 E|(G/T_1y/g` )]򻂻to-;&v`ՁN{"qSt=3qz|<)] \Q]);MYRl40/P$݀Ƃ?%iL Ix0&RpSgQyW ۡ. .?\9zz~6 =U1XmkSi1oMOY/_ Bh|AJw>^}xmBŠrrPA& $xе߽FjLtYba"P1nv r^e8;44zi#;F羨 endstream endobj 201 0 obj <> endobj 467 0 obj <>stream xcd`ab`ddds 4T~H3a!K*nn;G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRx##֏_fn"˺//讖kV]Н{<_ ~+Og?uB e` [ endstream endobj 59 0 obj <> endobj 468 0 obj <>stream xYXWמEYGA GGѨPHoK]`u/.D ƮX,jZhb4hΘK ſ{==yeڋDENNS&k?ὄwLRL sk, 3 82CȤ6vg3e'LeA-P)Kj+%Q,5BYQ֔ 52QkIJ)z^U&&I&M?44͒^YA@10z>I}2_cmin0` ;x``t4I9>l6|C y`55gb]gPm܆U{:|po x_8KN#NԙbO9SW(s9W gpF W &pf *wQ?"_*T/c3e(? $jQ _E9ָ, "kא BcX^g# ]UG Di6'0]8@JGQ4gT9ڙ[+cr 5ӒF.R`vfU X7.t޴st,ԢјCV6ŦXD~,9gvwxꍛW&Or\`x+*FnUj~Yq*J*fxTsf2bBZt@.]ʒ-ߪ@ƒ- x0: B/O|6h;b&x:.j[gFdD6"}a>Põ.d搠[(c/^8s',qXczp|b@g_,%OҊqgcǛ4.0̾WBPBi @E$gY*8xIo+P zq5P1$eG _){`; C ̀3`<汸8+Y9{Ou"V; 6~7.a{jiKB QY_zaKR,"ގ" I.-ݞ\goC~7HV?]qAea5T)cڰL܉|O?e@=nkb`UNh󡞅[m^!p ରLi_Džsifr{D#^P<1sQp9?xXK&|n]^)+S ?^-\z8S=K?0ftpj ւ[%_xC|`,w/cψȉ2x͡ɱQGWb(< `k{PcAazOsMR T @0C<>݃Gq*=w#"4S8 F Z)+f=W1!`M?`3zs EMD{@Mo7fsnQ{<@C<3vBo= CXt` 3n]H+9Uj0 QD[\̡P(.e 'iu=H0#AK6#g7C2S$K ی<Ӑ1-]+ "TJnVopO-:E3zW,ZA'Wī+&AUu #8(M:;Z@yK"dv>; VY\ҽ"@ȸD.):|bf.z0(OW#ZUpk$r >çaF%~-bhTA aqK#9w|UK1kU&S.n0xB``\䖝PXPq^^qfSxI eIՅ5D, @nA] }ͪ陨KO>ɭ=Y b|)RQ^O teRAVJq7{\nuuGqrR>Ғۆa>|4i:TWbYzW_i]d6%>_-dcFe c-=WjN"RE-n, 95VEJ~ E4PM9ְ _`wX?,XT,!5<ٰ6-@ NF_bo]K V G8vmЩ0r&0RqK٬*4EΙu:nAw((9Q,3 ^";u%tF ,8XD(+8k7}evG󛚔|Mi>0C3\lx՟y U}['%)/oοs}1HQJ/rόHɋ)@DU7=ǝ? }DѹJcԁ# 7mE-LU|"= 1\“S3(N">41V{oCqL7v5BDk\5JB-0Ԥ#+7or^5_D7EKd~.%'ވ+CQrEȷ»̷>rb.W)vEcg.*.!X%/ɭ{,RbhoQv' AK i!!!!\77X Wݮj'o:>04Ym\MYu;8׺CrEܻV2);૎B+Î+br?*g$m] ݚqS'n@}r̐$ewd#|k L̝1oHx\y0D犗i+=4;ߧQr p!:dDer030I;Pk XuVo酇ĺS?b=e%٫M+XYQ2H x&h/ :Nk|Qe{oGsRk{;Ֆ?X#6?6ׯs8'?5j5FFc<{1Xpه}ft;4`}1XkaJʅ(}:]w~Yj'n*攲U?F~FYۭ5 :T[zImy jgp"a4d6|CޓȝŒ֎VG8pX.;o ?$q T;}^FF دejQ0; \#F] ++ClM`OZ0GZ-xK#([Qxv`czϧ7;դ'l23,Dg ^Y,KO˕֢\e73b}` @KW^ԞLZo7Ϯ5{[iFu JHJ'H&$`o{GHaD;vQs[{+g",z=ڝM<,,(1<&õ/IKKFᥑչDw]ܸqJ;'O\M_Ƅ9RQWXX]ζ͛V-5'Z_Y`ycQQvpmjS .JQ0Y{. *02>U/}#>):[݉v*T&7# N&#+&W]aHs&pGL6dh,`0Dp~m斦#cĨ$HB ֲeenIQNz$~nh{aӱWS+^! LP Uǃtw9vc4ݾu=<s}>:~AL}WxR aTc"iȟ'T봝,6(,&=05;Р1Ԍpvs8x;\n;v}À;?3w]e\=sӖlZeO3.i߀4;|*,s{X͗l^U#Wj'+NڝsC{xoG@(MsO[#] >۩OVX|y9txCҾK cN)0/ĺݷ}f߱N ?Qf=KVCWWe(<+{wWt$?aO?_wΟl5/l!447~) p?Lzl"yz #[ t!ڇJcO1Aa5ʲV ~ؙq`7=$z>y;6 vr9i9 B,D~:i>RVFBwR -hΓG$=q½9j.++hಡއ Th=DN*i=QH8%++PV5S(NvѶm'{~Վ. }oꎶwq_l\6~I~_l傡L#çw.کeߦQ_W,_3KGzT%?oJf̋F/6ӥXGe֣]^ }~3ۡDNjfԲqxG&]Zʘj2P]mA,DBID3EbI? $tOOeG2xTkn<\VznбqJFY(qZz0T0:#fa >deQt91;aF8%hwA)~(j[3 1d9-P R0՞̆ x0F*Uݕmj_4g-r>\SyoƼE7wͲ5 endstream endobj 174 0 obj <> endobj 469 0 obj <>stream x]mLSgP(.$Ɍ3dFэ6s*:PoRJ{n)}$|ĸdnSY0bdYV]r'9?98q]㽷i}f5Y$g\(`AA5UH_+`%bES'j[ZR]m#jjnH \T69H*PZn%ݱiZy{MFZHup \%hK/p_UuTI \M +"@`WK#ڹzmʰXwYXvO/bX9P{Fsi4;_='f0e4pBO4ݜyIaK=`gsoR* *"o:h-oUYe! ~k B\8oiZ [Z]b8bdvN)}yIaBcm 'G0D";p$V%J* \)u|(QxCF'2/i^ov{nM=vA)㌖ىV2awNID>>feW:F(cktQg@0xS$!7&\q6!iWZL]YjG2PE İ6)A%WcqС,~ &0zwT ͜ GC3_F!' eLe6 5hpu}#˛n.=>dzK {"'Rr0N6S3U[{Uh-Zʯhz$c<3s F[Zպwr&,f[ӈƿBx0잒L-;zaZ 8;>>{f-N#s`s86R"Ʀ? Βd.80I6i0o,em' <n endstream endobj 42 0 obj <> endobj 470 0 obj <>stream xV PSgO C^[}jk=:R۵j[T/\IA @BNII8hD[v:Zcw[]۝n >n켙I鴰Y4:%YZp'kR>wgEaZF-í?je/\:v}9WˎMa /eib:6{+VD^/ naYJVAl"-M-gg+xɜ]*pe,>-h4&TKJ_[]4Z*m3m1-NJˢ%ޤ%ޡ%6RhhӵtzTihaZ1a[¾m O XqG"?gܰ¹Cѓ@C?c3LUju9,&di5yMmCN3ۆÁ}G/6ˬJ!5D=G-1qȟ !:mCXm79Z8vuw+i&_䀠L"m&q3mjrJ.TB,:t#T\a\ JFA%zDtA0g,6CB.MM]}ۈ]Sp 0P(\HsC+jThD=h aN\olVpqf= F}HDy!Ob͗bb `R١@ሇQb%KPOLE?2hTZ캑ܣ3P'n 2rsd8QWIC ˴:LԡC~ 7 $E:szxoVz$r)1mh7sۮʬx+ ' 6'iFRric4z퀹3(  3hF(!Ŭh&A|)JQV;xU}NUBYa6H!X}}F_'j{%-؝z6؏ y}aS|9wnF_1)ȼ zCy!]x|N e(NgқZjJ\s&WI1z+|Y$fx 8bj5b٘NYz+=@99nQ,gʊKfB#Csa[60N#X>J #j21u[` <vz['KXBzx^jFɨ|`0? XzH%/4&(o' '1uztIm^QhxB[J 1P*.X!/N'9IbK&}A1h!mxT3䀥?f6зw?;kqѡBtoA#ǷU}]!O>N."]a #R'd]N_koqL\%.^) ߦz7IBJ/{hV>#->i[[(T., BAWe=fjyͪfQbf#:T 8bT(z>dSȭpkƐO(AקU{ ɩ^9K\1FY7>0CL;_l\Nب.pJ <Nj1j0Z 0V_EH\~g]1؋KK$ȗWky E54mF׬ #}W#a1Tq YK5C+nL(|ϧ tqr6%q Q83eژJJX+Lrڛ,>m]u`5$gd3]_(Z^2 RE F(Bxl.[c]8/3ʼn7M+[_o7w@ QUpKYCSPdE_;-1v $FaZΉLik(SS(BʈikNfX䢩3jhbjbqq?`tW6PJ#SRzlDh^TpiwC6`\E zs3`(gurdl|8,QʋnF[sKXH2Y2=0U"j$A=<~` ;H.); 7*mpe+Y=SQRFDdGtT`"eIo%Սfy2tg  txt*iI/1B AsI,bT§"oPP860Q ]d n 4zI.eœLx[t%[4&z-DY?^8*@ԇ[T:Z}N~wZK[;%7Tev7C:\5G)cݓ)c EC'D#gOM{lz&9J'6yxﺭ--?_Qd7971JGJΨ3 ӁFEJJSh6NA%RK,r9*[] qWWNnQj=zlzأpx>4$z=O~F)u_E`f&,Pb/Q"ܛߡGѳ( RAuWVT9ZZ*m"7=MĢzJZ 'ss{"{QQ4?r endstream endobj 152 0 obj <> endobj 471 0 obj <>stream x CMR5%;6/  y^WRmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR5.CMR5Computer Modern+12 P;zrp~oop}~poo}p<"jDKwz_̎Ťl!Y_ŋŋ‡ #Y!< ַ UaxM{7|Xͼdzŋ #(=)Wqlũ΋Q)7QK>JcmeuCnb  7 } endstream endobj 40 0 obj <> endobj 472 0 obj <>stream xX Xײq`EDi5=7qI1 l*6S Ⱦ, Qq&FM}Fc&zM59wn~>>#c 12_4}xqLO|Md(.C0Q#3r, $&`WDWֳ'ϰ6_onL_;y{G[ ִiaaaS]z=aywZ Pws`U.~Ǜ&oWHG}G?0s/ ٵym]В!B\]WFGXsZou>6.0VAc/f''KZg ] P:o%ľ ٿ-Gа.Μ^Y=6 ?aE'^*ŋʼǩIpuhhp|EIBR挆 mj]4qr?ߠP-m.f1&YFr y1GNw-Fyp򱳩8gU'i4F9CMwRZfɨx^\&^'4]|!mRCy  =ԛFB40Mp*EfORD5PRYiLFl1CF\g*XQ}z5L|ROPPZ;)(N+ʼn|v.h!+pw =Tn6. ,,q"%-bHg#fH E66t{fs2hvTwTEߛYCeS%U2pGTRV4)Oͨhmzbb]o򱹚0UTuMnt&̪ R)f"5@z,T)` JMN@&wNb#:۽9\t|eT%ڮtiu_#i7ǒ!NI^=DB%7V#O+k -GKW)GeME7u nh!ox"#$FOwe)nr_+=8_K\iTQSn;&Ϟre̜MvT&=Mc$$*Wɀru76.B9m-܃p؅翑oM٫dC<{{Z=(L8B|4^ fiJN*Β 8э:$A/3q.O> R<'9ڢbmJЂ J˫"\Tk{Mm[Voedx%EU=AsW[w߿՚>~>nYęIF/5t06m:]Lgzţr;pN۽D%j8׀{VfЉ[Rsx~^G࿟oEBxD!=pjBC٨瞽~ ݆E4<}(!bw7 R\;OzTcÂpMBF74V@Gн QƓHӬifJD.vcbcPoYQrTW"dmg0| 5Ջ}uc/N(?Z6?k)-+R>Cwɓ[r!-4}:T7HhDqK>ɍ_? SWG G fe4%;Ĥfl%MV|C" oJz˚e"gFY=$93իy'_bAlүg$_,9CC~XaaTuǾU''&SFq3Τǿl[W_Qif< [v@=1Ғb ܊O:zow=]bƕw ۫3sWWm r_=}ĥۋ>IA{XˀlMs ?\Omwݣ%$1eaϽ%+`lu*TzLXQ\/,fܕ&RRӀ:9NIu%KD_L}fw׺bG  Me1.#2M2DQDSvn)O,Z kxkt+\qt"I Mp0Rڞhj\yshd~7V7o-Mwl\UJGbh0H[F7E6nb?Kޥy9G9htQ֎C sU>~[+ nbژtevrZ> endobj 473 0 obj <>stream xeoLuh'b'*fzl3nd8`tvpk 1럧p-W +--L(llL|DؖhLw]®17O'><qs ?X` "jR,_oV/]"7٥rt)aMڝ}iy5HyH}n71޿K_+J. zͧ ^uXw8 a8x24vk.x2 f7v!TyƋ ip綃3v%m49Β:C@g>s'F9~<'_ 8N/n41pg{-k̑EL- u~!&2+ᅆ:si3;TpðÉքqQKPiM!7.] endstream endobj 33 0 obj <> endobj 474 0 obj <>stream xy \S׶J<'88TZk눢ℊ*  !d%̣2LAĈ󬭭ֶzV;XvhAg"az1]iG[{qDK!]M2:S̡>2Rtp@F*G- v̙3&Nuti;?'g2?@N}"bmyk<_ 06?'',vQpPr@۞ 80$2'vYOX0 9/ٸ09lQ%DE{xn[g\WX-p8~O8eӦ1͙o`Q f4ìbf2g0㘵ƌg1'fld21gf2qd3S%Tuf)3yθ0˘rMcz3}@?X0A%#g3<3bf(3LGҗq1a̘{^ z]J3[d`ǼU)ڱj*G'{?ۿڢEo0XiHV~p'5wVV?[k˭?en9|1xD;Bb#ťR1sܗq iDOkU:u.pQfq}spH}h#źNqc3Hf>6h/{x|+(#u$FfiI}z`2zyJN߈<ȝ=o\К>}XX5W ia nCmdX2/ܝ_oEEeKhVxG"։}y,ťӲYlZ6^8.miB"wd?][|ob:lG7YѣVK2,ďT- a qdyq,!ǷqOq@ OpQQ~He#U~6qӀ0D.XtTF5$;SrȏMhRwV.;l1=D'Dz\8ي4]\b iid(fÌ.O¹Ld_Gs<3FnNԒqAb0[brTNp-'d󺥻tP6k; !*[2fqKMQt*E+a|f>"BF QBW,̍<~mNCd]c&6P%dex]J,^Q|`P ^r X܀w`<٨rr/>@;}<ùi}bx $-`˦ů/B|k[+,)(M,Q<Ă:!j@68cOڠ(yu>nT #NCEG{I1.YWNʠo2bi1p:/eDJ'NĦ <+.1^X8Qaҟ3v)>^贔Y8zY9Zy+>ќ%o ;tc ]V~F Z|/hyGW^[N;ö .E/ݥڈU/ lY|CS8 8ڽ'5*dTݤ75Bܠ2-x$ˊ_4s &[%+ ՊXSeh [-\ VRhkVT$:o2D Ֆ$.A 6RrRALSP\hw@!]3x1\iDohiJ8jcc|;q' 4@19hX )WbĥYt17B.Ry7fgws9#OA>cwZfFI6QEϿ^s~=̝mg$+pF6L 0آҙ–תSZMFp$qlfVK)ޫ{5t+ +b)̂J7{v鬔vF].vj!=whjJV"D 猲:M x>{Erh@ QXhZzNت'uɍJ*-}EIG=yNe4⊃8`Y f X66(UDHT,Q9  #"M1+)U9">i𧙳PMrSءp`쇂<30Vp ?091lԒQ>3JKR'jyCKrr?ut @(-C5o1B.ѽ&ąX_6O鲡.h*K>]n1Jb.ۧozh4tZJqWp8c뱑8g.HX`:<&Iߒ4ߝ`CPx4Co:^{Ҭ&[Y}&y7hfEqd*Y ʟÌj" A@}lsK2{N!I*K Wt)`B]jf~Vu 4q {b.ݾp~<HL턃%Nc5Q½}"m9bD| 8\n.HjӅPM1)*폝|SZ]xK;-B/5O}Jj"i 3 "`uZCML x8:ej)pQbMדBYX/k]oeo^߾dh`0FFa4E4ZVtk)R z*wA%jkU[9 πw1)J)6P.BV]rb tYʡ6~#Zdş~Iwް.g0b7u2X=Q<^{j8jF2X5y!o3+j <Tq bi)+(+X1$vj U:݁̽z8\\)9{º-RmVB$@aK:>^s*u[N(sN6 "CqjҲHӤǫQ\#hsR`?;Rٰ7艕ΏNYkw1'I;[kwG #Ti#6%1P)tJp:+7>\Z/_H5އ-45sTE[#R?vE 1HhEd)W?!!k$l ہ0ĜDZeYFݵ׸]__P?xObx`!!# 8h}+JCWu׿lK^WdXIM c޹a kHأ8R_ӤkR@ŅWZ:iso[Y9o̚^^)dT;BBƖDSpCwtsԫKV!]5W eP;'BRա9,^K~tJh/#qI[Dm E=0`ze˴q}#y <pQC7O}ww;;h^9V8Lx'oߤ) tVa֤-o8ШtPtOzJPRS@_ Wm E3!̈u% o:a%Gcaq~& Qn%%ډSy2n[Flv='ëpм decK!LasecccJ97_RV;h\2RmdGꞖvwOz}npQ μO[ҷ:*I.vjtz1y;[ U[Sud7$,XJK+a7',?:\,ufm~MFJaxhI&stYT" nw!eg2iH/r';8 . GH⺳bKq&?4tF\r:/)O j.%w  ШmԘƱJCf5yZR{$SCaR}DLu^j48ӑ":zzq4:LF3F)ʿ\9C&MltC 2鴇 [61[kNM7e_X$/6+졂p/t?L={~݄+Us]M,)bonP!ə>0 \pM$;zpwn!}qF$|NN_Y=&1lX=NP$V[gqw&LȬ϶$O>"ɉsكN5:uῦ(|FiyӴ4Pȸ uҸm?~n~۽JD_µBc8DA^Kp`/ޭA6W=.V drq@5^7'WKʁ+,VgN񻧫K+^RtД+В n$@ٰL!4!露@WzPi8]93~ft? x EѦqBđS ,TgkAc#?j!N8PáښS[ѣ $cIo #K#Bz"RI2' ;*T"YJW0cOQ_Q_Q)2ʤLm+MѮȀ4z^> ?2G/*#ÒAO]گPGh4BrjCRVԞ svT鱤/H&:ɅIeeVX]!&JE}J>r@UJߵK%t ғ@Z=ʒ9a ~eScÏZL%*Ғq:*LcI'FVW%J9?Y;UF^ZK[cʷnIcں] 4pMOe){=v'KYƝ7p =y3q [n%B|ėʶ{g oTWGdž@ _|}W<$[Yo.245Eq("H iϹO*B[P3Ƴ`̷ΧJ1InC _Pzh∇,},ms\r >-.܅Rlٚ2 8sǘps+/6rƋw~ooRhn(P sC}trid2j[d(9p71G^D'ݒE;`s.cg&E%wQb/Oz%+c co#T콬,6_GgJtSU]*PPkB`;F%q#Cz(w4{Rٹg1=.qJ_)l9j*ф%h6[>&'OdoVW_؞r23`g,WʂBٜlFE-@~ D~ endstream endobj 118 0 obj <> endobj 475 0 obj <>stream xUmLSg/-)2?r lTt[tLFfkL3J)^@"o[ BuNc9 &5m0f14pc<} K)~GsssqOnbB\FRGDmQ<_[ףq ǨOsroJL&&2&q0MqAkz4^ a'AcqIa =kD዁,+@? QCnC|l=!p_ӄpn6>V1/t~tS(z$z=1ǔuOI峻1z[>n^mm}Ef ^{ lN|V&m&)$tߑ.H!է.bW?Z}3? nPVӑhrb^H^('Q?8p(Đc$lp: pni| PpuJ C#8ӯ3 Ol~N8))([6ӯlAHu_p)isІvcv<ֲ6kʒV,Ixrs9~z6K='kӮMLSWb7  endstream endobj 26 0 obj <> endobj 476 0 obj <>stream xu L[`u3:4ZFAX.m(B&Vb`km ،6!% MvCZ u6mn*I5t`4~DeAɶ3ͯ;H~gpx EP]yit+<[e$ C //{s#FϬxHWq}ƆfcjV+N*}Y) *wh~R0GSX>)ImV(fwjE9j87dV' =j^il_xOi4,=guHjz@7kjC=8&S0hցM`4i:Wg0u^qJkTԪuWzFŠ7锦> doBQugU?L4-Htf#$!%d#dL2!D%h'DtžpHCU5kV$/Y|QfeU3>xOzV~P4_ɕ0,q1H@ǍJK(Sg :\N4?`q]3 g*B,CWpWrtiAlySeh< 鍂:}U.\rpr3u7+qk$|h.PJXPw]+"󿓹&='0[Z؃Jcqv:N!9JI|Cy_'s  f㶺)(izn62A#(K<]9UrMQݒx.}>Hq')xӋ,> RL⊆ R\ K.?Zׯ@ kG1}[pX6 > )Mo܉eiG$χ×iAXW()RAPw#% T8+P'R4Uj-=*f|B r  "3:Oa; ܊˯ ,4e 4~M~p&Ԣ_920Q51ޑDm먾|u0': endstream endobj 24 0 obj <> endobj 477 0 obj <>stream xztWä́+@F {1 ܋p"\IH&۸!-&$$I4mzhШ~& J!G"4h:(!QfM2ItDGwe23I/QInS=("5]:ȡDٸlt,1X`áؙuWCȁ}pU:p`ҭ ֐T5h 0/+wئ=@!y_ XZ)'(<Qj.h!`Jϙi_R(/pwkJO![V|xQw.u)~_,AhcS޿!d/~t}bOV# br!+A$59`VͻGԎ6>&zNB`Ag$d $p[4n><ŏ*< On$x3ma&Qm{cߏ@_ʒJķ:zf][ UpDEm{"polpw2:\Ģpȡ#\>;No @zƖG,hWlV*)C$׹^$R( B3bE8UjHqǻJ&L%Q ` mGzwٹcPA`Dh(Ńd# Ι Vn Yf_ѝ1Hۨ0-,^sȟޓlď<ν73C7#C*50:!4GKCQn_FIH14jBcM: yEԆHy"ߧ#104Yn2Ju>+Bj}10&Q0tw[~P-?z}Ţ^4XpdeKHYsP[ -pZ=k }S#! 6KMuu5n<]FىyЌtބvxICMؠNZt7Nz4H.]nOӓv妡0+ ؖdF2zSG(BYXl=WQ@LFKyMYՂl~`>Ϗ&Kvyeg.oq wQZNC()2ɏֆNSAbT$%+Ggx_qpT"WZ-<$5'Q/kϱ<`r H:QWiZU}_',qo,N^6#qԟd<݆c)TV" 7+w& 3zlF3/s,f0zfh# G/NY J.a6[q~Ow?ڼk\Y䧜KF7|~֨'v@UQ25Uh'~ "Ԏ*B24KN<3aJ!xv 鷷-7]qC_usS$x =&q8쫮EHj_wD6#o#Sfq= ;n{g){fA/Fwٜ, %Bpخ隔MdB!{ g;ިN^@ulR@:U&:+s./@1rȌצ@TJPo~YЊzw8Nܲn|k+s/ϮI4d n-sdEWڙLm =tUjQGKXREVM>A0 8Bu|ET5ެ @ꉪ U i8aҧ响ѕlvqKAQ#jt 7,r,]Wn2c+O~xhvmC4e"_U1-%9^&T3M$_oWm\$PSY]O߮T5#:I)Zf̻qd p f#qwlh8|6IZ7,Zfg=rˢCvHؤT|;KO#8%ؐ^D:Xd_4nKo],#2̂|^#D-(ݳPE@u()FmB, zb+f;1" 3(GoCD YU@>:}YeZjMUѥ(cMϿ-+%KN Z ȆfumOڈJ.ÌȧGןEu8+t>2MvaAF|(m˕A=bmXDy69FV"@W|xv JZժ ];7 V7R2sl{y ddždoKgn(7|#KEYn,K SIV;)l ZiW}bԪX퀅ȨU.l2@1gH~hL!-!~x2H#f-Ԝmb28"R{\ɓ-LM&0dK Mh9o硔BZY]/tNxDL83\֡~I$ *WqA&#7N݋Il_+j;FF%g:J:[M!b P$|FH xu]vzRwwt^tUSW 4ijEhyƁdLFA }L=ɳSL43*kBp]gd 1>&}Qɸ.W̐z&::8F#q@5UnvIԨ)2 O B[U;a'lu)8H:] 4yF;ⓓ/YAehn`A^Eu" ?lxL8 |6HXMKVSTɐ[6)#$RieJQO!XbNEx<~{Y7OB R4ME. ÎA(hK'Jl)+٢d_ |~>>ڧ+".QaLDqdUMɧ~lazV |tp!p:fmGHyԈvf*/Pz΢|!ߨր0]؃!ցNJ&RfҌe1s}Lh-S7џC#}p:=@ .2}T;i}7! L" Dv,eK:5߱e熎!Dvlv/¦O5g ]m%:/E)W]xZuI0Yж[?Yo!+*CY%($?;D_>_fs\^vˡҿJ`p!$'6[@*@M8,I_re IN6NWe_{ * \dE֣랓`|_X9OejhyUHOAΝd]Rd|z3뗎](`@2ڋDy[_(SȒlnj QJ&5CMԨl - iЂFeiYC>  RdeA>S]'ǗDXl2j"hJKmȰG-hBDxa|t-*> %߉ 2 $x#[M󯢸o -K P+'5ZĪ=߭gLBZF󗯐$&/Pβa#C]L:272>I.*Z >?$rcd3>*\6VUrhm^ ~8%Dwp*KLS ;x@yU4! hwRcb1JDZK UzC#1<јZhrQ~wGOI%E^c%KK'Jƅy~r⿵iB$6c _lVW}\+AU-~I<79>x~ %tUL̽)掠^Hw׵"@}Z(ؖ1/=noGz ߂Mb,mՋ ,29\!IQz=ZArGOȕ;[Y,յ mxZj  ׇV\{es^Dk@ZatJ뼐vɱj ŷ*}臻-6&E9<b eŵ׷͝nE2z\5VϞ*ZF,xD.'RX) D)2k$ǼDg}6[ PkZB"7Xn?YTAr5MPΎ+.} \v$Mǿ٢h)A*=KgDT ;RKs!Z ^/pf3 ,%IIJyi De9y鹹:Bk=Ly;";(wCYvf*1alx>H:gﻗ#1°ۺ}e VpÅceÅQ`,'*hlYܸ.J&>!W`lh#˦?0<,"s/q2o__wcz2L8k_ _ZkR=lwr}uZ!>&!1xDob[l3wuAWҐZ]闢+X)`}w{[f_!N(QEhM(-05).5e Q՗T^ɮ ~'9O Rh/z~Yu3/;bΪ9;Q5f3qC i=.Z* ܶCNQR!E$F)eA OeӢx WJNIF4]'=Z84|0CW@3N~I;ɾmqps]N\ZV_?1䷑d&+-/D!%)Wl^ߣFd(ꞽ~΢3`j[/6zy}j~ S&&L^^xwVCO'JtQ7#ow) 5wniR1tOC*%ITBw8bq$Zn(a~vMzm[ϛᔓF;wB֥͙Kl 3tMдui3d_e۸(Clf;^]u0V:`i?}WvN9?Rȥ}K%֟ ö٠ˮ)1Ic Ȗ8ARGdSovq<\"f4͉9 ml,lsMp,t|TuxOA1;J\ӗvfƎ1S9kE$?pͮa$.\x_oyCN`D>:Lv[H゚e330gǬD=g ˶OUGS1HkªODtjZ[^??+/VE lS8P3.hpof<~8 Yҭd||!-R%C$HcK[_2"O\=]cN~ST~ endstream endobj 96 0 obj <> endobj 478 0 obj <>stream xM[OGg8HVpCwWBIVʅjF$',xuwll˰cNZI(/u?@>D"4љotGF\V.@G|E Un֚)d$cuW>.pB %;/ <;c>[?KCC 'ó6vil,#.}?E:aE;= ?L79Hߵ:99s"ӣûYaV#

y;Vs"Kл<'%aJeFdQ;&$dXXZy k/AwY Q@➷~򩹝FE~?"cc{ccBbLIIʄ^UO$kaΖֳZ9\5R>%,%fb4)eU.kry}uRpe#dD ?Is}5Œgᱣ^P;h]) XW_DUGPӫǞ^u4Su$Tkz*t64>kFm= OQ endstream endobj 17 0 obj <> endobj 479 0 obj <>stream xkHSq]QOAv9;ЬI .EB wr϶JDݿ,-JIӦSiDJ#C&#/ϗ}Q0<7r(+-v~vC%⑍ Hơm@a& JjUX3::.,j s᜴,#C2꣩irX팞>i6qteHҘYKXbH Ȁ$\A)ʰ!m+`ǽ}!a#No,UX!}$6o5QAiҩy8y8 x? X}C?Xb@]D(*]7 뛮HR{d`94OM$sA^ޱG×٧!>}$Er-nkSK[#yaB"@K)BT`C Fl5N*P"RU|bg_( 3)DQk.owtAMBb2d;]_鱴7CkݰJ/ƃE?dA!/aj$z:RQ&{c8+m^O W{ A|<@;}RA׍ccKFwb) endstream endobj 89 0 obj <> endobj 480 0 obj <>stream xmTLg땯Dm^D3Yܔu Ԩ0F(PB{宴'A?ڍ *6@ JYpe6&M1f31{?vdrO{y7GSZ E42|-UQzHP>)RIp6*qYrV239vh+8fjTPc,lVWqن*|FYmK嫌ʸ*YEpZVcѷI;\Vhʭ(}K3WRP5zJQ۩T!Jr jJT}RZJ~MƮ9h;s_Y@ &)A,OJT u؉kp#n+'HB[-Žw9N,4pXmmyωY,KW/iz9h>0\Fj)Or;voشymYvb0I'إ|ŵs:@Drø5Rщ@!<--'0+كiUD)\agÐ<2ٜE|n2i.ʦx*;gRi ('ecQ9y{;;uGvL͆ YP/նQ)|xˢ!uۄ۰]u1wс:Nv*XPSh󾦯#>‹q?>KS7y8p7aߠMjQL`S"]:ynxaAϑ> endstream endobj 15 0 obj <> endobj 481 0 obj <>stream xJQFdv6 +Mj 827&"QpanDn`mtħ~.RDJ/nӋv0ޥg9-NJ+]ە/} ojk-ǨE;L(JK;V [lŢgdl&Ty,Κ s瑗ٕ]Z8[%ZCp)v;Up4k AB_R4~ NGh?~_;-B?#@8yz0aNCBІ hylcs~9am$> endobj 482 0 obj <>stream xX TTW}EI"~F1hѨqFEb(@T%2SQ FDcMwLmN׬[:ݫ뱪`{=>gfd2%kϱLo'V?0c<b,tœ5dQYK1qa!*שn/ϝ묙3. v] P?"]aAdש*U̼^JJJ?C5)L>(>(.1h2eum@Tͷ%ʨUPha/^\,^21)`6A!ü6DDF1}/zymf"3YǬg)f#Lc|Mb]f 3̼,e1˙Jf*3d0kΌ`F1ь#3ˌc~33herYz{vX{}WMܳN៌X5:r;~Q 9jFO>u̶1NNNN?6dqIؿ*eIWHunA:z9;&q\v GG&ZY] Z^tr&i2՘ q6?ؔzBvIf;GH<& (`Xd82F]K)xc-(,p⮼"f2a55m8ԃ=Lq%#gVmH^؟G?k n$?ܿg賂ŧ`M!!\rW𿿾qQpcݛr<+or9Hr'6df炊lL75UtFXWoJ?( @\HbkPX=h=2|_=+Z5W.@/\t+ayl M2#܄W ECg yk-zE$C) f "Ѕ~.. Zw[CJ,fgx9XneP4v W()Э.->"4bGXr̖{ ׄFbZK飁ZF!;6mB|:-飇g=ԥ{igg2m7qV69"챝HlMAa&Fg2+`']@`eH bpY0W4ȹ8m'mJ(e,M3-`pzV5e72}ɮSP/~%(es'K=A栃.R<ݖ ʄisc};Eih:C /?j4m;͛;CeBddf{.rxYiT(Yd\_qr ޶PvYh[bJ+ ƦVsM7g.r㵜m@-]t Z7lcl7'ZmG@[y" 6E7>Kä 2P\Lm\Ӊ8H28't PhB^c pkfƩ8鳓JN@r˪Qx&f~c!l-&:cX:']ҟمO/riI@- ]1 PNƮ18 [}8g@_K/S 6?&Și#3F3蓆"uiF&/_#LN-[u(Z9/Aۍ]áLЩ8G2S"qĥom;XhW=sP[$$@[ܼ欍67&8V\qj fZ0ZG}Ga4,).9G>7=,V[ %Wd쮬2?_!n-M]-к$1!.7a)>'}v|vǮ8^#Ӷ܀+~πo껌*X`)o+x1! 6RF%Kq) )6~+"Y/SZ'Zx؂ֱ8geH="n7\惁0.Дuc8VXs["(O,Oz ;tA pL7[wBEj:di%lC8w&bvTYWh(ѵ /"與4:܆99HOUsxt*"%Yb4JiP!tdUq(1Tܥ|Z><'t-,wswqQy-(ty?)ڔWF'z{jubG;=!\d$UYMa[x:#( Zj'}Hy (]:}iPrgRGO7o~~q_޿H"ImJ| 4lְ>Q WtnЯ؃؉6)հuE%h$o hMa85rD8g)g8Ie=؋' `RXTTT i\u0H5ze*\$rhhCׯȰuytѶy=mg%_T!U0 |epڑs6m]u쿀C~yU&hh4ኴxPLP%"|U#}d{HKo͉/^&wx]P^eTȇZǑܱC:9caqv껛rr,qU@8EgF?B_b | : )MSouN%/wCYwuyS&~CZ:`L)ÑSPU1s}yumU{ B˥ MG(x}d%2sDE .Trܑ^9Kb+>0>3n^;.[445XU 1ʔ@?A|u[+/OY.ug&[0)fo銨L N]1|9wT1*RY[C#ްX%?O?KBs v%Rg ӧ9fҝjgT5[7%{=)fmI}7˩uT=|ISϑbED>Eu5#!t^>UfID OfK6BOpԈ# KPYNAX#^79 .W;b endstream endobj 13 0 obj <> endobj 483 0 obj <>stream xW XS׺=1sDD%^{BEتhiEQԪ8 2K L aN'<Q&DDDk[mkjj{Nھ/w>{-ӗ)!B І cmG#Hu%B(yn4yf͟;nU<3S ?v[e^>(o+!K̉6[&[>m]DnOYngimMopE#(jƪ`cmeohP9 ]F'bǢ|Y<#=^qA[!ig$t@Un]@o`"bY50z4ڊ;Fə+ vop W Ȍ2)8e9h F]5* >`6[sXhDxBJ_I-8:%XJ?]/ H"[H,b?NE#S4x' ]5n۴rCK{olnJYJm;mvb9[}f[5e5Imͩ:`,5ze@G8|r#ϸ - LA{<NC4+?;7 %&܂U ZA XDUbJ/Eͺ\Q { f:s_r9:!|ށ3 zXZA#kd6le!P (b-'NUC̥|=ıȷ;=JK+n8UBv<Ƴfn3ž^|ÚW8l6qZvw=)r&!}5~@[dQ?FyLr`'`^Qg5Hxݜ;b?cO}=^A9BSDOPTCz|s`'g'.[kȆ&X! qo=^9_WSzU7HbaT25>5q N 0QPӣ:>2{050355%o,cfјqI#hDN 9Ś;YpMEsow^,8Z0zA]" Nٜ<ҙxg"%^lae>+mF"8$YIt}B&؝x4&DzKfmu?"!+@u}o'жv8=5+{ ɏ D2iؔLedv0G?^QJF3~3GubNv1+B_&H0 At IZ`pL~NW"=HsvgOS <ώ JW eSψ \Շ4nb[{n!rsR]H̀>&j=mzu󪬔̄xURF0yZEÁ.Ehclࢧa`ZD:Y|[pdA?hUr$Pșв(}miYMm6a !P/=JD wf_,?=șGص_DX~U^eDzmA'.Ͼ3ڊQz΢\jt9e9#P}$!{E3!ӄD$e4LJNYXPp=#r5,l$8kCVQHU FO2y5'_UhO@1)AuN8&?M[ B\%7WWכ-s WѝB/d^̵W!̌)\Z6%H:v!;.IKbr .qz͝-#EQD樏h5 qڽrrL,!Af9FH+YZm~WP{Mw߰'%ι9?7 (!5ROZÉ":4t:Uj㉊ Uph"-5!B>xX~%6<=WW @(.( dkp_NKOA#^Azz zOh=]LVJzR>stream 2017-09-29T14:35:55-04:00 2017-09-29T14:35:55-04:00 dvips(k) 5.995 Copyright 2015 Radical Eye Software saclib.dvi endstream endobj 2 0 obj <>endobj xref 0 515 0000000000 65535 f 0000341362 00000 n 0000459337 00000 n 0000340690 00000 n 0000327627 00000 n 0000000015 00000 n 0000001544 00000 n 0000341428 00000 n 0000355026 00000 n 0000389618 00000 n 0000352381 00000 n 0000367449 00000 n 0000366211 00000 n 0000453141 00000 n 0000365434 00000 n 0000447544 00000 n 0000364994 00000 n 0000444940 00000 n 0000341469 00000 n 0000341499 00000 n 0000327787 00000 n 0000001564 00000 n 0000004238 00000 n 0000363413 00000 n 0000434636 00000 n 0000362657 00000 n 0000432259 00000 n 0000341573 00000 n 0000341603 00000 n 0000327949 00000 n 0000004259 00000 n 0000005114 00000 n 0000360648 00000 n 0000422871 00000 n 0000341646 00000 n 0000341676 00000 n 0000328111 00000 n 0000005134 00000 n 0000007620 00000 n 0000359722 00000 n 0000415312 00000 n 0000358988 00000 n 0000411292 00000 n 0000341719 00000 n 0000341749 00000 n 0000328273 00000 n 0000007641 00000 n 0000010270 00000 n 0000341814 00000 n 0000341844 00000 n 0000328435 00000 n 0000010291 00000 n 0000011285 00000 n 0000341887 00000 n 0000341917 00000 n 0000328597 00000 n 0000011305 00000 n 0000012378 00000 n 0000357305 00000 n 0000401887 00000 n 0000356412 00000 n 0000394485 00000 n 0000341960 00000 n 0000341990 00000 n 0000328759 00000 n 0000012399 00000 n 0000019066 00000 n 0000342055 00000 n 0000342085 00000 n 0000328921 00000 n 0000019087 00000 n 0000025227 00000 n 0000354425 00000 n 0000381452 00000 n 0000342139 00000 n 0000342169 00000 n 0000329083 00000 n 0000025248 00000 n 0000027298 00000 n 0000353572 00000 n 0000372957 00000 n 0000365676 00000 n 0000448186 00000 n 0000342256 00000 n 0000342286 00000 n 0000329245 00000 n 0000027319 00000 n 0000031757 00000 n 0000365159 00000 n 0000445943 00000 n 0000342373 00000 n 0000342403 00000 n 0000329407 00000 n 0000031778 00000 n 0000036078 00000 n 0000364445 00000 n 0000443763 00000 n 0000342556 00000 n 0000342586 00000 n 0000329569 00000 n 0000036099 00000 n 0000040051 00000 n 0000342717 00000 n 0000342748 00000 n 0000329734 00000 n 0000040073 00000 n 0000043766 00000 n 0000342847 00000 n 0000342878 00000 n 0000329900 00000 n 0000043788 00000 n 0000044913 00000 n 0000342944 00000 n 0000342975 00000 n 0000330066 00000 n 0000044935 00000 n 0000050362 00000 n 0000361565 00000 n 0000430180 00000 n 0000343041 00000 n 0000343072 00000 n 0000330232 00000 n 0000050384 00000 n 0000055204 00000 n 0000343239 00000 n 0000343270 00000 n 0000330398 00000 n 0000055226 00000 n 0000058845 00000 n 0000343380 00000 n 0000343411 00000 n 0000330564 00000 n 0000058867 00000 n 0000063852 00000 n 0000343510 00000 n 0000343541 00000 n 0000330730 00000 n 0000063874 00000 n 0000066410 00000 n 0000343664 00000 n 0000343695 00000 n 0000330896 00000 n 0000066432 00000 n 0000069490 00000 n 0000343829 00000 n 0000343860 00000 n 0000331062 00000 n 0000069512 00000 n 0000075156 00000 n 0000360293 00000 n 0000421551 00000 n 0000359548 00000 n 0000414468 00000 n 0000343981 00000 n 0000344012 00000 n 0000331228 00000 n 0000075178 00000 n 0000080376 00000 n 0000344183 00000 n 0000344214 00000 n 0000331394 00000 n 0000080398 00000 n 0000088183 00000 n 0000344337 00000 n 0000344368 00000 n 0000331560 00000 n 0000088205 00000 n 0000097243 00000 n 0000344515 00000 n 0000344546 00000 n 0000331726 00000 n 0000097265 00000 n 0000104741 00000 n 0000358162 00000 n 0000409615 00000 n 0000344667 00000 n 0000344698 00000 n 0000331892 00000 n 0000104763 00000 n 0000109725 00000 n 0000344843 00000 n 0000344874 00000 n 0000332058 00000 n 0000109747 00000 n 0000114439 00000 n 0000345019 00000 n 0000345050 00000 n 0000332224 00000 n 0000114461 00000 n 0000118485 00000 n 0000345219 00000 n 0000345250 00000 n 0000332390 00000 n 0000118507 00000 n 0000122032 00000 n 0000345349 00000 n 0000345380 00000 n 0000332556 00000 n 0000122054 00000 n 0000126199 00000 n 0000357071 00000 n 0000401322 00000 n 0000345457 00000 n 0000345488 00000 n 0000332722 00000 n 0000126221 00000 n 0000129063 00000 n 0000345670 00000 n 0000345701 00000 n 0000332888 00000 n 0000129085 00000 n 0000132490 00000 n 0000345800 00000 n 0000345831 00000 n 0000333054 00000 n 0000132512 00000 n 0000134714 00000 n 0000345941 00000 n 0000345972 00000 n 0000333220 00000 n 0000134736 00000 n 0000140749 00000 n 0000355856 00000 n 0000393317 00000 n 0000355623 00000 n 0000392753 00000 n 0000355452 00000 n 0000391841 00000 n 0000346082 00000 n 0000346113 00000 n 0000333386 00000 n 0000140771 00000 n 0000147146 00000 n 0000346321 00000 n 0000346352 00000 n 0000333552 00000 n 0000147168 00000 n 0000148389 00000 n 0000346473 00000 n 0000346504 00000 n 0000333718 00000 n 0000148411 00000 n 0000154679 00000 n 0000346559 00000 n 0000346590 00000 n 0000333884 00000 n 0000154701 00000 n 0000163412 00000 n 0000346726 00000 n 0000346757 00000 n 0000334050 00000 n 0000163434 00000 n 0000170038 00000 n 0000346965 00000 n 0000346996 00000 n 0000334216 00000 n 0000170060 00000 n 0000176375 00000 n 0000347132 00000 n 0000347163 00000 n 0000334382 00000 n 0000176397 00000 n 0000182088 00000 n 0000347347 00000 n 0000347378 00000 n 0000334548 00000 n 0000182110 00000 n 0000184758 00000 n 0000347477 00000 n 0000347508 00000 n 0000334714 00000 n 0000184780 00000 n 0000190698 00000 n 0000347596 00000 n 0000347627 00000 n 0000334880 00000 n 0000190720 00000 n 0000196125 00000 n 0000347774 00000 n 0000347805 00000 n 0000335046 00000 n 0000196147 00000 n 0000198363 00000 n 0000347915 00000 n 0000347946 00000 n 0000335212 00000 n 0000198385 00000 n 0000204125 00000 n 0000348056 00000 n 0000348087 00000 n 0000335378 00000 n 0000204147 00000 n 0000210829 00000 n 0000348197 00000 n 0000348228 00000 n 0000335544 00000 n 0000210851 00000 n 0000214830 00000 n 0000348360 00000 n 0000348391 00000 n 0000335710 00000 n 0000214852 00000 n 0000215625 00000 n 0000348457 00000 n 0000348488 00000 n 0000335876 00000 n 0000215646 00000 n 0000221752 00000 n 0000348532 00000 n 0000348563 00000 n 0000336042 00000 n 0000221774 00000 n 0000231037 00000 n 0000348675 00000 n 0000348706 00000 n 0000336208 00000 n 0000231059 00000 n 0000238133 00000 n 0000348829 00000 n 0000348860 00000 n 0000336374 00000 n 0000238155 00000 n 0000240784 00000 n 0000348992 00000 n 0000349023 00000 n 0000336540 00000 n 0000240806 00000 n 0000244016 00000 n 0000349089 00000 n 0000349120 00000 n 0000336706 00000 n 0000244038 00000 n 0000247169 00000 n 0000349175 00000 n 0000349206 00000 n 0000336872 00000 n 0000247191 00000 n 0000248298 00000 n 0000349261 00000 n 0000349292 00000 n 0000337038 00000 n 0000248320 00000 n 0000253644 00000 n 0000349347 00000 n 0000349378 00000 n 0000337204 00000 n 0000253666 00000 n 0000257816 00000 n 0000353942 00000 n 0000374820 00000 n 0000349464 00000 n 0000349495 00000 n 0000337370 00000 n 0000257838 00000 n 0000263318 00000 n 0000349574 00000 n 0000349605 00000 n 0000337536 00000 n 0000263340 00000 n 0000267304 00000 n 0000349684 00000 n 0000349715 00000 n 0000337702 00000 n 0000267326 00000 n 0000274111 00000 n 0000349805 00000 n 0000349836 00000 n 0000337868 00000 n 0000274133 00000 n 0000277594 00000 n 0000349924 00000 n 0000349955 00000 n 0000338034 00000 n 0000277616 00000 n 0000280942 00000 n 0000350034 00000 n 0000350065 00000 n 0000338200 00000 n 0000280964 00000 n 0000283610 00000 n 0000350151 00000 n 0000350182 00000 n 0000338366 00000 n 0000283632 00000 n 0000284390 00000 n 0000350248 00000 n 0000350279 00000 n 0000338532 00000 n 0000284411 00000 n 0000284619 00000 n 0000350323 00000 n 0000350354 00000 n 0000338698 00000 n 0000284640 00000 n 0000292029 00000 n 0000353181 00000 n 0000372240 00000 n 0000351868 00000 n 0000366718 00000 n 0000350398 00000 n 0000350429 00000 n 0000338864 00000 n 0000292051 00000 n 0000298711 00000 n 0000350552 00000 n 0000350583 00000 n 0000339030 00000 n 0000298733 00000 n 0000306364 00000 n 0000350671 00000 n 0000350702 00000 n 0000339196 00000 n 0000306386 00000 n 0000310864 00000 n 0000350856 00000 n 0000350887 00000 n 0000339362 00000 n 0000310886 00000 n 0000312778 00000 n 0000351008 00000 n 0000351039 00000 n 0000339528 00000 n 0000312800 00000 n 0000314590 00000 n 0000351127 00000 n 0000351158 00000 n 0000339694 00000 n 0000314612 00000 n 0000317190 00000 n 0000351213 00000 n 0000351244 00000 n 0000339860 00000 n 0000317212 00000 n 0000319390 00000 n 0000351288 00000 n 0000351319 00000 n 0000340026 00000 n 0000319412 00000 n 0000321301 00000 n 0000351363 00000 n 0000351394 00000 n 0000340192 00000 n 0000321323 00000 n 0000323281 00000 n 0000351427 00000 n 0000351458 00000 n 0000340358 00000 n 0000323303 00000 n 0000325621 00000 n 0000351491 00000 n 0000351522 00000 n 0000340524 00000 n 0000325643 00000 n 0000327605 00000 n 0000351555 00000 n 0000351586 00000 n 0000366957 00000 n 0000367786 00000 n 0000372469 00000 n 0000373254 00000 n 0000375385 00000 n 0000381859 00000 n 0000389892 00000 n 0000392073 00000 n 0000392964 00000 n 0000393553 00000 n 0000394857 00000 n 0000401533 00000 n 0000402476 00000 n 0000409855 00000 n 0000411569 00000 n 0000414695 00000 n 0000415703 00000 n 0000421794 00000 n 0000423299 00000 n 0000430682 00000 n 0000432684 00000 n 0000435219 00000 n 0000444053 00000 n 0000445169 00000 n 0000446218 00000 n 0000447767 00000 n 0000448549 00000 n 0000453502 00000 n 0000351619 00000 n 0000352274 00000 n 0000352827 00000 n 0000352928 00000 n 0000353467 00000 n 0000353849 00000 n 0000354917 00000 n 0000355359 00000 n 0000355769 00000 n 0000356044 00000 n 0000356904 00000 n 0000357218 00000 n 0000357799 00000 n 0000357892 00000 n 0000358551 00000 n 0000358660 00000 n 0000359414 00000 n 0000360208 00000 n 0000360560 00000 n 0000361154 00000 n 0000361263 00000 n 0000361943 00000 n 0000362332 00000 n 0000363080 00000 n 0000363970 00000 n 0000364179 00000 n 0000364825 00000 n 0000365581 00000 n 0000366126 00000 n 0000366615 00000 n 0000457881 00000 n trailer << /Size 515 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 459542 %%EOF saclib2.2.8/doc/saclocal.dvi0000664002275300236100000000745414017255270015014 0ustar wcbrownscs; TeX output 1998.07.08:1344l'&B9>DtGGcmr17Addendumto7tthe-SAqCLIB5_User's7tGuide2!", cmsy10_0XQ cmr12AndreasNeubacrherfj+yJune26,19926iX?DtGGcmr17