mp_result find_strong_prime(mp_int seed, FILE *fb) { mp_result res; mpz_t t; mp_int_init(&t); for(;;) { if ((res = find_prime(seed, fb)) != MP_TRUE) break; if ((res = mp_int_copy(seed, &t)) != MP_OK) break; if ((res = mp_int_mul_pow2(&t, 1, &t)) != MP_OK || (res = mp_int_add_value(&t, 1, &t)) != MP_OK) break; if ((res = mp_int_is_prime(&t)) == MP_TRUE) { if (fb != NULL) fputc('!', fb); res = mp_int_copy(&t, seed); break; } else if (res != MP_FALSE) break; if (fb != NULL) fputc('x', fb); if ((res = mp_int_add_value(seed, 2, seed)) != MP_OK) break; } mp_int_clear(&t); return res; }
/* Test the IMath internals assumed by the imath implementation of isl_int. * * In particular, we test the ranges of IMath-defined types. * * Also, isl uses the existence and function of imath's struct * fields. The digits are stored with less significant digits at lower array * indices. Where they are stored (on the heap or in the field 'single') does * not matter. */ int test_imath_internals() { mpz_t val; mp_result retval; assert(sizeof(mp_small) == sizeof(long)); assert(MP_SMALL_MIN == LONG_MIN); assert(MP_SMALL_MAX == LONG_MAX); assert(sizeof(mp_usmall) == sizeof(unsigned long)); assert(MP_USMALL_MIN == ULONG_MIN); assert(MP_USMALL_MAX == ULONG_MAX); retval = mp_int_init_value(&val, 0); assert(retval == MP_OK); assert(val.alloc >= val.used); assert(val.used == 1); assert(val.sign == MP_ZPOS); assert(val.digits[0] == 0); retval = mp_int_set_value(&val, -1); assert(retval == MP_OK); assert(val.alloc >= val.used); assert(val.used == 1); assert(val.sign == MP_NEG); assert(val.digits[0] == 1); retval = mp_int_set_value(&val, 1); assert(retval == MP_OK); assert(val.alloc >= val.used); assert(val.used == 1); assert(val.sign == MP_ZPOS); assert(val.digits[0] == 1); retval = mp_int_mul_pow2(&val, sizeof(mp_digit) * CHAR_BIT, &val); assert(retval == MP_OK); assert(val.alloc >= val.used); assert(val.used == 2); assert(val.sign == MP_ZPOS); assert(val.digits[0] == 0); assert(val.digits[1] == 1); mp_int_clear(&val); return 0; }
int test_mulp2(testspec_t *t, FILE *ofp) { mp_int in[3], out[1]; mp_result res, expect; int p2; if(!parse_int_values(t, in, out, &expect)) return imath_errno = MP_BADARG, 0; if((res = mp_int_to_int(in[1], &p2)) != MP_OK) return imath_errno = res, 0; if((res = mp_int_mul_pow2(in[0], p2, in[2])) != expect) return imath_errno = res, 0; if(expect == MP_OK && mp_int_compare(in[2], out[0]) != 0) { mp_int_to_string(in[2], 10, g_output, OUTPUT_LIMIT); return imath_errno = OTHER_ERROR, 0; } return 1; }