int deserialize_mpi(gcry_mpi_t *x, enum disp_format df, const char *buf, int inlen) { switch(df) { case DF_BIN: gcry_mpi_scan(x, GCRYMPI_FMT_USG, buf, inlen, NULL); gcry_mpi_set_flag(*x, GCRYMPI_FLAG_SECURE); break; case DF_COMPACT: case DF_BASE36: do { const char *digits = get_digits(df); unsigned int digit_count = get_digit_count(df); char *d; int i; *x = gcry_mpi_snew(0); for(i = 0; i < inlen; i++) { if (! (d = memchr(digits, buf[i], digit_count))) { gcry_mpi_release(*x); return 0; } gcry_mpi_mul_ui(*x, *x, digit_count); gcry_mpi_add_ui(*x, *x, d - digits); } } while (0); break; default: assert(0); } return 1; }
void serialize_mpi(char *outbuf, int outlen, enum disp_format df, const gcry_mpi_t x) { switch(df) { case DF_BIN: do { int len = (gcry_mpi_get_nbits(x) + 7) / 8; assert(len <= outlen); memset(outbuf, 0, outlen - len); gcry_mpi_print(GCRYMPI_FMT_USG, (unsigned char*)outbuf + (outlen - len), len, NULL, x); } while (0); break; case DF_COMPACT: case DF_BASE36: do { const char *digits = get_digits(df); unsigned int digit_count = get_digit_count(df); gcry_mpi_t base, Q, R; int i; base = gcry_mpi_set_ui(NULL, digit_count); Q = gcry_mpi_copy(x); R = gcry_mpi_snew(0); for(i = outlen - 1; i >= 0; i--) { unsigned char digit = 0; gcry_mpi_div(Q, R, Q, base, 0); gcry_mpi_print(GCRYMPI_FMT_USG, &digit, 1, NULL, R); assert(digit < digit_count); outbuf[i] = digits[digit]; } assert(! gcry_mpi_cmp_ui(Q, 0)); gcry_mpi_release(base); gcry_mpi_release(Q); gcry_mpi_release(R); } while(0); break; default: assert(0); } }
int main() { int result = 1; int index = 1; int positive_integer=1; for(int new_pos = 0; index < LIMIT; positive_integer++) { int prev_pos = new_pos; new_pos += get_digit_count(positive_integer); if(index >= prev_pos+1 && index <= new_pos) { result *= get_digit_at_pos(index-prev_pos,positive_integer); index = index*10; } } cout << result << endl; return 0; }
int get_serialization_len(const gcry_mpi_t x, enum disp_format df) { int res; switch(df) { case DF_BIN: res = (gcry_mpi_get_nbits(x) + 7) / 8; break; case DF_BASE36: case DF_COMPACT: do { gcry_mpi_t base, Q; base = gcry_mpi_set_ui(NULL, get_digit_count(df)); Q = gcry_mpi_copy(x); for(res = 0; gcry_mpi_cmp_ui(Q, 0); res++) gcry_mpi_div(Q, NULL, Q, base, 0); gcry_mpi_release(base); gcry_mpi_release(Q); } while (0); break; default: assert(0); } return res; }