結果
| 問題 |
No.8030 ミラー・ラビン素数判定法のテスト
|
| ユーザー |
|
| 提出日時 | 2024-04-30 22:42:41 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 416 ms / 9,973 ms |
| コード長 | 990 bytes |
| コンパイル時間 | 11,747 ms |
| コンパイル使用メモリ | 239,612 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-20 21:08:58 |
| 合計ジャッジ時間 | 14,623 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
package main
import (
"fmt"
"math/bits"
)
func main() {
var n int
fmt.Scanf("%d", &n)
for i := 0; i < n; i++ {
var x uint64
fmt.Scanf("%d", &x)
if isPrime(x) {
fmt.Printf("%d 1\n", x)
} else {
fmt.Printf("%d 0\n", x)
}
}
}
func modMul(a, b, m uint64) uint64 {
h, l := bits.Mul64(a, b)
_, rem := bits.Div64(h, l, m)
return rem
}
func modPow(x, y, m uint64) uint64 {
res := uint64(1)
for y > 0 {
if y&1 != 0 {
res = modMul(res, x, m)
}
x = modMul(x, x, m)
y >>= 1
}
return res
}
func isPrime(x uint64) bool {
if x <= 1 {
return false
}
if x == 2 {
return true
}
if x%2 == 0 {
return false
}
s := bits.TrailingZeros64(x - 1)
d := (x - 1) >> s
for _, a := range []uint64{2, 325, 9375, 28178, 450775, 9780504, 1795265022} {
if a%x == 0 {
continue
}
t := modPow(a, d, x)
if t == 1 || t == x-1 {
continue
}
for i := 1; t != x-1; i++ {
if i >= s {
return false
}
t = modMul(t, t, x)
}
}
return true
}