bc: shrink modular exponentiation code
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 22 Dec 2018 22:59:21 +0000 (23:59 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 22 Dec 2018 22:59:21 +0000 (23:59 +0100)
function                                             old     new   delta
zdc_program_modexp                                   721     694     -27

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/bc.c

index 8cd67b0f5bce4295d396aff1c60dd495758793e7..25150a9ebb4baaeb17cc9bca0f30f9c534e67543 100644 (file)
@@ -2503,6 +2503,7 @@ static BC_STATUS zdc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d)
 {
        BcStatus s;
        BcNum base, exp, two, temp;
+       BcDig two_digs[2];
 
        if (c->len == 0)
                RETURN_STATUS(bc_error("divide by zero"));
@@ -2514,11 +2515,13 @@ static BC_STATUS zdc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d)
        bc_num_expand(d, c->len);
        bc_num_init(&base, c->len);
        bc_num_init(&exp, b->len);
-       bc_num_init_DEF_SIZE(&two);
        bc_num_init(&temp, b->len);
 
+       two.cap = ARRAY_SIZE(two_digs);
+       two.num = two_digs;
        bc_num_one(&two);
-       two.num[0] = 2;
+       two_digs[0] = 2;
+
        bc_num_one(d);
 
        s = zbc_num_rem(a, c, &base, 0);
@@ -2543,7 +2546,6 @@ static BC_STATUS zdc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d)
        }
  err:
        bc_num_free(&temp);
-       bc_num_free(&two);
        bc_num_free(&exp);
        bc_num_free(&base);
        RETURN_STATUS(s);