Ejemplo n.º 1
0
        public string Run()
        {
            var factorizations = Prime.Factorization.Of(Enumerable.Range(1, 10000000).Select(i => (long)i));
            var facAsList      = new Prime.Factorization[10000001];

            foreach (var fac in factorizations)
            {
                facAsList[(int)fac.Key] = fac.Value;
            }

            int run  = 0;
            int curr = 1;

            while (run != 4)
            {
                if (facAsList[curr].Values.Count() == 4)
                {
                    run++;
                }
                else
                {
                    run = 0;
                }
                curr++;
            }


            return((curr - 4).ToString());
        }
Ejemplo n.º 2
0
        private (bool possible, Prime.Factorization higher, Prime.Factorization lower) FindConsecutiveFactorizations(long number)
        {
            var factorization = new Prime.Factorization();

            var high = number % 2 == 1 ? number : number - 1;
            var low  = number % 2 == 1 ? (number - 1) / 2 : number / 2;

            var product      = Prime.Factorization.Of(high).MultiplyBy(low);
            var exponentList = product.ToList();


            (bool possible, Prime.Factorization higher, Prime.Factorization lower) FactorizationInternal(Prime.Factorization current, int primeIndex)
            {
                if (primeIndex >= exponentList.Count)
                {
                    return(false, null, null);
                }
                var withPrimeSkipped = FactorizationInternal(current, primeIndex + 1);

                if (withPrimeSkipped.possible)
                {
                    return(withPrimeSkipped);
                }
                var(prime, exp) = exponentList[primeIndex];
                for (int i = 1; i <= exp; i++)
                {
                    current.MultiplyByPrime(prime);
                    var currentValue = current.Value();
                    if (currentValue >= high)
                    {
                        current.DivideByPrime(prime);
                        break;
                    }
                    if (currentValue > low)
                    {
                        var other         = new Prime.Factorization(product);
                        var dividend      = other.DivideBy(current);
                        var dividendValue = dividend.Value();
                        if (dividendValue == current.Value() + 1)
                        {
                            return(true, dividend, current);
                        }
                        if (dividendValue == currentValue - 1)
                        {
                            return(true, current, dividend);
                        }
                        current.DivideByPrime(prime);
                        break;
                    }
                    var withPrime = FactorizationInternal(current, primeIndex + 1);
                    if (withPrime.possible)
                    {
                        return(withPrime);
                    }
                    current.DivideByPrime(prime);
                }
                return(false, null, null);
            }

            return(FactorizationInternal(factorization, 0));
        }