// P37 (**) Calculate Euler's totient function phi(m) (improved).
// See problem P34 for the definition of Euler's totient function. If the
// list of the prime factors of a number m is known in the form of problem
// P36 then the function phi(m>) can be efficiently calculated as follows:
// Let [[p_1, m_1], [p_2, m_2], [p_3, m_3], ...] be the list of prime
// factors (and their multiplicities) of a given number m. Then phi(m) can
// be calculated with the following formula:
//
// phi(m) = (p_1-1)*p_1^(m_1-1) * (p_2-1)*p_2^(m_2-1) * (p_3-1)*p_3^(m_3-1) * ...
//
// Note that a^b stands for the bth power of a.
class S99Int(val start: Int) {
def totient: Int = start.primeFactorMultiplicity.foldLeft(1) { (r, f) =>
f match { case (p, m) => r * (p - 1) * Math.pow(p, m - 1).toInt }
}
}