結果
| 問題 |
No.8030 ミラー・ラビン素数判定法のテスト
|
| ユーザー |
Common Lisp
|
| 提出日時 | 2024-11-02 08:59:10 |
| 言語 | Common Lisp (sbcl 2.5.0) |
| 結果 |
AC
|
| 実行時間 | 720 ms / 9,973 ms |
| コード長 | 1,179 bytes |
| コンパイル時間 | 298 ms |
| コンパイル使用メモリ | 35,624 KB |
| 実行使用メモリ | 84,676 KB |
| 最終ジャッジ日時 | 2024-11-02 08:59:14 |
| 合計ジャッジ時間 | 4,066 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
コンパイルメッセージ
; compiling file "/home/judge/data/code/Main.lisp" (written 02 NOV 2024 08:59:10 AM): ; wrote /home/judge/data/code/Main.fasl ; compilation finished in 0:00:00.014
ソースコード
(defun pow-mod (a b m)
(let ((r 1))
(loop while (> b 0)
when (oddp b)
do (setq r (mod (* r a) m))
do (setq a (mod (* a a) m))
(setq b (ash b -1)))
r))
(defun miller-rabin (n bases)
(let ((d (1- n))
(s 0))
(loop while (evenp d)
do (incf s)
(setq d (ash d -1)))
(dolist (base bases)
(if (<= n base)
(return-from miller-rabin t)
(let ((a (pow-mod base d n)))
(unless (= a 1)
(let ((r 1))
(loop while (/= a (1- n))
if (= r s)
do (return-from miller-rabin nil)
else
do (incf r)
(setq a (mod (* a a) n))))))))
t))
(defun primep (n)
(cond
((<= n 1) nil)
((<= n 3) t)
((evenp n) nil)
((< n 4759123141) (miller-rabin n '(2 7 61)))
(t (miller-rabin n '(2 325 9375 28178 450775 9780504 1795265022)))))
(defun main (&rest argv)
(declare (ignorable argv))
(let* ((n (read)))
(dotimes (_ n)
(let* ((x (read)))
(format t "~d ~d~%" x (if (primep x) 1 0))))))
(main)
Common Lisp