Я использовал функцию 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
? Кроме того, использование сопряженных разделов во многих случаях хорошо работает для получения объективных выборок, но я не могу сказать, что точно понимаю, почему.