我有一组数字,显然都是正整数,我想做的是将它们分成尽可能少的组,每个组的 GCD 大于 1。最大可能的数字是 2^64-1。我还需要做的是尽可能降低复杂性。我知道从 0 到 2^64-1 有很多素数,但每个素数都将在其自己的组中,仅包含一个数字。有什么想法吗?
将一组数字分成最小组,每个组都有一个共同的分隔符
计算科学
优化
2021-12-10 09:58:09
1个回答
如果您的数字集包含从 1 到的任何数字,那么答案很明显:您将需要组,其中是小于或等于的素数。这是因为每个素数以及 1 都不能与其他任何素数进入同一组,因为它们没有公用分隔符。然而,其余的数字显然是其中一个素数的倍数,例如,您可以将其放入其最小除法器的组中。对所有内容进行分组的最佳复杂度算法是使用 Eratosthenes 筛:
- 将 1 放入自己的组中
- 将 2 到中 2 的所有倍数归为一组
- 将3到的所有3的倍数,之前没有放入一个组,放入自己的组
- 既然你已经处理了4个,跳过它
- 将5到的所有5的倍数,之前没有放入一个组,放入自己的组
- 由于您已经处理了 6 个,请跳过它
- 将7到的所有7的倍数之前没有放入一个组,放入他们自己的组
- 等等。
如果您有一组不完整的数字,情况会更加复杂。但是上面筛算法的变体应该仍然能够完成这项工作。