srawlins-gmp 0.1.4.2 → 0.1.5
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 +21 -18
- data/ext/gmp.c +17 -216
- data/ext/gmpf.h +11 -309
- data/ext/gmpq.h +8 -482
- data/ext/gmpz.h +5 -818
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -46,16 +46,19 @@ paragraph at http://gmplib.org/#WHAT :
|
|
46
46
|
contributions, meaning users can safely use GMP. To achieve this, we will ask
|
47
47
|
contributors to sign paperwork where they allow us to distribute their work."
|
48
48
|
|
49
|
-
Only GMP 4 or newer is supported.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
Only GMP 4 or newer is supported. The following environments have been tested by me:
|
50
|
+
gmp gem 0.1.4.2 on:
|
51
|
+
+-----------------+---------+-----------+
|
52
|
+
| Platform | Ruby | GMP |
|
53
|
+
+-----------------+---------+-----------+
|
54
|
+
| Cygwin on x86 | 1.8.7 | GMP 4.3.1 |
|
55
|
+
| Mac OS X 10.5.7 | 1.8.6 | GMP 4.3.1 |
|
56
|
+
+-----------------+---------+-----------+
|
55
57
|
|
56
|
-
I have
|
57
|
-
|
58
|
-
|
58
|
+
<b>Note:</b> I have tried with Ruby 1.9.1. No go.
|
59
|
+
|
60
|
+
<b>Note:</b> To get this running on Mac OS X, I compiled GMP 4.3.1 with:
|
61
|
+
./configure ABI=32 --disable-dependency-tracking
|
59
62
|
|
60
63
|
=Authors
|
61
64
|
|
@@ -121,11 +124,11 @@ You can also call them as:
|
|
121
124
|
may have different precisions, which would make
|
122
125
|
them unswapable
|
123
126
|
GMP::Z
|
124
|
-
|
125
|
-
|
127
|
+
.add! in-place addition
|
128
|
+
.sub! in-place subtraction
|
126
129
|
tdiv,fdiv,cdiv truncate, floor and ceil division
|
127
130
|
tmod,fmod,cmod truncate, floor and ceil modulus
|
128
|
-
|
131
|
+
.[],[]= testing and setting bits (as booleans)
|
129
132
|
scan0,scan1 starting at bitnr (1st arg), scan for a 0 or 1
|
130
133
|
(respectively), then return the index of the
|
131
134
|
first instance.
|
@@ -219,19 +222,19 @@ still relevant.
|
|
219
222
|
* ruby 1.9.x
|
220
223
|
* mpz_fits_* and 31 vs. 32 integer variables
|
221
224
|
* all appropriate module and class methods if there are any to add
|
222
|
-
* fix all sign issues
|
225
|
+
* fix all sign issues (don't know what these are)
|
223
226
|
* floats with precision control
|
224
227
|
* random numbers
|
225
|
-
* to_s vs. inspect
|
228
|
+
* to_s vs. inspect
|
226
229
|
* to_s_hex(), or more-ruby-ish, to_s(:hex)
|
227
230
|
* check if mpz_addmul_ui would optimize some statements
|
228
231
|
* some system that allow using denref and numref as normal ruby objects
|
229
|
-
* should we allocate global temporary variables like Perl GMP
|
232
|
+
* should we allocate global temporary variables like Perl GMP does?
|
230
233
|
* takeover code that replaces all Bignums with GMP::Z
|
231
234
|
* better bignum parser
|
232
235
|
* zero-copy method for strings generation
|
233
|
-
* what should be ancestors of GMP::* classes
|
234
|
-
* division and modulo
|
236
|
+
* what should be ancestors of GMP::* classes?
|
237
|
+
* division and modulo (que?)
|
235
238
|
* put rb_raise into nice macros
|
236
239
|
* benchmarks against Python GMP and Perl GMP
|
237
240
|
* dup methods
|
@@ -242,7 +245,7 @@ still relevant.
|
|
242
245
|
* check asm output, especially local memory efficiency
|
243
246
|
* it might be better to use `register' for some local variables
|
244
247
|
* powm with negative exponents
|
245
|
-
* check if different sorting of operatations gives better cache usage
|
248
|
+
* check if different sorting of operatations gives better cache usage
|
246
249
|
* GMP::* op RubyFloat and RubyFloat op GMP::*
|
247
250
|
* sort checks
|
248
251
|
* check all new GMP4 operations
|
data/ext/gmp.c
CHANGED
@@ -4,85 +4,15 @@
|
|
4
4
|
* This file contains everything you would expect from a C extension.
|
5
5
|
*/
|
6
6
|
|
7
|
-
#
|
8
|
-
#include <stdio.h>
|
9
|
-
|
10
|
-
#include <ruby.h>
|
11
|
-
#include <gmp.h>
|
12
|
-
|
13
|
-
#ifdef MPFR
|
14
|
-
|
15
|
-
#ifdef HAVE_MPFR_H
|
16
|
-
#include <mpfr.h>
|
17
|
-
#endif /* HAVE_MPFR_H */
|
18
|
-
|
19
|
-
#ifdef HAVE_MPF2MPFR_H
|
20
|
-
#include <mpf2mpfr.h>
|
21
|
-
#endif /* HAVE_MPF2MPFR_H */
|
22
|
-
|
23
|
-
#endif /* MPFR */
|
24
|
-
|
25
|
-
#include <stdlib.h>
|
26
|
-
|
27
|
-
/*
|
28
|
-
MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
|
29
|
-
of single-element arrays mp*_t
|
30
|
-
|
31
|
-
MP_FLOAT is defined here, as it's commented out in gmp.h
|
32
|
-
*/
|
33
|
-
#if defined(MPFR) && defined(HAVE_MPFR_H)
|
34
|
-
typedef __mpfr_struct MP_FLOAT;
|
35
|
-
#else
|
36
|
-
typedef __mpf_struct MP_FLOAT;
|
37
|
-
#endif /* HAVE_MPF2MPFR_H */
|
38
|
-
|
39
|
-
#define mpz_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_INT, c_var); }
|
40
|
-
#define mpq_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_RAT, c_var); }
|
41
|
-
#define mpf_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_FLOAT, c_var); }
|
42
|
-
#define mpf_get_struct_prec(ruby_var,c_var,prec) { mpf_get_struct(ruby_var,c_var); prec = mpf_get_prec(c_var); }
|
43
|
-
#define mpz_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Z, MP_INT, 0, r_gmpz_free, c_var); }
|
44
|
-
#define mpq_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Q, MP_RAT, 0, r_gmpq_free, c_var); }
|
45
|
-
#define mpf_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_F, MP_FLOAT, 0, r_gmpf_free, c_var); }
|
46
|
-
#define mpz_make_struct_init(ruby_var,c_var) { mpz_make_struct(ruby_var,c_var); mpz_init (c_var); }
|
47
|
-
#define mpq_make_struct_init(ruby_var,c_var) { mpq_make_struct(ruby_var,c_var); mpq_init (c_var); }
|
48
|
-
#define mpf_make_struct_init(ruby_var,c_var,prec) { mpf_make_struct(ruby_var,c_var); mpf_init2 (c_var,prec); }
|
49
|
-
#define BIGNUM_P(value) (TYPE(value) == T_BIGNUM)
|
50
|
-
#define FLOAT_P(value) (TYPE(value) == T_FLOAT)
|
51
|
-
#define STRING_P(value) (TYPE(value) == T_STRING)
|
52
|
-
#define GMPZ_P(value) (rb_obj_is_instance_of(value, cGMP_Z) == Qtrue)
|
53
|
-
#define GMPQ_P(value) (rb_obj_is_instance_of(value, cGMP_Q) == Qtrue)
|
54
|
-
#define GMPF_P(value) (rb_obj_is_instance_of(value, cGMP_F) == Qtrue)
|
55
|
-
#define mpz_set_bignum(var_mpz,var_bignum) \
|
56
|
-
mpz_set_str (var_mpz, STR2CSTR (rb_funcall (var_bignum, rb_intern ("to_s"), 0)), 0);
|
57
|
-
#define mpz_temp_alloc(var) { var=malloc(sizeof(MP_INT)); }
|
58
|
-
#define mpz_temp_init(var) { mpz_temp_alloc(var); mpz_init(var); }
|
59
|
-
#define mpz_temp_from_bignum(var,var_bignum) \
|
60
|
-
{ mpz_temp_alloc(var); mpz_init_set_str (var, STR2CSTR (rb_funcall (var_bignum, rb_intern ("to_s"), 0)), 0); }
|
61
|
-
#define mpz_temp_free(var) { mpz_clear(var); free(var); }
|
62
|
-
#define mpf_temp_alloc(var) { var=malloc(sizeof(MP_FLOAT)); }
|
63
|
-
#define mpf_temp_init(var,prec) { mpf_temp_alloc(var); mpf_init2(var,prec); }
|
64
|
-
#define mpf_temp_free(var) { mpf_clear(var); free(var); }
|
65
|
-
#define FLT2DBL(var) (RFLOAT(var)->value)
|
66
|
-
#define prec_max(prec,var) {if(mpf_get_prec(var) > prec) prec = mpf_get_prec(var); }
|
67
|
-
|
68
|
-
#define EXPECTED_ZQFXBD "Expected GMP::Z, GMP::Q, GMP::F, FixNum, BigNum or Float"
|
69
|
-
#define EXPECTED_ZQFXB "Expected GMP::Z, GMP::Q, GMP::F, FixNum or BigNum"
|
70
|
-
#define EXPECTED_ZXB "Expected GMP::Z, FixNum or BigNum"
|
71
|
-
#define EXPECTED_ZX "Expected GMP::Z or FixNum"
|
72
|
-
#define EXPECTED_X "Expected FixNum"
|
73
|
-
#define typeerror(expected) rb_raise(rb_eTypeError, EXPECTED_##expected)
|
74
|
-
#define typeerror_as(expected, argname) rb_raise(rb_eTypeError, EXPECTED_##expected " as " argname)
|
75
|
-
|
76
|
-
//should change exception type
|
77
|
-
#define not_yet rb_raise(rb_eTypeError,"Not implemented yet")
|
7
|
+
#include <ruby_gmp.h>
|
78
8
|
|
79
9
|
VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F;
|
80
10
|
|
81
|
-
|
82
|
-
|
83
|
-
|
11
|
+
void r_gmpz_free(void *ptr) { mpz_clear (ptr); free (ptr); }
|
12
|
+
void r_gmpq_free(void *ptr) { mpq_clear (ptr); free (ptr); }
|
13
|
+
void r_gmpf_free(void *ptr) { mpf_clear (ptr); free (ptr); }
|
84
14
|
|
85
|
-
|
15
|
+
VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass)
|
86
16
|
{
|
87
17
|
MP_INT *res_val;
|
88
18
|
VALUE res;
|
@@ -133,24 +63,6 @@ static VALUE r_gmpfsg_new(int argc, VALUE *argv, VALUE klass)
|
|
133
63
|
return res;
|
134
64
|
}
|
135
65
|
|
136
|
-
static void mpz_set_value(MP_INT *target, VALUE source)
|
137
|
-
{
|
138
|
-
MP_INT *source_val;
|
139
|
-
|
140
|
-
if (GMPZ_P(source)) {
|
141
|
-
mpz_get_struct(source, source_val);
|
142
|
-
mpz_set (target, source_val);
|
143
|
-
} else if (FIXNUM_P(source)) {
|
144
|
-
mpz_set_si (target, NUM2INT(source));
|
145
|
-
} else if (STRING_P(source)) {
|
146
|
-
mpz_set_str (target, STR2CSTR(source), 0);
|
147
|
-
} else if (BIGNUM_P(source)) {
|
148
|
-
mpz_set_bignum(target, source);
|
149
|
-
} else {
|
150
|
-
rb_raise (rb_eTypeError, "Don't know how to convert %s into GMP_Z", rb_class2name(rb_class_of(source)));
|
151
|
-
}
|
152
|
-
}
|
153
|
-
|
154
66
|
static VALUE r_gmpz_initialize(int argc, VALUE *argv, VALUE self)
|
155
67
|
{
|
156
68
|
MP_INT *self_val;
|
@@ -206,16 +118,16 @@ static VALUE r_gmpq_initialize(int argc, VALUE *argv, VALUE self)
|
|
206
118
|
}
|
207
119
|
|
208
120
|
/* don't pass GMP::F here, it should be handled separately */
|
209
|
-
|
121
|
+
void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
|
210
122
|
{
|
211
123
|
MP_RAT *arg_val_q;
|
212
124
|
MP_INT *arg_val_z;
|
213
125
|
|
214
126
|
if (GMPQ_P(arg)) {
|
215
|
-
mpq_get_struct
|
127
|
+
mpq_get_struct(arg, arg_val_q);
|
216
128
|
mpf_set_q(self_val, arg_val_q);
|
217
129
|
} else if (GMPZ_P(arg)) {
|
218
|
-
mpz_get_struct
|
130
|
+
mpz_get_struct(arg, arg_val_z);
|
219
131
|
mpf_set_z(self_val, arg_val_z);
|
220
132
|
} else if (FLOAT_P(arg)) {
|
221
133
|
mpf_set_d(self_val, FLT2DBL(arg));
|
@@ -223,7 +135,7 @@ static void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
|
|
223
135
|
mpf_set_si(self_val, FIX2INT(arg));
|
224
136
|
} else if (STRING_P(arg)) {
|
225
137
|
if (mpf_set_str(self_val, STR2CSTR(arg), 10) == -1) {
|
226
|
-
rb_raise
|
138
|
+
rb_raise(rb_eRuntimeError, "Badly formatted string");
|
227
139
|
}
|
228
140
|
} else if (BIGNUM_P(arg)) {
|
229
141
|
#if 1 /* GMP3 code */
|
@@ -232,7 +144,7 @@ static void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
|
|
232
144
|
mpz_temp_free(arg_val_z);
|
233
145
|
#endif
|
234
146
|
} else {
|
235
|
-
rb_raise
|
147
|
+
rb_raise(rb_eTypeError, "Don't know how to convert %s into GMP::F", rb_class2name(rb_class_of(arg)));
|
236
148
|
}
|
237
149
|
}
|
238
150
|
|
@@ -334,19 +246,13 @@ static VALUE r_gmpf_coerce(VALUE self, VALUE arg)
|
|
334
246
|
return rb_assoc_new(r_gmpfsg_new(1, &arg, cGMP_F), self);
|
335
247
|
}
|
336
248
|
|
337
|
-
|
338
|
-
{
|
339
|
-
(void)module;
|
340
|
-
return r_gmpzsg_new(argc, argv, cGMP_Z);
|
341
|
-
}
|
342
|
-
|
343
|
-
static VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module)
|
249
|
+
VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module)
|
344
250
|
{
|
345
251
|
(void)module;
|
346
252
|
return r_gmpqsg_new(argc, argv, cGMP_Q);
|
347
253
|
}
|
348
254
|
|
349
|
-
|
255
|
+
VALUE r_gmpmod_f(int argc, VALUE *argv, VALUE module)
|
350
256
|
{
|
351
257
|
(void)module;
|
352
258
|
return r_gmpfsg_new(argc, argv, cGMP_F);
|
@@ -374,7 +280,7 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
|
|
374
280
|
|
375
281
|
#include "gmpf.h"
|
376
282
|
#include "gmpq.h"
|
377
|
-
#include "gmpz.h"
|
283
|
+
/* #include "gmpz.h" */
|
378
284
|
#include "takeover.h"
|
379
285
|
|
380
286
|
#define REGISTER_TAKEOVER(fname, ruby_fname, old_fname) \
|
@@ -383,144 +289,39 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
|
|
383
289
|
rb_define_alias(rb_cBignum, old_fname, ruby_fname); \
|
384
290
|
rb_define_method(rb_cBignum, ruby_fname, takeover_bignum_##fname, -1);
|
385
291
|
|
386
|
-
void Init_gmp
|
292
|
+
void Init_gmp() {
|
387
293
|
mGMP = rb_define_module("GMP");
|
388
294
|
rb_define_module_function(mGMP, "Z", r_gmpmod_z, -1);
|
389
295
|
rb_define_module_function(mGMP, "Q", r_gmpmod_q, -1);
|
390
296
|
rb_define_module_function(mGMP, "F", r_gmpmod_f, -1);
|
391
297
|
|
392
298
|
cGMP_Z = rb_define_class_under(mGMP, "Z", rb_cInteger);
|
299
|
+
init_gmpz();
|
393
300
|
rb_define_singleton_method(cGMP_Z, "new", r_gmpzsg_new, -1);
|
394
|
-
rb_define_singleton_method(cGMP_Z, "fib", r_gmpzsg_fib, 1);
|
395
|
-
rb_define_singleton_method(cGMP_Z, "fac", r_gmpzsg_fac, 1);
|
396
301
|
rb_define_singleton_method(cGMP_Z, "pow", r_gmpzsg_pow, 2);
|
397
302
|
rb_define_method(cGMP_Z, "initialize", r_gmpz_initialize, -1);
|
398
303
|
rb_define_method(cGMP_Z, "to_s", r_gmpz_to_s, 0);
|
399
304
|
rb_define_method(cGMP_Z, "coerce", r_gmpz_coerce, 1);
|
400
|
-
rb_define_method(cGMP_Z, "+", r_gmpz_add, 1);
|
401
|
-
rb_define_method(cGMP_Z, "add!", r_gmpz_add_self, 1);
|
402
|
-
rb_define_method(cGMP_Z, "-", r_gmpz_sub, 1);
|
403
|
-
rb_define_method(cGMP_Z, "sub!", r_gmpz_sub_self, 1);
|
404
|
-
rb_define_method(cGMP_Z, "*", r_gmpz_mul, 1);
|
405
|
-
rb_define_method(cGMP_Z, "/", r_gmpz_div, 1);
|
406
|
-
rb_define_method(cGMP_Z, "tdiv", r_gmpz_tdiv, 1);
|
407
|
-
rb_define_method(cGMP_Z, "tmod", r_gmpz_tmod, 1);
|
408
|
-
rb_define_method(cGMP_Z, "fdiv", r_gmpz_fdiv, 1);
|
409
|
-
rb_define_method(cGMP_Z, "fmod", r_gmpz_fmod, 1);
|
410
|
-
rb_define_method(cGMP_Z, "cdiv", r_gmpz_cdiv, 1);
|
411
|
-
rb_define_method(cGMP_Z, "cmod", r_gmpz_cmod, 1);
|
412
|
-
rb_define_method(cGMP_Z, "-@", r_gmpz_neg, 0);
|
413
|
-
rb_define_method(cGMP_Z, "neg", r_gmpz_neg, 0);
|
414
|
-
rb_define_method(cGMP_Z, "neg!", r_gmpz_neg_self, 0);
|
415
|
-
rb_define_method(cGMP_Z, "abs", r_gmpz_abs, 0);
|
416
|
-
rb_define_method(cGMP_Z, "abs!", r_gmpz_abs_self, 0);
|
417
|
-
rb_define_method(cGMP_Z, "com", r_gmpz_com, 0);
|
418
|
-
rb_define_method(cGMP_Z, "com!", r_gmpz_com_self, 0);
|
419
|
-
rb_define_method(cGMP_Z, "&", r_gmpz_and, 1);
|
420
|
-
rb_define_method(cGMP_Z, "|", r_gmpz_or, 1);
|
421
|
-
rb_define_method(cGMP_Z, "^", r_gmpz_xor, 1);
|
422
|
-
rb_define_method(cGMP_Z, "[]=", r_gmpz_setbit, 2);
|
423
|
-
rb_define_method(cGMP_Z, "[]", r_gmpz_getbit, 1);
|
424
|
-
rb_define_method(cGMP_Z, "scan0", r_gmpz_scan0, 1);
|
425
|
-
rb_define_method(cGMP_Z, "scan1", r_gmpz_scan1, 1);
|
426
|
-
rb_define_method(cGMP_Z, "**", r_gmpz_pow, 1);
|
427
|
-
rb_define_method(cGMP_Z, "powmod", r_gmpz_powm, 2);
|
428
|
-
rb_define_method(cGMP_Z, "even?", r_gmpz_is_even, 0);
|
429
|
-
rb_define_method(cGMP_Z, "odd?", r_gmpz_is_odd, 0);
|
430
|
-
rb_define_method(cGMP_Z, "sgn", r_gmpz_sgn, 0);
|
431
|
-
rb_define_method(cGMP_Z, "<=>", r_gmpz_cmp, 1);
|
432
|
-
rb_define_method(cGMP_Z, ">", r_gmpz_cmp_gt, 1);
|
433
|
-
rb_define_method(cGMP_Z, ">=", r_gmpz_cmp_ge, 1);
|
434
|
-
rb_define_method(cGMP_Z, "<", r_gmpz_cmp_lt, 1);
|
435
|
-
rb_define_method(cGMP_Z, "<=", r_gmpz_cmp_le, 1);
|
436
|
-
rb_define_method(cGMP_Z, "==", r_gmpz_eq, 1);
|
437
|
-
rb_define_method(cGMP_Z, ">>", r_gmpz_fshr, 1);
|
438
|
-
rb_define_method(cGMP_Z, "<<", r_gmpz_shl, 1);
|
439
|
-
rb_define_method(cGMP_Z, "tshr", r_gmpz_tshr, 1);
|
440
|
-
rb_define_method(cGMP_Z, "lastbits_sgn", r_gmpz_tshrm, 1);
|
441
|
-
rb_define_method(cGMP_Z, "lastbits_pos", r_gmpz_fshrm, 1);
|
442
|
-
rb_define_method(cGMP_Z, "square?", r_gmpz_is_square, 0);
|
443
|
-
rb_define_method(cGMP_Z, "power?", r_gmpz_is_power, 0);
|
444
|
-
rb_define_method(cGMP_Z, "swap", r_gmpz_swap, 1);
|
445
|
-
rb_define_method(cGMP_Z, "sqrt", r_gmpz_sqrt, 0);
|
446
|
-
rb_define_method(cGMP_Z, "sqrt!", r_gmpz_sqrt_self, 0);
|
447
|
-
rb_define_method(cGMP_Z, "sqrtrem", r_gmpz_sqrtrem, 0);
|
448
|
-
rb_define_method(cGMP_Z, "jacobi", r_gmpz_jacobi, 0);
|
449
|
-
rb_define_method(cGMP_Z, "legendre", r_gmpz_legendre, 0);
|
450
|
-
rb_define_method(cGMP_Z, "probab_prime?", r_gmpz_is_probab_prime, -1);
|
451
|
-
rb_define_method(cGMP_Z, "nextprime", r_gmpz_nextprime, 0);
|
452
|
-
rb_define_method(cGMP_Z, "nextprime!", r_gmpz_nextprime_self, 0);
|
453
|
-
rb_define_method(cGMP_Z, "popcount", r_gmpz_popcount, 0);
|
454
|
-
rb_define_method(cGMP_Z, "to_d", r_gmpz_to_d, 0);
|
455
|
-
rb_define_method(cGMP_Z, "root", r_gmpz_root, 1);
|
456
|
-
rb_define_method(cGMP_Z, "remove", r_gmpz_remove, 1);
|
457
|
-
rb_define_method(cGMP_Z, "to_i", r_gmpz_to_i, 0);
|
458
|
-
rb_define_method(cGMP_Z, "cmpabs", r_gmpz_cmpabs, 1);
|
459
305
|
/*
|
460
306
|
rb_define_method(cGMP_Z, "gcd", r_gmpz_gcd, 1);
|
461
307
|
rb_define_method(cGMP_Z, "lcm", r_gmpz_lcm, 1);
|
462
308
|
*/
|
463
309
|
cGMP_Q = rb_define_class_under (mGMP, "Q", rb_cNumeric);
|
310
|
+
init_gmpq();
|
464
311
|
rb_define_singleton_method(cGMP_Q, "new", r_gmpqsg_new, -1);
|
465
312
|
rb_define_method(cGMP_Q, "initialize", r_gmpq_initialize, -1);
|
466
313
|
rb_define_method(cGMP_Q, "to_s", r_gmpq_to_s, 0);
|
467
314
|
rb_define_method(cGMP_Q, "coerce", r_gmpq_coerce, 1);
|
468
315
|
rb_define_method(cGMP_Q, "num", r_gmpq_num, 0);
|
469
316
|
rb_define_method(cGMP_Q, "den", r_gmpq_den, 0);
|
470
|
-
rb_define_method(cGMP_Q, "+", r_gmpq_add, 1);
|
471
|
-
rb_define_method(cGMP_Q, "-", r_gmpq_sub, 1);
|
472
|
-
rb_define_method(cGMP_Q, "*", r_gmpq_mul, 1);
|
473
|
-
rb_define_method(cGMP_Q, "/", r_gmpq_div, 1);
|
474
|
-
rb_define_method(cGMP_Q, "inv", r_gmpq_inv, 0);
|
475
|
-
rb_define_method(cGMP_Q, "inv!", r_gmpq_inv_self, 0);
|
476
|
-
rb_define_method(cGMP_Q, "-@", r_gmpq_neg, 0);
|
477
|
-
rb_define_method(cGMP_Q, "neg!", r_gmpq_neg_self, 0);
|
478
|
-
rb_define_method(cGMP_Q, "abs", r_gmpq_abs, 0);
|
479
|
-
rb_define_method(cGMP_Q, "abs!", r_gmpq_abs_self, 0);
|
480
|
-
rb_define_method(cGMP_Q, "sgn", r_gmpq_sgn, 0);
|
481
|
-
rb_define_method(cGMP_Q, "<=>", r_gmpq_cmp, 1);
|
482
|
-
rb_define_method(cGMP_Q, ">", r_gmpq_cmp_gt, 1);
|
483
|
-
rb_define_method(cGMP_Q, ">=", r_gmpq_cmp_ge, 1);
|
484
|
-
rb_define_method(cGMP_Q, "<", r_gmpq_cmp_lt, 1);
|
485
|
-
rb_define_method(cGMP_Q, "<=", r_gmpq_cmp_le, 1);
|
486
|
-
rb_define_method(cGMP_Q, "==", r_gmpq_eq, 1);
|
487
|
-
rb_define_method(cGMP_Q, "swap", r_gmpq_swap, 1);
|
488
|
-
rb_define_method(cGMP_Q, "floor", r_gmpq_floor, 0);
|
489
|
-
rb_define_method(cGMP_Q, "ceil", r_gmpq_ceil, 0);
|
490
|
-
rb_define_method(cGMP_Q, "trunc", r_gmpq_trunc, 0);
|
491
|
-
rb_define_method(cGMP_Q, "to_d", r_gmpq_to_d, 0);
|
492
|
-
rb_define_method(cGMP_Q, "cmpabs", r_gmpq_cmpabs, 1);
|
493
317
|
|
494
318
|
cGMP_F = rb_define_class_under (mGMP, "F", rb_cNumeric);
|
319
|
+
init_gmpf();
|
495
320
|
rb_define_singleton_method(cGMP_F, "new", r_gmpfsg_new, -1);
|
496
321
|
rb_define_singleton_method(cGMP_F, "default_prec", r_gmpfsg_get_default_prec, 0);
|
497
322
|
rb_define_singleton_method(cGMP_F, "default_prec=", r_gmpfsg_set_default_prec, 1);
|
498
323
|
rb_define_method(cGMP_F, "initialize", r_gmpf_initialize, -1);
|
499
|
-
rb_define_method(cGMP_F, "to_s", r_gmpf_to_s, 0);
|
500
324
|
rb_define_method(cGMP_F, "coerce", r_gmpf_coerce, 1); // new method - testing
|
501
|
-
rb_define_method(cGMP_F, "+", r_gmpf_add, 1);
|
502
|
-
rb_define_method(cGMP_F, "-", r_gmpf_sub, 1);
|
503
|
-
rb_define_method(cGMP_F, "*", r_gmpf_mul, 1);
|
504
|
-
rb_define_method(cGMP_F, "/", r_gmpf_div, 1);
|
505
|
-
rb_define_method(cGMP_F, "-@", r_gmpf_neg, 0);
|
506
|
-
rb_define_method(cGMP_F, "neg!", r_gmpf_neg_self, 0);
|
507
|
-
rb_define_method(cGMP_F, "abs", r_gmpf_abs, 0);
|
508
|
-
rb_define_method(cGMP_F, "abs!", r_gmpf_abs_self, 0);
|
509
|
-
rb_define_method(cGMP_F, "sgn", r_gmpf_sgn, 0);
|
510
|
-
rb_define_method(cGMP_F, "<=>", r_gmpf_cmp, 1);
|
511
|
-
rb_define_method(cGMP_F, ">", r_gmpf_cmp_gt, 1);
|
512
|
-
rb_define_method(cGMP_F, ">=", r_gmpf_cmp_ge, 1);
|
513
|
-
rb_define_method(cGMP_F, "<", r_gmpf_cmp_lt, 1);
|
514
|
-
rb_define_method(cGMP_F, "<=", r_gmpf_cmp_le, 1);
|
515
|
-
rb_define_method(cGMP_F, "==", r_gmpf_eq, 1);
|
516
|
-
rb_define_method(cGMP_F, "floor", r_gmpf_floor, 0);
|
517
|
-
rb_define_method(cGMP_F, "floor!", r_gmpf_floor_self, 0);
|
518
|
-
rb_define_method(cGMP_F, "ceil", r_gmpf_ceil, 0);
|
519
|
-
rb_define_method(cGMP_F, "ceil!", r_gmpf_ceil_self, 0);
|
520
|
-
rb_define_method(cGMP_F, "trunc", r_gmpf_trunc, 0);
|
521
|
-
rb_define_method(cGMP_F, "trunc!", r_gmpf_trunc_self, 0);
|
522
|
-
rb_define_method(cGMP_F, "to_d", r_gmpf_to_d, 0);
|
523
|
-
rb_define_method(cGMP_F, "prec", r_gmpf_get_prec, 0);
|
524
325
|
|
525
326
|
/* rb_define_method(cGMP_F, "cmpabs", r_gmpf_cmpabs, 1);*/
|
526
327
|
|