1.0.1
	First released version.

1.0.2
	Fixed a bug in mp_int_div() which would yield incorrect quotients
	when the divisor was very close in value to a prefix of the
	dividend.  This is now fixed, and there are regression tests in
	the tests directory.

	Added recursive multiplication and squaring (Karatsuba-Ofman) for
	large input values.  Integrated these with the existing code for
	exponentiation, too.  See the code for s_kmul() and s_ksqr() in
	imath.c.  Tests added and verified against GNU bc.

	Added documentation on mp_get_multiply_threshold() and the reason
	why it exists.

1.0.3
	Fixed a couple of bugs in pi.c that were causing incorrect values
	to be computed for > 30 digits or so.  Added a pi-computation test
	to the default test suite (make test), checked against a static
	file computed by bc (set scale=1024, compute 4 * atan(1)).  Added
	command line option to specify output radix for pi.

	Cleaned up a sign-related bug in mp_int_gcd(), which would cause
	the sign of gcd(0, x) to be incorrect when x < 0.  Test cases
	added for future regression.

	Fixed a bug in s_reduce() which would give incorrect results for
	powers of 2 in certain circumstances.  Added tests to drive this
	case for future regression.

	Added mp_int_exptmod_evalue() and mp_int_exptmod_bvalue() to make
	it easier to work with small bases and small exponents.

	Set default recursive multiplication threshold to 50 digits, since
	this seems to work best for the platforms I've tested so far.

	Added iprime.h and iprime.c to the distribution.

1.0.4
	Added `findsizes.pl' to the distribution.

	Revised the type declarations in imath.h to use 32/64 bit
	operations where the "long long" type is supported.

	Fixed a sign-related bug in mp_int_invmod().

	Fixed several small bugs related to shifting which affect the use
	of 32-bit digits.  Many architectures cannot shift by 32 bits at a
	time (e.g., MIPS), so I split each of these cases into two shifts
	of half the size, which should scale properly for both the smaller
	and larger cases.

	Fixed several arithmetic issues with 32-bit digits that arose due
	to missing type-casts on the right-hand sides of assignments.

	Fixed s_print() and s_print_buf() to handle the sizes of digits
	transparently.

1.0.5
	Updated the Makefile to include the _GNU_SOURCE macro.  For many
	GCC systems, this is necessary to get the correct definition of
	the ULLONG_MAX macro in <limits.h>.  Also, you may now build with
	the make option DEBUG=Y to enable debugging, e.g.:

	make DEBUG=Y imtest

	By default, the Makefile builds with the optimizer enabled.

	Cleaned up the definitions triggered by USE_LONG_LONG in imath.h,
	and added an #error instruction in case the build is unable to
	find a definition of ULLONG_MAX or ULONG_LONG_MAX in <limits.h>.
	Also added the mp_int_to_unsigned(), mp_int_read_unsigned(), and
	mp_int_unsigned_len() prototypes.

	Fixed a bug in s_qmul() [imath.c:2493] that would grow the value
	being multiplied even if there was room in the existing digits to
	hold the result.  This was driving an (apparent) bug in the more
	general mp_int_read_binary() routine.  Added the routines
	mentioned in the previous paragraph, and factored some common
	code out into a static s_tobin().

	Added reset_registers() to imdrover.{h,c}.  Added new test
	driver functions test_to_uns() and test_read_uns().  Renamed
	test_read_bin to test_read_binary().

	Silenced a sign-related warning in pi.c (related to printf).

	Added many new test vectors to tests/conv.t, including the
	original bug proof-of-concept from Tom Wu, and a series of new
	tests for the unsigned conversion routines.

	Updated `doc.txt' to reflect the changes described above.

1.0.6
	Updated copyright notices, added LICENSE file explaining the
	license I am using.  This is basically the BSD license, so
	you should have no trouble incorporating this code into other
	open source projects.

	No new functionality in this release.

1.0.7
	The mp_int_invmod(a, m, c) function would compute a negative value
	for c when given a < 0.  I added some code to insure that the value
	returned is always the least non-negative member of the congruence
	class, if the inverse exists.  A test for this was added to invmod.t.

1.0.8
	Fixed a small buffer-overrun in s_qmul().  Because it only
	allocates an extra digit if it absolutely has to, the test for
	whether it needs to carry a shift out into the "spare" digit had
	to be written carefully; I missed a subtlety, which is now
	fixed. Along the way, I fixed a minor performance-related bug in
	the same routine.

	Added mp_int_error_string(), which converts mp_result values
	into descriptive strings.  These are statically allocated, so
	you don't have to free them.

	This version also adds an "examples" subdirectory.  Currently,
	there is only one program there, but I will add more examples as
	time permits me.  You have to read the source to understand them
	anyway, so I won't explain them here.

1.1.0
	Added imrat.h and imrat.c, containing routines for rational number
	arithmetic at arbitrary precision.  Added support to the test driver,
	in imath.c and included various tests in the tests/ subdirectory.

	Fixed a sign-of-zero bug in mp_int_mul().  Tests added to mul.t to
	regress this fix.

1.1.2
	Fixed a bug with leading zeroes after the decimal point in the
	mp_rat_read_decimal() function (imrat.c).  Along the way, I also
	found a sign-related bug, in which -0.5 would be treated as if it
	were positive, because the sign of zero is implicitly positive,
	and the denominator is treated as unsigned always.

	Thanks to Eric Silva for pointing out the leading zeroes bug.
	The solution isn't the most efficient possible.

1.1.3
	Rewrote mp_int_to_decimal() to support new rounding modes.  The
	modes are documented in doc.txt.  Some of the code sucked anyway,
	so I rewrote pretty much the entire function.

	Added new rounding mode constants.

1.1.4
	Added mixed rational/integer operations:
	  mp_rat_add_int, mp_rat_sub_int, mp_rat_mul_int, mp_rat_div_int
	Added rational exponentiation (with integer exponents):
	  mp_rat_expt

	Tests for same were added to the tests/ subdirectory.

1.1.5
	Added mp_rat_read_cdecimal() and mp_rat_read_ustring()
	Updated the input.c example.

1.1.6
	Fixed a bug in mp_int_read_cstring() which would read the string
	"-0" with incorrect sign (MP_NEG instead of MP_ZPOS).  This would
	violate an invariant that zero is always signed with positives.

	Added some tests to tests/neg.t to catch this case.

1.1.7
	Fixed a bug in s_udiv(), internal to imath.c, which caused
	division to fail in some corner cases masked by the use of long
	long as a word type.  As a result, s_udiv() has now been wholly
	rewritten.  I also fixed a few lingering buffer-length errors in
	s_kmul(), and added a "const" qualifier to the input buffers for
	the mp_int_read_string() and mp_int_read_cstring() functions,
	and their analogs in imrat.c.

1.1.8
	Added mp_int_alloc() and mp_int_free().

1.1.9
	Added mp_rat_alloc() and mp_rat_free().  Fixed a couple of minor
	bugs in the doc.txt file.  Added mp_int_sqrt() to imath.{h,c} and
	doc.txt.

1.2
	Dropped bugfix component of revision number.  Fixed rsakey.c
	example program to be complete and work faster.

1.3
	Replaced findsizes.pl with findsizes.py.  Fixed two bugs in the
	rsakey tool that were leading to incorrect output.

1.4
	Fixed a bug in mp_int_alloc(), it was not returning NULL when out
	of memory, but rather failing in assert() instead.  Also, updated
	the documentation to have better language about the return values
	in various error conditions.

1.5
	Changed the API for rational rounding.  Removed the two functions
	mp_rat_set_rounding() and mp_rat_get_rounding(), along with the
	round_output global variable.  Redefined the MP_ROUND_* constants
	as an enumeration type (mp_round_mode).  Added a new parameter to
	the mp_rat_to_decimal() function to accept a rounding mode.  Unit
	tests and doc.txt updated suitably.

	This release also incorporates a small patch submitted by Jonathan
	Shapiro to support compilation in C++.

1.6
	Defined default_precision and multiply_threshold to be constant
	and static.  If IMATH_TEST is defined at compile time, these are
	made global, and can be modified by the caller (the imtimer tool
	makes use of this ability, for example).

	Implemented a single-digit optimization suggested by J. Shapiro.
	Documentation updated.

1.7
	Fixed a subtle casting problem in the use of the ctype macros that
	would permit negative signed character values to produce illogical
	behaviour in some configurations (e.g., NetBSD).  Removed a dead
	"return" statement.

	Added the -pedantic switch for gcc, to get more aggressive
	warnings; to permit the nonstandard "long long" type to still be
	used, I also added -Wno-long-long when building with long long
	enabled (the standard configuration).

	Fixed a bug found by the Samba team running Valgrind on the
	Heimdal project, and reported by Love Hörnquist Âstrand:  One of
	the intermediate values used during modular exponentiation could
	be overflowed during recursive multiplication.  Fixed by taking a
	more conservative approach to buffer sizing.

	Added a "contrib" subdirectory, whose first entry is a Makefile
	to build IMath with the MSVC++ "nmake" program, contributed by
	Matus Horvath.

1.8
	Fixed a bug in s_udiv() affecting the computation of quotient
	digits.  Thanks to Love Âstrand for isolating this bug.  Also in
	this release, defining USELLONG=Y or USELLONG=N on the command
	line for make will switch support for the "long long" data type on
	or off without having to edit the Makefile.  The default is still
	to permit use of "long long", even though the type is not standard
	ANSI C90.

1.9
	Increased the number of small primes used for primality testing to
	100 from 32.  Removed an unwanted #define from imath.c, left over
	from testing; added "static" to the declaration of the s_embar()
	internal function since it is not used outside imath.c.  Reduced
	the quantity of feedback generated by rsakey.c during the prime
	finding stage of key generation.

1.10
	All primes less than 1000 are now used in iprime.c for preliminary
	testing of prime candidates.  Removed declaration of s_pad() from
	rsakey.c example.  Added imcalc.c example.

	Beginning with this release, defining the DEBUG preprocessor macro
	when compiling imath.c causes all the normally-static helper
	functions to be exported.  This makes it easier to troubleshoot
	bugs in the back end functions without manually editing the source
	till you have found where the bug actually is.

	Fixed a memory leak in the test driver (imtest.c) where the input
	buffers allocated for test specs were not released before being
	released.  No impact on the core routines, but nevertheless not a
	good thing.

	Fixed several uninitialized memory reads and one subtle read past
	the end of a buffer in s_kmul(), found during a run of Purify.
	Thanks to Love Hörnquist Âstrand for finding this one, and
	providing a good test case so I could isolate the problem.  Also
	fixed a buglet in s_kmul(), in which free() was being called
	instead of s_free(), which would break if you provided a custom
	version of s_alloc() and s_free() for your application.

1.11
	Those functions which take int parameters to supply one or more of
	the arithmetic values of the function have been converted to use a
	typedef "mp_small".  This is defined in imath.h, along with some
	supporting macros.

	Added mp_int_to_uint() and mp_int_lcm() in imath.{h,c}, based on a
	patch contributed by Hal Finkel.  Added LCM tests as as well as
	some more GCD tests in tests/lcm.t and tests/gcd.t

	Also at Hal Finkel's request, added mp_int_root() to compute the
	integer nth root, i.e., \lfloor a^{1/b}\rfloor; replaced the old
	mp_int_sqrt() function with a call to mp_int_root() via a macro.
	The new implementation is probably slightly less efficient for
	square roots, but more general.  Added tests/root.t and moved the
	sqrt tests there, also.

1.12
	Added a new global constant MP_MINERR which is the value of the
	smallest error code defined by IMath itself.  This can be used by
	clients who wish to define and use additional error codes, so that
	those codes will not conflict with the existing set.

	Extended the imcalc example to include memory.

	Fixed a bug in mp_int_add() in which -1 + 1 = -0 (the sign of zero
	was recorded incorrectly).  Added tests to the regression suite
	for this fix.

1.13
	Cosmetic change -- updated all the files with my new web address.

	Fixed a buglet caught by Love Hörnquist Âstrand using the LLVM
	static checker tools, in which a mp_int_copy() failure would be
	silently ignored and cause an extra copy to be generated.

	Fixed a bug in the testing suite while building on MinGW.  The pi
	generation tests compare to static files and these tests fail if
	CR/LF is output instead of just LF.  The test script now strips
	all CR and LF from the output and compares to files lacking them.
	Reported by Chris Cole <cjcole@gmail.com>.

1.14
	Instead of using the preprocessor to delete "static", the static
	definitions in imath.c now use an explicit STATIC macro, that is
	made null when DEBUG is defined.  This avoids a subtle problem
	with static variables defined inside functions (although no bugs
	actually arose from it).

	Fixed a bug in s_udiv() while building on MinGW.  When building
	with short type digits, the routine was incorrectly discarding
	overflow when computing the next quotient digit.
	Reported by Paul DeMarco <pdemarco@ppg.com>.

1.15
	Fixed a bug in the definition of MP_DIGIT_MAX that caused errors
	when IMath is built under 64-bit Linux.  Reported by
	Klaus Stengel <klaus.stengel@informatik.stud.uni-erlangen.de>.

	Unpacked the macro definitions in imath.c a bit, to make them more
	readable.

	Added mp_int_expt_full() by request of Andrea Barberio
	<insomniac@slackware.it>.

1.16
	Fixed a bug in mp_int_to_uint() which was causing incorrect MP_RANGE
	errors during small integer conversion.
	Reported by Andrea Barberio <insomniac@slackware.it>

	Added mp_int_compare_uvalue().
	Added some new testing hooks in imtest.c, new unit tests.

	Made some code style changes that do not affect functionality.

1.17
	Fixed a bug in mp_int_swap() where mpz_t structures using their single
	field as storage would not get swapped correctly.
	Reported by Andres Navarro <canavarro82@gmail.com>

	Added regression test for this and some hooks for future
	regressions in the tests/test.sh script.

1.18
	Made mp_int_rat() use mp_int_init() to initialize numerator and
	denominator instead of mp_int_init_size().
	Some minor code cleanup inside the testing code (imdrover.c).

	Fixed an off-by-one bug in s_udiv() which could cause the quotient
	guessing loop to spin.  Reported by Andres Navarro.  Added
	triggering example to div.t as a regression test.

1.19
	Fix signedness error in compile.  Reported by Paweł Sikora.

1.20
	Fix broken comments, apparently from a previous bad merge.
	Remove emacs folding-mode comments throughout.
	Some minor Makefile cleanup to make clang happier.

1.21
	Fix a syntax error. TODO: Run tests before merging, or better
	still set up CI someplace.
	Remove dead division code.
	Restore a missing comparison.
	Drop dead flags from the Makefile.

1.22
	Remove MP_USMALL_MIN, which was unused by anything in imath.
	Rework doc.txt into Markdown.
	Restore imath-test.scm and imath.py, dropped during import.

1.23
	Portability fixes from PostgreSQL (#8), from nmisch.

1.24
	A cosmetic update, consisting mainly of readability updates,
	documentation fixes, and warning fixes. There are not intended to
	be any functional changes in this update, but a fair bit of code
	and the Makefile have been modified, so I'm adding a tag.

	My intent is to keep the source formatted with clang-format going
	forward, though I will need to set up some presubmit checks to
	enforce that. For now it is still a manual step via "make format".

	7e45d6a Remove a doc reference to MP_USMALL_MIN.
	544687d Fix the spelling of mp_error_string in doc.md.
	592d4a0 Fix some mis-converted section breaks in doc.md.
	df9fe8e Format source files with clang-format.
	fcb4e21 Build with 64-bit words by default.
	1579b70 Minor simplifications to the Makefile.
	0fbe8e6 Style cleanup: More invasive manual changes.
	1d28177 Add -Wextra and -Wno-unused-parameter to default build flags.
	15ba02a Fix warnings for signed/unsigned comparisons.
	3556984 Style cleanup: Insert missing brackets.

1.25
	This version fixes several issues found by clang static analysis.
	It also includes some additional follow-on cleanup tasks from the
	previous release.

	b5a73c4 Cleanup: Use .tc for test files instead of .t.
	dc307ae Cleanup: Remove dead author URLs, SVN markers.
	389a1be bug: Fix a memory leak in test_meta.
	8fb98f7 bug: Fix a use of an uninitalized pointer.
	fe0757a bug: Fix reads of uninitalized fields in free_test.
	08fe765 bug: Fix a reachable null pointer indirection.
	7b10453 bug: Remove a redundant initialization.
	cebce44 bug: Fix various dead assignments.
	ef36352 Remove the findsizes.py script.
	eebfb85 Fix some more comparison-sign mismatches.
	9abcf66 Cleanup: Update a stale reference to doc.txt in the README.
	8ec696f Cleanup: Consolidate the USE_32BIT_WORDS macro sections.

1.26
	Another round of fixes. Notably the gmp-compat-test again works on
	macOS, fixing https://github.com/creachadair/imath/issues/26.
	Also, this release cleans up some more warnings and fixes some
	missing #include paths.

	2ea0fff gmp_compat: Fix warnings for mixed-sign comparisons.
	2a41bae Fix DLL loading.
	56c40f4 Make gmp-compat-test work again on macOS.
	f163906 Comment out a vacuously true assertion.
	667d90e gmp_compat: Ensure a definition of ssize_t is available.
	6c6fdd8 Fix a vacuously meaningless comparison.
	4dac16f Silence a warning about an uninitalized variable.
	c6119c4 Include strings.h for strcasecmp.

1.27
	Another round of cleanup and bug fixes. This release includes a
	Dockerfile to support basic Linux testing, which I found useful as
	I do most of my work on macOS.

	This release also addresses most of issue #29 (Switching from C90
	to C99). Part of that change removes most function-like macros
	from the API headers, replacing them with static functions. Code
	that used the macros as lvalues will no longer work, but can and
	should be easily updated to access the members of mpz_t directly.

	Fixed: #34.

	899e202 Add a docker config for basic Linux testing.
	40e8887 Move imath-test.scm to the tests directory.
	6f01c9f Add .dockerignore to the release tarball.
	1dab081 Fix the spelling of __abs__ in imath.py.
	8f0a00c Enable source formatting for Python.
	99e27c8 Format all Python source with yapf.
	bf289f0 gmp-compat-test: Remove dependency on Python 3.
	9269d57 Clean up the Linux test image.
	61ca691 Include stdbool.h and use the bool type where appropriate.
	d4760ee Replace macros with static inline functions.
	8241977 linux test: Layer the image for better caching.
	46bb578 imath: Replace accessor macros with inline functions.
	50c6cc8 imrat: Replace accessor macros with static functions.
	0c5cec9 gmp_compat: Fix lvalue uses of MP_USED.
	89c72f2 Remove CHECK and NRCHECK macros.
	dbe9f50 imath: Replace macros with static functions.
	0006998 imath: Replace ROUND_PREC macro with a function.
	b628a0c Move local variable declarations closer to first use.
	54d51da Remove obsolete division spec.
	796776f iprime: Move and scope variables closer to first use.
	8fd5236 iprime: Use a sentinel instead of a length.
	ce89180 Include getopt.h explicitly where it is required.
	e6fc170 Make libimath.so build correctly under GCC.
	b54d8c9 Use Bourne in preference to Bash.
	8f88c01 Makefile: Export CC and CFLAGS for submakes.
	58f4392 Use the inherited settings in the gmp-compat-tests.
	8a181cd Make the Linux docker test run "make check".
	28617f2 gmp_compat: Fix overflow in the uint conversion adapter.

1.28
	Another round of cleanup, and some more invasive API changes.
	I removed more macros, and added an API surface for setting the
	default precision and recursive-multiply threshold.
	The compile-time switchable statics are now strictly static.
	The handling of temporary values was greatly reworked to make it
	less brittle.

	ba44b37 Add unit tests for mp_int_is_prime.
	6f10877 imath: Remove lvalue uses of access macros, and the macros.
	f4939db Fix formatting.
	85137fa docs: Remove macro implementation comments.
	37f046e Rework the handling of temporaries.
	cc8ac74 imtimer: Fix a lingering lvalue use of MP_USED.
	9736a8b imath: Drop switchable statics and stdio dependency.
	5445ad8 Add functions to set default precision and multiply threshold.
	58f2d6e Use alpine:latest rather than a fixed version.

1.29
	The Documentation Edition. The main improvement here is that the
	API documentation is now unified in the header files, and doc.md
	is now generated from a template that includes the text from the
	headers. The automation for this is still unsatisfactory, but it
	is better than it was.

	d239b2e Remove imath.py.
	e43b0f5 imath: Clean up extraneous whitespace.
	fbbbbad Remove the mpz struct tag.
	718fef2 imath: Add documentation comments to the header.
	02600e5 imath: Make radix bound checks into requirements.
	c21f49d imrat: Add documentation comments to the header.
	ea5398f Remove the mpq struct tag.
	c1549c7 Move tools and tests into subdirectories.
	7187c49 Remove extraneous whitespace from declarations.
	afa715c Comment cleanup on Aisle 2.
	cbf9a03 Add tools/mkdoc.py.
	58672fc Remove the "dist" target from Makefile.
	894bb90 Move rtest.c into the tests directory.
	d4cfc69 Add a doc.md.in template file.
	bd929aa Add a make rule for doc.md from doc.md.in.
	6dea44e Update doc.md using the new generator.
	56ef9a0 doc: Include mp_int_set_uvalue.
	13618b3 doc: Explain the comparator terminology.
	9990b2e Make the clean and distclean make-rules equivalent.
	13df978 doc: Update the explanation of temp handling macros.
	b80bd8a doc: Emit one generated comment for the whole file.
	3cde6b8 doc: Remove the markdown disclaimer.
	045a2a6 doc: Point my address to github instead of e-mail.
	08f2efd doc: Add headings for general API functions.
	77159d9 mkdoc.py: Link back to source lines.
	aec8587 doc: Include links back to the source.
	f8c9f6c imath: Document a constraint on mp_int_redux_const.

1.30
	Improve test automation; no functional changes to the library.

	fc7846a imtest: Ensure the exit code is non-zero when tests fail.
	87edcbe test.sh: Exit non-zero if any unit tests fail.
	276d1f9 imtest: Make test output easier to read.
	c8c90c4 Make the Linux test protocol less brittle.
	f68ba5b Add a .gitattributes file.
	33c2843 Add a docker-test target to the Makefile.

1.31
	Improvements to build and test automation; add CI configuration.

	d419633 Add a Travis CI configuration for imath.
	3305c4a Ensure the Makefile respects a $CC set in the environment.
	d2da4b6 Update instructions for reporting bugs.
