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

📄 liptimer.c

📁 应用密码学这本书的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		register long carry = 0;		register long i;		register verylong pc;		register long agrb;		if (!(agrb = zcompare(a, b)))		{			zzero(cc);			return;		}		if ((agrb > 0 && anegative) || (agrb < 0 && !anegative))		{			pc = a;			a = b;			b = pc;			sa = *a;			sb = *b;		}		if (anegative)		{			sa = -sa;			sb = -sb;		}		zsetlength(&c, sa, "in zsub, third argument");                if (b == *cc) b = c;		*cc = c;		pc = &c[0];		for (i = 1; i <= sb; i++)		{			if ((*(++pc) = (*(++a)) - (*(++b)) - carry) >= 0)				carry = 0;			else			{				*pc += (1L<<26);				carry = 1;			};		}		for (; i <= sa; i++)		{			if ((*(++pc) = (*(++a)) - carry) >= 0)				carry = 0;			else			{				*pc += (1L<<26);				carry = 1;			};		}		i = sa;		while ((i > 1) && (!(*pc)))		{			i--;			pc--;		}		if (agrb > 0)			c[0] = i;		else			c[0] = -i;	}	else	{	/* signs a and b are different */		verylong old;		verylong oldc;		oldc = c;		if (anegative)		{			a[0] = -a[0];			old = a;		}		else		{			b[0] = -b[0];			old = b;		}	/* the one that's negative cannot be zero */		zadd1(a, b, &c);		*cc = c;		if (anegative)		{			c[0] = -c[0];			if (old != oldc)				a[0] = -a[0];		}		else if (old != oldc)			b[0] = -b[0];	}}static voidzsubpos1(        verylong a,        verylong b,        verylong *cc        ){        register long sa = a[0];        register long sb = b[0];        register long carry = 0;        register long i;        register verylong pc;        verylong c = *cc;        if (ALLOCATE && !b)        {                if (a)                        zcopy(a, cc);                else                        zzero(cc);                return;        }        if (ALLOCATE && !a)        {                zzero(cc);                return;        }        zsetlength(&c, sa, "in zsubpos, third argument");        /* if *cc == a, then nothing will happen */        /* if *cc == b, then b might point to freed space, so */        if (b == *cc) b = c;        *cc = c;        pc = &c[0];        for (i = 1; i <= sb; i++)        {                if ((*(++pc) = (*(++a)) - (*(++b)) - carry) >= 0)                        carry = 0;                else                {                        *pc += (1L<<26);                        carry = 1;                };        }        for (; i <= sa; i++)        {                if ((*(++pc) = (*(++a)) - carry) >= 0)                        carry = 0;                else                {                        *pc += (1L<<26);                        carry = 1;                };        }        i = sa;        while ((i > 1) && (!(*pc)))        {                i--;                pc--;        }        c[0] = i;}kar_mul1(	verylong a,	verylong b,	verylong *c,	long shi	){	register long al;	register long hal;	register long i;	register long restoreb0 = b[0];	register verylong pc;	register long bbig = 1;	verylong *a0;	verylong *a1;	verylong *a2;	verylong *a3;	verylong *a4;	zsetlength(c, (hal = (al = a[0]) + (i = b[0])), "in kar_mul, third argument");	if ((shi >= (5 * KAR_DEPTH)) || (al < K_M_C) || (i < K_M_C))	{		pc = &(*c)[1];		for (i = hal; i > 0; i--)			*pc++ = 0;		pc = &(*c)[1];		if (al <= *b)			for (i = al; i; i--)			{				zaddmul1(*(++a), pc++, b);			}		else			for (i = *b; i; i--)			{				zaddmul1(*(++b), pc++, a);			}		while ((hal > 1) && (!((*c)[hal])))			hal--;		(*c)[0] = hal;		return;	}	a0 = &(kar_mem[shi]);	a1 = &(kar_mem[shi + 1]);	a2 = &(kar_mem[shi + 2]);	a3 = &(kar_mem[shi + 3]);	a4 = &(kar_mem[shi + 4]);	hal = ((al + 1) >> 1);	zsetlength(a0, al, "in kar_mul, locals\n");	zsetlength(a1, al, "");	zsetlength(a2, al, "");	zsetlength(a3, al + hal, "");	zsetlength(a4, al + 2, "");	i = hal;	while ((i > 1) && (!(a[i])))		i--;	a[0] = i;	if (hal >= b[0])		bbig = 0;	else	{		i = hal;		while ((i > 1) && (!(b[i])))			i--;		b[0] = i;	}	for (i = hal + 1; i <= al; i++)		(*a1)[i - hal] = a[i];	(*a1)[0] = al - hal;	if (bbig)	{		for (i = hal + 1; i <= restoreb0; i++)			(*a3)[i - hal] = b[i];		(*a3)[0] = restoreb0 - hal;	}	kar_mul1(a, b, a4, shi + 5);	zadd1(a, (*a1), a0);	a[0] = al;	if (bbig)	{		kar_mul1((*a1), (*a3), c, shi + 5);		zadd1(b, (*a3), a2);		b[0] = restoreb0;		kar_mul1((*a0), (*a2), a3, shi + 5);	}	else		kar_mul1((*a0), b, a3, shi + 5);	zsubpos1((*a3), (*a4), a3);	if (bbig)		zsubpos1((*a3), *c, a3);	zlshift1((*a3), hal * 26, a3);	hal <<= 1;	if (bbig)	{		for (i = (*c)[0]; i; i--)			(*c)[i + hal] = (*c)[i];		for (i = hal; i > (*a4)[0]; i--)			(*c)[i] = 0;		for (; i; i--)			(*c)[i] = (*a4)[i];		(*c)[0] += hal;	}	else	{		for (i = (*a4)[0]; i >= 0; i--)			(*c)[i] = (*a4)[i];	}	zadd1(*c, (*a3), c);}#define ExtractHiLo1(Hi,Lo,x) \{ \double t=x+(4503599627370496.0); \unsigned long *it = (unsigned long *)&t; \Lo = it[1]; \Hi = ((it[0]<<6)|(it[1]>>26)); \Lo &= 0x3FFFFFF; \Hi &= 0x3FFFFFF; \}#define zaddmulpsq1(a,b,t) \{ \   double __lx = ((double) (*a)) + ((double) b)*((double) b); \   register long  __lhi = 0, __llo = 0;\   ExtractHiLo1(__lhi,__llo,__lx);\   (*a) = __llo;\   (*t) = __lhi;\}void zaddmulsq1(        long ams,        long *ama,        long *amb        ){        register long carry = 0;        register long i = ams;        register double dams = (double) (*amb);        double xx;        register double yy;        register unsigned long lo;        register unsigned long hi;        xx =  ((double) (*(++amb)))*dams + 4503599627370496.0;        for (; i > 1; i--)        {                yy =  ((double) (*(++amb)))*dams + 4503599627370496.0;                lo = LO1(xx) & 0x3FFFFFF;                hi = ((HI1(xx)<<6)|(LO1(xx)>>26)) & 0x3FFFFFF;                lo = lo + (*ama) + carry;                *ama = lo & 0x3FFFFFF;                carry = hi + (lo >> 26);                ama++;                xx = yy;        }        if (i==1)        {                lo = LO1(xx) & 0x3FFFFFF;                hi = ((HI1(xx)<<6)|(LO1(xx)>>26)) & 0x3FFFFFF;                lo = lo + (*ama) + carry;                *ama = lo & 0x3FFFFFF;                carry = hi + (lo >> 26);                ama++;        }        *ama += carry;}kar_sq1(	verylong a,	verylong *c,	long shi	){	register long al;	register long hal;	register long i;	register verylong pc;	verylong *a0;	verylong *a1;	verylong *a2;	zsetlength(c, (i = ((al = a[0]) << 1)), "in kar_sq, second argument");	if ((shi >= (3 * KAR_DEPTH)) || (al < K_S_C))	{		register unsigned long uncar;		long carry = 0;		pc = &(*c)[1];		for (; i > 0; i--)			*pc++ = 0;		for (hal = 1; hal <= al; hal++)		{			i += 2;			{				zaddmulsq1(al - hal, &((*c)[i]), &(a[hal]));			}			uncar = ((*c)[i - 1] << 1) + carry;			(*c)[i - 1] = uncar & ((1L<<26)-1);			uncar = ((*c)[i] << 1) + (uncar >> 26);			{				zaddmulpsq1(&(*c)[i - 1], a[hal], &carry);			}			uncar += carry;			carry = uncar >> 26;			(*c)[i] = uncar & ((1L<<26)-1);		}		while ((i > 1) && (!((*c)[i])))			i--;		(*c)[0] = i;		return;	}	a0 = &(kar_mem[shi]);	a1 = &(kar_mem[shi + 1]);	a2 = &(kar_mem[shi + 2]);	hal = ((al + 1) >> 1);	zsetlength(a0, al + hal + 2, "in kar_sq, locals\n");	zsetlength(a1, al + 2, "");	zsetlength(a2, al, "");	i = hal;	while ((i > 1) && (!(a[i])))		i--;	a[0] = i;	for (i = hal + 1; i <= al; i++)		(*a0)[i - hal] = a[i];	(*a0)[0] = al - hal;	kar_sq1(a, a1, shi + 3);	zadd(a, (*a0), a2);	kar_sq1((*a0), c, shi + 3);	a[0] = al;	kar_sq1((*a2), a0, shi + 3);	zsubpos1((*a0), (*a1), a0);	zsubpos1((*a0), *c, a0);	zlshift1((*a0), hal * 26, a0);	hal <<= 1;	for (i = (*c)[0]; i; i--)		(*c)[i + hal] = (*c)[i];	for (i = hal; i > (*a1)[0]; i--)		(*c)[i] = 0;	for (; i; i--)		(*c)[i] = (*a1)[i];	(*c)[0] += hal;	zadd(*c, (*a0), c);}/* SINGLE_MUL = 0, PLAIN = 1, KARAT = 0 */voidzmul2(        verylong a,        verylong b,        verylong *c        ){       /* output not input */        register long aneg;        register long bneg;        verylong olda;        verylong oldb;        if (ALLOCATE && (!a || !b))        {                zzero(c);                return;        }        if (a == b)        {                zsq(a, c);                return;        }        if (!kar_mem_initialized)        {                kar_mem_initialized = 1;                for (aneg = (5 * KAR_DEPTH) - 1; aneg >= 0; aneg--)                        kar_mem[aneg] = (verylong) 0;        }        olda = a;        oldb = b;        if (aneg = (*a < 0))                a[0] = -a[0];        if (bneg = (*b < 0))                b[0] = -b[0];        if (*a > *b)                kar_mul2(a, b, c, (long) 0);        else                kar_mul2(b, a, c, (long) 0);        if (aneg != bneg && ((*c)[1] || (*c)[0] != 1))                (*c)[0] = -(*c)[0];        if (aneg)                olda[0] = -olda[0];        if (bneg)                oldb[0] = -oldb[0];}voidzsq2(        verylong a,        verylong *c        ){       /* output is not input */        register long aneg;        if (ALLOCATE && !a)        {                zzero(c);                return;        }        if (!kar_mem_initialized)        {                kar_mem_initialized = 1;                for (aneg = (5 * KAR_DEPTH) - 1; aneg >= 0; aneg--)                        kar_mem[aneg] = (verylong) 0;        }        if (aneg = (*a < 0))                a[0] = -a[0];        kar_sq2(a, c, (long) 0);        if (aneg)                a[0] = -a[0];}#  define zaddmulp2(_a, _b, _d, _t) \{ \        register long lb = (_b); \        register long ld = (_d); \        register long b1 = (_b) & RADIXROOTM; \        register long d1 = (_d) & RADIXROOTM; \        register long aa = *(_a) + b1 * d1; \ \        b1 = b1 * (ld >>= NBITSH) + d1 * (lb >>= NBITSH) + (aa >> NBITSH); \        aa = (aa & RADIXROOTM) + ((b1 & RADIXROOTM) << NBITSH) + *(_t); \        *(_t) = ld * lb + (b1 >> NBITSH) + (aa >> NBITS); \        *(_a) = (aa & RADIXM); \}#define zaddmul2(ams, ama, amb) \{ \        register long lami; \        register long lams = (ams); \        register verylong lama = (ama); \        register verylong lamb = (amb); \        long lamcarry = 0; \ \        for (lami = (*lamb++); lami > 0; lami--) \        { \                zaddmulp2(lama, *lamb, lams, &lamcarry); \        /* Be careful, the last lama is unnormalized */ \                lama++; \                lamb++; \        } \        *lama += lamcarry; \}kar_mul2(	verylong a,	verylong b,	verylong *c,	long shi	){	register long al;	register long hal;	register long i;	register long restoreb0 = b[0];	register verylong pc;	register long bbig = 1;	verylong *a0;	verylong *a1;	verylong *a2;	verylong *a3;	verylong *a4;	zsetlength(c, (hal = (al = a[0]) + (i = b[0])), "in kar_mul, third argument");	if ((shi >= (5 * KAR_DEPTH)) || (al < K_M_C) || (i < K_M_C))	{		pc = &(*c)[1];		for (i = hal; i > 0; i--)			*pc++ = 0;		pc = &(*c)[1];		if (al <= *b)			for (i = al; i; i--)			{				zaddmul2(*(++a), pc++, b);			}		else			for (i = *b; i; i--)			{				zaddmul2(*(++b), pc++, a);			}		while ((hal > 1) && (!((*c)[hal])))			hal--;		(*c)[0] = hal;		return;	}	a0 = &(kar_mem[shi]);	a1 = &(kar_mem[shi + 1]);	a2 = &(kar_mem[shi + 2]);	a3 = &(kar_mem[shi + 3]);	a4 = &(kar_mem[shi + 4]);	hal = ((al + 1) >> 1);	zsetlength(a0, al, "in kar_mul, locals\n");	zsetlength(a1, al, "");	zsetlength(a2, al, "");	zsetlength(a3, al + hal, "");	zsetlength(a4, al + 2, "");	i = hal;	while ((i > 1) && (!(a[i])))		i--;	a[0] = i;	if (hal >= b[0])		bbig = 0;	else	{		i = hal;		while ((i > 1) && (!(b[i])))			i--;		b[0] = i;	}	for (i = hal + 1; i <= al; i++)		(*a1)[i - hal] = a[i];	(*a1)[0] = al - hal;	if (bbig)	{		for (i = hal + 1; i <= restoreb0; i++)			(*a3)[i - hal] = b[i];		(*a3)[0] = restoreb0 - hal;	}	kar_mul2(a, b, a4, shi + 5);	zadd(a, (*a1), a0);	a[0] = al;	if (bbig)	{		kar_mul2((*a1), (*a3), c, shi + 5);		zadd(b, (*a3), a2);		b[0] = restoreb0;		kar_mul2((*a0), (*a2), a3, shi + 5);	}	else		kar_mul2((*a0), b, a3, shi + 5);	zsubpos((*a3), (*a4), a3);	if (bbig)		zsubpos((*a3), *c, a3);	zlshift((*a3), hal * NBITS, a3);	hal <<= 1;	if (bbig)	{		for (i = (*c)[0]; i; i--)			(*c)[i + hal] = (*c)[i];		for (i = hal; i > (*a4)[0]; i--)			(*c)[i] = 0;		for (; i; i--)			(*c)[i] = (*a4)[i];		(*c)[0] += hal;	}	else

⌨️ 快捷键说明

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