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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bigd.c

?? RSA operation library.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* $Id: bigd.c $ */

/******************** SHORT COPYRIGHT NOTICE**************************
This source code is part of the BigDigits multiple-precision
arithmetic library Version 2.1 originally written by David Ireland,
copyright (c) 2001-6 D.I. Management Services Pty Limited, all rights
reserved. It is provided "as is" with no warranties. You may use
this software under the terms of the full copyright notice
"bigdigitsCopyright.txt" that should have been included with this
library or can be obtained from <www.di-mgt.com.au/bigdigits.html>.
This notice must always be retained in any copy.
******************* END OF COPYRIGHT NOTICE***************************/
/*
	Last updated:
	$Date: 2006-08-23 11:13:00 $
	$Revision: 2.1.0 $
	$Author: dai $
*/

/* BIGD "bd" wrapper functions around BigDigits "mp" functions */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "bigd.h"
#include "bigdigits.h"

/* Required for opaque pointers */
#define T BIGD
struct T
{
	DIGIT_T *digits;	/* Ptr to array of digits, least sig. first */
	size_t ndigits;		/* No of non-zero significant digits */
	size_t maxdigits;	/* Max size allocated */
};

/* 
All these functions MUST make sure that there are always
enough digits before doing anything, and SHOULD reset <ndigits>
afterwards to reflect the final significant size.
<maxdigits> is the size allocated.
<ndigits> may be zero.
<ndigits> may be too long if MS digits compute to zero so
consider it a limit on significant digits, not gospel.

It is an error to pass a NULL BIGD parameter except to bdFree.
*/

#ifdef _DEBUG
static int debug = 0; /* <= change this to > 0 for console debugging */
#else
static int debug = 0; /* <= ALWAYS ZERO */
#endif

/* Useful definitions */
#ifndef FALSE
#define FALSE               0
#endif
#ifndef TRUE
#define TRUE                1
#endif
#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif


T bdNew(void)
{
	struct T *p;
	p = calloc(1, (long)sizeof(*p));
	if (!p)
	{
		mpFail("bdNew: Failed to calloc memory.");
	}
	copyright_notice();	
	/* set up with single zero digit */
	p->digits = mpAlloc(1);
	p->digits[0] = 0;
	p->ndigits = 0;
	p->maxdigits = 1;
	return p;
}

void bdFree(T *p)
/* Zeroise and free memory. Set ptr to NULL. */
{
	T bd = *p;
	if (*p)
	{
		/* Zeroise them all, just in case */
		if (bd->digits)
		{
			mpSetZero(bd->digits, bd->maxdigits);
			free(bd->digits);
		}
		bd->maxdigits = 0;
		bd->ndigits = 0;
		free(*p);
	}
	*p = NULL;
}

static int bd_resize(T b, size_t newsize)
{
/* 
Internal fn to re-size a BIGD structure before a calc.
Use carefully!
1. If growing, it allocs more digits and increases maxdigits
2. If shrinking, it decreases ndigits and zeroises the excess.
3. It does not increase b->ndigits; that's up to you later.
4. It does not release excess digits; use bdFree.

In other words, it's like middle-aged spread: 
you go from a 32" waist to a 38 but can never go backwards.

Be careful doing the following:-
	n = new_size_we_expect;
	bd_resize(b, n);
	mpFunctionOfSorts(b->digits, n);
	b->ndigits = mpSizeof(b->digits, b->ndigits); // NO!

b->ndigits may be set too short

Better:
	n = new_size_we_expect;
	bd_resize(b, n);
	mpFunctionOfSorts(b->digits, n);
	b->ndigits = mpSizeof(b->digits, n);  // Yes.

*/

	size_t i;

	/* Check just in case NULL */
	assert(b);

	/* If we are shrinking, clear high digits */
	if (newsize < b->ndigits)
	{
		for (i = newsize; i < b->ndigits; i++)
			b->digits[i] = 0;
		b->ndigits = newsize;
		return 0;
	}

	/* We need more room */
	if (b->maxdigits < newsize)
	{
		/* Increase size of digit array */
		b->digits = (DIGIT_T *)realloc(b->digits, newsize * sizeof(DIGIT_T));
		
		/* Check for failure */
		if (!b->digits)
		{
			mpFail("bd_resize: Failed to realloc memory.");
		}

		b->maxdigits = newsize;	/* Remember new max */
	}

	/* Make sure new digits are zero */
	for (i = b->ndigits; i < newsize; i++)
		b->digits[i] = 0;

	return 0;
}

size_t bdConvFromOctets(T b, const unsigned char *c, size_t nbytes)
/* Converts nbytes octets into big digit b, resizing if necessary */
{
	size_t ndigits, n;

	assert(b);
	ndigits = (nbytes + OCTETS_PER_DIGIT - 1) / OCTETS_PER_DIGIT;

	bd_resize(b, ndigits);
	
	n = mpConvFromOctets(b->digits, ndigits, c, nbytes);
	b->ndigits = mpSizeof(b->digits, n);

	return n;
}

size_t bdConvToOctets(T b, unsigned char *c, size_t nbytes)
/* Convert big digit b into string of octets, in big-endian order,
   padding to nbytes or truncating if necessary.
   Returns # significant bytes. 
   If c is NULL or nbytes == 0 then just return required size.
*/
{
	size_t noctets, nbits, n;

	assert(b);

	nbits = mpBitLength(b->digits, b->ndigits);
	noctets = (nbits + 7) / 8;

	if (!c || 0 == nbytes)
	{
		return noctets;
	}

	n = mpConvToOctets(b->digits, b->ndigits, c, nbytes);

	return noctets;
}

size_t bdConvFromHex(T b, const char *s)
/* Converts a hex string into big digit b */
{
	size_t ndigits, n;

	assert(b);

	/* Revision [2006-02-21] */
	/* EDIT: ndigits = (strlen(s) / 2 + OCTETS_PER_DIGIT - 1) / OCTETS_PER_DIGIT; */
	ndigits = ((strlen(s) + 1) / 2 + OCTETS_PER_DIGIT - 1) / OCTETS_PER_DIGIT;
	bd_resize(b, ndigits);

	n = mpConvFromHex(b->digits, ndigits, s);
	b->ndigits = mpSizeof(b->digits, n);

	return n;
}

size_t bdConvToHex(T b, char *s, size_t smax)
{
	assert(b);
	return mpConvToHex(b->digits, b->ndigits, s, smax);
}

size_t bdConvFromDecimal(BIGD b, const char *s)
{
	size_t ndigits, n;

	assert(b);
	/* approx size but never too small */
	ndigits = (strlen(s) / 2 + OCTETS_PER_DIGIT) / OCTETS_PER_DIGIT;
	bd_resize(b, ndigits);

	n = mpConvFromDecimal(b->digits, ndigits, s);
	b->ndigits = n;

	return n;
}

size_t bdConvToDecimal(BIGD b, char *s, size_t smax)
{
	assert(b);
	return mpConvToDecimal(b->digits, b->ndigits, s, smax);
}

int bdSetShort(T b, bdigit_t value)
	/* Converts value into a (single-digit) big digit b */
{
	assert(b);
	bd_resize(b, 1);
	b->digits[0] = (DIGIT_T)value;
	b->ndigits = (value ? 1 : 0);
	return 0;
}

size_t bdBitLength(T b)
	/* Returns base-1 index to most significant bit in b */
{
	assert(b);
	return mpBitLength(b->digits, b->ndigits);
}

size_t bdSizeof(T b)
	/* Returns number of significant non-zero bytes in b */
{
	assert(b);
	return mpSizeof(b->digits, b->ndigits);
}

/* Print function for bigdigit_t structures */

void bdPrint(T p, size_t flags)
{
	size_t n;

	assert(p);
	n = p->ndigits;
	if (n == 0) n = 1;

	if (flags & BD_PRINT_TRIM)	/* Trim leading zeroes */
	{
		if (flags & BD_PRINT_NL)	/* add newlines */
			mpPrintTrimNL(p->digits, n);
		else
			mpPrintTrim(p->digits, n);
	}
	else
	{
		if (flags & BD_PRINT_NL)	/* add newlines */
			mpPrintNL(p->digits, n);
		else
			mpPrint(p->digits, n);
	}
}

int bdIsEqual(T a, T b)
{
	/*	Returns true if a == b, else false */
	size_t n, na, nb;

	assert(a && b);
	/* We can't trust ndigits */
	na = mpSizeof(a->digits, a->ndigits);
	nb = mpSizeof(b->digits, b->ndigits);
	
	if (na != nb)
		return FALSE;
	if (na == 0 && nb == 0)
		return TRUE;

	/* Otherwise we have equal lengths */
	n = na;
	while (n--)
	{
		if (a->digits[n] != b->digits[n])
			return FALSE;
	}

	return TRUE;
}

int bdIsZero(T a)
	/* Returns true if a == 0, else false */
{
	assert(a);
	return mpIsZero(a->digits, a->ndigits);
}

int bdShortCmp(T a, bdigit_t d)
	/* Returns sign of (a-d) */
{
	assert(a);
	return mpShortCmp(a->digits, d, a->ndigits);
}

int bdCompare(T a, T b)
	/*	Returns sign of (a-b) */
{
	size_t n, na, nb;

	assert(a && b);
	if (a->ndigits != b->ndigits)
	{
		na = mpSizeof(a->digits, a->ndigits);
		nb = mpSizeof(b->digits, b->ndigits);
		if (na > nb) return 1;
		if (na < nb) return -1;
		n = na;
	}
	else
		n = a->ndigits;

	return mpCompare(a->digits, b->digits, n);
}

int bdIsEven(T a)
{
	assert(a);
	return ISEVEN(a->digits[0]);
}

int bdIsOdd(T a)
{
	assert(a);
	return ISODD(a->digits[0]);
}


int bdSetEqual(T a, T b)
	/*	Sets a = b */
{
	assert(a && b);
	bd_resize(a, b->ndigits);
	mpSetEqual(a->digits, b->digits, b->ndigits);
	a->ndigits = b->ndigits;
	return 0;
}

int bdSetZero(T a)
	/* Sets a = 0 */
{
	assert(a);
	mpSetZero(a->digits, a->ndigits);
	a->ndigits = 0;
	return 0;
}

int bdShortAdd(T w, T u, bdigit_t d)
	/* Compute w = u + d, 
	returns 1 if we had a carry */
{
	DIGIT_T carry;
	size_t dig_size = max(u->ndigits, 1);

	assert(w && u);
	bd_resize(w, dig_size + 1);

	carry = mpShortAdd(w->digits, u->digits, d, dig_size);

	/* Cope with overflow */
	if (carry)
	{
		w->digits[dig_size] = carry;
		w->ndigits = dig_size + 1;
	}
	else
		w->ndigits = dig_size;	

	return carry;
}

int bdAdd(T w, T u, T v)
	/* Compute w = u + v, w#v*/
{
	size_t dig_size;
	DIGIT_T carry;

	assert(w && u && v);
	/* Check for cheaper option */
	if (v->ndigits == 1)
		return bdShortAdd(w, u, v->digits[0]);

	/* Make sure u and v are the same size */
	dig_size = max(u->ndigits, v->ndigits);
	bd_resize(v, dig_size);
	bd_resize(u, dig_size);
	/* Now make sure w is big enough for sum (incl carry) */
	bd_resize(w, dig_size + 1);

	/* Finally, do the business */
	carry = mpAdd(w->digits, u->digits, v->digits, dig_size);

	/* Make sure we've set the right size for w */
	if (carry)
	{
		w->digits[dig_size] = carry;
		w->ndigits = dig_size + 1;
	}
	else
		w->ndigits = mpSizeof(w->digits, dig_size);	

	return carry;
}

int bdAddEx(T w, T u, T v)
	/* Compute w = u + v (safe) */
{
	DIGIT_T carry;
	T ww;

	assert(w && u && v);
	/* Use temp */
	ww = bdNew();
	bdSetEqual(ww, w);

	carry = bdAdd(ww, u, v);

	bdSetEqual(w, ww);
	bdFree(&ww);

	return carry;
}

int bdShortSub(T w, T u, bdigit_t d)
	/* Compute w = u - d, return borrow */
{
	DIGIT_T borrow;
	size_t dig_size = max(u->ndigits, 1);

	assert(w && u);
	bd_resize(w, dig_size);

	borrow = mpShortSub(w->digits, u->digits, d, dig_size);

	w->ndigits = dig_size;	

	return borrow;
}

int bdSubtract(T w, T u, T v)
	/* Compute w = u - v, return borrow, w#v */
{
	size_t dig_size;
	DIGIT_T borrow;

	assert(w && u && v);
	/* Check for cheaper option */
	if (v->ndigits == 1)
		return bdShortSub(w, u, v->digits[0]);

	/* Make sure u and v are the same size */
	dig_size = max(u->ndigits, v->ndigits);
	bd_resize(v, dig_size);
	bd_resize(u, dig_size);
	bd_resize(w, dig_size);

	/* Finally, do the business */
	borrow = mpSubtract(w->digits, u->digits, v->digits, dig_size);

	/* Make sure we've set the right size for w */
	w->ndigits = mpSizeof(w->digits, dig_size);	

	return borrow;
}

int bdSubtractEx(T w, T u, T v)
	/* Compute w = u - v (safe) */
{
	DIGIT_T carry;
	T ww;

	assert(w && u && v);
	/* Use temp */
	ww = bdNew();
	bdSetEqual(ww, w);

	carry = bdSubtract(ww, u, v);

	bdSetEqual(w, ww);
	bdFree(&ww);

	return carry;
}

int bdIncrement(T a)
	/* Sets a = a + 1, returns carry */
{
	assert(a);
	return bdShortAdd(a, a, 1);
}

int bdDecrement(T a)
	/* Sets a = a - 1, returns borrow */
{
	assert(a);
	return bdShortSub(a, a, 1);
}

int bdShortMult(T w, T u, bdigit_t d)
	/* Compute w = u * d */
{
	DIGIT_T overflow;
	size_t dig_size = u->ndigits;

	assert(w && u);
	bd_resize(w, dig_size+1);

	overflow = mpShortMult(w->digits, u->digits, d, dig_size);

	/* Cope with overflow */
	if (overflow)
	{
		w->digits[dig_size] = overflow;
		w->ndigits = dig_size + 1;
	}
	else
		w->ndigits = mpSizeof(w->digits, dig_size);	

	return 0;
}

int bdMultiply(T w, T u, T v)
	/* Compute w = u * v 
	   -- no overlap permitted
	*/
{
	size_t dig_size;

	assert(w && u && v);
	/* Check for cheaper option */
	if (v->ndigits == 1)
		return bdShortMult(w, u, v->digits[0]);

	/* Make sure u and v are the same size */
	dig_size = max(u->ndigits, v->ndigits);
	bd_resize(v, dig_size);
	bd_resize(u, dig_size);
	/* Now make sure w is big enough for product */
	bd_resize(w, 2 * dig_size);

	/* Finally, do the business */
	mpMultiply(w->digits, u->digits, v->digits, dig_size);

	/* Make sure we've set the right size for w */
	w->ndigits = mpSizeof(w->digits, 2 * dig_size);	

	return 0;
}

int bdMultiplyEx(T w, T u, T v)
	/* Compute w = u * v (safe) */
{
	T ww;

	assert(w && u && v);
	/* Use temp */
	ww = bdNew();
	bdSetEqual(ww, w);

	bdMultiply(ww, u, v);

	bdSetEqual(w, ww);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色吧成人激情小说| 777xxx欧美| 日韩1区2区日韩1区2区| 欧美经典三级视频一区二区三区| 日本精品裸体写真集在线观看 | 国产乱人伦偷精品视频免下载| 亚洲日本护士毛茸茸| 日韩免费高清av| 欧美日韩高清一区二区| 99在线精品观看| 国产精品亚洲视频| 喷白浆一区二区| 亚洲高清在线精品| 亚洲人成小说网站色在线| 日韩精品在线网站| 欧美精品99久久久**| 91亚洲精品乱码久久久久久蜜桃| 精品一区二区三区免费观看| 午夜日韩在线电影| 日韩毛片高清在线播放| 欧美韩日一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 欧美高清视频一二三区 | 亚洲天堂精品视频| 中文字幕第一页久久| 亚洲精品在线一区二区| 日韩一区二区三区观看| 欧美日韩免费观看一区二区三区 | 亚洲欧洲精品成人久久奇米网| 精品久久久久久久久久久久久久久久久 | 国产精品美女久久久久久久久久久| 日韩精品一区二区三区中文不卡| 欧美日韩精品专区| 欧美蜜桃一区二区三区| 欧美日韩大陆一区二区| 欧美三日本三级三级在线播放| 日本精品视频一区二区| 色天使色偷偷av一区二区| a4yy欧美一区二区三区| 99九九99九九九视频精品| 不卡视频在线看| 99久久精品国产毛片| 91小视频免费观看| 欧美亚洲综合久久| 欧美高清精品3d| 欧美一区二区三区视频在线| 日韩欧美色综合| 久久在线观看免费| 国产女主播在线一区二区| 国产日韩欧美一区二区三区综合| 国产三级一区二区| 国产精品久99| 亚洲自拍偷拍网站| 日韩精品电影在线| 国模冰冰炮一区二区| 国产成人在线电影| 97精品久久久午夜一区二区三区| 97久久超碰精品国产| 欧美日韩一区二区三区免费看| 在线成人免费观看| www国产成人| 亚洲欧美在线另类| 亚洲电影在线播放| 精品一区二区综合| 99久久婷婷国产综合精品| 91久久精品一区二区| 欧美日韩高清一区二区| www激情久久| 亚洲精品成人悠悠色影视| 天堂一区二区在线免费观看| 久久精品久久精品| 成人黄色综合网站| 欧美美女bb生活片| 国产欧美日韩综合| 亚洲第一搞黄网站| 国产精品亚洲一区二区三区妖精| 一本大道综合伊人精品热热| 欧美久久久久久蜜桃| 久久精品水蜜桃av综合天堂| 亚洲最色的网站| 激情欧美一区二区| 色综合久久综合| 欧美成人午夜电影| 亚洲情趣在线观看| 久久国产日韩欧美精品| 91美女在线看| 欧美成人精品福利| 亚洲国产日日夜夜| 福利电影一区二区| 欧美浪妇xxxx高跟鞋交| 中日韩免费视频中文字幕| 午夜av电影一区| 91影院在线免费观看| 精品成人在线观看| 亚洲无人区一区| av在线综合网| 久久久久久久久久久黄色| 亚洲午夜久久久久| 99久久er热在这里只有精品15| 日韩午夜在线观看视频| 一区二区三区影院| 粉嫩在线一区二区三区视频| 91精品国产乱| 亚洲一区二区三区中文字幕| 成人精品高清在线| 欧美成人在线直播| 日本不卡视频在线观看| 在线观看视频欧美| 中文字幕中文乱码欧美一区二区| 韩国三级在线一区| 91精品国产欧美一区二区成人| 亚洲女人小视频在线观看| 国产91精品一区二区麻豆网站| 欧美日韩免费视频| 亚洲二区视频在线| 在线亚洲高清视频| 一区二区三区在线免费| 99久久精品国产精品久久| 国产网红主播福利一区二区| 久久精品国产一区二区| 欧美日韩成人综合在线一区二区| 一区二区三区**美女毛片| 99在线热播精品免费| 亚洲国产成人私人影院tom| 国产毛片精品视频| 日韩欧美中文字幕公布| 美女脱光内衣内裤视频久久影院| 欧美日韩一区二区在线观看视频| 亚洲一二三四在线观看| 日本高清视频一区二区| 一区二区三区在线视频观看58| 91视频www| 亚洲视频电影在线| 日本丶国产丶欧美色综合| 亚洲另类中文字| 在线视频综合导航| 亚洲一区二区精品3399| 欧美日韩美女一区二区| 日韩一区精品字幕| 日韩西西人体444www| 黄色小说综合网站| 亚洲欧美激情一区二区| 成人涩涩免费视频| 亚洲欧洲日产国码二区| 色婷婷久久久亚洲一区二区三区| 一区二区三区色| 欧美日韩在线一区二区| 石原莉奈在线亚洲二区| 日韩精品一区二区在线观看| 国产在线精品一区二区夜色| 国产亚洲欧美激情| 91美女在线看| 日韩 欧美一区二区三区| 精品国产99国产精品| 国产91精品在线观看| 亚洲男人的天堂在线aⅴ视频| 欧美探花视频资源| 免费在线观看一区| 久久精品视频免费| 欧洲国产伦久久久久久久| 午夜精品福利视频网站| 精品久久久久久久久久久久包黑料 | 欧美色精品在线视频| 久久99九九99精品| 日韩伦理电影网| 欧美肥妇free| 国产成人鲁色资源国产91色综| 亚洲人成小说网站色在线| 欧美一区二区三区人| 成人三级伦理片| 午夜精品福利久久久| 国产农村妇女毛片精品久久麻豆| 91麻豆产精品久久久久久| 免费人成黄页网站在线一区二区 | 精品国产3级a| 不卡的av电影| 日韩av电影天堂| 国产精品另类一区| 8x8x8国产精品| 成人av网址在线| 日本 国产 欧美色综合| 成人欧美一区二区三区1314| 欧美精品久久久久久久多人混战| 国产激情一区二区三区四区| 一区二区三区日韩| 久久亚洲欧美国产精品乐播| 日本丶国产丶欧美色综合| 国产一区二区三区四区五区美女 | 亚洲精品ww久久久久久p站| 日韩一区二区三区电影在线观看| 成人免费三级在线| 免费看日韩a级影片| 有码一区二区三区| 国产精品系列在线| 欧美电影一区二区三区| 成年人国产精品| 精品一区二区三区蜜桃| 亚洲一级在线观看| 日韩码欧中文字| 国产午夜久久久久|