Re: mini-gmp mpz_powm incorrect result

2022-08-29 Thread Guido Vranken
Thank you, I have confirmed that your patch resolves the issue.

On Mon, Aug 29, 2022 at 10:29 AM Paul Zimmermann 
wrote:

> thank you, I confirm the bug, here is a potential fix:
>
> $ diff -u mini-gmp.c.orig mini-gmp.c
> --- mini-gmp.c.orig 2022-08-29 10:28:20.700995412 +0200
> +++ mini-gmp.c  2022-08-29 10:27:36.112191428 +0200
> @@ -3060,6 +3060,7 @@
>if (en == 0)
>  {
>mpz_set_ui (r, 1);
> +  mpz_tdiv_r (r, r, m);
>return;
>  }
>
> Paul
>
> > From: Guido Vranken 
> > Date: Sun, 28 Aug 2022 16:22:40 +0200
> >
> > The following program computes 1^0 % 1:
> >
> > //#include 
> > #include "mini-gmp.c"
> > #include 
> >
> > #define CF_CHECK_EQ(expr, res) if ( (expr) != (res) ) { goto end; }
> >
> > int main(void)
> > {
> > mpz_t a, b, c, res;
> > char* s = NULL;
> > /* noret */ mpz_init(a);
> > /* noret */ mpz_init(b);
> > /* noret */ mpz_init(c);
> > /* noret */ mpz_init(res);
> >
> > CF_CHECK_EQ(mpz_set_str(a, "1", 10), 0);
> > CF_CHECK_EQ(mpz_set_str(b, "0", 10), 0);
> > CF_CHECK_EQ(mpz_set_str(c, "1", 10), 0);
> > CF_CHECK_EQ(mpz_set_str(res, "0", 10), 0);
> >
> > /* noret */ mpz_powm(res, a, b, c);
> >
> > printf("%s\n", mpz_get_str(NULL, 10, res));
> > end:
> > return 0;
> > }
> >
> > The result should be 0, which is the case with regular libgmp, but with
> > mini-gmp the result is 1, and this is incorrect.
> >
> > Tested on version 6.2.1 and the latest repository checkout, with recent
> > clang and gcc, on x64 Linux.
> > ___
> > gmp-bugs mailing list
> > gmp-bugs@gmplib.org
> > https://gmplib.org/mailman/listinfo/gmp-bugs
>
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs


Re: mini-gmp mpz_powm incorrect result

2022-08-29 Thread Paul Zimmermann
thank you, I confirm the bug, here is a potential fix:

$ diff -u mini-gmp.c.orig mini-gmp.c
--- mini-gmp.c.orig 2022-08-29 10:28:20.700995412 +0200
+++ mini-gmp.c  2022-08-29 10:27:36.112191428 +0200
@@ -3060,6 +3060,7 @@
   if (en == 0)
 {
   mpz_set_ui (r, 1);
+  mpz_tdiv_r (r, r, m);
   return;
 }

Paul

> From: Guido Vranken 
> Date: Sun, 28 Aug 2022 16:22:40 +0200
> 
> The following program computes 1^0 % 1:
> 
> //#include 
> #include "mini-gmp.c"
> #include 
> 
> #define CF_CHECK_EQ(expr, res) if ( (expr) != (res) ) { goto end; }
> 
> int main(void)
> {
> mpz_t a, b, c, res;
> char* s = NULL;
> /* noret */ mpz_init(a);
> /* noret */ mpz_init(b);
> /* noret */ mpz_init(c);
> /* noret */ mpz_init(res);
> 
> CF_CHECK_EQ(mpz_set_str(a, "1", 10), 0);
> CF_CHECK_EQ(mpz_set_str(b, "0", 10), 0);
> CF_CHECK_EQ(mpz_set_str(c, "1", 10), 0);
> CF_CHECK_EQ(mpz_set_str(res, "0", 10), 0);
> 
> /* noret */ mpz_powm(res, a, b, c);
> 
> printf("%s\n", mpz_get_str(NULL, 10, res));
> end:
> return 0;
> }
> 
> The result should be 0, which is the case with regular libgmp, but with
> mini-gmp the result is 1, and this is incorrect.
> 
> Tested on version 6.2.1 and the latest repository checkout, with recent
> clang and gcc, on x64 Linux.
> ___
> gmp-bugs mailing list
> gmp-bugs@gmplib.org
> https://gmplib.org/mailman/listinfo/gmp-bugs
___
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs