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

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

?? bigint.cpp

?? RSA加密程序
?? CPP
字號:
#include "stdafx.h"
#include "BigInt.h"

CBigInt::CBigInt()
{
	m_nSign=1;
	m_nLength=1;
	for(int i=0;i<BI_MAXLEN;i++)
		m_ulValue[i]=0;
}

CBigInt::~CBigInt()
{
}

//大數比較,如果大數A位數比大數B多,當然A>B
//如果位數相同,則從高位開始比較,直到分出大小
int CBigInt::Cmp(CBigInt& A)
{
	if(m_nLength>A.m_nLength)return 1;	//this > A
	if(m_nLength<A.m_nLength)return -1;	//this < A
	for(int i=m_nLength-1;i>=0;i--)
	{
		if(m_ulValue[i]>A.m_ulValue[i])return 1;
		if(m_ulValue[i]<A.m_ulValue[i])return -1;
	}
	return 0;
}

CBigInt& CBigInt::Mov(CBigInt& A)
{
	m_nLength=A.m_nLength;
	for(int i=0;i<BI_MAXLEN;i++)
		m_ulValue[i]=A.m_ulValue[i];
	return *this;
}

CBigInt& CBigInt::Mov(unsigned __int64 A)
{
	if(A>0xffffffff)
	{
		m_nLength=2;
		m_ulValue[1]=(unsigned long)(A>>32);
		m_ulValue[0]=(unsigned long)A;
	}
	else
	{
		m_nLength=1;
		m_ulValue[0]=(unsigned long)A;
	}
	for(int i=m_nLength;i<BI_MAXLEN;i++)m_ulValue[i]=0;
	return *this;
}

//大數相加
//調用形式:N.Add(A),返回值:N+A
//若兩大數符號相同,其值相加,否則改變參數符號再調用大數相減函數
/******************************************************************
例如:
     A  B  C
+       D  E
--------------
= S  F  G  H

其中,若C+E<=0xffffffff,則H=C+E,carry(進位標志)=0
     若C+E> 0xffffffff,則H=C+E-0x100000000,carry=1

     若B+D+carry<=0xfffffff,則G=B+D,carry=0      
     若B+D+carry> 0xfffffff,則G=B+D+carry-0x10000000,carry=1

     若carry=0,則F=A,S=0
     若carry=1,A<0xfffffff,則F=A+1,S=0
     若carry=1,A=0xfffffff,則F=0,S=1
*****************************************************************/
CBigInt CBigInt::Add(CBigInt& A)
{
	CBigInt X;
	if(X.m_nSign==A.m_nSign)
	{
		X.Mov(*this);
		int carry=0;
	    unsigned __int64 sum=0;
	    if(X.m_nLength<A.m_nLength)X.m_nLength=A.m_nLength;
		for(int i=0;i<X.m_nLength;i++)
		{
			sum=A.m_ulValue[i];
			sum=sum+X.m_ulValue[i]+carry;
			X.m_ulValue[i]=(unsigned long)sum;
			if(sum>0xffffffff)carry=1;
			else carry=0;
		}
		if(X.m_nLength<BI_MAXLEN)
		{
			X.m_ulValue[X.m_nLength]=carry;
		    X.m_nLength+=carry;
		}
		return X;
	}
	else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Sub(X);}
}

CBigInt CBigInt::Add(long A)
{
	CBigInt X;
	if((m_nSign*A)>=0)
	{
		X.Mov(*this);
		unsigned __int64 sum;
	    sum=A+X.m_ulValue[0];
		X.m_ulValue[0]=(unsigned long)sum;
		if(sum>0xffffffff)
		{
			int i=1;
			while(X.m_ulValue[i]==0xffffffff){X.m_ulValue[i]=0;i++;}
			X.m_ulValue[i]++;
			if(i<BI_MAXLEN)X.m_nLength=i+1;
		}
		return X;
	}
	else return Sub(-A);
}
		

//大數相減
//調用形式:N.Sub(A),返回值:N-A
//若兩大數符號相同,其值相減,否則改變參數符號再調用大數相加函數
/******************************************************************
例如:
     A  B  C
-       D  E
--------------
=    F  G  H

其中,若C>=E,則H=C-E,carry(借位標志)=0
     若C<E, 則H=C-E+0x100000000,carry=1

     若B-carry>=D,則G=B-carry-D,carry=0      
     若B-carry<D, 則G=B-carry-D+0x10000000,carry=1

     若carry=0,則F=A
     若carry=1,A>1,則F=A-1
     若carry=1,A=1,則F=0
*****************************************************************/
CBigInt CBigInt::Sub(CBigInt& A)
{
	CBigInt X;
	if(m_nSign==A.m_nSign)
	{
		X.Mov(*this);
		int cmp=X.Cmp(A); 
		if(cmp==0){X.Mov(0);return X;}
		int len,carry=0;
		unsigned __int64 num;
		unsigned long *s,*d;
	    if(cmp>0){s=X.m_ulValue;d=A.m_ulValue;len=X.m_nLength;}
	    if(cmp<0){s=A.m_ulValue;d=X.m_ulValue;len=A.m_nLength;X.m_nSign=1-X.m_nSign;}
	    for(int i=0;i<len;i++)
		{
			if((s[i]-carry)>=d[i])
			{
				X.m_ulValue[i]=s[i]-carry-d[i];
				carry=0;
			}
			else
			{
				num=0x100000000+s[i];
				X.m_ulValue[i]=(unsigned long)(num-carry-d[i]);
				carry=1;
			}
		}
		while(X.m_ulValue[len-1]==0)len--;
		X.m_nLength=len;
		return X;
	}
	else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Add(X);}
}

CBigInt CBigInt::Sub(long A)
{
	CBigInt X;
	if((m_nSign*A)>=0)
	{
		X.Mov(*this);
		if(X.m_ulValue[0]>=(unsigned long)A){X.m_ulValue[0]-=A;return X;}
		if(X.m_nLength==1){X.m_ulValue[0]=A-X.m_ulValue[0];X.m_nSign=1-X.m_nSign;return X;}
		unsigned __int64 num=0x100000000+X.m_ulValue[0];
		X.m_ulValue[0]=(unsigned long)(num-A);
		int i=1;
		while(X.m_ulValue[i]==0){X.m_ulValue[i]=0xffffffff;i++;}
		if(X.m_ulValue[i]==1)X.m_nLength--;
		X.m_ulValue[i]--;
		return X;
	}
	else return Add(-A);
}


//大數相乘
//調用形式:N.Mul(A),返回值:N*A
/******************************************************************
例如:
        A  B  C
*          D  E
----------------
=    S  F  G  H
+ T  I  J  K
----------------
= U  V  L  M  N

其中,SFGH=ABC*E,TIJK=ABC*D

而對于:
     A  B  C
*          E
-------------
= S  F  G  H    

其中,若C*E<=0xffffffff,則H=C*E,carry(進位標志)=0
     若C*E> 0xffffffff,則H=(C*E)&0xffffffff, carry=(C*E)/0xffffffff
     若B*E+carry<=0xffffffff,則G=B*E+carry,carry=0
     若B*E+carry> 0xffffffff,則G=(B*E+carry)&0xffffffff, carry=(B*E+carry)/0xffffffff
     若A*E+carry<=0xffffffff,則F=A*E+carry,carry=0
     若A*E+carry> 0xffffffff,則F=(A*E+carry)&0xffffffff, carry=(A*E+carry)/0xffffffff, S=carry
*****************************************************************/
CBigInt CBigInt::Mul(CBigInt& A)
{
	CBigInt X,Y;
	unsigned __int64 mul;
    unsigned long carry;
    for(int i=0;i<A.m_nLength;i++)
	{
		Y.m_nLength=m_nLength;
		carry=0;
		for(int j=0;j<m_nLength;j++)
		{
			mul=m_ulValue[j];
			mul=mul*A.m_ulValue[i]+carry;
			Y.m_ulValue[j]=(unsigned long)mul;
			carry=(unsigned long)(mul>>32);
		}
		if(carry&&(Y.m_nLength<BI_MAXLEN))
		{
			Y.m_nLength++;
			Y.m_ulValue[Y.m_nLength-1]=carry;
		}
		if(Y.m_nLength<BI_MAXLEN-i)
		{
			Y.m_nLength+=i;
		    for(int k=Y.m_nLength-1;k>=i;k--)Y.m_ulValue[k]=Y.m_ulValue[k-i];
		    for(k=0;k<i;k++)Y.m_ulValue[k]=0;
		}
		X.Mov(X.Add(Y));
	}
	if(m_nSign+A.m_nSign==1)X.m_nSign=0;
	else X.m_nSign=1;
	return X;
}

CBigInt CBigInt::Mul(long A)
{
	CBigInt X;
	unsigned __int64 mul;
	unsigned long carry=0;
	X.Mov(*this);
	for(int i=0;i<m_nLength;i++)
	{
		mul=m_ulValue[i];
		mul=mul*A+carry;
		X.m_ulValue[i]=(unsigned long)mul;
		carry=(unsigned long)((mul-X.m_ulValue[i])>>32);
	}
	if(carry&&(X.m_nLength<BI_MAXLEN)){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=carry;}
	if(A<0)
		X.m_nSign=1-X.m_nSign;
	return X;
}


//大數相除
//調用形式:N.Div(A),返回值:N/A
//除法的關鍵在于“試商”,然后就變成了乘法和減法
//這里將被除數與除數的試商轉化成了被除數最高位與除數最高位的試商
CBigInt CBigInt::Div(CBigInt& A)
{
	CBigInt X,Y,Z;
	int len;
	unsigned __int64 num,div;
	unsigned long carry=0;
	Y.Mov(*this);
	while(Y.Cmp(A)>0)
	{       
		if(Y.m_ulValue[Y.m_nLength-1]>A.m_ulValue[A.m_nLength-1])
		{
			len=Y.m_nLength-A.m_nLength;
			div=Y.m_ulValue[Y.m_nLength-1]/(A.m_ulValue[A.m_nLength-1]+1);
		}
		else if(Y.m_nLength>A.m_nLength)
		{
			len=Y.m_nLength-A.m_nLength-1;
			num=Y.m_ulValue[Y.m_nLength-1];
			num=(num<<32)+Y.m_ulValue[Y.m_nLength-2];
			if(A.m_ulValue[A.m_nLength-1]==0xffffffff)div=(num>>32);
			else div=num/(A.m_ulValue[A.m_nLength-1]+1);
		}
		else
		{
            X.Mov(X.Add(1));
			break;
		}
        Z.Mov(div);
		Z.m_nLength+=len;
		for(int i=Z.m_nLength-1;i>=len;i--)Z.m_ulValue[i]=Z.m_ulValue[i-len];
		for(i=0;i<len;i++)Z.m_ulValue[i]=0;
		X.Mov(X.Add(Z));
		Z.Mov(Z.Mul(A));
		Y.Mov(Y.Sub(Z));
	}
	if(Y.Cmp(A)==0)X.Mov(X.Add(1));
	if(m_nSign+A.m_nSign==1)X.m_nSign=0;
	else X.m_nSign=1;
	return X;
}


//大數求模
//調用形式:N.Mod(A),返回值:N%A
//求模與求商原理相同
CBigInt CBigInt::Div(long A)
{
	CBigInt X;
	X.Mov(*this);
	if(X.m_nLength==1){X.m_ulValue[0]=X.m_ulValue[0]/A;return X;}
	unsigned __int64 div,mul;
	unsigned long carry=0;
	for(int i=X.m_nLength-1;i>=0;i--)
	{
		div=carry;
		div=(div<<32)+X.m_ulValue[i];
		X.m_ulValue[i]=(unsigned long)(div/A);
		mul=(div/A)*A;
		carry=(unsigned long)(div-mul);
	}
	if(X.m_ulValue[X.m_nLength-1]==0)X.m_nLength--;
	if(A<0)X.m_nSign=1-X.m_nSign;
	return X;
}

CBigInt CBigInt::Mod(CBigInt& A)
{
	CBigInt X,Y;
	int len;
	unsigned __int64 num,div;
	unsigned long carry=0;
	X.Mov(*this);
	while(X.Cmp(A)>0)
	{       
		if(X.m_ulValue[X.m_nLength-1]>A.m_ulValue[A.m_nLength-1])
		{
			len=X.m_nLength-A.m_nLength;
			div=X.m_ulValue[X.m_nLength-1]/(A.m_ulValue[A.m_nLength-1]+1);
		}
		else if(X.m_nLength>A.m_nLength)
		{
			len=X.m_nLength-A.m_nLength-1;
			num=X.m_ulValue[X.m_nLength-1];
			num=(num<<32)+X.m_ulValue[X.m_nLength-2];
			if(A.m_ulValue[A.m_nLength-1]==0xffffffff)div=(num>>32);
			else div=num/(A.m_ulValue[A.m_nLength-1]+1);
		}
		else
		{
			X.Mov(X.Sub(A));
			break;
		}
        Y.Mov(div);
		Y.Mov(Y.Mul(A));
		Y.m_nLength+=len;
		for(int i=Y.m_nLength-1;i>=len;i--)Y.m_ulValue[i]=Y.m_ulValue[i-len];
		for(i=0;i<len;i++)Y.m_ulValue[i]=0;
		X.Mov(X.Sub(Y));
	}
	if(X.Cmp(A)==0)X.Mov(0);
	return X;
}

long CBigInt::Mod(long A)
{
	if(m_nLength==1)return(m_ulValue[0]%A);
	unsigned __int64 div;
	unsigned long carry=0;
	for(int i=m_nLength-1;i>=0;i--)
	{
		div=carry*0x100000000+m_ulValue[i];
		carry=(unsigned long)(div-((div/A)*A));
	}
	return carry;
}

int CBigInt::InPutFromStr(CString& str, const unsigned int system=DEC)
{
    int len=str.GetLength();
	Mov(0);
	for(int i=0;i<len;i++)
    {
       	Mov(Mul(system));
		int k=str[i]-48;
		Mov(Add(k));
  	}
  	return 0;
}

int CBigInt::OutPutToStr(CString& str, const unsigned int system=DEC)
{
	str="";
	char ch;
	CBigInt X;
	X.Mov(*this);
	while(X.m_ulValue[X.m_nLength-1]>0)
	{
		ch=X.Mod(system)+48;
		str.Insert(0,ch);
        X.Mov(X.Div(system));
	}
	return 0;
}	

//歐幾里德算法:
//定理基礎: gcd(a,b) = gcd(b,a mod b)
//*********************************************//
//歐幾里德算法求:Y=X.Euc(A),使滿足:YX mod A=1
//相當于對不定方程ax-by=1求最小整數解
//實際上就是廣義輾轉相除法
/********************************************************************
例如:11x-49y=1,求x(求11關于模49的逆元,結果是58)

            11 x  -  49 y  =   1      a)
49%11=5 ->  11 x  -   5 y  =   1      b)
11%5 =1 ->     x  -   5 y  =   1      c)

令y=1  代入c)式  得x=6
令x=6  代入b)式  得y=13
令y=13 代入a)式  得x=58  
********************************************************************/
CBigInt CBigInt::Euc(CBigInt& A)
{
	CBigInt X,Y;
	X.Mov(*this);
	Y.Mov(A);
	if((X.m_nLength==1)&&(X.m_ulValue[0]==1))
		return X;
	if((Y.m_nLength==1)&&(Y.m_ulValue[0]==1))
	{
		X.Mov(X.Sub(1));
		return X;
	}
	//輾轉相除
	if(X.Cmp(Y)==1)			// X > Y
		X.Mov(X.Mod(Y));	// X = X % Y
	else					// X <= Y
		Y.Mov(Y.Mod(X));	// Y = Y % X
	X.Mov(X.Euc(Y));		// 遞歸
    Y.Mov(*this);
	if(Y.Cmp(A)==1)
	{
		X.Mov(X.Mul(Y));
		X.Mov(X.Sub(1));
		X.Mov(X.Div(A));
	}
	else
	{
		X.Mov(X.Mul(A));
		X.Mov(X.Add(1));
		X.Mov(X.Div(Y));
	}
	return X;
}


//蒙哥馬利算法求:Y=X.Mon(A,B),使滿足:X^A mod B=Y
//就是反復平方法		
CBigInt CBigInt::Mon(CBigInt& A, CBigInt& B)
{
	CBigInt X,Y,Z;
	X.Mov(1);
	Y.Mov(*this);
    Z.Mov(A);
	while((Z.m_nLength!=1)||Z.m_ulValue[0])
	{
		if(Z.m_ulValue[0]&1)
		{
			Z.Mov(Z.Sub(1));
			X.Mov(X.Mul(Y));
			X.Mov(X.Mod(B));
		}
		else
		{
			Z.Mov(Z.Div(2));
			Y.Mov(Y.Mul(Y));
			Y.Mov(Y.Mod(B));
		}
	}
    return X;
}
	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费观看不卡av| 国产精品一区二区在线观看不卡| 91色.com| 亚洲一区在线观看免费观看电影高清| 99精品久久久久久| 亚洲精品v日韩精品| 在线区一区二视频| 三级影片在线观看欧美日韩一区二区 | 国产一区二区在线影院| 26uuu欧美| 91麻豆精品在线观看| 亚洲综合精品久久| 日韩一区二区麻豆国产| 国内精品久久久久影院一蜜桃| 欧美国产日韩在线观看| 91欧美激情一区二区三区成人| 亚洲一区在线视频| 欧美成人video| av资源网一区| 午夜在线成人av| 国产日韩三级在线| 欧美综合色免费| 国产在线精品一区二区三区不卡 | 2023国产精华国产精品| 成人午夜精品一区二区三区| 亚洲精品亚洲人成人网在线播放| 91精品午夜视频| 国产精品自拍网站| 一区二区三区蜜桃网| 欧美成人女星排行榜| 99久久99久久精品国产片果冻| 午夜精品成人在线| 国产亚洲精品资源在线26u| 色呦呦网站一区| 久久99国产精品免费| 亚洲理论在线观看| 国产亚洲综合在线| 制服.丝袜.亚洲.中文.综合| 91网站视频在线观看| 久久99精品国产91久久来源| 亚洲精品成人天堂一二三| 日韩欧美国产电影| 色婷婷av一区二区三区软件| 国产精品69久久久久水密桃 | 美女爽到高潮91| 亚洲男人天堂av| 久久久久久夜精品精品免费| 欧美日韩免费视频| 成人av免费观看| 精久久久久久久久久久| 亚洲大片精品永久免费| 亚洲人吸女人奶水| 国产欧美日本一区视频| 欧美mv日韩mv| 91精品国产麻豆| 色综合天天综合网天天看片| 国产成人亚洲综合a∨婷婷图片| 日本v片在线高清不卡在线观看| 日韩美女视频一区二区| 日本一区二区视频在线| 精品国产精品一区二区夜夜嗨| 欧美在线观看禁18| 色婷婷国产精品综合在线观看| 国产99精品在线观看| 国产乱人伦偷精品视频不卡| 裸体一区二区三区| 日韩电影免费在线观看网站| 一区二区三区中文在线观看| 国产精品色在线观看| 国产欧美一区二区精品婷婷| 久久久久久久久久久久久久久99| 日韩午夜电影av| 欧美一区二区免费| 日韩一区二区影院| 日韩一级完整毛片| 欧美一区二区视频在线观看| 欧美伊人久久久久久久久影院| 91久久国产最好的精华液| 色综合久久99| 欧美羞羞免费网站| 欧美日韩视频专区在线播放| 欧美日韩成人一区| 91精品一区二区三区久久久久久 | 成人午夜av电影| 成人一区在线观看| 不卡免费追剧大全电视剧网站| 国产白丝网站精品污在线入口| 国产一区二区成人久久免费影院 | 日韩精品一区二区三区中文不卡 | 另类专区欧美蜜桃臀第一页| 久久精品免费看| 国产综合久久久久影院| 国产91丝袜在线18| 91老司机福利 在线| 欧美亚洲综合另类| 日韩欧美中文字幕精品| 国产日韩v精品一区二区| 中文字幕在线播放不卡一区| 一区二区三区欧美视频| 免费的成人av| 国产成人av福利| 色呦呦日韩精品| 欧美一级免费大片| 久久久久久久性| 亚洲精品自拍动漫在线| 日本欧美一区二区在线观看| 麻豆成人综合网| 成人av电影在线观看| 欧美另类变人与禽xxxxx| 欧美精品一区二区高清在线观看 | 亚洲另类春色国产| 热久久国产精品| 成人激情av网| 欧美日韩国产乱码电影| 国产欧美综合色| 亚洲成av人片在线观看| 国产不卡视频一区| 欧美嫩在线观看| 国产精品网站导航| 视频一区中文字幕| 高潮精品一区videoshd| 欧美精品欧美精品系列| 国产精品美女久久久久久| 午夜亚洲福利老司机| 国产不卡在线一区| 日韩视频一区二区| 亚洲精品伦理在线| 国产精品一区二区不卡| 欧美日韩精品是欧美日韩精品| 国产亚洲精品资源在线26u| 日日摸夜夜添夜夜添国产精品| 国产成人免费视频网站高清观看视频| 欧美日本视频在线| 亚洲欧美日韩在线| 国产高清久久久| 日韩一级免费一区| 午夜精品一区二区三区电影天堂| 国产成a人亚洲精品| 精品日韩一区二区三区免费视频| 亚洲综合久久av| 色综合中文综合网| 国产日韩v精品一区二区| 免费在线视频一区| 欧美日韩亚洲综合在线| 亚洲欧洲三级电影| 国产91露脸合集magnet| 欧美电影免费观看高清完整版在线| 亚洲一区在线视频| 色噜噜狠狠色综合欧洲selulu| 国产精品天天摸av网| 国产一级精品在线| 精品欧美黑人一区二区三区| 日韩精品一二三四| 欧美日韩在线播放| 亚洲一区二区三区国产| 91亚洲精品久久久蜜桃网站 | 欧美精品一区二区久久婷婷| 奇米精品一区二区三区在线观看| 欧美日韩一卡二卡| 日韩精品免费视频人成| 欧美久久免费观看| 日韩不卡一区二区三区| 91精品国产日韩91久久久久久| 午夜精品久久久久影视| 欧美日韩在线观看一区二区 | av日韩在线网站| 中文字幕亚洲一区二区av在线| 国产精品影视网| 国产午夜精品久久久久久久| 国产一区美女在线| 久久久美女毛片| 成人av网站在线观看| 亚洲欧美激情小说另类| 一本大道av伊人久久综合| 一区二区在线观看免费视频播放 | 成人国产精品免费观看视频| 欧美极品少妇xxxxⅹ高跟鞋| 成人精品视频一区二区三区| 亚洲男人电影天堂| 欧美日韩国产a| 免费成人av资源网| 久久你懂得1024| 成人短视频下载| 亚洲一二三专区| 日韩精品中文字幕在线一区| 国产美女久久久久| 成人欧美一区二区三区小说| 欧洲av在线精品| 麻豆91在线观看| 国产精品国模大尺度视频| 欧美性xxxxxxxx| 激情av综合网| 亚洲三级在线免费观看| 91.com在线观看| 国产成人av在线影院| 亚洲国产欧美另类丝袜| 久久综合狠狠综合久久综合88 | 国产成人精品亚洲日本在线桃色| 亚洲三级电影网站| 欧美一级片在线|