github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/math/pi.go (about)

     1  package math
     2  
     3  // Pi returns # of primes LTE than n
     4  func Pi(n int) int {
     5  	if n <= 1 {
     6  		return 0
     7  	}
     8  
     9  	// store numbers in range [2,n]
    10  	numbers := make([]int, n-1)
    11  	for i := range numbers {
    12  		numbers[i] = i + 2
    13  	}
    14  
    15  	count := 0
    16  	// sieve method
    17  	for i, v := range numbers {
    18  		if v == i+2 {
    19  			count++
    20  			// v is a prime
    21  			for j := i + v; j <= n-2; j += v {
    22  				numbers[j] = 0
    23  			}
    24  		}
    25  	}
    26  
    27  	return count
    28  
    29  }
    30  
    31  // R2 returns # of ordered prime pairs with sum n
    32  func R2(n int) int {
    33  	if n <= 1 {
    34  		return 0
    35  	}
    36  
    37  	// store numbers in range [2,n]
    38  	numbers := make([]int, n-1)
    39  	for i := range numbers {
    40  		numbers[i] = i + 2
    41  	}
    42  
    43  	// sieve method
    44  	for i, v := range numbers {
    45  		if v == i+2 {
    46  			// v is a prime
    47  			for j := i + v; j <= n-2; j += v {
    48  				numbers[j] = 0
    49  			}
    50  		}
    51  	}
    52  
    53  	count := 0
    54  	for i, v := range numbers {
    55  		if v == i+2 {
    56  			// v is a prime
    57  			j := n - v - 2
    58  			if j >= 0 && numbers[j] > 0 {
    59  				count++
    60  				numbers[j] = 0
    61  			}
    62  		}
    63  	}
    64  	return count
    65  }