Wrong square root computation
guidovranken opened this issue · 5 comments
guidovranken commented
#include <relic_conf.h>
#include <relic.h>
int main(void)
{
if ( core_init() != RLC_OK ) abort();
bn_t A, R;
bn_null(A); bn_new(A);
bn_null(R); bn_new(R);
//const char* s = "16";
const char* s = "64";
/* noret */ bn_read_str(A, s, strlen(s), 10);
/* noret */ bn_srt(R, A);
int outsize = bn_size_str(R, 10);
char* s2 = malloc(outsize);
/* noret */ bn_write_str(s2, outsize, R, 10);
printf("%s\n", s2);
free(s2);
bn_free(A);
bn_free(R);
return 0;
}
It says the square root of 16 is 5, and the square root of 64 is 9. Is this a bug or an internal rounding effect that's deemed acceptable?
dfaranha commented
Embarrasing. :)
The function itself was only used in the library to approximate square roots for half-gcd computations, but there is no reason for blatant errors there.
guidovranken commented
Thanks for the quick fix.
guidovranken commented
Sqrt(7) now hangs
#include <relic_conf.h>
#include <relic.h>
int main(void)
{
if ( core_init() != RLC_OK ) abort();
bn_t A, R;
bn_null(A); bn_new(A);
bn_null(R); bn_new(R);
const char* s = "7";
/* noret */ bn_read_str(A, s, strlen(s), 10);
/* noret */ bn_srt(R, A);
int outsize = bn_size_str(R, 10);
char* s2 = malloc(outsize);
/* noret */ bn_write_str(s2, outsize, R, 10);
printf("%s\n", s2);
free(s2);
bn_free(A);
bn_free(R);
return 0;
}
dfaranha commented
Just pushed a commit hopefully fixing this in a more robust way, with more unit tests.
guidovranken commented
Thanks, I'll test.