我知道我已经发布了它,但人们误解了我的意思,直到我修好帖子就死了。
我需要的是一种使用C ++和GMP(Gnu Multiple Precession lib)有效地计算(找到一个数字的素数因子)大数(可能达到2048位)的方法。或者更不用说任何其他方式。
这些数字实际上是随机的,所以几乎没有机会难以分解,即使数字难以计算,我也可以重新编号(尽管不能选择)。
我该怎么做?
答案 0 :(得分:2)
没有有效的方法(可能)。这种假设是现代密码学的基础。
答案 1 :(得分:1)
答案 2 :(得分:1)
为什么你认为这不难?是的,会有一些小因素。但其余部分将足够大,而且通常需要一些认真的工作来考虑因素。
我建议用一些小素数进行试验,以便将小鱼从池塘中取出。然后你可能会尝试Pollard的rho方法,但我怀疑它有多少位数的机会。更好的是二次筛。
答案 3 :(得分:0)
有效地执行此操作的方法将打破许多当前使用的加密算法 这是一个NPC问题,所以....
答案 4 :(得分:0)
您是否尝试过quadratic sieve或general number field sieve? (QS更简单,更容易实现,对于非常大的数字,GNFS更快,但是你的数字可能不足以使GNFS比QS快得多)
编辑:根据a paper by Eric Landquist,QS与GNFS之间的交叉点约为110位=约365位。
答案 5 :(得分:0)
如果我没有遗漏任何东西这已知是一个“困难”的问题。 http://en.wikipedia.org/wiki/Integer_factorization。即目前不可能。
答案 6 :(得分:0)
没有已知的方法可以有效地计算大数。有关为何和现有技术的讨论,请参见Wikipedia。
正如评论所指出的,这个问题的难度是许多现代密码学的基础,特别是公钥加密。
你可以做的是存储一个小素数表,并通过该表将你的大数除以每个候选素数。如果数字“太难”(即你用完了小素数),那么重新滚动。