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

     1  package math
     2  
     3  // Phi returns # of coprime integers of n
     4  func Phi(n int) int {
     5  	if n == 0 {
     6  		panic("invalid input")
     7  	}
     8  	if n == 1 {
     9  		return 1
    10  	}
    11  	// store numbers in range [2,n]
    12  	numbers := make([]int, n-1)
    13  	for i := range numbers {
    14  		numbers[i] = i + 2
    15  	}
    16  
    17  	// sieve method
    18  	for i, v := range numbers {
    19  		if v == i+2 {
    20  			// v is a prime
    21  			for j := i; j <= n-2; j += v {
    22  				numbers[j] /= v
    23  				numbers[j] *= v - 1
    24  			}
    25  		}
    26  	}
    27  
    28  	return numbers[n-2]
    29  }