Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

rust

rust でignoreアトリビュートを指定したテストを実行する

rustでignoreアトリビュートを指定したテストを実行するには以下のコマンドを実行します。 $ cargo test -- --ignored

rustでモジュラー多項式の係数を求めてみる

こちらモジュラー多項式の定義と係数の求め方 - Pebble Codingで モジュラー多項式の係数を求めるアルゴリズムについて書きましたが、rustでの実装が完成しました。 めちゃくちゃ遅く実用化には程遠いですが、解説しておきます。 SageMathでの実装のアルゴリ…

macOSにてrustプロジェクトのprofileを取る

### cargo-profiler インストール $ cargo install cargo-profiler実行するにはbinを含むrustプロジェクトの存在するディレクトリで、 $ cargo profiler callgrind を実行します。 ライブラリモジュールの場合のやり方が分かっていません。参考: cargo-profi…

cargo testを高速化する

rustでは通常以下のコマンドで単体テストを実行します。 $ cargo testテストの実行に時間がかかる場合はreleaseビルドでテストを実行させることが可能です。 $ cargo test --release体感ですが、10倍ほど速度が違います。

F_p上の楕円曲線のオーダーをrustでbrute-force(力任せ)に計算する

F_p上の楕円曲線のオーダーをrustでbrute-force(力任せ)に計算してみました。 以前 pythonで実装しましたがだいぶ速くなっています。 GitHub - pebble8888/ellipticcurve F_5, y^2 = x^3 + x + 1, order:9, j:2 F_7, y^2 = x^3 + x + 1, order:5, j:1 order …

同種写像の例

What is an isogeny of elliptic curves?こちらの記事に同種写像(isogeny)の例がのっています。 この写像のxの部分の分母、分子で次数が大きい方が2なので、 この同種写像の次数(degree)は2ということになります。 この変換式が本当に同種写像かどうかを確か…

rust トレイトとジェネリクスと所有権

rustのトレイトは、Javaのインターフェースやswiftのプロトコルに相当します。 ジェネリクスは多くの言語にあるので、馴染みがあるでしょう。 rustのジェネリクスやはその他の言語のジェネリクスに絶対にない特徴を持ちます。 swiftのジェネリクスは、複数の…

楕円曲線の有理点の数の求め方 schoof アルゴリズムその5

schoofアルゴリズムをpythonで実装したらめちゃくちゃ遅かったのですが、楕円曲線の有理点の数の求め方 schoof アルゴリズムその4 - Pebble Codingrustで実装したところ、 a = -1 mod 3 a = -2 mod 5 の計算が、Debugビルドで90秒、Releaseビルドで7秒で計…

rust + vim でビルドエラーを修正する

rust-lang/rust.vim をBundleでインストールする。これだけでした。 Bundle 'rust-lang/rust.vim' srcフォルダの下のソースファイルのうちのどれかをvimで開く。 :make buildを実行する。 :copenでエラーリストを表示する。参考: https://shinglyu.com/web/2…

rustのtraitで値バージョンと借用バージョンの両方の実装方法

rustの演算子オーバーロードをする際、値と借用の両方の実装を行う方法です。 次の構造体の掛け算を考えます。 #[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct Unit { pub coef: BigInt, pub xpow: BigInt, pub ypow: BigInt, } 値の掛け算と…

rust のファイル分割

rust のソースファイル分割方法はC++やswiftとはかなり違って戸惑いますが、なんとか分割できたのでメモしておきます。 rustではファイル名イコールモジュール名と覚えましょう。 C++やswiftはファイル名にほとんど意味はありませんが、rustは超厳しいです。…

rust ?(question mark)演算子

rustでの?演算子はResultの処理を簡略化した機能を持つ。 戻り値としてResultを持つ関数内で利用することができ、 Resultを生成する式の後ろにつけることができる。 ?をつけた場合は式の結果がSuccessだった場合はその値をunwrapして処理を継続する。 Error…

rust の trait

rust の trait は大雑把に言って、swift の protocol に相当する。 以下サンプルを見てみよう。 fn main() { let mut bicycle = Bicycle { pos: 0 }; bicycle.forward(); } struct Bicycle { pub pos: i32 } trait Movable { fn forward(&mut self); } // Bi…

rust をios用にビルドする

ios の target を追加してからビルドします。 $ rustup target add x86_64-apple-ios $ cargo build --target x86_64-apple-ios cargo.toml [lib] name = "blake2rustios" crate-type = ["staticlib"] これでstatic libraryが生成されるようです。 他、細か…

macOS にrust(stable版, nightly版)をインストールする

現在の最新バージョンは1.32です。 stableな機能のみしか使わない場合は、brew でインストールしてもよいです。 $ brew install rust nightly の機能を使う場合は rustup を使います。 まずは、brew でインストールしたrustをアンインストールします。 $ bre…

rust 定数の2次元配列宣言方法

C言語とは配列長部分の定義順序が逆になります。 3 x 2の2次元配列 const A: [[u8; 2]; 3] = [ [0x01, 0x02], [0x03, 0x04], [0x05, 0x06] ]; プログラミングRust作者: Jim Blandy,Jason Orendorff,中田秀基出版社/メーカー: オライリージャパン発売日: 2018…

rust で並列処理

rust は並列処理が作りやすい言語である。言語レベルで完全にスレッド安全性が担保されていると言って良いだろう。 以下は0から15の値の合計を4つのスレッドを使って計算するrustのソースである。 extern crate crossbeam; fn main() { let mut sum0: u64 = …