⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bigint.cpp

📁 aes的原代码
💻 CPP
字号:
#include "StdAfx.h"
#include ".\bigint.h"
BigInt::BigInt()
{
	m_nLength=1;
	for(int i=0;i<BI_MAXLEN;i++) m_ulValue[i]=0;
}
BigInt::BigInt(const char * val)
{
	m_nLength=1;
	for(int i=0;i<BI_MAXLEN;i++) m_ulValue[i]=0;
	this->PutStr(val);
}

BigInt::~BigInt(void)
{
}
/****************************************************************************************
大数比较
调用方式:N.Cmp(A)
返回值:若N<A返回-1;若N=A返回0;若N>A返回1
****************************************************************************************/
int BigInt::Cmp(BigInt& A)
{
    if(m_nLength>A.m_nLength)return 1;
    if(m_nLength<A.m_nLength)return -1;
    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;
}
/****************************************************************************************
大数赋值
调用方式:N.Mov(A)
返回值:无,N被赋值为A
****************************************************************************************/
void BigInt::Mov(BigInt& A)
{
    m_nLength=A.m_nLength;
    for(int i=0;i<BI_MAXLEN;i++) m_ulValue[i]=A.m_ulValue[i];
}

void BigInt::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;
}

/****************************************************************************************
大数相加
调用形式:N.Add(A)
返回值:N+A
****************************************************************************************/
BigInt BigInt::Add(BigInt& A)
{
    BigInt X;
    X.Mov(*this);
    unsigned carry=0;
    unsigned __int64 sum=0;
    if(X.m_nLength<A.m_nLength)X.m_nLength=A.m_nLength;
    for(unsigned 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;
        carry=(unsigned)(sum>>32);
    }
    X.m_ulValue[X.m_nLength]=carry;
    X.m_nLength+=carry;
    return X;
}

BigInt BigInt::Add(unsigned long A)
{
    BigInt X;
    X.Mov(*this);
    unsigned __int64 sum;
    sum=X.m_ulValue[0];
	sum+=A;
    X.m_ulValue[0]=(unsigned long)sum;
    if(sum>0xffffffff)
    {
        unsigned i=1;
        while(X.m_ulValue[i]==0xffffffff){X.m_ulValue[i]=0;i++;}
        X.m_ulValue[i]++;
        if(m_nLength==i)m_nLength++;
    }
    return X;
}
/****************************************************************************************
大数相减
调用形式:N.Sub(A)
返回值:N-A
****************************************************************************************/
BigInt BigInt::Sub(BigInt& A)
{
    BigInt X;
    X.Mov(*this);
    if(X.Cmp(A)<=0){X.Mov(0);return X;}
    unsigned carry=0;
    unsigned __int64 num;
	unsigned i;
    for(i=0;i<m_nLength;i++)
    {
        if((m_ulValue[i]>A.m_ulValue[i])||((m_ulValue[i]==A.m_ulValue[i])&&(carry==0)))
        {
            X.m_ulValue[i]=m_ulValue[i]-carry-A.m_ulValue[i];
            carry=0;
        }
        else
        {
            num=0x100000000+m_ulValue[i];
            X.m_ulValue[i]=(unsigned long)(num-carry-A.m_ulValue[i]);
            carry=1;
        }
    }
    while(X.m_ulValue[X.m_nLength-1]==0)X.m_nLength--;
    return X;
}

BigInt BigInt::Sub(unsigned long A)
{
    BigInt X;
    X.Mov(*this);
    if(X.m_ulValue[0]>=A){X.m_ulValue[0]-=A;return X;}
    if(X.m_nLength==1){X.Mov(0);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++;}
    X.m_ulValue[i]--;
    if(X.m_ulValue[i]==0)X.m_nLength--;
    return X;
}

/****************************************************************************************
大数相乘
调用形式:N.Mul(A)
返回值:N*A
****************************************************************************************/
BigInt BigInt::Mul(BigInt& A)
{
    if(A.m_nLength==1)return Mul(A.m_ulValue[0]);
	BigInt X;
	unsigned __int64 sum,mul=0,carry=0;
	unsigned i,j;
	X.m_nLength=m_nLength+A.m_nLength-1;
    for(i=0;i<X.m_nLength;i++)
	{
		sum=carry;
		carry=0;
		for(j=0;j<A.m_nLength;j++)
		{
            if(((i-j)>=0)&&((i-j)<m_nLength))
			{
				mul=m_ulValue[i-j];
				mul*=A.m_ulValue[j];
			    carry+=mul>>32;
				mul=mul&0xffffffff;
				sum+=mul;
			}
        }
		carry+=sum>>32;
		X.m_ulValue[i]=(unsigned long)sum;
	}
	if(carry){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=(unsigned long)carry;}
    return X;
}

BigInt BigInt::Mul(unsigned long A)
{
    BigInt X;
    unsigned __int64 mul;
    unsigned long carry=0;
    X.Mov(*this);
    for(unsigned 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>>32);
    }
    if(carry){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=carry;}
    return X;
}

/****************************************************************************************
大数相除
调用形式:N.Div(A)
返回值:N/A
****************************************************************************************/
BigInt BigInt::Div(BigInt& A)
{
    if(A.m_nLength==1)return Div(A.m_ulValue[0]);
    BigInt X,Y,Z;
    unsigned i,len;
    unsigned __int64 num,div;
    Y.Mov(*this);
    while(Y.Cmp(A)>=0)
    {       
		div=Y.m_ulValue[Y.m_nLength-1];
		num=A.m_ulValue[A.m_nLength-1];
		len=Y.m_nLength-A.m_nLength;
		if((div==num)&&(len==0)){X.Mov(X.Add(1));break;}
		if((div<=num)&&len){len--;div=(div<<32)+Y.m_ulValue[Y.m_nLength-2];}
		div=div/(num+1);
		Z.Mov(div);
		if(len)
		{
			Z.m_nLength+=len;
			for(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));
        Y.Mov(Y.Sub(A.Mul(Z)));
    }
    return X;
}

BigInt BigInt::Div(unsigned long A)
{
    BigInt 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--;
    return X;
}

/****************************************************************************************
大数求模
调用形式:N.Mod(A)
返回值:N%A
****************************************************************************************/
BigInt BigInt::Mod(BigInt& A)
{
    BigInt X,Y;
	unsigned __int64 div,num;
    unsigned long carry=0;
	unsigned i,len;
    X.Mov(*this);
    while(X.Cmp(A)>=0)
    {
		div=X.m_ulValue[X.m_nLength-1];
		num=A.m_ulValue[A.m_nLength-1];
		len=X.m_nLength-A.m_nLength;
		if((div==num)&&(len==0)){X.Mov(X.Sub(A));break;}
		if((div<=num)&&len){len--;div=(div<<32)+X.m_ulValue[X.m_nLength-2];}
		div=div/(num+1);
		Y.Mov(div);
		Y.Mov(A.Mul(Y));
		if(len)
		{
			Y.m_nLength+=len;
			for(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));
    }
    return X;
}

unsigned long BigInt::Mod(unsigned 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=m_ulValue[i];
		div+=carry*0x100000000;
        carry=(unsigned long)(div%A);
    }
    return carry;
}

BigInt BigInt::ModPow(BigInt&B,BigInt&N)
{
	BigInt T,temp;
	BigInt D("1"), ZERO("0"),TWO("2");
	T.Mov( *this);
	while(B.m_nLength!=1 || B.m_ulValue[0]!=0)//B.Cmp(ZERO)>0
	{
		if(B.GetFirstValue()==1) D = D.Mul(T).Mod(N);
		B=B.Div(2);
		T = T.Mul(T).Mod(N);
	}
	return D;

}
BigInt BigInt::ModPow(int &B,BigInt &N)
{
	BigInt D("1"),T;
	T.Mov(*this);
	while(B>0)
	{
		if(B%2==1) D = D.Mul(T).Mod(N);
		B/=2;
		T = T.Mul(T).Mod(N);
	}
	return D;
}
long BigInt::GetFirstValue()
{
	if((m_nLength==1)&&(m_ulValue[0]==0)){return -1;}
	return (long)((__int64)m_ulValue[0]%2);
}
void BigInt::PutStr(const char* str, unsigned int system)
{
    int len=(int)strlen(str),k;
	//cout<<len<<endl;
    Mov(0);
    for(int i=0;i<len;i++)
    {
       Mov(Mul(system));
       if((str[i]>='0')&&(str[i]<='9'))k=str[i]-48;
       else if((str[i]>='A')&&(str[i]<='F'))k=str[i]-55;
       else if((str[i]>='a')&&(str[i]<='f'))k=str[i]-87;
       else k=0;
       Mov(Add(k));
    }
}
void BigInt::Reverse(char * s,int len)
{
	for(int i=0; i<len/2; i++)
	{
		char ch = s[i];
		s[i] = s[len-i-1];
		s[len-i-1] = ch;
	}
}
void BigInt::GetStr(char* str,unsigned int system)
{
	memset(str,'\0',sizeof(str));
    if((m_nLength==1)&&(m_ulValue[0]==0)){str[0]='0';return;}
	//str="";
	char t[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    int a,loop=0;
    char ch;
    BigInt X;
    X.Mov(*this);
    while(X.m_ulValue[X.m_nLength-1]>0)
    {
        a=X.Mod(system);
        ch=t[a];
        str[loop++]=ch;
        X.Mov(X.Div(system));
    }
	this->Reverse(str,loop);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -