Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / math / BigInteger.js @ 9

History | View | Annotate | Download (9.23 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"]){
9
dojo._hasResource["dojox.math.BigInteger"]=true;
10
dojo.provide("dojox.math.BigInteger");
11
dojo.experimental("dojox.math.BigInteger");
12
(function(){
13
var _1;
14
var _2=244837814094590;
15
var _3=((_2&16777215)==15715070);
16
function _4(a,b,c){
17
if(a!=null){
18
if("number"==typeof a){
19
this._fromNumber(a,b,c);
20
}else{
21
if(!b&&"string"!=typeof a){
22
this._fromString(a,256);
23
}else{
24
this._fromString(a,b);
25
}
26
}
27
}
28
};
29
function _5(){
30
return new _4(null);
31
};
32
function _6(i,x,w,j,c,n){
33
while(--n>=0){
34
var v=x*this[i++]+w[j]+c;
35
c=Math.floor(v/67108864);
36
w[j++]=v&67108863;
37
}
38
return c;
39
};
40
function _7(i,x,w,j,c,n){
41
var xl=x&32767,xh=x>>15;
42
while(--n>=0){
43
var l=this[i]&32767;
44
var h=this[i++]>>15;
45
var m=xh*l+h*xl;
46
l=xl*l+((m&32767)<<15)+w[j]+(c&1073741823);
47
c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);
48
w[j++]=l&1073741823;
49
}
50
return c;
51
};
52
function _8(i,x,w,j,c,n){
53
var xl=x&16383,xh=x>>14;
54
while(--n>=0){
55
var l=this[i]&16383;
56
var h=this[i++]>>14;
57
var m=xh*l+h*xl;
58
l=xl*l+((m&16383)<<14)+w[j]+c;
59
c=(l>>28)+(m>>14)+xh*h;
60
w[j++]=l&268435455;
61
}
62
return c;
63
};
64
if(_3&&(navigator.appName=="Microsoft Internet Explorer")){
65
_4.prototype.am=_7;
66
_1=30;
67
}else{
68
if(_3&&(navigator.appName!="Netscape")){
69
_4.prototype.am=_6;
70
_1=26;
71
}else{
72
_4.prototype.am=_8;
73
_1=28;
74
}
75
}
76
var _9=52;
77
var _a="0123456789abcdefghijklmnopqrstuvwxyz";
78
var _b=[];
79
var rr,vv;
80
rr="0".charCodeAt(0);
81
for(vv=0;vv<=9;++vv){
82
_b[rr++]=vv;
83
}
84
rr="a".charCodeAt(0);
85
for(vv=10;vv<36;++vv){
86
_b[rr++]=vv;
87
}
88
rr="A".charCodeAt(0);
89
for(vv=10;vv<36;++vv){
90
_b[rr++]=vv;
91
}
92
function _c(n){
93
return _a.charAt(n);
94
};
95
function _d(s,i){
96
var c=_b[s.charCodeAt(i)];
97
return (c==null)?-1:c;
98
};
99
function _e(r){
100
for(var i=this.t-1;i>=0;--i){
101
r[i]=this[i];
102
}
103
r.t=this.t;
104
r.s=this.s;
105
};
106
function _f(x){
107
this.t=1;
108
this.s=(x<0)?-1:0;
109
if(x>0){
110
this[0]=x;
111
}else{
112
if(x<-1){
113
this[0]=x+_DV;
114
}else{
115
this.t=0;
116
}
117
}
118
};
119
function nbv(i){
120
var r=_5();
121
r._fromInt(i);
122
return r;
123
};
124
function _10(s,b){
125
var k;
126
if(b==16){
127
k=4;
128
}else{
129
if(b==8){
130
k=3;
131
}else{
132
if(b==256){
133
k=8;
134
}else{
135
if(b==2){
136
k=1;
137
}else{
138
if(b==32){
139
k=5;
140
}else{
141
if(b==4){
142
k=2;
143
}else{
144
this.fromRadix(s,b);
145
return;
146
}
147
}
148
}
149
}
150
}
151
}
152
this.t=0;
153
this.s=0;
154
var i=s.length,mi=false,sh=0;
155
while(--i>=0){
156
var x=(k==8)?s[i]&255:_d(s,i);
157
if(x<0){
158
if(s.charAt(i)=="-"){
159
mi=true;
160
}
161
continue;
162
}
163
mi=false;
164
if(sh==0){
165
this[this.t++]=x;
166
}else{
167
if(sh+k>this._DB){
168
this[this.t-1]|=(x&((1<<(this._DB-sh))-1))<<sh;
169
this[this.t++]=(x>>(this._DB-sh));
170
}else{
171
this[this.t-1]|=x<<sh;
172
}
173
}
174
sh+=k;
175
if(sh>=this._DB){
176
sh-=this._DB;
177
}
178
}
179
if(k==8&&(s[0]&128)!=0){
180
this.s=-1;
181
if(sh>0){
182
this[this.t-1]|=((1<<(this._DB-sh))-1)<<sh;
183
}
184
}
185
this._clamp();
186
if(mi){
187
_4.ZERO._subTo(this,this);
188
}
189
};
190
function _11(){
191
var c=this.s&this._DM;
192
while(this.t>0&&this[this.t-1]==c){
193
--this.t;
194
}
195
};
196
function _12(b){
197
if(this.s<0){
198
return "-"+this.negate().toString(b);
199
}
200
var k;
201
if(b==16){
202
k=4;
203
}else{
204
if(b==8){
205
k=3;
206
}else{
207
if(b==2){
208
k=1;
209
}else{
210
if(b==32){
211
k=5;
212
}else{
213
if(b==4){
214
k=2;
215
}else{
216
return this._toRadix(b);
217
}
218
}
219
}
220
}
221
}
222
var km=(1<<k)-1,d,m=false,r="",i=this.t;
223
var p=this._DB-(i*this._DB)%k;
224
if(i-->0){
225
if(p<this._DB&&(d=this[i]>>p)>0){
226
m=true;
227
r=_c(d);
228
}
229
while(i>=0){
230
if(p<k){
231
d=(this[i]&((1<<p)-1))<<(k-p);
232
d|=this[--i]>>(p+=this._DB-k);
233
}else{
234
d=(this[i]>>(p-=k))&km;
235
if(p<=0){
236
p+=this._DB;
237
--i;
238
}
239
}
240
if(d>0){
241
m=true;
242
}
243
if(m){
244
r+=_c(d);
245
}
246
}
247
}
248
return m?r:"0";
249
};
250
function _13(){
251
var r=_5();
252
_4.ZERO._subTo(this,r);
253
return r;
254
};
255
function _14(){
256
return (this.s<0)?this.negate():this;
257
};
258
function _15(a){
259
var r=this.s-a.s;
260
if(r){
261
return r;
262
}
263
var i=this.t;
264
r=i-a.t;
265
if(r){
266
return r;
267
}
268
while(--i>=0){
269
if((r=this[i]-a[i])){
270
return r;
271
}
272
}
273
return 0;
274
};
275
function _16(x){
276
var r=1,t;
277
if((t=x>>>16)){
278
x=t;
279
r+=16;
280
}
281
if((t=x>>8)){
282
x=t;
283
r+=8;
284
}
285
if((t=x>>4)){
286
x=t;
287
r+=4;
288
}
289
if((t=x>>2)){
290
x=t;
291
r+=2;
292
}
293
if((t=x>>1)){
294
x=t;
295
r+=1;
296
}
297
return r;
298
};
299
function _17(){
300
if(this.t<=0){
301
return 0;
302
}
303
return this._DB*(this.t-1)+_16(this[this.t-1]^(this.s&this._DM));
304
};
305
function _18(n,r){
306
var i;
307
for(i=this.t-1;i>=0;--i){
308
r[i+n]=this[i];
309
}
310
for(i=n-1;i>=0;--i){
311
r[i]=0;
312
}
313
r.t=this.t+n;
314
r.s=this.s;
315
};
316
function _19(n,r){
317
for(var i=n;i<this.t;++i){
318
r[i-n]=this[i];
319
}
320
r.t=Math.max(this.t-n,0);
321
r.s=this.s;
322
};
323
function _1a(n,r){
324
var bs=n%this._DB;
325
var cbs=this._DB-bs;
326
var bm=(1<<cbs)-1;
327
var ds=Math.floor(n/this._DB),c=(this.s<<bs)&this._DM,i;
328
for(i=this.t-1;i>=0;--i){
329
r[i+ds+1]=(this[i]>>cbs)|c;
330
c=(this[i]&bm)<<bs;
331
}
332
for(i=ds-1;i>=0;--i){
333
r[i]=0;
334
}
335
r[ds]=c;
336
r.t=this.t+ds+1;
337
r.s=this.s;
338
r._clamp();
339
};
340
function _1b(n,r){
341
r.s=this.s;
342
var ds=Math.floor(n/this._DB);
343
if(ds>=this.t){
344
r.t=0;
345
return;
346
}
347
var bs=n%this._DB;
348
var cbs=this._DB-bs;
349
var bm=(1<<bs)-1;
350
r[0]=this[ds]>>bs;
351
for(var i=ds+1;i<this.t;++i){
352
r[i-ds-1]|=(this[i]&bm)<<cbs;
353
r[i-ds]=this[i]>>bs;
354
}
355
if(bs>0){
356
r[this.t-ds-1]|=(this.s&bm)<<cbs;
357
}
358
r.t=this.t-ds;
359
r._clamp();
360
};
361
function _1c(a,r){
362
var i=0,c=0,m=Math.min(a.t,this.t);
363
while(i<m){
364
c+=this[i]-a[i];
365
r[i++]=c&this._DM;
366
c>>=this._DB;
367
}
368
if(a.t<this.t){
369
c-=a.s;
370
while(i<this.t){
371
c+=this[i];
372
r[i++]=c&this._DM;
373
c>>=this._DB;
374
}
375
c+=this.s;
376
}else{
377
c+=this.s;
378
while(i<a.t){
379
c-=a[i];
380
r[i++]=c&this._DM;
381
c>>=this._DB;
382
}
383
c-=a.s;
384
}
385
r.s=(c<0)?-1:0;
386
if(c<-1){
387
r[i++]=this._DV+c;
388
}else{
389
if(c>0){
390
r[i++]=c;
391
}
392
}
393
r.t=i;
394
r._clamp();
395
};
396
function _1d(a,r){
397
var x=this.abs(),y=a.abs();
398
var i=x.t;
399
r.t=i+y.t;
400
while(--i>=0){
401
r[i]=0;
402
}
403
for(i=0;i<y.t;++i){
404
r[i+x.t]=x.am(0,y[i],r,i,0,x.t);
405
}
406
r.s=0;
407
r._clamp();
408
if(this.s!=a.s){
409
_4.ZERO._subTo(r,r);
410
}
411
};
412
function _1e(r){
413
var x=this.abs();
414
var i=r.t=2*x.t;
415
while(--i>=0){
416
r[i]=0;
417
}
418
for(i=0;i<x.t-1;++i){
419
var c=x.am(i,x[i],r,2*i,0,1);
420
if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x._DV){
421
r[i+x.t]-=x._DV;
422
r[i+x.t+1]=1;
423
}
424
}
425
if(r.t>0){
426
r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);
427
}
428
r.s=0;
429
r._clamp();
430
};
431
function _1f(m,q,r){
432
var pm=m.abs();
433
if(pm.t<=0){
434
return;
435
}
436
var pt=this.abs();
437
if(pt.t<pm.t){
438
if(q!=null){
439
q._fromInt(0);
440
}
441
if(r!=null){
442
this._copyTo(r);
443
}
444
return;
445
}
446
if(r==null){
447
r=_5();
448
}
449
var y=_5(),ts=this.s,ms=m.s;
450
var nsh=this._DB-_16(pm[pm.t-1]);
451
if(nsh>0){
452
pm._lShiftTo(nsh,y);
453
pt._lShiftTo(nsh,r);
454
}else{
455
pm._copyTo(y);
456
pt._copyTo(r);
457
}
458
var ys=y.t;
459
var y0=y[ys-1];
460
if(y0==0){
461
return;
462
}
463
var yt=y0*(1<<this._F1)+((ys>1)?y[ys-2]>>this._F2:0);
464
var d1=this._FV/yt,d2=(1<<this._F1)/yt,e=1<<this._F2;
465
var i=r.t,j=i-ys,t=(q==null)?_5():q;
466
y._dlShiftTo(j,t);
467
if(r.compareTo(t)>=0){
468
r[r.t++]=1;
469
r._subTo(t,r);
470
}
471
_4.ONE._dlShiftTo(ys,t);
472
t._subTo(y,y);
473
while(y.t<ys){
474
y[y.t++]=0;
475
}
476
while(--j>=0){
477
var qd=(r[--i]==y0)?this._DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
478
if((r[i]+=y.am(0,qd,r,j,0,ys))<qd){
479
y._dlShiftTo(j,t);
480
r._subTo(t,r);
481
while(r[i]<--qd){
482
r._subTo(t,r);
483
}
484
}
485
}
486
if(q!=null){
487
r._drShiftTo(ys,q);
488
if(ts!=ms){
489
_4.ZERO._subTo(q,q);
490
}
491
}
492
r.t=ys;
493
r._clamp();
494
if(nsh>0){
495
r._rShiftTo(nsh,r);
496
}
497
if(ts<0){
498
_4.ZERO._subTo(r,r);
499
}
500
};
501
function _20(a){
502
var r=_5();
503
this.abs()._divRemTo(a,null,r);
504
if(this.s<0&&r.compareTo(_4.ZERO)>0){
505
a._subTo(r,r);
506
}
507
return r;
508
};
509
function _21(m){
510
this.m=m;
511
};
512
function _22(x){
513
if(x.s<0||x.compareTo(this.m)>=0){
514
return x.mod(this.m);
515
}else{
516
return x;
517
}
518
};
519
function _23(x){
520
return x;
521
};
522
function _24(x){
523
x._divRemTo(this.m,null,x);
524
};
525
function _25(x,y,r){
526
x._multiplyTo(y,r);
527
this.reduce(r);
528
};
529
function _26(x,r){
530
x._squareTo(r);
531
this.reduce(r);
532
};
533
dojo.extend(_21,{convert:_22,revert:_23,reduce:_24,mulTo:_25,sqrTo:_26});
534
function _27(){
535
if(this.t<1){
536
return 0;
537
}
538
var x=this[0];
539
if((x&1)==0){
540
return 0;
541
}
542
var y=x&3;
543
y=(y*(2-(x&15)*y))&15;
544
y=(y*(2-(x&255)*y))&255;
545
y=(y*(2-(((x&65535)*y)&65535)))&65535;
546
y=(y*(2-x*y%this._DV))%this._DV;
547
return (y>0)?this._DV-y:-y;
548
};
549
function _28(m){
550
this.m=m;
551
this.mp=m._invDigit();
552
this.mpl=this.mp&32767;
553
this.mph=this.mp>>15;
554
this.um=(1<<(m._DB-15))-1;
555
this.mt2=2*m.t;
556
};
557
function _29(x){
558
var r=_5();
559
x.abs()._dlShiftTo(this.m.t,r);
560
r._divRemTo(this.m,null,r);
561
if(x.s<0&&r.compareTo(_4.ZERO)>0){
562
this.m._subTo(r,r);
563
}
564
return r;
565
};
566
function _2a(x){
567
var r=_5();
568
x._copyTo(r);
569
this.reduce(r);
570
return r;
571
};
572
function _2b(x){
573
while(x.t<=this.mt2){
574
x[x.t++]=0;
575
}
576
for(var i=0;i<this.m.t;++i){
577
var j=x[i]&32767;
578
var u0=(j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x._DM;
579
j=i+this.m.t;
580
x[j]+=this.m.am(0,u0,x,i,0,this.m.t);
581
while(x[j]>=x._DV){
582
x[j]-=x._DV;
583
x[++j]++;
584
}
585
}
586
x._clamp();
587
x._drShiftTo(this.m.t,x);
588
if(x.compareTo(this.m)>=0){
589
x._subTo(this.m,x);
590
}
591
};
592
function _2c(x,r){
593
x._squareTo(r);
594
this.reduce(r);
595
};
596
function _2d(x,y,r){
597
x._multiplyTo(y,r);
598
this.reduce(r);
599
};
600
dojo.extend(_28,{convert:_29,revert:_2a,reduce:_2b,mulTo:_2d,sqrTo:_2c});
601
function _2e(){
602
return ((this.t>0)?(this[0]&1):this.s)==0;
603
};
604
function _2f(e,z){
605
if(e>4294967295||e<1){
606
return _4.ONE;
607
}
608
var r=_5(),r2=_5(),g=z.convert(this),i=_16(e)-1;
609
g._copyTo(r);
610
while(--i>=0){
611
z.sqrTo(r,r2);
612
if((e&(1<<i))>0){
613
z.mulTo(r2,g,r);
614
}else{
615
var t=r;
616
r=r2;
617
r2=t;
618
}
619
}
620
return z.revert(r);
621
};
622
function _30(e,m){
623
var z;
624
if(e<256||m._isEven()){
625
z=new _21(m);
626
}else{
627
z=new _28(m);
628
}
629
return this._exp(e,z);
630
};
631
dojo.extend(_4,{_DB:_1,_DM:(1<<_1)-1,_DV:1<<_1,_FV:Math.pow(2,_9),_F1:_9-_1,_F2:2*_1-_9,_copyTo:_e,_fromInt:_f,_fromString:_10,_clamp:_11,_dlShiftTo:_18,_drShiftTo:_19,_lShiftTo:_1a,_rShiftTo:_1b,_subTo:_1c,_multiplyTo:_1d,_squareTo:_1e,_divRemTo:_1f,_invDigit:_27,_isEven:_2e,_exp:_2f,toString:_12,negate:_13,abs:_14,compareTo:_15,bitLength:_17,mod:_20,modPowInt:_30});
632
dojo._mixin(_4,{ZERO:nbv(0),ONE:nbv(1),_nbi:_5,_nbv:nbv,_nbits:_16,_Montgomery:_28});
633
dojox.math.BigInteger=_4;
634
})();
635
}