func_t *func_expand_mul1_add1(func_t *f) { int i,j,k; func_t *h=NULL,*g=NULL; if(func_is_mul(f) && func_power(f)==1 && func_a_has_op_pow1(f,func_is_add)){ // get terms without (add)^1 g=func_clone(FR(f)); func_args_rm_add_pow1(g); func_a_rm_null(g); g=func_mul_eval(g); // loop for(i=0; i<func_asize(f); i++){ if(func_is_add(f->a[i]) && func_power(f->a[i])==1){ if(func_is_add(g) && func_power(g)==1){ h=func_zero(); for(k=0; k<func_asize(g); k++){ for(j=0; j<func_asize(f->a[i]); j++){ h=func_add(h,func_expand(func_mul(FR(g->a[k]),FR(f->a[i]->a[j])))); } } }else{ h=func_zero(); for(j=0; j<func_asize(f->a[i]); j++){ h=func_add(h,func_expand(func_mul(FR(g),FR(f->a[i]->a[j])))); } } g=func_del(g); g=h; h=NULL; } } }else{ FUNC_ERROR_ARG1("func_expand_mul1_add1",f); } f=func_del(f); return g; }
void func_import_basic(int n) { func_init(); // default op for debug only func_scope_set(n,func_op_builtin_new()); func_scope_set(n,func_op_def_new()); func_scope_set(n,func_op_list_new()); func_scope_set(n,func_op_table_new()); func_scope_set(n,func_op_strings_new()); func_scope_set(n,func_op_scope_new()); // basic func_scope_set(n,func_op_nan_new()); func_scope_set(n,func_op_inf_new()); func_scope_set(n,func_op_zero_new()); func_scope_set(n,func_op_one_new()); func_scope_set(n,func_op_bigint_new()); func_scope_set(n,func_op_real_new()); func_scope_set(n,func_op_complex_new()); func_scope_set(n,func_op_var_new()); func_scope_set(n,func_op_add_new()); func_scope_set(n,func_op_mul_new()); func_scope_set(n,func_op_sqrt_new()); func_scope_set(n,func_op_exp_new()); func_scope_set(n,func_op_log_new()); func_scope_set(n,func_op_pow_new()); func_scope_set(n,func_op_sin_new()); func_scope_set(n,func_op_cos_new()); func_scope_set(n,func_op_tan_new()); func_scope_set(n,func_op_asin_new()); func_scope_set(n,func_op_acos_new()); func_scope_set(n,func_op_atan_new()); func_scope_set(n,func_op_sinh_new()); func_scope_set(n,func_op_cosh_new()); func_scope_set(n,func_op_tanh_new()); func_scope_set(n,func_op_asinh_new()); func_scope_set(n,func_op_acosh_new()); func_scope_set(n,func_op_atanh_new()); func_scope_set(n,func_op_ivec_new()); func_scope_set(n,func_op_rvec_new()); func_scope_set(n,func_op_cvec_new()); func_scope_set(n,func_op_rmat_new()); func_scope_set(n,func_op_cmat_new()); func_scope_set(n,func_op_begin_new()); func_scope_set(n,func_op_end_new()); func_scope_set(n,func_op_set_new()); func_scope_set(n,func_op_print_new()); func_scope_set(n,func_op_eval_new()); func_scope_set(n,func_op_evalf_new()); func_scope_set(n,func_op_expand_new()); func_scope_set(n,func_op_diff_new()); func_scope_set(n,func_op_grad_new()); func_scope_set(n,func_op_gbasis_new()); func_scope_set(n,func_def("I", func_complex_i(),0,0)); func_scope_set(n,func_def("i", func_sqrt(func_bigint_int(-1,1)),0,0)); func_scope_set(n,func_def("PI",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); func_scope_set(n,func_def("Pi",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); func_scope_set(n,func_def("pi",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); }
func_t *func_diff_cos_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL; if(!func_is(f,"cos") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_cos",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); fx=func_mul(func_mul(func_sin(FR(g)),func_bigint_int(-1,1)),gx); f=func_del(f); return fx; }
func_t *func_diff_pow_n(func_t *f, int var) { func_t *fx=NULL,*g=NULL; if(!func_has_power(f) || func_power(f)==1){ FUNC_ERROR_ARG1("func_diff_pow_n",f); } g=func_clone(FR(f)); func_set_power(g,1); g=func_diff(g,func_var1(var,1)); fx=func_clone(FR(f)); func_set_power(fx,func_power(fx)-1); fx=func_mul(func_bigint_int(func_power(f),1),fx); fx=func_mul(fx,g); f=func_del(f); return fx; }
int main() { float *a,*b; int j; int i; for ( j=10; j<1000000; j*=2){ a =( float *) malloc(sizeof(float)*j); b =( float *) malloc(sizeof(float)*j); for (i=0; i<j; i++){ a[i] = 2; b[i] = 3; } if(!func_add(a,b,j)){ printf("Failed\n"); return 1; } if(!func_mul(a,b,j)){ printf("Failed\n"); return 1; } free(a); free(b); } printf("Success\n"); return 0; }
void func_add_args_collect(func_t *f, func_is_t *fis) { int i,j; func_t *g=NULL; if(!func_is_add(f)){ FUNC_ERROR_ARG1("func_add_args_collect",f); } // convert args to split list for(i=0; i<func_asize(f); i++){ g=func_mul_split_list(FR(func_aget(f,i)),fis); func_aset(f,i,FR(g)); g=func_del(g); } // add a arg to same arg for(i=0; i<func_asize(f); i++){ for(j=i+1; func_aget(f,i)!=NULL && !func_is_one(func_aget(func_aget(f,i),1)) && j<func_asize(f); j++){ if(func_aget(f,j)!=NULL && func_cmp(func_aget(func_aget(f,i),1),func_aget(func_aget(f,j),1))==0){ g=func_list(2); func_aset(g,0,func_add(FR(func_aget(func_aget(f,i),0)),FR(func_aget(func_aget(f,j),0)))); func_aset(g,1,FR(func_aget(func_aget(f,i),1))); func_aset(f,i,FR(g)); func_adel(f,j); g=func_del(g); } } } // convert list to mul for(i=0; i<func_asize(f); i++){ if(func_aget(f,i)!=NULL){ g=func_mul(FR(func_aget(func_aget(f,i),0)),FR(func_aget(func_aget(f,i),1))); func_aset(f,i,FR(g)); g=func_del(g); } } func_a_rm_null(f); }
float eval_branch(struct node *node, float x, float y, float z, float a) { switch (node->token) { case token_x: return x; case token_y: return y; case token_z: return z; case token_a: return a; case token_num: return node->value; case token_pow: return func_pow(eval_branch(node->left, x, y, z, a), node->value); case token_mul: return func_mul(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_div: return func_div(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_add: return func_add(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_sub: return func_sub(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_neg: return func_neg(0, eval_branch(node->right, x, y, z, a)); case token_sqrt: return func_sqrt(0, eval_branch(node->right, x, y, z, a)); case token_sin: return func_sin(0, eval_branch(node->right, x, y, z, a)); case token_cos: return func_cos(0, eval_branch(node->right, x, y, z, a)); default: return 0; } }
func_t *func_diff_pow(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*h=NULL,*gx=NULL,*hx=NULL; if(!func_is(f,"pow")){ FUNC_ERROR_ARG1("func_diff_pow",f); } g=f->a[0]; h=f->a[1]; gx=func_diff(FR(g),func_var1(var,1)); hx=func_diff(FR(h),func_var1(var,1)); hx=func_mul(hx,func_log(FR(g))); gx=func_mul(gx,FR(h)); gx=func_div(gx,FR(g)); gx=func_add(gx,hx); fx=func_mul(FR(f),gx); f=func_del(f); return fx; }
func_t *func_poly_monic(func_t *f) { func_t *a=NULL; if(!(func_is_poly(f))){ FUNC_ERROR_ARG1("func_poly_monic",f); } a=func_poly_get_lc(f); if(a==NULL || func_is_one(a)){ return f; } return func_expand(func_mul(func_inv(FR(a)),f)); }
func_t *func_expand_mul_pow1(func_t *f) { int i; func_t *g=NULL,*h=NULL; if(func_is_mul(f) && func_power(f)==1){ g=func_one(); for(i=0; i<func_asize(f); i++){ h=func_expand(FR(f->a[i])); if((func_is_add(g) && func_power(g)==1) || (func_is_add(h) && func_power(h)==1)){ g=func_expand(func_mul(g,h)); }else{ g=func_mul(g,h); } } }else{ FUNC_ERROR_ARG1("func_expand_mul_pow1",f); } f=func_del(f); return g; }
// r=mod(f,g), where f=g*q+r func_t *func_poly_div_r(func_t *f, func_t *g) { func_t *r=NULL,*neg=NULL,*a; if(func_is_poly(f) && func_is_poly(g)){ neg=func_bigint_int(-1,1); r=FR(f); // r=f while(func_is_poly(r) && func_poly_can_div(r,g)) { a=func_div(FR(func_poly_get_lt(r)), FR(func_poly_get_lt(g))); // a=LT(r)/LT(g) a=func_mul(FR(neg),a); // a=(-1)*LT(r)/LT(g) a=func_expand(func_mul(a,FR(g))); // a=((-1)*LT(r)/LT(g))*g r=func_add(r,a); // r-=(LT(r)/LT(g))*g } } f=func_del(f); g=func_del(g); neg=func_del(neg); return r; }
func_t *func_diff_sqrt_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL; if(!func_is(f,"sqrt") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_sqrt",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); fx=func_mul(func_div(gx,func_sqrt(FR(g))),func_bigint_int(1,2)); f=func_del(f); return fx; }
func_t *func_diff_tanh_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL; if(!func_is(f,"tanh") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_tanh",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); fx=func_mul(func_pow_n(func_cosh(FR(g)),-2),gx); f=func_del(f); return fx; }
func_t *func_expand_mul_pow_n(func_t *f) { int i; func_t *g=NULL; if(func_is_mul(f) && func_power(f)!=1){ g=func_one(); for(i=0; i<func_asize(f); i++){ g=func_mul(g,func_expand(func_pow_n(FR(f->a[i]),func_power(f)))); } }else{ FUNC_ERROR_ARG1("func_expand_mul_pow_n",f); } f=func_del(f); return g; }
func_t *func_diff_acos_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL; if(!func_is(f,"acos") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_acosh",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); h=func_pow_n(FR(g),2); h=func_sub(func_one(),h); h=func_sqrt(h); fx=func_div(gx,h); fx=func_mul(fx,func_bigint_int(-1,1)); f=func_del(f); return fx; }
func_t *func_diff_mul_pow1(func_t *f, int var) { int i; func_t *fx=NULL,*g=NULL; if(!func_is_mul(f) || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_mul",f); } fx=func_zero(); for(i=0; i<func_asize(f); i++){ g=func_clone(FR(f)); g->a[i]=func_del(g->a[i]); g=func_mul_eval(g); fx=func_add(fx,func_mul(g,func_diff(FR(f->a[i]),func_var1(var,1)))); } f=func_del(f); return fx; }
func_t *func_poly_list_div_r(func_t *f, func_t *g) { int i,flag; func_t *p=NULL,*r=NULL,*neg=NULL,*a=NULL; if(!(func_is_poly(f) && func_is_poly_list(g))){ FUNC_ERROR_ARG2("func_poly_list_div_r",f,g); } neg=func_bigint_int(-1,1); p=func_clone(FR(f)); r=func_zero(); while(!func_is_zero(p)){ i=0; flag=0; while(i<func_asize(g) && flag==0){ if(func_poly_can_div(p,g->a[i])){ a=func_div(FR(func_poly_get_lt(p)),FR(func_poly_get_lt(g->a[i]))); // a:=LT(p)/LT(g[i]) a=func_mul(FR(neg),a); // a:=-LT(p)/LT(g[i]) a=func_expand(func_mul(a,func_poly_rm_lt(FR(g->a[i])))); // a:=expand((-LT(p)/LT(g[i]))*(g[i]-LT(g[i]))) p=func_poly_rm_lt(p); // p:=p-LT(p) p=func_add(p,FR(a)); // p:=(p-LT(p))-(LT(p)/LT(g[i]))*(g[i]-LT(g[i])))=p-(LT(p)/LT(g[i]))*g[i] a=func_del(a); flag=1; }else{ i=i+1; } } if(flag==0){ r=func_add(r,FR(func_poly_get_lt(p))); p=func_poly_rm_lt(p); } } p=func_del(p); f=func_del(f); g=func_del(g); neg=func_del(neg); a=func_del(a); return r; }
func_t *func_diff_var(func_t *f, int var) { int n,m; func_t *fx=NULL; if(!func_is_var(f)){ FUNC_ERROR_ARG1("func_diff_var",f); } n=ivec_first_index_if(func_var_size(f),f->p.var->num,var); if(n<0) { fx=func_zero(); } else{ fx=func_clone(FR(f)); m=fx->p.var->pow[n]; fx->p.var->pow[n]--; fx=func_var_check_mul(fx); fx=func_mul(func_bigint_int(m,1),fx); } f=func_del(f); return fx; }
func_t *func_expand_add_pow_n(func_t *f) { int i,j,k; func_t *g=NULL,*h=NULL; if(func_is_add(f) && func_power(f)>=2){ g=func_clone(FR(f)); func_set_power(g,1); for(k=1; k<func_power(f); k++){ h=func_zero(); for(i=0; i<func_asize(g); i++){ for(j=0; j<func_asize(f); j++){ h=func_add(h,func_expand(func_mul(FR(g->a[i]),FR(f->a[j])))); } } g=func_del(g); g=h; h=NULL; } }else{ FUNC_ERROR_ARG1("func_expand_add_pow_n",f); } f=func_del(f); return g; }