Рассмотрим следующую проблему:
Суммируйте некоторую функцию f: Z ^ 2 -> R по всем натуральным числам (x, y), где x, y находятся в [0, B]
Это довольно легко реализовать в Python:
res = 0
for x in range(B+1):
for y in range(B+1):
res += f(x,y)
Конечно, есть много «лучших» способов написать вышеприведенное утверждение.Я сосредоточусь на конкретном методе - используя itertools, вы можете написать:
res = 0
for vals in itertools.product(range(B+1), repeat = 2)
res += f(*vals)
Это дает то преимущество, что обобщение его на функции f: Z ^ n -> R тривиально, простоизменить repeat = 2
на repeat = n
.Если переменные имеют разные диапазоны, вы меняете код на itertools.product(*[B1, B2, ..., Bn])
, опять же, довольно просто.
Я заинтересован в выполнении вышеизложенного, но где переменные, которые я суммирую, "зависимы"" в некотором роде.Достаточно рассмотреть случай, когда я суммирую по переменным (x, y) в [0, B] ^ 2, где x + y <= B. </p>
Вы можете снова написать это как вложенное дляцикл:
res = 0
for x in range(B):
for y in range(B - x):
res += f(x, y)
Мне интересно, есть ли какие-нибудь стандартные библиотечные методы, чтобы обобщить это (точно так же, как itertools.product
обобщил последнюю конструкцию).Вы могли бы снова использовать конструкцию iterator.product (и просто pass
, когда (x1, x2, ..., xn) не соответствуют критерию), но мне было интересно, существует ли более прямой способ итерации поэтот набор с использованием стандартной библиотеки.
Причина, по которой подход pass
является неподходящим, заключается в количестве баллов, которые вам придется пройти.Некоторые математические вычисления (соотнося объем шара l1 с объемом шара l бесконечности как функцию от размера) показывают, что только 1 / n!Точки будут соответствовать критериям приемлемости, поэтому при переборе [0, B] ^ n и проверке выполнения некоторых критериев будет довольно большой «мусор».