Tôi đang làm việc trên một vấn đề Dự án Euler yêu cầu hệ số của một số nguyên. Tôi có thể đưa ra một danh sách tất cả các số nguyên tố là yếu tố của một số đã cho. Định lý cơ bản về số học ngụ ý rằng tôi có thể sử dụng danh sách này để lấy được mỗi hệ số của số.Tôi có một danh sách Python về các yếu tố chính của một số. Làm thế nào để tôi (pythonically) tìm thấy tất cả các yếu tố?
Kế hoạch hiện tại của tôi là lấy từng số trong danh sách số nguyên tố cơ bản và tăng sức mạnh cho đến khi nó không còn là hệ số nguyên để tìm số mũ tối đa cho mỗi số nguyên tố. Sau đó, tôi sẽ nhân tất cả các kết hợp có thể có của cặp số nguyên tố.
Vì vậy, ví dụ, đối với 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.
Tiếp theo, làm mọi sự kết hợp của những lên đến số mũ tối đa để có được những yếu tố:
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
Vì vậy, danh sách các yếu tố = [1 , 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180]
Đây là mã tôi có cho đến nay. Hai vấn đề: Thứ nhất, tôi không nghĩ rằng nó là rất Pythonic cả. Tôi muốn khắc phục điều đó. Thứ hai, tôi thực sự không có một cách Pythonic để làm bước thứ hai tổ hợp. Trong sự xấu hổ, tôi đã tha cho bạn khỏi các vòng lặp vô lý.
n là số chúng tôi muốn tính. listOfAllPrimes là một danh sách được tính toán trước của các số nguyên tố lên đến 10 triệu.
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)
Mã của bạn sai. Có thể có một số nguyên tố đủ điều kiện lớn hơn căn bậc hai của n. Ví dụ, n = 7 hoặc n = 22. –
@Sheldon L. Cooper Cảm ơn, chắc chắn là sai. Tôi trộn lẫn các thuật toán. –
vì tò mò, bạn đang giải quyết vấn đề số nào? – tokland