Miracle密码算法开源库(五)分析 :mrarth3.c

本文主要分析Miracle密码算法开源库中的mrarth3.c文件,重点讲解expint()、nroot()和power()三个函数。expint()用于计算大数的幂;power()实现大数的幂运算,包括模幂运算;nroot()则求解大数的1/n次方,采用牛顿-拉夫逊方法求解近似值。
摘要由CSDN通过智能技术生成

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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值