結果

問題 No.3030 ミラー・ラビン素数判定法のテスト
ユーザー 👑 MizarMizar
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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`);
});
0