
    \h#                         S SK JrJr  S SKJr  S SKJr  S SKJr  S\	S\
4S jrS\
4S jrS\
4S	 jrS\
4S
 jrS rS rg)    )chaincombinations)gcd)	factorint)as_intfactorsreturnc                     U R                  5        HA  nU R                  5        H*  u  p#Sn[        U5       H  nXB-  U-  nUS:X  d  M        g   M,     MC     g)zCheck 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_s         Y/var/www/auris/envauris/lib/python3.13/site-packages/sympy/combinatorics/group_numbers.py_is_nilpotent_numberr      sU     \\^MMODA A1XC!G6  	 $      c                 h    [        U 5      n U S::  a  [        SU -  5      e[        [        U 5      5      $ )a&  
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   )ns    r   is_nilpotent_numberr      s4    0 	q	AAv?!CDD	!--r   c                     [        U 5      n U S::  a  [        SU -  5      e[        U 5      n[        S UR	                  5        5       5      =(       a    [        U5      $ )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              3   *   #    U  H	  oS :  v   M     g7f)   N .0r   s     r   	<genexpr>$is_abelian_number.<locals>.<genexpr>V   s     /.1u.   r   r   r   allvaluesr   r   r   s     r   is_abelian_numberr)   8   sQ    4 	q	AAv?!CDDlG/gnn.//Q4H4QQr   c                     [        U 5      n U S::  a  [        SU -  5      e[        U 5      n[        S UR	                  5        5       5      =(       a    [        U5      $ )a3  
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              3   *   #    U  H	  oS :H  v   M     g7fr   Nr   r    s     r   r"   #is_cyclic_number.<locals>.<genexpr>w   s     0/!Av/r$   r%   r(   s     r   is_cyclic_numberr.   Y   sQ    4 	q	AAv?!CDDlG0w~~/00R5I'5RRr   c           	        ^^	 U  V^s1 s H!  m[        U4S jU  5       5      (       d  M  TiM#     nnX-
  m	Sn[        R                  " U	4S j[        [	        T	5      S-   5       5       5      nU Hb  n[        U5      nSnT	U-
   HE  m[	        X%-   Vs/ s H  owT-  S:X  d  M  UPM     sn5      nUTU-  S-
  TS-
  -  -  nU(       a  ME    O   X6-  nMd     U$ s  snf s  snf )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              3   2   >#    U  H  oT-  S :g  v   M     g7fr,   r   )r!   r   r   s     r   r"   "_holder_formula.<locals>.<genexpr>   s     (K]Q!]s   r   c              3   <   >#    U  H  n[        TU5      v   M     g 7f)N)r   )r!   rMs     r   r"   r1      s     "O!<1#5#5s   r   )r&   r   from_iterabler   lenset)
prime_factorsr   Fspowersetpsprodr   cr4   s
    `       @r   _holder_formular?   z   s    ~ "LMqS(K](K%KMALA	A"""OuSVAX"OOHWRA51a%1*Q56AQTAX1q5))D4	 
 	
	  H 	M 6s   CCC"Cc           
         [        U 5      n U S::  a  [        SU -  5      e[        U 5      n[        U5      S:X  Ga  [	        UR                  5       5      S   u  p#US:X  a  / SQnU[        U5      :  a  XC   $ US:X  a  / SQnU[        U5      :  a  XS   $ US::  a  U$ US:X  a  gUS	:X  a  g
US:X  a+  SSU-  -   S[        US-
  S5      -  -   [        US-
  S	5      -   $ US:X  aJ  SUS-  -  SU-  -   S-   S[        US-
  S5      -  -   S[        US-
  S	5      -  -   S[        US-
  S5      -  -   $ US:X  a  US:X  a  gSUS-  -  SUS	-  -  -   SUS-  -  -   SUS-  -  -   SU-  -   S-   S	US-  -  SU-  -   S-   [        US-
  S5      -  -   US-  SU-  -   S-   [        US-
  S	5      -  -   SU-  S-   [        US-
  S5      -  -   S	[        US-
  S5      -  -   S[        US-
  S5      -  -   [        US-
  S5      -   $ [        S UR                  5        5       5      (       aT  0 SS_SS_S S_SS
_S!S	_S"S#_S$S#_SS	_S%S_S&S'_S(S_S'S_S)S
_S*S+_S,S+_S-S	_S.S_S(SS	S'S
SS/S	S0.EnX;   a  X`   $ [        S15      e[        U5      S:X  a'  [        UR                  5       5      u  p'Xr-  S:X  a  S$ S$ [        [        UR                  5       5      5      $ )2a  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(99) is known to be 2,
    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   rA         3   i  i	  i  i! l   yLZ. r   )
r   r   rA   rB      C   i  i^$  imM l   NC rB      rE   =      '   iX           i     ,      i  i	  i#              	   c              3   *   #    U  H	  oS :  v   M     g7fr,   r   r    s     r   r"   groups_count.<locals>.<genexpr>  s     
+*Qq5*r$            $   rC   (   -   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   r6   listr   r   anyr'   sortedr   r?   r7   )r   r   r   r   A000679A090091smallr   s           r   groups_countrv      s   d 	q	AAv?!CDDlG
7|qgmmo&q)6SG3w<z!6JG3w<z!6H666!8aAaCm+c!A#qk996QT6BqD=3&S1a[.!#%c!A#qk>245c!A#qkMB B6AvQT6Bq!tG#bAg-AqD83q5@4GQT6BqD=3&AaC3478!tbd{S7H#aPQcST+6UVQ38S1a[()+,S1a[=9;<S1a[=IKNqQRsTU;W W 
+'..*
+++7Q 7A 7r1 7b" 7b! 7R 7R 7R 7BPQ 7SUWY 7A717 "7&("7.0"768!7=?7HJPQWXBBBA7 :8OTUU
7|qglln%EQJq%A%3w||~.//r   N)	itertoolsr   r   sympy.external.gmpyr   sympy.ntheory.factor_r   sympy.utilities.miscr   dictboolr   r   r)   r.   r?   rv   r   r   r   <module>r}      s[    ) # + '$ 4 $.d .<RD RBS4 SBM`\0r   