bug-gmp
[Top][All Lists]
Advanced

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

Re: SNFS and gmp bug


From: Torbjorn Granlund
Subject: Re: SNFS and gmp bug
Date: 27 Mar 2001 01:42:35 +0200
User-agent: Gnus/5.0807 (Gnus v5.8.7) Emacs/20.6

Jens Franke <address@hidden> writes:

  $ cat x.c
  #include <stdio.h>
  #include <gmp.h>

  main()
  {
    mpz_t x,N,rr,y;

    mpz_init(x);
    mpz_init(N);
    mpz_init(rr);
    mpz_init(y);

    mpz_inp_str(x,stdin,10);
    mpz_inp_str(N,stdin,10);
    mpz_gcdext(rr,y,NULL,x,N);
  }
  $ gcc -o x x.c -lgmp
  $ cat bugfile
  
1376177246773041037567202945557067112486428557423284805151165973753892404485721574866941
  
1806071196721149809296924480256219259370353533364363232400360209368572527961593852120901376184060934969941
  $ x < bugfile
  Abgebrochen
  $ gcc -v
  Reading specs from /usr/lib/gcc-lib/i486-linux/egcs-2.91.66/specs
  gcc version egcs-2.91.66 19990314 (egcs-1.1.2 release)


This is indeed a real bug.  I am very surprised it has remained
unnoticed for such a long time.  I believed our random number testing
would have cought it by now.  Your operands must be very special in
some way.

2001-03-26  Torbjorn Granlund  <address@hidden>

        * mpn/generic/gcdext.c: Handle carry overflow after m*n multiply code
        in both arms.  Partially combine multiply arms.

Index: gcdext.c
===================================================================
RCS file: /home/cvsfiles/gmp/mpn/generic/gcdext.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -c -1 -r1.19 -r1.20
*** gcdext.c    2001/01/02 08:22:24     1.19
--- gcdext.c    2001/03/26 18:58:42     1.20
***************
*** 442,450 ****
                  }
-               if (qh != 0)
-                 {
-                   mp_limb_t cy;
-                   cy = mpn_add_n (tp + qsize, tp + qsize, s1p, ssize);
-                   if (cy != 0)
-                     abort ();
-                 }
              }
--- 442,443 ----
***************
*** 459,470 ****
                  }
!               if (qh != 0)
                  {
!                   mp_limb_t cy;
!                   cy = mpn_add_n (tp + qsize, tp + qsize, s1p, ssize);
!                   if (cy != 0)
!                     {
!                       tp[qsize + ssize] = cy;
!                       s1p[qsize + ssize] = 0;
!                       ssize++;
!                     }
                  }
--- 452,463 ----
                  }
!             }
!           if (qh != 0)
!             {
!               mp_limb_t cy;
!               cy = mpn_add_n (tp + qsize, tp + qsize, s1p, ssize);
!               if (cy != 0)
                  {
!                   tp[qsize + ssize] = cy;
!                   s1p[qsize + ssize] = 0;
!                   ssize++;
                  }


-- 
Torbjörn



reply via email to

[Prev in Thread] Current Thread [Next in Thread]