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; }
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; }
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; } }
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); }
func_t *func_add(func_t *f1, func_t *f2) { if (f1==NULL || f2==NULL) { FUNC_ERROR_ARG2("func_add",f1,f2); } else if(func_is_zero(f1)) { f1=func_del(f1); return f2; } else if(func_is_zero(f2)) { f2=func_del(f2); return f1; } else if(func_in_bigint(f1) && func_in_bigint(f2)) { return func_bigint_add(f1,f2); } else if(func_in_real(f1) && func_in_real(f2)) { return func_real_add(f1,f2); } else if(func_in_complex(f1) && func_in_complex(f2)){ return func_complex_add(f1,f2); } else if(func_is_real(f1) && func_is_number(f2)) { return func_add(f1,func_evalf(f2)); } else if(func_is_complex(f1) && func_is_number(f2)) { return func_add(f1,func_evalf(f2)); } else if(func_is_number(f1) && func_is_real(f2)) { return func_add(func_evalf(f1),f2); } else if(func_is_number(f1) && func_is_complex(f2)){ return func_add(func_evalf(f1),f2); } else if(func_in_vec(f1) && func_in_vec(f2)) { return func_vec_add(f1,f2); } else if(func_in_mat(f1) && func_in_mat(f2)) { return func_mat_add(f1,f2); } else { return func_add_eval(func_arg2_new(__func_add,f1,f2)); } }
func_t *func_diff_add_pow1(func_t *f, int var) { int i; func_t *fx=NULL; if(!func_is_add(f) || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_add",f); } fx=func_zero(); for(i=0; i<func_asize(f); i++){ fx=func_add(fx,func_diff(FR(f->a[i]),func_var1(var,1))); } f=func_del(f); return fx; }
func_t *func_diff_atan_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL; if(!func_is(f,"atan") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_atan",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); h=func_pow_n(FR(g),2); h=func_add(h,func_one()); fx=func_div(gx,h); f=func_del(f); return fx; }
func_t *func_diff_acosh_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL; if(!func_is(f,"acosh") || 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_add(h,func_bigint_int(-1,1)); h=func_sqrt(h); fx=func_div(gx,h); f=func_del(f); return fx; }
func_t *func_expand_add_pow1(func_t *f) { int i; func_t *g=NULL; if(func_is_add(f) && func_power(f)==1){ g=func_zero(); for(i=0; i<func_asize(f); i++){ g=func_add(g,func_expand(FR(f->a[i]))); } }else{ FUNC_ERROR_ARG1("func_expand_add_pow1",f); } f=func_del(f); return g; }
// q=f/g, where f=g*q+r func_t *func_poly_div_q(func_t *f, func_t *g) { func_t *r=NULL,*neg=NULL,*q=NULL,*a; if(func_is_poly(f) && func_is_poly(g)){ neg=func_bigint_int(-1,1); r=FR(f); // r=f q=func_zero(); 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) q=func_add(q,FR(a)); // q+=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); r=func_del(r); return q; }
void func_add_args(func_t *f, func_is_t *fis, func_is_t *fin) { int i,j; if(!func_is_add(f)){ FUNC_ERROR_ARG1("func_add_args",f); } for(i=0; i<func_asize(f); i++){ for(j=0; fis(func_aget(f,i)) && j<func_asize(f); j++){ if(i!=j && fin(func_aget(f,j))){ func_aset(f,i,func_add(FR(func_aget(f,i)),FR(func_aget(f,j)))); func_adel(f,j); } } } func_a_rm_null(f); }
void main() { int a,b,add,sub; clock_t start,stop,over_time; a = 200; b = 100; start = clock(); add = func_add(a,b); sub = func_sub(a,b); stop = clock(); printf("\na+b = %d, a-b = %d, time=%d\n",add,sub,stop-start); }
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_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_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_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; }
void show_funcs_ASL(ASL *asl) { func_info *fi; int nargs; const char *atleast; func_add(asl); fprintf(Stderr, "Available nonstandard functions:%s\n", (fi = funcsfirst) ? "" : " none"); for(; fi; fi = fi->fnext) { if ((nargs = fi->nargs) >= 0) atleast = ""; else { nargs = -(1 + nargs); atleast = "at least "; } fprintf(Stderr, "\t%s(%s%d %sarg%s)\n", fi->name, atleast, nargs, fi->ftype ? "" : "real ", nargs == 1 ? "" : "s"); } fflush(Stderr); }
char * getstub_ASL(ASL *asl, char ***pargv, Option_Info *oi) { char *s, *s1; keyword *kw, *okw; int i, options; char **argv = *pargv; progname = *argv; if (!Stderr) Stderr_init_ASL(); /* set Stderr if necessary */ if (!asl) badasl_ASL(asl,0,"getstub"); amplflag = 0; options = 1; okw = 0; if (oi) { oi->nnl = 0; oi->asl = asl; okw = oi->options; if ((s = getenv("solver_msg"))) { i = (int)strtol(s, &s1, 10); if (s1 > s && !*s1 && i >= 0 && !(i & 1)) oi->option_echo = ASL_OI_never_echo; } oi->option_echo = (oi->option_echo & ASL_OI_never_echo) ? ASL_OI_never_echo : ASL_OI_clopt | ASL_OI_echo; oi->n_badopts = 0; } while((s = *++argv)) { if (*s == '-' && options) { s1 = s + 1; if (okw && (kw = (keyword*)b_search_ASL(okw, (int)sizeof(keyword), oi->n_options, &s1, &oi->eqsign))) { if (!*s1 && argv[1]) { s = (*kw->kf)(oi, kw, argv[1]); if (s != argv[1]) argv++; continue; } (*kw->kf)(oi, kw, s1); continue; } if (!s1[1]) switch(*s1) { case '=': shownames(oi); case '?': usage_ASL(oi,0); case '-': options = 0; continue; #ifdef SYMANTEC case 'E': _8087 = 0; continue; #endif case 'e': if (oi) oi->option_echo &= ~ASL_OI_echo; continue; case 's': if (oi) oi->wantsol = 1; continue; case 'u': if (!oi || !(oi->flags && ASL_OI_want_funcadd)) break; func_add(asl); show_funcs(); exit(0); case 'v': if (oi) Ver_val_ASL(oi,0,0); continue; case 'i': if (ix_details_ASL[0]) { if ((s = argv[1])) { argv++; if (*s == '?' && !s[1]) ix_usage(); i_option_ASL = s; } continue; } } if (*s1 == 'i' && ix_details_ASL[0]) { if (s1[1] == '?' && !s1[2]) ix_usage(); i_option_ASL = s1 + 1; continue; } if (*s1 == '-') { if (!strcmp(++s1, "help")) { if (oi) usage_ASL(oi,0); } else if (!strcmp(s1, "version")) { if (oi) { Ver_val_ASL(oi,0,0); continue; } } } fprintf(Stderr, "%s: bad option %s\n", progname, s); usage_ASL(oi,1); } if (strchr(s,'=')) break; if ((s1 = *++argv) && !strncmp(s1,"-AMPL",5)) { amplflag = 1; argv++; if (oi && oi->bsname && !(oi->option_echo & ASL_OI_never_echo)) need_nl = oi->nnl = printf("%s: ", oi->bsname); } i = strlen(s) - 3; if (i > 0 && !strcmp(s+i,".nl")) s[i] = 0; break; } if (oi && oi->n_badopts) /* possiby set by kw->kf */ exit(1); *pargv = argv; return s; }