@@ -549,6 +549,54 @@ static int test_mp_and(void)
549549static int test_mp_invmod (void )
550550{
551551 mp_int a , b , c , d ;
552+ int i , j , k ;
553+ int e ;
554+
555+ int results [21 ][21 ] =
556+ /* Table generated with Pari/GP
557+
558+ for(i=-10,10,
559+ k=0;
560+ d=0;
561+ printf(" {");
562+ for(j=-10,10,
563+ iferr(
564+ printf(lift(Mod(1/i, j)) ", "),
565+ k,
566+ printf("-1, "))
567+ );
568+ print("},")
569+ )
570+
571+ Changes to the output: replaced j < 1 with -1 for now and added the result of 0^(-1) mod (1)
572+
573+ j = -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 */
574+
575+ {
576+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 2 , -1 , -1 , -1 , 2 , -1 , 8 , -1 }, /* i = -10 */
577+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , -1 , 3 , 1 , -1 , 3 , 7 , -1 , 1 }, /* -9 */
578+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , -1 , 3 , -1 , 6 , -1 , 1 , -1 }, /* -8 */
579+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , 2 , 1 , 2 , 5 , -1 , 1 , 5 , 7 }, /* -7 */
580+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 4 , -1 , 1 , -1 , -1 , -1 }, /* -6 */
581+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , 1 , 3 , -1 , 1 , 4 , 3 , 7 , -1 }, /* -5 */
582+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 2 , -1 , 1 , -1 , 5 , -1 , 2 , -1 }, /* -4 */
583+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , -1 , 1 , 3 , -1 , 2 , 5 , -1 , 3 }, /* -3 */
584+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , -1 , 2 , -1 , 3 , -1 , 4 , -1 }, /* -2 */
585+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }, /* -1 */
586+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 }, /* 0 */
587+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 }, /* 1 */
588+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -1 , 2 , -1 , 3 , -1 , 4 , -1 , 5 , -1 }, /* 2 */
589+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , 1 , -1 , 3 , 2 , -1 , 5 , 3 , -1 , 7 }, /* 3 */
590+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -1 , 1 , -1 , 4 , -1 , 2 , -1 , 7 , -1 }, /* 4 */
591+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , 1 , 2 , 1 , -1 , 5 , 3 , 5 , 2 , -1 }, /* 5 */
592+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -1 , -1 , -1 , 1 , -1 , 6 , -1 , -1 , -1 }, /* 6 */
593+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , 1 , 1 , 3 , 3 , 1 , -1 , 7 , 4 , 3 }, /* 7 */
594+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -1 , 2 , -1 , 2 , -1 , 1 , -1 , 8 , -1 }, /* 8 */
595+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , 1 , -1 , 1 , 4 , -1 , 4 , 1 , -1 , 9 }, /* 9 */
596+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -1 , 1 , -1 , -1 , -1 , 5 , -1 , 1 , -1 } /* 10 */
597+ };
598+
599+
552600 DOR (mp_init_multi (& a , & b , & c , & d , NULL ));
553601
554602 /* mp_invmod corner-case of https://github.com/libtom/libtommath/issues/118 */
@@ -564,6 +612,30 @@ static int test_mp_invmod(void)
564612 EXPECT (mp_cmp (& c , & d ) == MP_EQ );
565613 }
566614
615+ /* Some small general tests https://github.com/libtom/libtommath/issues/534 */
616+ for (i = -10 ; i < 11 ; i ++ ) {
617+ for (j = -10 ; j < 11 ; j ++ ) {
618+ mp_set_i32 (& a , i );
619+ mp_set_i32 (& b , j );
620+ e = mp_invmod (& a , & b , & c );
621+ if (e != MP_OKAY ) {
622+ if (results [i + 10 ][j + 10 ] != -1 ) {
623+ printf ("error = %s from " , mp_error_to_string (e ));
624+ printf ("error at i = %d, j =%d should be an error but gave " ,i ,j );
625+ e = mp_fwrite (& c ,10 ,stdout );
626+ printf ("\n" );
627+ goto LBL_ERR ;
628+ }
629+ } else {
630+ k = mp_get_i32 (& c );
631+ if (k != results [i + 10 ][j + 10 ]) {
632+ printf ("result at i = %d, j =%d is %d but should be %d \n" , i ,j ,k ,results [i + 10 ][j + 10 ]);
633+ goto LBL_ERR ;
634+ }
635+ }
636+ }
637+ }
638+
567639 mp_clear_multi (& a , & b , & c , & d , NULL );
568640 return EXIT_SUCCESS ;
569641LBL_ERR :
0 commit comments