Crates.io | modinverse |
lib.rs | modinverse |
version | 0.1.1 |
source | src |
created_at | 2017-02-08 00:11:18.013384 |
updated_at | 2018-12-08 02:06:21.565952 |
description | Small library for finding the modular multiplicative inverses. |
homepage | |
repository | https://github.com/simon-andrews/rust-modinverse |
max_upload_size | |
id | 8428 |
size | 5,679 |
Small library for finding the modular multiplicative inverses. Also has an implementation of the extended Euclidean algorithm built in.
modinverse
Calculates the modular multiplicative inverse x of an integer a such that ax ≡ 1 (mod m).
Such an integer may not exist. If so, this function will return None
.
Otherwise, the inverse will be returned wrapped up in a Some
.
use modinverse::modinverse;
let does_exist = modinverse(3, 26);
let does_not_exist = modinverse(4, 32);
match does_exist {
Some(x) => assert_eq!(x, 9),
None => panic!("modinverse() didn't work as expected"),
}
match does_not_exist {
Some(x) => panic!("modinverse() found an inverse when it shouldn't have"),
None => {},
}
egcd
Finds the greatest common denominator of two integers a and b, and two integers x and y such that ax + by is the greatest common denominator of a and b (Bézout coefficients).
This function is an implementation of the extended Euclidean algorithm.
use modinverse::egcd;
let a = 26;
let b = 3;
let (g, x, y) = egcd(a, b);
assert_eq!(g, 1);
assert_eq!(x, -1);
assert_eq!(y, 9);
assert_eq!((a * x) + (b * y), g);