数式の評価を原始的に #16

乗算を行う関数も。
特に工夫もなく素朴に実装。

...snip
void mpi_mul(Mpi *a, Mpi *b, Mpi*c);
...snip
void mpi_mul(Mpi *a, Mpi *b, Mpi*c)
{
    size_t i, j, n;
    unsigned int carry;

    n = a->ndigit + b->ndigit;
    c->digit = malloc(n);
    for (i = 0; i < n; i++) c->digit[i] = 0;
    for (i = 0; i < a->ndigit; i++) {
        unsigned int ad = a->digit[i];
        for (j = 0, carry = 0; j < b->ndigit; j++) {
            unsigned int p = ad * b->digit[j] + carry + c->digit[i + j];
            c->digit[i + j] = p & (256 - 1);
            carry = p >> 8;
        }
        if (carry != 0) {
            c->digit[i + j] = carry;
            c->ndigit = i + j + 1;
        } else {
            c->ndigit = i + j;
        }
    }
}