nl_tokens: ( 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 .
pl_tokens: function bnpInvDigit ( ) { var this_array = this . <mask> ; 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 ; }