返回小于M的所有素数

use*_*266 7 algorithm primes

给定整数M.返回小于M的所有素数.

给出尽可能好的算法.需要考虑时间和空间的复杂性.

And*_*per 18

Eratosthenes的Sieve是一个很好的起点.

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

  • 还有其他易于理解且不需要O(n)空间的筛子.或者你只是为了一遍又一遍的数量来做这件事.例如.你想要10000以下的所有素数,然后分批100或1000,以减少空间使用,然后只保存素数. (2认同)

Way*_*ett 12

一些额外的性能提示:

  1. 您只需要测试平方根M,因为每个复合数字至少有一个素数因子小于或等于其平方根
  2. 您可以在生成它们时缓存已知素数,并仅针对此列表中的数字(而不是下面的每个数字sqrt(M))测试后续数字
  3. 你可以明显地跳过偶数(2当然除外)

  • 好吧,你不应该放弃所有这些!你不应该放弃2 ;-) (11认同)
  • 我不确定你想说什么.当然可能有(无关)素数大于*N*的平方根,但这并没有告诉我们任何有用的东西.关键是每个复合数至少有一个素因子小于或等于其平方根,你只需要找到一个这样的因子来证明*N*是复合的(即不需要继续检查).这是第一个声明的重点. (4认同)
  • 我认为第一个陈述是错误的.例如,N = 120. 113是素数<N,但是113> sqrt(N). (3认同)