code: function bnpInvDigit() {
    var this_array = this.array;
    if(this.t < 1) return 0;
    var x = this_array[0];
    if((x&1) == 0) return 0;
    var y = x&3;		// y == 1/x mod 2^2
    y = (y*(2-(x&0xf)*y))&0xf;	// y == 1/x mod 2^4
    y = (y*(2-(x&0xff)*y))&0xff;	// y == 1/x mod 2^8
    y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;	// y == 1/x mod 2^16
    // last step - calculate inverse mod DV directly;
    // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
    y = (y*(2-x*y%BI_DV))%BI_DV;		// y == 1/x mod 2^dbits
    // we really want the negative inverse, and -DV < y < DV
    return (y>0)?BI_DV-y:-y;
  }
docs: (protected) return "-1/this % 2^DB"; useful for Mont. reduction justification: xy == 1 (mod m) xy =  1+km xy(2-xy) = (1+km)(1-km) x[y(2-xy)] = 1-k^2m^2 x[y(2-xy)] == 1 (mod m^2) if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 should reduce x and y(2-xy) by m^2 at each step to keep size bounded. JS multiply "overflows" differently from C/C++, so care is needed here.