algorithm - 将数字表示为质数之和

标签 algorithm dynamic-programming

给我一​​个大号n我需要找出它是否可以表示为 K 个质数之和。

例 9 可以表示为 3 个质数之和为 2+2+5。

我正在尝试使用子集和的变体,但数字太大,无法生成所有素数。

问题来自当前HackerRank contest .限制是 1 <= n, K <= 10^12

最佳答案

对于 K = 1,如果 N 是素数,答案显然是"is"

对于 K = 2,根据 Goldbach conjecture , 已验证 N 高达 10^18 左右,如果 N 是偶数且 N >= 4 或 N - 2 是素数,则答案为"is"。

有趣的情况是 K = 3。显然,如果 N < 6,答案是否定的,因为可以表示为三个素数之和的最小数是 2 + 2 + 2 = 6。 如果 N >= 6,则 N - 2 或 N - 3 是偶数且 >= 4,因此我们可以再次应用哥德巴赫猜想。

所以对于 K = 3,如果 N >= 6,答案是"is"。

通过归纳法(提示:只需使用 K - 素数 2 的 3 倍),我们可以证明对于 K >= 3,答案是"is" iif N >= 2*K,所以只有 K = 1 的情况和 K = 2 是非常重要的,只需要一个简单的素数检查,例如通过Miller–Rabin在 O(log^4 N) 中。

编辑:作为奖励,这个证明还给出了一个构造性算法来输出分区。我们使用多个 2 和一个 3 来得到 K = 2。棘手的 K = 2, N even 情况并不像看起来那么难:我们从 computational verification 知道哥德巴赫猜想,对于 N >= 12,存在一个哥德巴赫分区,其素数 < 5200 左右。这样的质数少于 700 个,因此我们可以在合理的时间内检查所有这些质数。

关于algorithm - 将数字表示为质数之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789802/

相关文章:

c# - 如何在 .net 中加密文件并在 android 中解密

javascript - 如何替换句子中多个位置的文本?

python - 自下而上构建二叉树

algorithm - 如何从一个联合的、离散的、概率分布函数中进行数值采样

arrays - 使用数组中左右索引给出的约束最大化权重总和

algorithm - 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

java - 具有最大间隙长度 3 的全局成对序列比对

c++ - 平面扫描算法 : How to order the segments after intersection point

按总和顺序生成 k 个元素子集的算法

arrays - 2D数组中的最大路径总和