pb_monic.c

来自「多项式算法库,实现多项式算法,可以支持任意长度的多项式,主要用在密码学中,验证过」· C语言 代码 · 共 61 行

C
61
字号
/* LibTomPoly, Polynomial Basis Math -- Tom St Denis  *  * LibTomPoly is a public domain library that provides * polynomial basis arithmetic support.  It relies on * LibTomMath for large integer support. * * This library is free for all purposes without any * express guarantee that it works. * * Tom St Denis, tomstdenis@iahu.ca, http://poly.libtomcrypt.org */#include <tompoly.h>/* makes b equal to the monic polynomial form of a */int pb_monic(pb_poly *a, pb_poly *b){   mp_int tmp;   int err, x;   /* must be in GF(p)[x] */   if (mp_iszero(&(b->characteristic)) == MP_YES) {      return MP_VAL;   }   /* if it's already monic  just copy */   if (a->used == 0 || mp_cmp_d(&(a->terms[a->used - 1]), 1) == MP_EQ) {      return pb_copy(a, b);   }   /* grow b to hold result */   if (b->alloc < a->used) {      if ((err = pb_grow(b, a->used)) != MP_OKAY) {         return err;      }   }   /* now init tmp and find the inverse of the leading digit */   if ((err = mp_init(&tmp)) != MP_OKAY) {      return err;   }   if ((err = mp_invmod(&(a->terms[a->used-1]), &(b->characteristic), &tmp)) != MP_OKAY)             { goto _ERR; }   /* now reduce each coefficient */   for (x = 0; x < a->used; x++) {       if ((err = mp_mulmod(&(a->terms[x]), &tmp, &(b->characteristic), &(b->terms[x]))) != MP_OKAY) { goto _ERR; }   }   /* zero excess digits */   for (x = a->used; x < b->used; x++) {       mp_zero(&(b->terms[x]));   }   b->used = a->used;   err = MP_OKAY;_ERR: mp_clear(&tmp);   return err;}

⌨️ 快捷键说明

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