# Copyright (c) 1993 David I. Bell and Landon Curt Noll # Permission is granted to use, distribute, or modify this source, # provided that this copyright notice remains intact. The following calc library files are provided because they serve as examples of how use the calc language, and because the authors thought them to be useful! If you write something that you think is useful, please send it to: chongo@toad.com {uunet,pyramid,sun}!hoptoad!chongo (David I. Bell does not currently have an email address) By convention, a lib file just defines functions, objects and variales. (The regression test is an exception.) Also by convention, the a usage message regarding each important object and function is printed at the time of the read. This message printing may be disabled by assigning the global value lib_debug to a numeric value > 0. bernoulli.cal B(n) Calculate the nth Bernoulli number. bigprime.cal bigprime(a, m, p) A prime test, base a, on p*2^x+1 for even x>m. chrem.cal chrem(r1,m1 [,r2,m2, ...]) chrem(rlist, mlist) Chinese remainder theorem/problem solver. cryrand.cal shufrand() sshufrand(seed) rand([a, [b]]) srand(seed) cryrand([a, [b]]) scryrand([seed, [len1, len2]]) random([a, [b]]) srandom(seed) obj cryobj randstate([cryobj | 0]) nxtprime(n, [val, modulus]) Cryptographically strong pseudo-random number generator library. deg.cal dms(deg, min, sec) dms_add(a, b) dms_neg(a) dms_sub(a, b) dms_mul(a, b) dms_print(a) Calculate in degrees, minutes, and seconds. ellip.cal factor(iN, ia, B, force) Attempt to factor using the elliptic functions: y^2 = x^3 + a*x + b. lucas.cal lucas(h, n) Perform a primality test of h*2^n-1, with 1<=h<2*n. lucas_chk.cal lucas_chk(high_n) Test all primes of the form h*2^n-1, with 1<=h<200 and n <= high_n. Requires lucas.cal to be loaded. The highest useful high_n is 1000. lucas_tbl.cal Lucasian criteria for primality tables. mersenne.cal mersenne(p) Perform a primality test of 2^p-1, for prime p>1. mod.cal mod(a) mod_print(a) mod_one() mod_cmp(a, b) mod_rel(a, b) mod_add(a, b) mod_sub(a, b) mod_neg(a) mod_mul(a, b) mod_square(a) mod_inc(a) mod_dec(a) mod_inv(a) mod_div(a, b) mod_pow(a, b) Routines to handle numbers modulo a specified number. nextprim.cal nextprime(n, tries) Function to find the next prime (probably). pell.cal pellx(D) pell(D) Solve Pell's equation; Returns the solution X to: X^2 - D * Y^2 = 1. Type the solution to pells equation for a particular D. pi.cal qpi(epsilon) Calculate pi within the specified epsilon using the quartic convergence iteration. pollard.cal factor(N, N, ai, af) Factor using Pollard's p-1 method. poly.cal pol() poly_print(a) poly_add(a, b) poly_neg(a) poly_sub(a, b) poly_mul(a, b) poly_div(a, b) ev(a, x) Calculate with polynomials of one variable psqrt.cal psqrt(u, p) Calculate square roots modulo a prime quat.cal quat(a, b, c, d) quat_print(a) quat_norm(a) quat_abs(a, e) quat_conj(a) quat_add(a, b) quat_sub(a, b) quat_inc(a) quat_dec(a) quat_neg(a) quat_mul(a, b) quat_div(a, b) quat_inv(a) quat_scale(a, b) quat_shift(a, b) Calculate using quaternions of the form: a + bi + cj + dk. In these functions, quaternians are manipulated in the form: s + v, where s is a scalar and v is a vector of size 3. regress.cal Test the correct execution of the calculator by reading this library file. Errors are reported with '****' mssages, or worse. :-) solve.cal solve(low, high, epsilon) Solve the equation f(x) = 0 to within the desired error value for x. The function 'f' must be defined outside of this routine, and the low and high values are guesses which must produce values with opposite signs. sumsq.cal ss(p) Determine the unique two positive integers whose squares sum to the specified prime. This is always possible for all primes of the form 4N+1, and always impossible for primes of the form 4N-1. surd.cal surd(a, b) surd_print(a) surd_conj(a) surd_norm(a) surd_value(a, xepsilon) surd_add(a, b) surd_sub(a, b) surd_inc(a) surd_dec(a) surd_neg(a) surd_mul(a, b) surd_square(a) surd_scale(a, b) surd_shift(a, b) surd_div(a, b) surd_inv(a) surd_sgn(a) surd_cmp(a, b) surd_rel(a, b) Calculate using quadratic surds of the form: a + b * sqrt(D). unitfrac.cal unitfrac(x) Represent a fraction as sum of distinct unit fractions. varargs.cal sc(a, b, ...) Example program to use 'varargs'. Program to sum the cubes of all the specified numbers.