Прежде всего, прошу прощения за заголовок, я не знал, как выразить свою проблему словами. Ну, вот оно:
Для целого числа a
больше 1 пусть F
будет отсортированным списком простых множителей числа a
. Мне нужно найти все кортежи c
(заполненные целыми числами), такие, что длина каждого кортежа равна размеру F
и (F[0] ** c[0]) * (F[1] ** c[1]) * (...) < a
. Добавлю, что пишу на Python.
Пример:
a = 60
F = [2,3,5]
# expected result:
C = {(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 2, 0),
(0, 2, 1), (0, 3, 0), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1),
(1, 2, 0), (1, 3, 0), (2, 0, 0), (2, 0, 1), (2, 1, 0), (2, 2, 0), (3, 0, 0),
(3, 0, 1), (3, 1, 0), (4, 0, 0), (4, 1, 0), (5, 0, 0)}
Я сгенерировал этот результат, используя itertools.product()
, а именно:
m = math.floor(round(math.log(a, min(F)), 12))
for i in itertools.product(range(m + 1), repeat=len(F)):
if math.prod([F[j] ** i[j] for j in range(len(F))]) < a: print(i)
Я думаю, что это работает, но это неэффективно. Например число 5 встречается только в одном кортеже, но проверено много раз! Есть ли способ сделать это быстрее? Я бы использовал несколько циклов while
(с операторами break
), но поскольку я не знаю, какова длина F, я не думаю, что это возможно.
a
? У вас есть разложениеa
на простые множители? Является лиc[i]
показателем степени множителяF[i]
в текущем делителеa
? - person smed   schedule 20.12.2020a
. Например, последний кортеж -(5,0,0)
эквивалентен 2^5 * 3^0 * 5^0 = 32 * 1 * 1 = 32, что не является делителем 60, но меньше 60 и набором простых множителей 32 — это подмножество простых делителей числа 60. И у меня есть хорошая функция для простой факторизацииa
. - person Michał Dobranowski   schedule 20.12.2020f
изa
максимальный показатель степени будетn
таким, чтоf**n<=a<f**(n+1)
? - person smed   schedule 20.12.2020f**n<a<=f**(n+1)
. И тогда f - максимальный показатель, но он не будет работать во всех случаях, например. дляf = 2
максимальный показатель степени равен 5, но 2^5 * 3^1 * 5^0 > 60 (поэтому кортеж(5,1,0)
не включен в мой ожидаемый результат. - person Michał Dobranowski   schedule 20.12.2020