📄 try.c
字号:
#define TYPE_MUL_1C 8#define TYPE_MUL_2 9#define TYPE_ADDMUL_1 10#define TYPE_ADDMUL_1C 11#define TYPE_SUBMUL_1 12#define TYPE_SUBMUL_1C 13#define TYPE_ADDSUB_N 14#define TYPE_ADDSUB_NC 15#define TYPE_RSHIFT 16#define TYPE_LSHIFT 17#define TYPE_COPY 20#define TYPE_COPYI 21#define TYPE_COPYD 22#define TYPE_COM_N 23#define TYPE_MOD_1 25#define TYPE_MOD_1C 26#define TYPE_DIVMOD_1 27#define TYPE_DIVMOD_1C 28#define TYPE_DIVREM_1 29#define TYPE_DIVREM_1C 30#define TYPE_PREINV_DIVREM_1 31#define TYPE_PREINV_MOD_1 32#define TYPE_MOD_34LSUB1 33#define TYPE_UDIV_QRNND 34#define TYPE_DIVEXACT_1 35#define TYPE_DIVEXACT_BY3 36#define TYPE_DIVEXACT_BY3C 37#define TYPE_MODEXACT_1_ODD 38#define TYPE_MODEXACT_1C_ODD 39#define TYPE_GCD 40#define TYPE_GCD_1 41#define TYPE_GCD_FINDA 42#define TYPE_MPZ_JACOBI 43#define TYPE_MPZ_KRONECKER 44#define TYPE_MPZ_KRONECKER_UI 45#define TYPE_MPZ_KRONECKER_SI 46#define TYPE_MPZ_UI_KRONECKER 47#define TYPE_MPZ_SI_KRONECKER 48#define TYPE_AND_N 50#define TYPE_NAND_N 51#define TYPE_ANDN_N 52#define TYPE_IOR_N 53#define TYPE_IORN_N 54#define TYPE_NIOR_N 55#define TYPE_XOR_N 56#define TYPE_XNOR_N 57#define TYPE_POPCOUNT 58#define TYPE_HAMDIST 59#define TYPE_MUL_BASECASE 60#define TYPE_MUL_N 61#define TYPE_SQR 62#define TYPE_UMUL_PPMM 63#define TYPE_UMUL_PPMM_R 64#define TYPE_SB_DIVREM_MN 70#define TYPE_TDIV_QR 71#define TYPE_SQRTREM 80#define TYPE_ZERO 81#define TYPE_GET_STR 82#define TYPE_EXTRA 90struct try_t param[150];voidparam_init (void){ struct try_t *p;#define COPY(index) memcpy (p, ¶m[index], sizeof (*p))#if HAVE_STRINGIZE#define REFERENCE(fun) \ p->reference = (tryfun_t) fun; \ p->reference_name = #fun#define VALIDATE(fun) \ p->validate = fun; \ p->validate_name = #fun#else#define REFERENCE(fun) \ p->reference = (tryfun_t) fun; \ p->reference_name = "fun"#define VALIDATE(fun) \ p->validate = fun; \ p->validate_name = "fun"#endif p = ¶m[TYPE_ADD_N]; p->retval = 1; p->dst[0] = 1; p->src[0] = 1; p->src[1] = 1; REFERENCE (refmpn_add_n); p = ¶m[TYPE_ADD_NC]; COPY (TYPE_ADD_N); p->carry = CARRY_BIT; REFERENCE (refmpn_add_nc); p = ¶m[TYPE_SUB_N]; COPY (TYPE_ADD_N); REFERENCE (refmpn_sub_n); p = ¶m[TYPE_SUB_NC]; COPY (TYPE_ADD_NC); REFERENCE (refmpn_sub_nc); p = ¶m[TYPE_ADD]; COPY (TYPE_ADD_N); p->size = SIZE_ALLOW_ZERO; p->size2 = 1; REFERENCE (refmpn_add); p = ¶m[TYPE_SUB]; COPY (TYPE_ADD); REFERENCE (refmpn_sub); p = ¶m[TYPE_MUL_1]; p->retval = 1; p->dst[0] = 1; p->src[0] = 1; p->multiplier = 1; p->overlap = OVERLAP_LOW_TO_HIGH; REFERENCE (refmpn_mul_1); p = ¶m[TYPE_MUL_1C]; COPY (TYPE_MUL_1); p->carry = CARRY_LIMB; REFERENCE (refmpn_mul_1c); p = ¶m[TYPE_MUL_2]; p->retval = 1; p->dst[0] = 1; p->dst_size[0] = SIZE_PLUS_1; p->src[0] = 1; p->src[1] = 1; p->size2 = SIZE_2; p->overlap = OVERLAP_NOT_SRC2; REFERENCE (refmpn_mul_2); p = ¶m[TYPE_ADDMUL_1]; p->retval = 1; p->dst[0] = 1; p->src[0] = 1; p->multiplier = 1; p->dst0_from_src1 = 1; REFERENCE (refmpn_addmul_1); p = ¶m[TYPE_ADDMUL_1C]; COPY (TYPE_ADDMUL_1); p->carry = CARRY_LIMB; REFERENCE (refmpn_addmul_1c); p = ¶m[TYPE_SUBMUL_1]; COPY (TYPE_ADDMUL_1); REFERENCE (refmpn_submul_1); p = ¶m[TYPE_SUBMUL_1C]; COPY (TYPE_ADDMUL_1C); REFERENCE (refmpn_submul_1c); p = ¶m[TYPE_AND_N]; p->dst[0] = 1; p->src[0] = 1; p->src[1] = 1; REFERENCE (refmpn_and_n); p = ¶m[TYPE_ANDN_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_andn_n); p = ¶m[TYPE_NAND_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_nand_n); p = ¶m[TYPE_IOR_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_ior_n); p = ¶m[TYPE_IORN_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_iorn_n); p = ¶m[TYPE_NIOR_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_nior_n); p = ¶m[TYPE_XOR_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_xor_n); p = ¶m[TYPE_XNOR_N]; COPY (TYPE_AND_N); REFERENCE (refmpn_xnor_n); p = ¶m[TYPE_ADDSUB_N]; p->retval = 1; p->dst[0] = 1; p->dst[1] = 1; p->src[0] = 1; p->src[1] = 1; REFERENCE (refmpn_addsub_n); p = ¶m[TYPE_ADDSUB_NC]; COPY (TYPE_ADDSUB_N); p->carry = CARRY_4; REFERENCE (refmpn_addsub_nc); p = ¶m[TYPE_COPY]; p->dst[0] = 1; p->src[0] = 1; p->overlap = OVERLAP_NONE; p->size = SIZE_ALLOW_ZERO; REFERENCE (refmpn_copy); p = ¶m[TYPE_COPYI]; p->dst[0] = 1; p->src[0] = 1; p->overlap = OVERLAP_LOW_TO_HIGH; p->size = SIZE_ALLOW_ZERO; REFERENCE (refmpn_copyi); p = ¶m[TYPE_COPYD]; p->dst[0] = 1; p->src[0] = 1; p->overlap = OVERLAP_HIGH_TO_LOW; p->size = SIZE_ALLOW_ZERO; REFERENCE (refmpn_copyd); p = ¶m[TYPE_COM_N]; p->dst[0] = 1; p->src[0] = 1; REFERENCE (refmpn_com_n); p = ¶m[TYPE_MOD_1]; p->retval = 1; p->src[0] = 1; p->size = SIZE_ALLOW_ZERO; p->divisor = DIVISOR_LIMB; REFERENCE (refmpn_mod_1); p = ¶m[TYPE_MOD_1C]; COPY (TYPE_MOD_1); p->carry = CARRY_DIVISOR; REFERENCE (refmpn_mod_1c); p = ¶m[TYPE_DIVMOD_1]; COPY (TYPE_MOD_1); p->dst[0] = 1; REFERENCE (refmpn_divmod_1); p = ¶m[TYPE_DIVMOD_1C]; COPY (TYPE_DIVMOD_1); p->carry = CARRY_DIVISOR; REFERENCE (refmpn_divmod_1c); p = ¶m[TYPE_DIVREM_1]; COPY (TYPE_DIVMOD_1); p->size2 = SIZE_FRACTION; p->dst_size[0] = SIZE_SUM; REFERENCE (refmpn_divrem_1); p = ¶m[TYPE_DIVREM_1C]; COPY (TYPE_DIVREM_1); p->carry = CARRY_DIVISOR; REFERENCE (refmpn_divrem_1c); p = ¶m[TYPE_PREINV_DIVREM_1]; COPY (TYPE_DIVREM_1); p->size = SIZE_YES; /* ie. no size==0 */ REFERENCE (refmpn_preinv_divrem_1); p = ¶m[TYPE_PREINV_MOD_1]; p->retval = 1; p->src[0] = 1; p->divisor = DIVISOR_NORM; REFERENCE (refmpn_preinv_mod_1); p = ¶m[TYPE_MOD_34LSUB1]; p->retval = 1; p->src[0] = 1; VALIDATE (validate_mod_34lsub1); p = ¶m[TYPE_UDIV_QRNND]; p->retval = 1; p->src[0] = 1; p->dst[0] = 1; p->dst_size[0] = SIZE_1; p->divisor = DIVISOR_LIMB; p->data = DATA_UDIV_QRNND; p->overlap = OVERLAP_NONE; REFERENCE (refmpn_udiv_qrnnd); p = ¶m[TYPE_DIVEXACT_1]; p->dst[0] = 1; p->src[0] = 1; p->divisor = 1; p->data = DATA_MULTIPLE_DIVISOR; VALIDATE (validate_divexact_1); REFERENCE (refmpn_divmod_1); p = ¶m[TYPE_DIVEXACT_BY3]; p->retval = 1; p->dst[0] = 1; p->src[0] = 1; REFERENCE (refmpn_divexact_by3); p = ¶m[TYPE_DIVEXACT_BY3C]; COPY (TYPE_DIVEXACT_BY3); p->carry = CARRY_3; REFERENCE (refmpn_divexact_by3c); p = ¶m[TYPE_MODEXACT_1_ODD]; p->retval = 1; p->src[0] = 1; p->divisor = DIVISOR_ODD; VALIDATE (validate_modexact_1_odd); p = ¶m[TYPE_MODEXACT_1C_ODD]; COPY (TYPE_MODEXACT_1_ODD); p->carry = CARRY_LIMB; VALIDATE (validate_modexact_1c_odd); p = ¶m[TYPE_GCD_1]; p->retval = 1; p->src[0] = 1; p->data = DATA_NON_ZERO; p->divisor = DIVISOR_LIMB; REFERENCE (refmpn_gcd_1); p = ¶m[TYPE_GCD]; p->retval = 1; p->dst[0] = 1; p->src[0] = 1; p->src[1] = 1; p->size2 = 1; p->dst_size[0] = SIZE_RETVAL; p->overlap = OVERLAP_NOT_SRCS; p->data = DATA_GCD; REFERENCE (refmpn_gcd); /* FIXME: size==2 */ p = ¶m[TYPE_GCD_FINDA]; p->retval = 1; p->src[0] = 1; REFERENCE (refmpn_gcd_finda); p = ¶m[TYPE_MPZ_JACOBI]; p->retval = 1; p->src[0] = 1; p->size = SIZE_ALLOW_ZERO; p->src[1] = 1; p->size2 = 1; p->carry = CARRY_4; p->carry_sign = 1; REFERENCE (refmpz_jacobi); p = ¶m[TYPE_MPZ_KRONECKER]; COPY (TYPE_MPZ_JACOBI); REFERENCE (refmpz_kronecker); p = ¶m[TYPE_MPZ_KRONECKER_UI]; p->retval = 1; p->src[0] = 1; p->size = SIZE_ALLOW_ZERO; p->multiplier = 1; p->carry = CARRY_BIT; REFERENCE (refmpz_kronecker_ui); p = ¶m[TYPE_MPZ_KRONECKER_SI]; COPY (TYPE_MPZ_KRONECKER_UI); REFERENCE (refmpz_kronecker_si); p = ¶m[TYPE_MPZ_UI_KRONECKER]; COPY (TYPE_MPZ_KRONECKER_UI); REFERENCE (refmpz_ui_kronecker); p = ¶m[TYPE_MPZ_SI_KRONECKER]; COPY (TYPE_MPZ_KRONECKER_UI); REFERENCE (refmpz_si_kronecker); p = ¶m[TYPE_SQR]; p->dst[0] = 1; p->src[0] = 1; p->dst_size[0] = SIZE_SUM; p->overlap = OVERLAP_NONE; REFERENCE (refmpn_sqr); p = ¶m[TYPE_MUL_N]; COPY (TYPE_SQR); p->src[1] = 1; REFERENCE (refmpn_mul_n); p = ¶m[TYPE_MUL_BASECASE]; COPY (TYPE_MUL_N); p->size2 = 1; REFERENCE (refmpn_mul_basecase); p = ¶m[TYPE_UMUL_PPMM]; p->retval = 1; p->src[0] = 1; p->dst[0] = 1; p->dst_size[0] = SIZE_1; p->overlap = OVERLAP_NONE; REFERENCE (refmpn_umul_ppmm); p = ¶m[TYPE_UMUL_PPMM_R]; COPY (TYPE_UMUL_PPMM); REFERENCE (refmpn_umul_ppmm_r); p = ¶m[TYPE_RSHIFT]; p->retval = 1; p->dst[0] = 1; p->src[0] = 1; p->shift = 1; p->overlap = OVERLAP_LOW_TO_HIGH; REFERENCE (refmpn_rshift); p = ¶m[TYPE_LSHIFT]; COPY (TYPE_RSHIFT); p->overlap = OVERLAP_HIGH_TO_LOW; REFERENCE (refmpn_lshift); p = ¶m[TYPE_POPCOUNT]; p->retval = 1; p->src[0] = 1; REFERENCE (refmpn_popcount); p = ¶m[TYPE_HAMDIST]; COPY (TYPE_POPCOUNT); p->src[1] = 1; REFERENCE (refmpn_hamdist); p = ¶m[TYPE_SB_DIVREM_MN]; p->retval = 1; p->dst[0] = 1; p->dst[1] = 1; p->src[0] = 1; p->src[1] = 1; p->data = DATA_SRC1_HIGHBIT; p->size2 = 1; p->dst_size[0] = SIZE_DIFF; p->overlap = OVERLAP_NONE; REFERENCE (refmpn_sb_divrem_mn); p = ¶m[TYPE_TDIV_QR]; p->dst[0] = 1; p->dst[1] = 1; p->src[0] = 1; p->src[1] = 1; p->size2 = 1; p->dst_size[0] = SIZE_DIFF_PLUS_1; p->dst_size[1] = SIZE_SIZE2; p->overlap = OVERLAP_NONE; REFERENCE (refmpn_tdiv_qr); p = ¶m[TYPE_SQRTREM]; p->retval = 1; p->dst[0] = 1; p->dst[1] = 1; p->src[0] = 1; p->dst_size[0] = SIZE_CEIL_HALF; p->dst_size[1] = SIZE_RETVAL; p->overlap = OVERLAP_NONE; VALIDATE (validate_sqrtrem); p = ¶m[TYPE_ZERO]; p->dst[0] = 1; p->size = SIZE_ALLOW_ZERO; REFERENCE (refmpn_zero); p = ¶m[TYPE_GET_STR]; p->src[0] = 1; p->size = SIZE_ALLOW_ZERO; p->dst[0] = 1; p->dst[1] = 1; p->dst_size[0] = SIZE_GET_STR; p->dst_bytes[0] = 1; p->overlap = OVERLAP_NONE; REFERENCE (refmpn_get_str);#ifdef EXTRA_PARAM_INIT EXTRA_PARAM_INIT#endif}/* The following are macros if there's no native versions, so wrap them in functions that can be in try_array[]. */voidMPN_COPY_fun (mp_ptr rp, mp_srcptr sp, mp_size_t size){ MPN_COPY (rp, sp, size); }voidMPN_COPY_INCR_fun (mp_ptr rp, mp_srcptr sp, mp_size_t size){ MPN_COPY_INCR (rp, sp, size); }voidMPN_COPY_DECR_fun (mp_ptr rp, mp_srcptr sp, mp_size_t size)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -