Release Notes
=============

.. currentmodule:: gmpy2

Changes in gmpy2 2.2.0
------------------------

* Added prev_prime() when GMP >= 6.3

Changes in gmpy2 2.1.0rc2
-------------------------

* Documentation updates.
* Improvements to build environment.

Changes in gmpy2 2.1.0rc1
-------------------------

* Added support for embedded underscore characters in string literals.
* Allow GIL release for `mpz`/`xmpz`/`mpq` types only.

Changes in gmpy2 2.1.0b6
------------------------

* Improve argument type processing by saving type information to
  decrease the number of type check calls. Especially helpful
  for `mpfr` and `mpc` types. (Not complete but common operations
  are done.)
* Resolve bug in `mpfr` to `mpq` conversion; issue #287.
* Added limited support for releasing the GIL; disabled by default;
  see `context.allow_release_gil`.
* Refactored handling of inplace operations for `mpz` and `xmpz` types;
  inplace operations on `xmpz` will only return an `xmpz` result.
* Refactored handling of conversion to C integer types. Some
  exception types changes to reflect Python types.
* `gcd()` and `lcm()` now support more than two arguments to align with
  the corresponding functions in the math module.

Changes in gmpy2 2.1.0b5
------------------------

* Avoid MPFR bug in mfr_fac_ui (`factorial()`) on platforms where
  long is 32-bits and argument is >= 44787929.
* Fixed testing bugs with Python 2.7.
* Fixed ``mpz(0)`` to C long or long long.
* Fixed incorrect results in `f2q()`.
* Adjust test suite to reflect changes in output in MPFR 4.1.0.

Changes in gmpy2 2.1.0b4
------------------------

* Fix comparisons with `mpq` and custom rational objects.
* Fixes for some uncommon integer conversions scenarios.

Changes in gmpy2 2.1.0b3
------------------------

* Version bump only.

Changes in gmpy2 2.1.0b2
------------------------

* Many bug fixes.

Changes in gmpy2 2.1.0b1
------------------------

* Added `cmp()` and `cmp_abs()`.
* Improved compatibility with the :mod:`numbers` module protocol.
* Many bug fixes.

Changes in gmpy2 2.1.a05
------------------------

* Fix `qdiv()` not returning `mpz` when it should.
* Added `root_of_unity()`.

Changes in gmpy2 2.1.0a4
------------------------

* Fix issue 204; missing file for Cython.
* Additional support for MPFR 4

   - Add `fmma()` and `fmms()`.

Changes in gmpy2 2.1.0a3
------------------------

* Updates to ``setup.py``.
* Initial support for MPFR4

   - Add `mpfr_nrandom()`
   - `mpfr_grandom()` now calls nrandom twice; may return different values
     versus MPFR3.
   - Add `rootn()`; same as `root()` except different sign when taking even
     root of -0.0.

Changes in gmpy2 2.1.0a2
------------------------

* Revised build process.
* Removal of unused code/macros.
* Cleanup of Cython interface.

Changes in gmpy2 2.1.0a1
------------------------

* Thread-safe contexts are now supported. Properly integrating thread-safe
  contexts required an extensive rewrite of almost all internal functions.
* MPFR and MPC are now required. It is no longer possible to build a version
  of gmpy2 that only supports the GMP library.
* The function ``inverse()`` now raises an exception if the inverse does not
  exist.
* Context methods have been added for MPFR/MPC related functions.
* A new context option (`~context.rational_division`) has been added that
  changes the behavior of integer division involving `mpz` instances to return
  a rational result instead of a floating point result.
* gmpy2 types are now registered in the numeric tower of the
  :mod:`numbers` module.
* In previous versions of gmpy2, ``mpz()`` was a factory function that
  returned an  `mpz` instance.  It is now an actual type. The same
  is true for the other gmpy2 types.
* If a Python object has an ``__mpz__`` method, it will be called bye ``mpz()``
  to allow an unrecognized type to be converted to an mpz instance. The same is
  true for the other gmpy2 types.
* A new C-API and Cython interface has been added.

Changes in gmpy2 2.0.4
----------------------

* Fix `bit_scan0()` for negative values.
* Changes to ``setup.py`` to allow static linking.
* Fix performance regression with mpmath and Python 3.

Changes in gmpy2 2.0.3
----------------------

* Fix `lucas2()` and `atanh()`; they were returning incorrect values.

Changes in gmpy2 2.0.2
----------------------

* Rebuild Windows binary installers due to MPIR 2.6.0 bug in `next_prime()`.
* Another fix for `is_extra_strong_lucas_prp()`.

Changes in gmpy2 2.0.1
----------------------

* Updated ``setup.py`` to work in more situations.
* Corrected exception handling in basic operations with `mpfr` type.
* Correct ``InvalidOperation`` exception not raised in certain circumstances.
* `invert()` now raises an exception if the modular inverse does not exist.
* Fixed internal exception in `is_bpsw_prp()` and `is_strong_bpsw_prp()`.
* Updated `is_extra_strong_lucas_prp()` to latest version.

Changes in gmpy2 2.0.0
----------------------

* Fix segmentation fault in ``_mpmath_normalize()`` (an undocumented helper
  function for mpmath).
* Improved ``setup.py``.  See below for documentation on the changes.
* Fix issues when compiled without support for MPFR.
* Conversion of too large an `mpz` to `float` now raises `OverflowError`
  instead of returning ``inf``.
* Renamed ``min2()/max2()`` to `minnum()`/`maxnum()`
* The build and install process (i.e. ``setup.py``) has been completely
  rewritten.  See the Installation section for more information.
* `get_context()` no longer accepts keyword arguments.

Known issues in gmpy2 2.0.0
-----------------------------

* The test suite is still incomplete.

Changes in gmpy2 2.0.0b4
------------------------

* Added ``__ceil__()``, ``__floor__()``, ``__trunc__()``, and ``__round__()``
  methods to `mpz` and `mpq` types.
* Added ``__complex__()`` to `mpc` type.
* ``round(mpfr)`` now correctly returns an `mpz` type.
* If no arguments are given to `mpz`, `mpq`, `mpfr`, `mpc`, and `xmpz`,
  return 0 of the appropriate type.
* Fix broken comparison between `mpz` and `mpq` when `mpz` is on the left.
* Added ``__sizeof__()`` to all types. Note: :func:`sys.getsizeof` calls
  ``__sizeof__()`` to get the memory size of a gmpy2 object. The returned
  value reflects the size of the allocated memory which may be larger than
  the actual minimum memory required by the object.

Known issues in gmpy2 2.0.0b4
-----------------------------

* The new test suite (``test/runtest.py``) is incomplete and some tests fail on
  Python 2.x due to formatting issues.

Changes in gmpy2 2.0.0b3
------------------------

* `mp_version()`, `mpc_version()`, and `mpfr_version()` now return normal
  strings on Python 2.x instead of Unicode strings.
* Faster conversion of the standard library `~fractions.Fraction` type to `mpq`.
* Improved conversion of the `~decimal.Decimal` type to `mpfr`.
* Consistently return `OverflowError` when converting ``inf``.
* Fix `mpz.__format__()` when the format code includes "#".
* Add `is_infinite()` and deprecate ``is_inf()``.
* Add `is_finite()` and deprecate ``is_number()``.
* Fixed the various ``is_XXX()`` tests when used with `mpc`.
* Added caching for `mpc` objects.
* Faster code path for basic operation is both operands are `mpfr` or `mpc`.
* Fix `mpfr` + `float` segmentation fault.

Changes in gmpy2 2.0.0b2
------------------------

* Allow `xmpz` slice assignment to increase length of `xmpz` instance by
  specifying a value for stop.
* Fixed reference counting bug in several ``is_xxx_prp()`` tests.
* Added `~xmpz.iter_bits()`, `~xmpz.iter_clear()`, `~xmpz.iter_set()` methods
  to `xmpz`.
* Added `powmod()` for easy access to three argument :func:`pow()`.
* Removed ``addmul()`` and ``submul()`` which were added in 2.0.0b1 since they
  are slower than just using Python code.
* Bug fix in gcd_ext when both arguments are not `mpz`.
* Added `ieee()` to create contexts for 32, 64, or 128 bit `float`'s.
* Bug fix in `context()` not setting `~context.emax`/`~context.emin` correctly
  if they had been changed earlier.
* Contexts can be directly used in with statement without requiring
  `set_context()`/`local_context()` sequence.
* `local_context()` now accepts an optional context.

Changes in gmpy2 2.0.0b1 and earlier
------------------------------------

* Renamed functions that manipulate individual bits to ``bit_XXX()`` to align
  with :meth:`~int.bit_length()`.
* Added caching for `mpq`.
* Added ``rootrem()``, `fib2()`, `lucas()`, `lucas2()`.
* Support changed hash function in Python 3.2.
* Added `is_even()`, `is_odd()`.
* Add caching of the calculated hash value.
* Add `xmpz` (mutable `mpz`) type.
* Fix `mpq` formatting issue.
* Add read/write bit access using slices to `xmpz`.
* Add read-only bit access using slices to `mpz`.
* Add `pack()`/`unpack()` methods to split/join an integer into n-bit
  chunks.
* Add support for MPFR (casevh)
* Removed fcoform float conversion modifier.
* Add support for MPC.
* Added context manager.
* Allow building with just GMP/MPIR if MPFR not available.
* Allow building with GMP/MPIR and MPFR if MPC not available.
* Removed most instance methods in favor of gmpy2.function. The general
  guideline is that *properties* of an instance can be done via instance
  methods but *functions* that return a new result are done using
  gmpy2.function.
* Added ``__ceil__()``, ``__floor__()``, and ``__trunc__()`` methods since they
  are called by :func:`math.ceil()`, :func:`math.floor()`, and
  :func:`math.trunc()`.
* Removed ``gmpy2.pow()`` to avoid conflicts.
* Removed ``gmpy2._copy()`` and added `xmpz.copy()`.
* Added support for ``__format__()``.
* Added ``as_integer_ratio()``, ``as_mantissa_exp()``, ``as_simple_fraction()``.
* Updated rich_compare.
* Require MPFR 3.1.0+ to get divby0 support.
* Added `fsum()`, `degrees()`, `radians()`.
* Updated random number generation support.
* Changed license to LGPL 3+.
* Added `lucasu()`, `lucasu_mod()`, `lucasv()`, and `lucasv_mod()`.
  *Based on code contributed by David Cleaver.*
* Added probable-prime tests.
  *Based on code contributed by David Cleaver.*
* Added `to_binary()`/`from_binary()`.
* Renamed ``numdigits()`` to `~mpz.num_digits()`.
* Added keyword precision to constants.
* Added ``addmul()`` and ``submul()``.
* Added ``__round__()``, `round2()`, `round_away()` for `mpfr`.
* ``round()`` is no longer a module level function.
* Renamed module functions ``min()/max()`` to ``min2()/max2()``.
* No longer conflicts with builtin :func:`min()` and :func:`max()`
* Removed ``set_debug()`` and related functionality.
