function BarrettMu(b){this.modulus=biCopy(b);this.k=biHighIndex(this.modulus)+1;var a=new BigInt;a.digits[2*this.k]=1;this.mu=biDivide(a,this.modulus);this.bkplus1=new BigInt;this.bkplus1.digits[this.k+1]=1;this.modulo=BarrettMu_modulo;this.multiplyMod=BarrettMu_multiplyMod;this.powMod=BarrettMu_powMod}function BarrettMu_modulo(c){var e=biDivideByRadixPower(c,this.k-1),f=biMultiply(e,this.mu),g=biDivideByRadixPower(f,this.k+1),h=biModuloByRadixPower(c,this.k+1),d=biMultiply(g,this.modulus),i=biModuloByRadixPower(d,this.k+1),a=biSubtract(h,i);if(a.isNeg)a=biAdd(a,this.bkplus1);var b=biCompare(a,this.modulus)>=0;while(b){a=biSubtract(a,this.modulus);b=biCompare(a,this.modulus)>=0}return a}function BarrettMu_multiplyMod(b,c){var a=biMultiply(b,c);return this.modulo(a)}function BarrettMu_powMod(d,e){var b=new BigInt;b.digits[0]=1;var c=d,a=e;while(true){if((a.digits[0]&1)!=0)b=this.multiplyMod(b,c);a=biShiftRight(a,1);if(a.digits[0]==0&&biHighIndex(a)==0)break;c=this.multiplyMod(c,c)}return b}
