|
功能:求两个向量的内积
第一种方法
int uInnerProduct(int dime, BIGNUM *r,BIGNUM a[],BIGNUM b[]) { BIGNUM *temp;
BN_CTX *ctx = NULL; //定义一个BN_CTX类型变量 ctx = BN_CTX_new(); BN_CTX_start(ctx); // 如果有大数函数(如BN-mul())中有BN_CTX变量,也需要在加入这三句。使用完用后面的end和free释放。
temp=BN_CTX_get(ctx); //给Temp分配一个空间
BN_set_word(r,0); //给r所指向的变量赋值为0
//计算内积
for(int i=0;i<dime;i++) { BN_mul(temp,&a[i],&b[i],ctx); BN_add(r,r,temp); } BN_CTX_end(ctx); BN_CTX_free(ctx); //配合上面的new和start return 0; }
int _tmain(int argc, _TCHAR* argv[]) { BIGNUM a[4]; BIGNUM b[4]; BIGNUM *ret; ret=BN_new(); //和BN_free()配对
int dime=4; for(int i=0;i<dime;i++) { BN_init(&a[i]); //如果不是指针定义方法,则必须在使用该变量前对其初始化,类似于BN-new() BN_init(&b[i]); BN_rand(&a[i],512,1,0); BN_rand(&b[i],512,0,1); //但每次产生的都是一样的 BN_print_fp(stdout,&a[i]); printf("\n"); BN_print_fp(stdout,&b[i]); printf("\n"); }
uInnerProduct(dime,ret,a,b);
for(int i=0;i<dime;i++) { BN_free(&a[i]); //使用完必须释放
BN_free(&b[i]); }
BN_print_fp(stdout,ret);
BN_free(ret); system("pause"); return 0; }
第二种方法:
int uInnerProduct(int dime, BIGNUM *r,BIGNUM **a,BIGNUM **b) { BIGNUM *temp;
BN_CTX *ctx = NULL; ctx = BN_CTX_new(); BN_CTX_start(ctx);
temp=BN_CTX_get(ctx);
BN_set_word(r,0); for(int i=0;i<dime;i++) { BN_mul(temp,a[i],b[i],ctx); BN_add(r,r,temp); } BN_CTX_end(ctx); BN_CTX_free(ctx); return 0; }
int _tmain(int argc, _TCHAR* argv[]) { BIGNUM *a[4]; BIGNUM *b[4]; BIGNUM *ret;
int dime=4; ret=BN_new();
ctx = BN_CTX_new(); BN_CTX_start(ctx);
for(int i=0;i<dime;i++) { a[i]=BN_CTX_get(ctx); //要初始化,但后面不用free释放了 b[i]=BN_CTX_get(ctx); BN_rand(a[i],3,1,0); BN_rand(b[i],3,0,1); BN_print_fp(stdout,a[i]); printf("\n"); BN_print_fp(stdout,b[i]); printf("\n"); }
uInnerProduct(dime,ret,a,b); BN_print_fp(stdout,ret);
BN_free(ret); system("pause"); return 0; }
第三种方法:可以把ctx变量定义为全局变量,这样,子函数中的ctx = BN_CTX_new();BN_CTX_start(ctx);和 BN_CTX_end(ctx);BN_CTX_free(ctx)可以不要。
|