// mobius.go
// description: Returns μ(n)
// details:
// For any positive integer n, define μ(n) as the sum of the primitive nth roots of unity.
// It has values in {−1, 0, 1} depending on the factorization of n into prime factors:
//   μ(n) = +1 if n is a square-free positive integer with an even number of prime factors.
//   μ(n) = −1 if n is a square-free positive integer with an odd number of prime factors.
//   μ(n) = 0 if n has a squared prime factor.
// wikipedia: https://en.wikipedia.org/wiki/M%C3%B6bius_function
// author: Akshay Dubey (https://github.com/itsAkshayDubey)
// see mobius_test.go

package math

import (
	"github.com/TheAlgorithms/Go/math/prime"
)

// Mu is the Mobius function
// This function returns μ(n) for given number
func Mu(n int) int {
	if n <= 1 {
		return 1
	}
	var primeFactorCount int
	for i := 1; i <= n; i++ {
		if n%i == 0 && prime.OptimizedTrialDivision(int64(i)) {
			if n%(i*i) == 0 {
				return 0
			}
			primeFactorCount += 1
		}
	}
	if primeFactorCount%2 == 0 {
		return 1
	}
	return -1
}
