maths.tonelli_shanks¶
Tonelli-Shanks algorithm for modular square roots.
Given an odd prime modulus prime and an integer residue, find an
integer root such that root ** 2 ≡ residue (mod prime), or report that
no square root exists.
The algorithm is efficient when prime ≡ 3 (mod 4) (a single
exponentiation) and uses the full Tonelli-Shanks procedure for
prime ≡ 1 (mod 4).
https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm
Functions¶
|
Compute the Legendre symbol (residue / prime). |
|
Return a modular square root of |
Module Contents¶
- maths.tonelli_shanks.legendre_symbol(residue: int, prime: int) int¶
Compute the Legendre symbol (residue / prime).
Returns 1 if residue is a quadratic residue modulo prime (and residue is not divisible by prime), -1 if it is a non-residue, and 0 if residue ≡ 0 (mod prime).
>>> legendre_symbol(2, 7) 1 >>> legendre_symbol(3, 7) -1 >>> legendre_symbol(14, 7) 0 >>> legendre_symbol(5, 11) 1
- maths.tonelli_shanks.tonelli_shanks(residue: int, prime: int) int¶
Return a modular square root of
residuemodulo odd primeprime.If both roots exist, the smaller non-negative representative is returned. Raises ValueError when
residueis not a quadratic residue, or whenprimeis not a valid odd prime modulus for this routine.>>> tonelli_shanks(5, 41) 13 >>> pow(13, 2, 41) 5 >>> tonelli_shanks(2, 7) 3 >>> pow(3, 2, 7) 2 >>> tonelli_shanks(10, 13) 6 >>> tonelli_shanks(0, 11) 0 >>> tonelli_shanks(8, 17) 5 >>> pow(5, 2, 17) 8 >>> tonelli_shanks(3, 7) Traceback (most recent call last): ... ValueError: 3 is not a quadratic residue modulo 7 >>> tonelli_shanks(5, 4) Traceback (most recent call last): ... ValueError: prime must be an odd prime >>> tonelli_shanks(5, 1) Traceback (most recent call last): ... ValueError: prime must be an odd prime