POLY: fix pb_inverse_poly_q()
Should be correct now. Had to add get_degree(), because pb_clamp() in conjunction with pb_cmp() does not give expected results, see https://github.com/libtom/libtompoly/issues/3 ...so don't use it.
This commit is contained in:
parent
3428dedc2c
commit
302cd5e4d8
48
src/poly.c
48
src/poly.c
@ -29,6 +29,13 @@
|
|||||||
#include <tommath.h>
|
#include <tommath.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* static declarations
|
||||||
|
*/
|
||||||
|
static unsigned int get_degree(pb_poly const * const poly);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a mp_int and check if this was successful, the
|
* Initialize a mp_int and check if this was successful, the
|
||||||
* caller must free new_int with mp_clear().
|
* caller must free new_int with mp_clear().
|
||||||
@ -233,6 +240,23 @@ void pb_xor(pb_poly *a,
|
|||||||
MP_XOR(&(a->terms[i]), &(b->terms[i]), &(c->terms[i]));
|
MP_XOR(&(a->terms[i]), &(b->terms[i]), &(c->terms[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the degree of the polynomial.
|
||||||
|
*
|
||||||
|
* @param poly the polynomial
|
||||||
|
* @return the degree
|
||||||
|
*/
|
||||||
|
static unsigned int get_degree(pb_poly const * const poly)
|
||||||
|
{
|
||||||
|
unsigned int count = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < poly->alloc; i++)
|
||||||
|
if (mp_iszero(&(poly->terms[i])) == MP_NO)
|
||||||
|
count = i;
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invert the polynomial a modulo q.
|
* Invert the polynomial a modulo q.
|
||||||
*
|
*
|
||||||
@ -248,20 +272,17 @@ bool pb_inverse_poly_q(pb_poly * const a,
|
|||||||
int k = 0,
|
int k = 0,
|
||||||
j = 0,
|
j = 0,
|
||||||
v = 2;
|
v = 2;
|
||||||
int zero_poly_val = 1;
|
pb_poly *a_tmp, *b, *c, *f, *g;
|
||||||
pb_poly *a_tmp, *b, *c, *f, *g, *degree_zero_poly;
|
|
||||||
|
|
||||||
degree_zero_poly = build_polynom(&zero_poly_val, 1, ctx);
|
b = build_polynom(NULL, ctx->N + 1, ctx);
|
||||||
b = build_polynom(NULL, ctx->N, ctx);
|
|
||||||
mp_set(&(b->terms[0]), 1);
|
mp_set(&(b->terms[0]), 1);
|
||||||
c = build_polynom(NULL, ctx->N, ctx);
|
c = build_polynom(NULL, ctx->N + 1, ctx);
|
||||||
f = build_polynom(NULL, ctx->N, ctx);
|
f = build_polynom(NULL, ctx->N + 1, ctx);
|
||||||
PB_COPY(a, f);
|
PB_COPY(a, f);
|
||||||
g = build_polynom(NULL, ctx->N, ctx);
|
g = build_polynom(NULL, ctx->N + 1, ctx);
|
||||||
mp_set(&(g->terms[0]), 1);
|
mp_set(&(g->terms[0]), 1);
|
||||||
mp_neg(&(g->terms[0]), &(g->terms[0]));
|
mp_neg(&(g->terms[0]), &(g->terms[0]));
|
||||||
mp_set(&(g->terms[ctx->N]), 1);
|
mp_set(&(g->terms[ctx->N]), 1);
|
||||||
|
|
||||||
/* avoid side effects */
|
/* avoid side effects */
|
||||||
a_tmp = build_polynom(NULL, ctx->N, ctx);
|
a_tmp = build_polynom(NULL, ctx->N, ctx);
|
||||||
PB_COPY(a, a_tmp);
|
PB_COPY(a, a_tmp);
|
||||||
@ -278,14 +299,10 @@ bool pb_inverse_poly_q(pb_poly * const a,
|
|||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hope this does not blow up in our face */
|
if (get_degree(f) == 0)
|
||||||
pb_clamp(degree_zero_poly);
|
|
||||||
pb_clamp(f);
|
|
||||||
if (pb_cmp(f, degree_zero_poly) == PB_DEG_EQ)
|
|
||||||
goto OUT_OF_LOOP;
|
goto OUT_OF_LOOP;
|
||||||
|
|
||||||
pb_clamp(g);
|
if (get_degree(f) < get_degree(g)) {
|
||||||
if (pb_cmp(f, g) == PB_DEG_LT) {
|
|
||||||
pb_exch(f, g);
|
pb_exch(f, g);
|
||||||
pb_exch(b, c);
|
pb_exch(b, c);
|
||||||
}
|
}
|
||||||
@ -318,7 +335,7 @@ OUT_OF_LOOP:
|
|||||||
/* hope this does not blow up in our face */
|
/* hope this does not blow up in our face */
|
||||||
pb_starmultiply(a_tmp, Fq, pb_tmp, ctx, v);
|
pb_starmultiply(a_tmp, Fq, pb_tmp, ctx, v);
|
||||||
PB_SUB(pb_tmp2, pb_tmp, pb_tmp);
|
PB_SUB(pb_tmp2, pb_tmp, pb_tmp);
|
||||||
PB_MOD(pb_tmp, &tmp_v, pb_tmp, ctx);
|
PB_MOD(pb_tmp, &tmp_v, pb_tmp, ctx->N);
|
||||||
pb_starmultiply(Fq, pb_tmp, Fq, ctx, v);
|
pb_starmultiply(Fq, pb_tmp, Fq, ctx, v);
|
||||||
|
|
||||||
mp_clear(&tmp_v);
|
mp_clear(&tmp_v);
|
||||||
@ -340,7 +357,6 @@ OUT_OF_LOOP:
|
|||||||
delete_polynom(c);
|
delete_polynom(c);
|
||||||
delete_polynom(f);
|
delete_polynom(f);
|
||||||
delete_polynom(g);
|
delete_polynom(g);
|
||||||
delete_polynom(degree_zero_poly);
|
|
||||||
|
|
||||||
/* TODO: check if the f * Fq = 1 (mod p) condition holds true */
|
/* TODO: check if the f * Fq = 1 (mod p) condition holds true */
|
||||||
|
|
||||||
|
@ -110,10 +110,10 @@
|
|||||||
mp_error_to_string(result)); \
|
mp_error_to_string(result)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PB_MOD(poly_a, mp_int, poly_out, context) \
|
#define PB_MOD(poly_a, mp_int, poly_out, len) \
|
||||||
{ \
|
{ \
|
||||||
for (unsigned int i = 0; i < context->N; i++) \
|
for (unsigned int i = 0; i < len; i++) \
|
||||||
MP_MOD(&(poly_a->terms[i]), mp_int, &(poly_out->terms[i])); \
|
MP_DIV(&(poly_a->terms[i]), mp_int, NULL, &(poly_out->terms[i])); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PB_COPY(...) \
|
#define PB_COPY(...) \
|
||||||
|
Loading…
Reference in New Issue
Block a user