【问题标题】:Writing a program to calculate the distinct values of a function编写程序来计算函数的不同值
【发布时间】:2019-11-18 19:58:12
【问题描述】:

$$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 的示例,对应于函数的两个不同值对应的两条水平线:

【问题讨论】:

  • 您能向我们展示您迄今为止所做的尝试吗?我很好奇您尝试了哪些方法,以及您是否真的很接近找到解决方案。

标签: r wolfram-mathematica discrete-mathematics wolframalpha


【解决方案1】:

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

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

例如,给定一个输入向量v&lt;-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

【讨论】:

  • n 是一个常数。并且 f 的不同值是针对从 2 开始的自然数 n 计算的
  • @Ultradark 我猜你的意思是,在 $f_n(x)=\pi(x)\pi(n-x)$ x=2n = 2,3,4,.....,对吗?跨度>
  • 为什么要$x=2$?
  • @Ultradark 我对你的描述有点困惑.....但我会尽快更新我的解决方案,看看这是否是预期的结果
  • 您看到我添加到帖子中的图片了吗?对于 n=9,您会得到 f_9(x) 的 2 个不同值
【解决方案2】:

进一步说明

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 算错了。

【讨论】:

  • x 是函数中的变量,n 是参数。因此,对于每个 n,我计算 f 的不同值。所以对于 n=9 有两个不同的值
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多