【问题标题】:brute force BigInteger Factorization蛮力 BigInteger 分解
【发布时间】:2013-04-15 01:51:05
【问题描述】:

正如标题所示,我正在努力尝试强制分解因数为 2 个素数的大整数。我想知道是否有办法在 for 循环中使用 for 循环。我知道这是一种可怕的方法,但我还是想这样做。 (我打算使用 fermats 因式分解定理,但是如果没有一些额外的方法/库,你就不能 sqrt BigIntegers,我不能这样做)所以试着看看你是否可以帮助我做我正在做的事情。大致是这样的:

BigInteger n = new BigInteger("270653957405596110781");  // this is what i need the factors of
BigInteger TWO = new BigInteger("2");
for( BigInteger i = new BigInteger("1"); i < n.divide(TWO); i.nextProbablePrime() ){
    for( BigInteger k = new BigInteger("1"); k < n.divide(TWO); k.nextPossiblePrime){
        if(i.Multiply(k) = n){
            //i and k are the factors, and return them
        }
     }
 }

显然那太糟糕了,我知道你不能通过说 i.nextPossiblePrime() 来增加下一个素数,你需要它说 i = i.nextpossible prime,我只是向你展示了我想要的那种它工作;但这就是我问的原因,因为我想知道这样的事情是否可能!

请让我知道这条路线是否可行,以及如何修复这个糟糕的代码,让它像我想象的那样运行!

谢谢!

【问题讨论】:

  • 暴力分解是相同的算法,无论它是应用于 BigIntegers 还是常规整数。您可以找到它的伪代码,例如here 或工作 Java 代码 here

标签: java primes biginteger brute-force factorization


【解决方案1】:

我拒绝“只是帮助你做你正在做的事情”。它不会工作。

我谦虚地在我的博客上推荐这篇文章Programming with Prime Numbers。那里讨论的 pollard-rho 算法将毫无困难地考虑您的数字。包含使用 BigInteger 的 java 实现。

顺便说一句,270653957405596110781 = 7588940707 * 35664260383。

【讨论】:

  • 感谢您的提示,但我真的只是想知道我所说的方式是否可行,我不能真正从您的文章中复制所有代码并使用它。虽然感谢链接
【解决方案2】:

我对计算机科学还很陌生(8 个月),这是我第一次回答问题,如果帮不上忙,我很抱歉。如果我错了,请纠正我(说真的,我正在努力学习),但我认为您正在寻找的是二次筛。 http://en.wikipedia.org/wiki/Quadratic_sieve你似乎比我先进,但我用一天的时间就能实现它。它在分解大数方面非常有效。

我对 Fermat 的因式分解方法一无所知,但是您不能将 BigInteger 继承到一个新类中并自己实现它,并使用平方根函数完成吗?我不知道你需要什么样的精度,但你总是可以基于 BigDecimal。

希望对你有帮助

编辑:我猜你没有测试你的代码。您不能将

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多