密碼學筆記 - Fermat's Factorization Method

1 min read

有一個奇合數 nn ,是兩個奇質數的乘積 n=pqn = pqa=p+q2,b=pq2a = \frac{p + q}{2}, b = \frac{p - q}{2} 那麼 n=(a+b)(ab)=a2b2n = (a + b)(a - b) = a^2 - b^2 但是今天我們不知道 p,qp, q ,而我們想要分解 nn 那我們就猜 a=na = \lceil \sqrt{n} \rceil ,測試 a2na^2 - n 是不是完全平方數 猜到的話可以從 a,ba, b 反推回 p,qp, q 沒猜到就把 aa 加一繼續猜

使用條件

pq|p-q| 很小,可以有效的分解合數 nn

程式碼 ( python )

import math
import gmpy2

def fermat(n):
    a = math.ceil(math.sqrt(n))
    b2 = a * a - n
    while not gmpy2.iroot(b2, 2)[1]:
        a = a + 1
        b2 = a * a - n
    b = math.sqrt(b2)
    return [a + b, a - b]