# Bare Metal Modulo `ModNum` and `ModNumC` are highly ergonomic modular arithmetic structs intended for `no_std` use. `ModNum` objects represent a value modulo m. The value and modulo can be of any primitive integer type. Arithmetic operators include `+`, `-` (both unary and binary), `*`, `/`, `pow()`, and `==`. Additional capabilities include computing multiplicative inverses and solving modular equations. `ModNumC` objects likewise represent a value modulo `M`, where `M` is a generic constant of the `usize` type. Arithmetic operators include `+`, `-` (both unary and binary), `*`, and `==`. This library was originally developed to facilitate bidirectional navigation through fixed-size arrays at arbitrary starting points. This is facilitated by a double-ended iterator that traverses the entire ring starting at any desired value. The iterator supports both `ModNum` and `ModNumC.` Modular numbers represent the remainder of an integer when divided by the modulo. If we also store the quotient in addition to the remainder, we have a count of the number of times a value had to "wrap around" during the calculation. For example, if we start with **8 (mod 17)** and add **42**, the result is **16 (mod 17)** with a wraparound of **2**. `WrapCountNum` and `WrapCountNumC` objects store this wraparound value and make it available. Furthermore, it is sometimes useful to be able to move back and forth in a range that is offset from zero. To that end, `OffsetNum` and `OffsetNumC` are provided. Note that `ModNum`, `ModNumC`, `WrapCountNum`, `WrapCountNumC`, `OffsetNum`, and `OffsetNumC` are not designed to work with arbitrary-length integers, as they require their integer type to implement the `Copy` trait. # Notes * See [CHANGELOG.md](https://github.com/gjf2a/bare_metal_modulo/blob/master/CHANGELOG.md) for updates.