@@ -549,6 +549,54 @@ static int test_mp_and(void)
549
549
static int test_mp_invmod (void )
550
550
{
551
551
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
+
552
600
DOR (mp_init_multi (& a , & b , & c , & d , NULL ));
553
601
554
602
/* mp_invmod corner-case of https://github.com/libtom/libtommath/issues/118 */
@@ -564,6 +612,30 @@ static int test_mp_invmod(void)
564
612
EXPECT (mp_cmp (& c , & d ) == MP_EQ );
565
613
}
566
614
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
+
567
639
mp_clear_multi (& a , & b , & c , & d , NULL );
568
640
return EXIT_SUCCESS ;
569
641
LBL_ERR :
0 commit comments