見出し画像

【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
#はるまきチャンネル









この記事が気に入ったらサポートをしてみませんか?