結果
問題 | No.3030 ミラー・ラビン素数判定法のテスト |
ユーザー | かりあげクン |
提出日時 | 2020-08-26 10:35:50 |
言語 | Nim (2.0.2) |
結果 |
RE
|
実行時間 | - |
コード長 | 984 bytes |
コンパイル時間 | 5,033 ms |
コンパイル使用メモリ | 65,268 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-18 18:12:00 |
合計ジャッジ時間 | 3,795 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 1 ms
6,816 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | RE | - |
testcase_09 | RE | - |
ソースコード
import strutils const Mod : int = 1000000007 proc powMod (n : int, x : int, m = Mod) : int = if x == 0: return 1 if n == 1: return 1 if x == 1: return (n mod m) if x mod 2 == 0: return powMod((n * n) mod m, x div 2, m) mod m else: return n * powMod((n * n) mod m, x div 2, m) mod m proc mr_check(n,d,s,p:int) : bool = var x = powMod(p,d,n) if x == 1: return false for i in 0 ..< s: if x == n - 1 : return false x = x * x mod n return true proc miller_rabin*(n : Natural) : bool = if n <= 1 : return false # n - 1 = d * (2 ^ s) var s = 0 d = n - 1 while d mod 2 == 0: s += 1 d = d shr 1 let bases = [2,3,5,7,11,13,17,263,1321,30983,500911,9780517,1795265047] for p in bases: if p == n: return true if mr_check(n, d, s, p): return false return true var n = stdin.readLine.parseInt for i in 0 ..< n : var z = stdin.readLine.parseInt var ib : bool = miller_rabin(z) stdout.write($z & " " & $int(ib)) echo ""