Expand description
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
ModType
s 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);
Modules§
- cartridges
Cartridge
s.- 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§
Traits§
- Cartridge
- Actual implementation.
- Const
Value - A trait that has one associated constant value.
- Float
Primitive - A trait for
f32
andf64
. - IsTrue
- A trait for
True
. - Signed
Primitive - A trait for
i8
,i16
,i32
,i64
,i128
, andisize
. - Typed
Bool - Type level boolean.
- Unsigned
Primitive - A trait for
u8
,u16
,u32
,u64
,u128
, andusize
.
Type Aliases§
- F
- A type alias which
Cartridge
ismodtype::cartridges::Field
<M::Value>
.
Attribute Macros§
- use_
modtype - An attribute macro to use a modular arithmetic type with a
ConstValue
argument.
Derive Macros§
- Const
Value - Derives
ConstValue
. - ModType
- Derives following traits.