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); }
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); }