编写一个程序来计算函数的不同值

Writing a program to calculate the distinct values of a function

$$f_n(x)=\pi(x)\pi(n-x)$$

我想编写一个程序来告诉我每个 $n=2,3,4,...,N$ 的 $f_n(x)$ 的不同值,其中 $\pi(x)$ 是素数计数功能。以下是前几个不同的值:

S={0,0,1,1,2,2,3,2,4,3,4,3,5,4,5,4,6,5,7,5,8, 5,7,5,8,7,...}.

如何编写这样的程序?

我尝试使用 Mathematica、wolfram alpha 和 R,但无法弄清楚如何让软件告诉我 $f_n(x).$

的不同值

我不知道如何使用计算机程序解决这个问题,所以我手动将 n 的前 70 个值一次一个地放入 wolfram alpha 中,并通过查看绘图计算不同值的数量。这是我到目前为止能够得到的:

原来的素数计数函数是浅绿色的,我的函数是浅蓝色的:(这里我在 x 轴上绘制了 n,在 y 轴上绘制了不同的值)

下面是 n=9 的示例,对应于两条水平线,这两条水平线对应于函数的两个不同值:

进一步澄清

f[n_, x_] := PrimePi[x]*PrimePi[n - x]

green = {#, PrimePi[#]} & /@ Range[2, 70];

blue = Map[Function[n,
   {n, Length[DeleteCases[Union[f[n, #] & /@ Range[2, 70]], 0]]}],
  Range[2, 70]];

ListPlot[{blue, green}, PlotStyle -> {Blue, Green}, AxesLabel -> {"n", None},
 PlotMarkers -> {Automatic, Medium}, PlotRange -> {{0, 70}, {0, 20}},
 PlotRangePadding -> 0.6, AspectRatio -> 2/7, ImageSize -> 600]

请注意,n = 60, 61 处的 OP 情节有所不同。也许OP算错了。

R 中,您需要包 primes 然后可以定义素数函数 $\pi(x)$ 如下:

PIx <- Vectorize(function(x) length(generate_primes(max = x)),vectorize.args = "x")

例如,给定输入向量 v<-c(0,1,4.5,6.1,10),然后 PIx(v) 给出:

> PIx(v)
[1] 0 0 2 3 4

那么对于你的函数$f_n(x)$,可以定义为:

PIx <- Vectorize(function(x) length(generate_primes(max = x)),vectorize.args = "x")
f_n <- function(n) unique(PIx(0:n)*PIx(n-(0:n)))

要在 $n$ 变化时查看不同的值,请应用代码 Filter(length,sapply(2:n, function(k) f_n(k))),例如:

n <- 15
z <- unlist(Map(length,Filter(length,sapply(2:n, function(k) f_n(k)))))-1

它给出了不同级别的列表:

> z
 [1] 0 0 1 1 2 2 3 2 4 3 4 3 5 4