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