不同素数分区的数目

Number of distinct prime partitions

本文关键字:分区      更新时间:2023-10-16

可能重复:
一个数字作为它的素数部分

我有一个家庭作业,很难,我必须得到给定数字的所有不同的素数分区。例如,数字7有五个不同的素数分区(或者用五种不同的方式表示它的两个素数分区(:

  • 5+2
  • 2+5
  • 3+2+2
  • 2+3+2
  • 2+2+3

正如你所看到的,在素数的情况下,这个数本身被排除在外。我不需要打印所有不同的分区,只需要打印它们的数量。

所以我对此有点不知所措。我一直无法生成任何代码,但我认为我应该从动态编程的角度来处理这个问题。我只是想得到一些提示。有人有主意吗?提前谢谢。

输入的最高数字是100。此外,程序的运行时间不能超过1秒,内存限制为128MB。

要解决这个问题,需要结合三个想法:

假设给定的数字是n:

  • 找到所有小于n的素数,如图所示。

  • 根据素数数组和n动态计算子集和。这里和这里都有一些提示

  • 然后,计算从第二步得到的每个答案的不同排列数,如下所示。

当然,这只是一个暗示。但是,它应该对编写最终代码有很大帮助。

因此,以提示的形式而不是答案:

  • 正如其他地方所说,你可以预先计算素数
  • 您可以重用较小数量的结果吗?那么,假设你知道5的实际排列,这有助于你找到7的任何实际排列吗
  • 结果有任何结构吗?如果有,你能使用这个结构来避免重复计算吗?例如,你列出了数字7的5个排列,但这些排列之间存在一些相似性——这是一种普遍趋势吗?它是什么
  • 假设你找到了内部结构可以使用较小的结果来帮助找到较大的结果,你能同时做到这两件事吗?你能完全避免存储完整的中间结果吗
  • 最后,您需要列出每个有序组合还是只返回有序组合的编号?您可以在这里保存计算

不幸的是,这里的暴力无法得到太多改进。你绝对应该做的一件事是用埃拉托斯尼筛来预先计算所有素数,直到给定的数字。之后,给定一个数字N递归地打印它的所有分区,其中最小的素数是连续的素数列表中的每个素数(记住让它是最小的一个,这样你就不会重复分区(。

EDIT:在知道您只需要知道分区的计数之后:最好的解决方案是使用动态编程。同样,您需要在一个具有二维mem[MAX_SIZE][MAX_SIZE]的数组中进行记忆,第一个索引是您正在计算解决方案的数字,第二个索引是应该用于分区的最小素数的索引。

你可能想在维基百科上查看分区的数学,特别是关于生成函数和限制分区生成函数的部分,大约在页面的一半。它提到了由特定被加数(由一组自然数T指定(组成的分区的生成函数。

设n的非阶相关素数分区的个数为R(n(。你可以从生成函数中导出R(n(,方法是取第n个偏导数w.R.t x,然后设置x=0。这可能并不容易。

需要注意的是:这些分区不依赖于顺序(即1+2和2+1仅算作一个分区(。