Bill Allombert on Thu, 25 Sep 2003 17:38:42 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

sqrtint(-N) is broken


Hello PARI-dev,

It's look like sqrtint(-N) is broken.

? sqrtint(-18891990361510463883)
%1 = -180277404801467*I
? sqrtint(18891990361510463883)
%2 = 4346491730

The GMP kernel does not have this bug.

I would prefer sqrtint to fail on negative integers by the way. The
current behavior just hide wrong input for a not really meaningful
output, like

? sqrtint(-3)
%1 = I

Here a not very good patch.

--- ../src/pari/src/kernel/none/mp.c    Fri Jul  4 23:26:55 2003
+++ src/kernel/none/mp.c        Tue Sep 23 17:56:50 2003
@@ -2221,7 +2221,7 @@
   x = shifti(x, (l - s)*(BITS_IN_LONG/2));
   do
   { /* one or two iterations should do the trick */
-    z = shifti(addii(x,divii(a,x)), -1);
+    z = shifti(addii(x,divii(absi(a),x)), -1);
     y = x; x = z;
   }
   while (cmpii(x,y) < 0);

Cheers,
Bill.