root / trunk / web / dojo / dojox / math / BigInteger-ext.js @ 11
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 | } |