Алгоритм случайного создания целочисленных разделов определенной длины в Python?

Я использовал функцию random_element(), предоставляемую SAGE, для создания случайных целочисленных разделов для заданного целого числа (N), которые имеют определенную длину(S). Я пытаюсь создать беспристрастные случайные выборки из набора всех разделов для заданных значений Nи S. Функция SAGE быстро возвращает случайные разделы для N (, то естьPartitions(N).random_element()).

Однако при добавленииS(т.е.Partitions(N,length=S).random_element())он сильно замедляется. Точно так же фильтрация случайных разделов Nдлиной Sневероятно медленна.

Однако, и я надеюсь, что это кому-то поможет, я обнаружил, что в случае, когда функция возвращает раздел N, не соответствующий длине S, сопряженный раздел часто имеет длину S. То есть:

S = 10
N = 100
part = list(Partitions(N).random_element())
    if len(part) != S:
        SAD = list(Partition(part).conjugate())
        if len(SAD) != S:
            continue

Это увеличивает скорость нахождения разделов длины Sи, по-видимому, дает несмещенные выборки. (Я исследовал результаты на целых наборах разделов для различных значений NиS).

Однако я использую значения N (, например.10,000)и S (, напр. 300), которые делают даже этот подход непрактично медленным. Комментарий, связанный с функцией SAGE random_element(), признает, что есть много возможностей для оптимизации. Итак, есть ли способ более быстро генерировать несмещенные (, то есть случайные однородные )выборки целочисленных разделов, соответствующих заданным значениям Nи S, возможно, не создавая разделы, которые не соответствуют S? Кроме того, использование сопряженных разделов во многих случаях хорошо работает для получения объективных выборок, но я не могу сказать, что точно понимаю, почему.

6
задан Zsolt Botykai 24 April 2012 в 06:55
поделиться