Skip to content

Commit

Permalink
Rework unit testing of number theoretic functions
Browse files Browse the repository at this point in the history
  • Loading branch information
mhostetter committed Aug 6, 2021
1 parent bc0f0e9 commit c77b5b8
Show file tree
Hide file tree
Showing 6 changed files with 596 additions and 299 deletions.
4 changes: 4 additions & 0 deletions galois/_factor.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ def legendre_symbol(a, p):
for a in range(7):
print(f"({a} / 7) = {galois.legendre_symbol(a, 7)}")
"""
if not isinstance(a, (int, np.integer)):
raise TypeError(f"Argument `a` must be an integer, not {type(a)}.")
if not isinstance(p, (int, np.integer)):
raise TypeError(f"Argument `p` must be an integer, not {type(p)}.")
if not (is_prime(p) and p > 2):
raise ValueError(f"Argument `p` must be an odd prime greater than 2, not {p}.")

Expand Down
40 changes: 26 additions & 14 deletions galois/_math.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import math
import sys

import numpy as np

from ._overrides import set_module

__all__ = ["pow", "lcm", "prod"]
Expand All @@ -12,7 +14,7 @@
@set_module("galois")
def pow(base, exponent, modulus): # pylint: disable=redefined-builtin
r"""
Efficiently exponentiates an integer :math:`a^k \textrm{mod}\ m`.
Efficiently exponentiates an integer :math:`a^k\ \textrm{mod}\ m`.
The algorithm is more efficient than exponentiating first and then reducing modulo :math:`m`.
Expand All @@ -32,7 +34,7 @@ def pow(base, exponent, modulus): # pylint: disable=redefined-builtin
Returns
-------
int
The modular exponentiation :math:`a^k \textrm{mod}\ m`.
The modular exponentiation :math:`a^k\ \textrm{mod}\ m`.
Examples
--------
Expand All @@ -55,6 +57,11 @@ def lcm(*integers):
This function is included for Python versions before 3.9. For Python 3.9 and later, this function
calls :func:`math.lcm` from the standard library.
Parameters
----------
*integers : tuple of int
Each argument must be an integer.
Returns
-------
int
Expand All @@ -78,13 +85,17 @@ def lcm(*integers):
lcm = galois.lcm(prime1, prime2); lcm
lcm == prime1 * prime2
"""
if sys.version_info.major == 3 and sys.version_info.minor >= 9:
if sys.version_info.major == 3 and sys.version_info.minor >= 9: # pragma: no cover
return math.lcm(*integers) # pylint: disable=no-member
else:
_lcm = 1
for integer in integers:
_lcm = _lcm * integer // math.gcd(_lcm, integer)
return _lcm

if not all(isinstance(a, (int, np.integer)) for a in integers):
raise TypeError(f"Each argument must be an integer, not {integers}.")

lcm_ = 1
for integer in integers:
lcm_ = (lcm_ * integer) // math.gcd(lcm_, integer)

return lcm_


@set_module("galois")
Expand All @@ -109,10 +120,11 @@ def prod(iterable, start=1):
galois.prod([2, 4, 14])
galois.prod([2, 4, 14], start=2)
"""
if sys.version_info.major == 3 and sys.version_info.minor >= 8:
if sys.version_info.major == 3 and sys.version_info.minor >= 8: # pragma: no cover
return math.prod(iterable, start=start) # pylint: disable=no-member
else:
result = start
for integer in iterable:
result *= integer
return result

result = start
for integer in iterable:
result *= integer

return result
Loading

0 comments on commit c77b5b8

Please sign in to comment.