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; }
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; } }