srawlins-gmp 0.1.4.2 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|