void BN_RECP_CTX_init(BN_RECP_CTX *recp);
BN_RECP_CTX *BN_RECP_CTX_new();
void BN_RECP_CTX_free(BN_RECP_CTX *recp);
int BN_RECP_CTX_set(BN_RECP_CTX *recp,BIGNUM *div,BN_CTX *ctx);

int BN_mod_exp_recp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,
	BN_RECP_CTX *recp,BN_CTX *ctx);

int BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BIGNUM *d,
	BN_RECP_CTX *recp, BN_CTX *ctx);
int BN_mod_recp(BIGNUM *rem, BIGNUM *m, BIGNUM *d,
	BN_RECP_CTX *recp, BN_CTX *ctx);
int BN_mod_mul_recp(BIGNUM *ret,BIGNUM *a,BIGNUM *b,BIGNUM *m

int BN_mod_exp_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *p,
	BN_MONT_CTX *m_ctx,BN_CTX *ctx);
int BN_mod_exp2_montgomery(BIGNUM *r, BIGNUM *a1, BIGNUM *p1,BIGNUM *a2,
                BIGNUM *p2,BN_MONT_CTX *m_ctx,BN_CTX *ctx);


bn_div64 -> bn_div_words


