将一组数字分成最小组,每个组都有一个共同的分隔符

计算科学 优化
2021-12-10 09:58:09

我有一组数字,显然都是正整数,我想做的是将它们分成尽可能少的组,每个组的 GCD 大于 1。最大可能的数字是 2^64-1。我还需要做的是尽可能降低复杂性。我知道从 0 到 2^64-1 有很多素数,但每个素数都将在其自己的组中,仅包含一个数字。有什么想法吗?

1个回答

如果您的数字集包含从 1 到的任何数字,那么答案很明显:您将需要组,其中是小于或等于的素数。这是因为每个素数以及 1 都不能与其他任何素数进入同一组,因为它们没有公用分隔符。然而,其余的数字显然是其中一个素数的倍数,例如,您可以将其放入其最小除法器的组中。对所有内容进行分组的最佳复杂度算法是使用 Eratosthenes 筛:Nπ(N)+1π(N)Nπ(N)

  • 将 1 放入自己的组中
  • 将 2 到中 2 的所有倍数归为一组N
  • 将3到的所有3的倍数,之前没有放入一个组,放入自己的组N
  • 既然你已经处理了4个,跳过它
  • 将5到的所有5的倍数,之前没有放入一个组,放入自己的组N
  • 由于您已经处理了 6 个,请跳过它
  • 将7到的所有7的倍数之前没有放入一个组,放入他们自己的组N
  • 等等。

如果您有一组不完整的数字,情况会更加复杂。但是上面筛算法的变体应该仍然能够完成这项工作。