[][src]Crate modtype

This crate provides modular arithmetic integer types.

Usage

modtype::ModType

#[modtype::use_modtype]
type F = modtype::F<1_000_000_007u64>;

assert_eq!((F(1_000_000_006) + F(2)).to_string(), "1");

modtype::thread_local::ModType

#[allow(non_snake_case)]
modtype::thread_local::F::with(1_000_000_007u64, |F| {
    assert_eq!((F(1_000_000_006) + F(2)).to_string(), "1");
});

modtype::non_static::ModType

#[allow(non_snake_case)]
let F = modtype::non_static::F::factory(1_000_000_007u64);

assert_eq!((F(1_000_000_006) + F(2)).to_string(), "1");

Customization

ModTypes can be customized via modtype::Cartridge.

modtype::cartridges::AllowFlexibleRhs

use modtype::cartridges::{AllowFlexibleRhs, Field};
use num::{BigInt, BigRational};

#[modtype::use_modtype]
type F = modtype::ModType<AllowFlexibleRhs<Field<u64>>, 1_000_000_007u64>;

let mut x = F(1);
x += F(1);
x += 1u64;
x += 1i32;
x += 1f64;
x += BigInt::from(1u32);
x += BigRational::new(BigInt::from(1u32), BigInt::from(1u32));
assert_eq!(x, F(7));

modtype::cartridges::Multiplicative

use num::CheckedDiv as _;

#[modtype::use_modtype]
type Z = modtype::ModType<modtype::cartridges::Multiplicative<u32>, 57u32>;

assert_eq!(Z(56) * Z(56), Z(1));
assert_eq!(Z(1).checked_div(&Z(13)), Some(Z(22))); // 13・22 ≡ 1 (mod 57)

modtype::cartridges::Additive

use num::CheckedAdd as _;

#[modtype::use_modtype]
type Z = modtype::ModType<modtype::cartridges::Additive<u64>, 1_000_000_007u64>;

let mut x = Z(1_000_000_006);

x += Z(1);
assert_eq!(*x.get_mut_unchecked(), 1_000_000_007);

x += Z(u64::max_value() / 2 - 1_000_000_007);
assert_eq!(*x.get_mut_unchecked(), u64::max_value() / 2);

x += Z(1);
assert_eq!(*x.get_mut_unchecked(), (u64::max_value() / 2 + 1) % 1_000_000_007);

modtype::cartridges::ManuallyAdjust

use num::CheckedAdd as _;

#[modtype::use_modtype]
type Z = modtype::ModType<modtype::cartridges::ManuallyAdjust<u64>, 1_000_000_007u64>;

let mut x = Z(1_000_000_006);

x += Z(u64::max_value() - 1_000_000_006);
assert_eq!(*x.get_mut_unchecked(), u64::max_value());

x.adjust();
assert_eq!(*x.get_mut_unchecked(), u64::max_value() % 1_000_000_007);

Re-exports

pub use modtype_derive::use_modtype;
pub use modtype_derive::ConstValue;
pub use modtype_derive::ModType;

Modules

cartridges

Cartridges.

non_static

A modular arithmetic integer type which modulus is a struct field.

thread_local

A modular arithmetic integer type which modulus is thread_local.

Structs

ModType

A modular arithmetic integer type which modulus is a constant.

Enums

False

A TypedBool which represents "false".

True

A TypedBool which represents "true".

Traits

Cartridge

Actual implementation.

ConstValue

A trait that has one associated constant value.

FloatPrimitive

A trait for f32 and f64.

IsTrue

A trait for True.

SignedPrimitive

A trait for i8, i16, i32, i64, i128, and isize.

TypedBool

Type level boolean.

UnsignedPrimitive

A trait for u8, u16, u32, u64, u128, and usize.

Type Definitions

F

A type alias which Cartridge is modtype::cartridges::Field<M::Value>.