xval = 1;
  public BigInteger gcd(BigInteger y)  {    int xval = ival;    int yval = y.ival;    if (words == null)      {	if (xval == 0)	  return abs(y);	if (y.words == null	    && xval != Integer.MIN_VALUE && yval != Integer.MIN_VALUE)	  {	    if (xval < 0)	      xval = -xval;	    if (yval < 0)	      yval = -yval;	    return valueOf(gcd(xval, yval));	  }	xval = 1;      }    if (y.words == null)      {	if (yval == 0)	  return abs(this);	yval = 1;      }    int len = (xval > yval ? xval : yval) + 1;    int[] xwords = new int[len];    int[] ywords = new int[len];    getAbsolute(xwords);    y.getAbsolute(ywords);    len = MPN.gcd(xwords, ywords, len);    BigInteger result = new BigInteger(0);    result.ival = len;    result.words = xwords;    return result.canonicalize();  }