function BarrettMu(m){
this.modulus=biCopy(m);
this.k=biHighIndex(this.modulus)+1;
var _2=new BigInt();
_2.digits[2*this.k]=1;
this.mu=biDivide(_2,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(x){
var q1=biDivideByRadixPower(x,this.k-1);
var q2=biMultiply(q1,this.mu);
var q3=biDivideByRadixPower(q2,this.k+1);
var r1=biModuloByRadixPower(x,this.k+1);
var _8=biMultiply(q3,this.modulus);
var r2=biModuloByRadixPower(_8,this.k+1);
var r=biSubtract(r1,r2);
if(r.isNeg){
r=biAdd(r,this.bkplus1);
}
var _b=biCompare(r,this.modulus)>=0;
while(_b){
r=biSubtract(r,this.modulus);
_b=biCompare(r,this.modulus)>=0;
}
return r;
}
function BarrettMu_multiplyMod(x,y){
var xy=biMultiply(x,y);
return this.modulo(xy);
}
function BarrettMu_powMod(x,y){
var _11=new BigInt();
_11.digits[0]=1;
var a=x;
var k=y;
while(true){
if((k.digits[0]&1)!=0){
_11=this.multiplyMod(_11,a);
}
k=biShiftRight(k,1);
if(k.digits[0]==0&&biHighIndex(k)==0){
break;
}
a=this.multiplyMod(a,a);
}
return _11;
}


