schedule2021-04-19

Rustのnumクレートの実行サンプル

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);