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

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

?? bn_div.c

?? 實現(xiàn)大整數(shù)的除法運算
?? C
字號:

/************************************************************
  Copyright (C), 2004, Aerospace Information. Co., Ltd.
  FileName: bn_div.cpp
  Author: LSX      Version :  1.0        Date:2004/9/16
  Description:     大數(shù)除法運算,根據(jù)OpenSSL源碼改編      
  Version:         1.0
  Function List:
    1. bn_div      兩個大整數(shù)做除法運算
  History:         
      <author>    <time>     <version >   <desc>
	    LSX     2004/9/16       1.0      加入注釋
************************************************************/

#include <stdio.h>
//#include <openssl/bn.h>
#include "bn_lcl.h"

/* The old slow way */
#if 0

/**************************************************************************************
  Function:     BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
	                   BN_CTX *ctx)
  Description:  兩個大整數(shù)做除法運算
  Calls:        bn_check_top, BN_is_zero, BN_ucmp, BN_copy, BN_num_bits, BN_zero, 
                BN_wexpand, BN_lshift, BN_lshift1, BN_usub, BN_rshift1,
				BN_CTX_start, BN_CTX_get, BN_CTX_end
  Called by:    
  Input:        兩個大整數(shù)m和d, d不為0
  Output:       dv = m / d
                rem = m % d
  Return:       1, if 正確相除
                0, otherwise
  Others:         
**************************************************************************************/
int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx)
{
	int i,nm,nd;
	int ret = 0;
	BIGNUM *D;

	bn_check_top(m);
	bn_check_top(d);
	if (BN_is_zero(d))
	{
		fprintf(stderr,"BN_div by zero error!\n");
		return(0);
	}

	if (BN_ucmp(m,d) < 0)  /*m<d, we can do directly*/
	{
		if (rem != NULL)
		{ 
			if (BN_copy(rem,m) == NULL) 
			{
				return(0); 
			}
		}
		if (dv != NULL) BN_zero(dv);
		return(1);
	}

	BN_CTX_start(ctx);
	D = BN_CTX_get(ctx);
	if (dv == NULL) 
	{
		dv = BN_CTX_get(ctx);
	}
	if (rem == NULL) 
	{
		rem = BN_CTX_get(ctx);
	}
	if (D == NULL || dv == NULL || rem == NULL)
	{
		goto end;
	}

	nd=BN_num_bits(d);
	nm=BN_num_bits(m);
	if (BN_copy(D,d) == NULL) 
	{
		goto end;
	}
	if (BN_copy(rem,m) == NULL)
	{
		goto end;
	}

	/* The next 2 are needed so we can do a dv->d[0]|=1 later
	 * since BN_lshift1 will only work once there is a value :-) */
	BN_zero(dv);
	bn_wexpand(dv,1);
	dv->top=1;

	if (!BN_lshift(D,D,nm-nd))  /*使得除數(shù)與被除數(shù)的bits一樣*/ 
	{
		goto end;
	}
	
	for (i=nm-nd; i>=0; i--)
	{
		if (!BN_lshift1(dv,dv)) 
		{
			goto end;
		}
		if (BN_ucmp(rem,D) >= 0)
		{
			dv->d[0]|=1;
			if (!BN_usub(rem,rem,D))
			{
				goto end;
			}
		}

		if (!BN_rshift1(D,D)) 
		{
			goto end;
		}
	}
	rem->neg=BN_is_zero(rem)?0:m->neg;
	dv->neg=m->neg^d->neg;
	ret = 1;
 end:
	BN_CTX_end(ctx);
	return(ret);
}

#else

/* BN_div computes  dv := num / divisor,  rounding towards zero, and sets up
 * rm  such that  dv*divisor + rm = num  holds.
 * Thus:
 *     dv->neg == num->neg ^ divisor->neg  (unless the result is zero)
 *     rm->neg == num->neg                 (unless the remainder is zero)
 * If 'dv' or 'rm' is NULL, the respective value is not returned.
 */

 /**************************************************************************************
  Function:     BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
	                   BN_CTX *ctx)
  Description:  兩個大整數(shù)做除法運算
  Calls:        bn_check_top, BN_is_zero, BN_ucmp, BN_copy, BN_num_bits, BN_zero, 
                BN_wexpand, BN_lshift, BN_lshift1, BN_usub, BN_rshift1,
				BN_CTX_start, BN_CTX_get, BN_CTX_end
  Called by:    
  Input:        兩個大整數(shù)m和d, d不為0
  Output:       dv = m / d
                rem = m % d
  Return:       1, if 正確相除
                0, otherwise
  Others:         
**************************************************************************************/
int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, BN_CTX *ctx)
{
	int norm_shift,i,j,loop;
	BIGNUM *tmp,wnum,*snum,*sdiv,*res;
	BN_ULONG *resp,*wnump;
	BN_ULONG d0,d1;
	int num_n,div_n;

	bn_check_top(num);
	bn_check_top(divisor);

	if (BN_is_zero(divisor))
	{
		fprintf(stderr,"BN_div by zero error!\n");
		return(0);
	}

	if (BN_ucmp(num,divisor) < 0)
	{
		if (rm != NULL)
		{
			if (BN_copy(rm,num) == NULL) 
			{
				return(0); 
			}
		}
		if (dv != NULL) 
		{
			BN_zero(dv);
		}
		return(1);
	}

	BN_CTX_start(ctx);
	tmp=BN_CTX_get(ctx);
	snum=BN_CTX_get(ctx);
	sdiv=BN_CTX_get(ctx);
	if (dv == NULL)
	{
		res=BN_CTX_get(ctx);
	}
	else
	{
		res=dv;
	}
	if (sdiv == NULL || res == NULL)
	{
		goto err;
	}
	tmp->neg=0;

	/* First we normalise the numbers */
	norm_shift=BN_BITS2-((BN_num_bits(divisor))%BN_BITS2);
	/* add by ZQS,no need normalist! */
	if (norm_shift==BN_BITS2)
	{
		norm_shift=0;
	}
	if (!(BN_lshift(sdiv,divisor,norm_shift))) 
	{
		goto err;
	}
	sdiv->neg=0;
	norm_shift+=BN_BITS2;
	if (!(BN_lshift(snum,num,norm_shift))) 
	{
		goto err;
	}
	snum->neg=0;
	div_n=sdiv->top;
	num_n=snum->top;
	loop=num_n-div_n;

	/* Lets setup a 'window' into snum
	 * This is the part that corresponds to the current
	 * 'area' being divided */
	BN_init(&wnum);
	wnum.d=	 &(snum->d[loop]);
	wnum.top= div_n;
	wnum.dmax= snum->dmax+1; /* a bit of a lie */

	/* Get the top 2 words of sdiv */
	/* i=sdiv->top; */
	d0=sdiv->d[div_n-1];
	d1=(div_n == 1)?0:sdiv->d[div_n-2];

	/* pointer to the 'top' of snum */
	wnump= &(snum->d[num_n-1]);

	/* Setup to 'res' */
	res->neg= (num->neg^divisor->neg);
	if (!bn_wexpand(res,(loop+1))) 
	{
		goto err;
	}
	res->top=loop;
	resp= &(res->d[loop-1]);

	/* space for temp */
	if (!bn_wexpand(tmp,(div_n+1))) 
	{
		goto err;
	}

	if (BN_ucmp(&wnum,sdiv) >= 0)
	{
		if (!BN_usub(&wnum,&wnum,sdiv))
		{
			goto err;
		}
		*resp=1;
		res->d[res->top-1]=1;
	}
	else
	{
		res->top--;
	}
	if (res->top == 0)
	{
		res->neg = 0;
	}
	resp--;

	for (i=0; i<loop-1; i++)
	{
		BN_ULONG q,l0;
		BN_ULONG n0,n1,rem=0;

		n0=wnump[0];
		n1=wnump[-1];
		if (n0 == d0)
		{
			q=BN_MASK2;
		}
		else  /* n0 < d0 */
		{
			BN_ULLONG t2;

			q=(BN_ULONG)(((((BN_ULLONG)n0)<<BN_BITS2)|n1)/d0);
			/*
			 * rem doesn't have to be BN_ULLONG. The least we
			 * know it's less that d0, isn't it?
			 */
			rem=(n1-q*d0)&BN_MASK2;
			t2=(BN_ULLONG)d1*q;

			for (;;)
			{
				if (t2 <= ((((BN_ULLONG)rem)<<BN_BITS2)|wnump[-2]))
				{
					break;
				}
				q--;
				rem += d0;
				if (rem < d0) 
				{
					break;  /* don't let rem overflow */
				}
				t2 -= d1;
			}
		}

		l0=bn_mul_words(tmp->d,sdiv->d,div_n,q);
		wnum.d--; wnum.top++;
		tmp->d[div_n]=l0;
		for (j=div_n+1; j>0; j--)
		{
			if (tmp->d[j-1])
			{
				break;
			}
		}
		tmp->top=j;

		j=wnum.top;
		if (!BN_sub(&wnum,&wnum,tmp)) 
		{
			goto err;
		}

		snum->top=snum->top+wnum.top-j;

		if (wnum.neg)
		{
			q--;
			j=wnum.top;
			if (!BN_add(&wnum,&wnum,sdiv)) 
			{
				goto err;
			}
			snum->top+=wnum.top-j;
		}
		*(resp--)=q;
		wnump--;
	}
	if (rm != NULL)
	{
		/* Keep a copy of the neg flag in num because if rm==num
		 * BN_rshift() will overwrite it.
		 */
		int neg = num->neg;
		BN_rshift(rm,snum,norm_shift);
		if (!BN_is_zero(rm))
		{
			rm->neg = neg;
		}
	}
	BN_CTX_end(ctx);
	return(1);
err:
	BN_CTX_end(ctx);
	return(0);
}

#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲不卡一区二区三区| 亚洲一区二区不卡免费| 欧美激情综合在线| 欧美videofree性高清杂交| 91蜜桃视频在线| 亚洲女女做受ⅹxx高潮| 欧美色区777第一页| 日韩精品免费专区| 国产精品嫩草影院com| 91免费看片在线观看| 国产日韩三级在线| 亚洲欧美日韩电影| 中文字幕综合网| 欧美刺激脚交jootjob| 精品一区二区三区免费观看| 亚洲天堂成人网| 日韩免费电影一区| 欧美综合亚洲图片综合区| 国产精品久久久久久久久果冻传媒| 欧美大片一区二区三区| 欧美大白屁股肥臀xxxxxx| 欧美mv日韩mv国产网站app| 日韩av不卡一区二区| 日本一区二区三区电影| 日韩视频一区二区在线观看| 99久久99久久精品国产片果冻| 美女视频网站久久| 视频一区免费在线观看| 欧美视频日韩视频在线观看| 亚洲午夜久久久久久久久电影院 | 精品国产1区2区3区| 欧美激情中文不卡| 欧美成人一区二区三区在线观看| 欧美亚洲国产一卡| 欧美自拍偷拍午夜视频| 91免费版pro下载短视频| 成人国产精品免费网站| 国产99久久久精品| 床上的激情91.| 欧美视频在线一区二区三区 | 成人动漫视频在线| 91毛片在线观看| 日韩视频永久免费| 国产精品少妇自拍| 一区二区三国产精华液| 蜜桃av噜噜一区二区三区小说| 国产资源在线一区| 99re这里只有精品首页| 欧美美女bb生活片| 国产欧美日韩卡一| 日韩二区三区四区| www.亚洲色图.com| 日韩欧美一二三区| 亚洲欧美日韩综合aⅴ视频| 日本不卡一区二区三区| 国产91精品精华液一区二区三区 | 日本电影亚洲天堂一区| 日韩午夜中文字幕| 亚洲精品日韩专区silk| 国产真实精品久久二三区| 欧美无人高清视频在线观看| 一区二区三区精密机械公司| 日本三级韩国三级欧美三级| 国产激情一区二区三区| 日韩三级免费观看| 国产精品伦理一区二区| 亚洲午夜精品在线| 久久精品国产77777蜜臀| 99re在线精品| 国产亚洲视频系列| 久久99精品久久只有精品| 欧洲一区在线电影| 亚洲天堂福利av| 成人午夜看片网址| 久久综合色8888| 美国三级日本三级久久99| 欧美日韩综合在线| 奇米影视一区二区三区小说| 久久se精品一区精品二区| 亚洲午夜免费视频| 蜜桃久久精品一区二区| 久久久久亚洲蜜桃| 亚洲不卡一区二区三区| 欧美mv日韩mv| 国内精品伊人久久久久av一坑 | 国产精品三级av在线播放| 国产在线精品免费| 欧美大白屁股肥臀xxxxxx| 国产美女精品在线| 久久久久久电影| 99久久亚洲一区二区三区青草| 一本大道av一区二区在线播放 | 精品中文字幕一区二区| 亚洲一区二区视频在线| 中文字幕二三区不卡| 久久99热狠狠色一区二区| 91精品国产欧美一区二区成人| 午夜精品免费在线| 欧美日韩精品一区二区在线播放| 国产真实乱对白精彩久久| 国产精品国产三级国产普通话蜜臀 | 日韩电影在线免费看| 日韩欧美成人午夜| 欧美一二区视频| 18成人在线视频| 婷婷六月综合网| 国产精选一区二区三区| 欧美三级三级三级| 激情亚洲综合在线| 国产精品美女久久久久久久网站| 亚洲国产色一区| 欧美xxxx老人做受| 亚洲精品在线一区二区| 亚洲国产成人av| 日韩精品中文字幕一区| 国产精品69毛片高清亚洲| 国产欧美日韩不卡免费| 久久一留热品黄| 欧美一区二区三区视频免费| 国产精品素人视频| 色综合久久天天综合网| 亚洲欧美日韩在线| 91亚洲大成网污www| 亚洲狠狠丁香婷婷综合久久久| 91成人免费在线视频| 亚洲图片你懂的| 91麻豆精品国产| 尤物av一区二区| 欧美一区二区日韩一区二区| 午夜精品久久久久久久99水蜜桃| 91精品国产综合久久久久久久| 亚洲欧洲另类国产综合| 亚洲午夜av在线| 亚洲一区二区高清| 26uuu久久天堂性欧美| 成人激情小说网站| 欧美国产丝袜视频| 亚洲国产精品t66y| 国产99精品视频| 国产伦精品一区二区三区免费 | 午夜精品免费在线| 欧美一区二区三区四区久久| 欧美日本不卡视频| 亚洲精品在线观看网站| 99视频一区二区| 欧美精品视频www在线观看| 一区二区三区四区五区视频在线观看| 久久久午夜精品理论片中文字幕| 亚洲精品伦理在线| 激情久久久久久久久久久久久久久久| 国产毛片精品国产一区二区三区| 久久久久久久综合色一本| 91福利精品第一导航| 久久久亚洲精品一区二区三区| 欧美日韩另类国产亚洲欧美一级| 欧美在线观看视频一区二区| 欧美一区二区三区免费大片| 亚洲夂夂婷婷色拍ww47| 国产日产欧美一区二区视频| 日韩免费性生活视频播放| 高清不卡一二三区| 日韩欧美成人午夜| 中文字幕日韩精品一区| 久久精品国产在热久久| 夜夜揉揉日日人人青青一国产精品| 一本大道久久a久久精二百| 97国产一区二区| 国产一区二区视频在线播放| 国产欧美日本一区二区三区| 亚洲成人av一区| 美腿丝袜亚洲三区| 欧美一级欧美三级在线观看 | 欧美视频一二三区| 国产福利精品导航| 日本一区二区三区电影| 欧美美女喷水视频| 欧美videos中文字幕| 最新久久zyz资源站| 美国十次了思思久久精品导航| 欧美精品丝袜久久久中文字幕| 大桥未久av一区二区三区中文| 老司机精品视频导航| 国产成人福利片| 99久久免费视频.com| 欧美精品色一区二区三区| 日韩免费电影网站| 曰韩精品一区二区| 国内精品不卡在线| 色先锋aa成人| 国产婷婷色一区二区三区在线| 夜夜操天天操亚洲| 国产美女精品人人做人人爽| 91视视频在线观看入口直接观看www| 欧美性欧美巨大黑白大战| 成人av在线资源网站| 看片网站欧美日韩| 97se亚洲国产综合自在线| 日韩免费视频一区二区| 亚洲国产精品久久一线不卡| 波多野洁衣一区|