結果
問題 | No.3030 ミラー・ラビン素数判定法のテスト |
ユーザー | かりあげクン |
提出日時 | 2020-08-26 10:45:04 |
言語 | Nim (2.0.2) |
結果 |
WA
|
実行時間 | - |
コード長 | 943 bytes |
コンパイル時間 | 3,134 ms |
コンパイル使用メモリ | 64,320 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-18 18:12:59 |
合計ジャッジ時間 | 3,485 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
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 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) echo ($i & " " & $int(ib))