예제 #1
0
        public IEnumerable <BigInteger> Factor(BigInteger n)
        {
            if (n.IsOne)
            {
                yield return(BigInteger.One);

                yield break;
            }
            while (!IntegerMath.IsPrime(n))
            {
                var divisor = GetDivisor(n);
                while (divisor.IsZero)
                {
                    divisor = GetDivisor(n);
                }
                if (divisor.IsOne)
                {
                    yield break;
                }
                foreach (var factor in Factor(divisor))
                {
                    yield return(factor);
                }
                n /= divisor;
            }
            yield return(n);
        }
예제 #2
0
        public IEnumerable <long> Factor(long n)
        {
            if (n == 1)
            {
                yield return(1);

                yield break;
            }
            while (!IntegerMath.IsPrime(n))
            {
                var divisor = GetDivisor(n);
                if (divisor == 0 || divisor == 1)
                {
                    yield break;
                }
                foreach (var factor in Factor(divisor))
                {
                    yield return(factor);
                }
                n /= divisor;
            }
            yield return(n);
        }