def n_order(a, n): """Returns the order of ``a`` modulo ``n``. The order of ``a`` modulo ``n`` is the smallest integer ``k`` such that ``a**k`` leaves a remainder of 1 with ``n``. Examples ======== >>> from sympy.ntheory import n_order >>> n_order(3, 7) 6 >>> n_order(4, 7) 3 """ a, n = int_tested(a, n) if igcd(a, n) != 1: raise ValueError("The two numbers should be relatively prime") group_order = totient(n) factors = factorint(group_order) order = 1 if a > n: a = a % n for p, e in factors.iteritems(): exponent = group_order for f in xrange(0, e + 1): if (a ** (exponent)) % n != 1: order *= p ** (e - f + 1) break exponent = exponent // p return order
def n_order(a, n): """ returns the order of a modulo n Order of a modulo n is the smallest integer k such that a^k leaves a remainder of 1 with n. """ if igcd(a, n) != 1: raise ValueError("The two numbers should be relatively prime") group_order = totient_(n) factors = factorint(group_order) order = 1 if a > n: a = a % n for p, e in factors.iteritems(): exponent = group_order for f in xrange(0, e + 1): if (a ** (exponent)) % n != 1: order *= p ** (e - f + 1) break exponent = exponent // p return order
def n_order(a, n): """ returns the order of a modulo n Order of a modulo n is the smallest integer k such that a^k leaves a remainder of 1 with n. """ if igcd(a, n) != 1: raise ValueError("The two numbers should be relatively prime") group_order = totient_(n) factors = factorint(group_order) order = 1 if a > n: a = a % n for p, e in factors.iteritems(): exponent = group_order for f in xrange(0, e + 1): if (a**(exponent)) % n != 1: order *= p**(e - f + 1) break exponent = exponent // p return order