2021SC@SDUSC 山东大学软件学院软件工程应用与实践
1、mrarth3.c结构
mrarth3.c的总体结构如下,,主要实现了expint()、nroot()、power()三个函数,这一次的博客就是读一下这函数的功能。
2、源代码
void expint(_MIPD_ int b,int n,big x)
{ /* sets x=b^n */
unsigned int bit,un;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
convert(_MIPP_ 1,x);
if (n==0) return;
MR_IN(50)
if (n<0)
{
mr_berror(_MIPP_ MR_ERR_NEG_POWER);
MR_OUT
return;
}
if (b==2) expb2(_MIPP_ n,x);
else
{
bit=1;
un=(unsigned int)n;
while (un>=bit) bit<<=1;
bit>>=1;
while (bit>0)
{ /* ltr method */
multiply(_MIPP_ x,x,x);
if ((bit&un)!=0) premult(_MIPP_ x,b,x);
bit>>=1;
}
}
MR_OUT
}
expint()方法的主要作用就是获得整数b的n次方并把这个数转为大数字的形式。首先调用convert()方法把x转化为1的大数字形式,再看n的数值,n等于0时返回0,n小雨0是发生异常,n等于2时调用expb2()方法直接获得2的n次方的数值。否则的话,先把bit左移到比un大,再把bit左移一位,之后进入循环,先调用multiply()方法获得x的平方,再看bit和un按位与操作是否不等于0,是的话调用premult()方法使x乘以b,最后bit左移一位。
void power(_MIPD_