2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Числа заполнения в Python
Сообщение27.05.2024, 19:14 
Собственно, речь идет о модели, являющейся основой для вывода известных квантовых статистик БЭ и ФД:
Есть K+1 ячейка, в которых располагаются N частиц, ячейки пронумерованы, k=0, 1, 2, ..., К. В k-той ячейке могут "сидеть" $n_k$ частиц так, что $n_0 +n_1 + ... +n_k + ... + n_K = N$. $n_k$ называются числами заполнения. Надо выбрать наборы всех возможных чисел заполнения, то есть, все возможные строки $n_0, n_1, ..., n_k, ..., n_K$ при фиксированных К и N. Интересует не "теория", алгоритм и т.п., а конкретное воплощение в библиотеках "Питона" для анализа данных, таких как, например, Pandas, NumPy,SciPy и т.п.

 
 
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 11:24 
Аватара пользователя
Это называется integer composition, можете поискать по стандартным библиотекам. Скорее всего где-то в sympy или sage есть.
Хотя методом перегородок это разбиение делается в две строчки из выборок с повторением, для которых есть стандартная функция - чем такой вариант не устраивает?

 
 
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 17:26 
Аватара пользователя
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
class iter_desum:
        "Iterate over all possible sets of natural numbers which sums is equal to the specified value (with optional limits for maximal number and set size)"
        __slots__ = ('__a','__s','__ll','__fin');
        def __init__(self,sum:int,max:int=None,len:int=None) -> None:
                ensure( type(sum)==int and sum>0, "only positive integer can be split into sum" );
                if max is None:
                        max = sum;
                ensure( type(max)==int and max>0, "addends limit can only be a positive integer" );
                if len is None:
                        len = sum;
                ensure( type(len)==int and len>0, "the maximum number of addends can only be a positive integer" );
                ensure( len*max >= sum, f"required sum {sum} can be achived by {len} addends of value {max} each" );
                self.__s = sum;
                self.__ll = len;
                nn = min(sum,max);
                rr = [nn];      cc = 1;
                sum -= nn;
                while sum > 0 and cc < len:
                        rr.append(min(rr[-1],sum));
                        sum -= rr[-1];
                        cc += 1;
                self.__a = rr;
                self.__fin = False;
        def __iter__(self):
                return self;
        def __next__(self):
                if self.__fin:
                        raise StopIteration;
                res = self.__a.copy();
                rr = self.__a;
                while True:
                        r = 0;
                        while rr and ( r := rr.pop() ) == 1:    pass;
                        if r <= 1:
                                self.__fin = True;
                                return res;
                        rrc = rr + [r-1];
                        hnc = self.__s-sum(rrc);
                        while hnc > 0 and len(rrc) < self.__ll:
                                rrc.append(min(rrc[-1],hnc));
                                hnc -= rrc[-1];
                        if hnc == 0:
                                self.__a = rrc;
                                return res;
 

Почти то, что требуется :mrgreen:

 
 
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 17:37 
mihaild в сообщении #1640521 писал(а):
Это называется integer composition,

mihaild, спасибо, точно, припоминаю, integer compositions эти строки называются. Математические понятиятермины плохо удерживаются в голове)

Geen, а почему почти?

 
 
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 17:45 
Аватара пользователя
druggist в сообщении #1640556 писал(а):
а почему почти?

Потому что "множество" (упорядоченный массив)

-- 28.05.2024, 17:53 --

Вообще, Вы бы поточнее обозначили задачу - каков масштаб $N$ и $K$ и что Вы собираетесь делать с этими строками...

 
 
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 18:17 
Точнее говоря, это слабые композиции(включая нули) ограниченной длины: K+1-restricted weak composition of an integer N
Geen в сообщении #1640559 писал(а):
Вообще, Вы бы поточнее обозначили задачу - каков масштаб $N$ и $K$ и что Вы собираетесь делать с этими строками...

Про масштаб затрудняюсь, а для чего... Все стандартно, энергетический спектр системы невзаимодействующих частиц ищется. Каждой ячейке приписывается энергия $\varepsilon_k$ ($\varepsilon _0 = 0$), тогда энергия системы с определенными числами заполнения $n_k$: $E=n_0 \varepsilon _0 + n_1 \varepsilon _1 + ... + n_K \varepsilon _K  $$

 
 
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 18:45 
Аватара пользователя
druggist в сообщении #1640562 писал(а):
Про масштаб затрудняюсь, а для чего...

Гм, ну если эти числа порядка сотендесятков, то кроме как итератором по этим строкам и не пройти.
А если Вы хотите как-то перерабатывать эти строки в совокупности (например, изощрённо сортировать), то итератор Вам не подходит...

 
 
 
 Re: Числа заполнения в Python
Сообщение06.06.2024, 00:26 
В wolfram alpha обнаружил функцию, которая выдает лист всех композиций n на k частей. Но у меня, почему-то игнорирует k, то-есть выдает список всех композиций числа n. Интересно, у всех такая же ситуация? Или, может, я что-то ввожу неправильно?

 
 
 
 Re: Числа заполнения в Python
Сообщение06.06.2024, 02:27 
druggist в сообщении #1641593 писал(а):
В wolfram alpha
обнаружил функцию, которая выдает лист всех композиций n на k частей. Но у меня, почему-то игнорирует k, то-есть выдает список всех композиций числа n.

На всякий случай. Функция в pari/gp которая выдает все разбиения (т.е. композиции без перестановок) числа n на k частей, включая нулевые partitions(n,[0,n],k)
Для n=5, k=3:
? partitions(5,[0,5],3)
%1 = [Vecsmall([0, 0, 5]), Vecsmall([0, 1, 4]), Vecsmall([0, 2, 3]), Vecsmall([1, 1, 3]), Vecsmall([1, 2, 2])]
?

Перестановки можно легко добавить, при желании...

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group