Builtin functions

	There is a large number of built-in functions.  Many of the
	functions work on several types of arguments, whereas some only
	work for the correct types (e.g., numbers or strings).  In the
	following description, this is indicated by whether or not the
	description refers to values or numbers.  This display is generated
	by the 'show builtins' command.

		Name	Args	Description

		abs       1-2    absolute value within accuracy b
		acos      1-2    arccosine of a within accuracy b
		acosh     1-2    hyperbolic arccosine of a within accuracy b
		append    2      append value to end of list
		appr      1-2    approximate a with simpler fraction to within b
		arg       1-2    argument (the angle) of complex number
		asin      1-2    arcsine of a within accuracy b
		asinh     1-2    hyperbolic arcsine of a within accuracy b
		atan      1-2    arctangent of a within accuracy b
		atan2     2-3    angle to point (b,a) within accuracy c
		atanh     1-2    hyperbolic arctangent of a within accuracy b
		avg       1+     arithmetic mean of values
		bround    1-2    round value a to b number of binary places
		btrunc    1-2    truncate a to b number of binary places
		ceil      1      smallest integer greater than or equal to number
		cfappr    1-2    approximate a within accuracy b using
				continued fractions
		cfsim     1      simplify number using continued fractions
		char      1      character corresponding to integer value
		cmp       2      compare values returning -1, 0, or 1
		comb      2      combinatorial number a!/b!(a-b)!
		config    1-2    set or read configuration value
		conj      1      complex conjugate of value
		cos       1-2    cosine of value a within accuracy b
		cosh      1-2    hyperbolic cosine of a within accuracy b
		cp        2      cross product of two vectors
		delete    2      delete element from list a at position b
		den       1      denominator of fraction
		det       1      determinant of matrix
		digit     2      digit at specified decimal place of number
		digits    1      number of digits in number
		dp        2      dot product of two vectors
		epsilon   0-1    set or read allowed error for real calculations
		eval      1      evaluate expression from string to value
		exp       1-2    exponential of value a within accuracy b
		fcnt      2      count of times one number divides another
		fib       1      Fibonacci number F(n)
		frem      2      number with all occurrence of factor removed
		fact      1      factorial
		fclose    1      close file
		feof      1      whether EOF reached for file
		ferror    1      whether error occurred for file
		fflush    1      flush output to file
		fgetc     1      read next char from file
		fgetline  1      read next line from file
		files     0-1    return opened file or max number of opened files
		floor     1      greatest integer less than or equal to number
		fopen     2      open file name a in mode b
		fprintf   2+     print formatted output to opened file
		frac      1      fractional part of value
		gcd       1+     greatest common divisor
		gcdrem    2      a divided repeatedly by gcd with b
		highbit   1      high bit number in base 2 representation
		hmean     1+     harmonic mean of values
		hypot     2-3    hypotenuse of right triangle within accuracy c
		ilog      2      integral log of one number with another
		ilog10    1      integral log of a number base 10
		ilog2     1      integral log of a number base 2
		im        1      imaginary part of complex number
		insert    3      insert value c into list a at position b
		int       1      integer part of value
		inverse   1      multiplicative inverse of value
		iroot     2      integer b'th root of a
		iseven    1      whether a value is an even integer
		isfile    1      whether a value is a file
		isint     1      whether a value is an integer
		islist    1      whether a value is a list
		ismat     1      whether a value is a matrix
		ismult    2      whether a is a multiple of b
		isnull    1      whether a value is the null value
		isnum     1      whether a value is a number
		isobj     1      whether a value is an object
		isodd     1      whether a value is an odd integer
		isqrt     1      integer part of square root
		isreal    1      whether a value is a real number
		isset     2      whether bit b of abs(a) (in base 2) is set
		isstr     1      whether a value is a string
		isrel     2      whether two numbers are relatively prime
		issimple  1      whether value is a simple type
		issq      1      whether or not number is a square
		istype    2      whether the type of a is same as the type of b
		jacobi    2      -1 => a is not quadratic residue mod b
				 1 => b is composite, or a is quad residue of b
		lcm       1+     least common multiple
		lcmfact   1      lcm of all integers up till number
		lfactor   2      lowest prime factor of a in first b primes
		list      0+     create list of specified values
		ln        1-2    natural logarithm of value a within accuracy b
		lowbit    1      low bit number in base 2 representation
		ltol      1-2    leg-to-leg of unit right triangle
			         (sqrt(1 - a^2))
		matdim    1      number of dimensions of matrix
		matfill   2-3    fill matrix with value b (value c on diagonal)
		matmax    2      maximum index of matrix a dim b
		matmin    2      minimum index of matrix a dim b
		mattrans  1      transpose of matrix
		max       1+     maximum value
		meq       3      whether a and b are equal modulo c
		min       1+     minimum value
		minv      2      inverse of a modulo b
		mmin      2      a mod b value with smallest abs value
		mne       3      whether a and b are not equal modulo c
		near      2-3    sign of (abs(a-b) - c)
		norm      1      norm of a value (square of absolute value)
		null      0      null value
		num       1      numerator of fraction
		ord       1      integer corresponding to character value
		param     1      value of parameter n (or parameter count if
			         n is zero)
		perm      2      permutation number a!/(a-b)!
		pfact     1      product of primes up till number
		pi        0-1    value of pi accurate to within epsilon
		places    1      places after decimal point (-1 if infinite)
		pmod      3      mod of a power (a ^ b (mod c))
		polar     2-3    complex value of polar coordinate
			         (a * exp(b*1i))
		poly      2+     (a1,a2,...,an,x) = a1*x^n+a2*x^(n-1)+...+an
		pop       1      pop value from front of list
		power     2-3    value a raised to the power b within accuracy c
		ptest     2      probabilistic primality test
		printf    1+     print formatted output to stdout
		prompt    1      prompt for input line using value a
		push      2      push value onto front of list
		quomod    4      set c and d to quotient and remainder of a divided by b
		rcin      2      convert normal number a to REDC number mod b
		rcmul     3      multiply REDC numbers a and b mod c
		rcout     2      convert REDC number a mod b to normal number
		rcpow     3      raise REDC number a to power b mod c
		rcsq      2      square REDC number a mod b
		re        1      real part of complex number
		remove    1      remove value from end of list
		root      2-3    value a taken to the b'th root within accuracy c
		round     1-2    round value a to b number of decimal places
		rsearch   2-3    reverse search matrix or list for value b
			         starting at index c
		runtime   0      user mode cpu time in seconds
		scale     2      scale value up or down by a power of two
		search    2-3    search matrix or list for value b starting at
			         index c
		sgn       1      sign of value (-1, 0, 1)
		sin       1-2    sine of value a within accuracy b
		sinh      1-2    hyperbolic sine of a within accuracy b
		size      1      total number of elements in value
		sqrt      1-2    square root of value a within accuracy b
		ssq       1+     sum of squares of values
		str       1      simple value converted to string
		strcat    1+     concatenate strings together
		strlen    1      length of string
		strprintf 1+     return formatted output as a string
		substr    3      substring of a from position b for c chars
		swap      2      swap values of variables a and b
			         (can be dangerous)
		tan       1-2    tangent of a within accuracy b
		tanh      1-2    hyperbolic tangent of a within accuracy b
		trunc     1-2    truncate a to b number of decimal places
		xor       1+     logical xor


	The config function sets or reads the value of a configuration
	parameter.  The first argument is a string which names the parameter
	to be set or read.  If only one argument is given, then the current
	value of the named parameter is returned.  If two arguments are given,
	then the named parameter is set to the value of the second argument,
	and the old value of the parameter is returned.  Therefore you can
	change a parameter and restore its old value later.  The possible
	parameters are explained in the next section.

	The scale function multiplies or divides a number by a power of 2.
	This is used for fractional calculations, unlike the << and >>
	operators, which are only defined for integers.  For example,
	scale(6, -3) is 3/4.

	The quomod function is used to obtain both the quotient and remainder
	of a division in one operation.  The first two arguments a and b are
	the numbers to be divided.  The last two arguments c and d are two
	variables which will be assigned the quotient and remainder.  For
	nonnegative arguments, the results are equivalent to computing a//b
	and a%b.  If a is negative and the remainder is nonzero, then the
	quotient will be one less than a//b.  This makes the following three
	properties always hold:  The quotient c is always an integer.  The
	remainder d is always 0 <= d < b.  The equation a = b * c + d always
	holds.  This function returns 0 if there is no remainder, and 1 if
	there is a remainder.  For examples, quomod(10, 3, x, y) sets x to 3,
	y to 1, and returns the value 1, and quomod(-4, 3.14159, x, y) sets x
	to -2, y to 2.28318, and returns the value 1.

	The eval function accepts a string argument and evaluates the
	expression represented by the string and returns its value.
	The expression can include function calls and variable references.
	For example, eval("fact(3) + 7") returns 13.  When combined with
	the prompt function, this allows the calculator to read values from
	the user.  For example, x=eval(prompt("Number: ")) sets x to the
	value input by the user.

	The digit and isset functions return individual digits of a number,
	either in base 10 or in base 2, where the lowest digit of a number
	is at digit position 0.  For example, digit(5678, 3) is 5, and
	isset(0b1000100, 2) is 1.  Negative digit positions indicate places
	to the right of the decimal or binary point, so that for example,
	digit(3.456, -1) is 4.

	The ptest function is a primality testing function.  The first
	argument is the suspected prime to be tested.  The second argument
	is an iteration count.  The function returns 0 if the number is
	definitely not prime, and 1 is the number is probably prime.  The
	chance of a number which is probably prime being actually composite
	is less than 1/4 raised to the power of the iteration count.  For
	example, for a random number p, ptest(p, 10) incorrectly returns 1
	less than once in every million numbers, and you will probably never
	find a number where ptest(p, 20) gives the wrong answer.

	The functions rcin, rcmul, rcout, rcpow, and rcsq are used to
	perform modular arithmetic calculations for large odd numbers
	faster than the usual methods.  To do this, you first use the
	rcin function to convert all input values into numbers which are
	in a format called REDC format.  Then you use rcmul, rcsq, and
	rcpow to multiply such numbers together to produce results also
	in REDC format.  Finally, you use rcout to convert a number in
	REDC format back to a normal number.  The addition, subtraction,
	negation, and equality comparison between REDC numbers are done
	using the normal modular methods.  For example, to calculate the
	value 13 * 17 + 1 (mod 11), you could use:

		p = 11;
		t1 = rcin(13, p);
		t2 = rcin(17, p);
		t3 = rcin(1, p);
		t4 = rcmul(t1, t2, p);
		t5 = (t4 + t3) % p;
		answer = rcout(t5, p);

	The swap function exchanges the values of two variables without
	performing copies.  For example, after:

		x = 17;
		y = 19;
		swap(x, y);

	then x is 19 and y is 17.  This function should not be used to
	swap a value which is contained within another one.  If this is
	done, then some memory will be lost.  For example, the following
	should not be done:

		mat x[5];
		swap(x, x[0]);
