Functional programming 如何求n为dustinct素数之和(当n为偶数时)

Functional programming 如何求n为dustinct素数之和(当n为偶数时),functional-programming,Functional Programming,此问题给出一个小于或等于100000(10^5)的正整数。您必须为号码找到以下内容: 一,。这个数是素数吗?如果是素数,则打印“是” 二,。如果这个数不是质数,那么我们能把它表示为唯一质数的和吗?如果可能,请打印“是”。这里唯一的意思是,任何素数只能使用一次 如果上述两个条件对于任何整数都失败,则打印编号。有关更多说明,请参阅输入、输出部分及其说明 输入 首先,你会得到一个整数T(T,而不使用任何数学技巧(不确定是否存在……你会认为作为一名数学家,我在这里会有更多的洞察力),你必须迭代每一个可能

此问题给出一个小于或等于100000(10^5)的正整数。您必须为号码找到以下内容:

一,。这个数是素数吗?如果是素数,则打印“是”

二,。如果这个数不是质数,那么我们能把它表示为唯一质数的和吗?如果可能,请打印“是”。这里唯一的意思是,任何素数只能使用一次

如果上述两个条件对于任何整数都失败,则打印编号。有关更多说明,请参阅输入、输出部分及其说明

输入
首先,你会得到一个整数T(T,而不使用任何数学技巧(不确定是否存在……你会认为作为一名数学家,我在这里会有更多的洞察力),你必须迭代每一个可能的求和。因此,你肯定需要迭代每一个可能的素数,所以我建议第一步是找到最多10^5的所有素数。一个基本的(埃拉托什尼筛)(也许现在已经足够好了,虽然现在存在更快的筛子。我知道你的问题是语言不可知的,但是你可以把下面的内容当作矢量化的伪代码来做这样的筛子。

import numpy as np

def sieve(n):
    index = np.ones(n+1, dtype=bool)
    index[:2] = False
    for i in range(2, int(np.sqrt(n))):
        if index[i]:
            index[i**2::i] = False
    return np.where(index)[0]
还有其他一些简单的优化,但为了简单起见,这假设我们有一个数组
索引
,其中索引与数字是否为素数完全对应。我们从每个数字为素数开始,将0和1标记为非素数,然后对于每个素数,我们发现它的每一个倍数都标记为非素数。where()最后只返回索引对应的索引
True

从这里,我们可以考虑一个递归算法来实际解决你的问题。注意,你可能有大量的不同的素数。数字26是4个不同素数的总和。它也是3和23的总和。因为4个素数比2更昂贵,所以我认为从签入开始是合理的。g尽可能小的数字

在这种情况下,我们要做的是定义一个辅助函数,来确定一个数是否是k个素数的和,然后依次测试k的辅助函数,从1到任意可能的最大加法数

primes = sieve(10**5)

def sum_of_k_primes(x, k, excludes=()):
    if k == 1:
        if x not in excludes and x in primes:
            return (x,)+excludes
        else:
            return ()
    for p in (p for p in primes if p not in excludes):
        if x-p < 2:
            break
        temp = sum_of_k_primes(x-p, k-1, (p,)+excludes)
        if temp:
            return temp
    return ()
对于代码的其余部分,我们存储到给定点的所有素数的部分和(例如,对于素数2、3、5,部分和将是2、5、10)这为我们提供了一种简单的方法来检查最大可能的加法数。该函数只需依次检查
x
是否为素数,是否为2个素数、3个素数的和,等等

作为一些示例输出,我们有

>>> sum_of_primes(1001)
(991, 7, 3)

>>> sum_of_primes(26)
(23, 3)

>>> sum_of_primes(27)
(19, 5, 3)

>>> sum_of_primes(6)
()
乍一看,我认为缓存一些中间值可能会有所帮助,但我不相信辅助函数会用相同的参数调用两次。可能有一种方法可以使用动态编程来做大致相同的事情,但在一个计算次数最少的表中,以防止使用t重复任何工作他是递归的,我得多想想


至于你的老师期望的精确输出和需要编码的语言,这将取决于你。希望这有助于算法的一点。

问题是什么?你是否需要一个提示来有效地解决它,一个在合理时间内运行的算法,一个C++实现,或者如何解决代码中的编译错误?看起来像是(家庭作业/竞赛)问题转储。你有什么想法/尝试吗?是的,我要求的是一个短时间代码…我对此做了O(3)分
>>> sum_of_primes(1001)
(991, 7, 3)

>>> sum_of_primes(26)
(23, 3)

>>> sum_of_primes(27)
(19, 5, 3)

>>> sum_of_primes(6)
()