Eratosthenes筛法

来自WHY42

埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数,它的容斥原理之完备性条件是p=H~。

算法描述

  • 先把1删除(现今数学界1既不是质数也不是合数)
  • 读取队列中当前最小的数2,然后把2的倍数删去
  • 读取队列中当前最小的数3,然后把3的倍数删去
  • 读取队列中当前最小的数5,然后把5的倍数删去
  • 如上所述直到需求的范围内所有的数均删除或读取

注:此处的队列并非数据结构队列,如需保留运算结果,处于存储空间的充分利用以及大量删除操作的实施,建议采用链表的数据结构。

示例代码

char * primeNumbersBySieveOfEratosthenes (size_t n) {

  // 初始化素数数组
  char* num = (char*) malloc(sizeof(char) * n );
  for ( size_t i = 2; i < n; ++i ) {       
      num[i] = TRUE;                       
  }
  // 按照埃拉托斯特尼筛法,将为基数的倍数的所有数标记为非素数。
  size_t i = 2;
  while ( i * i  <= n ) {
       for (size_t c = 2, idx = 2*i; idx < n; ++c, idx = i * c) {
           num[idx] = FALSE;
       }
       do {
          ++i;
       } while ( i * i <= n && num[i] == FALSE);
  }
  return num;
}