119 lines
3.0 KiB
Python
119 lines
3.0 KiB
Python
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
|