deps/v8/benchmarks/crypto.js
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;
}
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;
}
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 ; }
(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.
( 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 .