コード例 #1
0
        public static IEnumerable <int> GetProperDivisors(this int n)
        {
            FactorizedNumber factorized = n.Factorize();
            var results = new List <int>();

            void Loop(FactorizedNumber number, int factorIndex, int currentResult)
            {
                int prime = number[factorIndex].Prime;

                for (int e = 0; e <= number[factorIndex].Exponent; e++)
                {
                    if (e > 0)
                    {
                        currentResult *= prime;
                    }

                    if (factorIndex == number.Count - 1)
                    {
                        results.Add(currentResult);
                    }
                    else
                    {
                        Loop(number, factorIndex + 1, currentResult);
                    }
                }
            }

            Loop(factorized, 0, 1);

            return(results.Where(x => x != n));
        }
コード例 #2
0
        public static int GetEulersTotient(this int n)
        {
            FactorizedNumber factorizedNumber = n.Factorize();

            BigInteger result = 1;

            foreach (PrimeFactor primeFactor in factorizedNumber)
            {
                BigInteger p2 = BigInteger.Pow(primeFactor.Prime, primeFactor.Exponent - 1);
                BigInteger p1 = p2 * primeFactor.Prime;

                result *= p1 - p2;
            }

            return((int)result);
        }