Use the ?? operator to see the algorithm:
sage: a=GF(next_prime(10^6)).random_element()^2; sage: a.sqrt?? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in method sqrt of sage.rings.integer_mod.IntegerMod_int64 object at 0x99055a4> Namespace: Interactive Source: def sqrt(self, extend=True, all=False): r""" Returns square root or square roots of self modulo n. INPUT: extend -- bool (default: True); if True, return a square root in an extension ring, if necessary. Otherwise, raise a ValueError if the square is not in the base ring. all -- bool (default: False); if True, return *all* square roots of self, instead of just one. ALGORITHM: Calculates the square roots mod $p$ for each of the primes $p$ dividing the order of the ring, then lifts them p-adically and uses the CRT to find a square root mod $n$. See also \code{square_root_mod_prime_power} and \code{square_root_mod_prime} (in this module) for more algorithmic details. EXAMPLES: sage: mod(-1, 17).sqrt() 4 sage: mod(5, 389).sqrt() 86 sage: mod(7, 18).sqrt() 5 sage: a = mod(14, 5^60).sqrt() sage: a*a 14 sage: mod(15, 389).sqrt(extend=False) Traceback (most recent call last): ... ValueError: self must be a square sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) 9 sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) 25 sage: a = Mod(3,5); a 3 sage: x = Mod(-1, 360) sage: x.sqrt(extend=False) Traceback (most recent call last): ... ValueError: self must be a square sage: y = x.sqrt(); y sqrt359 sage: y.parent() Univariate Quotient Polynomial Ring in sqrt359 over Ring of integers modulo 360 with modulus x^2 + 1 sage: y^2 359 We compute all square roots in several cases: sage: R = Integers(5*2^3*3^2); R Ring of integers modulo 360 sage: R(40).sqrt(all=True) [20, 160, 200, 340] sage: [x for x in R if x^2 == 40] # Brute force verification [20, 160, 200, 340] sage: R(1).sqrt(all=True) [1, 19, 71, 89, 91, 109, 161, 179, 181, 199, 251, 269, 271, 289, 341, 359] sage: R(0).sqrt(all=True) [0, 60, 120, 180, 240, 300] sage: R = Integers(5*13^3*37); R Ring of integers modulo 406445 sage: v = R(-1).sqrt(all=True); v [78853, 111808, 160142, 193097, 213348, 246303, 294637, 327592] sage: [x^2 for x in v] [406444, 406444, 406444, 406444, 406444, 406444, 406444, 406444] sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) (13, 13, 104) sage: all([x^2==169 for x in v]) True Modulo a power of 2: sage: R = Integers(2^7); R Ring of integers modulo 128 sage: a = R(17) sage: a.sqrt() 23 sage: a.sqrt(all=True) [23, 41, 87, 105] sage: [x for x in R if x^2==17] [23, 41, 87, 105] """ if self.is_one(): if all: return list(self.parent().square_roots_of_one()) else: return self if not self.is_square_c(): if extend: and so on! John On 09/11/2007, Steffen <[EMAIL PROTECTED]> wrote: > > Hi, I need to find square roots in GF(prime). I did it like this: > > y = sqrt(GF(prime)(ySquare)) > > So far I am not quite happy with the calculation periods and I would > like to know which algorithm is used. In my case is prime % 4 == 1, > which is the hardest case to find the square root mod p. I am sage > newbie and probably its again only a command that I cant find. I tried > sqrt? and similar things, but only got the information that sqrt is a > symbolic function. Could somebody tell me which algo is implemented or > better how to find the implemented algo. > > Cheers, Steffen > > > > > -- John Cremona --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/ -~----------~----~----~----~------~----~------~--~---