加快素数生成

时间:2016-07-11 23:47:16

标签: swift primes

我编写了一个生成素数的程序。它运作良好,但我想加快速度,因为生成所有素数直到10000

需要很长时间
document.getElementById('category').onclick = function() {
  toggleSub_by_class(this, 'category');
};

function toggleSub_by_class(box, select_class) {
// get reference to related content to display/hide
 var el = document.getElementsByClassName(select_class);
 var flag;

 if (box.checked) {
   for (var i = 0, j = el.length; i < j; i++) {
     el[i].style.display = 'table-row-group';
   }
 } else {
   for (var i = 0, j = el.length; i < j; i++) {
     var classList = el[i].className.split(' ')
     flag = 0
     for (var h = 0, k = classList.length; h < k; h++) {
       if (document.getElementById(classList[h])) {
         if (document.getElementById(classList[h]).checked) {
           flag = 1
         }
       }
     }
     if (flag == 0) {
       el[i].style.display = 'none';
     }
   }
 }
}   

2 个答案:

答案 0 :(得分:2)

两项简单的改进,可以快速达到100,000甚至1,000,000。

除2之外的所有素数都是奇数

从5开始循环,每次增加2。这并不会加速它,因为你在第一次尝试时找到了反例,但它仍然是一个非常典型的改进。

仅搜索您正在测试的值的平方根

平方根是因子空间的一半,即小于平方根的任何因子与平方根之上的因子配对,因此您只需检查它的上方或下方。平方根以下的数字要少得多,因此您应该只检查小于或等于平方根的值。

以10,000为例。平方根为100.为此,您只需要查看小于平方根的值,就素数而言大约是25个值,而不是1000个小于10,000的所有素数的检查。

做得更快

尝试另一种方法,例如sieve。这些方法速度更快,但内存开销更高。

答案 1 :(得分:2)

除了Nick已经解释过的内容之外,您还可以轻松利用以下属性:所有大于3的素数都与1或-1 mod 6 一致。

由于您已在初始列表中添加了2和3,因此您可以从Create Procedure [dbo].[GetEmployees] as .... 开始,测试count = 6count - 1,每次增加6。

以下是我在Swift的第一次尝试,请原谅可能远非最佳的语法。

count + 1

我在iswift.org/playground上测试了上述代码,限制为10,000,10000和1,000,000。