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 }