Traktor/myenv/Lib/site-packages/sympy/combinatorics/group_numbers.py

119 lines
3.0 KiB
Python
Raw Normal View History

2024-05-23 01:57:24 +02:00
from sympy.core import Integer, Pow, Mod
from sympy import factorint
def is_nilpotent_number(n):
"""
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.
"""
if n <= 0 or int(n) != n:
raise ValueError("n must be a positive integer, not %i" % n)
n = Integer(n)
prime_factors = list(factorint(n).items())
is_nilpotent = True
for p_j, a_j in prime_factors:
for p_i, a_i in prime_factors:
if any([Mod(Pow(p_i, k), p_j) == 1 for k in range(1, a_i + 1)]):
is_nilpotent = False
break
if not is_nilpotent:
break
return is_nilpotent
def is_abelian_number(n):
"""
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.
"""
if n <= 0 or int(n) != n:
raise ValueError("n must be a positive integer, not %i" % n)
n = Integer(n)
if not is_nilpotent_number(n):
return False
prime_factors = list(factorint(n).items())
is_abelian = all(a_i < 3 for p_i, a_i in prime_factors)
return is_abelian
def is_cyclic_number(n):
"""
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.
"""
if n <= 0 or int(n) != n:
raise ValueError("n must be a positive integer, not %i" % n)
n = Integer(n)
if not is_nilpotent_number(n):
return False
prime_factors = list(factorint(n).items())
is_cyclic = all(a_i < 2 for p_i, a_i in prime_factors)
return is_cyclic