예제 #1
0
        public override long Solve()
        {
            int  longestNumberOfAddends = 0;
            long primeWithLongestSumOfConsecutivePrimes = 0;
            var  primes   = Primes.CalculatePrimesBelow(primeBelow);
            var  maxPrime = primes.Last();

            for (int primeIndex = 0; primeIndex < primes.Count; primeIndex++)
            {
                int  numberOfAddends = 0;
                long sum             = 0;
                for (int i = primeIndex; i < primes.Count; i++)
                {
                    sum += primes.ElementAt(i);
                    numberOfAddends++;
                    if (primes.Contains(sum) && numberOfAddends > longestNumberOfAddends)
                    {
                        longestNumberOfAddends = numberOfAddends;
                        primeWithLongestSumOfConsecutivePrimes = sum;
                    }

                    if (sum > maxPrime)
                    {
                        break;
                    }
                }
            }
            return(primeWithLongestSumOfConsecutivePrimes);
        }
예제 #2
0
        public override long Solve()
        {
            var bRange = Primes.CalculatePrimesBelow(MAX_COEFF);
            var aRange = Enumerable.Range(-999, 1999);

            long maxPrimesCount = 0;
            long maxACoeff      = 0;
            long maxBCoeff      = 0;

            foreach (var b in bRange)
            {
                foreach (var a in aRange)
                {
                    long n = 0;
                    while (Primes.IsPrime((n * n) + (a * n) + b))
                    {
                        n++;
                    }
                    if (n > maxPrimesCount)
                    {
                        maxPrimesCount = n;
                        maxACoeff      = a;
                        maxBCoeff      = b;
                    }
                }
            }
            return(maxACoeff * maxBCoeff);
        }
예제 #3
0
        public override long Solve()
        {
            var primesBelow   = 10000;
            var primes        = Primes.CalculatePrimesBelow(primesBelow);
            var oddComposites = BuildOddComposites(primes);

            foreach (var oddComposite in oddComposites)
            {
                var found = false;
                for (int i = 0; i < primes.Count && primes.ElementAt(i) < oddComposite && !found; i++)
                {
                    int numberToBeSquared = 1;
                    while (oddComposite > Math.Abs((numberToBeSquared * numberToBeSquared * 2) - primes.ElementAt(i)))
                    {
                        if (oddComposite == primes.ElementAt(i) + (2 * numberToBeSquared * numberToBeSquared))
                        {
                            found = true;
                        }
                        numberToBeSquared++;
                    }
                }
                if (!found)
                {
                    return(oddComposite);
                }
            }
            throw new Exception("Could not find an odd composite below " + primesBelow);
        }
예제 #4
0
        public static HashSet <long> CalculateDistinctPrimeFactorsSLOW(int number)
        {
            var primes       = Primes.CalculatePrimesBelow(number + 1);
            var primeFactors = new HashSet <long>();

            return(PrimeFactors(number, primes, primeFactors));
        }
예제 #5
0
        public override long Solve()
        {
            long circularPrimeCount = 0;
            var  primesLookup       = Primes.CalculatePrimesBelow(max);

            foreach (var prime in primesLookup)
            {
                if (PossibleCircularPrime(prime))
                {
                    var rotations = Permutations.GenerateNumberRotations(prime);
                    if (rotations.All(p => primesLookup.Contains(p)))
                    {
                        circularPrimeCount++;
                    }
                }
            }
            return(circularPrimeCount);
        }
예제 #6
0
        //http://en.wikipedia.org/wiki/Truncatable_prime

        public override long Solve()
        {
            long sum    = 0;
            var  primes = Primes.CalculatePrimesBelow(1000000);

            foreach (var prime in primes)
            {
                bool truncatable = true;
                if (PossibleTruncatablePrime(prime))
                {
                    var leftToRightTruncate = new Truncate(prime, TruncateMethod.LeftToRight);
                    while (leftToRightTruncate.CanTruncate())
                    {
                        if (!primes.Contains(leftToRightTruncate.NextValue()))
                        {
                            truncatable = false;
                            break;
                        }
                    }

                    var rightToLeftTruncate = new Truncate(prime, TruncateMethod.RightToLeft);
                    while (rightToLeftTruncate.CanTruncate())
                    {
                        if (!primes.Contains(rightToLeftTruncate.NextValue()))
                        {
                            truncatable = false;
                            break;
                        }
                    }
                    if (truncatable)
                    {
                        sum += prime;
                    }
                }
            }
            return(sum);
        }
예제 #7
0
        //12.5 seconds without filtering out invalid pandigitals.
        //filtering inputs:
        //Filter out pandigitals where d6 is not divisble by 5: 11.4 seconds
        public override long Solve()
        {
            var primes      = Primes.CalculatePrimesBelow(18).ToArray();
            var pandigitals = Pandigitals.GenerateZeroToN(9);

            long sum = 0;

            foreach (var pandigital in pandigitals)
            {
                if (PossibleSubstringDivisibleByPrime(pandigital))
                {
                    var divisibleByPrime = true;
                    for (int i = 0; i < primes.Length && divisibleByPrime; i++)
                    {
                        divisibleByPrime = SubstringDivisibleBy(pandigital, i + 1, primes[i]);
                    }
                    if (divisibleByPrime)
                    {
                        sum += pandigital;
                    }
                }
            }
            return(sum);
        }
예제 #8
0
 public Problem51(int primeFamily)
 {
     this.primeFamily = primeFamily;
     primes           = Primes.CalculatePrimesBelow(999999);
 }
예제 #9
0
 public Problem26(int maxDenominator)
 {
     this.maxDenominator = maxDenominator;
     primes = Primes.CalculatePrimesBelow(maxDenominator);
 }
예제 #10
0
 public override long Solve()
 {
     return(Primes.CalculatePrimesBelow(primesBelow).Sum());
 }
예제 #11
0
        public override long Solve()
        {
            long smallestSum = 0;
            var  primes      = Primes.CalculatePrimesBelow(10000);

            foreach (var first in primes)
            {
                foreach (var second in primes)
                {
                    if (second <= first)
                    {
                        continue;
                    }
                    if (Primes.IsPrime(Concat(first, second)) && Primes.IsPrime(Concat(second, first)))
                    {
                        foreach (var third in primes)
                        {
                            if (third <= second)
                            {
                                continue;
                            }

                            if (Primes.IsPrime(Concat(first, third)) && Primes.IsPrime(Concat(third, first)) &&
                                Primes.IsPrime(Concat(second, third)) && Primes.IsPrime(Concat(third, second)))
                            {
                                foreach (var fourth in primes)
                                {
                                    if (fourth <= third)
                                    {
                                        continue;
                                    }
                                    if (Primes.IsPrime(Concat(first, fourth)) && Primes.IsPrime(Concat(fourth, first)) &&
                                        Primes.IsPrime(Concat(second, fourth)) && Primes.IsPrime(Concat(fourth, second)) &&
                                        Primes.IsPrime(Concat(third, fourth)) && Primes.IsPrime(Concat(fourth, third)))
                                    {
                                        foreach (var fifth in primes)
                                        {
                                            if (fifth <= fourth)
                                            {
                                                continue;
                                            }
                                            if (Primes.IsPrime(Concat(first, fifth)) && Primes.IsPrime(Concat(fifth, first)) &&
                                                Primes.IsPrime(Concat(second, fifth)) && Primes.IsPrime(Concat(fifth, second)) &&
                                                Primes.IsPrime(Concat(third, fifth)) && Primes.IsPrime(Concat(fifth, third)) &&
                                                Primes.IsPrime(Concat(fourth, fifth)) && Primes.IsPrime(Concat(fifth, fourth)))
                                            {
                                                Console.WriteLine("1: {0} 2: {1} 3: {2} 4: {3} 5: {4}", first, second, third, fourth, fifth);
                                                var sum = new List <long> {
                                                    first, second, third, fourth, fifth
                                                }.Sum();
                                                if (sum < smallestSum || smallestSum == 0)
                                                {
                                                    smallestSum = sum;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(smallestSum);
        }