Modular Arithmetic
In this section we describe some functions that make it possible to perform modular arithmetic without conversions to residue class rings.
Arithmetic Operations
- Modexp(n, k, m): RngIntElt, RngIntElt, RngIntElt -> RngIntElt
The modular power \(n^k\bmod m\), where \(n\) is an integer, \(k\) is an integer and \(m\) is an integer greater than one. If \(k\) is negative, \(n\) must have an inverse \(i\) modulo \(m\), and the result is then \(i^{-k}\bmod m\). The result is always an integer \(r\) with \(0\leq r< m\).
- n mod m: RngIntElt, RngIntElt -> RngIntElt
Remainder upon dividing the integer \(n\) by the integer \(m\). The result always has the same sign as \(m\). An error results if \(m\) is zero.
- Modinv(n, m): RngIntElt, RngIntElt -> RngIntElt
- InverseMod(n, m): RngIntElt, RngIntElt -> RngIntElt
Given an integer \(n\) and a positive integer \(m\), such that \(n\) and \(m\) are coprime, return an inverse \(u\) of \(n\) modulo \(m\), that is, return an integer \(1\leq u<m\) such that \(u\cdot n\equiv 1\bmod m\).
- Modsqrt(n, m): RngIntElt, RngIntElt -> BoolElt, RngIntElt
Given an integer \(n\) and an integer \(m \geq 2\), this function returns an integer \(b\) such that \(0 \leq b < m\) and \(b^2\equiv n\bmod m\) if such \(b\) exists; an error results if no such root exists.
- Modorder(n, m): RngIntElt, RngIntElt -> RngIntElt
For integers \(n\) and \(m\), \(m > 1\), the function returns the least integer \(k \geq 1\) such that \(n^k \equiv 1 \bmod m\), or zero if \(\gcd(n, m) \neq 1\).
- IsPrimitive(n, m): RngIntElt, RngIntElt -> BoolElt
Returns
trueif \(n\) is a primitive root for \(m\),falseotherwise (\(0 < n < m\)).
- PrimitiveRoot(m): RngIntElt -> RngIntElt
Given an integer \(m > 1\), this function returns an integer value defined as follows: If \({\mathbb{Z}}/m{\mathbb{Z}}\) has a primitive root and the function is successful in finding it, the root \(a\) is returned. If \({\mathbb{Z}}/m{\mathbb{Z}}\) has a primitive root but the algorithm does not succeed in finding it, or \({\mathbb{Z}}/m{\mathbb{Z}}\) does not possess a primitive root, then zero is returned.
The Solution of Modular Equations
The functions described here can be used if an occasional modular operation is required; the results are integers again. For more extensive modular arithmetic it is preferable to convert to residue class ring arithmetic. See section Residue Class Rings for details.
- Solution(a, b, m): RngIntElt, RngIntElt, RngIntElt -> RngIntElt, RngIntElt
If a solution exists to the linear congruence \(ax\equiv b \bmod m\), then returns \(x0, k\) such that \(x = x0 + i*k\) represents the complete set of solutions, where i can be any integer. Otherwise, returns -1.
- ChineseRemainderTheorem(X, N): [RngIntElt], [RngIntElt] -> RngIntElt
- CRT(X, N): [RngIntElt], [RngIntElt] -> RngIntElt
Apply the Chinese Remainder Theorem to the integer sequences \(X\) and \(N\). The sequences must have the same length, \(k\) say. The function returns the unique integer \(x\) in the range \(0 \leq x < LCM(N[1]\cdot\ldots\cdot N[k])\) such that \(x \equiv X[i] \bmod N[i]\). The elements of \(N\) must all be positive integers greater than one. If there is no solution, then -1 is returned.
- Solution(A, B, N): [RngIntElt], [RngIntElt], [RngIntElt] -> RngIntElt
Return a solution \(x\) to the system of simultaneous linear congruences defined by the integer sequences \(A\), \(B\), and \(N\). Each of these sequences must have the same number of terms, \(k\) say. The elements of \(N\) must all be positive integers greater than one. The \(i\)-th congruence is \(A[i] \cdot x \equiv B[i] \bmod N[i]\). The solution \(x\) will satisfy \(0 \leq x < LCM(N[1]\cdot\ldots\cdot N[k])\). If no solution exists, -1 is returned.
- NormEquation(d, m): RngIntElt, RngIntElt -> BoolElt, RngIntElt, RngIntElt
- NormEquation(d, m: parameters)): RngIntElt, RngIntElt -> BoolElt, RngIntElt, RngIntElt
Factorization: [<RngIntElt, RngIntElt>] Default: [ ]
Given a positive integer \(d\) and a non-negative integer \(m\), return
trueand two non-negative integers \(x\) and \(y\), such that \(x^2+y^2d = m\), if such a solution exists. If such a solution does not exists only the valuefalseis returned. If the factorization of \(m\) is known, it may be supplied as the value of the parameterFactorizationto speed up the computation.
- Example: Norm Equation (ex-a39523)
> d := 957440000095744000002277749760; > m := 5102197760510219776012138128480644; > time NormEquation(d, m); true 98 73 Time: 2.990 > time f := Factorization(m); Time: 4.670 > f; [ <2, 2>, <19, 1>, <67134181059344997052791291164219, 1> ] > time NormEquation(d, m: Factorization := f); true 98 73 Time: 0.420