結果
問題 | No.3030 ミラー・ラビン素数判定法のテスト |
ユーザー | 👑 Mizar |
提出日時 | 2022-09-11 04:00:45 |
言語 | JavaScript (node v21.7.1) |
結果 |
AC
|
実行時間 | 1,551 ms / 9,973 ms |
コード長 | 1,354 bytes |
コンパイル時間 | 50 ms |
コンパイル使用メモリ | 5,376 KB |
実行使用メモリ | 51,664 KB |
最終ジャッジ日時 | 2024-05-05 13:46:25 |
合計ジャッジ時間 | 9,514 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 81 ms
40,320 KB |
testcase_01 | AC | 78 ms
40,192 KB |
testcase_02 | AC | 81 ms
40,448 KB |
testcase_03 | AC | 82 ms
40,448 KB |
testcase_04 | AC | 1,139 ms
50,460 KB |
testcase_05 | AC | 1,060 ms
51,196 KB |
testcase_06 | AC | 719 ms
50,292 KB |
testcase_07 | AC | 727 ms
50,132 KB |
testcase_08 | AC | 720 ms
50,268 KB |
testcase_09 | AC | 1,551 ms
51,664 KB |
ソースコード
const modmul = (a, b, n) => a * b % n; const modpow = (b, p, n) => { let r = ((p & 1n) == 0n) ? 1n : b; while(true) { p >>= 1n; if(p == 0n) { return r; } b = modmul(b, b, n); if((p & 1n) != 0) { r = modmul(r, b, n); } } }; const isprime = function(n) { const bases = [2n,325n,9375n,28178n,450775n,9780504n,1795265022n]; if(n == 2n) { return true; } if(n < 2n || (n & 1n) == 0n) { return false; } let n1 = n - 1n; let s = 0; let d = n1; while((d & 1n) == 0n) { s += 1; d >>= 1n; } return bases.every((base) => { let a = (base < n) ? base : base % n; if(a == 0n) { return true; } let t = modpow(a, d, n); if(t == 1n || t == n1) { return true; } for(let i = 1; i < s; ++i) { t = modmul(t, t, n); if(t == n1) { return true; } } return false; }); }; const hrStart = process.hrtime(); let n = null; process.stdin.setEncoding("utf8"); const reader = require("readline").createInterface({input: process.stdin}); reader.on("line", (l) => { if (n === null) { n = l; } else { console.log(`${l} ${isprime(BigInt(l))?1:0}`); } }); reader.on("close", () => { const hrEnd = process.hrtime(hrStart); console.error(`${hrEnd[0]*1e3+hrEnd[1]/1e6}ms`); });