void divide_bignum(bignum *a, bignum *b, bignum *c) { bignum row, tmp; int asign, bsign, i, j; initialize_bignum(c); c->signbit = a->signbit * b->signbit; asign = a->signbit; bsign = b->signbit; a->signbit = PLUS; b->signbit = PLUS; initialize_bignum(&row); initialize_bignum(&tmp); c->lastdigit = a->lastdigit; for (i = a->lastdigit; i >= 0; i--) { digit_shift(&row, 1); row.digits[0] = a->digits[i]; c->digits[i] = 0; while (compare_bignum(&row, b) != PLUS) { c->digits[i]++; subtract_bignum(&row, b, &tmp); row = tmp; } } zero_justify(c); a->signbit = asign; b->signbit = bsign; }
void multiply_bignum(bignum *a, bignum *b, bignum *c) { bignum row, tmp; int i, j; initialize_bignum(c); row = *a; for (i = 0; i <= b->lastdigit; i++) { for (j = 1; j <= b->digits[i]; j++) { add_bignum(c, &row, &tmp); *c = tmp; } digit_shift(&row, 1); } c->signbit = a->signbit * b->signbit; zero_justify(c); }
number_t mult_num(number_t a, number_t b) { number_t r, tmp; int i, j, t; r = zero(); t = b.digit_len - b.int_len; for (i = b.digit_len - 1, j = 0; i >= 0; i--, j++) { tmp = mult_one(b.digit[i], a); tmp = digit_shift(j, tmp); r = add_number(r, tmp); } r.int_len -= t; r.sign = a.sign * b.sign; return remove_zeros(r); }
void multiply_bignum(bignum *a, bignum *b, bignum *c) { bignum row; /* represent shifted row */ bignum tmp; /* placeholder bignum */ int i,j; /* counters */ initialize_bignum(c); row = *a; for(i = 0; i <= b->lastdigit; i++) { for(j = 1; j <= b->digits[i]; j++) { add_bignum(c,&row,&tmp); *c = tmp; } digit_shift(&row,1); } c->signbit = a->signbit * b->signbit; zero_justify(c); }
void divide_bignum(bignum *a, bignum *b, bignum *c) { bignum row; /* represent shifted row */ bignum tmp; /* placeholder bignum */ int asign, bsign; /* temporary signs */ int i; /* counters */ initialize_bignum(c); c->signbit = a->signbit * b->signbit; asign = a->signbit; bsign = b->signbit; a->signbit = PLUS; b->signbit = PLUS; initialize_bignum(&row); initialize_bignum(&tmp); c->lastdigit = a->lastdigit; for(i = a->lastdigit; i >= 0; i--) { digit_shift(&row,1); row.digits[0] = a->digits[i]; c->digits[i] = 0; while(compare_bignum(&row,b) != PLUS) { c->digits[i] ++; subtract_bignum(&row,b,&tmp); row = tmp; } } zero_justify(c); a->signbit = asign; b->signbit = bsign; }