将数字表示为素数之和

时间:2014-05-21 17:12:54

标签: algorithm dynamic-programming

我获得了大量n,我需要找出它是否可以表示为K素数的总和。

Ex 9可以表示为3素数之和为2 + 2 + 5.

我正在尝试使用子集和的变量但是数字太大而不能生成所有素数。直到那时。

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

3 个答案:

答案 0 :(得分:6)

对于K = 1,答案显然是&#34;是&#34; iif N是素数

对于K = 2,根据Goldbach conjecture,验证N达到大约10 ^ 18,答案是&#34;是&#34; iif N是偶数且N> = 4或者如果N-2是素数。

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

因此,对于K = 3,答案是&#34;是&#34;简单来说,iif N> = 6。

通过归纳(提示:只使用K - 3倍于素数2),我们可以证明,对于K&gt; = 3,答案是&#34;是&#34; iif N> = 2 * K,因此只有情况K = 1和K = 2是非平凡的并且仅需要简单的素性检查,例如,在O(log ^ 4 N)中通过Miller–Rabin

编辑:作为奖励,此证明还提供了一个输出分区的建设性算法。我们使用2到2和3来得到K = 2.棘手的K = 2,N偶然情况并不像看起来那么难:我们从哥德巴赫猜想的computational verification得知对于N> = 12,存在具有素数&lt; 5200左右。这些素数不到700个,所以我们可以在合理的时间内检查它们。

答案 1 :(得分:0)

您正在寻找的概念称为数字的主分区。计算数字主要分区数的公式是\ kappa(n)= \ frac {1} {n} \ left(\ mathrm {sopf}(n)+ \ sum_ {j = 1} ^ {n- 1} \ mathrm {sopf}(j)\ cdot \ kappa(nj)\ right);我用LaTeX表示法给出了它,因为我不知道怎么用html做。 sopf(n)函数是 n 的不同素因子的总和,因此sopf(42) = 12,因为42 = 2 * 3 * 7,但是sopf(12) = 5,因为12 = 2 * 2 * 3但每个素因子计算一次。

我在my blog讨论了这个公式。

答案 2 :(得分:0)

您的输入是n和K.有很多情况:

  1. K&gt; n:不可能
  2. K = n:K素数均为1
  3. K&lt; n:4个子类:
  4. 一个。 n和K是奇数

    湾n是偶数,K是奇数

    ℃。 n是奇数,K是偶数

    d。 n和K甚至是

    案例a:选择任何素数p&lt; n和p> 2.输入n-p和K-1分别代替n和K,问题减少到同样的问题,如果b

    案例b:问题因输入n-2和K-1而不是n和K分别减少到同样的问题,如果是d

    案例c:同上而不是b,但是如果不是d

    ,我们就会失败

    案例d:如果n = 2K,那么2,2次,......,2次K是你的解决方案(即你的素数是2,2,......,2)。否则可以写n

    n = (\sum_{i=1}^{i=K-2} 2 ) + p + q
    

    我们在总和中添加素数2(K-2)次。然后问题减少到输入n-2(K-2)而不是n和2而不是K的相同问题。但这是Goldbach。你可以用O(n sqrt(n))来解决它:把p和q都等于n / 2。增加p并在每一步减少q,直到它们都是素数。