public static long Solution1() { long solution = 0; long power = UtilityFunctions.IntegralPower(2, order) - 1; var primes = UtilityFunctions.Primes(UtilityFunctions.IntegralPower(2, order / 4)); var primeFactors = new List <long>(); var ordersModP = new List <long>(); var powersOfTwo = new Dictionary <long, long>(); bool keyAdded = false; var factors = new Dictionary <long, long>(); for (int i = 2; i <= Math.Sqrt(order); i++) { if (order % i == 0) { powersOfTwo.Add(i, UtilityFunctions.IntegralPower(2, i) - 1); if (i * i != order) { powersOfTwo.Add(order / i, UtilityFunctions.IntegralPower(2, order / i) - 1); } } } var keys = powersOfTwo.Keys.OrderBy(t => t).ToArray(); foreach (var p in primes) { if (power < p * p) { keyAdded = false; primeFactors.Add(power); foreach (var key in keys) { if (powersOfTwo[key] % power == 0) { keyAdded = true; ordersModP.Add(key); break; } } if (!keyAdded) { ordersModP.Add(order); } break; } var primePower = p; while (power % p == 0) { keyAdded = false; primeFactors.Add(p); foreach (var key in keys) { if (powersOfTwo[key] % primePower == 0) { keyAdded = true; ordersModP.Add(key); break; } } if (!keyAdded) { ordersModP.Add(order); } power /= p; primePower *= p; } } factors.Add(1, 1); for (int i = 0; i < primeFactors.Count; i++) { keys = factors.Keys.ToArray(); foreach (var key in keys) { var newKey = key * primeFactors[i]; if (!factors.ContainsKey(newKey)) { factors.Add(newKey, UtilityFunctions.Lcm(factors[key], ordersModP[i])); } } } foreach (var factor in factors) { if (factor.Value == order) { solution += factor.Key + 1; } } return(solution); }