結果

問題 No.3030 ミラー・ラビン素数判定法のテスト
ユーザー yosswi414yosswi414
提出日時 2020-05-05 11:10:31
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,340 bytes
コンパイル時間 796 ms
コンパイル使用メモリ 97,092 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-04-29 13:55:37
合計ジャッジ時間 1,893 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <algorithm>
#include <random>
#include <cassert>

using ll = long long;

template<class T>
T power(T x, T y, T p) {
	T res = 1;
	x = x % p;
	while (y) {
		if (y % 2 != 0)res = (res * x) % p;
		y /= 2;
		x = (x * x) % p;
	}
	return res;
}

ll uniformInteger(const ll& lower, const ll& upper) {
	assert(lower <= upper);
	std::random_device rnd;
	std::mt19937_64 mt(rnd());
	std::uniform_int_distribution<> rng(0, upper);
	ll rn = rng(mt);
	return rn + lower;
}

const int bound_mrpt = 2e1; // Pr = 1 / 4^bound_mrpt
bool MillerRabbinPrimalityTest(const ll& n, const int bound = bound_mrpt) {
	if (n<0) return false;
  if (n <= 1) return false;
	if (n == 2) return true;
	if (n % 2 == 0)return false;

	ll d = n - 1;
	int s = 0;
	for (;;) {
		if (d%2 != 0)break;
		d = d/2;
		++s;
	}
	for (int k = 0; k < bound; ++k) {
		ll a(uniformInteger(1, n - 1));
		ll ad(power(a, d, n));
		//std::cout << a << "\t" << ad << "\n";
		if (ad == 1) continue;
		for (int r = 1; r < s && ad != n - 1; ++r) {
			ad = (ad * ad) % n;
		}
		if (ad == n - 1)continue;
		else return false;
	}
	return true;
}


int main() {
	int n;
	std::cin>>n;
	while(n--){
	    ll p;
	    std::cin>>p;
	    std::cout<<p<<" "<<(MillerRabbinPrimalityTest(p)?1:0)<<std::endl;
	}
}
0