コード例 #1
0
ファイル: func_expand.c プロジェクト: wenxuegege/libis
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;
}
コード例 #2
0
ファイル: func_import.c プロジェクト: wenxuegege/libis
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));
}
コード例 #3
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #4
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #5
0
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;
}
コード例 #6
0
ファイル: func_add.c プロジェクト: wenxuegege/libis
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);
}
コード例 #7
0
ファイル: eval.cpp プロジェクト: kebekus/srt
	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;
		}
	}
コード例 #8
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #9
0
ファイル: func_poly.c プロジェクト: wenxuegege/libis
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));
}
コード例 #10
0
ファイル: func_expand.c プロジェクト: wenxuegege/libis
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;
}
コード例 #11
0
ファイル: func_poly.c プロジェクト: wenxuegege/libis
// 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;
}
コード例 #12
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #13
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #14
0
ファイル: func_expand.c プロジェクト: wenxuegege/libis
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;
}
コード例 #15
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #16
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #17
0
ファイル: func_poly.c プロジェクト: wenxuegege/libis
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;
}
コード例 #18
0
ファイル: func_diff.c プロジェクト: wenxuegege/libis
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;
}
コード例 #19
0
ファイル: func_expand.c プロジェクト: wenxuegege/libis
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;
}