Skip to content

Instantly share code, notes, and snippets.

@ogrew
Last active April 6, 2022 14:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ogrew/cd0a1f1dcf5fa9f6e2ef310dea0822ea to your computer and use it in GitHub Desktop.
Save ogrew/cd0a1f1dcf5fa9f6e2ef310dea0822ea to your computer and use it in GitHub Desktop.
フェルマーテスト
use rug::{ops::Pow, Assign, Integer};
fn fermat_test(target: u32, base: u32) -> bool {
let n = target;
let mut a = Integer::new();
a.assign(base);
// 合成数であることを正とする
if a.pow(n - 1) % n != 1 {
return true;
}
return false;
}
fn gcd(a: u32, b: u32) -> u32 {
if a == 0 {
return b;
} else {
return gcd(b % a, a);
}
}
fn main() {
let args: Vec<String> = std::env::args().collect();
let target_str = &args[1];
let target = target_str.parse().unwrap();
let base_str = &args[2];
let base = base_str.parse().unwrap();
// 引数同士が互いに素であることをチェック
if gcd(target, base) != 1 {
println!("[a = {}] and [n = {}] must be coprime", base, target);
return;
}
if fermat_test(target, base) {
println!("[a = {}] {} is composite number", base, target);
} else {
println!("[a = {}] {} is probably prime number", base, target);
}
}
#[test]
fn fermat_test_test() {
assert_eq!(fermat_test(11, 2), false);
assert_eq!(fermat_test(423, 2), true);
assert_eq!(fermat_test(763, 2), true);
assert_eq!(fermat_test(1993, 3), false);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment