root / trunk / web / dojo / dojox / math / BigInteger-ext.js @ 10
History | View | Annotate | Download (11.8 KB)
1 |
/*
|
---|---|
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 |
} |