RootMod( n, m )
RootMod( n, k, m )
In the first form RootMod computes a square root of the integer n
modulo the positive integer m, i.e., an integer r such that r^2 = n
mod m. If no such root exists RootMod returns false.
A root of n exists only if Legendre(n,m) = 1 (see Legendre).
If m has k different prime factors then there are 2^k different
roots of n mod m. It is unspecified which one RootMod returns.
You can, however, use RootsUnityMod (see RootsUnityMod) to compute
the full set of roots.
In the second form RootMod computes a kth root of the integer n
modulo the positive integer m, i.e., an integer r such that r^k = n
mod m. If no such root exists RootMod returns false.
In the current implementation k must be a prime.
RootMod is efficient even for large values of m, actually most time
is usually spent factoring m (see FactorsInt).
gap> RootMod( 64, 1009 );
1001 # note 'RootMod' does not return 8 in this case but -8
gap> RootMod( 64, 3, 1009 );
518
gap> RootMod( 64, 5, 1009 );
656
gap> List( RootMod( 64, 1009 ) * RootsUnityMod( 1009 ),
> x -> x mod 1009 );
[ 1001, 8 ] # set of all square roots of 64 mod 1009
GAP 3.4.4