o
    oh#                     @   s   d dl mZmZ d dlmZ d dlmZ d dlmZ de	de
fddZde
fd	d
Zde
fddZde
fddZdd Zdd ZdS )    )chaincombinations)gcd)	factorint)as_intfactorsreturnc                 C   sT   |   D ]#}|  D ]\}}d}t|D ]}|| | }|dkr%   dS qq
qdS )z Check whether `n` is a nilpotent number.
    Note that ``factors`` is a prime factorization of `n`.

    This is a low-level helper for ``is_nilpotent_number``, for internal use.
       FT)keysitemsrange)r   pqem_ r   u/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/combinatorics/group_numbers.py_is_nilpotent_number   s   
r   c                 C   s(   t | } | dkrtd|  tt| S )aj  
    Check whether `n` is a nilpotent number. A number `n` is said to be
    nilpotent if and only if every finite group of order `n` is nilpotent.
    For more information see [1]_.

    Examples
    ========

    >>> from sympy.combinatorics.group_numbers import is_nilpotent_number
    >>> from sympy import randprime
    >>> is_nilpotent_number(21)
    False
    >>> is_nilpotent_number(randprime(1, 30)**12)
    True

    References
    ==========

    .. [1] Pakianathan, J., Shankar, K., Nilpotent Numbers,
           The American Mathematical Monthly, 107(7), 631-634.
    .. [2] https://oeis.org/A056867

    r   $n must be a positive integer, not %i)r   
ValueErrorr   r   )nr   r   r   is_nilpotent_number   s   r   c                 C   B   t | } | dkrtd|  t| }tdd | D o t|S )a  
    Check whether `n` is an abelian number. A number `n` is said to be abelian
    if and only if every finite group of order `n` is abelian. For more
    information see [1]_.

    Examples
    ========

    >>> from sympy.combinatorics.group_numbers import is_abelian_number
    >>> from sympy import randprime
    >>> is_abelian_number(4)
    True
    >>> is_abelian_number(randprime(1, 2000)**2)
    True
    >>> is_abelian_number(60)
    False

    References
    ==========

    .. [1] Pakianathan, J., Shankar, K., Nilpotent Numbers,
           The American Mathematical Monthly, 107(7), 631-634.
    .. [2] https://oeis.org/A051532

    r   r   c                 s   s    | ]}|d k V  qdS )   Nr   .0r   r   r   r   	<genexpr>V       z$is_abelian_number.<locals>.<genexpr>r   r   r   allvaluesr   r   r   r   r   r   is_abelian_number8   
   r#   c                 C   r   )a  
    Check whether `n` is a cyclic number. A number `n` is said to be cyclic
    if and only if every finite group of order `n` is cyclic. For more
    information see [1]_.

    Examples
    ========

    >>> from sympy.combinatorics.group_numbers import is_cyclic_number
    >>> from sympy import randprime
    >>> is_cyclic_number(15)
    True
    >>> is_cyclic_number(randprime(1, 2000)**2)
    False
    >>> is_cyclic_number(4)
    False

    References
    ==========

    .. [1] Pakianathan, J., Shankar, K., Nilpotent Numbers,
           The American Mathematical Monthly, 107(7), 631-634.
    .. [2] https://oeis.org/A003277

    r   r   c                 s   s    | ]}|d kV  qdS r	   Nr   r   r   r   r   r   w   r   z#is_cyclic_number.<locals>.<genexpr>r   r"   r   r   r   is_cyclic_numberY   r$   r&   c                    s   fddD }|  d}t  fddtt d D }|D ]0}t|}d} | D ]tfdd||B D }|| d d  9 }|sN nq/||7 }q#|S )	a|   Number of groups of order `n`.
    where `n` is squarefree and its prime factors are ``prime_factors``.
    i.e., ``n == math.prod(prime_factors)``

    Explanation
    ===========

    When `n` is squarefree, the number of groups of order `n` is expressed by

    .. math ::
        \sum_{d \mid n} \prod_p \frac{p^{c(p, d)} - 1}{p - 1}

    where `n=de`, `p` is the prime factor of `e`,
    and `c(p, d)` is the number of prime factors `q` of `d` such that `q \equiv 1 \pmod{p}` [2]_.

    The formula is elegant, but can be improved when implemented as an algorithm.
    Since `n` is assumed to be squarefree, the divisor `d` of `n` can be identified with the power set of prime factors.
    We let `N` be the set of prime factors of `n`.
    `F = \{p \in N : \forall q \in N, q \not\equiv 1 \pmod{p} \}, M = N \setminus F`, we have the following.

    .. math ::
        \sum_{d \in 2^{M}} \prod_{p \in M \setminus d} \frac{p^{c(p, F \cup d)} - 1}{p - 1}

    Practically, many prime factors are expected to be members of `F`, thus reducing computation time.

    Parameters
    ==========

    prime_factors : set
        The set of prime factors of ``n``. where `n` is squarefree.

    Returns
    =======

    int : Number of groups of order ``n``

    Examples
    ========

    >>> from sympy.combinatorics.group_numbers import _holder_formula
    >>> _holder_formula({2}) # n = 2
    1
    >>> _holder_formula({2, 3}) # n = 2*3 = 6
    2

    See Also
    ========

    groups_count

    References
    ==========

    .. [1] Otto Holder, Die Gruppen der Ordnungen p^3, pq^2, pqr, p^4,
           Math. Ann. 43 pp. 301-412 (1893).
           http://dx.doi.org/10.1007/BF01443651
    .. [2] John H. Conway, Heiko Dietrich and E.A. O'Brien,
           Counting groups: gnus, moas and other exotica
           The Mathematical Intelligencer 30, 6-15 (2008)
           https://doi.org/10.1007/BF02985731

    c                    s&   h | ] t  fd dD r qS )c                 3   s    | ]	}|  d kV  qdS r%   r   r   r   r   r   r   r      s    z,_holder_formula.<locals>.<setcomp>.<genexpr>)r    )r   )prime_factorsr(   r   	<setcomp>   s   & z"_holder_formula.<locals>.<setcomp>r   c                 3   s    | ]}t  |V  qd S )N)r   )r   r)Mr   r   r      s    z"_holder_formula.<locals>.<genexpr>r	   c                    s   g | ]
}|  d kr|qS )r	   r   r'   r(   r   r   
<listcomp>   s    z#_holder_formula.<locals>.<listcomp>)r   from_iterabler   lenset)r)   Fspowersetpsprodcr   )r,   r   r)   r   _holder_formulaz   s   ?$
r7   c              
   C   s,  t | } | dkrtd|  t| }t|dkrt| d \}}|dkr5g d}|t|k r5|| S |dkrGg d}|t|k rG|| S |dkrM|S |dkrSdS |d	krYd
S |dkrsdd|  dt|d d  t|d d	 S |dkrd|d  d|  d dt|d d  dt|d d	  dt|d d  S |dkr|dkrdS d|d  d|d	   d|d   d|d   d|  d d	|d  d|  d t|d d  |d d|  d t|d d	  d| d t|d d  d	t|d d  dt|d d  t|d d S tdd | D rji ddd dd!ddd
d"d	d#d$d%d$dd	d&dd'd(d)dd(dd*d
d+d,d-d,d.d	d/dd)dd	d(d
dd0d	d1}| |v rf||  S td2t|dkrt|	 \}}||kr||}}|| dkrdS dS t
t|	 S )3a   Number of groups of order `n`.
    In [1]_, ``gnu(n)`` is given, so we follow this notation here as well.

    Parameters
    ==========

    n : Integer
        ``n`` is a positive integer

    Returns
    =======

    int : ``gnu(n)``

    Raises
    ======

    ValueError
        Number of groups of order ``n`` is unknown or not implemented.
        For example, gnu(`2^{11}`) is not yet known.
        On the other hand, gnu(12) is known to be 5,
        but this has not yet been implemented in this function.

    Examples
    ========

    >>> from sympy.combinatorics.group_numbers import groups_count
    >>> groups_count(3) # There is only one cyclic group of order 3
    1
    >>> # There are two groups of order 10: the cyclic group and the dihedral group
    >>> groups_count(10)
    2

    See Also
    ========

    is_cyclic_number
        `n` is cyclic iff gnu(n) = 1

    References
    ==========

    .. [1] John H. Conway, Heiko Dietrich and E.A. O'Brien,
           Counting groups: gnus, moas and other exotica
           The Mathematical Intelligencer 30, 6-15 (2008)
           https://doi.org/10.1007/BF02985731
    .. [2] https://oeis.org/A000001

    r   r   r	      )r	   r	   r8         3   i  i	  i  i! l   yLZ. r   )
r	   r	   r8   r9      C   i  i^$  imM l   NC r9      r<   =      '   iX           i     ,      i  i	  i#              	   c                 s   s    | ]}|d kV  qdS r%   r   r   r   r   r   r     r   zgroups_count.<locals>.<genexpr>         $   r:   (   -   0   4   2   6   8      <   ?   D   
   )H   K   L   P   T   X   Z   \   z9Number of groups of order n is unknown or not implemented)r   r   r   r/   listr   r   anyr!   r
   r7   r0   )r   r   r   r   A000679A090091smallr   r   r   r   groups_count   s   2,
:$ >



rj   N)	itertoolsr   r   sympy.external.gmpyr   sympy.ntheory.factor_r   sympy.utilities.miscr   dictboolr   r   r#   r&   r7   rj   r   r   r   r   <module>   s    !!P