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