编写一个程序来计算函数的不同值
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
$$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