結果

問題 No.3030 ミラー・ラビン素数判定法のテスト
ユーザー かりあげクンかりあげクン
提出日時 2020-08-26 10:41:22
言語 Nim
(2.0.2)
結果
RE  
実行時間 -
コード長 979 bytes
コンパイル時間 4,378 ms
コンパイル使用メモリ 64,128 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-04-29 14:08:22
合計ジャッジ時間 3,793 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

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)
  stdout.write($z & " " & $int(ib))
  stdout.flushFile
  echo ""
0