malachite-base 0.4.7

A collection of utilities, including new arithmetic traits and iterators that generate all values of a type
- []
- []

Rather than using this crate directly, use the
[`malachite`]( meta-crate. It re-exports all of this crate's
public members.

In `malachite-base`'s doctests you will frequently see import paths beginning with
`malachite_base::`. When using the `malachite` crate, replace this part of the paths with

# malachite-base
This crate contains many utilities that are used by the
[`malachite-nz`]( and
[`malachite-q`]( crates. These utilities include
- Traits that wrap functions from the standard library, like
- Traits that give extra functionality to primitive types, like
- Iterator-producing functions that let you generate values for testing. Here's an example of
  an iterator that produces all pairs of
  use malachite_base::num::exhaustive::exhaustive_unsigneds;
  use malachite_base::tuples::exhaustive::exhaustive_pairs_from_single;

  let mut pairs = exhaustive_pairs_from_single(exhaustive_unsigneds::<u32>());
          (0, 0), (0, 1), (1, 0), (1, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 0), (2, 1),
          (3, 0), (3, 1), (2, 2), (2, 3), (3, 2), (3, 3), (0, 4), (0, 5), (1, 4), (1, 5)
- The
  enum, which allows you to specify the rounding behavior of various functions.
- The
  [`NiceFloat`] wrapper, which provides alternative implementations of
  [`Ord`], and
  for floating-point values which are in some ways nicer than the defaults.

# Demos and benchmarks
This crate comes with a `bin` target that can be used for running demos and benchmarks.
- Almost all of the public functions in this crate have an associated demo. Running a demo
  shows you a function's behavior on a large number of inputs. For example, to demo the
  function on [`u32`], you can use the
  following command:
  cargo run --features bin_build --release -- -l 10000 -m exhaustive -d demo_mod_pow_u32
  This command uses the `exhaustive` mode, which generates every possible input, generally
  starting with the simplest input and progressing to more complex ones. Another mode is
  `random`. The `-l` flag specifies how many inputs should be generated.
- You can use a similar command to run benchmarks. The following command benchmarks various
  GCD algorithms for [`u64`]
  cargo run --features bin_build --release -- -l 1000000 -m random -b \
      benchmark_gcd_algorithms_u64 -o
  This creates a file called You can use gnuplot to create an SVG from it like
  gnuplot -e "set terminal svg; l \"\"" > gcd-bench.svg

The list of available demos and benchmarks is not documented anywhere; you must find them by
browsing through

# Features
- `random`: This feature provides some functions for randomly generating values. It is off by
  default to avoid pulling in some extra dependencies.
- `test_build`: A large proportion of the code in this crate is only used for testing. For a
  typical user, building this code would result in an unnecessarily long compilation time and
  an unnecessarily large binary. Much of it is also used for testing
  [`malachite-nz`] and
  [`malachite-q`], so it can't just be confined to the
  `tests` directory. My solution is to only build this code when the `test_build` feature is
  enabled. If you want to run unit tests, you must enable `test_build`. However, doctests don't
  require it, since they only test the public interface. Enabling this feature also enables
- `bin_build`: This feature is used to build the code for demos and benchmarks, which also
  takes a long time to build. Enabling this feature also enables `test_build` and `random`.

Copyright © 2024 Mikhail Hogrefe