mpexp.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 95 行

C
95
字号
#include "os.h"#include <mp.h>#include "dat.h"// res = b**e//// knuth, vol 2, pp 398-400enum {	Freeb=	0x1,	Freee=	0x2,	Freem=	0x4,};//int expdebug;voidmpexp(mpint *b, mpint *e, mpint *m, mpint *res){	mpint *t[2];	int tofree;	mpdigit d, bit;	int i, j;	i = mpcmp(e,mpzero);	if(i==0){		mpassign(mpone, res);		return;	}	if(i<0)		sysfatal("mpexp: negative exponent");	t[0] = mpcopy(b);	t[1] = res;	tofree = 0;	if(res == b){		b = mpcopy(b);		tofree |= Freeb;	}	if(res == e){		e = mpcopy(e);		tofree |= Freee;	}	if(res == m){		m = mpcopy(m);		tofree |= Freem;	}	// skip first bit	i = e->top-1;	d = e->p[i];	for(bit = mpdighi; (bit & d) == 0; bit >>= 1)		;	bit >>= 1;	j = 0;	for(;;){		for(; bit != 0; bit >>= 1){			mpmul(t[j], t[j], t[j^1]);			if(bit & d)				mpmul(t[j^1], b, t[j]);			else				j ^= 1;			if(m != nil && t[j]->top > m->top){				mpmod(t[j], m, t[j^1]);				j ^= 1;			}		}		if(--i < 0)			break;		bit = mpdighi;		d = e->p[i];	}	if(m != nil){		mpmod(t[j], m, t[j^1]);		j ^= 1;	}	if(t[j] == res){		mpfree(t[j^1]);	} else {		mpassign(t[j], res);		mpfree(t[j]);	}	if(tofree){		if(tofree & Freeb)			mpfree(b);		if(tofree & Freee)			mpfree(e);		if(tofree & Freem)			mpfree(m);	}}

⌨️ 快捷键说明

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