用于java或scala中的整数分解的库

时间:2012-07-23 10:23:40

标签: java scala math factorization

关于如何实现分解有很多问题,但是对于生产用途,我宁愿使用开源库来获得高效且经过充分测试的东西。 我正在寻找的方法如下:

static int[] getPrimeFactors(int n)

对于n = 12

,它将返回{2,2,3}

库也可能有超载来处理long或甚至BigInteger类型

问题不是关于特定的应用程序,而是关于拥有一个可以很好地处理这个问题的库。很多人认为根据数字的范围需要不同的实现,在这方面,我希望库在运行时选择最合理的方法。

通过高效我并不是说“世界上最快”(我不会在JVM上工作......),我只是意味着在一秒而不是一小时内处理int和long range。

4 个答案:

答案 0 :(得分:4)

这取决于你想做什么。如果你的需求是适度的(比如,你想解决Project Euler个问题),Pollard的rho算法的简单实现将立即找到多达十或十二位的因子;如果这就是你想要的,请告诉我,我可以发布一些代码。如果你想要一个用Java编写的更强大的保理程序,你可以查看Dario Alpern applet背后的源代码;我不知道测试套件,它真的不是用开放的api设计的,但它确实有很多用户并且经过了充分的测试。大多数重型开源因子分解程序都是用C或C ++编写的,并使用GMP大整数库,但您可以通过语言的外部函数接口访问它们。查找gmp-ecmmsievepariyafu等名称。如果那些不能让您满意,那么请求更多帮助的好地方是Mersenne Forum

答案 1 :(得分:1)

如果你想解决问题,而不是得到你想要的东西,你需要一张桌子。您可以使用愚蠢的慢速方法对其进行预计算,存储它,然后以微秒为单位查找任意数字的因子。特别是,您需要一个表,其中最小因子列在与该数字对应的索引中 - 如果您使用试验除法删除一些最小的素数,那么内存效率会更高 - 然后沿着表格向下走,直到你命中1(意味着没有更多的除数;你剩下的是素数)。每个表项只需要两个字节,这意味着您可以将所有内容存储在任何比智能手机更大的现代机器上。

如果您感兴趣,我可以演示如何创建它,并展示如何检查它是否正确,可靠性高于您希望通过活动社区和复杂算法的单元测试实现(除非您运行生成此表的算法并验证一切正常。

答案 2 :(得分:0)

  

如果多项式是原始的,我需要它们进行测试。

这比试图找到所有数字的因子要快。

public static boolean gcdIsOne(int[] nums) {
    int smallest = Integer.MAX_VALUE;
    for (int num : nums) {
        if (num > 0 && smallest < num)
            smallest = num;
    }
    OUTER:
    for (int i = 2; i * i <= smallest; i = (i == 2 ? 3 : i + 2)) {
        for (int num : nums) {
            if (num % i != 0)
                continue OUTER;
        }
        return false;
    }
    return true;
}

答案 3 :(得分:-2)

我在scala中尝试过这个函数。这是我的结果:

def getPrimeFactores(i: Int) = {
  def loop(i: Int, mod: Int, primes: List[Int]): List[Int] = {
    if (i < 2) primes      // might be i == 1 as well and means we are done
    else {
      if (i % mod == 0) loop(i / mod, mod, mod :: primes)
      else loop(i, mod + 1, primes)
    }
  }
  loop(i, 2, Nil).reverse
}

我尝试过尽可能多的功能。
if (i % mod == 0) loop(i / mod, mod, mod :: primes)检查我们是否找到了除数。如果我们这样做,我们将它添加到素数并按mod除以。
如果我们没有找到新的除数,我们只是增加除数。
loop(i, 2, Nil).reverse初始化函数并逐渐对结果进行排序。