亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? biginteger.cs

?? JAVA實現的RSA公鑰加密方法
?? CS
?? 第 1 頁 / 共 5 頁
字號:

				ulong carry = 0;
				for(int i = bufLen - 1; i >= 0; i--)
				{
					ulong val = ((ulong)buffer[i]) >> shiftAmount;
					val |= carry;

					carry = ((ulong)buffer[i]) << invShift;
					buffer[i] = (uint)(val);
				}

				count -= shiftAmount;
			}

			while(bufLen > 1 && buffer[bufLen-1] == 0)
				bufLen--;

			return bufLen;
		}


		//***********************************************************************
		// Overloading of the NOT operator (1's complement)
		//***********************************************************************

		public static BigInteger operator ~(BigInteger bi1)
		{
			BigInteger result = new BigInteger(bi1);

			for(int i = 0; i < maxLength; i++)
				result.data[i] = (uint)(~(bi1.data[i]));

			result.dataLength = maxLength;

			while(result.dataLength > 1 && result.data[result.dataLength-1] == 0)
				result.dataLength--;

			return result;
		}


		//***********************************************************************
		// Overloading of the NEGATE operator (2's complement)
		//***********************************************************************

		public static BigInteger operator -(BigInteger bi1)
		{
			// handle neg of zero separately since it'll cause an overflow
			// if we proceed.

			if(bi1.dataLength == 1 && bi1.data[0] == 0)
				return (new BigInteger());

			BigInteger result = new BigInteger(bi1);

			// 1's complement
			for(int i = 0; i < maxLength; i++)
				result.data[i] = (uint)(~(bi1.data[i]));

			// add one to result of 1's complement
			long val, carry = 1;
			int index = 0;

			while(carry != 0 && index < maxLength)
			{
				val = (long)(result.data[index]);
				val++;

				result.data[index] = (uint)(val & 0xFFFFFFFF);
				carry = val >> 32;

				index++;
			}

			if((bi1.data[maxLength-1] & 0x80000000) == (result.data[maxLength-1] & 0x80000000))
				throw (new ArithmeticException("Overflow in negation.\n"));

			result.dataLength = maxLength;

			while(result.dataLength > 1 && result.data[result.dataLength-1] == 0)
				result.dataLength--;
			return result;
		}


		//***********************************************************************
		// Overloading of equality operator
		//***********************************************************************

		public static bool operator ==(BigInteger bi1, BigInteger bi2)
		{
			return bi1.Equals(bi2);
		}


		public static bool operator !=(BigInteger bi1, BigInteger bi2)
		{
			return !(bi1.Equals(bi2));
		}


		public override bool Equals(object o)
		{
			BigInteger bi = (BigInteger)o;

			if(this.dataLength != bi.dataLength)
				return false;

			for(int i = 0; i < this.dataLength; i++)
			{
				if(this.data[i] != bi.data[i])
					return false;
			}
			return true;
		}


		public override int GetHashCode()
		{
			return this.ToString().GetHashCode();
		}


		//***********************************************************************
		// Overloading of inequality operator
		//***********************************************************************

		public static bool operator >(BigInteger bi1, BigInteger bi2)
		{
			int pos = maxLength - 1;

			// bi1 is negative, bi2 is positive
			if((bi1.data[pos] & 0x80000000) != 0 && (bi2.data[pos] & 0x80000000) == 0)
				return false;

				// bi1 is positive, bi2 is negative
			else if((bi1.data[pos] & 0x80000000) == 0 && (bi2.data[pos] & 0x80000000) != 0)
				return true;

			// same sign
			int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
			for(pos = len - 1; pos >= 0 && bi1.data[pos] == bi2.data[pos]; pos--);

			if(pos >= 0)
			{
				if(bi1.data[pos] > bi2.data[pos])
					return true;
				return false;
			}
			return false;
		}


		public static bool operator <(BigInteger bi1, BigInteger bi2)
		{
			int pos = maxLength - 1;

			// bi1 is negative, bi2 is positive
			if((bi1.data[pos] & 0x80000000) != 0 && (bi2.data[pos] & 0x80000000) == 0)
				return true;

				// bi1 is positive, bi2 is negative
			else if((bi1.data[pos] & 0x80000000) == 0 && (bi2.data[pos] & 0x80000000) != 0)
				return false;

			// same sign
			int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
			for(pos = len - 1; pos >= 0 && bi1.data[pos] == bi2.data[pos]; pos--);

			if(pos >= 0)
			{
				if(bi1.data[pos] < bi2.data[pos])
					return true;
				return false;
			}
			return false;
		}


		public static bool operator >=(BigInteger bi1, BigInteger bi2)
		{
			return (bi1 == bi2 || bi1 > bi2);
		}


		public static bool operator <=(BigInteger bi1, BigInteger bi2)
		{
			return (bi1 == bi2 || bi1 < bi2);
		}


		//***********************************************************************
		// Private function that supports the division of two numbers with
		// a divisor that has more than 1 digit.
		//
		// Algorithm taken from [1]
		//***********************************************************************

		private static void multiByteDivide(BigInteger bi1, BigInteger bi2,
			BigInteger outQuotient, BigInteger outRemainder)
		{
			uint[] result = new uint[maxLength];

			int remainderLen = bi1.dataLength + 1;
			uint[] remainder = new uint[remainderLen];

			uint mask = 0x80000000;
			uint val = bi2.data[bi2.dataLength - 1];
			int shift = 0, resultPos = 0;

			while(mask != 0 && (val & mask) == 0)
			{
				shift++; mask >>= 1;
			}

			//Console.WriteLine("shift = {0}", shift);
			//Console.WriteLine("Before bi1 Len = {0}, bi2 Len = {1}", bi1.dataLength, bi2.dataLength);

			for(int i = 0; i < bi1.dataLength; i++)
				remainder[i] = bi1.data[i];
			shiftLeft(remainder, shift);
			bi2 = bi2 << shift;

			/*
				Console.WriteLine("bi1 Len = {0}, bi2 Len = {1}", bi1.dataLength, bi2.dataLength);
				Console.WriteLine("dividend = " + bi1 + "\ndivisor = " + bi2);
				for(int q = remainderLen - 1; q >= 0; q--)
						Console.Write("{0:x2}", remainder[q]);
				Console.WriteLine();
				*/

			int j = remainderLen - bi2.dataLength;
			int pos = remainderLen - 1;

			ulong firstDivisorByte = bi2.data[bi2.dataLength-1];
			ulong secondDivisorByte = bi2.data[bi2.dataLength-2];

			int divisorLen = bi2.dataLength + 1;
			uint[] dividendPart = new uint[divisorLen];

			while(j > 0)
			{
				ulong dividend = ((ulong)remainder[pos] << 32) + (ulong)remainder[pos-1];
				//Console.WriteLine("dividend = {0}", dividend);

				ulong q_hat = dividend / firstDivisorByte;
				ulong r_hat = dividend % firstDivisorByte;

				//Console.WriteLine("q_hat = {0:X}, r_hat = {1:X}", q_hat, r_hat);

				bool done = false;
				while(!done)
				{
					done = true;

					if(q_hat == 0x100000000 ||
						(q_hat * secondDivisorByte) > ((r_hat << 32) + remainder[pos-2]))
					{
						q_hat--;
						r_hat += firstDivisorByte;

						if(r_hat < 0x100000000)
							done = false;
					}
				}

				for(int h = 0; h < divisorLen; h++)
					dividendPart[h] = remainder[pos-h];

				BigInteger kk = new BigInteger(dividendPart);
				BigInteger ss = bi2 * (long)q_hat;

				//Console.WriteLine("ss before = " + ss);
				while(ss > kk)
				{
					q_hat--;
					ss -= bi2;
					//Console.WriteLine(ss);
				}
				BigInteger yy = kk - ss;

				//Console.WriteLine("ss = " + ss);
				//Console.WriteLine("kk = " + kk);
				//Console.WriteLine("yy = " + yy);

				for(int h = 0; h < divisorLen; h++)
					remainder[pos-h] = yy.data[bi2.dataLength-h];

				/*
						Console.WriteLine("dividend = ");
						for(int q = remainderLen - 1; q >= 0; q--)
								Console.Write("{0:x2}", remainder[q]);
						Console.WriteLine("\n************ q_hat = {0:X}\n", q_hat);
						*/

				result[resultPos++] = (uint)q_hat;

				pos--;
				j--;
			}

			outQuotient.dataLength = resultPos;
			int y = 0;
			for(int x = outQuotient.dataLength - 1; x >= 0; x--, y++)
				outQuotient.data[y] = result[x];
			for(; y < maxLength; y++)
				outQuotient.data[y] = 0;

			while(outQuotient.dataLength > 1 && outQuotient.data[outQuotient.dataLength-1] == 0)
				outQuotient.dataLength--;

			if(outQuotient.dataLength == 0)
				outQuotient.dataLength = 1;

			outRemainder.dataLength = shiftRight(remainder, shift);

			for(y = 0; y < outRemainder.dataLength; y++)
				outRemainder.data[y] = remainder[y];
			for(; y < maxLength; y++)
				outRemainder.data[y] = 0;
		}


		//***********************************************************************
		// Private function that supports the division of two numbers with
		// a divisor that has only 1 digit.
		//***********************************************************************

		private static void singleByteDivide(BigInteger bi1, BigInteger bi2,
			BigInteger outQuotient, BigInteger outRemainder)
		{
			uint[] result = new uint[maxLength];
			int resultPos = 0;

			// copy dividend to reminder
			for(int i = 0; i < maxLength; i++)
				outRemainder.data[i] = bi1.data[i];
			outRemainder.dataLength = bi1.dataLength;

			while(outRemainder.dataLength > 1 && outRemainder.data[outRemainder.dataLength-1] == 0)
				outRemainder.dataLength--;

			ulong divisor = (ulong)bi2.data[0];
			int pos = outRemainder.dataLength - 1;
			ulong dividend = (ulong)outRemainder.data[pos];

			//Console.WriteLine("divisor = " + divisor + " dividend = " + dividend);
			//Console.WriteLine("divisor = " + bi2 + "\ndividend = " + bi1);

			if(dividend >= divisor)
			{
				ulong quotient = dividend / divisor;
				result[resultPos++] = (uint)quotient;

				outRemainder.data[pos] = (uint)(dividend % divisor);
			}
			pos--;

			while(pos >= 0)
			{
				//Console.WriteLine(pos);

				dividend = ((ulong)outRemainder.data[pos+1] << 32) + (ulong)outRemainder.data[pos];
				ulong quotient = dividend / divisor;
				result[resultPos++] = (uint)quotient;

				outRemainder.data[pos+1] = 0;
				outRemainder.data[pos--] = (uint)(dividend % divisor);
				//Console.WriteLine(">>>> " + bi1);
			}

			outQuotient.dataLength = resultPos;
			int j = 0;
			for(int i = outQuotient.dataLength - 1; i >= 0; i--, j++)
				outQuotient.data[j] = result[i];
			for(; j < maxLength; j++)
				outQuotient.data[j] = 0;

			while(outQuotient.dataLength > 1 && outQuotient.data[outQuotient.dataLength-1] == 0)
				outQuotient.dataLength--;

			if(outQuotient.dataLength == 0)
				outQuotient.dataLength = 1;

			while(outRemainder.dataLength > 1 && outRemainder.data[outRemainder.dataLength-1] == 0)
				outRemainder.dataLength--;
		}


		//***********************************************************************
		// Overloading of division operator
		//***********************************************************************

		public static BigInteger operator /(BigInteger bi1, BigInteger bi2)
		{
			BigInteger quotient = new BigInteger();
			BigInteger remainder = new BigInteger();

			int lastPos = maxLength-1;
			bool divisorNeg = false, dividendNeg = false;

			if((bi1.data[lastPos] & 0x80000000) != 0)     // bi1 negative
			{
				bi1 = -bi1;
				dividendNeg = true;
			}
			if((bi2.data[lastPos] & 0x80000000) != 0)     // bi2 negative
			{
				bi2 = -bi2;
				divisorNeg = true;
			}

			if(bi1 < bi2)
			{
				return quotient;
			}

			else
			{
				if(bi2.dataLength == 1)
					singleByteDivide(bi1, bi2, quotient, remainder);
				else
					multiByteDivide(bi1, bi2, quotient, remainder);

				if(dividendNeg != divisorNeg)
					return -quotient;

				return quotient;
			}
		}


		//***********************************************************************
		// Overloading of modulus operator
		//***********************************************************************

		public static BigInteger operator %(BigInteger bi1, BigInteger bi2)
		{
			BigInteger quotient = new BigInteger();
			BigInteger remainder = new BigInteger(bi1);

			int lastPos = maxLength-1;
			bool dividendNeg = false;

			if((bi1.data[lastPos] & 0x80000000) != 0)     // bi1 negative
			{
				bi1 = -bi1;
				dividendNeg = true;
			}
			if((bi2.data[lastPos] & 0x80000000) != 0)     // bi2 negative
				bi2 = -bi2;

			if(bi1 < bi2)
			{
				return remainder;
			}

			else
			{
				if(bi2.dataLength == 1)
					singleByteDivide(bi1, bi2, quotient, remainder);
				else
					multiByteDivide(bi1, bi2, quotient, remainder);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩av一区二区三区粉嫩| 日韩女优av电影在线观看| 国产麻豆成人精品| 午夜精品免费在线观看| 亚洲精品欧美激情| 国产精品视频你懂的| www国产精品av| 欧美一区二区三区影视| 色欧美88888久久久久久影院| 国产超碰在线一区| 国产一区二区三区av电影| 日韩精品成人一区二区在线| 一区二区三区免费看视频| 亚洲视频一区在线| 中文字幕在线播放不卡一区| 国产欧美精品一区| 中文字幕va一区二区三区| 精品国产网站在线观看| 日韩欧美国产不卡| 欧美一区二区三区播放老司机| 欧美无乱码久久久免费午夜一区| 色成人在线视频| av亚洲精华国产精华精| aaa亚洲精品| 91视频观看免费| 91成人在线免费观看| 日本高清不卡在线观看| 欧美亚洲动漫精品| 欧洲色大大久久| 欧美日韩一区高清| 91免费精品国自产拍在线不卡| 国产乱国产乱300精品| 国产iv一区二区三区| 狠狠色丁香久久婷婷综合丁香| 天堂在线一区二区| 蜜臀av性久久久久蜜臀av麻豆| 日本特黄久久久高潮| 卡一卡二国产精品| 丰满少妇久久久久久久| 97精品国产97久久久久久久久久久久 | 久久理论电影网| 国产亚洲欧美激情| 国产精品久线在线观看| 亚洲人成在线观看一区二区| 亚洲国产毛片aaaaa无费看| 婷婷中文字幕一区三区| 久久激情综合网| 国产成人免费在线视频| 91视视频在线直接观看在线看网页在线看| 91丨九色丨尤物| 欧美一区二区三区视频免费 | 欧美嫩在线观看| 日韩欧美不卡在线观看视频| 国产视频亚洲色图| 亚洲精选一二三| 蜜桃视频免费观看一区| 国产成人99久久亚洲综合精品| www..com久久爱| 欧美日韩一区二区三区高清 | 久久色在线观看| 中文字幕在线不卡一区| 午夜日韩在线观看| 久久99精品国产.久久久久| 成人丝袜高跟foot| 欧美日韩第一区日日骚| 精品国产一区二区三区忘忧草 | 成人精品视频一区| 欧美日韩一区高清| 国产日本欧洲亚洲| 日日夜夜精品视频天天综合网| 国产成人免费视频一区| 在线看日韩精品电影| 久久综合九色综合欧美就去吻| 日韩毛片视频在线看| 日韩电影免费在线看| 波多野结衣精品在线| 日韩一级二级三级精品视频| 亚洲欧洲性图库| 免费在线观看日韩欧美| 欧美一卡2卡3卡4卡| 国产精品成人免费在线| 日韩国产高清影视| 色综合天天性综合| 欧美精品一区二区三区四区| 中文字幕一区日韩精品欧美| 日欧美一区二区| 91丝袜国产在线播放| 久久综合五月天婷婷伊人| 亚洲影视资源网| 高清国产一区二区三区| 欧美一级片在线| 亚洲在线视频一区| 成人av电影在线| 精品成人一区二区三区| 日精品一区二区三区| 色欲综合视频天天天| 国产精品污网站| 国模套图日韩精品一区二区 | 色哟哟日韩精品| 国产欧美综合在线观看第十页| 青娱乐精品视频| 欧美日韩在线精品一区二区三区激情| 国产三级三级三级精品8ⅰ区| 美国精品在线观看| 欧美日韩精品是欧美日韩精品| 亚洲国产高清在线观看视频| 理论电影国产精品| 欧美人成免费网站| 亚洲国产日产av| 在线视频综合导航| 日韩美女啊v在线免费观看| 成人久久18免费网站麻豆 | 欧美日韩精品一区二区三区| 亚洲欧美经典视频| eeuss鲁一区二区三区| 久久久久亚洲蜜桃| 国产一区二区三区美女| 欧美乱妇一区二区三区不卡视频| 玉足女爽爽91| 色综合久久88色综合天天免费| 国产精品国产三级国产普通话99| 国产不卡免费视频| 中文在线免费一区三区高中清不卡| 久久99热狠狠色一区二区| 日韩欧美一区中文| 看片的网站亚洲| 精品毛片乱码1区2区3区| 久久精品理论片| 精品国产91九色蝌蚪| 国产一区二区三区免费播放| 久久精品一区二区三区av| 蜜桃视频免费观看一区| 精品电影一区二区| 激情欧美日韩一区二区| 久久综合中文字幕| 国产精品中文有码| 国产精品美女久久福利网站| 成人毛片在线观看| 一区二区三区欧美久久| 欧美日韩精品福利| 成人av在线播放网址| 亚洲视频图片小说| 欧美性xxxxxxxx| 麻豆91在线观看| 国产喷白浆一区二区三区| 99久久精品国产一区二区三区 | 亚洲精品中文在线影院| 欧美性感一区二区三区| 天堂精品中文字幕在线| 日韩精品一区二区三区在线| 国产精品一区二区三区99| 中文字幕在线不卡视频| 欧美色手机在线观看| 免费观看91视频大全| 久久精子c满五个校花| 97se亚洲国产综合自在线不卡 | 欧美国产丝袜视频| 色婷婷一区二区三区四区| 天堂在线亚洲视频| 国产亚洲欧美激情| 欧美亚洲一区三区| 日本成人在线一区| 精品国产免费久久| 99精品国产热久久91蜜凸| 亚洲一区二区在线免费看| 欧美日韩一区二区欧美激情| 韩国午夜理伦三级不卡影院| 亚洲视频一区在线观看| 日韩精品一区二区三区swag| 色天使久久综合网天天| 亚洲三级电影网站| 欧美电视剧免费观看| 不卡一二三区首页| 日韩国产欧美一区二区三区| 久久久久99精品一区| 91福利在线导航| 国产成人av福利| 天使萌一区二区三区免费观看| 国产亚洲欧美激情| 欧美日韩国产综合草草| 国产sm精品调教视频网站| 天堂久久一区二区三区| 国产精品美女www爽爽爽| 宅男噜噜噜66一区二区66| 成人精品国产一区二区4080| 日韩av一区二区在线影视| 亚洲欧洲综合另类| 国产精品国产a级| 国产欧美久久久精品影院| 26uuu欧美| 日韩欧美综合在线| 91精品国产91久久综合桃花| 欧美日韩一区三区| 欧美少妇xxx| 欧美性一级生活| 欧美一a一片一级一片| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | av亚洲精华国产精华精华 | 国产日韩视频一区二区三区| 精品国产百合女同互慰|