【问题标题】:Fast factorization快速分解
【发布时间】:2012-05-08 10:00:26
【问题描述】:

对于给定数 n(我们知道 n = p^a * q^b,对于一些素数 p,q 和一些整数 a,b)和给定数 φ(n) (http://en.wikipedia.org/wiki/Euler%27s_totient_function) 求p,q,a 和 b。

问题是 n 和 φ(n) 有大约 200 位数字,因此算法必须非常快。 这似乎是一个非常困难的问题,我完全不知道如何使用 φ(n)。

如何解决这个问题?

【问题讨论】:

    标签: algorithm discrete-mathematics factorization


    【解决方案1】:

    对于n = p^a * q^b,总数为φ(n) = (p-1)*p^(a-1) * (q-1)*q^(b-1)。不失一般性,p < q

    所以gcd(n,φ(n)) = p^(a-1) * q^(b-1) 如果p 不除q-1gcd(n,φ(n)) = p^a * q^(b-1) 如果pq-1

    在第一种情况下,我们有n/gcd(n,φ(n)) = p*qφ(n)/gcd(n,φ(n)) = (p-1)*(q-1) = p*q + 1 - (p+q),因此您有x = p*q = n/gcd(n,φ(n))y = p+q = n/gcd(n,φ(n)) + 1 - φ(n)/gcd(n,φ(n))。然后找到pq 很简单:y^2 - 4*x = (q-p)^2q = (y + sqrt(y^2 - 4*x))/2p = y-q。然后找到指数ab 很简单。

    在第二种情况下,n/gcd(n,φ(n)) = q。然后你可以很容易地找到指数b,除以q,直到除法留下余数,从而得到p^a。将φ(n) 除以(q-1)*q^(b-1) 得到z = (p-1)*p^(a-1)。然后p^a - z = p^(a-1)p = p^a/(p^a-z)。找到指数a 再简单不过了。

    因此,您仍需决定您拥有哪种情况。当且仅当 n/gcd(n,φ(n)) 是素数时,您有案例 2。

    为此,您需要一个体面的素数测试。或者您可以先假设您有案例 1,如果不成功,则得出您有案例 2 的结论。

    【讨论】:

    • 基本上,你需要知道totient的公式,并且你想找到p*qp+q。从那时起,您只需将原料洗牌,直到得到想要的结果。
    • 还有案例3:gcd(n,φ(n)) = p^(a-1) * q^b
    • @SaeedAmiri 关于案例3,由于我任意命名pq 使得p < q,这不可能发生,q 不能除p-1。跨度>
    • 好吧,我没有看到你的 p<q 假设。
    【解决方案2】:

    尝试计算 n / (n - φ(n)) 是什么。

    跟进:

    n / (n - φ(n)) = pq。您只需将 n 除以 pq。

    【讨论】:

    • 这不正确。 φ(6) = 2, 6 - φ(6) = 4 甚至不除 6。
    • 我计算出n / (n - φ(n)) = pq/(q+p-1)。我想这不是那么基本。
    • @BlueRaja-DannyPflughoeft,它确实有效。这很有趣,有什么建议为什么它会起作用,如何推导出这个公式?
    • @xan:您可以使用您链接的 wiki 页面上的方程式,然后做一些代数。
    • 是的,我弄错了细节,但原理是正确的。令 x 为 n 和 φ(n) 的最大公因数。那么有三种可能:n = px, n=qx 和 n = pqx, φ(n) = (p-1)(q-1)x。这些都很容易解决。
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2013-02-28
    • 2015-07-03
    • 2014-10-14
    • 2018-07-08
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多