gsl 1.12.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +29 -0
- data/Rakefile +54 -0
- data/VERSION +2 -0
- data/ext/MANIFEST +119 -0
- data/ext/alf.c +206 -0
- data/ext/array.c +666 -0
- data/ext/array_complex.c +247 -0
- data/ext/blas.c +29 -0
- data/ext/blas1.c +731 -0
- data/ext/blas2.c +1093 -0
- data/ext/blas3.c +881 -0
- data/ext/block.c +44 -0
- data/ext/block_source.c +886 -0
- data/ext/bspline.c +130 -0
- data/ext/bundle.c +3 -0
- data/ext/cdf.c +754 -0
- data/ext/cheb.c +542 -0
- data/ext/combination.c +283 -0
- data/ext/common.c +325 -0
- data/ext/complex.c +1004 -0
- data/ext/const.c +673 -0
- data/ext/const_additional.c +120 -0
- data/ext/cqp.c +283 -0
- data/ext/deriv.c +195 -0
- data/ext/dht.c +361 -0
- data/ext/diff.c +166 -0
- data/ext/dirac.c +395 -0
- data/ext/eigen.c +2373 -0
- data/ext/error.c +194 -0
- data/ext/extconf.rb +281 -0
- data/ext/fcmp.c +66 -0
- data/ext/fft.c +1092 -0
- data/ext/fit.c +205 -0
- data/ext/fresnel.c +312 -0
- data/ext/function.c +524 -0
- data/ext/geometry.c +139 -0
- data/ext/graph.c +1638 -0
- data/ext/gsl.c +271 -0
- data/ext/gsl_narray.c +653 -0
- data/ext/histogram.c +1995 -0
- data/ext/histogram2d.c +1068 -0
- data/ext/histogram3d.c +884 -0
- data/ext/histogram3d_source.c +750 -0
- data/ext/histogram_find.c +101 -0
- data/ext/histogram_oper.c +159 -0
- data/ext/ieee.c +98 -0
- data/ext/integration.c +1138 -0
- data/ext/interp.c +512 -0
- data/ext/jacobi.c +739 -0
- data/ext/linalg.c +4047 -0
- data/ext/linalg_complex.c +741 -0
- data/ext/math.c +725 -0
- data/ext/matrix.c +39 -0
- data/ext/matrix_complex.c +1732 -0
- data/ext/matrix_double.c +560 -0
- data/ext/matrix_int.c +256 -0
- data/ext/matrix_source.c +2733 -0
- data/ext/min.c +250 -0
- data/ext/monte.c +992 -0
- data/ext/multifit.c +1879 -0
- data/ext/multimin.c +808 -0
- data/ext/multimin_fsdf.c +156 -0
- data/ext/multiroots.c +955 -0
- data/ext/ndlinear.c +321 -0
- data/ext/nmf.c +167 -0
- data/ext/nmf_wrap.c +72 -0
- data/ext/ntuple.c +469 -0
- data/ext/odeiv.c +959 -0
- data/ext/ool.c +879 -0
- data/ext/oper_complex_source.c +253 -0
- data/ext/permutation.c +596 -0
- data/ext/poly.c +42 -0
- data/ext/poly2.c +265 -0
- data/ext/poly_source.c +1885 -0
- data/ext/qrng.c +171 -0
- data/ext/randist.c +1873 -0
- data/ext/rational.c +480 -0
- data/ext/rng.c +612 -0
- data/ext/root.c +408 -0
- data/ext/sf.c +1494 -0
- data/ext/sf_airy.c +200 -0
- data/ext/sf_bessel.c +867 -0
- data/ext/sf_clausen.c +28 -0
- data/ext/sf_coulomb.c +206 -0
- data/ext/sf_coupling.c +118 -0
- data/ext/sf_dawson.c +29 -0
- data/ext/sf_debye.c +157 -0
- data/ext/sf_dilog.c +42 -0
- data/ext/sf_elementary.c +44 -0
- data/ext/sf_ellint.c +206 -0
- data/ext/sf_elljac.c +29 -0
- data/ext/sf_erfc.c +93 -0
- data/ext/sf_exp.c +164 -0
- data/ext/sf_expint.c +211 -0
- data/ext/sf_fermi_dirac.c +148 -0
- data/ext/sf_gamma.c +344 -0
- data/ext/sf_gegenbauer.c +96 -0
- data/ext/sf_hyperg.c +197 -0
- data/ext/sf_laguerre.c +112 -0
- data/ext/sf_lambert.c +47 -0
- data/ext/sf_legendre.c +367 -0
- data/ext/sf_log.c +104 -0
- data/ext/sf_mathieu.c +238 -0
- data/ext/sf_power.c +46 -0
- data/ext/sf_psi.c +98 -0
- data/ext/sf_synchrotron.c +48 -0
- data/ext/sf_transport.c +76 -0
- data/ext/sf_trigonometric.c +207 -0
- data/ext/sf_zeta.c +119 -0
- data/ext/signal.c +310 -0
- data/ext/siman.c +718 -0
- data/ext/sort.c +208 -0
- data/ext/spline.c +395 -0
- data/ext/stats.c +799 -0
- data/ext/sum.c +168 -0
- data/ext/tamu_anova.c +56 -0
- data/ext/tensor.c +38 -0
- data/ext/tensor_source.c +1123 -0
- data/ext/vector.c +38 -0
- data/ext/vector_complex.c +2236 -0
- data/ext/vector_double.c +1433 -0
- data/ext/vector_int.c +204 -0
- data/ext/vector_source.c +3329 -0
- data/ext/wavelet.c +937 -0
- data/include/rb_gsl.h +151 -0
- data/include/rb_gsl_array.h +238 -0
- data/include/rb_gsl_cheb.h +21 -0
- data/include/rb_gsl_common.h +343 -0
- data/include/rb_gsl_complex.h +25 -0
- data/include/rb_gsl_const.h +29 -0
- data/include/rb_gsl_dirac.h +13 -0
- data/include/rb_gsl_eigen.h +17 -0
- data/include/rb_gsl_fft.h +62 -0
- data/include/rb_gsl_fit.h +25 -0
- data/include/rb_gsl_function.h +27 -0
- data/include/rb_gsl_graph.h +70 -0
- data/include/rb_gsl_histogram.h +63 -0
- data/include/rb_gsl_histogram3d.h +97 -0
- data/include/rb_gsl_integration.h +17 -0
- data/include/rb_gsl_interp.h +46 -0
- data/include/rb_gsl_linalg.h +25 -0
- data/include/rb_gsl_math.h +26 -0
- data/include/rb_gsl_odeiv.h +21 -0
- data/include/rb_gsl_poly.h +71 -0
- data/include/rb_gsl_rational.h +37 -0
- data/include/rb_gsl_rng.h +21 -0
- data/include/rb_gsl_root.h +22 -0
- data/include/rb_gsl_sf.h +119 -0
- data/include/rb_gsl_statistics.h +17 -0
- data/include/rb_gsl_tensor.h +45 -0
- data/include/rb_gsl_with_narray.h +22 -0
- data/include/templates_off.h +87 -0
- data/include/templates_on.h +241 -0
- data/lib/gsl/gnuplot.rb +41 -0
- data/lib/gsl/oper.rb +68 -0
- data/lib/ool.rb +22 -0
- data/lib/ool/conmin.rb +30 -0
- metadata +224 -0
data/ext/rational.c
ADDED
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
/*
|
|
2
|
+
rational.c
|
|
3
|
+
Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
|
|
4
|
+
(C) Copyright 2004 by Yoshiki Tsunesada
|
|
5
|
+
|
|
6
|
+
Ruby/GSL is free software: you can redistribute it and/or modify it
|
|
7
|
+
under the terms of the GNU General Public License.
|
|
8
|
+
This library is distributed in the hope that it will be useful, but
|
|
9
|
+
WITHOUT ANY WARRANTY.
|
|
10
|
+
*/
|
|
11
|
+
#include "rb_gsl_config.h"
|
|
12
|
+
#include "rb_gsl_rational.h"
|
|
13
|
+
#include "rb_gsl_array.h"
|
|
14
|
+
|
|
15
|
+
VALUE cgsl_rational;
|
|
16
|
+
static gsl_rational* gsl_rational_div_poly(const gsl_rational *r1, const gsl_poly *p);
|
|
17
|
+
|
|
18
|
+
static void gsl_rational_mark(gsl_rational *r);
|
|
19
|
+
gsl_rational* gsl_rational_alloc()
|
|
20
|
+
{
|
|
21
|
+
gsl_rational *r = NULL;
|
|
22
|
+
r = ALLOC(gsl_rational);
|
|
23
|
+
r->num = (VALUE) NULL;
|
|
24
|
+
r->den = (VALUE) NULL;
|
|
25
|
+
return r;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
gsl_rational* gsl_rational_new(const gsl_poly *num, const gsl_poly *den)
|
|
29
|
+
{
|
|
30
|
+
gsl_rational *r = NULL;
|
|
31
|
+
r = gsl_rational_alloc();
|
|
32
|
+
r->pnum = make_vector_clone(num);
|
|
33
|
+
r->pden = make_vector_clone(den);
|
|
34
|
+
r->num = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, r->pnum);
|
|
35
|
+
r->den = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, r->pden);
|
|
36
|
+
return r;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
gsl_rational* gsl_rational_new2(const gsl_poly *num, const gsl_poly *den)
|
|
40
|
+
{
|
|
41
|
+
gsl_rational *r = NULL;
|
|
42
|
+
r = gsl_rational_alloc();
|
|
43
|
+
r->pnum = (gsl_poly *) num;
|
|
44
|
+
r->pden = (gsl_poly *) den;
|
|
45
|
+
r->num = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, r->pnum);
|
|
46
|
+
r->den = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, r->pden);
|
|
47
|
+
return r;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
void gsl_rational_free(gsl_rational *r)
|
|
51
|
+
{
|
|
52
|
+
free((gsl_rational *) r);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
static gsl_rational* gsl_rational_add(const gsl_rational *r, const gsl_rational *r2)
|
|
57
|
+
{
|
|
58
|
+
gsl_rational *rnew = NULL;
|
|
59
|
+
gsl_poly *dennew = NULL, *numnew = NULL;
|
|
60
|
+
gsl_poly *a = NULL, *b = NULL;
|
|
61
|
+
int flag = 0;
|
|
62
|
+
if (rbgsl_vector_equal(r->pden, r2->pden, 1e-10)) {
|
|
63
|
+
dennew = r->pden;
|
|
64
|
+
numnew = gsl_poly_add(r->pnum, r2->pnum);
|
|
65
|
+
flag = 0;
|
|
66
|
+
} else {
|
|
67
|
+
dennew = gsl_poly_conv_vector(r->pden, r2->pden);
|
|
68
|
+
a = gsl_poly_conv_vector(r->pden, r2->pnum);
|
|
69
|
+
b = gsl_poly_conv_vector(r2->pden, r->pnum);
|
|
70
|
+
numnew = gsl_poly_add(a, b);
|
|
71
|
+
gsl_vector_free(a);
|
|
72
|
+
gsl_vector_free(b);
|
|
73
|
+
flag = 1;
|
|
74
|
+
}
|
|
75
|
+
rnew = gsl_rational_new(numnew, dennew);
|
|
76
|
+
gsl_vector_free(numnew);
|
|
77
|
+
if (flag == 1) gsl_vector_free(dennew);
|
|
78
|
+
return rnew;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static gsl_rational* gsl_rational_add_poly(const gsl_rational *r, const gsl_poly *p)
|
|
82
|
+
{
|
|
83
|
+
gsl_rational *rnew = NULL;
|
|
84
|
+
gsl_poly *numnew = NULL;
|
|
85
|
+
gsl_poly *a = NULL;
|
|
86
|
+
a = gsl_poly_conv_vector(r->pden, p);
|
|
87
|
+
numnew = gsl_poly_add(a, r->pnum);
|
|
88
|
+
rnew = gsl_rational_new(numnew, r->pden);
|
|
89
|
+
gsl_vector_free(a);
|
|
90
|
+
gsl_vector_free(numnew);
|
|
91
|
+
return rnew;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static gsl_rational* gsl_rational_mul(const gsl_rational *r1, const gsl_rational *r2)
|
|
95
|
+
{
|
|
96
|
+
gsl_rational *rnew = NULL;
|
|
97
|
+
gsl_poly *num = NULL, *den = NULL;
|
|
98
|
+
num = gsl_poly_conv_vector(r1->pnum, r2->pnum);
|
|
99
|
+
den = gsl_poly_conv_vector(r1->pden, r2->pden);
|
|
100
|
+
rnew = gsl_rational_new2(num, den);
|
|
101
|
+
return rnew;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static gsl_rational* gsl_rational_mul_poly(const gsl_rational *r1, const gsl_poly *p)
|
|
105
|
+
{
|
|
106
|
+
gsl_rational *rnew = NULL;
|
|
107
|
+
gsl_poly *num = NULL;
|
|
108
|
+
num = gsl_poly_conv_vector(r1->pnum, p);
|
|
109
|
+
rnew = gsl_rational_new(num, r1->pden);
|
|
110
|
+
gsl_vector_free(num);
|
|
111
|
+
return rnew;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static gsl_rational* gsl_rational_div(const gsl_rational *r1, const gsl_rational *r2)
|
|
115
|
+
{
|
|
116
|
+
gsl_rational *rnew = NULL;
|
|
117
|
+
gsl_poly *num = NULL, *den = NULL;
|
|
118
|
+
num = gsl_poly_conv_vector(r1->pnum, r2->pden);
|
|
119
|
+
den = gsl_poly_conv_vector(r1->pden, r2->pnum);
|
|
120
|
+
rnew = gsl_rational_new2(num, den);
|
|
121
|
+
return rnew;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static gsl_rational* gsl_rational_div_poly(const gsl_rational *r1, const gsl_poly *p)
|
|
125
|
+
{
|
|
126
|
+
gsl_rational *rnew = NULL;
|
|
127
|
+
gsl_poly *den = NULL;
|
|
128
|
+
den = gsl_poly_conv_vector(r1->pden, p);
|
|
129
|
+
rnew = gsl_rational_new(r1->pnum, den);
|
|
130
|
+
gsl_vector_free(den);
|
|
131
|
+
return rnew;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
static gsl_rational* gsl_rational_inverse(const gsl_rational *r)
|
|
135
|
+
{
|
|
136
|
+
return gsl_rational_new(r->pden, r->pnum);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/*
|
|
140
|
+
static gsl_poly* gsl_rational_partial_fraction(const gsl_rational *r)
|
|
141
|
+
{
|
|
142
|
+
gsl_poly *num = NULL, *r = NULL;
|
|
143
|
+
num = gsl_poly_deconv_vector(r->pnum, r->pden, &r);
|
|
144
|
+
if (gsl_vector_isnull(r)) {
|
|
145
|
+
gsl_vector_free(num);
|
|
146
|
+
gsl_vector_free(r);
|
|
147
|
+
return NULL;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
gsl_vector_free(num);
|
|
151
|
+
return r;
|
|
152
|
+
}
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
/*****/
|
|
156
|
+
gsl_poly* get_poly_get(VALUE obj, int *flag);
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
static void gsl_rational_mark(gsl_rational *r)
|
|
160
|
+
{
|
|
161
|
+
rb_gc_mark(r->num);
|
|
162
|
+
rb_gc_mark(r->den);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
static VALUE rb_gsl_rational_new(int argc, VALUE *argv, VALUE klass)
|
|
166
|
+
{
|
|
167
|
+
gsl_poly *den = NULL, *num = NULL;
|
|
168
|
+
gsl_rational *r = NULL;
|
|
169
|
+
int flag1 = 0, flag2 = 0;
|
|
170
|
+
switch (argc) {
|
|
171
|
+
case 0:
|
|
172
|
+
r = gsl_rational_alloc();
|
|
173
|
+
break;
|
|
174
|
+
case 2:
|
|
175
|
+
den = get_poly_get(argv[0], &flag1);
|
|
176
|
+
num = get_poly_get(argv[1], &flag2);
|
|
177
|
+
r = gsl_rational_new(den, num);
|
|
178
|
+
break;
|
|
179
|
+
default:
|
|
180
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 2)", argc);
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
if (flag1 == 1) gsl_vector_free(den);
|
|
184
|
+
if (flag2 == 1) gsl_vector_free(num);
|
|
185
|
+
return Data_Wrap_Struct(klass, gsl_rational_mark, gsl_rational_free, r);
|
|
186
|
+
}
|
|
187
|
+
/* singleton */
|
|
188
|
+
static VALUE rb_gsl_poly_make_rational(VALUE obj, VALUE other)
|
|
189
|
+
{
|
|
190
|
+
gsl_rational *rnew = NULL;
|
|
191
|
+
gsl_poly *p, *p2;
|
|
192
|
+
size_t i;
|
|
193
|
+
Data_Get_Struct(obj, gsl_poly, p);
|
|
194
|
+
if (VECTOR_P(other)) {
|
|
195
|
+
Data_Get_Struct(other, gsl_vector, p2);
|
|
196
|
+
rnew = gsl_rational_new(p, p2);
|
|
197
|
+
} else {
|
|
198
|
+
switch (TYPE(other)) {
|
|
199
|
+
case T_ARRAY:
|
|
200
|
+
p2 = gsl_vector_alloc(RARRAY_LEN(other));
|
|
201
|
+
for (i = 0; i < p2->size; i++)
|
|
202
|
+
gsl_vector_set(p2, i, NUM2DBL(rb_ary_entry(other, i)));
|
|
203
|
+
rnew = gsl_rational_new(p, p2);
|
|
204
|
+
gsl_vector_free(p2);
|
|
205
|
+
break;
|
|
206
|
+
case T_FLOAT:
|
|
207
|
+
case T_FIXNUM:
|
|
208
|
+
p2 = make_vector_clone(p);
|
|
209
|
+
gsl_vector_scale(p2, 1.0/NUM2DBL(other));
|
|
210
|
+
return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, p2);
|
|
211
|
+
break;
|
|
212
|
+
default:
|
|
213
|
+
rb_raise(rb_eTypeError, "wrong argument type %s",
|
|
214
|
+
rb_class2name(CLASS_OF(other)));
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
static VALUE rb_gsl_rational_print(VALUE obj)
|
|
222
|
+
{
|
|
223
|
+
gsl_rational *r = NULL;
|
|
224
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
225
|
+
gsl_vector_print(r->pnum, cgsl_vector);
|
|
226
|
+
gsl_vector_print(r->pden, cgsl_vector);
|
|
227
|
+
return Qnil;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
static VALUE rb_gsl_rational_to_s(VALUE obj)
|
|
231
|
+
{
|
|
232
|
+
gsl_rational *r = NULL;
|
|
233
|
+
VALUE str;
|
|
234
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
235
|
+
str = rb_gsl_vector_to_s(r->num);
|
|
236
|
+
rb_str_concat(str, rb_str_new2("\n"));
|
|
237
|
+
rb_str_concat(str, rb_gsl_vector_to_s(r->den));
|
|
238
|
+
return str;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
static VALUE rb_gsl_rational_inspect(VALUE obj)
|
|
242
|
+
{
|
|
243
|
+
VALUE str;
|
|
244
|
+
str = rb_str_new2(rb_class2name(CLASS_OF(obj)));
|
|
245
|
+
rb_str_concat(str, rb_str_new2("\n"));
|
|
246
|
+
rb_str_concat(str, rb_gsl_rational_to_s(obj));
|
|
247
|
+
return str;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
static VALUE rb_gsl_rational_add(VALUE obj, VALUE other)
|
|
251
|
+
{
|
|
252
|
+
gsl_rational *r = NULL, *r2 = NULL, *rnew = NULL;
|
|
253
|
+
gsl_poly *p = NULL;
|
|
254
|
+
int flag = 0;
|
|
255
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
256
|
+
if (RATIONAL_P(other)) {
|
|
257
|
+
Data_Get_Struct(other, gsl_rational, r2);
|
|
258
|
+
rnew = gsl_rational_add(r, r2);
|
|
259
|
+
} else {
|
|
260
|
+
p = get_poly_get(other, &flag);
|
|
261
|
+
rnew = gsl_rational_add_poly(r, p);
|
|
262
|
+
if (flag == 1) gsl_vector_free(p);
|
|
263
|
+
}
|
|
264
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
static VALUE rb_gsl_rational_deconv(VALUE obj)
|
|
268
|
+
{
|
|
269
|
+
gsl_rational *r = NULL;
|
|
270
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
271
|
+
return rb_gsl_poly_deconv(r->num, r->den);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static VALUE rb_gsl_rational_uminus(VALUE obj)
|
|
275
|
+
{
|
|
276
|
+
gsl_rational *r = NULL, *rnew;
|
|
277
|
+
gsl_poly *p = NULL, *ptmp;
|
|
278
|
+
int flag = 0;
|
|
279
|
+
size_t i;
|
|
280
|
+
if (RATIONAL_P(obj)) {
|
|
281
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
282
|
+
rnew = gsl_rational_new(r->pnum, r->pden);
|
|
283
|
+
for (i = 0; i < rnew->pnum->size; i++)
|
|
284
|
+
gsl_vector_set(rnew->pnum, i, -gsl_vector_get(r->pnum, i));
|
|
285
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
|
|
286
|
+
} else {
|
|
287
|
+
if (POLY_P(obj)) {
|
|
288
|
+
Data_Get_Struct(obj, gsl_vector, ptmp);
|
|
289
|
+
p = make_vector_clone(ptmp);
|
|
290
|
+
} else {
|
|
291
|
+
p = get_poly_get(obj, &flag);
|
|
292
|
+
}
|
|
293
|
+
for (i = 0; i < p->size; i++) gsl_vector_set(p, i, -gsl_vector_get(p, i));
|
|
294
|
+
return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, p);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
static VALUE rb_gsl_rational_uplus(VALUE obj)
|
|
299
|
+
{
|
|
300
|
+
return obj;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
static VALUE rb_gsl_rational_sub(VALUE obj, VALUE other)
|
|
304
|
+
{
|
|
305
|
+
return rb_gsl_rational_add(obj, rb_gsl_rational_uminus(other));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
static VALUE rb_gsl_rational_mul(VALUE obj, VALUE other)
|
|
309
|
+
{
|
|
310
|
+
gsl_rational *r = NULL, *r2 = NULL, *rnew = NULL;
|
|
311
|
+
gsl_poly *p;
|
|
312
|
+
int flag = 0;
|
|
313
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
314
|
+
if (RATIONAL_P(other)) {
|
|
315
|
+
Data_Get_Struct(other, gsl_rational, r2);
|
|
316
|
+
rnew = gsl_rational_mul(r, r2);
|
|
317
|
+
} else if (VECTOR_P(other)) {
|
|
318
|
+
Data_Get_Struct(other, gsl_vector, p);
|
|
319
|
+
rnew = gsl_rational_mul_poly(r, p);
|
|
320
|
+
} else {
|
|
321
|
+
p = get_poly_get(other, &flag);
|
|
322
|
+
rnew = gsl_rational_mul_poly(r, p);
|
|
323
|
+
gsl_vector_free(p);
|
|
324
|
+
}
|
|
325
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
static VALUE rb_gsl_rational_div(VALUE obj, VALUE other)
|
|
329
|
+
{
|
|
330
|
+
gsl_rational *r = NULL, *r2 = NULL, *rnew = NULL;
|
|
331
|
+
gsl_poly *p;
|
|
332
|
+
size_t i;
|
|
333
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
334
|
+
if (RATIONAL_P(other)) {
|
|
335
|
+
Data_Get_Struct(other, gsl_rational, r2);
|
|
336
|
+
rnew = gsl_rational_div(r, r2);
|
|
337
|
+
} else if (VECTOR_P(other)) {
|
|
338
|
+
Data_Get_Struct(other, gsl_vector, p);
|
|
339
|
+
rnew = gsl_rational_div_poly(r, p);
|
|
340
|
+
} else {
|
|
341
|
+
switch (TYPE(other)) {
|
|
342
|
+
case T_ARRAY:
|
|
343
|
+
p = gsl_vector_alloc(RARRAY_LEN(other));
|
|
344
|
+
for (i = 0; i < p->size; i++)
|
|
345
|
+
gsl_vector_set(p, i, NUM2DBL(rb_ary_entry(other, i)));
|
|
346
|
+
rnew = gsl_rational_div_poly(r, p);
|
|
347
|
+
gsl_vector_free(p);
|
|
348
|
+
break;
|
|
349
|
+
case T_FLOAT:
|
|
350
|
+
case T_FIXNUM:
|
|
351
|
+
rnew = gsl_rational_new(r->pnum, r->pden);
|
|
352
|
+
gsl_vector_scale(rnew->pnum, 1.0/NUM2DBL(other));
|
|
353
|
+
break;
|
|
354
|
+
default:
|
|
355
|
+
rb_raise(rb_eTypeError, "wrong argument type %s",
|
|
356
|
+
rb_class2name(CLASS_OF(other)));
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
static VALUE rb_gsl_rational_inverse(VALUE obj)
|
|
364
|
+
{
|
|
365
|
+
gsl_rational *r = NULL, *rnew = NULL;
|
|
366
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
367
|
+
rnew = gsl_rational_inverse(r);
|
|
368
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
static VALUE rb_gsl_rational_den(VALUE obj)
|
|
372
|
+
{
|
|
373
|
+
gsl_rational *r = NULL;
|
|
374
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
375
|
+
return r->den;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
static VALUE rb_gsl_rational_num(VALUE obj)
|
|
379
|
+
{
|
|
380
|
+
gsl_rational *r = NULL;
|
|
381
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
382
|
+
return r->num;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
static VALUE rb_gsl_rational_coerce(VALUE obj, VALUE other)
|
|
386
|
+
{
|
|
387
|
+
gsl_rational *r = NULL;
|
|
388
|
+
gsl_poly *p = NULL, *ptmp = NULL;
|
|
389
|
+
size_t i;
|
|
390
|
+
switch (TYPE(other)) {
|
|
391
|
+
case T_FLOAT:
|
|
392
|
+
case T_FIXNUM:
|
|
393
|
+
p = gsl_vector_alloc(1);
|
|
394
|
+
gsl_vector_set(p, 0, NUM2DBL(other));
|
|
395
|
+
break;
|
|
396
|
+
case T_ARRAY:
|
|
397
|
+
p = gsl_vector_alloc(RARRAY_LEN(other));
|
|
398
|
+
for (i = 0; i < p->size; i++)
|
|
399
|
+
gsl_vector_set(p, i, NUM2DBL(rb_ary_entry(other, i)));
|
|
400
|
+
break;
|
|
401
|
+
default:
|
|
402
|
+
CHECK_VECTOR(other);
|
|
403
|
+
Data_Get_Struct(other, gsl_vector, ptmp);
|
|
404
|
+
p = make_vector_clone(ptmp);
|
|
405
|
+
break;
|
|
406
|
+
}
|
|
407
|
+
ptmp = gsl_vector_alloc(1);
|
|
408
|
+
gsl_vector_set(ptmp, 0, 1.0);
|
|
409
|
+
r = gsl_rational_new2(p, ptmp);
|
|
410
|
+
return rb_ary_new3(2,
|
|
411
|
+
Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, r), obj);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
static VALUE rb_gsl_rational_zero(VALUE obj)
|
|
415
|
+
{
|
|
416
|
+
gsl_rational *r = NULL;
|
|
417
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
418
|
+
return rb_gsl_poly_complex_solve(1, &(r->num), cgsl_rational);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
static VALUE rb_gsl_rational_pole(VALUE obj)
|
|
422
|
+
{
|
|
423
|
+
gsl_rational *r = NULL;
|
|
424
|
+
Data_Get_Struct(obj, gsl_rational, r);
|
|
425
|
+
return rb_gsl_poly_complex_solve(1, &(r->den), cgsl_rational);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
static VALUE rb_gsl_poly_inverse(VALUE obj)
|
|
429
|
+
{
|
|
430
|
+
gsl_poly *p = NULL, *ptmp = NULL;
|
|
431
|
+
gsl_rational *r = NULL;
|
|
432
|
+
Data_Get_Struct(obj, gsl_poly, p);
|
|
433
|
+
ptmp = gsl_vector_alloc(1);
|
|
434
|
+
gsl_vector_set(ptmp, 0, 1.0);
|
|
435
|
+
r = gsl_rational_new(ptmp, p);
|
|
436
|
+
gsl_vector_free(ptmp);
|
|
437
|
+
return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, r);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
void Init_gsl_rational(VALUE module)
|
|
441
|
+
{
|
|
442
|
+
cgsl_rational = rb_define_class_under(module, "Rational", cGSL_Object);
|
|
443
|
+
rb_define_singleton_method(cgsl_rational, "new", rb_gsl_rational_new, -1);
|
|
444
|
+
rb_define_singleton_method(cgsl_rational, "[]", rb_gsl_rational_new, -1);
|
|
445
|
+
rb_define_singleton_method(cgsl_rational, "alloc", rb_gsl_rational_new, -1);
|
|
446
|
+
|
|
447
|
+
rb_define_method(cgsl_rational, "den", rb_gsl_rational_den, 0);
|
|
448
|
+
rb_define_method(cgsl_rational, "num", rb_gsl_rational_num, 0);
|
|
449
|
+
|
|
450
|
+
rb_define_method(cgsl_rational, "print", rb_gsl_rational_print, 0);
|
|
451
|
+
rb_define_method(cgsl_rational, "to_s", rb_gsl_rational_to_s, 0);
|
|
452
|
+
rb_define_method(cgsl_rational, "inspect", rb_gsl_rational_inspect, 0);
|
|
453
|
+
|
|
454
|
+
rb_define_method(cgsl_rational, "deconv", rb_gsl_rational_deconv, 0);
|
|
455
|
+
|
|
456
|
+
rb_define_method(cgsl_rational, "-@", rb_gsl_rational_uminus, 0);
|
|
457
|
+
rb_define_method(cgsl_rational, "+@", rb_gsl_rational_uplus, 0);
|
|
458
|
+
|
|
459
|
+
rb_define_method(cgsl_rational, "add", rb_gsl_rational_add, 1);
|
|
460
|
+
rb_define_alias(cgsl_rational, "+", "add");
|
|
461
|
+
rb_define_method(cgsl_rational, "sub", rb_gsl_rational_sub, 1);
|
|
462
|
+
rb_define_alias(cgsl_rational, "-", "sub");
|
|
463
|
+
rb_define_method(cgsl_rational, "mul", rb_gsl_rational_mul, 1);
|
|
464
|
+
rb_define_alias(cgsl_rational, "*", "mul");
|
|
465
|
+
rb_define_method(cgsl_rational, "div", rb_gsl_rational_div, 1);
|
|
466
|
+
rb_define_alias(cgsl_rational, "/", "div");
|
|
467
|
+
rb_define_method(cgsl_rational, "inverse", rb_gsl_rational_inverse, 0);
|
|
468
|
+
rb_define_alias(cgsl_rational, "inv", "inverse");
|
|
469
|
+
|
|
470
|
+
/***** Methods of poly *****/
|
|
471
|
+
rb_define_method(cgsl_poly, "inverse", rb_gsl_poly_inverse, 0);
|
|
472
|
+
rb_define_alias(cgsl_poly, "inv", "inverse");
|
|
473
|
+
rb_define_method(cgsl_poly, "make_rational", rb_gsl_poly_make_rational, 1);
|
|
474
|
+
rb_define_alias(cgsl_poly, "/", "make_rational");
|
|
475
|
+
|
|
476
|
+
rb_define_method(cgsl_rational, "coerce", rb_gsl_rational_coerce, 1);
|
|
477
|
+
|
|
478
|
+
rb_define_method(cgsl_rational, "zero", rb_gsl_rational_zero, 0);
|
|
479
|
+
rb_define_method(cgsl_rational, "pole", rb_gsl_rational_pole, 0);
|
|
480
|
+
}
|