对于给定数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)。
如何处理?
答案 0 :(得分:6)
对于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-1
如果gcd(n,φ(n)) = p^a * q^(b-1)
除p
,q-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))
和p
,因此您有q
和y^2 - 4*x = (q-p)^2
。然后查找q = (y + sqrt(y^2 - 4*x))/2
和p = y-q
很简单:a
,b
和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))
和{{1}}。找到指数{{1}}再次是微不足道的。
所以仍然需要决定你拥有哪种情况。当且仅当{{1}}是素数时才有案例2。
为此,你需要一个体面的素性测试。或者你可以先假设你有案例1,如果不成功,可以断定你有案例2。
答案 1 :(得分:0)
尝试计算n /(n - φ(n))是什么。
跟进:
n /(n - φ(n))= pq。你只需要将p除以pq。