ruby-mpfr 0.0.2 → 0.0.4

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.
Files changed (42) hide show
  1. data/History.txt +5 -2
  2. data/Manifest.txt +33 -7
  3. data/README.rdoc +10 -8
  4. data/Rakefile +4 -3
  5. data/ext/{extconf.rb → mpfr/extconf.rb} +4 -0
  6. data/ext/{ruby_mpfr.c → mpfr/ruby_mpfr.c} +466 -199
  7. data/ext/{ruby_mpfr.h → mpfr/ruby_mpfr.h} +2 -0
  8. data/ext/mpfr_matrix/mpfr/extconf.rb +7 -0
  9. data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.c +524 -0
  10. data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.h +72 -0
  11. data/ext/mpfr_matrix/mpfr/ruby_mpfr.h +40 -0
  12. data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.c +1056 -0
  13. data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.h +13 -0
  14. data/lib/mpfr/matrix.rb +145 -0
  15. data/lib/mpfr/version.rb +3 -0
  16. data/ruby-mpfr.gemspec +36 -0
  17. data/spec/mpfr/allocate_spec.rb +60 -0
  18. data/spec/mpfr/arithmetic_spec.rb +64 -0
  19. data/spec/mpfr/comparison_spec.rb +21 -0
  20. data/spec/mpfr/constant_spec.rb +23 -0
  21. data/spec/mpfr/conversion_spec.rb +14 -0
  22. data/spec/mpfr/exception_spec.rb +60 -0
  23. data/spec/mpfr/functions_spec.rb +25 -0
  24. data/spec/mpfr/generate_number_modulue.rb +44 -0
  25. data/spec/mpfr/precision_roundmode_spec.rb +65 -0
  26. data/spec/mpfr/rounding_spec.rb +51 -0
  27. data/spec/mpfr/set_value_spec.rb +77 -0
  28. data/spec/mpfr/spec_helper.rb +13 -0
  29. data/spec/mpfr/string_spec.rb +58 -0
  30. data/spec/mpfr_matrix/generate_matrix_arguments.rb +55 -0
  31. data/spec/mpfr_matrix/mpfr_matrix_alloc_spec.rb +126 -0
  32. data/spec/mpfr_matrix/mpfr_matrix_arithmetic_spec.rb +93 -0
  33. data/spec/mpfr_matrix/mpfr_matrix_set_element_spec.rb +55 -0
  34. data/spec/mpfr_matrix/mpfr_matrix_string_spec.rb +31 -0
  35. data/spec/mpfr_matrix/mpfr_square_matrix_spec.rb +75 -0
  36. data/spec/mpfr_matrix/spec_helper.rb +16 -0
  37. data/tasks/extconf.rake +36 -0
  38. metadata +48 -16
  39. data/lib/ruby-mpfr.rb +0 -6
  40. data/spec/ruby-mpfr_spec.rb +0 -11
  41. data/spec/spec_helper.rb +0 -10
  42. data/tasks/rspec.rake +0 -21
@@ -0,0 +1,1056 @@
1
+ #include "ruby_mpfr_matrix.h"
2
+
3
+ static ID eqq;
4
+
5
+ void r_mpfr_matrix_free(void *ptr)
6
+ {
7
+ mpfr_matrix_clear(ptr);
8
+ free(ptr);
9
+ }
10
+
11
+ void r_mpfr_matrix_suitable_matrix_init (VALUE *other, MPFRMatrix **ptr_other, int row, int column)
12
+ {
13
+ if(column == 1){
14
+ r_mpfr_make_col_vector_struct(*other, *ptr_other);
15
+ mpfr_col_vector_init(*ptr_other, row);
16
+ }else if (row == 1){
17
+ r_mpfr_make_row_vector_struct(*other, *ptr_other);
18
+ mpfr_row_vector_init(*ptr_other, column);
19
+ }else{
20
+ if (row == column){
21
+ r_mpfr_make_square_matrix_struct(*other, *ptr_other);
22
+ }else{
23
+ r_mpfr_make_matrix_struct(*other, *ptr_other);
24
+ }
25
+ mpfr_matrix_init(*ptr_other, row, column);
26
+ }
27
+ }
28
+
29
+ /* VALUE r_mpfr_matrix_copied_robj(VALUE old){ */
30
+ /* MPFRMatrix *ptr_old, *ptr_ret; */
31
+ /* r_mpfr_get_matrix_struct(ptr_old, old); */
32
+ /* VALUE ret; */
33
+ /* r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_old->row, ptr_old->column); */
34
+ /* mpfr_matrix_set(ptr_ret, ptr_old); */
35
+ /* return ret; */
36
+ /* } */
37
+
38
+ VALUE r_mpfr_matrix_robj(MPFRMatrix *x)
39
+ {
40
+ VALUE ret;
41
+ MPFRMatrix *ptr_ret;
42
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, x->row, x->column);
43
+ mpfr_matrix_set(ptr_ret, x);
44
+ return ret;
45
+ }
46
+
47
+ /* Allocation function for MPF::Matrix. */
48
+ static VALUE r_mpfr_matrix_alloc (VALUE self)
49
+ {
50
+ MPFRMatrix *ptr;
51
+ r_mpfr_make_matrix_struct(self, ptr);
52
+ return self;
53
+ }
54
+
55
+ /* static void r_mpfr_matrix_init_set_from_rmatrix(MPFRMatrix *x, VALUE src){ */
56
+ /* MPFRMatrix *ptr_src; */
57
+ /* r_mpfr_get_matrix_struct(ptr_src, src); */
58
+ /* mpfr_matrix_init(x, ptr_src->row, ptr_src->column); */
59
+ /* mpfr_matrix_set(x, ptr_src); */
60
+ /* } */
61
+
62
+ /*
63
+ Initialization function for MPF::Matrix.
64
+ If this method gets one argument which is two dimensional Array,
65
+ it returns MPFR::Matrix instance of which size is same as the array.
66
+ Getting two argument integers (i, j), it returns MPFR::Matrix instance of which
67
+ size is (i x j).
68
+ */
69
+ static VALUE r_mpfr_matrix_initialize (int argc, VALUE *argv, VALUE self)
70
+ {
71
+ MPFRMatrix *ptr;
72
+ r_mpfr_get_matrix_struct(ptr, self);
73
+ int row, column, i, j;
74
+ VALUE row_ary;
75
+ switch (argc) {
76
+ case 1:
77
+ row = RARRAY_LEN(argv[0]);
78
+ column = RARRAY_LEN(rb_ary_entry(argv[0], 0));
79
+ mpfr_matrix_init(ptr, row, column);
80
+ for (i = 0; i < row; i++) {
81
+ row_ary = rb_ary_entry(argv[0], i);
82
+ if (column != RARRAY_LEN(row_ary)) {
83
+ rb_raise(rb_eArgError, "MPF::Matrix.new needs Array which has arrays of same sizes.");
84
+ }
85
+ for (j = 0; j < column; j++) {
86
+ r_mpfr_set_robj(mpfr_matrix_get_element(ptr, i, j), rb_ary_entry(row_ary, j), GMP_RNDN);
87
+ }
88
+ }
89
+ break;
90
+ case 2:
91
+ mpfr_matrix_init(ptr, NUM2INT(argv[0]), NUM2INT(argv[1]));
92
+ mpfr_matrix_set_zeros(ptr);
93
+ break;
94
+ default:
95
+ rb_raise(rb_eArgError, "MPF::Matrix.new needs one or two arguments.");
96
+ break;
97
+ }
98
+ return Qtrue;
99
+ }
100
+
101
+ /* Allocation function for MPF::SquareMatrix. */
102
+ static VALUE r_mpfr_square_matrix_alloc (VALUE self)
103
+ {
104
+ MPFRMatrix *ptr;
105
+ r_mpfr_make_square_matrix_struct(self, ptr);
106
+ return self;
107
+ }
108
+
109
+ /* Initialization function for MPF::SquareMatrix. */
110
+ static VALUE r_mpfr_square_matrix_initialize (VALUE self, VALUE arg)
111
+ {
112
+ MPFRMatrix *ptr;
113
+ r_mpfr_get_matrix_struct(ptr, self);
114
+ int row, column, i, j;
115
+ VALUE row_ary;
116
+ switch(TYPE(arg)){
117
+ case T_ARRAY:
118
+ row = RARRAY_LEN(arg);
119
+ column = RARRAY_LEN(rb_ary_entry(arg, 0));
120
+ if(row == column){
121
+ mpfr_matrix_init(ptr, row, column);
122
+ for (i = 0; i < row; i++) {
123
+ row_ary = rb_ary_entry(arg, i);
124
+ if (column != RARRAY_LEN(row_ary)) {
125
+ rb_raise(rb_eArgError, "MPF::Matrix.new needs Array which has arrays of same sizes.");
126
+ }
127
+ for (j = 0; j < column; j++) {
128
+ r_mpfr_set_robj(ptr->data + i + j * row, rb_ary_entry(row_ary, j), GMP_RNDN);
129
+ }
130
+ }
131
+ }else{
132
+ rb_raise(rb_eArgError, "MPF::SquareMatrix.new needs two dimensinal Array which has the same sizes of row and column.");
133
+ }
134
+ break;
135
+ case T_FIXNUM:
136
+ row = NUM2INT(arg);
137
+ mpfr_matrix_init(ptr, row, row);
138
+ mpfr_matrix_set_zeros(ptr);
139
+ break;
140
+ default:
141
+ rb_raise(rb_eArgError, "MPF::SquareMatrix.new needs Array or Fixnum.");
142
+ break;
143
+ }
144
+ return Qtrue;
145
+ }
146
+
147
+ /* initialize_copy */
148
+ static VALUE r_mpfr_matrix_initialize_copy (VALUE self, VALUE other)
149
+ {
150
+ MPFRMatrix *ptr_self, *ptr_other;
151
+ r_mpfr_get_matrix_struct(ptr_self, self);
152
+ r_mpfr_get_matrix_struct(ptr_other, other);
153
+ mpfr_matrix_init(ptr_self, ptr_other->row, ptr_other->column);
154
+ mpfr_matrix_set(ptr_self, ptr_other);
155
+ return Qtrue;
156
+ }
157
+
158
+ /* Allocation function for MPF::ColumnVector. */
159
+ static VALUE r_mpfr_col_vector_alloc (VALUE self)
160
+ {
161
+ MPFRMatrix *ptr;
162
+ r_mpfr_make_col_vector_struct(self, ptr);
163
+ return self;
164
+ }
165
+
166
+ /* Initialization function for MPF::ColumnVector. */
167
+ static VALUE r_mpfr_col_vector_initialize (VALUE self, VALUE arg)
168
+ {
169
+ MPFRMatrix *ptr;
170
+ r_mpfr_get_matrix_struct(ptr, self);
171
+ int row, i;
172
+ switch(TYPE(arg)){
173
+ case T_ARRAY:
174
+ row = RARRAY_LEN(arg);
175
+ mpfr_col_vector_init(ptr, row);
176
+ for (i = 0; i < row; i++) {
177
+ r_mpfr_set_robj(ptr->data + i, rb_ary_entry(arg, i), GMP_RNDN);
178
+ }
179
+ break;
180
+ case T_FIXNUM:
181
+ row = NUM2INT(arg);
182
+ mpfr_col_vector_init(ptr, row);
183
+ for (i = 0; i < row; i++) {
184
+ mpfr_set_si(ptr->data + i, 0, GMP_RNDN);
185
+ }
186
+ break;
187
+ default:
188
+ rb_raise(rb_eArgError, "MPF::ColumnVector.new needs Array or Fixnum.");
189
+ break;
190
+ }
191
+ return Qtrue;
192
+ }
193
+
194
+ /* Allocation function for MPF::RowVector. */
195
+ static VALUE r_mpfr_row_vector_alloc (VALUE self)
196
+ {
197
+ MPFRMatrix *ptr;
198
+ r_mpfr_make_row_vector_struct(self, ptr);
199
+ return self;
200
+ }
201
+
202
+ /* Initialization function for MPF::RowVector. */
203
+ static VALUE r_mpfr_row_vector_initialize (VALUE self, VALUE arg)
204
+ {
205
+ MPFRMatrix *ptr;
206
+ r_mpfr_get_matrix_struct(ptr, self);
207
+ int column, i;
208
+ switch(TYPE(arg)){
209
+ case T_ARRAY:
210
+ column = RARRAY_LEN(arg);
211
+ mpfr_row_vector_init(ptr, column);
212
+ for (i = 0; i < column; i++) {
213
+ r_mpfr_set_robj(ptr->data + i, rb_ary_entry(arg, i), GMP_RNDN);
214
+ }
215
+ break;
216
+ case T_FIXNUM:
217
+ column = NUM2INT(arg);
218
+ mpfr_row_vector_init(ptr, column);
219
+ for (i = 0; i < column; i++) {
220
+ mpfr_set_si(ptr->data + i, 0, GMP_RNDN);
221
+ }
222
+ break;
223
+ default:
224
+ rb_raise(rb_eArgError, "MPF::RowVector.new needs Array or Fixnum.");
225
+ break;
226
+ }
227
+ return Qtrue;
228
+ }
229
+
230
+ /* Return true if all elements of _self_ equal to corresponding elements of _other_. */
231
+ static VALUE r_mpfr_matrix_equal_p (VALUE self, VALUE other)
232
+ {
233
+ MPFRMatrix *ptr_self, *ptr_other;
234
+ r_mpfr_get_matrix_struct(ptr_self, self);
235
+ r_mpfr_get_matrix_struct(ptr_other, other);
236
+ VALUE ret = Qtrue;
237
+ if (mpfr_matrix_equal_p(ptr_self, ptr_other) != 0) {
238
+ ret = Qnil;
239
+ }
240
+ return ret;
241
+ }
242
+
243
+ /* Return size of data array which equals to column * row. */
244
+ static VALUE r_mpfr_matrix_size (VALUE self)
245
+ {
246
+ MPFRMatrix *ptr_self;
247
+ r_mpfr_get_matrix_struct(ptr_self, self);
248
+ return INT2FIX(ptr_self->size);
249
+ }
250
+
251
+ /* Return column size of matrix. */
252
+ static VALUE r_mpfr_matrix_column_size (VALUE self)
253
+ {
254
+ MPFRMatrix *ptr_self;
255
+ r_mpfr_get_matrix_struct(ptr_self, self);
256
+ return INT2FIX(ptr_self->column);
257
+ }
258
+
259
+ /* Return row size of matrix. */
260
+ static VALUE r_mpfr_matrix_row_size (VALUE self)
261
+ {
262
+ MPFRMatrix *ptr_self;
263
+ r_mpfr_get_matrix_struct(ptr_self, self);
264
+ return INT2FIX(ptr_self->row);
265
+ }
266
+
267
+ /* Return element with _row_ and _column_.*/
268
+ static VALUE r_mpfr_matrix_element (VALUE self, VALUE row, VALUE column)
269
+ {
270
+ MPFRMatrix *ptr_self;
271
+ r_mpfr_get_matrix_struct(ptr_self, self);
272
+ int i = NUM2INT(row), j = NUM2INT(column);
273
+ if (i < ptr_self->row && j < ptr_self->column) {
274
+ VALUE ret;
275
+ MPFR *ptr_ret;
276
+ r_mpfr_make_struct_init(ret, ptr_ret);
277
+ mpfr_set(ptr_ret, ptr_self->data + i + j * ptr_self->row, GMP_RNDN);
278
+ return ret;
279
+ }else{
280
+ return Qnil;
281
+ }
282
+ }
283
+
284
+ /* Return element at _arg_.*/
285
+ static VALUE r_mpfr_matrix_at (VALUE self, VALUE arg)
286
+ {
287
+ MPFRMatrix *ptr_self;
288
+ r_mpfr_get_matrix_struct(ptr_self, self);
289
+ int i = NUM2INT(arg);
290
+ if (i < ptr_self->size) {
291
+ VALUE ret;
292
+ MPFR *ptr_ret;
293
+ r_mpfr_make_struct_init(ret, ptr_ret);
294
+ mpfr_set(ptr_ret, ptr_self->data + i, GMP_RNDN);
295
+ return ret;
296
+ }else{
297
+ return Qnil;
298
+ }
299
+ }
300
+
301
+ /* Set _robj_ to element of which row is _row_ and column is _column_. */
302
+ static VALUE r_mpfr_matrix_set_element (VALUE self, VALUE row, VALUE column, VALUE robj)
303
+ {
304
+ MPFRMatrix *ptr_self;
305
+ r_mpfr_get_matrix_struct(ptr_self, self);
306
+ int i = NUM2INT(row), j = NUM2INT(column);
307
+ if (i < ptr_self->row && j < ptr_self->column) {
308
+ r_mpfr_set_robj(mpfr_matrix_get_element(ptr_self, i, j), robj, GMP_RNDN);
309
+ }
310
+ return Qnil;
311
+ }
312
+
313
+ /* Evaluate block with each element of matrix. */
314
+ static VALUE r_mpfr_matrix_each_element (VALUE self)
315
+ {
316
+ MPFRMatrix *ptr_self;
317
+ r_mpfr_get_matrix_struct(ptr_self, self);
318
+ VALUE ret = Qnil;
319
+ int i, j;
320
+ for (i = 0; i < ptr_self->row; i++) {
321
+ for (j = 0; j < ptr_self->column; j++) {
322
+ volatile VALUE arg = r_mpfr_make_new_fr_obj(mpfr_matrix_get_element(ptr_self, i, j));
323
+ ret = rb_yield(arg);
324
+ }
325
+ }
326
+ return ret;
327
+ }
328
+
329
+ /* Evaluate block with each element and its index. */
330
+ static VALUE r_mpfr_matrix_each_element_with_index (VALUE self)
331
+ {
332
+ MPFRMatrix *ptr_self;
333
+ r_mpfr_get_matrix_struct(ptr_self, self);
334
+ VALUE ret = Qnil, tmp_i;
335
+ int i, j;
336
+ for (i = 0; i < ptr_self->row; i++) {
337
+ tmp_i = INT2NUM(i);
338
+ for (j = 0; j < ptr_self->column; j++) {
339
+ volatile VALUE arg = r_mpfr_make_new_fr_obj(mpfr_matrix_get_element(ptr_self, i, j));
340
+ ret = rb_yield(rb_ary_new3(3, arg, tmp_i, INT2NUM(j)));
341
+ }
342
+ }
343
+ return ret;
344
+ }
345
+
346
+ /* Return array which has strings converted elements to. */
347
+ static VALUE r_mpfr_matrix_str_ary(VALUE self, VALUE format_str)
348
+ {
349
+ MPFRMatrix *ptr_self;
350
+ r_mpfr_get_matrix_struct(ptr_self, self);
351
+ char *format = StringValuePtr(format_str), *tmp_str;
352
+ VALUE ret_val[ptr_self->size];
353
+ int i;
354
+ for (i = 0; i < ptr_self->size; i++) {
355
+ mpfr_asprintf(&tmp_str, format, ptr_self->data + i);
356
+ ret_val[i] = rb_str_new2(tmp_str);
357
+ mpfr_free_str(tmp_str);
358
+ }
359
+ return rb_ary_new4(ptr_self->size, ret_val);
360
+ }
361
+
362
+ static VALUE r_mpfr_matrix_str_ary2(VALUE self, VALUE format_str)
363
+ {
364
+ MPFRMatrix *ptr_self;
365
+ r_mpfr_get_matrix_struct(ptr_self, self);
366
+ char *format = StringValuePtr(format_str), *tmp_str;
367
+ VALUE ary[ptr_self->row];
368
+ int i, j;
369
+ for(i = 0; i < ptr_self->row; i++){
370
+ ary[i] = rb_ary_new();
371
+ }
372
+ for (i = 0; i < ptr_self->size; i += ptr_self->row) {
373
+ for (j = 0; j < ptr_self->row; j++) {
374
+ mpfr_asprintf(&tmp_str, format, ptr_self->data + i + j);
375
+ rb_ary_push(ary[j], rb_str_new2(tmp_str));
376
+ mpfr_free_str(tmp_str);
377
+ }
378
+ }
379
+ return rb_ary_new4(ptr_self->row, ary);
380
+ }
381
+
382
+ static VALUE r_mpfr_matrix_to_array(VALUE self)
383
+ {
384
+ MPFRMatrix *ptr_self;
385
+ r_mpfr_get_matrix_struct(ptr_self, self);
386
+ VALUE ret_val[ptr_self->size];
387
+ int i;
388
+ for (i = 0; i < ptr_self->size; i++) {
389
+ ret_val[i] = r_mpfr_make_new_fr_obj(ptr_self->data + i);
390
+ }
391
+ return rb_ary_new4(ptr_self->size, ret_val);
392
+ }
393
+
394
+ static VALUE r_mpfr_matrix_to_array2(VALUE self)
395
+ {
396
+ MPFRMatrix *ptr_self;
397
+ r_mpfr_get_matrix_struct(ptr_self, self);
398
+ VALUE ary[ptr_self->row];
399
+ int i, j;
400
+ for(i = 0; i < ptr_self->row; i++){
401
+ ary[i] = rb_ary_new();
402
+ }
403
+ for (i = 0; i < ptr_self->size; i += ptr_self->row) {
404
+ for (j = 0; j < ptr_self->row; j++) {
405
+ rb_ary_push(ary[j], r_mpfr_make_new_fr_obj(ptr_self->data + i + j));
406
+ }
407
+ }
408
+ return rb_ary_new4(ptr_self->row, ary);
409
+ }
410
+
411
+ static VALUE r_mpfr_matrix_row (VALUE self, VALUE arg)
412
+ {
413
+ MPFRMatrix *ptr_self, *ptr_ret;
414
+ r_mpfr_get_matrix_struct(ptr_self, self);
415
+ int num = NUM2INT(arg);
416
+ VALUE ret;
417
+ if(num < ptr_self->row){
418
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, 1, ptr_self->column);
419
+ mpfr_matrix_row(ptr_ret, ptr_self, num);
420
+ return ret;
421
+ }else{
422
+ return Qnil;
423
+ }
424
+ }
425
+
426
+ static VALUE r_mpfr_matrix_column (VALUE self, VALUE arg)
427
+ {
428
+ MPFRMatrix *ptr_self, *ptr_ret;
429
+ r_mpfr_get_matrix_struct(ptr_self, self);
430
+ int num = NUM2INT(arg);
431
+ VALUE ret;
432
+ if(num < ptr_self->column){
433
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, 1);
434
+ mpfr_matrix_column(ptr_ret, ptr_self, num);
435
+ return ret;
436
+ }else{
437
+ return Qnil;
438
+ }
439
+ }
440
+
441
+ /* Return transposed matrix which is new object. */
442
+ static VALUE r_mpfr_matrix_transpose (VALUE self)
443
+ {
444
+ MPFRMatrix *ptr_self, *ptr_ret;
445
+ r_mpfr_get_matrix_struct(ptr_self, self);
446
+ VALUE ret;
447
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->column, ptr_self->row);
448
+ mpfr_matrix_transpose(ptr_ret, ptr_self);
449
+ return ret;
450
+ }
451
+
452
+ /* Transpose self. This method is destroy method. */
453
+ static VALUE r_mpfr_matrix_transpose2 (VALUE self)
454
+ {
455
+ MPFRMatrix *ptr_self, tmp;
456
+ r_mpfr_get_matrix_struct(ptr_self, self);
457
+ if (ptr_self->column > 1 && ptr_self->row > 1) {
458
+ mpfr_matrix_init(&tmp, ptr_self->column, ptr_self->row);
459
+ mpfr_matrix_transpose(&tmp, ptr_self);
460
+ mpfr_matrix_set(ptr_self, &tmp);
461
+ mpfr_matrix_clear(&tmp);
462
+ }
463
+ int i;
464
+ i = ptr_self->column;
465
+ ptr_self->column = ptr_self->row;
466
+ ptr_self->row = i;
467
+ return self;
468
+ }
469
+
470
+ static VALUE r_mpfr_matrix_neg (VALUE self)
471
+ {
472
+ MPFRMatrix *ptr_self, *ptr_ret;
473
+ r_mpfr_get_matrix_struct(ptr_self, self);
474
+ VALUE ret;
475
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
476
+ mpfr_matrix_neg(ptr_ret, ptr_self);
477
+ return ret;
478
+ }
479
+
480
+ /* Return _self_ + _other_. */
481
+ static VALUE r_mpfr_matrix_add (VALUE self, VALUE other)
482
+ {
483
+ MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
484
+ r_mpfr_get_matrix_struct(ptr_self, self);
485
+ r_mpfr_get_matrix_struct(ptr_other, other);
486
+ VALUE ret;
487
+ if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
488
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
489
+ mpfr_matrix_add(ptr_ret, ptr_self, ptr_other);
490
+ }else{
491
+ rb_raise(rb_eArgError, "Matrixes must have same size.");
492
+ }
493
+ return ret;
494
+ }
495
+
496
+ /* Return _self_ + _other_ which is MPF::Matrix. */
497
+ static VALUE r_mpfr_matrix_add2 (VALUE self, VALUE other)
498
+ {
499
+ MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
500
+ r_mpfr_get_matrix_struct(ptr_self, self);
501
+ r_mpfr_get_matrix_struct(ptr_other, other);
502
+ VALUE ret;
503
+ r_mpfr_make_matrix_struct(ret, ptr_ret);
504
+ if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
505
+ mpfr_matrix_init(ptr_ret, ptr_self->row, ptr_self->column);
506
+ mpfr_matrix_add(ptr_ret, ptr_self, ptr_other);
507
+ }else{
508
+ rb_raise(rb_eArgError, "Matrixes must have same size.");
509
+ }
510
+ return ret;
511
+ }
512
+
513
+ /* Return _self_ - _other_. */
514
+ static VALUE r_mpfr_matrix_sub (VALUE self, VALUE other)
515
+ {
516
+ MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
517
+ r_mpfr_get_matrix_struct(ptr_self, self);
518
+ r_mpfr_get_matrix_struct(ptr_other, other);
519
+ VALUE ret;
520
+ r_mpfr_make_matrix_struct(ret, ptr_ret);
521
+ if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
522
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
523
+ mpfr_matrix_sub(ptr_ret, ptr_self, ptr_other);
524
+ }else{
525
+ rb_raise(rb_eArgError, "Matrixes must have same size.");
526
+ }
527
+ return ret;
528
+ }
529
+
530
+ /* Return _self_ - _other_ which is MPF::Matrix. */
531
+ static VALUE r_mpfr_matrix_sub2 (VALUE self, VALUE other)
532
+ {
533
+ MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
534
+ r_mpfr_get_matrix_struct(ptr_self, self);
535
+ r_mpfr_get_matrix_struct(ptr_other, other);
536
+ VALUE ret;
537
+ r_mpfr_make_matrix_struct(ret, ptr_ret);
538
+ if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
539
+ mpfr_matrix_init(ptr_ret, ptr_self->row, ptr_self->column);
540
+ mpfr_matrix_sub(ptr_ret, ptr_self, ptr_other);
541
+ }else{
542
+ rb_raise(rb_eArgError, "Matrixes must have same size.");
543
+ }
544
+ return ret;
545
+ }
546
+
547
+ static VALUE r_mpfr_vector_inner_product (VALUE self, VALUE arg)
548
+ {
549
+ MPFRMatrix *ptr_self, *ptr_arg;
550
+ r_mpfr_get_matrix_struct(ptr_self, self);
551
+ r_mpfr_get_matrix_struct(ptr_arg, arg);
552
+ VALUE ret;
553
+ MPFR *ptr_ret;
554
+ r_mpfr_make_struct_init(ret, ptr_ret);
555
+ if(ptr_self->size == ptr_arg->size){
556
+ mpfr_matrix_inner_product(ptr_ret, ptr_self, ptr_arg);
557
+ }else{
558
+ rb_raise(rb_eArgError, "Vectors must have same size.");
559
+ }
560
+ return ret;
561
+ }
562
+
563
+ /* Return _self_ * _other_. */
564
+ static VALUE r_mpfr_matrix_mul_matrix (VALUE self, VALUE other)
565
+ {
566
+ MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
567
+ r_mpfr_get_matrix_struct(ptr_self, self);
568
+ r_mpfr_get_matrix_struct(ptr_other, other);
569
+ VALUE ret;
570
+ r_mpfr_make_matrix_struct(ret, ptr_ret);
571
+ if (ptr_self->column == ptr_other->row) {
572
+ if((ptr_other->column == 1) && (ptr_self->row == 1)){
573
+ ret = r_mpfr_vector_inner_product(self, other);
574
+ }else{
575
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_other->column);
576
+ mpfr_matrix_mul(ptr_ret, ptr_self, ptr_other);
577
+ }
578
+ }else{
579
+ rb_raise(rb_eArgError, "Row size of first matrixes must be same as colmun size of second matrixes.");
580
+ }
581
+ return ret;
582
+ }
583
+
584
+ /* Return _self_ * _other_ which is MPF::Matrix. */
585
+ static VALUE r_mpfr_matrix_mul_matrix2 (VALUE self, VALUE other)
586
+ {
587
+ MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
588
+ r_mpfr_get_matrix_struct(ptr_self, self);
589
+ r_mpfr_get_matrix_struct(ptr_other, other);
590
+ VALUE ret;
591
+ r_mpfr_make_matrix_struct(ret, ptr_ret);
592
+ if (ptr_self->column == ptr_other->row) {
593
+ mpfr_matrix_init(ptr_ret, ptr_self->row, ptr_other->column);
594
+ mpfr_matrix_mul(ptr_ret, ptr_self, ptr_other);
595
+ }else{
596
+ rb_raise(rb_eArgError, "Row size of first matrixes must be same as colmun size of second matrixes.");
597
+ }
598
+ return ret;
599
+ }
600
+
601
+ /* Return _scalar_ * _self_, where _scalar_ is scalar and _self_ is matrix. */
602
+ static VALUE r_mpfr_matrix_mul_scalar (VALUE self, VALUE scalar)
603
+ {
604
+ MPFRMatrix *ptr_self, *ptr_ret;
605
+ MPFR *ptr_scalar;
606
+ r_mpfr_get_matrix_struct(ptr_self, self);
607
+ VALUE ret;
608
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
609
+ if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, scalar))){
610
+ r_mpfr_get_struct(ptr_scalar, scalar);
611
+ mpfr_matrix_mul_scalar(ptr_ret, ptr_self, ptr_scalar);
612
+ }else{
613
+ r_mpfr_temp_alloc_init(ptr_scalar);
614
+ r_mpfr_set_robj(ptr_scalar, scalar, GMP_RNDN);
615
+ mpfr_matrix_mul_scalar(ptr_ret, ptr_self, ptr_scalar);
616
+ r_mpfr_temp_free(ptr_scalar);
617
+ }
618
+ return ret;
619
+ }
620
+
621
+ /* Return _scalar_ * _self_, where _scalar_ is scalar and _self_ is matrix. */
622
+ static VALUE r_mpfr_matrix_div_scalar (VALUE self, VALUE scalar)
623
+ {
624
+ MPFRMatrix *ptr_self, *ptr_ret;
625
+ MPFR *ptr_scalar;
626
+ r_mpfr_get_matrix_struct(ptr_self, self);
627
+ VALUE ret;
628
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
629
+ if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, scalar))){
630
+ r_mpfr_get_struct(ptr_scalar, scalar);
631
+ mpfr_matrix_div_scalar(ptr_ret, ptr_self, ptr_scalar);
632
+ }else{
633
+ r_mpfr_temp_alloc_init(ptr_scalar);
634
+ r_mpfr_set_robj(ptr_scalar, scalar, GMP_RNDN);
635
+ mpfr_matrix_div_scalar(ptr_ret, ptr_self, ptr_scalar);
636
+ r_mpfr_temp_free(ptr_scalar);
637
+ }
638
+ return ret;
639
+ }
640
+
641
+ /* Take matrix for vector and return length of the vector. */
642
+ static VALUE r_mpfr_matrix_vector_norm (VALUE self)
643
+ {
644
+ MPFRMatrix *ptr_self;
645
+ r_mpfr_get_matrix_struct(ptr_self, self);
646
+ VALUE ret;
647
+ MPFR *ptr_ret;
648
+ r_mpfr_make_struct_init(ret, ptr_ret);
649
+ mpfr_matrix_vector_norm(ptr_ret, ptr_self);
650
+ return ret;
651
+ }
652
+
653
+ /* Return maximum value of absolute value of element. */
654
+ static VALUE r_mpfr_matrix_max_norm (VALUE self)
655
+ {
656
+ MPFRMatrix *ptr_self;
657
+ r_mpfr_get_matrix_struct(ptr_self, self);
658
+ VALUE ret;
659
+ MPFR *ptr_ret;
660
+ r_mpfr_make_struct_init(ret, ptr_ret);
661
+ mpfr_matrix_max_norm(ptr_ret, ptr_self);
662
+ return ret;
663
+ }
664
+
665
+ /* Return row size of matrix. */
666
+ static VALUE r_mpfr_square_matrix_dim (VALUE self)
667
+ {
668
+ MPFRMatrix *ptr_self;
669
+ r_mpfr_get_matrix_struct(ptr_self, self);
670
+ return INT2FIX(ptr_self->row);
671
+ }
672
+
673
+ /* Return [matrix_l, matrix_r, indx]. */
674
+ static VALUE r_mpfr_square_matrix_lu_decomp (VALUE self)
675
+ {
676
+ MPFRMatrix *ptr_self, *ptr_ret_l, *ptr_ret_u;
677
+ VALUE ret_l, ret_u;
678
+ r_mpfr_get_matrix_struct(ptr_self, self);
679
+ r_mpfr_matrix_suitable_matrix_init (&ret_l, &ptr_ret_l, ptr_self->row, ptr_self->column);
680
+ r_mpfr_matrix_suitable_matrix_init (&ret_u, &ptr_ret_u, ptr_self->row, ptr_self->column);
681
+ VALUE ret_indx[ptr_self->row];
682
+ int indx[ptr_self->row];
683
+ if(mpfr_square_matrix_lu_decomp (ptr_ret_u, indx, ptr_self) >= 0){
684
+ int i, j;
685
+ for(i = 1; i < ptr_ret_u->row; i++){
686
+ for(j = 0; j < i; j++){
687
+ mpfr_set(mpfr_matrix_get_element(ptr_ret_l, i, j), mpfr_matrix_get_element(ptr_ret_u, i, j), GMP_RNDN);
688
+ mpfr_set_si(mpfr_matrix_get_element(ptr_ret_u, i, j), 0, GMP_RNDN);
689
+ }
690
+ }
691
+ for(i = 0; i < ptr_ret_u->row; i++){
692
+ mpfr_set_si(mpfr_matrix_get_element(ptr_ret_l, i, i), 1, GMP_RNDN);
693
+ }
694
+ for(i = 0; i < ptr_ret_u->row; i++){
695
+ for(j = i + 1; j < ptr_ret_u->column; j++){
696
+ mpfr_set_si(mpfr_matrix_get_element(ptr_ret_l, i, j), 0, GMP_RNDN);
697
+ }
698
+ }
699
+ for(i = 0; i < ptr_ret_u->row; i++){
700
+ ret_indx[i] = INT2NUM(indx[i]);
701
+ }
702
+ return rb_ary_new3(3, ret_l, ret_u, rb_ary_new4(ptr_ret_u->row, ret_indx));
703
+ }else{
704
+ return Qnil;
705
+ }
706
+ }
707
+
708
+ static VALUE r_mpfr_square_matrix_determinant (VALUE self)
709
+ {
710
+ MPFRMatrix *ptr_self;
711
+ r_mpfr_get_matrix_struct(ptr_self, self);
712
+ MPFR *ptr_ret;
713
+ VALUE ret;
714
+ r_mpfr_make_struct_init(ret, ptr_ret);
715
+ mpfr_square_matrix_determinant(ptr_ret, ptr_self);
716
+ return ret;
717
+ }
718
+
719
+ static VALUE r_mpfr_square_matrix_qr_decomp (VALUE self)
720
+ {
721
+ MPFRMatrix *ptr_self, *ptr_q, *ptr_r;
722
+ r_mpfr_get_matrix_struct(ptr_self, self);
723
+ VALUE q, r;
724
+ r_mpfr_matrix_suitable_matrix_init (&q, &ptr_q, ptr_self->row, ptr_self->column);
725
+ r_mpfr_matrix_suitable_matrix_init (&r, &ptr_r, ptr_self->column, ptr_self->column);
726
+ mpfr_square_matrix_qr_decomp(ptr_q, ptr_r, ptr_self);
727
+ return rb_ary_new3(2, q, r);
728
+ }
729
+
730
+ static VALUE r_mpfr_square_matrix_identity (VALUE self, VALUE size)
731
+ {
732
+ VALUE ret;
733
+ MPFRMatrix *ptr_ret;
734
+ int s = NUM2INT(size);
735
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, s, s);
736
+ mpfr_square_matrix_identity(ptr_ret);
737
+ return ret;
738
+ }
739
+
740
+ /* Return size of data array which equals to column * row. */
741
+ static VALUE r_mpfr_vector_dim (VALUE self)
742
+ {
743
+ MPFRMatrix *ptr_self;
744
+ r_mpfr_get_matrix_struct(ptr_self, self);
745
+ return INT2FIX(ptr_self->size);
746
+ }
747
+
748
+ /* Take matrix for vector and return length of the vector. */
749
+ static VALUE r_mpfr_vector_abs (VALUE self)
750
+ {
751
+ MPFRMatrix *ptr_self;
752
+ r_mpfr_get_matrix_struct(ptr_self, self);
753
+ VALUE ret;
754
+ MPFR *ptr_ret;
755
+ r_mpfr_make_struct_init(ret, ptr_ret);
756
+ mpfr_matrix_vector_norm(ptr_ret, ptr_self);
757
+ return ret;
758
+ }
759
+
760
+ /* Return element at _arg_.*/
761
+ static VALUE r_mpfr_vector_element (VALUE self, VALUE arg)
762
+ {
763
+ MPFRMatrix *ptr_self;
764
+ r_mpfr_get_matrix_struct(ptr_self, self);
765
+ int i = NUM2INT(arg);
766
+ if (i < ptr_self->size) {
767
+ VALUE ret;
768
+ MPFR *ptr_ret;
769
+ r_mpfr_make_struct_init(ret, ptr_ret);
770
+ mpfr_set(ptr_ret, ptr_self->data + i, GMP_RNDN);
771
+ return ret;
772
+ }else{
773
+ return Qnil;
774
+ }
775
+ }
776
+
777
+ /* Set _robj_ to _arg_ th element. */
778
+ static VALUE r_mpfr_vector_set_element (VALUE self, VALUE arg, VALUE robj)
779
+ {
780
+ MPFRMatrix *ptr_self;
781
+ r_mpfr_get_matrix_struct(ptr_self, self);
782
+ int i = NUM2INT(arg);
783
+ if (i < ptr_self->size) {
784
+ r_mpfr_set_robj(ptr_self->data + i, robj, GMP_RNDN);
785
+ }
786
+ return Qnil;
787
+ }
788
+
789
+ /* Evaluate block with each element of vector. */
790
+ static VALUE r_mpfr_vector_each_element (VALUE self)
791
+ {
792
+ MPFRMatrix *ptr_self;
793
+ r_mpfr_get_matrix_struct(ptr_self, self);
794
+ VALUE ret = Qnil, tmp;
795
+ MPFR *tmp_ptr;
796
+ r_mpfr_make_struct_init(tmp, tmp_ptr);
797
+ int i;
798
+ for (i = 0; i < ptr_self->size; i++) {
799
+ mpfr_set(tmp_ptr, ptr_self->data + i, GMP_RNDN);
800
+ ret = rb_yield(tmp);
801
+ }
802
+ return ret;
803
+ }
804
+
805
+ /* Evaluate block with each element and its index. */
806
+ static VALUE r_mpfr_vector_each_element_with_index (VALUE self)
807
+ {
808
+ MPFRMatrix *ptr_self;
809
+ r_mpfr_get_matrix_struct(ptr_self, self);
810
+ VALUE ret = Qnil, tmp;
811
+ MPFR *tmp_ptr;
812
+ r_mpfr_make_struct_init(tmp, tmp_ptr);
813
+ int i;
814
+ for (i = 0; i < ptr_self->size; i++) {
815
+ mpfr_set(tmp_ptr, ptr_self->data + i, GMP_RNDN);
816
+ ret = rb_yield(rb_ary_new3(2, tmp, INT2NUM(i)));
817
+ }
818
+ return ret;
819
+ }
820
+
821
+ static VALUE r_mpfr_vector_distance_from (VALUE self, VALUE arg)
822
+ {
823
+ MPFRMatrix *ptr_self, *ptr_arg;
824
+ r_mpfr_get_matrix_struct(ptr_self, self);
825
+ r_mpfr_get_matrix_struct(ptr_arg, arg);
826
+ VALUE ret;
827
+ MPFR *ptr_ret;
828
+ r_mpfr_make_struct_init(ret, ptr_ret);
829
+ if(ptr_self->size == ptr_arg->size){
830
+ mpfr_matrix_vector_distance(ptr_ret, ptr_self, ptr_arg);
831
+ }else{
832
+ rb_raise(rb_eArgError, "Vectors must have same size.");
833
+ }
834
+ return ret;
835
+ }
836
+
837
+ static VALUE r_mpfr_vector_midpoint (VALUE self, VALUE arg)
838
+ {
839
+ MPFRMatrix *ptr_self, *ptr_arg, *ptr_ret;
840
+ r_mpfr_get_matrix_struct(ptr_self, self);
841
+ r_mpfr_get_matrix_struct(ptr_arg, arg);
842
+ VALUE ret;
843
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
844
+ mpfr_vector_midpoint(ptr_ret, ptr_self, ptr_arg);
845
+ return ret;
846
+ }
847
+
848
+ static VALUE r_mpfr_vector_dividing_point (VALUE self, VALUE arg, VALUE div)
849
+ {
850
+ MPFRMatrix *ptr_self, *ptr_arg, *ptr_ret;
851
+ r_mpfr_get_matrix_struct(ptr_self, self);
852
+ r_mpfr_get_matrix_struct(ptr_arg, arg);
853
+ MPFR *ptr_div;
854
+ r_mpfr_get_struct(ptr_div, div);
855
+ VALUE ret;
856
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
857
+ mpfr_vector_dividing_point(ptr_ret, ptr_self, ptr_arg, ptr_div);
858
+ return ret;
859
+ }
860
+
861
+ static VALUE r_mpfr_vector_normalize (VALUE self)
862
+ {
863
+ MPFRMatrix *ptr_self, *ptr_ret;
864
+ r_mpfr_get_matrix_struct(ptr_self, self);
865
+ VALUE ret;
866
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
867
+ if(mpfr_vector_normalize(ptr_ret, ptr_self) == 0){
868
+ return ret;
869
+ }else{
870
+ return Qnil;
871
+ }
872
+ }
873
+
874
+ /* Return normalized vector of _self_. This method is destroy method. */
875
+ static VALUE r_mpfr_vector_normalize2 (VALUE self)
876
+ {
877
+ MPFRMatrix *ptr_self, tmp;
878
+ r_mpfr_get_matrix_struct(ptr_self, self);
879
+ VALUE ret = self;
880
+ mpfr_matrix_init(&tmp, ptr_self->column, ptr_self->row);
881
+ if(mpfr_vector_normalize(&tmp, ptr_self) == 0){
882
+ mpfr_matrix_set(ptr_self, &tmp);
883
+ }else{
884
+ ret = Qnil;
885
+ }
886
+ mpfr_matrix_clear(&tmp);
887
+ return ret;
888
+ }
889
+
890
+ static VALUE r_mpfr_vector_set_length (VALUE self, VALUE arg)
891
+ {
892
+ MPFRMatrix *ptr_self, *ptr_ret;
893
+ r_mpfr_get_matrix_struct(ptr_self, self);
894
+ VALUE ret, returned_value = Qnil;
895
+ MPFR *ptr_l;
896
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
897
+ if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, arg))){
898
+ r_mpfr_get_struct(ptr_l, arg);
899
+ if(mpfr_vector_set_length(ptr_ret, ptr_self, ptr_l) == 0){
900
+ returned_value = ret;
901
+ }
902
+ }else{
903
+ r_mpfr_temp_alloc_init(ptr_l);
904
+ r_mpfr_set_robj(ptr_l, arg, GMP_RNDN);
905
+ if(mpfr_vector_set_length(ptr_ret, ptr_self, ptr_l) == 0){
906
+ returned_value = ret;
907
+ }
908
+ r_mpfr_temp_free(ptr_l);
909
+ }
910
+ return returned_value;
911
+ }
912
+
913
+ static VALUE r_mpfr_vector_set_length2 (VALUE self, VALUE arg)
914
+ {
915
+ MPFRMatrix *ptr_self, *ptr_ret;
916
+ r_mpfr_get_matrix_struct(ptr_self, self);
917
+ VALUE ret, returned_value = Qnil;
918
+ MPFR *ptr_l;
919
+ r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
920
+ if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, arg))){
921
+ r_mpfr_get_struct(ptr_l, arg);
922
+ if(mpfr_vector_set_length(ptr_ret, ptr_self, ptr_l) == 0){
923
+ mpfr_matrix_set(ptr_self, ptr_ret);
924
+ returned_value = self;
925
+ }
926
+ }else{
927
+ r_mpfr_temp_alloc_init(ptr_l);
928
+ r_mpfr_set_robj(ptr_l, arg, GMP_RNDN);
929
+ if(mpfr_vector_set_length(ptr_ret, ptr_self, ptr_l) == 0){
930
+ mpfr_matrix_set(ptr_self, ptr_ret);
931
+ returned_value = self;
932
+ }
933
+ r_mpfr_temp_free(ptr_l);
934
+ }
935
+ return returned_value;
936
+ }
937
+
938
+ void Init_matrix()
939
+ {
940
+
941
+ VALUE tmp_mpfr_class = rb_define_class("MPFR", rb_cNumeric);
942
+
943
+ /*
944
+ MPFR::Matrix is class in which instances means matrix and
945
+ have MPFR instances as elements.
946
+ */
947
+
948
+ /* Initialization of MPFR::Matrix, MPFR::SquareMatrix, MPFR::ColumnVector and MPFR::RowVector */
949
+ r_mpfr_matrix = rb_define_class_under(tmp_mpfr_class, "Matrix", rb_cObject);
950
+ r_mpfr_square_matrix = rb_define_class_under(tmp_mpfr_class, "SquareMatrix", r_mpfr_matrix);
951
+ r_mpfr_col_vector = rb_define_class_under(tmp_mpfr_class, "ColumnVector", r_mpfr_matrix);
952
+ r_mpfr_row_vector = rb_define_class_under(tmp_mpfr_class, "RowVector", r_mpfr_matrix);
953
+
954
+ rb_define_alloc_func(r_mpfr_matrix, r_mpfr_matrix_alloc);
955
+ rb_define_private_method(r_mpfr_matrix, "initialize", r_mpfr_matrix_initialize, -1);
956
+ rb_define_private_method(r_mpfr_matrix, "initialize_copy", r_mpfr_matrix_initialize_copy, 1);
957
+
958
+ rb_define_alloc_func(r_mpfr_square_matrix, r_mpfr_square_matrix_alloc);
959
+ rb_define_private_method(r_mpfr_square_matrix, "initialize", r_mpfr_square_matrix_initialize, 1);
960
+
961
+ rb_define_alloc_func(r_mpfr_col_vector, r_mpfr_col_vector_alloc);
962
+ rb_define_private_method(r_mpfr_col_vector, "initialize", r_mpfr_col_vector_initialize, 1);
963
+
964
+ rb_define_alloc_func(r_mpfr_row_vector, r_mpfr_row_vector_alloc);
965
+ rb_define_private_method(r_mpfr_row_vector, "initialize", r_mpfr_row_vector_initialize, 1);
966
+
967
+
968
+ rb_define_method(r_mpfr_matrix, "size", r_mpfr_matrix_size, 0);
969
+ rb_define_method(r_mpfr_matrix, "column_size", r_mpfr_matrix_column_size, 0);
970
+ rb_define_method(r_mpfr_matrix, "row_size", r_mpfr_matrix_row_size, 0);
971
+
972
+ rb_define_method(r_mpfr_matrix, "set_element", r_mpfr_matrix_set_element, 3);
973
+ rb_define_method(r_mpfr_matrix, "at", r_mpfr_matrix_at, 1);
974
+ rb_define_method(r_mpfr_matrix, "element", r_mpfr_matrix_element, 2);
975
+ rb_define_method(r_mpfr_matrix, "each_element", r_mpfr_matrix_each_element, 0);
976
+ rb_define_method(r_mpfr_matrix, "each_element_with_index", r_mpfr_matrix_each_element_with_index, 0);
977
+
978
+ rb_define_alias(r_mpfr_matrix, "[]=", "set_element");
979
+ rb_define_alias(r_mpfr_matrix, "[]", "element");
980
+ rb_define_alias(r_mpfr_matrix, "each", "each_element");
981
+
982
+ rb_include_module(r_mpfr_matrix, rb_mEnumerable);
983
+
984
+
985
+ rb_define_method(r_mpfr_matrix, "str_ary", r_mpfr_matrix_str_ary, 1);
986
+ rb_define_method(r_mpfr_matrix, "str_ary2", r_mpfr_matrix_str_ary2, 1);
987
+
988
+
989
+ rb_define_method(r_mpfr_matrix, "to_a", r_mpfr_matrix_to_array2, 0);
990
+ rb_define_method(r_mpfr_matrix, "to_a2", r_mpfr_matrix_to_array, 0);
991
+
992
+ rb_define_method(r_mpfr_matrix, "row", r_mpfr_matrix_row, 1);
993
+ rb_define_method(r_mpfr_matrix, "column", r_mpfr_matrix_column, 1);
994
+ rb_define_method(r_mpfr_matrix, "transpose", r_mpfr_matrix_transpose, 0);
995
+ rb_define_method(r_mpfr_matrix, "transpose!", r_mpfr_matrix_transpose2, 0);
996
+ rb_define_method(r_mpfr_matrix, "neg", r_mpfr_matrix_neg, 0);
997
+
998
+
999
+ rb_define_method(r_mpfr_matrix, "==", r_mpfr_matrix_equal_p, 1);
1000
+ rb_define_method(r_mpfr_matrix, "add", r_mpfr_matrix_add, 1);
1001
+ rb_define_method(r_mpfr_matrix, "add2", r_mpfr_matrix_add2, 1);
1002
+ rb_define_method(r_mpfr_matrix, "sub", r_mpfr_matrix_sub, 1);
1003
+ rb_define_method(r_mpfr_matrix, "sub2", r_mpfr_matrix_sub2, 1);
1004
+ rb_define_method(r_mpfr_matrix, "mul_matrix", r_mpfr_matrix_mul_matrix, 1);
1005
+ rb_define_method(r_mpfr_matrix, "mul_matrix2", r_mpfr_matrix_mul_matrix2, 1);
1006
+ rb_define_method(r_mpfr_matrix, "mul_scalar", r_mpfr_matrix_mul_scalar, 1);
1007
+ rb_define_method(r_mpfr_matrix, "div_scalar", r_mpfr_matrix_div_scalar, 1);
1008
+
1009
+ rb_define_alias(r_mpfr_matrix, "+", "add");
1010
+ rb_define_alias(r_mpfr_matrix, "-", "sub");
1011
+ rb_define_alias(r_mpfr_matrix, "*", "mul_matrix");
1012
+
1013
+ rb_define_method(r_mpfr_matrix, "vector_norm", r_mpfr_matrix_vector_norm, 0);
1014
+ rb_define_method(r_mpfr_matrix, "max_norm", r_mpfr_matrix_max_norm, 0);
1015
+
1016
+
1017
+ rb_define_method(r_mpfr_square_matrix, "dim", r_mpfr_square_matrix_dim, 0);
1018
+ rb_define_method(r_mpfr_square_matrix, "lu_decomp", r_mpfr_square_matrix_lu_decomp, 0);
1019
+ rb_define_method(r_mpfr_square_matrix, "determinant", r_mpfr_square_matrix_determinant, 0);
1020
+ rb_define_method(r_mpfr_square_matrix, "qr_decomp", r_mpfr_square_matrix_qr_decomp, 0);
1021
+
1022
+ rb_define_singleton_method(r_mpfr_square_matrix, "identity", r_mpfr_square_matrix_identity, 1);
1023
+
1024
+ /* Initialization of MPFR::Vector module */
1025
+ r_mpfr_vector_module = rb_define_module_under(tmp_mpfr_class, "Vector");
1026
+
1027
+ rb_define_method(r_mpfr_vector_module, "[]=", r_mpfr_vector_set_element, 2);
1028
+ rb_define_method(r_mpfr_vector_module, "[]", r_mpfr_vector_element, 1);
1029
+ rb_define_method(r_mpfr_vector_module, "each_element", r_mpfr_vector_each_element, 0);
1030
+ rb_define_method(r_mpfr_vector_module, "each_element_with_index", r_mpfr_vector_each_element_with_index, 0);
1031
+
1032
+ rb_define_alias(r_mpfr_vector_module, "each", "each_element");
1033
+ rb_define_alias(r_mpfr_vector_module, "each_with_index", "each_element_with_index");
1034
+
1035
+ rb_define_method(r_mpfr_vector_module, "dim", r_mpfr_vector_dim, 0);
1036
+ rb_define_method(r_mpfr_vector_module, "normalize", r_mpfr_vector_normalize, 0);
1037
+ rb_define_method(r_mpfr_vector_module, "normalize!", r_mpfr_vector_normalize2, 0);
1038
+ rb_define_method(r_mpfr_vector_module, "set_length", r_mpfr_vector_set_length, 1);
1039
+ rb_define_method(r_mpfr_vector_module, "set_length!", r_mpfr_vector_set_length2, 1);
1040
+
1041
+
1042
+ rb_define_method(r_mpfr_vector_module, "abs", r_mpfr_vector_abs, 0);
1043
+ rb_define_method(r_mpfr_vector_module, "inner_product", r_mpfr_vector_inner_product, 1);
1044
+ rb_define_method(r_mpfr_vector_module, "distance_from", r_mpfr_vector_distance_from, 1);
1045
+ rb_define_method(r_mpfr_vector_module, "midpoint", r_mpfr_vector_midpoint, 1);
1046
+ rb_define_method(r_mpfr_vector_module, "dividing_point", r_mpfr_vector_dividing_point, 2);
1047
+
1048
+ rb_include_module(r_mpfr_col_vector, r_mpfr_vector_module);
1049
+ rb_include_module(r_mpfr_row_vector, r_mpfr_vector_module);
1050
+
1051
+
1052
+ eqq = rb_intern("===");
1053
+
1054
+
1055
+ }
1056
+