【问题标题】:What function does Math.sqrt(n) serve in relation to Eratosthenes algorithm for finding N primes?Math.sqrt(n) 与 Eratosthenes 算法有关查找 N 个素数的功能是什么?
【发布时间】:2013-07-10 00:55:22
【问题描述】:

我的标题用对了吗?

var eratosthenes = function(n) {
    // Eratosthenes algorithm to find all primes under n
    var array = [], upperLimit = Math.sqrt(n), output = [];
    // Make an array from 2 to (n - 1)
    for (var i = 0; i < n; i++) 
        array.push(true);
    // Remove multiples of primes starting from 2, 3, 5,...
    for (var i = 2; i <= upperLimit; i++) {
        if (array[i]) {
            for (var j = i * i; j < n; j += i) 
                array[j] = false;
        }
    }
    for (var i = 2; i < n; i++) {
        if(array[i])
            output.push(i);
    }
    return output;
}

小提琴:http://jsfiddle.net/KARZw/

upperLimit = Math.sqrt(n) 的目的是什么?

代码来自:Sieve of Eratosthenes algorithm in JavaScript running endless for large number

【问题讨论】:

    标签: javascript math


    【解决方案1】:

    一个数的平方根是它的一对素因数中可能的最大成员。

    任何大于平方根的素数都需要乘以小于平方根的素数才能得到数字。

    【讨论】:

      【解决方案2】:

      一个数的最大可能因子是它的平方根。

      取 17。那是素数吗?您可以天真地查找 1...17 中的所有因子,也可以取平方根并从 2-4 中查找,因为在 4 之后,真的没有任何新的可能因子了。

      在其中添加更多细节。

      让我们看一下幼稚模型(是的,偶数不需要检查,因为我们知道它不是偶数,但这很幼稚):

      Is 17 divisible by 2?  No
      Is 17 divisible by 3?  No
      Is 17 divisible by 4?  No 
      Is 17 divisible by 5?  No
      Is 17 divisible by 6?  No
      Is 17 divisible by 7?  No 
      ....
      Is 17 divisible by 16?  No 
      

      17 是素数。

      现在,假设您使用平方根的上限。

      is 17 divisible by 2?  If it was, it would be 2 x 8 or 2 x 9.
      is 17 divisible by 3?  If it was, it would be 3 x 5 or 3 x 16.
      is 17 divisible by 4?  If it was, it would be 4 x 4 or 4 x 5.
      

      现在看看当你达到 5 时会发生什么?您基本上只是换位了因素。

      17 能被 5 整除吗?如果是,它将是 5x3 或 5x4。嗯,那些已经被“17 能被 3 整除”和“17 能被 4 整除”所涵盖

      相同的模式一直重复到朴素模型的末尾。

      因此,一旦您检查了直到数字的平方根的所有可能因素,您就检查了该数字的所有可能因素。

      【讨论】:

      • 太棒了,谢谢。不能说我理解它背后的数学原理。素数的最高因数不是数本身吗?比如 17,它只是 1 和 17,那为什么要平方呢?
      • 素数定义为有 2 个因子,它本身和 1。算法正在做的是删除所有确定为非素数的项目,外循环只需上升到平方根过滤掉那些的上限。
      猜你喜欢
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2017-11-27
      相关资源
      最近更新 更多