Source code for toqito.perms.unique_perms
"""Unique permutations is used to calculate the unique permutations of a list/vector and their count."""
from dataclasses import dataclass
[docs]
@dataclass
class UniqueElement:
"""Class for unique elements to keep track of occurrences."""
value: int
occurrences: int
[docs]
def unique_perms(elements: list[int]):
r"""Determine the number of unique permutations of a list.
Examples:
Consider the following vector
\[
\left[1, 1, 2, 2, 1, 2, 1, 3, 3, 3\right].
\]
The number of possible permutations possible with the above vector is \(4200\). This can be
obtained using the `|toqito⟩` package as follows.
```python exec="1" source="above"
from toqito.perms import unique_perms
vec_nums = [1, 1, 2, 2, 1, 2, 1, 3, 3, 3]
print(len(list(unique_perms(vec_nums))))
```
Args:
elements: List of integers.
Returns:
The number of possible permutations possible.
"""
elem_set = set(elements)
list_unique = [UniqueElement(value=i, occurrences=elements.count(i)) for i in elem_set]
len_elems = len(elements)
return perm_unique_helper(list_unique, [0] * len_elems, len_elems - 1)
[docs]
def perm_unique_helper(list_unique: list[UniqueElement], result_list: list[int], elem_d: int):
"""Provide helper function for unique_perms.
Args:
list_unique: list[UniqueElement]
result_list: list[int]
elem_d: int
"""
if elem_d < 0:
yield tuple(result_list)
else:
for i in list_unique:
if i.occurrences > 0:
result_list[elem_d] = i.value
i.occurrences -= 1
yield from perm_unique_helper(list_unique, result_list, elem_d - 1)
i.occurrences += 1