Bill Allombert on Thu, 30 May 2002 16:38:07 +0200

 Re: detecing non quadratic residue in sqrt/trapping errors

```On Thu, May 30, 2002 at 12:32:10PM +0300, Tuukka Toivonen wrote:
> I have a line in my Pari function similar to
> f(c) =
> {
> 	x = sqrt(c);
> 	... something more ...
> }
>
> c can be, for example, an integer modulo p. It either has or has not the
> solution. If there isn't a solution, pari says "non-quadratic residue in
> gsqrt" and halts the function. I want to have instead a test, so that if
> the square root doesn't exist, the function does something else instead of
> halting. So, effectively,
> 	x = sqrt(c)
> 	if(error happened,
> 		do something else,
> 		else no error
> 	);

For this particular case, you can use issquare().

> Is it possible to trap errors in Pari somehow?

Yes, with the trap(,,) function, but it is an experimental feature.

> I'd like to let the function handle also reals and complex numbers, so I'd
> like to assume as little as possible about the variable type.
>
> I'm writing a function to compute square roots from a number of the form
> 	Mod(a,p) + Mod(b,p)*I

This is already implemented internally in factorff():
You can do something like
mysqrt(a,b,p)=
{
local(F);
if (p%4==1,return(sqrt((a+sqrt(Mod(-1,p))*b)*Mod(1,p))));
F=factorff('x^2-(a+'Z*b),p,'Z^2+1)[,1];
if(length(F)==1,error("not a square"),
subst(subst(lift(lift(F[1])),'x,0),'Z,I))
}

Cheers,

Bill.
```