Algorithm 将一个数表示为素数之和

Algorithm 将一个数表示为素数之和,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我得到了一个大数n,我需要找出它是否可以表示为K个素数的和 ex9可以表示为3个素数的和,即2+2+5 我试图使用子集和的变化,但这个数太大,直到那个时才生成所有的素数 问题出在电流。限制是1您正在寻找的概念称为数字的素数分区。计算一个数的素划分数的公式是\kappa(n)=\frac{1}{n}\left(\mathrm{sopf}(n)+\sum{j=1}{n-1}\mathrm{sopf}(j)\cdot\kappa(n-j)\right);我用LaTeX符号表示,因为我不知道如何用htm

我得到了一个大数
n
,我需要找出它是否可以表示为K个素数的和

ex9可以表示为3个素数的和,即2+2+5

我试图使用子集和的变化,但这个数太大,直到那个时才生成所有的素数


问题出在电流。限制是
1您正在寻找的概念称为数字的素数分区。计算一个数的素划分数的公式是\kappa(n)=\frac{1}{n}\left(\mathrm{sopf}(n)+\sum{j=1}{n-1}\mathrm{sopf}(j)\cdot\kappa(n-j)\right);我用LaTeX符号表示,因为我不知道如何用html表示。
sopf(n)
函数是n的不同素数因子之和,因此
sopf(42)=12
,因为42=2*3*7,但是
sopf(12)=5
,因为12=2*2*3,但是每个素数因子只计算一次


我在讨论这个公式。

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

  • K>n:不可能
  • K=n:K个素数都是1
  • K a。n和K是奇数

    b。n是偶数,K是奇数

    c。n是奇数,K是偶数

    d。n和K是偶数

    案例a:选择任意素数p2。问题简化为输入n-p和K-1而不是n和K的相同问题,我们属于案例b

    案例b:问题简化为输入n-2和K-1而不是分别输入n和K的相同问题,我们属于案例d

    案例c:idem大于b,但我们属于案例a而不是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。但这是哥德巴赫。你可以在O(n sqrt(n))中这样求解:取p和q都等于n/2。在每一步增加p并减少q,直到它们都是素数。

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

    对于K=2,根据在10^18左右对N进行验证的公式,如果N是偶数,N>=4,或者如果N-2是素数,则答案是“是”

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

    所以对于K=3,答案是“是”,如果N>=6

    通过归纳(提示:只需使用K-3乘以素数2),我们可以证明,对于K>=3,如果N>=2*K,答案是“是”,因此只有K=1和K=2的情况是非平凡的,只需要简单的素数检查,例如,通过in O(log^4 N)


    编辑:作为奖励,这个证明还提供了一个构造性的算法来输出分区。我们使用一些2,也许一个3来得到K=2。棘手的K=2,N偶数情形并不像看上去那么难:我们从哥德巴赫猜想的一部分知道,对于N>=12,存在一个素数小于5200左右的哥德巴赫分区。这样的素数不到700个,所以我们可以在合理的时间内检查它们。

    我的问题是,给定的数字是否有K个素数。不是素数分区。这很聪明,但计算起来太慢了。这需要O(2^n)来计算,n非常大……在2:1不是质数的情况下,这似乎是合法的,但它仍然太慢,但我认为它可以在运行时进行改进,很好,但这不会给你K个质数p_1+…+p_K=n。为米勒·拉宾竖起大拇指@这个任务只是询问分区是否存在。如果你想重建分区,它也可以简化为哥德巴赫猜想。通过计算验证,我们知道有一个带有一个小素数的分区(我想对于N来说<5000左右),从大K到K=3的缩减只是使用(K-3)乘以素数2。然后你使用2或3,你在K=2,可能需要找到一个Goldberg分区,我在另一个注释中描述了这一点