【问题标题】:How to fill a matrix with prime entries in C++?如何用 C++ 中的素数条目填充矩阵?
【发布时间】:2016-08-08 20:20:55
【问题描述】:

我有这个任务:

设计一个程序,用素数填充一个大小为 n x n 的矩阵 条目(其条目必须是素数)。

现在,当用户给出矩阵的条目时,我有一个子例程可以读取和隐含任何矩阵,并且还有一个子例程可以隐含小于​​用户给定数量的素数(作为数组)。我不能做的是尝试组合这些子程序。请给我一些好的建议好吗?

【问题讨论】:

  • How to ask about homework。真诚地尝试自己先解决问题。询问您现有实施的具体问题。承认问题是家庭作业。请注意有关外部帮助的学校政策。永远不要使用你不理解的代码。
  • Rory Jaffe:这不是一个家庭作业。一个月前,我的老师提出这个问题,不是作为作业,而是作为理解数组的好习惯。我的大问题(或者我认为我的主要问题)是下一个:我怎样才能让程序识别矩阵中应该有多少个素数(n^2)?
  • 你在问prime counting function吗?不是这项任务的最佳主意。即使您有一个子程序可以为您提供小于给定数字的所有数字,但这并不意味着您应该使用它。 Alf 提出了一种更好的方法。
  • Alf 建议我使用 Eratostenes 的筛子(我已经在代码中使用它,实际上代码给出了一个小于或等于给定数字的素数数组)。所以,我现在的想法是尝试将数组“转换”为矩阵或类似的;我的方法正确吗?

标签: c++ matrix primes


【解决方案1】:

(我承认我误解了这个问题,可能就像原始帖子的其他一些评论员一样。它相对简单,但看起来并不那么微不足道。对于少量输入,幼稚的方法 4. 可能效果最好。)

让我重新制定任务:

给定一个数 N,找出前 N 个素数。

由于您已经实现了 Eratosthenes 筛,问题是应该选择哪个数字作为筛的上限。本质上,这相当于找到the prime counting function 的倒数或找到x,可能是最小的,这样

pi(x) >= N

(其中pi 是素数计数函数)。

  1. 维基百科中的文章包含一些提示,例如不等式

    pi(x) >= x/log(x).
    

    因此,一种方法可以依赖于找到方程的近似解

    x/log(x) = N,
    

    后来用于埃拉托色尼的筛子。这可以相对容易地完成(对于小 N 甚至二进制搜索也可以)。

  2. 然而,x/log(x)pi(x) 之间的差距越来越大(请参阅链接的维基百科文章中的表格)。因此,如果我们真的关心内存,我们可以尝试更好的不等式:

    pi(x) >= li(x),      (true for x <= 10^19)
    

    其中li 是对数积分。这个给出了一个更好的近似值,但是a)我们需要一些带有函数'li'的外部库和b)对于非常大的x,不等式可能不正确(这里可能不是问题)。

    如果我们想进一步改进估计(并且对于所有 x),我们可能需要假设黎曼假设是正确的(是的,这很可怕)。

  3. 有一些直接的算法可以计算pi,但不值得将它们用于此任务。

  4. 更直接的方法:

    • 猜测筛子的上限,比如 A,然后运行筛子

    • 如果素数太少,选择一个更大的上限,比如 B,然后从已经找到的素数开始运行筛子,寻找区间 (A,B] 中的数字;重复。

  5. 如果在 4. 中您的质数很少,那么蛮力可能会更快。我刚刚找到了this post 的有趣答案。

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 2011-03-20
    • 1970-01-01
    • 2021-07-29
    • 2012-12-04
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多