結果
| 問題 | 
                            No.8030 ミラー・ラビン素数判定法のテスト
                             | 
                    
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-09-07 18:21:17 | 
| 言語 | Ruby  (3.4.1)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 3,529 ms / 9,973 ms | 
| コード長 | 1,048 bytes | 
| コンパイル時間 | 654 ms | 
| コンパイル使用メモリ | 7,168 KB | 
| 実行使用メモリ | 12,416 KB | 
| 最終ジャッジ日時 | 2024-11-22 23:46:11 | 
| 合計ジャッジ時間 | 11,737 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 10 | 
コンパイルメッセージ
Syntax OK
ソースコード
def pow_mod(a, k, n)
    ret = 1
    while k > 0
        if k.odd?
            ret = (ret * a) % n
        end
        a = (a ** 2) % n
        k >>= 1
    end
    ret
end
def miller_rabin(n, bases)
    d = n - 1
    s = 0
    while d.even?
        d = d >> 1
        s = s + 1
    end
    for a in bases do
        if n <= a
            return true
        end
        a = pow_mod(a, d, n)
        if a == 1 then
        else
            r = 1
            while a != n - 1 do
                if r == s then
                    return false
                end
                a = a * a % n
                r = r + 1
            end
        end
    end
    return true
end
def is_prime(n)
    return false if n < 2
    return true if n < 4
    return false if n.even?
    return miller_rabin(n, Array[2, 7, 61]) if n < 4759123141
    return miller_rabin(n, Array[2, 325, 9375, 28178, 450775, 9780504, 1795265022])
end
N = gets.to_i
N.times do
  x = gets.to_i
  if is_prime(x)
    puts [x, 1].join(' ')
  else
    puts [x, 0].join(' ')
  end
end