結果
| 問題 |
No.8030 ミラー・ラビン素数判定法のテスト
|
| ユーザー |
かりあげクン
|
| 提出日時 | 2020-08-26 10:41:22 |
| 言語 | Nim (2.2.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 979 bytes |
| コンパイル時間 | 2,938 ms |
| コンパイル使用メモリ | 65,060 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-18 18:12:53 |
| 合計ジャッジ時間 | 3,446 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 RE * 7 |
ソースコード
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 ""
かりあげクン