public void P0012(int numDivisors, long expected) { var i = 0; var triangleNumber = 0L; var primes = new PrimeNumberGenerator(); while (true) { triangleNumber = Functions.TriangleNumber(++i); var numDivisorsSeen = Functions.NumDivisors(triangleNumber, primes); if (numDivisorsSeen > numDivisors) { break; } } Assert.Equal(expected, triangleNumber); }
public static Dictionary <long, int> Factor(long i, PrimeNumberGenerator primes) { var result = new Dictionary <long, int>(); var primesList = primes.Primes().TakeWhile(x => x <= i).ToList(); var primesCount = primesList.Count(); long p = 0; for (int j = 0; j < primesCount; j++) { p = primesList[j]; if (i % p == 0) { result[p] = 0; var i2 = i; while (i2 % p == 0) { result[p]++; i2 /= p; } } } return(result); }
public static int NumDivisors(long i, PrimeNumberGenerator primes) => Factor(i, primes).Values.Product(x => x + 1);