Number big_pow(Number base, int exp) { Number result; result.digits = (int *)malloc(sizeof(int) * 65536); if (base.length == 1 && base.digits[0] == 0) { result.sign = 1; result.length = 1; if (exp == 0) { result.digits[0] = 1; } else { result.digits[0] = 0; } return result; } else if (exp == 0) { result.sign = 1; result.digits[0] = 1; result.length = 1; return result; } else if (exp == 1) { return base; } result = big_pow(base, exp / 2); result = big_mul(result, result); if (exp % 2 == 1) { result = big_mul(result, base); } return result; }
struct big* big_fac(uint32_t n) { struct big* t = big_new(1); uint32_t i; for (i = 2; i <= n; i++) { t = big_mul(t, big_new(i)); } return t; }
static void big_mulmod (u32 *num1, u32 *num2, u32 *mod) { u32 lnum[128]; int len = mod[63] ? 64 : 32; big_mul (len, lnum, num1, num2); big_mod (len, num1, lnum, mod); }
void EncryptionType1::big_mulmod (u32 *num1, u32 *num2, u32 *mod) { u32 lnum[128]; int len = mod[63] ? 64 : 32; big_mul (len, lnum, num1, num2); big_mod (len, num1, lnum, mod); }
struct big* big_mul(struct big* b1, struct big* b2) { struct big* car = big_mul_single(b1, b2->x); if (!b2->q) { return car; } struct big* cdr = big_new(0); cdr->q = big_mul(b1, b2->q); return big_add(car, cdr); }
Number pre3() { Number result = pre2(); Number n; while (accept(TOKEN_MUL)) { get_token(); n = pre2(); result = big_mul(result, n); } return result; }