Я работаю над проблемой Project Euler, которая требует факторизации целого числа. Я могу составить список всех простых чисел, которые являются фактором определенного числа. Из основной теоремы арифметики следует, что я могу использовать этот список для получения каждого коэффициента числа.
Мой текущий план состоит в том, чтобы взять каждое число в списке базовых простых чисел и повысить его мощность до тех пор, пока он больше не будет целочисленным фактором, чтобы найти максимальные показатели для каждого числа. Затем я умножу все возможные комбинации пар простых чисел.
Так, например, для 180:
Given: prime factors of 180: [2, 3, 5]
Find maximum exponent of each factor:
180 / 2^1 = 90
180 / 2^2 = 45
180 / 2^3 = 22.5 - not an integer, so 2 is the maximum exponent of 2.
180 / 3^1 = 60
180 / 3^2 = 20
180 / 3^3 = 6.6 - not an integer, so 2 is the maximum exponent of 3.
180 / 5^1 = 36
180 / 5^2 = 7.2 - not an integer, so 1 is the maximum exponent of 5.
Далее, для каждой из них используйте каждую комбинацию с максимальным показателем:
2^0 * 3^0 * 5^0 = 1
2^1 * 3^0 * 5^0 = 2
2^2 * 3^0 * 5^0 = 4
2^0 * 3^1 * 5^0 = 3
2^1 * 3^1 * 5^0 = 6
2^2 * 3^1 * 5^0 = 12
2^0 * 3^2 * 5^0 = 9
2^1 * 3^2 * 5^0 = 18
2^2 * 3^2 * 5^0 = 36
2^0 * 3^0 * 5^1 = 5
2^1 * 3^0 * 5^1 = 10
2^2 * 3^0 * 5^1 = 20
2^0 * 3^1 * 5^1 = 15
2^1 * 3^1 * 5^1 = 30
2^2 * 3^1 * 5^1 = 60
2^0 * 3^2 * 5^1 = 45
2^1 * 3^2 * 5^1 = 90
2^2 * 3^2 * 5^1 = 180
Таким образом, список факторов = [1, 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180]
Вот код, который у меня есть. Две проблемы: во-первых, я не думаю, что это очень Pythonic. Я хотел бы это исправить. Во-вторых, у меня действительно нет путинского способа сделать комбинаторный второй шаг. Из-за стыда я избавил вас от смешного набора петель.
n - это число, которое мы хотим определить. listOfAllPrimes - это предварительно просчитанный список простых чисел до 10 миллионов.
def getListOfFactors(n, listOfAllPrimes):
maxFactor = int(math.sqrt(n)) + 1
eligiblePrimes = filter(lambda x: x <= maxFactor, listOfAllPrimes)
listOfBasePrimes = filter(lambda x: n % x ==0, eligiblePrimes)
listOfExponents = [] #(do I have to do this?)
for x in listOfBasePrimes:
y = 1
while (x**(y+1)) % n == 0:
y += 1
listOfExponents.append(y)