2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Числа заполнения в Python
Сообщение27.05.2024, 19:14 


27/02/09
2835
Собственно, речь идет о модели, являющейся основой для вывода известных квантовых статистик БЭ и ФД:
Есть 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 
Заслуженный участник
Аватара пользователя


16/07/14
9143
Цюрих
Это называется integer composition, можете поискать по стандартным библиотекам. Скорее всего где-то в sympy или sage есть.
Хотя методом перегородок это разбиение делается в две строчки из выборок с повторением, для которых есть стандартная функция - чем такой вариант не устраивает?

 Профиль  
                  
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 17:26 
Заслуженный участник
Аватара пользователя


01/09/13
4656
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 


27/02/09
2835
mihaild в сообщении #1640521 писал(а):
Это называется integer composition,

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

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

 Профиль  
                  
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 17:45 
Заслуженный участник
Аватара пользователя


01/09/13
4656
druggist в сообщении #1640556 писал(а):
а почему почти?

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

-- 28.05.2024, 17:53 --

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

 Профиль  
                  
 
 Re: Числа заполнения в Python
Сообщение28.05.2024, 18:17 


27/02/09
2835
Точнее говоря, это слабые композиции(включая нули) ограниченной длины: 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 
Заслуженный участник
Аватара пользователя


01/09/13
4656
druggist в сообщении #1640562 писал(а):
Про масштаб затрудняюсь, а для чего...

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

 Профиль  
                  
 
 Re: Числа заполнения в Python
Сообщение06.06.2024, 00:26 


27/02/09
2835
В wolfram alpha обнаружил функцию, которая выдает лист всех композиций n на k частей. Но у меня, почему-то игнорирует k, то-есть выдает список всех композиций числа n. Интересно, у всех такая же ситуация? Или, может, я что-то ввожу неправильно?

 Профиль  
                  
 
 Re: Числа заполнения в Python
Сообщение06.06.2024, 02:27 


05/09/16
12055
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group