当前位置: 首页 > 知识库问答 >
问题:

使用素数阵列直到目标的并行素数因式分解

郏景澄
2023-03-14

我已经在Stack上看到了这个问题,但是我找不到任何具体的答案,或者至少我能理解的答案。所以这是我的问题:

如何并行化一个大数的因式分解?

我见过这样的回答:“…他只需要为找到的每个因素生成一个新线程,然后用某种同步对象来收集所有的因素”

但是我不太明白这是怎么做到的。有人能用例子解释一下吗?

共有1个答案

闻人哲茂
2023-03-14

如果你有一个素数列表。你可以这样做(对于真正的大数,可能需要一段时间)。用一张地图来保存素数因子的频率计数和它们出现的次数。

  • 继续用当前素数除以目标,直到它不除以为止
  • 然后使用BigInteger检查该值是否为素数(如果剩余值很大且为素数,则会大大加快处理速度)
  • 继续下去,直到找到所有的因子或者你用完了素数
long candidate = 498977279919318060L;

Map<Long, Integer> factors = new TreeMap<>();
for (long p : primes) {
    while (candidate % p == 0) {
        factors.compute(p, (k,v) -> v == null ? 1 : v+1);
        candidate/=p;
    }
    if (BigInteger.valueOf(candidate).isProbablePrime(99)) {
        factors.put(candidate,1);
        candidate = 1;
        break;
    }
}
if (candidate != 1) {
    System.out.println("factorization incomplete - stopped at " + candidate);
}

factors.entrySet().forEach(System.out::println);

指纹

2=2
3=5
5=1
7=1
19=3
29=1
73=2
101=1
137=1

您可以通过首先将每个因子提高到其频率,然后使用duce计算这些结果的乘积来验证结果。

long val = factors.entrySet().stream()
        .mapToLong(e -> (long) Math
                .pow(e.getKey().doubleValue(), e.getValue()))
        .reduce(1L, (a, b) -> a * b);

System.out.println(val);

指纹

498977279919318060
 类似资料:
  • 我试图找到素数的素数因子,然后将它们添加到一个数组中,该方法将返回该数组。我的方法甚至没有结果,程序只是继续运行。有人能找出哪里出了问题吗?谢谢。 checkIfPrime方法是我之前写的一个有效的方法。它只是检查一个数字是否为素数,返回一个布尔值。我把它放在那里是为了检查minusPrime何时被划分为一个质数,而质数将不再被划分,并将其作为最后一个因子添加到数组中。

  • 我们不允许对书籍、工具、软件库等寻求建议的问题。您可以编辑问题,以便用事实和引文来回答。 我正在寻找用于快速素性测试和大数因式分解的Java API。任何指针都会对我很有帮助。 我找到的资源有: BigInteger-没有因式分解 素数-处理整数 LargeInteger-没有因式分解 我期待着一个API使用椭圆曲线分解或二次筛。 另一个资源:使用椭圆曲线方法的因式分解。 限制:10000位数字。

  • 问题内容: 我正在尝试实现一个函数,该函数将正整数作为输入并返回包含的素数分解中所有数字的列表。 我已经走了这么远,但我认为最好在这里使用递归,不确定如何在这里创建递归代码,基本情况是什么?首先。 我的代码: 问题答案: 一个简单的审判部门: 具有复杂性(最坏的情况)。您可以通过特殊情况2并仅在奇数上循环(或特殊情况下将更多小质数并在可能的除数上循环)来轻松改进它。

  • 我在一次采访中遇到了以下问题。 给定一个数组,您需要找到所有元素小于给定值 k 的子数组 ,例如 现在,值小于 4 的子数组是: 注意{4}是如何重复的,但没有考虑两次。现在,代码应该返回不同子阵列的计数 在本例中为3. 另一个示例: 不同的子阵列: 我的方法是找到小于给定值k(即O(n^2))的子阵列,然后将其插入类似无序集的内容中以删除重复项。 有没有解决这个问题的有效方法?

  • 我制作了一个两个类,构造类和main方法,其中我从用户输入中读取一个数字,并吐出该数字的素数分解,代码是用Java编写的。 主要方法: 这是我的课:

  • 问题内容: 我想找到小于10 ^ 12的大数的质分解。我得到了以下代码(在Java中): 首先,上述算法的复杂性是什么?我很难找到它。 而且对于大量的素数来说太慢了。 有没有更好的算法,否则如何优化这种算法? 问题答案: 如果您想分解 许多 大数,那么最好先找到质数最大(例如使用Eratosthenes的Sieve)。然后,您只需要检查那些质数是否是因数,而不是全部测试。