root / trunk / web / dojo / dojox / math / BigInteger-ext.js
History | View | Annotate | Download (11.8 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
| 3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
| 4 | see: http://dojotoolkit.org/license for details
|
||
| 5 | */
|
||
| 6 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.math.BigInteger-ext"]){ |
||
| 9 | dojo._hasResource["dojox.math.BigInteger-ext"]=true; |
||
| 10 | dojo.provide("dojox.math.BigInteger-ext");
|
||
| 11 | dojo.experimental("dojox.math.BigInteger-ext");
|
||
| 12 | dojo.require("dojox.math.BigInteger");
|
||
| 13 | (function(){
|
||
| 14 | var _1=dojox.math.BigInteger,_2=_1._nbi,_3=_1._nbv,_4=_1._nbits,_5=_1._Montgomery;
|
||
| 15 | function _6(){ |
||
| 16 | var r=_2();
|
||
| 17 | this._copyTo(r);
|
||
| 18 | return r;
|
||
| 19 | }; |
||
| 20 | function _7(){ |
||
| 21 | if(this.s<0){ |
||
| 22 | if(this.t==1){ |
||
| 23 | return this[0]-this._DV; |
||
| 24 | }else{
|
||
| 25 | if(this.t==0){ |
||
| 26 | return -1; |
||
| 27 | } |
||
| 28 | } |
||
| 29 | }else{
|
||
| 30 | if(this.t==1){ |
||
| 31 | return this[0]; |
||
| 32 | }else{
|
||
| 33 | if(this.t==0){ |
||
| 34 | return 0; |
||
| 35 | } |
||
| 36 | } |
||
| 37 | } |
||
| 38 | return ((this[1]&((1<<(32-this._DB))-1))<<this._DB)|this[0]; |
||
| 39 | }; |
||
| 40 | function _8(){ |
||
| 41 | return (this.t==0)?this.s:(this[0]<<24)>>24; |
||
| 42 | }; |
||
| 43 | function _9(){ |
||
| 44 | return (this.t==0)?this.s:(this[0]<<16)>>16; |
||
| 45 | }; |
||
| 46 | function _a(r){ |
||
| 47 | return Math.floor(Math.LN2*this._DB/Math.log(r)); |
||
| 48 | }; |
||
| 49 | function _b(){ |
||
| 50 | if(this.s<0){ |
||
| 51 | return -1; |
||
| 52 | }else{
|
||
| 53 | if(this.t<=0||(this.t==1&&this[0]<=0)){ |
||
| 54 | return 0; |
||
| 55 | }else{
|
||
| 56 | return 1; |
||
| 57 | } |
||
| 58 | } |
||
| 59 | }; |
||
| 60 | function _c(b){ |
||
| 61 | if(b==null){ |
||
| 62 | b=10;
|
||
| 63 | } |
||
| 64 | if(this.signum()==0||b<2||b>36){ |
||
| 65 | return "0"; |
||
| 66 | } |
||
| 67 | var cs=this._chunkSize(b); |
||
| 68 | var a=Math.pow(b,cs);
|
||
| 69 | var d=_3(a),y=_2(),z=_2(),r=""; |
||
| 70 | this._divRemTo(d,y,z);
|
||
| 71 | while(y.signum()>0){ |
||
| 72 | r=(a+z.intValue()).toString(b).substr(1)+r;
|
||
| 73 | y._divRemTo(d,y,z); |
||
| 74 | } |
||
| 75 | return z.intValue().toString(b)+r;
|
||
| 76 | }; |
||
| 77 | function _d(s,b){ |
||
| 78 | this._fromInt(0); |
||
| 79 | if(b==null){ |
||
| 80 | b=10;
|
||
| 81 | } |
||
| 82 | var cs=this._chunkSize(b); |
||
| 83 | var d=Math.pow(b,cs),mi=false,j=0,w=0; |
||
| 84 | for(var i=0;i<s.length;++i){ |
||
| 85 | var x=intAt(s,i);
|
||
| 86 | if(x<0){ |
||
| 87 | if(s.charAt(i)=="-"&&this.signum()==0){ |
||
| 88 | mi=true;
|
||
| 89 | } |
||
| 90 | continue;
|
||
| 91 | } |
||
| 92 | w=b*w+x; |
||
| 93 | if(++j>=cs){
|
||
| 94 | this._dMultiply(d);
|
||
| 95 | this._dAddOffset(w,0); |
||
| 96 | j=0;
|
||
| 97 | w=0;
|
||
| 98 | } |
||
| 99 | } |
||
| 100 | if(j>0){ |
||
| 101 | this._dMultiply(Math.pow(b,j));
|
||
| 102 | this._dAddOffset(w,0); |
||
| 103 | } |
||
| 104 | if(mi){
|
||
| 105 | _1.ZERO._subTo(this,this); |
||
| 106 | } |
||
| 107 | }; |
||
| 108 | function _e(a,b,c){ |
||
| 109 | if("number"==typeof b){ |
||
| 110 | if(a<2){ |
||
| 111 | this._fromInt(1); |
||
| 112 | }else{
|
||
| 113 | this._fromNumber(a,c);
|
||
| 114 | if(!this.testBit(a-1)){ |
||
| 115 | this._bitwiseTo(_1.ONE.shiftLeft(a-1),_f,this); |
||
| 116 | } |
||
| 117 | if(this._isEven()){ |
||
| 118 | this._dAddOffset(1,0); |
||
| 119 | } |
||
| 120 | while(!this.isProbablePrime(b)){ |
||
| 121 | this._dAddOffset(2,0); |
||
| 122 | if(this.bitLength()>a){ |
||
| 123 | this._subTo(_1.ONE.shiftLeft(a-1),this); |
||
| 124 | } |
||
| 125 | } |
||
| 126 | } |
||
| 127 | }else{
|
||
| 128 | var x=[],t=a&7; |
||
| 129 | x.length=(a>>3)+1; |
||
| 130 | b.nextBytes(x); |
||
| 131 | if(t>0){ |
||
| 132 | x[0]&=((1<<t)-1); |
||
| 133 | }else{
|
||
| 134 | x[0]=0; |
||
| 135 | } |
||
| 136 | this._fromString(x,256); |
||
| 137 | } |
||
| 138 | }; |
||
| 139 | function _10(){ |
||
| 140 | var i=this.t,r=[]; |
||
| 141 | r[0]=this.s; |
||
| 142 | var p=this._DB-(i*this._DB)%8,d,k=0; |
||
| 143 | if(i-->0){ |
||
| 144 | if(p<this._DB&&(d=this[i]>>p)!=(this.s&this._DM)>>p){ |
||
| 145 | r[k++]=d|(this.s<<(this._DB-p)); |
||
| 146 | } |
||
| 147 | while(i>=0){ |
||
| 148 | if(p<8){ |
||
| 149 | d=(this[i]&((1<<p)-1))<<(8-p); |
||
| 150 | d|=this[--i]>>(p+=this._DB-8); |
||
| 151 | }else{
|
||
| 152 | d=(this[i]>>(p-=8))&255; |
||
| 153 | if(p<=0){ |
||
| 154 | p+=this._DB;
|
||
| 155 | --i; |
||
| 156 | } |
||
| 157 | } |
||
| 158 | if((d&128)!=0){ |
||
| 159 | d|=-256;
|
||
| 160 | } |
||
| 161 | if(k==0&&(this.s&128)!=(d&128)){ |
||
| 162 | ++k; |
||
| 163 | } |
||
| 164 | if(k>0||d!=this.s){ |
||
| 165 | r[k++]=d; |
||
| 166 | } |
||
| 167 | } |
||
| 168 | } |
||
| 169 | return r;
|
||
| 170 | }; |
||
| 171 | function _11(a){ |
||
| 172 | return (this.compareTo(a)==0); |
||
| 173 | }; |
||
| 174 | function _12(a){ |
||
| 175 | return (this.compareTo(a)<0)?this:a; |
||
| 176 | }; |
||
| 177 | function _13(a){ |
||
| 178 | return (this.compareTo(a)>0)?this:a; |
||
| 179 | }; |
||
| 180 | function _14(a,op,r){ |
||
| 181 | var i,f,m=Math.min(a.t,this.t); |
||
| 182 | for(i=0;i<m;++i){ |
||
| 183 | r[i]=op(this[i],a[i]);
|
||
| 184 | } |
||
| 185 | if(a.t<this.t){ |
||
| 186 | f=a.s&this._DM;
|
||
| 187 | for(i=m;i<this.t;++i){ |
||
| 188 | r[i]=op(this[i],f);
|
||
| 189 | } |
||
| 190 | r.t=this.t;
|
||
| 191 | }else{
|
||
| 192 | f=this.s&this._DM; |
||
| 193 | for(i=m;i<a.t;++i){
|
||
| 194 | r[i]=op(f,a[i]); |
||
| 195 | } |
||
| 196 | r.t=a.t; |
||
| 197 | } |
||
| 198 | r.s=op(this.s,a.s);
|
||
| 199 | r._clamp(); |
||
| 200 | }; |
||
| 201 | function _15(x,y){ |
||
| 202 | return x&y;
|
||
| 203 | }; |
||
| 204 | function _16(a){ |
||
| 205 | var r=_2();
|
||
| 206 | this._bitwiseTo(a,_15,r);
|
||
| 207 | return r;
|
||
| 208 | }; |
||
| 209 | function _f(x,y){ |
||
| 210 | return x|y;
|
||
| 211 | }; |
||
| 212 | function _17(a){ |
||
| 213 | var r=_2();
|
||
| 214 | this._bitwiseTo(a,_f,r);
|
||
| 215 | return r;
|
||
| 216 | }; |
||
| 217 | function _18(x,y){ |
||
| 218 | return x^y;
|
||
| 219 | }; |
||
| 220 | function _19(a){ |
||
| 221 | var r=_2();
|
||
| 222 | this._bitwiseTo(a,_18,r);
|
||
| 223 | return r;
|
||
| 224 | }; |
||
| 225 | function _1a(x,y){ |
||
| 226 | return x&~y;
|
||
| 227 | }; |
||
| 228 | function _1b(a){ |
||
| 229 | var r=_2();
|
||
| 230 | this._bitwiseTo(a,_1a,r);
|
||
| 231 | return r;
|
||
| 232 | }; |
||
| 233 | function _1c(){ |
||
| 234 | var r=_2();
|
||
| 235 | for(var i=0;i<this.t;++i){ |
||
| 236 | r[i]=this._DM&~this[i]; |
||
| 237 | } |
||
| 238 | r.t=this.t;
|
||
| 239 | r.s=~this.s;
|
||
| 240 | return r;
|
||
| 241 | }; |
||
| 242 | function _1d(n){ |
||
| 243 | var r=_2();
|
||
| 244 | if(n<0){ |
||
| 245 | this._rShiftTo(-n,r);
|
||
| 246 | }else{
|
||
| 247 | this._lShiftTo(n,r);
|
||
| 248 | } |
||
| 249 | return r;
|
||
| 250 | }; |
||
| 251 | function _1e(n){ |
||
| 252 | var r=_2();
|
||
| 253 | if(n<0){ |
||
| 254 | this._lShiftTo(-n,r);
|
||
| 255 | }else{
|
||
| 256 | this._rShiftTo(n,r);
|
||
| 257 | } |
||
| 258 | return r;
|
||
| 259 | }; |
||
| 260 | function _1f(x){ |
||
| 261 | if(x==0){ |
||
| 262 | return -1; |
||
| 263 | } |
||
| 264 | var r=0; |
||
| 265 | if((x&65535)==0){ |
||
| 266 | x>>=16;
|
||
| 267 | r+=16;
|
||
| 268 | } |
||
| 269 | if((x&255)==0){ |
||
| 270 | x>>=8;
|
||
| 271 | r+=8;
|
||
| 272 | } |
||
| 273 | if((x&15)==0){ |
||
| 274 | x>>=4;
|
||
| 275 | r+=4;
|
||
| 276 | } |
||
| 277 | if((x&3)==0){ |
||
| 278 | x>>=2;
|
||
| 279 | r+=2;
|
||
| 280 | } |
||
| 281 | if((x&1)==0){ |
||
| 282 | ++r; |
||
| 283 | } |
||
| 284 | return r;
|
||
| 285 | }; |
||
| 286 | function _20(){ |
||
| 287 | for(var i=0;i<this.t;++i){ |
||
| 288 | if(this[i]!=0){ |
||
| 289 | return i*this._DB+_1f(this[i]); |
||
| 290 | } |
||
| 291 | } |
||
| 292 | if(this.s<0){ |
||
| 293 | return this.t*this._DB; |
||
| 294 | } |
||
| 295 | return -1; |
||
| 296 | }; |
||
| 297 | function _21(x){ |
||
| 298 | var r=0; |
||
| 299 | while(x!=0){ |
||
| 300 | x&=x-1;
|
||
| 301 | ++r; |
||
| 302 | } |
||
| 303 | return r;
|
||
| 304 | }; |
||
| 305 | function _22(){ |
||
| 306 | var r=0,x=this.s&this._DM; |
||
| 307 | for(var i=0;i<this.t;++i){ |
||
| 308 | r+=_21(this[i]^x);
|
||
| 309 | } |
||
| 310 | return r;
|
||
| 311 | }; |
||
| 312 | function _23(n){ |
||
| 313 | var j=Math.floor(n/this._DB); |
||
| 314 | if(j>=this.t){ |
||
| 315 | return (this.s!=0); |
||
| 316 | } |
||
| 317 | return ((this[j]&(1<<(n%this._DB)))!=0); |
||
| 318 | }; |
||
| 319 | function _24(n,op){ |
||
| 320 | var r=_1.ONE.shiftLeft(n);
|
||
| 321 | this._bitwiseTo(r,op,r);
|
||
| 322 | return r;
|
||
| 323 | }; |
||
| 324 | function _25(n){ |
||
| 325 | return this._changeBit(n,_f); |
||
| 326 | }; |
||
| 327 | function _26(n){ |
||
| 328 | return this._changeBit(n,_1a); |
||
| 329 | }; |
||
| 330 | function _27(n){ |
||
| 331 | return this._changeBit(n,_18); |
||
| 332 | }; |
||
| 333 | function _28(a,r){ |
||
| 334 | var i=0,c=0,m=Math.min(a.t,this.t); |
||
| 335 | while(i<m){
|
||
| 336 | c+=this[i]+a[i];
|
||
| 337 | r[i++]=c&this._DM;
|
||
| 338 | c>>=this._DB;
|
||
| 339 | } |
||
| 340 | if(a.t<this.t){ |
||
| 341 | c+=a.s; |
||
| 342 | while(i<this.t){ |
||
| 343 | c+=this[i];
|
||
| 344 | r[i++]=c&this._DM;
|
||
| 345 | c>>=this._DB;
|
||
| 346 | } |
||
| 347 | c+=this.s;
|
||
| 348 | }else{
|
||
| 349 | c+=this.s;
|
||
| 350 | while(i<a.t){
|
||
| 351 | c+=a[i]; |
||
| 352 | r[i++]=c&this._DM;
|
||
| 353 | c>>=this._DB;
|
||
| 354 | } |
||
| 355 | c+=a.s; |
||
| 356 | } |
||
| 357 | r.s=(c<0)?-1:0; |
||
| 358 | if(c>0){ |
||
| 359 | r[i++]=c; |
||
| 360 | }else{
|
||
| 361 | if(c<-1){ |
||
| 362 | r[i++]=this._DV+c;
|
||
| 363 | } |
||
| 364 | } |
||
| 365 | r.t=i; |
||
| 366 | r._clamp(); |
||
| 367 | }; |
||
| 368 | function _29(a){ |
||
| 369 | var r=_2();
|
||
| 370 | this._addTo(a,r);
|
||
| 371 | return r;
|
||
| 372 | }; |
||
| 373 | function _2a(a){ |
||
| 374 | var r=_2();
|
||
| 375 | this._subTo(a,r);
|
||
| 376 | return r;
|
||
| 377 | }; |
||
| 378 | function _2b(a){ |
||
| 379 | var r=_2();
|
||
| 380 | this._multiplyTo(a,r);
|
||
| 381 | return r;
|
||
| 382 | }; |
||
| 383 | function _2c(a){ |
||
| 384 | var r=_2();
|
||
| 385 | this._divRemTo(a,r,null); |
||
| 386 | return r;
|
||
| 387 | }; |
||
| 388 | function _2d(a){ |
||
| 389 | var r=_2();
|
||
| 390 | this._divRemTo(a,null,r); |
||
| 391 | return r;
|
||
| 392 | }; |
||
| 393 | function _2e(a){ |
||
| 394 | var q=_2(),r=_2();
|
||
| 395 | this._divRemTo(a,q,r);
|
||
| 396 | return [q,r];
|
||
| 397 | }; |
||
| 398 | function _2f(n){ |
||
| 399 | this[this.t]=this.am(0,n-1,this,0,0,this.t); |
||
| 400 | ++this.t;
|
||
| 401 | this._clamp();
|
||
| 402 | }; |
||
| 403 | function _30(n,w){ |
||
| 404 | while(this.t<=w){ |
||
| 405 | this[this.t++]=0; |
||
| 406 | } |
||
| 407 | this[w]+=n;
|
||
| 408 | while(this[w]>=this._DV){ |
||
| 409 | this[w]-=this._DV; |
||
| 410 | if(++w>=this.t){ |
||
| 411 | this[this.t++]=0; |
||
| 412 | } |
||
| 413 | ++this[w];
|
||
| 414 | } |
||
| 415 | }; |
||
| 416 | function _31(){ |
||
| 417 | }; |
||
| 418 | function _32(x){ |
||
| 419 | return x;
|
||
| 420 | }; |
||
| 421 | function _33(x,y,r){ |
||
| 422 | x._multiplyTo(y,r); |
||
| 423 | }; |
||
| 424 | function _34(x,r){ |
||
| 425 | x._squareTo(r); |
||
| 426 | }; |
||
| 427 | _31.prototype.convert=_32; |
||
| 428 | _31.prototype.revert=_32; |
||
| 429 | _31.prototype.mulTo=_33; |
||
| 430 | _31.prototype.sqrTo=_34; |
||
| 431 | function _35(e){ |
||
| 432 | return this._exp(e,new _31()); |
||
| 433 | }; |
||
| 434 | function _36(a,n,r){ |
||
| 435 | var i=Math.min(this.t+a.t,n); |
||
| 436 | r.s=0;
|
||
| 437 | r.t=i; |
||
| 438 | while(i>0){ |
||
| 439 | r[--i]=0;
|
||
| 440 | } |
||
| 441 | var j;
|
||
| 442 | for(j=r.t-this.t;i<j;++i){ |
||
| 443 | r[i+this.t]=this.am(0,a[i],r,i,0,this.t); |
||
| 444 | } |
||
| 445 | for(j=Math.min(a.t,n);i<j;++i){
|
||
| 446 | this.am(0,a[i],r,i,0,n-i); |
||
| 447 | } |
||
| 448 | r._clamp(); |
||
| 449 | }; |
||
| 450 | function _37(a,n,r){ |
||
| 451 | --n; |
||
| 452 | var i=r.t=this.t+a.t-n; |
||
| 453 | r.s=0;
|
||
| 454 | while(--i>=0){ |
||
| 455 | r[i]=0;
|
||
| 456 | } |
||
| 457 | for(i=Math.max(n-this.t,0);i<a.t;++i){ |
||
| 458 | r[this.t+i-n]=this.am(n-i,a[i],r,0,0,this.t+i-n); |
||
| 459 | } |
||
| 460 | r._clamp(); |
||
| 461 | r._drShiftTo(1,r);
|
||
| 462 | }; |
||
| 463 | function _38(m){ |
||
| 464 | this.r2=_2();
|
||
| 465 | this.q3=_2();
|
||
| 466 | _1.ONE._dlShiftTo(2*m.t,this.r2); |
||
| 467 | this.mu=this.r2.divide(m); |
||
| 468 | this.m=m;
|
||
| 469 | }; |
||
| 470 | function _39(x){ |
||
| 471 | if(x.s<0||x.t>2*this.m.t){ |
||
| 472 | return x.mod(this.m); |
||
| 473 | }else{
|
||
| 474 | if(x.compareTo(this.m)<0){ |
||
| 475 | return x;
|
||
| 476 | }else{
|
||
| 477 | var r=_2();
|
||
| 478 | x._copyTo(r); |
||
| 479 | this.reduce(r);
|
||
| 480 | return r;
|
||
| 481 | } |
||
| 482 | } |
||
| 483 | }; |
||
| 484 | function _3a(x){ |
||
| 485 | return x;
|
||
| 486 | }; |
||
| 487 | function _3b(x){ |
||
| 488 | x._drShiftTo(this.m.t-1,this.r2); |
||
| 489 | if(x.t>this.m.t+1){ |
||
| 490 | x.t=this.m.t+1; |
||
| 491 | x._clamp(); |
||
| 492 | } |
||
| 493 | this.mu._multiplyUpperTo(this.r2,this.m.t+1,this.q3); |
||
| 494 | this.m._multiplyLowerTo(this.q3,this.m.t+1,this.r2); |
||
| 495 | while(x.compareTo(this.r2)<0){ |
||
| 496 | x._dAddOffset(1,this.m.t+1); |
||
| 497 | } |
||
| 498 | x._subTo(this.r2,x);
|
||
| 499 | while(x.compareTo(this.m)>=0){ |
||
| 500 | x._subTo(this.m,x);
|
||
| 501 | } |
||
| 502 | }; |
||
| 503 | function _3c(x,r){ |
||
| 504 | x._squareTo(r); |
||
| 505 | this.reduce(r);
|
||
| 506 | }; |
||
| 507 | function _3d(x,y,r){ |
||
| 508 | x._multiplyTo(y,r); |
||
| 509 | this.reduce(r);
|
||
| 510 | }; |
||
| 511 | _38.prototype.convert=_39; |
||
| 512 | _38.prototype.revert=_3a; |
||
| 513 | _38.prototype.reduce=_3b; |
||
| 514 | _38.prototype.mulTo=_3d; |
||
| 515 | _38.prototype.sqrTo=_3c; |
||
| 516 | function _3e(e,m){ |
||
| 517 | var i=e.bitLength(),k,r=_3(1),z; |
||
| 518 | if(i<=0){ |
||
| 519 | return r;
|
||
| 520 | }else{
|
||
| 521 | if(i<18){ |
||
| 522 | k=1;
|
||
| 523 | }else{
|
||
| 524 | if(i<48){ |
||
| 525 | k=3;
|
||
| 526 | }else{
|
||
| 527 | if(i<144){ |
||
| 528 | k=4;
|
||
| 529 | }else{
|
||
| 530 | if(i<768){ |
||
| 531 | k=5;
|
||
| 532 | }else{
|
||
| 533 | k=6;
|
||
| 534 | } |
||
| 535 | } |
||
| 536 | } |
||
| 537 | } |
||
| 538 | } |
||
| 539 | if(i<8){ |
||
| 540 | z=new Classic(m);
|
||
| 541 | }else{
|
||
| 542 | if(m._isEven()){
|
||
| 543 | z=new _38(m);
|
||
| 544 | }else{
|
||
| 545 | z=new _5(m);
|
||
| 546 | } |
||
| 547 | } |
||
| 548 | var g=[],n=3,k1=k-1,km=(1<<k)-1; |
||
| 549 | g[1]=z.convert(this); |
||
| 550 | if(k>1){ |
||
| 551 | var g2=_2();
|
||
| 552 | z.sqrTo(g[1],g2);
|
||
| 553 | while(n<=km){
|
||
| 554 | g[n]=_2(); |
||
| 555 | z.mulTo(g2,g[n-2],g[n]);
|
||
| 556 | n+=2;
|
||
| 557 | } |
||
| 558 | } |
||
| 559 | var j=e.t-1,w,is1=true,r2=_2(),t; |
||
| 560 | i=_4(e[j])-1;
|
||
| 561 | while(j>=0){ |
||
| 562 | if(i>=k1){
|
||
| 563 | w=(e[j]>>(i-k1))&km; |
||
| 564 | }else{
|
||
| 565 | w=(e[j]&((1<<(i+1))-1))<<(k1-i); |
||
| 566 | if(j>0){ |
||
| 567 | w|=e[j-1]>>(this._DB+i-k1); |
||
| 568 | } |
||
| 569 | } |
||
| 570 | n=k; |
||
| 571 | while((w&1)==0){ |
||
| 572 | w>>=1;
|
||
| 573 | --n; |
||
| 574 | } |
||
| 575 | if((i-=n)<0){ |
||
| 576 | i+=this._DB;
|
||
| 577 | --j; |
||
| 578 | } |
||
| 579 | if(is1){
|
||
| 580 | g[w]._copyTo(r); |
||
| 581 | is1=false;
|
||
| 582 | }else{
|
||
| 583 | while(n>1){ |
||
| 584 | z.sqrTo(r,r2); |
||
| 585 | z.sqrTo(r2,r); |
||
| 586 | n-=2;
|
||
| 587 | } |
||
| 588 | if(n>0){ |
||
| 589 | z.sqrTo(r,r2); |
||
| 590 | }else{
|
||
| 591 | t=r; |
||
| 592 | r=r2; |
||
| 593 | r2=t; |
||
| 594 | } |
||
| 595 | z.mulTo(r2,g[w],r); |
||
| 596 | } |
||
| 597 | while(j>=0&&(e[j]&(1<<i))==0){ |
||
| 598 | z.sqrTo(r,r2); |
||
| 599 | t=r; |
||
| 600 | r=r2; |
||
| 601 | r2=t; |
||
| 602 | if(--i<0){ |
||
| 603 | i=this._DB-1; |
||
| 604 | --j; |
||
| 605 | } |
||
| 606 | } |
||
| 607 | } |
||
| 608 | return z.revert(r);
|
||
| 609 | }; |
||
| 610 | function _3f(a){ |
||
| 611 | var x=(this.s<0)?this.negate():this.clone(); |
||
| 612 | var y=(a.s<0)?a.negate():a.clone(); |
||
| 613 | if(x.compareTo(y)<0){ |
||
| 614 | var t=x;
|
||
| 615 | x=y; |
||
| 616 | y=t; |
||
| 617 | } |
||
| 618 | var i=x.getLowestSetBit(),g=y.getLowestSetBit();
|
||
| 619 | if(g<0){ |
||
| 620 | return x;
|
||
| 621 | } |
||
| 622 | if(i<g){
|
||
| 623 | g=i; |
||
| 624 | } |
||
| 625 | if(g>0){ |
||
| 626 | x._rShiftTo(g,x); |
||
| 627 | y._rShiftTo(g,y); |
||
| 628 | } |
||
| 629 | while(x.signum()>0){ |
||
| 630 | if((i=x.getLowestSetBit())>0){ |
||
| 631 | x._rShiftTo(i,x); |
||
| 632 | } |
||
| 633 | if((i=y.getLowestSetBit())>0){ |
||
| 634 | y._rShiftTo(i,y); |
||
| 635 | } |
||
| 636 | if(x.compareTo(y)>=0){ |
||
| 637 | x._subTo(y,x); |
||
| 638 | x._rShiftTo(1,x);
|
||
| 639 | }else{
|
||
| 640 | y._subTo(x,y); |
||
| 641 | y._rShiftTo(1,y);
|
||
| 642 | } |
||
| 643 | } |
||
| 644 | if(g>0){ |
||
| 645 | y._lShiftTo(g,y); |
||
| 646 | } |
||
| 647 | return y;
|
||
| 648 | }; |
||
| 649 | function _40(n){ |
||
| 650 | if(n<=0){ |
||
| 651 | return 0; |
||
| 652 | } |
||
| 653 | var d=this._DV%n,r=(this.s<0)?n-1:0; |
||
| 654 | if(this.t>0){ |
||
| 655 | if(d==0){ |
||
| 656 | r=this[0]%n; |
||
| 657 | }else{
|
||
| 658 | for(var i=this.t-1;i>=0;--i){ |
||
| 659 | r=(d*r+this[i])%n;
|
||
| 660 | } |
||
| 661 | } |
||
| 662 | } |
||
| 663 | return r;
|
||
| 664 | }; |
||
| 665 | function _41(m){ |
||
| 666 | var ac=m._isEven();
|
||
| 667 | if((this._isEven()&&ac)||m.signum()==0){ |
||
| 668 | return _1.ZERO;
|
||
| 669 | } |
||
| 670 | var u=m.clone(),v=this.clone(); |
||
| 671 | var a=_3(1),b=_3(0),c=_3(0),d=_3(1); |
||
| 672 | while(u.signum()!=0){ |
||
| 673 | while(u._isEven()){
|
||
| 674 | u._rShiftTo(1,u);
|
||
| 675 | if(ac){
|
||
| 676 | if(!a._isEven()||!b._isEven()){
|
||
| 677 | a._addTo(this,a);
|
||
| 678 | b._subTo(m,b); |
||
| 679 | } |
||
| 680 | a._rShiftTo(1,a);
|
||
| 681 | }else{
|
||
| 682 | if(!b._isEven()){
|
||
| 683 | b._subTo(m,b); |
||
| 684 | } |
||
| 685 | } |
||
| 686 | b._rShiftTo(1,b);
|
||
| 687 | } |
||
| 688 | while(v._isEven()){
|
||
| 689 | v._rShiftTo(1,v);
|
||
| 690 | if(ac){
|
||
| 691 | if(!c._isEven()||!d._isEven()){
|
||
| 692 | c._addTo(this,c);
|
||
| 693 | d._subTo(m,d); |
||
| 694 | } |
||
| 695 | c._rShiftTo(1,c);
|
||
| 696 | }else{
|
||
| 697 | if(!d._isEven()){
|
||
| 698 | d._subTo(m,d); |
||
| 699 | } |
||
| 700 | } |
||
| 701 | d._rShiftTo(1,d);
|
||
| 702 | } |
||
| 703 | if(u.compareTo(v)>=0){ |
||
| 704 | u._subTo(v,u); |
||
| 705 | if(ac){
|
||
| 706 | a._subTo(c,a); |
||
| 707 | } |
||
| 708 | b._subTo(d,b); |
||
| 709 | }else{
|
||
| 710 | v._subTo(u,v); |
||
| 711 | if(ac){
|
||
| 712 | c._subTo(a,c); |
||
| 713 | } |
||
| 714 | d._subTo(b,d); |
||
| 715 | } |
||
| 716 | } |
||
| 717 | if(v.compareTo(_1.ONE)!=0){ |
||
| 718 | return _1.ZERO;
|
||
| 719 | } |
||
| 720 | if(d.compareTo(m)>=0){ |
||
| 721 | return d.subtract(m);
|
||
| 722 | } |
||
| 723 | if(d.signum()<0){ |
||
| 724 | d._addTo(m,d); |
||
| 725 | }else{
|
||
| 726 | return d;
|
||
| 727 | } |
||
| 728 | if(d.signum()<0){ |
||
| 729 | return d.add(m);
|
||
| 730 | }else{
|
||
| 731 | return d;
|
||
| 732 | } |
||
| 733 | }; |
||
| 734 | 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]; |
||
| 735 | var _43=(1<<26)/_42[_42.length-1]; |
||
| 736 | function _44(t){ |
||
| 737 | var i,x=this.abs(); |
||
| 738 | if(x.t==1&&x[0]<=_42[_42.length-1]){ |
||
| 739 | for(i=0;i<_42.length;++i){ |
||
| 740 | if(x[0]==_42[i]){ |
||
| 741 | return true; |
||
| 742 | } |
||
| 743 | } |
||
| 744 | return false; |
||
| 745 | } |
||
| 746 | if(x._isEven()){
|
||
| 747 | return false; |
||
| 748 | } |
||
| 749 | i=1;
|
||
| 750 | while(i<_42.length){
|
||
| 751 | var m=_42[i],j=i+1; |
||
| 752 | while(j<_42.length&&m<_43){
|
||
| 753 | m*=_42[j++]; |
||
| 754 | } |
||
| 755 | m=x._modInt(m); |
||
| 756 | while(i<j){
|
||
| 757 | if(m%_42[i++]==0){ |
||
| 758 | return false; |
||
| 759 | } |
||
| 760 | } |
||
| 761 | } |
||
| 762 | return x._millerRabin(t);
|
||
| 763 | }; |
||
| 764 | function _45(t){ |
||
| 765 | var n1=this.subtract(_1.ONE); |
||
| 766 | var k=n1.getLowestSetBit();
|
||
| 767 | if(k<=0){ |
||
| 768 | return false; |
||
| 769 | } |
||
| 770 | var r=n1.shiftRight(k);
|
||
| 771 | t=(t+1)>>1; |
||
| 772 | if(t>_42.length){
|
||
| 773 | t=_42.length; |
||
| 774 | } |
||
| 775 | var a=_2();
|
||
| 776 | for(var i=0;i<t;++i){ |
||
| 777 | a._fromInt(_42[i]); |
||
| 778 | var y=a.modPow(r,this); |
||
| 779 | if(y.compareTo(_1.ONE)!=0&&y.compareTo(n1)!=0){ |
||
| 780 | var j=1; |
||
| 781 | while(j++<k&&y.compareTo(n1)!=0){ |
||
| 782 | y=y.modPowInt(2,this); |
||
| 783 | if(y.compareTo(_1.ONE)==0){ |
||
| 784 | return false; |
||
| 785 | } |
||
| 786 | } |
||
| 787 | if(y.compareTo(n1)!=0){ |
||
| 788 | return false; |
||
| 789 | } |
||
| 790 | } |
||
| 791 | } |
||
| 792 | return true; |
||
| 793 | }; |
||
| 794 | 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});
|
||
| 795 | })(); |
||
| 796 | } |