Ejemplo n.º 1
0
static gsl_poly_int* mygsl_poly_hermite(int n1)
{
  size_t n;
  gsl_vector_int *p1, *p2, *p0;
  int coef1[2] = {0, 2};
  int coef2[3] = {-2, 0, 4};
  if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
  p0 = gsl_vector_int_calloc(n1 + 1);
  switch (n1) {
  case 0:
    gsl_vector_int_set(p0, 0, 1);
    break;
  case 1:
    memcpy(p0->data, coef1, 2*sizeof(int));
    break;
  case 2:
    memcpy(p0->data, coef2, 3*sizeof(int));
    break;
  default:
    p1 = gsl_vector_int_calloc(n1 + 1);
    p2 = gsl_vector_int_calloc(n1 + 1);
    memcpy(p1->data, coef2, 3*sizeof(int));
    memcpy(p2->data, coef1, 2*sizeof(int));
    for (n = 2; n < n1; n++) {
      gsl_vector_int_memcpy(p0, p1);
      mygsl_vector_int_shift_scale2(p0, n);
      gsl_vector_int_scale(p2, 2*n);

      gsl_vector_int_sub(p0, p2);
      /* save for the next iteration */
      gsl_vector_int_memcpy(p2, p1);
      gsl_vector_int_memcpy(p1, p0);
    }
    gsl_vector_int_free(p2);
    gsl_vector_int_free(p1);    
    break;
  }
  return p0;
}
Ejemplo n.º 2
0
static VALUE rb_gsl_vector_int_sub(VALUE obj, VALUE b)
{
  gsl_vector_int *v, *vnew, *vb;
  switch (TYPE(b)) {
  case T_FIXNUM:
    return rb_gsl_vector_int_add_constant(obj, INT2FIX(-FIX2INT(b)));
    break;
  case T_FLOAT:
    return rb_gsl_vector_add_constant(rb_gsl_vector_int_to_f(obj), rb_float_new(-NUM2DBL(b)));
    break;
  default:
    if (rb_obj_is_kind_of(b, cgsl_vector_int)) {
     Data_Get_Struct(obj, gsl_vector_int, v);
     Data_Get_Struct(b, gsl_vector_int, vb);
     vnew = gsl_vector_int_alloc(v->size);
     gsl_vector_int_memcpy(vnew, v);
     gsl_vector_int_sub(vnew, vb);
     return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
    } else {
      return rb_gsl_vector_sub(rb_gsl_vector_int_to_f(obj), b);
    }
    break;
  }
}