/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.math.BigInteger-ext"]){
dojo._hasResource["dojox.math.BigInteger-ext"]=true;
dojo.provide("dojox.math.BigInteger-ext");
dojo.experimental("dojox.math.BigInteger-ext");
dojo.require("dojox.math.BigInteger");
(function(){
var _1=dojox.math.BigInteger,_2=_1._nbi,_3=_1._nbv,_4=_1._nbits,_5=_1._Montgomery;
function _6(){
var r=_2();
this._copyTo(r);
return r;
};
function _7(){
if(this.s<0){
if(this.t==1){
return this[0]-this._DV;
}else{
if(this.t==0){
return -1;
}
}
}else{
if(this.t==1){
return this[0];
}else{
if(this.t==0){
return 0;
}
}
}
return ((this[1]&((1<<(32-this._DB))-1))<<this._DB)|this[0];
};
function _8(){
return (this.t==0)?this.s:(this[0]<<24)>>24;
};
function _9(){
return (this.t==0)?this.s:(this[0]<<16)>>16;
};
function _a(r){
return Math.floor(Math.LN2*this._DB/Math.log(r));
};
function _b(){
if(this.s<0){
return -1;
}else{
if(this.t<=0||(this.t==1&&this[0]<=0)){
return 0;
}else{
return 1;
}
}
};
function _c(b){
if(b==null){
b=10;
}
if(this.signum()==0||b<2||b>36){
return "0";
}
var cs=this._chunkSize(b);
var a=Math.pow(b,cs);
var d=_3(a),y=_2(),z=_2(),r="";
this._divRemTo(d,y,z);
while(y.signum()>0){
r=(a+z.intValue()).toString(b).substr(1)+r;
y._divRemTo(d,y,z);
}
return z.intValue().toString(b)+r;
};
function _d(s,b){
this._fromInt(0);
if(b==null){
b=10;
}
var cs=this._chunkSize(b);
var d=Math.pow(b,cs),mi=false,j=0,w=0;
for(var i=0;i<s.length;++i){
var x=intAt(s,i);
if(x<0){
if(s.charAt(i)=="-"&&this.signum()==0){
mi=true;
}
continue;
}
w=b*w+x;
if(++j>=cs){
this._dMultiply(d);
this._dAddOffset(w,0);
j=0;
w=0;
}
}
if(j>0){
this._dMultiply(Math.pow(b,j));
this._dAddOffset(w,0);
}
if(mi){
_1.ZERO._subTo(this,this);
}
};
function _e(a,b,c){
if("number"==typeof b){
if(a<2){
this._fromInt(1);
}else{
this._fromNumber(a,c);
if(!this.testBit(a-1)){
this._bitwiseTo(_1.ONE.shiftLeft(a-1),_f,this);
}
if(this._isEven()){
this._dAddOffset(1,0);
}
while(!this.isProbablePrime(b)){
this._dAddOffset(2,0);
if(this.bitLength()>a){
this._subTo(_1.ONE.shiftLeft(a-1),this);
}
}
}
}else{
var x=[],t=a&7;
x.length=(a>>3)+1;
b.nextBytes(x);
if(t>0){
x[0]&=((1<<t)-1);
}else{
x[0]=0;
}
this._fromString(x,256);
}
};
function _10(){
var i=this.t,r=[];
r[0]=this.s;
var p=this._DB-(i*this._DB)%8,d,k=0;
if(i-->0){
if(p<this._DB&&(d=this[i]>>p)!=(this.s&this._DM)>>p){
r[k++]=d|(this.s<<(this._DB-p));
}
while(i>=0){
if(p<8){
d=(this[i]&((1<<p)-1))<<(8-p);
d|=this[--i]>>(p+=this._DB-8);
}else{
d=(this[i]>>(p-=8))&255;
if(p<=0){
p+=this._DB;
--i;
}
}
if((d&128)!=0){
d|=-256;
}
if(k==0&&(this.s&128)!=(d&128)){
++k;
}
if(k>0||d!=this.s){
r[k++]=d;
}
}
}
return r;
};
function _11(a){
return (this.compareTo(a)==0);
};
function _12(a){
return (this.compareTo(a)<0)?this:a;
};
function _13(a){
return (this.compareTo(a)>0)?this:a;
};
function _14(a,op,r){
var i,f,m=Math.min(a.t,this.t);
for(i=0;i<m;++i){
r[i]=op(this[i],a[i]);
}
if(a.t<this.t){
f=a.s&this._DM;
for(i=m;i<this.t;++i){
r[i]=op(this[i],f);
}
r.t=this.t;
}else{
f=this.s&this._DM;
for(i=m;i<a.t;++i){
r[i]=op(f,a[i]);
}
r.t=a.t;
}
r.s=op(this.s,a.s);
r._clamp();
};
function _15(x,y){
return x&y;
};
function _16(a){
var r=_2();
this._bitwiseTo(a,_15,r);
return r;
};
function _f(x,y){
return x|y;
};
function _17(a){
var r=_2();
this._bitwiseTo(a,_f,r);
return r;
};
function _18(x,y){
return x^y;
};
function _19(a){
var r=_2();
this._bitwiseTo(a,_18,r);
return r;
};
function _1a(x,y){
return x&~y;
};
function _1b(a){
var r=_2();
this._bitwiseTo(a,_1a,r);
return r;
};
function _1c(){
var r=_2();
for(var i=0;i<this.t;++i){
r[i]=this._DM&~this[i];
}
r.t=this.t;
r.s=~this.s;
return r;
};
function _1d(n){
var r=_2();
if(n<0){
this._rShiftTo(-n,r);
}else{
this._lShiftTo(n,r);
}
return r;
};
function _1e(n){
var r=_2();
if(n<0){
this._lShiftTo(-n,r);
}else{
this._rShiftTo(n,r);
}
return r;
};
function _1f(x){
if(x==0){
return -1;
}
var r=0;
if((x&65535)==0){
x>>=16;
r+=16;
}
if((x&255)==0){
x>>=8;
r+=8;
}
if((x&15)==0){
x>>=4;
r+=4;
}
if((x&3)==0){
x>>=2;
r+=2;
}
if((x&1)==0){
++r;
}
return r;
};
function _20(){
for(var i=0;i<this.t;++i){
if(this[i]!=0){
return i*this._DB+_1f(this[i]);
}
}
if(this.s<0){
return this.t*this._DB;
}
return -1;
};
function _21(x){
var r=0;
while(x!=0){
x&=x-1;
++r;
}
return r;
};
function _22(){
var r=0,x=this.s&this._DM;
for(var i=0;i<this.t;++i){
r+=_21(this[i]^x);
}
return r;
};
function _23(n){
var j=Math.floor(n/this._DB);
if(j>=this.t){
return (this.s!=0);
}
return ((this[j]&(1<<(n%this._DB)))!=0);
};
function _24(n,op){
var r=_1.ONE.shiftLeft(n);
this._bitwiseTo(r,op,r);
return r;
};
function _25(n){
return this._changeBit(n,_f);
};
function _26(n){
return this._changeBit(n,_1a);
};
function _27(n){
return this._changeBit(n,_18);
};
function _28(a,r){
var i=0,c=0,m=Math.min(a.t,this.t);
while(i<m){
c+=this[i]+a[i];
r[i++]=c&this._DM;
c>>=this._DB;
}
if(a.t<this.t){
c+=a.s;
while(i<this.t){
c+=this[i];
r[i++]=c&this._DM;
c>>=this._DB;
}
c+=this.s;
}else{
c+=this.s;
while(i<a.t){
c+=a[i];
r[i++]=c&this._DM;
c>>=this._DB;
}
c+=a.s;
}
r.s=(c<0)?-1:0;
if(c>0){
r[i++]=c;
}else{
if(c<-1){
r[i++]=this._DV+c;
}
}
r.t=i;
r._clamp();
};
function _29(a){
var r=_2();
this._addTo(a,r);
return r;
};
function _2a(a){
var r=_2();
this._subTo(a,r);
return r;
};
function _2b(a){
var r=_2();
this._multiplyTo(a,r);
return r;
};
function _2c(a){
var r=_2();
this._divRemTo(a,r,null);
return r;
};
function _2d(a){
var r=_2();
this._divRemTo(a,null,r);
return r;
};
function _2e(a){
var q=_2(),r=_2();
this._divRemTo(a,q,r);
return [q,r];
};
function _2f(n){
this[this.t]=this.am(0,n-1,this,0,0,this.t);
++this.t;
this._clamp();
};
function _30(n,w){
while(this.t<=w){
this[this.t++]=0;
}
this[w]+=n;
while(this[w]>=this._DV){
this[w]-=this._DV;
if(++w>=this.t){
this[this.t++]=0;
}
++this[w];
}
};
function _31(){
};
function _32(x){
return x;
};
function _33(x,y,r){
x._multiplyTo(y,r);
};
function _34(x,r){
x._squareTo(r);
};
_31.prototype.convert=_32;
_31.prototype.revert=_32;
_31.prototype.mulTo=_33;
_31.prototype.sqrTo=_34;
function _35(e){
return this._exp(e,new _31());
};
function _36(a,n,r){
var i=Math.min(this.t+a.t,n);
r.s=0;
r.t=i;
while(i>0){
r[--i]=0;
}
var j;
for(j=r.t-this.t;i<j;++i){
r[i+this.t]=this.am(0,a[i],r,i,0,this.t);
}
for(j=Math.min(a.t,n);i<j;++i){
this.am(0,a[i],r,i,0,n-i);
}
r._clamp();
};
function _37(a,n,r){
--n;
var i=r.t=this.t+a.t-n;
r.s=0;
while(--i>=0){
r[i]=0;
}
for(i=Math.max(n-this.t,0);i<a.t;++i){
r[this.t+i-n]=this.am(n-i,a[i],r,0,0,this.t+i-n);
}
r._clamp();
r._drShiftTo(1,r);
};
function _38(m){
this.r2=_2();
this.q3=_2();
_1.ONE._dlShiftTo(2*m.t,this.r2);
this.mu=this.r2.divide(m);
this.m=m;
};
function _39(x){
if(x.s<0||x.t>2*this.m.t){
return x.mod(this.m);
}else{
if(x.compareTo(this.m)<0){
return x;
}else{
var r=_2();
x._copyTo(r);
this.reduce(r);
return r;
}
}
};
function _3a(x){
return x;
};
function _3b(x){
x._drShiftTo(this.m.t-1,this.r2);
if(x.t>this.m.t+1){
x.t=this.m.t+1;
x._clamp();
}
this.mu._multiplyUpperTo(this.r2,this.m.t+1,this.q3);
this.m._multiplyLowerTo(this.q3,this.m.t+1,this.r2);
while(x.compareTo(this.r2)<0){
x._dAddOffset(1,this.m.t+1);
}
x._subTo(this.r2,x);
while(x.compareTo(this.m)>=0){
x._subTo(this.m,x);
}
};
function _3c(x,r){
x._squareTo(r);
this.reduce(r);
};
function _3d(x,y,r){
x._multiplyTo(y,r);
this.reduce(r);
};
_38.prototype.convert=_39;
_38.prototype.revert=_3a;
_38.prototype.reduce=_3b;
_38.prototype.mulTo=_3d;
_38.prototype.sqrTo=_3c;
function _3e(e,m){
var i=e.bitLength(),k,r=_3(1),z;
if(i<=0){
return r;
}else{
if(i<18){
k=1;
}else{
if(i<48){
k=3;
}else{
if(i<144){
k=4;
}else{
if(i<768){
k=5;
}else{
k=6;
}
}
}
}
}
if(i<8){
z=new Classic(m);
}else{
if(m._isEven()){
z=new _38(m);
}else{
z=new _5(m);
}
}
var g=[],n=3,k1=k-1,km=(1<<k)-1;
g[1]=z.convert(this);
if(k>1){
var g2=_2();
z.sqrTo(g[1],g2);
while(n<=km){
g[n]=_2();
z.mulTo(g2,g[n-2],g[n]);
n+=2;
}
}
var j=e.t-1,w,is1=true,r2=_2(),t;
i=_4(e[j])-1;
while(j>=0){
if(i>=k1){
w=(e[j]>>(i-k1))&km;
}else{
w=(e[j]&((1<<(i+1))-1))<<(k1-i);
if(j>0){
w|=e[j-1]>>(this._DB+i-k1);
}
}
n=k;
while((w&1)==0){
w>>=1;
--n;
}
if((i-=n)<0){
i+=this._DB;
--j;
}
if(is1){
g[w]._copyTo(r);
is1=false;
}else{
while(n>1){
z.sqrTo(r,r2);
z.sqrTo(r2,r);
n-=2;
}
if(n>0){
z.sqrTo(r,r2);
}else{
t=r;
r=r2;
r2=t;
}
z.mulTo(r2,g[w],r);
}
while(j>=0&&(e[j]&(1<<i))==0){
z.sqrTo(r,r2);
t=r;
r=r2;
r2=t;
if(--i<0){
i=this._DB-1;
--j;
}
}
}
return z.revert(r);
};
function _3f(a){
var x=(this.s<0)?this.negate():this.clone();
var y=(a.s<0)?a.negate():a.clone();
if(x.compareTo(y)<0){
var t=x;
x=y;
y=t;
}
var i=x.getLowestSetBit(),g=y.getLowestSetBit();
if(g<0){
return x;
}
if(i<g){
g=i;
}
if(g>0){
x._rShiftTo(g,x);
y._rShiftTo(g,y);
}
while(x.signum()>0){
if((i=x.getLowestSetBit())>0){
x._rShiftTo(i,x);
}
if((i=y.getLowestSetBit())>0){
y._rShiftTo(i,y);
}
if(x.compareTo(y)>=0){
x._subTo(y,x);
x._rShiftTo(1,x);
}else{
y._subTo(x,y);
y._rShiftTo(1,y);
}
}
if(g>0){
y._lShiftTo(g,y);
}
return y;
};
function _40(n){
if(n<=0){
return 0;
}
var d=this._DV%n,r=(this.s<0)?n-1:0;
if(this.t>0){
if(d==0){
r=this[0]%n;
}else{
for(var i=this.t-1;i>=0;--i){
r=(d*r+this[i])%n;
}
}
}
return r;
};
function _41(m){
var ac=m._isEven();
if((this._isEven()&&ac)||m.signum()==0){
return _1.ZERO;
}
var u=m.clone(),v=this.clone();
var a=_3(1),b=_3(0),c=_3(0),d=_3(1);
while(u.signum()!=0){
while(u._isEven()){
u._rShiftTo(1,u);
if(ac){
if(!a._isEven()||!b._isEven()){
a._addTo(this,a);
b._subTo(m,b);
}
a._rShiftTo(1,a);
}else{
if(!b._isEven()){
b._subTo(m,b);
}
}
b._rShiftTo(1,b);
}
while(v._isEven()){
v._rShiftTo(1,v);
if(ac){
if(!c._isEven()||!d._isEven()){
c._addTo(this,c);
d._subTo(m,d);
}
c._rShiftTo(1,c);
}else{
if(!d._isEven()){
d._subTo(m,d);
}
}
d._rShiftTo(1,d);
}
if(u.compareTo(v)>=0){
u._subTo(v,u);
if(ac){
a._subTo(c,a);
}
b._subTo(d,b);
}else{
v._subTo(u,v);
if(ac){
c._subTo(a,c);
}
d._subTo(b,d);
}
}
if(v.compareTo(_1.ONE)!=0){
return _1.ZERO;
}
if(d.compareTo(m)>=0){
return d.subtract(m);
}
if(d.signum()<0){
d._addTo(m,d);
}else{
return d;
}
if(d.signum()<0){
return d.add(m);
}else{
return d;
}
};
var _42=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];
var _43=(1<<26)/_42[_42.length-1];
function _44(t){
var i,x=this.abs();
if(x.t==1&&x[0]<=_42[_42.length-1]){
for(i=0;i<_42.length;++i){
if(x[0]==_42[i]){
return true;
}
}
return false;
}
if(x._isEven()){
return false;
}
i=1;
while(i<_42.length){
var m=_42[i],j=i+1;
while(j<_42.length&&m<_43){
m*=_42[j++];
}
m=x._modInt(m);
while(i<j){
if(m%_42[i++]==0){
return false;
}
}
}
return x._millerRabin(t);
};
function _45(t){
var n1=this.subtract(_1.ONE);
var k=n1.getLowestSetBit();
if(k<=0){
return false;
}
var r=n1.shiftRight(k);
t=(t+1)>>1;
if(t>_42.length){
t=_42.length;
}
var a=_2();
for(var i=0;i<t;++i){
a._fromInt(_42[i]);
var y=a.modPow(r,this);
if(y.compareTo(_1.ONE)!=0&&y.compareTo(n1)!=0){
var j=1;
while(j++<k&&y.compareTo(n1)!=0){
y=y.modPowInt(2,this);
if(y.compareTo(_1.ONE)==0){
return false;
}
}
if(y.compareTo(n1)!=0){
return false;
}
}
}
return true;
};
dojo.extend(_1,{_chunkSize:_a,_toRadix:_c,_fromRadix:_d,_fromNumber:_e,_bitwiseTo:_14,_changeBit:_24,_addTo:_28,_dMultiply:_2f,_dAddOffset:_30,_multiplyLowerTo:_36,_multiplyUpperTo:_37,_modInt:_40,_millerRabin:_45,clone:_6,intValue:_7,byteValue:_8,shortValue:_9,signum:_b,toByteArray:_10,equals:_11,min:_12,max:_13,and:_16,or:_17,xor:_19,andNot:_1b,not:_1c,shiftLeft:_1d,shiftRight:_1e,getLowestSetBit:_20,bitCount:_22,testBit:_23,setBit:_25,clearBit:_26,flipBit:_27,add:_29,subtract:_2a,multiply:_2b,divide:_2c,remainder:_2d,divideAndRemainder:_2e,modPow:_3e,modInverse:_41,pow:_35,gcd:_3f,isProbablePrime:_44});
})();
}
