Rust の num クレートのサンプルです。 さらっとどんなものがあるか把握できるような形式で書いていきます。 網羅してません。
概要
num は Rust の数値型と traits のコレクションです。
これには、大きな整数、有理数(別名:分数)、複素数のための新しい型、Integerのような数値プロパティの一般的なプログラミングのための新しいtrait、および一般的な範囲イテレータが含まれます。
num はメタクレートであり、これらのサブクレートからアイテムを再エクスポートします。
※ ここまで直訳です。
Contents
バージョンと利用方法
Cargo.toml
[dependencies]
num = "0.4"
AtCoderでは num = "=0.2.1"
が利用可能です
Language Test 202001。
整数の割り算とあまり
extern crate num;
use num::integer;
fn main() {
// 割り切れないとき
assert_eq!(integer::div_floor(7, 3), 2);
assert_eq!(integer::div_ceil(7, 3), 3);
// 割り切れる場合はどちらも同じ
assert_eq!(integer::div_floor(6, 3), 2);
assert_eq!(integer::div_ceil(6, 3), 2);
}
小数をfoor
では切り捨て、ceil
では切り上げる。
// 11 わる 3 = 3 あまり 2
// Simultaneous floored integer division and modulus
assert_eq!(integer::div_mod_floor(11, 3), (3, 2));
// Simultaneous integer division and modulus
assert_eq!(integer::div_rem(11, 3), (3, 2));
どちらも符号が同じ整数の場合は二つの違いは特にない。 符号が異なる場合に結果に相違がある。
【Rust】num-integerのdiv_mod_floor()とdiv_rem()の違いに実装と論文の引用をまとめた。
根
use num::integer;
use num::Float;
// sqrt(x) x^(1/2)
assert_eq!(integer::sqrt(2), 1);
assert_eq!(Float::sqrt(2.0), 1.4142135623730951);
assert_eq!(integer::sqrt(3), 1);
assert_eq!(Float::sqrt(3.0), 1.7320508075688772);
// cbrt(x) x^(1/3)
assert_eq!(integer::cbrt(2), 1);
assert_eq!(Float::cbrt(2.0), 1.259921049894873);
// nth_root(x, n) x^(1/n)
assert_eq!(integer::nth_root(16, 5), 1);
sqrt
は2乗根、cbrt
は3乗根です。
nth_root()
はintegerのみ。
Integerでは小数が切り捨てられる。
乗数
// exp(x) e^x
assert_eq!(Float::exp(2.0), 7.38905609893065);
// exp2(x) 2^x
assert_eq!(Float::exp2(2.0), 4.0);
対数
// ln(x) log_e(x)
assert_eq!(Float::ln(2.0), 0.6931471805599453);
// log(x, base) log_base(x)
assert_eq!(Float::log(2.0, 3.0), 0.6309297535714574);
複素数
use num::Complex;
// 複素数
let z = Complex { re: 2.0, im: -1.0 };
assert_eq!(
z * z,
Complex { re: 3.0, im: -4.0 }
);
【Rust】並列処理でマンデルブロ集合の画像を作るコードでも複素数を使っています。
最大公約数と最小公倍数
// gcd 最大公約数
assert_eq!(integer::gcd(12, 18), 6);
// lcm 最小公倍数
assert_eq!(integer::lcm(12, 18), 36);
二項係数
// Binomial Coefficient n!/(k!*(n-k)!)
assert_eq!(integer::binomial(10, 3), 120);