⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bn_s_mp_sqr.c

📁 tommath库
💻 C
字号:
#include <tommath.h>#ifdef BN_S_MP_SQR_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ints_mp_sqr (mp_int * a, mp_int * b){  mp_int  t;  int     res, ix, iy, pa;  mp_word r;  mp_digit u, tmpx, *tmpt;  pa = a->used;  if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) {    return res;  }  /* default used is maximum possible size */  t.used = 2*pa + 1;  for (ix = 0; ix < pa; ix++) {    /* first calculate the digit at 2*ix */    /* calculate double precision result */    r = ((mp_word) t.dp[2*ix]) +        ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]);    /* store lower part in result */    t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK));    /* get the carry */    u           = (mp_digit)(r >> ((mp_word) DIGIT_BIT));    /* left hand side of A[ix] * A[iy] */    tmpx        = a->dp[ix];    /* alias for where to store the results */    tmpt        = t.dp + (2*ix + 1);        for (iy = ix + 1; iy < pa; iy++) {      /* first calculate the product */      r       = ((mp_word)tmpx) * ((mp_word)a->dp[iy]);      /* now calculate the double precision result, note we use       * addition instead of *2 since it's easier to optimize       */      r       = ((mp_word) *tmpt) + r + r + ((mp_word) u);      /* store lower part */      *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK));      /* get carry */      u       = (mp_digit)(r >> ((mp_word) DIGIT_BIT));    }    /* propagate upwards */    while (u != ((mp_digit) 0)) {      r       = ((mp_word) *tmpt) + ((mp_word) u);      *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK));      u       = (mp_digit)(r >> ((mp_word) DIGIT_BIT));    }  }  mp_clamp (&t);  mp_exch (&t, b);  mp_clear (&t);  return MP_OKAY;}#endif

⌨️ 快捷键说明

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