Más contenido relacionado Similar a RSA暗号で学ぶ初めてのCommonLisp #素因数分解(試行除算) (20) RSA暗号で学ぶ初めてのCommonLisp #素因数分解(試行除算)2. 01. Profile
Akiko Terada (@pgf2)
Work : software developer
5. 04. RSA
複合鍵 : p, q
暗号鍵 : n = p*q
1. 異なる素数 p, q を選ぶ
2. メッセージ(平文)を n で暗号化する
3. メッセージ(暗号文)を p, q で複合化する
安全性は効率的に
・与えられた整数 n を素因数分化する方法
・ある整数が素数であることを証明する方法
に依存する
6. 05. Trial division - algorithm
Input: 正の整数 n
Output: 素因数
Step1: op = 2
Step2: n ≡ 0 (mod op)
→ true: op は n の素因数 End
→ false: Step3
Step3: op++
Step4: op >= floor(√n)
→ true: n は素数 End
→ false: Step2
7. 05. Trial division - program
(defun prime-factor(n)
(cond ((= n 1) (list nil 1))
(t
(labels ((pf (&optional (op 2))
(cond ((> op (sqrt n)) (list t n))
((zerop (rem n op)) (list nil op))
(t (pf (+ op 1))))))
(pf)))))
(defun trial-division(n)
(let ((prime-factors nil))
(cond ((= n 1) (setq prime-factors (list n)))
(t
(labels ((td (&optional (op n))
(let ((lst (prime-factor op)))
(setq prime-factors (cons (car (cdr lst)) prime-factors))
(unless (car lst)
(td (/ op (car (cdr lst))))))))
(td))
prime-factors))))
8. 05. Trial division - efficiency
素因数分解したい整数 n が
小さい素数で割り切れるときのみ効率的となる!
→ フェルマーの素因数分解へ続く
整数 n が√ n より余り大きくない因数を持つときに
効率が良くなるアルゴリズム