結果
| 問題 |
No.8030 ミラー・ラビン素数判定法のテスト
|
| ユーザー |
|
| 提出日時 | 2018-04-03 15:59:50 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,539 bytes |
| コンパイル時間 | 2,196 ms |
| コンパイル使用メモリ | 84,356 KB |
| 実行使用メモリ | 814,464 KB |
| 最終ジャッジ日時 | 2024-11-18 16:13:44 |
| 合計ジャッジ時間 | 43,920 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 7 TLE * 2 MLE * 1 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
#include <random>
using namespace std;
unsigned long multiplication(unsigned long base, long exponent, unsigned long mod){
if(exponent % 2){
return (multiplication(base, exponent - 1, mod) + base) % mod;
}else if(exponent){
return multiplication(base, exponent / 2, mod) * 2 % mod;
}else{
return 0;
}
}
long power(long base, long exponent, long mod){
if(exponent % 2){
return multiplication(power(base, exponent - 1, mod), base, mod);
}else if(exponent){
long root_ans = power(base, exponent / 2, mod);
return multiplication(root_ans, root_ans, mod);
}else{
return 1;
}
}
bool if_prime(long number){
if(number <= 1){
return false;
}
int exponent_of_2 = 0;
long number_tmp = number - 1;
while(number_tmp % 2 == 0){
exponent_of_2++;
number_tmp /= 2;
}
random_device rnd;
for(int j = 0; j < 50; j++){
long random_number = rnd() % (number - 1) + 1;
bool if_composite = (power(random_number, number_tmp, number) != 1);
for(int k = 0; k < exponent_of_2; k++){
if_composite &= (power(random_number, (1 << k) * number_tmp, number) != number - 1);
}
if(if_composite){
return false;
}
}
return true;
}
int main(){
int N;
cin >> N;
for(int i = 0; i < N; i++){
long x;
cin >> x;
cout << x << " " << if_prime(x) << endl;
}
}