【RUST】記念日判定⑥【はるまき@エンジニアカップル】
0.はじめに
記念日には何か意味を持たせたいですよね.
そこで理系的に意味のある素数の日にしたいと思いました.
★★★★★ 過去の投稿一覧 ★★★★★
1.素数判定プログラム
最近流行りのRUSTの勉強も兼ねて,RUSTで構築しました.
use rand::Rng; // 乱数発生モジュール
use mod_exp::mod_exp; // べき乗余モジュール
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// main 関数
//
fn main() {
println!("===================================");
println!("Prime number detect!");
// 判定したい数字
let target_number:u64 = 20211209;
let prime_flag = is_prime(target_number);
if prime_flag{
println!("{} is `prime number`", target_number);
}else{
println!("{} is not `prime number`......", target_number);
}
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 素数判定 関数
//
fn is_prime(number:u64) -> bool {
// **********************************
// init param
//
// フェルマーテストの試行回数
let i_max:u8 = 10;
// **********************************
// 例外処理
//
// 下記の数字は素数判定しない
if number == 1 {
println!("number is 1");
return false;
}
if number == 2 {
println!("number is 2");
return true;
}
// **********************************
// i_max回 フェルマーテストを行う
//
for _ in 1..i_max{
// ________________________
// a をランダムに選定 : aを, 2からn−1までの数からランダムに選ぶ
let a = rand::thread_rng().gen_range(2, number - 1);
// ________________________
// ユークリッドの互除法 : aがnと互いに素でなければ, nは合成数
let gcd_a:u64 = gcd(number, a);
if gcd_a != 1 {
// 合成数のためNG
return false;
}
// ________________________
// a^(p-1) is not (mod p)
let ap_1 = mod_exp(a, number-1, number);;
if ap_1 != 1 {
// 合成数のためNG
return false;
}
}
// **********************************
// ここまで来ればフェルマーテストクリア
// おそらく素数である
//
true
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// ユークリッドの互除法 関数
//
fn gcd(number:u64, a0:u64) -> u64{
let (mut _a, mut _b) = (number, a0);
let (mut a, mut b) = (number, a0);
while b > 0{
_a = b;
_b = a % b;
a = _a;
b = _b;
}
return _a
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// ref : 参考サイト
//
// https://docs.rs/modpow/latest/modpow/fn.modpow.html
//
// https://qiita.com/srtk86/items/609737d50c9ef5f5dc59
//
// https://docs.rs/mod_exp/latest/mod_exp/fn.mod_exp.html
[package]
name = "fermat_sample"
version = "0.1.1"
authors = ["root"]
edition = "2018"
[dependencies]
rand = "0.3.0"
modpow = "1.0.1"
num = "0.4.0"
mod_exp = "1.0.1"
chrono = "0.4.6"
2.実行してみる
↓ Docker起動
C:\Users\masaki\Dropbox\PC\Documents\project_local\rust>docker run -v C:\Users\masaki\Dropbox\PC\Documents\project_local\rust\share_volume:/home -it --rm --name my-running-app2 my-rust-app:sample
root@606e839361e6:/# cd home/fermat_sample/
↓ RUST実行
root@606e839361e6:/home/fermat_sample# cargo run
Updating crates.io index
Downloaded num v0.4.0
Downloaded rand v0.3.23
Downloaded modpow v1.0.1
Downloaded mod_exp v1.0.1
Downloaded chrono v0.4.19
Downloaded num-iter v0.1.42
Downloaded num-rational v0.4.0
Downloaded num-traits v0.2.14
Downloaded num-integer v0.1.44
Downloaded num-complex v0.4.0
Downloaded num-bigint v0.4.3
Downloaded libc v0.2.109
Downloaded rand v0.4.6
Downloaded autocfg v1.0.1
Downloaded num v0.2.1
Downloaded time v0.1.44
Downloaded num-bigint v0.2.6
Downloaded num-rational v0.2.4
Downloaded num-complex v0.2.4
Finished dev [unoptimized + debuginfo] target(s) in 1m 03s
Running `target/debug/fermat_sample`
↓ 実行結果
===================================
Prime number detect!
20211209 is `prime number`
root@606e839361e6:/home/fermat_sample#
3.おわりに
今回は素数を判定する部分を作成しました.
次回は1年間を通して素数の日を探索してみたいと思います.
#プログラム
#プログラミング
#rustプログラミング入門
#rustプログラミング
#RUST
#素数判定
#素数
#数字
#記念日
#特別な日
#きねんび
#エンジニアカップル
#カップル
#harumakich
#はるまきチャンネル