tweetcast/client/lib/websocket-js/flash-src/third-party/com/hurlant/math/BigInteger.as
author Raphael Velt <raph.velt@gmail.com>
Mon, 10 Oct 2011 15:24:28 +0200
changeset 310 526d3e411736
parent 306 70c9688a1486
permissions -rw-r--r--
Merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
305
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     1
/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     2
 * BigInteger
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     3
 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     4
 * An ActionScript 3 implementation of BigInteger (light version)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     5
 * Copyright (c) 2007 Henri Torgemane
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     6
 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     7
 * Derived from:
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     8
 * 		The jsbn library, Copyright (c) 2003-2005 Tom Wu
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
     9
 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    10
 * See LICENSE.txt for full license information.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    11
 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    12
package com.hurlant.math
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    13
{
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    14
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    15
	import com.hurlant.crypto.prng.Random;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    16
	import com.hurlant.util.Hex;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    17
	import com.hurlant.util.Memory;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    18
	
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    19
	import flash.utils.ByteArray;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    20
	use namespace bi_internal;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    21
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    22
	public class BigInteger
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    23
	{
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    24
		public static const DB:int = 30; // number of significant bits per chunk
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    25
		public static const DV:int = (1<<DB);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    26
		public static const DM:int = (DV-1); // Max value in a chunk
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    27
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    28
		public static const BI_FP:int = 52;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    29
		public static const FV:Number = Math.pow(2, BI_FP);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    30
		public static const F1:int = BI_FP - DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    31
		public static const F2:int = 2*DB - BI_FP;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    32
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    33
		public static const ZERO:BigInteger = nbv(0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    34
		public static const ONE:BigInteger  = nbv(1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    35
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    36
		/*bi_internal */public var t:int; // number of chunks.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    37
		bi_internal var s:int; // sign
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    38
		bi_internal var a:Array; // chunks
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    39
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    40
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    41
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    42
		 * @param value
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    43
		 * @param radix  WARNING: If value is ByteArray, this holds the number of bytes to use.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    44
		 * @param unsigned
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    45
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    46
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    47
		public function BigInteger(value:* = null, radix:int = 0, unsigned:Boolean = false) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    48
			a = new Array;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    49
			if (value is String) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    50
				if (radix&&radix!=16) throw new Error("BigInteger construction with radix!=16 is not supported.");
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    51
				value = Hex.toArray(value);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    52
				radix=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    53
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    54
			if (value is ByteArray) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    55
				var array:ByteArray = value as ByteArray;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    56
				var length:int = radix || (array.length - array.position);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    57
				fromArray(array, length, unsigned);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    58
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    59
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    60
		public function dispose():void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    61
			var r:Random = new Random;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    62
			for (var i:uint=0;i<a.length;i++) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    63
				a[i] = r.nextByte();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    64
				delete a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    65
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    66
			a=null;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    67
			t=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    68
			s=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    69
			Memory.gc();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    70
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    71
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    72
		public function toString(radix:Number=16):String {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    73
			if (s<0) return "-"+negate().toString(radix);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    74
			var k:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    75
			switch (radix) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    76
				case 2:   k=1; break;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    77
				case 4:   k=2; break;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    78
				case 8:   k=3; break;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    79
				case 16:  k=4; break;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    80
				case 32:  k=5; break;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    81
				default:
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    82
//					return toRadix(radix);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    83
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    84
			var km:int = (1<<k)-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    85
			var d:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    86
			var m:Boolean = false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    87
			var r:String = "";
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    88
			var i:int = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    89
			var p:int = DB-(i*DB)%k;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    90
			if (i-->0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    91
				if (p<DB && (d=a[i]>>p)>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    92
					m = true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    93
					r = d.toString(36);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    94
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    95
				while (i >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    96
					if (p<k) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    97
						d = (a[i]&((1<<p)-1))<<(k-p);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    98
						d|= a[--i]>>(p+=DB-k);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
    99
					} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   100
						d = (a[i]>>(p-=k))&km;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   101
						if (p<=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   102
							p += DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   103
							--i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   104
						}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   105
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   106
					if (d>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   107
						m = true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   108
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   109
					if (m) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   110
						r += d.toString(36);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   111
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   112
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   113
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   114
			return m?r:"0";
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   115
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   116
		public function toArray(array:ByteArray):uint {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   117
			const k:int = 8;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   118
			const km:int = (1<<8)-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   119
			var d:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   120
			var i:int = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   121
			var p:int = DB-(i*DB)%k;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   122
			var m:Boolean = false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   123
			var c:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   124
			if (i-->0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   125
				if (p<DB && (d=a[i]>>p)>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   126
					m = true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   127
					array.writeByte(d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   128
					c++;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   129
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   130
				while (i >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   131
					if (p<k) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   132
						d = (a[i]&((1<<p)-1))<<(k-p);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   133
						d|= a[--i]>>(p+=DB-k);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   134
					} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   135
						d = (a[i]>>(p-=k))&km;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   136
						if (p<=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   137
							p += DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   138
							--i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   139
						}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   140
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   141
					if (d>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   142
						m = true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   143
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   144
					if (m) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   145
						array.writeByte(d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   146
						c++;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   147
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   148
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   149
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   150
			return c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   151
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   152
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   153
		 * best-effort attempt to fit into a Number.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   154
		 * precision can be lost if it just can't fit.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   155
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   156
		public function valueOf():Number {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   157
			if (s==-1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   158
				return -negate().valueOf();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   159
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   160
			var coef:Number = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   161
			var value:Number = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   162
			for (var i:uint=0;i<t;i++) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   163
				value += a[i]*coef;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   164
				coef *= DV;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   165
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   166
			return value;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   167
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   168
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   169
		 * -this
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   170
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   171
		public function negate():BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   172
			var r:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   173
			ZERO.subTo(this, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   174
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   175
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   176
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   177
		 * |this|
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   178
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   179
		public function abs():BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   180
			return (s<0)?negate():this;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   181
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   182
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   183
		 * return + if this > v, - if this < v, 0 if equal
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   184
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   185
		public function compareTo(v:BigInteger):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   186
			var r:int = s - v.s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   187
			if (r!=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   188
				return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   189
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   190
			var i:int = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   191
			r = i-v.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   192
			if (r!=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   193
				return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   194
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   195
			while (--i >=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   196
				r=a[i]-v.a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   197
				if (r != 0) return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   198
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   199
			return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   200
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   201
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   202
		 * returns bit length of the integer x
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   203
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   204
		bi_internal function nbits(x:int):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   205
			var r:int = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   206
			var t:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   207
			if ((t=x>>>16) != 0) { x = t; r += 16; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   208
			if ((t=x>>8) != 0) { x = t; r += 8; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   209
			if ((t=x>>4) != 0) { x = t; r += 4; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   210
			if ((t=x>>2) != 0) { x = t; r += 2; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   211
			if ((t=x>>1) != 0) { x = t; r += 1; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   212
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   213
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   214
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   215
		 * returns the number of bits in this
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   216
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   217
		public function bitLength():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   218
			if (t<=0) return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   219
			return DB*(t-1)+nbits(a[t-1]^(s&DM));
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   220
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   221
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   222
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   223
		 * @param v
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   224
		 * @return this % v
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   225
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   226
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   227
		public function mod(v:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   228
			var r:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   229
			abs().divRemTo(v,null,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   230
			if (s<0 && r.compareTo(ZERO)>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   231
				v.subTo(r,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   232
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   233
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   234
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   235
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   236
		 * this^e % m, 0 <= e < 2^32
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   237
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   238
		public function modPowInt(e:int, m:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   239
			var z:IReduction;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   240
			if (e<256 || m.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   241
				z = new ClassicReduction(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   242
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   243
				z = new MontgomeryReduction(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   244
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   245
			return exp(e, z);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   246
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   247
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   248
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   249
		 * copy this to r
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   250
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   251
		bi_internal function copyTo(r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   252
			for (var i:int = t-1; i>=0; --i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   253
				r.a[i] = a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   254
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   255
			r.t = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   256
			r.s = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   257
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   258
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   259
		 * set from integer value "value", -DV <= value < DV
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   260
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   261
		bi_internal function fromInt(value:int):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   262
			t = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   263
			s = (value<0)?-1:0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   264
			if (value>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   265
				a[0] = value;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   266
			} else if (value<-1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   267
				a[0] = value+DV;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   268
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   269
				t = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   270
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   271
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   272
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   273
		 * set from ByteArray and length,
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   274
		 * starting a current position
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   275
		 * If length goes beyond the array, pad with zeroes.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   276
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   277
		bi_internal function fromArray(value:ByteArray, length:int, unsigned:Boolean = false):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   278
			var p:int = value.position;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   279
			var i:int = p+length;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   280
			var sh:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   281
			const k:int = 8;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   282
			t = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   283
			s = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   284
			while (--i >= p) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   285
				var x:int = i<value.length?value[i]:0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   286
				if (sh == 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   287
					a[t++] = x;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   288
				} else if (sh+k > DB) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   289
					a[t-1] |= (x&((1<<(DB-sh))-1))<<sh;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   290
					a[t++] = x>>(DB-sh);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   291
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   292
					a[t-1] |= x<<sh;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   293
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   294
				sh += k;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   295
				if (sh >= DB) sh -= DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   296
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   297
			if (!unsigned && (value[0]&0x80)==0x80) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   298
				s = -1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   299
				if (sh > 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   300
					a[t-1] |= ((1<<(DB-sh))-1)<<sh;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   301
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   302
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   303
			clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   304
			value.position = Math.min(p+length,value.length);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   305
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   306
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   307
		 * clamp off excess high words
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   308
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   309
		bi_internal function clamp():void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   310
			var c:int = s&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   311
			while (t>0 && a[t-1]==c) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   312
				--t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   313
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   314
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   315
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   316
		 * r = this << n*DB
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   317
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   318
		bi_internal function dlShiftTo(n:int, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   319
			var i:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   320
			for (i=t-1; i>=0; --i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   321
				r.a[i+n] = a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   322
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   323
			for (i=n-1; i>=0; --i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   324
				r.a[i] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   325
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   326
			r.t = t+n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   327
			r.s = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   328
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   329
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   330
		 * r = this >> n*DB
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   331
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   332
		bi_internal function drShiftTo(n:int, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   333
			var i:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   334
			for (i=n; i<t; ++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   335
				r.a[i-n] = a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   336
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   337
			r.t = Math.max(t-n,0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   338
			r.s = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   339
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   340
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   341
		 * r = this << n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   342
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   343
		bi_internal function lShiftTo(n:int, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   344
			var bs:int = n%DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   345
			var cbs:int = DB-bs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   346
			var bm:int = (1<<cbs)-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   347
			var ds:int = n/DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   348
			var c:int = (s<<bs)&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   349
			var i:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   350
			for (i=t-1; i>=0; --i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   351
				r.a[i+ds+1] = (a[i]>>cbs)|c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   352
				c = (a[i]&bm)<<bs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   353
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   354
			for (i=ds-1; i>=0; --i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   355
				r.a[i] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   356
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   357
			r.a[ds] = c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   358
			r.t = t+ds+1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   359
			r.s = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   360
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   361
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   362
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   363
		 * r = this >> n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   364
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   365
		bi_internal function rShiftTo(n:int, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   366
			r.s = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   367
			var ds:int = n/DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   368
			if (ds >= t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   369
				r.t = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   370
				return;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   371
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   372
			var bs:int = n%DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   373
			var cbs:int = DB-bs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   374
			var bm:int = (1<<bs)-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   375
			r.a[0] = a[ds]>>bs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   376
			var i:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   377
			for (i=ds+1; i<t; ++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   378
				r.a[i-ds-1] |= (a[i]&bm)<<cbs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   379
				r.a[i-ds] = a[i]>>bs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   380
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   381
			if (bs>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   382
				r.a[t-ds-1] |= (s&bm)<<cbs;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   383
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   384
			r.t = t-ds;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   385
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   386
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   387
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   388
		 * r = this - v
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   389
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   390
		bi_internal function subTo(v:BigInteger, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   391
			var i:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   392
			var c:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   393
			var m:int = Math.min(v.t, t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   394
			while (i<m) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   395
				c += a[i] - v.a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   396
				r.a[i++] = c & DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   397
				c >>= DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   398
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   399
			if (v.t < t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   400
				c -= v.s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   401
				while (i< t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   402
					c+= a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   403
					r.a[i++] = c&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   404
					c >>= DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   405
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   406
				c += s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   407
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   408
				c += s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   409
				while (i < v.t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   410
					c -= v.a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   411
					r.a[i++] = c&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   412
					c >>= DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   413
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   414
				c -= v.s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   415
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   416
			r.s = (c<0)?-1:0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   417
			if (c<-1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   418
				r.a[i++] = DV+c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   419
			} else if (c>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   420
				r.a[i++] = c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   421
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   422
			r.t = i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   423
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   424
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   425
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   426
		 * am: Compute w_j += (x*this_i), propagates carries,
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   427
		 * c is initial carry, returns final carry.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   428
		 * c < 3*dvalue, x < 2*dvalue, this_i < dvalue
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   429
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   430
		bi_internal function am(i:int,x:int,w:BigInteger,j:int,c:int,n:int):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   431
			var xl:int = x&0x7fff;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   432
			var xh:int = x>>15;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   433
			while(--n >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   434
				var l:int = a[i]&0x7fff;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   435
				var h:int = a[i++]>>15;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   436
				var m:int = xh*l + h*xl;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   437
				l = xl*l + ((m&0x7fff)<<15)+w.a[j]+(c&0x3fffffff);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   438
				c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   439
				w.a[j++] = l&0x3fffffff;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   440
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   441
			return c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   442
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   443
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   444
		 * r = this * v, r != this,a (HAC 14.12)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   445
		 * "this" should be the larger one if appropriate
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   446
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   447
		bi_internal function multiplyTo(v:BigInteger, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   448
			var x:BigInteger = abs();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   449
			var y:BigInteger = v.abs();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   450
			var i:int = x.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   451
			r.t = i+y.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   452
			while (--i >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   453
				r.a[i] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   454
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   455
			for (i=0; i<y.t; ++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   456
				r.a[i+x.t] = x.am(0, y.a[i], r, i, 0, x.t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   457
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   458
			r.s = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   459
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   460
			if (s!=v.s) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   461
				ZERO.subTo(r, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   462
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   463
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   464
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   465
		 * r = this^2, r != this (HAC 14.16)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   466
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   467
		bi_internal function squareTo(r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   468
			var x:BigInteger = abs();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   469
			var i:int = r.t = 2*x.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   470
			while (--i>=0) r.a[i] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   471
			for (i=0; i<x.t-1; ++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   472
				var c:int = x.am(i, x.a[i], r, 2*i, 0, 1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   473
				if ((r.a[i+x.t] += x.am(i+1, 2*x.a[i], r, 2*i+1, c, x.t-i-1)) >= DV) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   474
					r.a[i+x.t] -= DV;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   475
					r.a[i+x.t+1] = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   476
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   477
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   478
			if (r.t>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   479
				r.a[r.t-1] += x.am(i, x.a[i], r, 2*i, 0, 1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   480
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   481
			r.s = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   482
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   483
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   484
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   485
		 * divide this by m, quotient and remainder to q, r (HAC 14.20)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   486
		 * r != q, this != m. q or r may be null.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   487
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   488
		bi_internal function divRemTo(m:BigInteger, q:BigInteger = null, r:BigInteger = null):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   489
			var pm:BigInteger = m.abs();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   490
			if (pm.t <= 0) return;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   491
			var pt:BigInteger = abs();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   492
			if (pt.t < pm.t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   493
				if (q!=null) q.fromInt(0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   494
				if (r!=null) copyTo(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   495
				return;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   496
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   497
			if (r==null) r = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   498
			var y:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   499
			var ts:int = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   500
			var ms:int = m.s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   501
			var nsh:int = DB-nbits(pm.a[pm.t-1]); // normalize modulus
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   502
			if (nsh>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   503
				pm.lShiftTo(nsh, y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   504
				pt.lShiftTo(nsh, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   505
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   506
				pm.copyTo(y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   507
				pt.copyTo(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   508
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   509
			var ys:int = y.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   510
			var y0:int = y.a[ys-1];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   511
			if (y0==0) return;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   512
			var yt:Number = y0*(1<<F1)+((ys>1)?y.a[ys-2]>>F2:0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   513
			var d1:Number = FV/yt;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   514
			var d2:Number = (1<<F1)/yt;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   515
			var e:Number = 1<<F2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   516
			var i:int = r.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   517
			var j:int = i-ys;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   518
			var t:BigInteger = (q==null)?nbi():q;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   519
			y.dlShiftTo(j,t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   520
			if (r.compareTo(t)>=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   521
				r.a[r.t++] = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   522
				r.subTo(t,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   523
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   524
			ONE.dlShiftTo(ys,t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   525
			t.subTo(y,y); // "negative" y so we can replace sub with am later.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   526
			while(y.t<ys) y.(y.t++, 0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   527
			while(--j >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   528
				// Estimate quotient digit
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   529
				var qd:int = (r.a[--i]==y0)?DM:Number(r.a[i])*d1+(Number(r.a[i-1])+e)*d2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   530
				if ((r.a[i]+= y.am(0, qd, r, j, 0, ys))<qd) { // Try it out
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   531
					y.dlShiftTo(j, t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   532
					r.subTo(t,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   533
					while (r.a[i]<--qd) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   534
						r.subTo(t,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   535
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   536
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   537
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   538
			if (q!=null) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   539
				r.drShiftTo(ys,q);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   540
				if (ts!=ms) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   541
					ZERO.subTo(q,q);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   542
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   543
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   544
			r.t = ys;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   545
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   546
			if (nsh>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   547
				r.rShiftTo(nsh, r); // Denormalize remainder
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   548
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   549
			if (ts<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   550
				ZERO.subTo(r,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   551
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   552
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   553
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   554
		 * return "-1/this % 2^DB"; useful for Mont. reduction
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   555
		 * justification:
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   556
		 *         xy == 1 (mod n)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   557
		 *         xy =  1+km
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   558
		 * 	 xy(2-xy) = (1+km)(1-km)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   559
		 * x[y(2-xy)] =  1-k^2.m^2
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   560
		 * x[y(2-xy)] == 1 (mod m^2)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   561
		 * if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   562
		 * should reduce x and y(2-xy) by m^2 at each step to keep size bounded
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   563
		 * [XXX unit test the living shit out of this.]
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   564
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   565
		bi_internal function invDigit():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   566
			if (t<1) return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   567
			var x:int = a[0];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   568
			if ((x&1)==0) return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   569
			var y:int = x&3; 							// y == 1/x mod 2^2
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   570
			y = (y*(2-(x&0xf )*y))             &0xf;	// y == 1/x mod 2^4
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   571
			y = (y*(2-(x&0xff)*y))             &0xff;	// y == 1/x mod 2^8
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   572
			y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;	// y == 1/x mod 2^16
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   573
			// last step - calculate inverse mod DV directly;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   574
			// assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   575
			// XXX 48 bit ints? Whaaaa? is there an implicit float conversion in here?
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   576
			y = (y*(2-x*y%DV))%DV;	// y == 1/x mod 2^dbits
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   577
			// we really want the negative inverse, and -DV < y < DV
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   578
			return (y>0)?DV-y:-y;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   579
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   580
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   581
		 * true iff this is even
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   582
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   583
		bi_internal function isEven():Boolean {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   584
			return ((t>0)?(a[0]&1):s) == 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   585
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   586
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   587
		 * this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   588
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   589
		bi_internal function exp(e:int, z:IReduction):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   590
			if (e > 0xffffffff || e < 1) return ONE;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   591
			var r:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   592
			var r2:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   593
			var g:BigInteger = z.convert(this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   594
			var i:int = nbits(e)-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   595
			g.copyTo(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   596
			while(--i>=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   597
				z.sqrTo(r, r2);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   598
				if ((e&(1<<i))>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   599
					z.mulTo(r2,g,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   600
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   601
					var t:BigInteger = r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   602
					r = r2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   603
					r2 = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   604
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   605
				
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   606
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   607
			return z.revert(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   608
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   609
		bi_internal function intAt(str:String, index:int):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   610
			return parseInt(str.charAt(index), 36);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   611
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   612
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   613
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   614
		protected function nbi():* {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   615
			return new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   616
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   617
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   618
		 * return bigint initialized to value
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   619
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   620
		public static function nbv(value:int):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   621
			var bn:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   622
			bn.fromInt(value);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   623
			return bn;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   624
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   625
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   626
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   627
		// Functions above are sufficient for RSA encryption.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   628
		// The stuff below is useful for decryption and key generation
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   629
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   630
		public static const lowprimes:Array = [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];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   631
		public static const lplim:int = (1<<26)/lowprimes[lowprimes.length-1];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   632
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   633
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   634
		public function clone():BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   635
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   636
			this.copyTo(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   637
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   638
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   639
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   640
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   641
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   642
		 * @return value as integer
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   643
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   644
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   645
		public function intValue():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   646
			if (s<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   647
				if (t==1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   648
					return a[0]-DV;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   649
				} else if (t==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   650
					return -1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   651
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   652
			} else if (t==1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   653
				return a[0];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   654
			} else if (t==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   655
				return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   656
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   657
			// assumes 16 < DB < 32
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   658
			return  ((a[1]&((1<<(32-DB))-1))<<DB)|a[0];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   659
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   660
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   661
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   662
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   663
		 * @return value as byte
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   664
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   665
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   666
		public function byteValue():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   667
			return (t==0)?s:(a[0]<<24)>>24;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   668
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   669
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   670
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   671
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   672
		 * @return value as short (assumes DB>=16)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   673
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   674
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   675
		public function shortValue():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   676
			return (t==0)?s:(a[0]<<16)>>16;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   677
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   678
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   679
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   680
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   681
		 * @param r
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   682
		 * @return x s.t. r^x < DV
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   683
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   684
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   685
		protected function chunkSize(r:Number):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   686
			return Math.floor(Math.LN2*DB/Math.log(r));
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   687
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   688
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   689
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   690
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   691
		 * @return 0 if this ==0, 1 if this >0
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   692
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   693
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   694
		public function sigNum():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   695
			if (s<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   696
				return -1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   697
			} else if (t<=0 || (t==1 && a[0]<=0)) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   698
				return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   699
			} else{
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   700
				return 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   701
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   702
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   703
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   704
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   705
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   706
		 * @param b: radix to use
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   707
		 * @return a string representing the integer converted to the radix.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   708
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   709
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   710
		protected function toRadix(b:uint=10):String {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   711
			if (sigNum()==0 || b<2 || b>32) return "0";
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   712
			var cs:int = chunkSize(b);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   713
			var a:Number = Math.pow(b, cs);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   714
			var d:BigInteger = nbv(a);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   715
			var y:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   716
			var z:BigInteger = nbi();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   717
			var r:String = "";
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   718
			divRemTo(d, y, z);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   719
			while (y.sigNum()>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   720
				r = (a+z.intValue()).toString(b).substr(1) + r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   721
				y.divRemTo(d,y,z);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   722
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   723
			return z.intValue().toString(b) + r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   724
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   725
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   726
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   727
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   728
		 * @param s a string to convert from using radix.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   729
		 * @param b a radix
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   730
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   731
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   732
		protected function fromRadix(s:String, b:int = 10):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   733
			fromInt(0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   734
			var cs:int = chunkSize(b);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   735
			var d:Number = Math.pow(b, cs);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   736
			var mi:Boolean = false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   737
			var j:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   738
			var w:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   739
			for (var i:int=0;i<s.length;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   740
				var x:int = intAt(s, i);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   741
				if (x<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   742
					if (s.charAt(i) == "-" && sigNum() == 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   743
						mi = true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   744
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   745
					continue;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   746
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   747
				w = b*w+x;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   748
				if (++j >= cs) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   749
					dMultiply(d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   750
					dAddOffset(w,0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   751
					j=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   752
					w=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   753
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   754
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   755
			if (j>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   756
				dMultiply(Math.pow(b,j));
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   757
				dAddOffset(w,0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   758
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   759
			if (mi) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   760
				BigInteger.ZERO.subTo(this, this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   761
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   762
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   763
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   764
		// XXX function fromNumber not written yet.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   765
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   766
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   767
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   768
		 * @return a byte array.
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   769
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   770
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   771
		public function toByteArray():ByteArray {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   772
			var i:int = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   773
			var r:ByteArray = new ByteArray;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   774
			r[0] = s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   775
			var p:int = DB-(i*DB)%8;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   776
			var d:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   777
			var k:int=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   778
			if (i-->0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   779
				if (p<DB && (d=a[i]>>p)!=(s&DM)>>p) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   780
					r[k++] = d|(s<<(DB-p));
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   781
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   782
				while (i>=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   783
					if(p<8) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   784
						d = (a[i]&((1<<p)-1))<<(8-p);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   785
						d|= a[--i]>>(p+=DB-8);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   786
					} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   787
						d = (a[i]>>(p-=8))&0xff;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   788
						if (p<=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   789
							p += DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   790
							--i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   791
						}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   792
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   793
					if ((d&0x80)!=0) d|=-256;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   794
					if (k==0 && (s&0x80)!=(d&0x80)) ++k;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   795
					if (k>0 || d!=s) r[k++] = d;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   796
				} 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   797
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   798
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   799
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   800
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   801
		public function equals(a:BigInteger):Boolean {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   802
			return compareTo(a)==0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   803
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   804
		public function min(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   805
			return (compareTo(a)<0)?this:a;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   806
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   807
		public function max(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   808
			return (compareTo(a)>0)?this:a;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   809
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   810
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   811
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   812
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   813
		 * @param a	a BigInteger to perform the operation with
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   814
		 * @param op a Function implementing the operation
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   815
		 * @param r a BigInteger to store the result of the operation
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   816
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   817
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   818
		protected function bitwiseTo(a:BigInteger, op:Function, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   819
			var i:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   820
			var f:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   821
			var m:int = Math.min(a.t, t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   822
			for (i=0; i<m; ++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   823
				r.a[i] = op(this.a[i],a.a[i]);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   824
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   825
			if (a.t<t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   826
				f = a.s&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   827
				for (i=m;i<t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   828
					r.a[i] = op(this.a[i],f);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   829
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   830
				r.t = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   831
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   832
				f = s&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   833
				for (i=m;i<a.t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   834
					r.a[i] = op(f,a.a[i]);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   835
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   836
				r.t = a.t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   837
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   838
			r.s = op(s, a.s);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   839
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   840
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   841
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   842
		private function op_and(x:int, y:int):int {return x&y;}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   843
		public function and(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   844
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   845
			bitwiseTo(a, op_and, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   846
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   847
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   848
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   849
		private function op_or(x:int, y:int):int {return x|y;}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   850
		public function or(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   851
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   852
			bitwiseTo(a, op_or, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   853
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   854
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   855
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   856
		private function op_xor(x:int, y:int):int {return x^y;}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   857
		public function xor(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   858
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   859
			bitwiseTo(a, op_xor, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   860
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   861
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   862
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   863
		private function op_andnot(x:int, y:int):int { return x&~y;}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   864
		public function andNot(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   865
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   866
			bitwiseTo(a, op_andnot, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   867
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   868
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   869
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   870
		public function not():BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   871
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   872
			for (var i:int=0;i<t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   873
				r[i] = DM&~a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   874
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   875
			r.t = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   876
			r.s = ~s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   877
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   878
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   879
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   880
		public function shiftLeft(n:int):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   881
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   882
			if (n<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   883
				rShiftTo(-n, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   884
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   885
				lShiftTo(n, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   886
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   887
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   888
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   889
		public function shiftRight(n:int):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   890
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   891
			if (n<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   892
				lShiftTo(-n, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   893
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   894
				rShiftTo(n, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   895
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   896
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   897
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   898
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   899
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   900
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   901
		 * @param x
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   902
		 * @return index of lowet 1-bit in x, x < 2^31
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   903
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   904
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   905
		private function lbit(x:int):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   906
			if (x==0) return -1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   907
			var r:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   908
			if ((x&0xffff)==0) { x>>= 16; r += 16; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   909
			if ((x&0xff) == 0) { x>>=  8; r +=  8; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   910
			if ((x&0xf)  == 0) { x>>=  4; r +=  4; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   911
			if ((x&0x3)  == 0) { x>>=  2; r +=  2; }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   912
			if ((x&0x1)  == 0) ++r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   913
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   914
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   915
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   916
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   917
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   918
		 * @return index of lowest 1-bit (or -1 if none)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   919
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   920
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   921
		public function getLowestSetBit():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   922
			for (var i:int=0;i<t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   923
				if (a[i]!=0) return i*DB+lbit(a[i]);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   924
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   925
			if (s<0) return t*DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   926
			return -1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   927
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   928
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   929
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   930
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   931
		 * @param x
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   932
		 * @return number of 1 bits in x
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   933
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   934
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   935
		private function cbit(x:int):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   936
			var r:uint =0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   937
			while (x!=0) { x &= x-1; ++r }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   938
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   939
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   940
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   941
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   942
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   943
		 * @return number of set bits
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   944
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   945
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   946
		public function bitCount():int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   947
			var r:int=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   948
			var x:int = s&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   949
			for (var i:int=0;i<t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   950
				r += cbit(a[i]^x);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   951
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   952
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   953
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   954
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   955
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   956
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   957
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   958
		 * @return true iff nth bit is set
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   959
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   960
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   961
		public function testBit(n:int):Boolean {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   962
			var j:int = Math.floor(n/DB);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   963
			if (j>=t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   964
				return s!=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   965
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   966
			return ((a[j]&(1<<(n%DB)))!=0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   967
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   968
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   969
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   970
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   971
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   972
		 * @param op
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   973
		 * @return this op (1<<n)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   974
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   975
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   976
		protected function changeBit(n:int,op:Function):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   977
			var r:BigInteger = BigInteger.ONE.shiftLeft(n);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   978
			bitwiseTo(r, op, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   979
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   980
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   981
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   982
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   983
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   984
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   985
		 * @return this | (1<<n)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   986
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   987
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   988
		public function setBit(n:int):BigInteger { return changeBit(n, op_or); }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   989
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   990
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   991
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   992
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   993
		 * @return this & ~(1<<n)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   994
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   995
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   996
		public function clearBit(n:int):BigInteger { return changeBit(n, op_andnot); }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   997
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   998
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
   999
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1000
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1001
		 * @return this ^ (1<<n)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1002
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1003
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1004
		public function flipBit(n:int):BigInteger { return changeBit(n, op_xor); }
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1005
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1006
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1007
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1008
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1009
		 * @param r = this + a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1010
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1011
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1012
		protected function addTo(a:BigInteger, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1013
			var i:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1014
			var c:int = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1015
			var m:int = Math.min(a.t, t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1016
			while (i<m) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1017
				c += this.a[i] + a.a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1018
				r.a[i++] = c&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1019
				c>>=DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1020
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1021
			if (a.t < t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1022
				c += a.s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1023
				while (i<t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1024
					c += this.a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1025
					r.a[i++] = c&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1026
					c >>= DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1027
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1028
				c += s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1029
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1030
				c += s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1031
				while (i<a.t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1032
					c += a.a[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1033
					r.a[i++] = c&DM;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1034
					c >>= DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1035
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1036
				c += a.s;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1037
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1038
			r.s = (c<0)?-1:0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1039
			if (c>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1040
				r.a[i++] = c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1041
			} else if (c<-1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1042
				r.a[i++] = DV+c;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1043
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1044
			r.t = i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1045
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1046
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1047
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1048
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1049
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1050
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1051
		 * @return this + a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1052
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1053
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1054
		public function add(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1055
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1056
			addTo(a,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1057
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1058
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1059
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1060
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1061
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1062
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1063
		 * @return this - a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1064
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1065
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1066
		public function subtract(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1067
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1068
			subTo(a,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1069
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1070
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1071
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1072
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1073
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1074
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1075
		 * @return this * a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1076
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1077
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1078
		public function multiply(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1079
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1080
			multiplyTo(a,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1081
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1082
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1083
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1084
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1085
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1086
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1087
		 * @return this / a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1088
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1089
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1090
		public function divide(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1091
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1092
			divRemTo(a, r, null);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1093
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1094
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1095
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1096
		public function remainder(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1097
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1098
			divRemTo(a, null, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1099
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1100
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1101
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1102
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1103
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1104
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1105
		 * @return [this/a, this%a]
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1106
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1107
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1108
		public function divideAndRemainder(a:BigInteger):Array {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1109
			var q:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1110
			var r:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1111
			divRemTo(a, q, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1112
			return [q,r];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1113
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1114
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1115
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1116
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1117
		 * this *= n, this >=0, 1 < n < DV
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1118
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1119
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1120
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1121
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1122
		bi_internal function dMultiply(n:int):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1123
			a[t] = am(0, n-1, this, 0, 0, t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1124
			++t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1125
			clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1126
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1127
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1128
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1129
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1130
		 * this += n << w words, this >= 0
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1131
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1132
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1133
		 * @param w
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1134
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1135
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1136
		bi_internal function dAddOffset(n:int, w:int):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1137
			while (t<=w) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1138
				a[t++] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1139
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1140
			a[w] += n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1141
			while (a[w] >= DV) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1142
				a[w] -= DV;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1143
				if (++w >= t) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1144
					a[t++] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1145
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1146
				++a[w];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1147
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1148
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1149
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1150
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1151
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1152
		 * @param e
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1153
		 * @return this^e
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1154
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1155
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1156
		public function pow(e:int):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1157
			return exp(e, new NullReduction);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1158
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1159
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1160
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1161
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1162
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1163
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1164
		 * @param r = lower n words of "this * a", a.t <= n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1165
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1166
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1167
		bi_internal function multiplyLowerTo(a:BigInteger, n:int, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1168
			var i:int = Math.min(t+a.t, n);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1169
			r.s = 0; // assumes a, this >= 0
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1170
			r.t = i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1171
			while (i>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1172
				r.a[--i]=0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1173
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1174
			var j:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1175
			for (j=r.t-t;i<j;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1176
				r.a[i+t] = am(0, a.a[i], r, i, 0, t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1177
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1178
			for (j=Math.min(a.t,n);i<j;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1179
				am(0, a.a[i], r, i, 0, n-i);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1180
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1181
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1182
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1183
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1184
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1185
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1186
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1187
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1188
		 * @param r = "this * a" without lower n words, n > 0
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1189
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1190
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1191
		bi_internal function multiplyUpperTo(a:BigInteger, n:int, r:BigInteger):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1192
			--n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1193
			var i:int = r.t = t+a.t-n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1194
			r.s = 0; // assumes a,this >= 0
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1195
			while (--i>=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1196
				r.a[i] = 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1197
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1198
			for (i=Math.max(n-t,0);i<a.t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1199
				r.a[t+i-n] = am(n-i, a.a[i], r, 0, 0, t+i-n);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1200
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1201
			r.clamp();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1202
			r.drShiftTo(1,r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1203
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1204
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1205
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1206
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1207
		 * @param e
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1208
		 * @param m
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1209
		 * @return this^e % m (HAC 14.85)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1210
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1211
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1212
		public function modPow(e:BigInteger, m:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1213
			var i:int = e.bitLength();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1214
			var k:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1215
			var r:BigInteger = nbv(1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1216
			var z:IReduction;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1217
			
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1218
			if (i<=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1219
				return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1220
			} else if (i<18) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1221
				k=1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1222
			} else if (i<48) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1223
				k=3;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1224
			} else if (i<144) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1225
				k=4;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1226
			} else if (i<768) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1227
				k=5;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1228
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1229
				k=6;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1230
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1231
			if (i<8) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1232
				z = new ClassicReduction(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1233
			} else if (m.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1234
				z = new BarrettReduction(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1235
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1236
				z = new MontgomeryReduction(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1237
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1238
			// precomputation
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1239
			var g:Array = [];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1240
			var n:int = 3;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1241
			var k1:int = k-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1242
			var km:int = (1<<k)-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1243
			g[1] = z.convert(this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1244
			if (k > 1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1245
				var g2:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1246
				z.sqrTo(g[1], g2);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1247
				while (n<=km) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1248
					g[n] = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1249
					z.mulTo(g2, g[n-2], g[n]);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1250
					n += 2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1251
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1252
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1253
			
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1254
			var j:int = e.t-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1255
			var w:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1256
			var is1:Boolean = true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1257
			var r2:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1258
			var t:BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1259
			i = nbits(e.a[j])-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1260
			while (j>=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1261
				if (i>=k1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1262
					w = (e.a[j]>>(i-k1))&km;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1263
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1264
					w = (e.a[j]&((1<<(i+1))-1))<<(k1-i);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1265
					if (j>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1266
						w |= e.a[j-1]>>(DB+i-k1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1267
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1268
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1269
				n = k;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1270
				while ((w&1)==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1271
					w >>= 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1272
					--n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1273
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1274
				if ((i -= n) <0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1275
					i += DB;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1276
					--j;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1277
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1278
				if (is1) { // ret == 1, don't bother squaring or multiplying it
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1279
					g[w].copyTo(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1280
					is1 = false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1281
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1282
					while (n>1) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1283
						z.sqrTo(r, r2);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1284
						z.sqrTo(r2, r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1285
						n -= 2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1286
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1287
					if (n>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1288
						z.sqrTo(r, r2);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1289
					} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1290
						t = r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1291
						r = r2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1292
						r2 = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1293
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1294
					z.mulTo(r2, g[w], r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1295
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1296
				while (j>=0 && (e.a[j]&(1<<i)) == 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1297
					z.sqrTo(r, r2);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1298
					t = r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1299
					r = r2;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1300
					r2 = t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1301
					if (--i<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1302
						i = DB-1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1303
						--j;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1304
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1305
					
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1306
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1307
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1308
			return z.revert(r);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1309
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1310
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1311
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1312
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1313
		 * @param a
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1314
		 * @return gcd(this, a) (HAC 14.54)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1315
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1316
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1317
		public function gcd(a:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1318
			var x:BigInteger = (s<0)?negate():clone();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1319
			var y:BigInteger = (a.s<0)?a.negate():a.clone();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1320
			if (x.compareTo(y)<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1321
				var t:BigInteger=x;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1322
				x=y;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1323
				y=t;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1324
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1325
			var i:int = x.getLowestSetBit();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1326
			var g:int = y.getLowestSetBit();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1327
			if (g<0) return x;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1328
			if (i<g) g= i;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1329
			if (g>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1330
				x.rShiftTo(g, x);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1331
				y.rShiftTo(g, y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1332
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1333
			while (x.sigNum()>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1334
				if ((i = x.getLowestSetBit()) >0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1335
					x.rShiftTo(i, x);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1336
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1337
				if ((i = y.getLowestSetBit()) >0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1338
					y.rShiftTo(i, y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1339
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1340
				if (x.compareTo(y) >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1341
					x.subTo(y, x);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1342
					x.rShiftTo(1, x);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1343
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1344
					y.subTo(x, y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1345
					y.rShiftTo(1, y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1346
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1347
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1348
			if (g>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1349
				y.lShiftTo(g, y);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1350
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1351
			return y;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1352
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1353
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1354
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1355
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1356
		 * @param n
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1357
		 * @return this % n, n < 2^DB
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1358
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1359
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1360
		protected function modInt(n:int):int {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1361
			if (n<=0) return 0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1362
			var d:int = DV%n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1363
			var r:int = (s<0)?n-1:0;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1364
			if (t>0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1365
				if (d==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1366
					r = a[0]%n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1367
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1368
					for (var i:int=t-1;i>=0;--i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1369
						r = (d*r+a[i])%n;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1370
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1371
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1372
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1373
			return r;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1374
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1375
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1376
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1377
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1378
		 * @param m
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1379
		 * @return 1/this %m (HAC 14.61)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1380
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1381
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1382
		public function modInverse(m:BigInteger):BigInteger {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1383
			var ac:Boolean = m.isEven();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1384
			if ((isEven()&&ac) || m.sigNum()==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1385
				return BigInteger.ZERO;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1386
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1387
			var u:BigInteger = m.clone();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1388
			var v:BigInteger = clone();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1389
			var a:BigInteger = nbv(1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1390
			var b:BigInteger = nbv(0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1391
			var c:BigInteger = nbv(0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1392
			var d:BigInteger = nbv(1);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1393
			while (u.sigNum()!=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1394
				while (u.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1395
					u.rShiftTo(1,u);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1396
					if (ac) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1397
						if (!a.isEven() || !b.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1398
							a.addTo(this,a);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1399
							b.subTo(m,b);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1400
						}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1401
						a.rShiftTo(1,a);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1402
					} else if (!b.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1403
						b.subTo(m,b);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1404
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1405
					b.rShiftTo(1,b);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1406
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1407
				while (v.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1408
					v.rShiftTo(1,v);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1409
					if (ac) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1410
						if (!c.isEven() || !d.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1411
							c.addTo(this,c);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1412
							d.subTo(m,d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1413
						}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1414
						c.rShiftTo(1,c);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1415
					} else if (!d.isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1416
						d.subTo(m,d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1417
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1418
					d.rShiftTo(1,d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1419
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1420
				if (u.compareTo(v)>=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1421
					u.subTo(v,u);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1422
					if (ac) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1423
						a.subTo(c,a);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1424
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1425
					b.subTo(d,b);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1426
				} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1427
					v.subTo(u,v);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1428
					if (ac) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1429
						c.subTo(a,c);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1430
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1431
					d.subTo(b,d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1432
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1433
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1434
			if (v.compareTo(BigInteger.ONE) != 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1435
				return BigInteger.ZERO;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1436
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1437
			if (d.compareTo(m) >= 0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1438
				return d.subtract(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1439
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1440
			if (d.sigNum()<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1441
				d.addTo(m,d);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1442
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1443
				return d;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1444
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1445
			if (d.sigNum()<0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1446
				return d.add(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1447
			} else {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1448
				return d;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1449
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1450
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1451
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1452
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1453
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1454
		 * @param t
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1455
		 * @return primality with certainty >= 1-.5^t
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1456
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1457
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1458
		public function isProbablePrime(t:int):Boolean {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1459
			var i:int;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1460
			var x:BigInteger = abs();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1461
			if (x.t == 1 && x.a[0]<=lowprimes[lowprimes.length-1]) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1462
				for (i=0;i<lowprimes.length;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1463
					if (x[0]==lowprimes[i]) return true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1464
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1465
				return false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1466
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1467
			if (x.isEven()) return false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1468
			i = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1469
			while (i<lowprimes.length) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1470
				var m:int = lowprimes[i];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1471
				var j:int = i+1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1472
				while (j<lowprimes.length && m<lplim) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1473
					m *= lowprimes[j++];
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1474
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1475
				m = x.modInt(m);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1476
				while (i<j) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1477
					if (m%lowprimes[i++]==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1478
						return false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1479
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1480
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1481
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1482
			return x.millerRabin(t);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1483
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1484
		
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1485
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1486
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1487
		 * @param t
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1488
		 * @return true if probably prime (HAC 4.24, Miller-Rabin)
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1489
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1490
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1491
		protected function millerRabin(t:int):Boolean {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1492
			var n1:BigInteger = subtract(BigInteger.ONE);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1493
			var k:int = n1.getLowestSetBit();
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1494
			if (k<=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1495
				return false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1496
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1497
			var r:BigInteger = n1.shiftRight(k);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1498
			t = (t+1)>>1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1499
			if (t>lowprimes.length) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1500
				t = lowprimes.length;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1501
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1502
			var a:BigInteger = new BigInteger;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1503
			for (var i:int=0;i<t;++i) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1504
				a.fromInt(lowprimes[i]);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1505
				var y:BigInteger = a.modPow(r, this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1506
				if (y.compareTo(BigInteger.ONE)!=0 && y.compareTo(n1)!=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1507
					var j:int = 1;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1508
					while (j++<k && y.compareTo(n1)!=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1509
						y = y.modPowInt(2, this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1510
						if (y.compareTo(BigInteger.ONE)==0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1511
							return false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1512
						}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1513
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1514
					if (y.compareTo(n1)!=0) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1515
						return false;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1516
					}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1517
				}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1518
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1519
			return true;
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1520
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1521
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1522
		/**
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1523
		 * Tweak our BigInteger until it looks prime enough
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1524
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1525
		 * @param bits
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1526
		 * @param t
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1527
		 * 
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1528
		 */
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1529
		public function primify(bits:int, t:int):void {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1530
			if (!testBit(bits-1)) {	// force MSB set
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1531
				bitwiseTo(BigInteger.ONE.shiftLeft(bits-1), op_or, this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1532
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1533
			if (isEven()) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1534
				dAddOffset(1,0);	// force odd
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1535
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1536
			while (!isProbablePrime(t)) {
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1537
				dAddOffset(2,0);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1538
				while(bitLength()>bits) subTo(BigInteger.ONE.shiftLeft(bits-1),this);
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1539
			}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1540
		}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1541
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1542
	}
436a31d11f1d Ajout du streaming des tweets par WebSocket
Raphael Velt <raph.velt@gmail.com>
parents:
diff changeset
  1543
}