static void CalculatePrimePhi() { for (int i = 2; i <= MAXINT; i++) { if (primes[i]) { phiResult[i] = i - 1; continue; } List <int> frac = fg.GeneratorFactorsBelowOneMillion(i); var fracGroup = frac.GroupBy(x => x); int count = fracGroup.Count(); if (count == 1) { phiResult[i] = EulerTotientFunction.Calculate(i); continue; } phiResult[i] = 1; foreach (var item in fracGroup) { int num = item.First(); int itemcount = item.Count(); int sumNum = (int)Math.Pow(num, itemcount); phiResult[i] *= phiResult[sumNum]; } } }
static int Phi(int num) { if (phiResult[num] != 0) { return(phiResult[num]); } return(EulerTotientFunction.Calculate(num)); }