gmp 0.5.3-x86-mingw32 → 0.5.23-x86-mingw32
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/CHANGELOG +19 -0
- data/FEATURES.html +393 -0
- data/README.rdoc +64 -32
- data/ext/gmp.c +5 -55
- data/ext/gmp.so +0 -0
- data/ext/gmpf.c +300 -179
- data/ext/gmpq.c +81 -111
- data/ext/gmprandstate.c +30 -0
- data/ext/gmpz.c +543 -424
- data/ext/gmpz.h +0 -8
- data/ext/ruby_gmp.h +14 -20
- data/manual.pdf +0 -0
- data/manual.tex +56 -11
- data/test/gmp_tgcd.rb +126 -0
- data/test/mpfr_tconst_euler.rb +36 -0
- data/test/tc_mpfr_functions.rb +48 -17
- data/test/tc_q.rb +80 -0
- data/test/tc_q_basic.rb +2 -2
- data/test/tc_z.rb +46 -16
- data/test/tc_z_submul.rb +94 -0
- data/test/tc_z_to_dis.rb +69 -0
- data/test/unit_tests.rb +8 -5
- metadata +10 -9
- data/benchmark/gexpr +0 -0
- data/test/tc_z_to_d_to_i.rb +0 -24
- data/test/test-12.rb +0 -14
- data/test/test-19.rb +0 -13
data/ext/gmpq.c
CHANGED
@@ -7,25 +7,9 @@
|
|
7
7
|
*
|
8
8
|
* GMP Multiple Precision Rational Number.
|
9
9
|
*
|
10
|
-
* Instances of this class can store variables of the type mpq_t. This class
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
* The following list is just a simple checklist for me, really. A better
|
15
|
-
* reference should be found in the rdocs.
|
16
|
-
*
|
17
|
-
* Ruby method C Extension function GMP function
|
18
|
-
* to_d r_gmpq_to_d mpq_get_d
|
19
|
-
* to_s r_gmpq_to_s ?
|
20
|
-
* add r_gmpq_add mpq_add
|
21
|
-
* sub r_gmpq_sub mpq_sub
|
22
|
-
* mul r_gmpq_mul mpq_mul
|
23
|
-
* div r_gmpq_div mpq_div
|
24
|
-
* -@ r_gmpq_neg mpq_neg
|
25
|
-
* neg r_gmpq_neg mpq_neg
|
26
|
-
* neg! r_gmpq_neg_self mpq_neg
|
27
|
-
* abs r_gmpq_abs mpq_abs
|
28
|
-
* abs! r_gmpq_abs_self mpq_abs
|
10
|
+
* Instances of this class can store variables of the type mpq_t. This class also
|
11
|
+
* contains many methods that act as the functions for mpq_t variables, as well as a few
|
12
|
+
* methods that attempt to make this library more Ruby-ish.
|
29
13
|
*/
|
30
14
|
|
31
15
|
/**********************************************************************
|
@@ -53,6 +37,30 @@ static VALUE r_gmpq_##fname(VALUE self) \
|
|
53
37
|
return res; \
|
54
38
|
}
|
55
39
|
|
40
|
+
/*
|
41
|
+
* DEFUN_RAT2RAT defines two functions. The first takes a GMP::Q as self, calls mpq_fname
|
42
|
+
* on the contained mpq_t, whose arguments are exactly (0) the return argument and (1)
|
43
|
+
* self. The second is the same destructive method.
|
44
|
+
*/
|
45
|
+
#define DEFUN_RAT2RAT(fname,mpq_fname) \
|
46
|
+
static VALUE r_gmpq_##fname(VALUE self) \
|
47
|
+
{ \
|
48
|
+
MP_RAT *self_val, *res_val; \
|
49
|
+
VALUE res; \
|
50
|
+
mpq_get_struct(self, self_val); \
|
51
|
+
mpq_make_struct_init(res, res_val); \
|
52
|
+
mpq_fname(res_val, self_val); \
|
53
|
+
return res; \
|
54
|
+
} \
|
55
|
+
\
|
56
|
+
static VALUE r_gmpq_##fname##_self(VALUE self) \
|
57
|
+
{ \
|
58
|
+
MP_RAT *self_val; \
|
59
|
+
mpq_get_struct(self, self_val); \
|
60
|
+
mpq_fname(self_val, self_val); \
|
61
|
+
return self; \
|
62
|
+
}
|
63
|
+
|
56
64
|
|
57
65
|
/**********************************************************************
|
58
66
|
* Initializing Rationals *
|
@@ -62,7 +70,7 @@ static VALUE r_gmpq_##fname(VALUE self) \
|
|
62
70
|
* call-seq:
|
63
71
|
* GMP::Q.new(arg)
|
64
72
|
*
|
65
|
-
* Creates a new GMP::Q rational, with
|
73
|
+
* Creates a new GMP::Q rational, with _arg_ as its value, converting where
|
66
74
|
* necessary.
|
67
75
|
*/
|
68
76
|
VALUE r_gmpqsg_new(int argc, VALUE *argv, VALUE klass)
|
@@ -86,7 +94,7 @@ VALUE r_gmpqsg_new(int argc, VALUE *argv, VALUE klass)
|
|
86
94
|
* call-seq:
|
87
95
|
* GMP::Q(arg)
|
88
96
|
*
|
89
|
-
* A convenience method for
|
97
|
+
* A convenience method for GMP::Q.new(arg).
|
90
98
|
*/
|
91
99
|
VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module)
|
92
100
|
{
|
@@ -96,9 +104,9 @@ VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module)
|
|
96
104
|
|
97
105
|
/*
|
98
106
|
* call-seq:
|
99
|
-
*
|
107
|
+
* p.swap(q)
|
100
108
|
*
|
101
|
-
* Efficiently swaps the contents of
|
109
|
+
* Efficiently swaps the contents of _p_ with _q_.
|
102
110
|
*/
|
103
111
|
VALUE r_gmpq_swap(VALUE self, VALUE arg)
|
104
112
|
{
|
@@ -122,17 +130,16 @@ VALUE r_gmpq_swap(VALUE self, VALUE arg)
|
|
122
130
|
|
123
131
|
/*
|
124
132
|
* call-seq:
|
125
|
-
*
|
133
|
+
* p.to_d
|
126
134
|
*
|
127
|
-
* Returns
|
135
|
+
* Returns _p_ as an Float if _p_ fits in a Float.
|
128
136
|
*
|
129
|
-
* Otherwise returns the least significant part of
|
130
|
-
* sign as +rational+.
|
137
|
+
* Otherwise returns the least significant part of _p_, with the same sign as _p_.
|
131
138
|
*
|
132
|
-
* If the exponent from the conversion is too big or too small to fit a double
|
133
|
-
*
|
134
|
-
*
|
135
|
-
*
|
139
|
+
* If the exponent from the conversion is too big or too small to fit a double then the
|
140
|
+
* result is system dependent. For too big an infinity is returned when available. For
|
141
|
+
* too small 0.0 is normally returned. Hardware overflow, underflow and denorm traps may
|
142
|
+
* or may not occur.
|
136
143
|
*/
|
137
144
|
VALUE r_gmpq_to_d(VALUE self)
|
138
145
|
{
|
@@ -143,12 +150,10 @@ VALUE r_gmpq_to_d(VALUE self)
|
|
143
150
|
}
|
144
151
|
|
145
152
|
/*
|
146
|
-
* Document-method: to_s
|
147
|
-
*
|
148
153
|
* call-seq:
|
149
|
-
*
|
154
|
+
* p.to_s
|
150
155
|
*
|
151
|
-
* Returns the decimal representation of
|
156
|
+
* Returns the decimal representation of _p_, as a String.
|
152
157
|
*/
|
153
158
|
VALUE r_gmpq_to_s(VALUE self)
|
154
159
|
{
|
@@ -192,9 +197,9 @@ VALUE r_gmpq_to_s(VALUE self)
|
|
192
197
|
|
193
198
|
/*
|
194
199
|
* call-seq:
|
195
|
-
*
|
200
|
+
* p + q
|
196
201
|
*
|
197
|
-
* Adds
|
202
|
+
* Adds _p_ to _q_. _q_ must be an instance of one of:
|
198
203
|
* * GMP::Z
|
199
204
|
* * Fixnum
|
200
205
|
* * GMP::Q
|
@@ -244,9 +249,9 @@ VALUE r_gmpq_add(VALUE self, VALUE arg)
|
|
244
249
|
|
245
250
|
/*
|
246
251
|
* call-seq:
|
247
|
-
*
|
252
|
+
* p - q
|
248
253
|
*
|
249
|
-
* Subtracts
|
254
|
+
* Subtracts _p_ from _q_. _q_ must be an instance of one of:
|
250
255
|
* * GMP::Z
|
251
256
|
* * Fixnum
|
252
257
|
* * GMP::Q
|
@@ -299,9 +304,9 @@ VALUE r_gmpq_sub(VALUE self, VALUE arg)
|
|
299
304
|
|
300
305
|
/*
|
301
306
|
* call-seq:
|
302
|
-
*
|
307
|
+
* p * q
|
303
308
|
*
|
304
|
-
* Multiplies
|
309
|
+
* Multiplies _p_ with _q_. _q_ must be an instance of one of:
|
305
310
|
* * GMP::Z
|
306
311
|
* * Fixnum
|
307
312
|
* * GMP::Q
|
@@ -371,9 +376,9 @@ VALUE r_gmpq_mul(VALUE self, VALUE arg)
|
|
371
376
|
|
372
377
|
/*
|
373
378
|
* call-seq:
|
374
|
-
*
|
379
|
+
* p / q
|
375
380
|
*
|
376
|
-
* Divides
|
381
|
+
* Divides _p_ by _q_. _q_ must be an instance of one of:
|
377
382
|
* * GMP::Z
|
378
383
|
* * Fixnum
|
379
384
|
* * GMP::Q
|
@@ -441,81 +446,41 @@ DEFUN_RAT2INT(ceil,mpz_cdiv_q)
|
|
441
446
|
* Document-method: neg
|
442
447
|
*
|
443
448
|
* call-seq:
|
444
|
-
*
|
445
|
-
*
|
449
|
+
* a.neg
|
450
|
+
* -a
|
446
451
|
*
|
447
|
-
*
|
448
|
-
*
|
449
|
-
* Returns -+rational+.
|
452
|
+
* Returns -_a_.
|
450
453
|
*/
|
451
|
-
VALUE r_gmpq_neg(VALUE self)
|
452
|
-
{
|
453
|
-
MP_RAT *self_val, *res_val;
|
454
|
-
VALUE res;
|
455
|
-
mpq_get_struct(self, self_val);
|
456
|
-
mpq_make_struct_init(res, res_val);
|
457
|
-
mpq_neg (res_val, self_val);
|
458
|
-
return res;
|
459
|
-
}
|
460
|
-
|
461
454
|
/*
|
462
455
|
* Document-method: neg!
|
463
456
|
*
|
464
457
|
* call-seq:
|
465
|
-
*
|
458
|
+
* a.neg!
|
466
459
|
*
|
467
|
-
*
|
468
|
-
*
|
469
|
-
* Sets +rational+ to -+rational+.
|
460
|
+
* Sets _a_ to -_a_.
|
470
461
|
*/
|
471
|
-
|
472
|
-
{
|
473
|
-
MP_RAT *self_val;
|
474
|
-
mpq_get_struct(self, self_val);
|
475
|
-
mpz_neg (mpq_numref(self_val), mpq_numref(self_val));
|
476
|
-
return Qnil;
|
477
|
-
}
|
462
|
+
DEFUN_RAT2RAT(neg, mpq_neg)
|
478
463
|
|
479
464
|
/*
|
480
|
-
*
|
465
|
+
* call-seq:
|
466
|
+
* p.abs
|
481
467
|
*
|
468
|
+
* Returns the absolute value of _p_.
|
469
|
+
*/
|
470
|
+
/*
|
482
471
|
* call-seq:
|
483
|
-
*
|
472
|
+
* p.abs!
|
484
473
|
*
|
485
|
-
*
|
486
|
-
*
|
487
|
-
* Returns the absolute value of +rational+.
|
474
|
+
* Sets _p_ to its absolute value.
|
488
475
|
*/
|
489
|
-
|
490
|
-
{
|
491
|
-
MP_RAT *self_val, *res_val;
|
492
|
-
VALUE res;
|
493
|
-
mpq_get_struct(self, self_val);
|
494
|
-
mpq_make_struct_init(res, res_val);
|
495
|
-
mpz_abs (mpq_numref(res_val), mpq_numref(self_val));
|
496
|
-
mpz_set (mpq_denref(res_val), mpq_denref(self_val));
|
497
|
-
|
498
|
-
return res;
|
499
|
-
}
|
476
|
+
DEFUN_RAT2RAT(abs, mpq_abs)
|
500
477
|
|
501
478
|
/*
|
502
|
-
* Document-method: abs!
|
503
|
-
*
|
504
479
|
* call-seq:
|
505
|
-
*
|
480
|
+
* p.inv
|
506
481
|
*
|
507
|
-
*
|
508
|
-
*
|
509
|
-
* Sets +rational+ to its absolute value.
|
482
|
+
* Returns 1/<i>p</i>.
|
510
483
|
*/
|
511
|
-
VALUE r_gmpq_abs_self(VALUE self)
|
512
|
-
{
|
513
|
-
MP_RAT *self_val;
|
514
|
-
mpq_get_struct(self, self_val);
|
515
|
-
mpz_abs (mpq_numref(self_val), mpq_numref(self_val));
|
516
|
-
return Qnil;
|
517
|
-
}
|
518
|
-
|
519
484
|
VALUE r_gmpq_inv(VALUE self)
|
520
485
|
{
|
521
486
|
MP_RAT *self_val, *res_val;
|
@@ -530,6 +495,12 @@ VALUE r_gmpq_inv(VALUE self)
|
|
530
495
|
return res;
|
531
496
|
}
|
532
497
|
|
498
|
+
/*
|
499
|
+
* call-seq:
|
500
|
+
* p.inv!
|
501
|
+
*
|
502
|
+
* Sets _p_ to 1/<i>p</i>.
|
503
|
+
*/
|
533
504
|
VALUE r_gmpq_inv_self(VALUE self)
|
534
505
|
{
|
535
506
|
MP_RAT *self_val;
|
@@ -704,11 +675,9 @@ static VALUE r_gmpq_cmpabs(VALUE self, VALUE arg)
|
|
704
675
|
|
705
676
|
/*
|
706
677
|
* call-seq:
|
707
|
-
*
|
678
|
+
* p.sgn
|
708
679
|
*
|
709
|
-
*
|
710
|
-
*
|
711
|
-
* Returns +1 if +rational+ > 0, 0 if +rational+ == 0, and -1 if +rational+ < 0.
|
680
|
+
* Returns +1 if _p_ > 0, 0 if _p_ == 0, and -1 if _p_ < 0.
|
712
681
|
*/
|
713
682
|
VALUE r_gmpq_sgn(VALUE self)
|
714
683
|
{
|
@@ -761,16 +730,17 @@ void init_gmpq()
|
|
761
730
|
rb_define_method(cGMP_Q, "to_s", r_gmpq_to_s, 0);
|
762
731
|
|
763
732
|
// Rational Arithmetic
|
764
|
-
rb_define_method(cGMP_Q, "+",
|
765
|
-
rb_define_method(cGMP_Q, "-",
|
766
|
-
rb_define_method(cGMP_Q, "*",
|
767
|
-
rb_define_method(cGMP_Q, "/",
|
768
|
-
rb_define_method(cGMP_Q, "-@",
|
733
|
+
rb_define_method(cGMP_Q, "+", r_gmpq_add, 1);
|
734
|
+
rb_define_method(cGMP_Q, "-", r_gmpq_sub, 1);
|
735
|
+
rb_define_method(cGMP_Q, "*", r_gmpq_mul, 1);
|
736
|
+
rb_define_method(cGMP_Q, "/", r_gmpq_div, 1);
|
737
|
+
rb_define_method(cGMP_Q, "-@", r_gmpq_neg, 0);
|
738
|
+
rb_define_alias( cGMP_Q, "neg", "-@");
|
769
739
|
rb_define_method(cGMP_Q, "neg!", r_gmpq_neg_self, 0);
|
770
|
-
rb_define_method(cGMP_Q, "
|
771
|
-
rb_define_method(cGMP_Q, "inv!", r_gmpq_inv_self, 0);
|
772
|
-
rb_define_method(cGMP_Q, "abs", r_gmpq_abs, 0);
|
740
|
+
rb_define_method(cGMP_Q, "abs", r_gmpq_abs, 0);
|
773
741
|
rb_define_method(cGMP_Q, "abs!", r_gmpq_abs_self, 0);
|
742
|
+
rb_define_method(cGMP_Q, "inv", r_gmpq_inv, 0);
|
743
|
+
rb_define_method(cGMP_Q, "inv!", r_gmpq_inv_self, 0);
|
774
744
|
|
775
745
|
// Comparing Rationals
|
776
746
|
rb_define_method(cGMP_Q, "<=>", r_gmpq_cmp, 1);
|
data/ext/gmprandstate.c
CHANGED
@@ -242,6 +242,35 @@ VALUE r_gmprandstate_urandomm(VALUE self, VALUE arg)
|
|
242
242
|
return res;
|
243
243
|
}
|
244
244
|
|
245
|
+
/*
|
246
|
+
* call-seq:
|
247
|
+
* rand_state.rrandomb(fixnum)
|
248
|
+
*
|
249
|
+
* From the GMP Manual:
|
250
|
+
*
|
251
|
+
* Generate a random integer with long strings of zeros and ones in the binary
|
252
|
+
* representation. Useful for testing functions and algorithms, since this kind
|
253
|
+
* of random numbers have proven to be more likely to trigger corner-case bugs.
|
254
|
+
* The random number will be in the range 0 to 2^n-1, inclusive.
|
255
|
+
*/
|
256
|
+
VALUE r_gmprandstate_rrandomb(VALUE self, VALUE arg)
|
257
|
+
{
|
258
|
+
MP_RANDSTATE *self_val;
|
259
|
+
MP_INT *res_val;
|
260
|
+
VALUE res;
|
261
|
+
|
262
|
+
mprandstate_get_struct(self,self_val);
|
263
|
+
|
264
|
+
if (FIXNUM_P(arg)) {
|
265
|
+
mpz_make_struct_init(res, res_val);
|
266
|
+
mpz_rrandomb(res_val, self_val, FIX2INT(arg));
|
267
|
+
} else {
|
268
|
+
typeerror(X);
|
269
|
+
}
|
270
|
+
|
271
|
+
return res;
|
272
|
+
}
|
273
|
+
|
245
274
|
|
246
275
|
#ifdef MPFR
|
247
276
|
/**********************************************************************
|
@@ -307,6 +336,7 @@ void init_gmprandstate()
|
|
307
336
|
// Integer Random Numbers
|
308
337
|
rb_define_method(cGMP_RandState, "urandomb", r_gmprandstate_urandomb, 1);
|
309
338
|
rb_define_method(cGMP_RandState, "urandomm", r_gmprandstate_urandomm, 1);
|
339
|
+
rb_define_method(cGMP_RandState, "rrandomb", r_gmprandstate_rrandomb, 1);
|
310
340
|
|
311
341
|
#ifdef MPFR
|
312
342
|
// Float Random Numbers
|
data/ext/gmpz.c
CHANGED
@@ -10,85 +10,6 @@
|
|
10
10
|
* Instances of this class can store variables of the type mpz_t. This class
|
11
11
|
* also contains many methods that act as the functions for mpz_t variables,
|
12
12
|
* as well as a few methods that attempt to make this library more Ruby-ish.
|
13
|
-
*
|
14
|
-
* The following list is just a simple checklist for me, really. A better
|
15
|
-
* reference should be found in the rdocs.
|
16
|
-
*
|
17
|
-
* Ruby method C Extension function GMP function
|
18
|
-
* to_d r_gmpz_to_d mpz_get_d
|
19
|
-
* to_i r_gmpz_to_i mpz_get_i
|
20
|
-
* to_s r_gmpz_to_s mpz_get_s
|
21
|
-
* + r_gmpz_add mpz_add
|
22
|
-
* \------------------------ mpz_add_ui
|
23
|
-
* add! r_gmpz_add_self mpz_add
|
24
|
-
* \----------------------------- mpz_add_ui
|
25
|
-
* - r_gmpz_sub mpz_sub
|
26
|
-
* \------------------------ mpz_sub_ui
|
27
|
-
* sub! r_gmpz_sub_self mpz_sub
|
28
|
-
* \----------------------------- mpz_sub_ui
|
29
|
-
* * r_gmpz_mul mpz_mul
|
30
|
-
* \------------------------ mpz_mul_si
|
31
|
-
* addmul! r_gmpz_addmul_self mpz_addmul
|
32
|
-
* \-------------------------------- mpz_addmul_ui
|
33
|
-
* / r_gmpz_div ...
|
34
|
-
* tdiv r_gmpz_tdiv mpz_tdiv_q
|
35
|
-
* tmod r_gmpz_tmod mpz_tdiv_r
|
36
|
-
* fdiv r_gmpz_fdiv mpz_fdiv_q
|
37
|
-
* fmod r_gmpz_fmod mpz_fdiv_r
|
38
|
-
* cdiv r_gmpz_cdiv mpz_cdiv_q
|
39
|
-
* cmod r_gmpz_cmod mpz_cdiv_r
|
40
|
-
* % r_gmpz_mod mpz_mod
|
41
|
-
* \------------------------ mpz_mod_ui
|
42
|
-
* -@ r_gmpz_neg mpz_neg
|
43
|
-
* neg r_gmpz_neg mpz_neg
|
44
|
-
* neg! r_gmpz_neg_self mpz_neg
|
45
|
-
* abs r_gmpz_abs mpz_abs
|
46
|
-
* abs! r_gmpz_abs_self mpz_abs
|
47
|
-
* ** r_gmpz_pow mpz_pow_ui
|
48
|
-
* powmod r_gmpz_powm mpz_powm
|
49
|
-
* root r_gmpz_root mpz_root
|
50
|
-
* sqrt r_gmpz_sqrt mpz_sqrt
|
51
|
-
* sqrt! r_gmpz_sqrt_self mpz_sqrt
|
52
|
-
* sqrtrem r_gmpz_sqrtrem mpz_sqrtrem
|
53
|
-
* power? r_gmpz_is_power mpz_perfect_power_p
|
54
|
-
* square? r_gmpz_is_square mpz_perfect_square_p
|
55
|
-
* probab_prime? r_gmpz_is_probab_prime mpz_probab_prime_p
|
56
|
-
* nextprime r_gmpz_nextprime mpz_nextprime
|
57
|
-
* nextprime! r_gmpz_nextprime_self mpz_nextprime
|
58
|
-
* gcd r_gmpz_gcd mpz_gcd
|
59
|
-
* \------------------------ mpz_gcd_ui
|
60
|
-
* invert r_gmpz_invert mpz_invert
|
61
|
-
* jacobi r_gmpz_jacobi mpz_jacobi
|
62
|
-
* #jacobi r_gmpzsg_jacobi mpz_jacobi
|
63
|
-
* legendre r_gmpz_legendre mpz_legendre
|
64
|
-
* remove r_gmpz_remove mpz_remove
|
65
|
-
* fac r_gmpz_fac mpz_fac_ui
|
66
|
-
* fib r_gmpz_fib mpz_fib_ui
|
67
|
-
* <=>
|
68
|
-
* <
|
69
|
-
* <=
|
70
|
-
* ==
|
71
|
-
* >=
|
72
|
-
* >
|
73
|
-
* cmpabs
|
74
|
-
* sgn
|
75
|
-
* eql? r_gmpz_eql ------------
|
76
|
-
* hash r_gmpz_hash
|
77
|
-
* and
|
78
|
-
* ior
|
79
|
-
* xor
|
80
|
-
* com r_gmpz_com mpz_com
|
81
|
-
* com! r_gmpz_com_self mpz_com
|
82
|
-
* popcount r_gmpz_popcount
|
83
|
-
* scan0 r_gmpz_scan0 mpz_scan0
|
84
|
-
* scan1 r_gmpz_scan1 mpz_scan1
|
85
|
-
* []= r_gmpz_setbit mpz_setbit
|
86
|
-
* [] r_gmpz_getbit mpz_tstbit
|
87
|
-
* even? r_gmpz_is_even mpz_even
|
88
|
-
* odd? r_gmpz_is_odd mpz_odd
|
89
|
-
* sizeinbase r_gmpz_sizeinbase mpz_sizeinbase
|
90
|
-
* size_in_bin r_gmpz_size_in_bin mpz_sizeinbits
|
91
|
-
* size r_gmpz_size mpz_size
|
92
13
|
*/
|
93
14
|
|
94
15
|
/**********************************************************************
|
@@ -251,16 +172,38 @@ static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg) \
|
|
251
172
|
return res; \
|
252
173
|
}
|
253
174
|
|
175
|
+
#define DEFUN_INT_COND_P(fname,mpz_fname) \
|
176
|
+
static VALUE r_gmpz_##fname(VALUE self) \
|
177
|
+
{ \
|
178
|
+
MP_INT *self_val; \
|
179
|
+
mpz_get_struct (self, self_val); \
|
180
|
+
return mpz_fname (self_val) ? Qtrue : Qfalse; \
|
181
|
+
}
|
182
|
+
|
254
183
|
/**********************************************************************
|
255
184
|
* Initializing, Assigning Integers *
|
256
185
|
**********************************************************************/
|
257
186
|
|
258
187
|
/*
|
259
188
|
* call-seq:
|
260
|
-
* GMP::Z.new(
|
189
|
+
* GMP::Z.new(value = 0)
|
261
190
|
*
|
262
|
-
* Creates a new GMP::Z integer, with
|
263
|
-
*
|
191
|
+
* Creates a new GMP::Z integer, with _value_ as its value, converting where necessary.
|
192
|
+
* _value_ must be an instance of one of the following classes:
|
193
|
+
*
|
194
|
+
* * GMP::Z
|
195
|
+
* * Fixnum
|
196
|
+
* * String
|
197
|
+
* * Bignum
|
198
|
+
*
|
199
|
+
* @example
|
200
|
+
* GMP::Z.new(5) #=> 5
|
201
|
+
* GMP::Z.new(2**32) #=> 4_294_967_296
|
202
|
+
* GMP::Z.new(2**101) #=> 2_535_301_200_456_458_802_993_406_410_752
|
203
|
+
* GMP::Z.new("20") #=> 20
|
204
|
+
* GMP::Z.new("0x20") #=> 32
|
205
|
+
* GMP::Z.new("020") #=> 16
|
206
|
+
* GMP::Z.new("0b101") #=> 5
|
264
207
|
*/
|
265
208
|
VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass)
|
266
209
|
{
|
@@ -293,8 +236,8 @@ VALUE r_gmpz_initialize(int argc, VALUE *argv, VALUE self)
|
|
293
236
|
* call-seq:
|
294
237
|
* a = b
|
295
238
|
*
|
296
|
-
* Sets the value of
|
297
|
-
* classes:
|
239
|
+
* Sets the value of _a_ to the value of _b_. _b_ must be an instance of one of the
|
240
|
+
* following classes:
|
298
241
|
*
|
299
242
|
* * GMP::Z
|
300
243
|
* * Fixnum
|
@@ -321,9 +264,9 @@ void mpz_set_value(MP_INT *target, VALUE source)
|
|
321
264
|
|
322
265
|
/*
|
323
266
|
* call-seq:
|
324
|
-
* GMP::Z(
|
267
|
+
* GMP::Z(value)
|
325
268
|
*
|
326
|
-
* A convenience method for
|
269
|
+
* A convenience method for GMP::Z.new(value).
|
327
270
|
*/
|
328
271
|
VALUE r_gmpmod_z(int argc, VALUE *argv, VALUE module)
|
329
272
|
{
|
@@ -333,9 +276,11 @@ VALUE r_gmpmod_z(int argc, VALUE *argv, VALUE module)
|
|
333
276
|
|
334
277
|
/*
|
335
278
|
* call-seq:
|
336
|
-
*
|
279
|
+
* a.swap(b)
|
337
280
|
*
|
338
|
-
*
|
281
|
+
* @return nil
|
282
|
+
*
|
283
|
+
* Efficiently swaps the contents of _a_ with _b_. _b_ must be an instance of GMP::Z.
|
339
284
|
*/
|
340
285
|
VALUE r_gmpz_swap(VALUE self, VALUE arg)
|
341
286
|
{
|
@@ -356,16 +301,17 @@ VALUE r_gmpz_swap(VALUE self, VALUE arg)
|
|
356
301
|
|
357
302
|
/*
|
358
303
|
* call-seq:
|
359
|
-
*
|
304
|
+
* a.to_i
|
305
|
+
*
|
306
|
+
* @todo Implement mpz_fits_slong_p
|
360
307
|
*
|
361
|
-
* Returns
|
308
|
+
* Returns _a_ as an Fixnum if _a_ fits into a Fixnum.
|
362
309
|
*
|
363
|
-
* Otherwise returns the least significant part of
|
364
|
-
* sign as +integer+.
|
310
|
+
* Otherwise returns the least significant part of _a_, with the same sign as _a_.
|
365
311
|
*
|
366
|
-
* If
|
367
|
-
*
|
368
|
-
*
|
312
|
+
* If _a_ is too big to fit in a Fixnum, the returned result is probably not very useful.
|
313
|
+
* To find out if the value will fit, use the function +mpz_fits_slong_p+
|
314
|
+
* (<b>Unimplemented</b>).
|
369
315
|
*/
|
370
316
|
VALUE r_gmpz_to_i(VALUE self)
|
371
317
|
{
|
@@ -384,16 +330,17 @@ VALUE r_gmpz_to_i(VALUE self)
|
|
384
330
|
|
385
331
|
/*
|
386
332
|
* call-seq:
|
387
|
-
*
|
333
|
+
* a.to_d
|
388
334
|
*
|
389
|
-
*
|
335
|
+
* @todo Implement mpz_fits_slong_p
|
390
336
|
*
|
391
|
-
*
|
392
|
-
* sign as +integer+.
|
337
|
+
* Returns _a_ as a Float if _a_ fits in a Float.
|
393
338
|
*
|
394
|
-
*
|
395
|
-
*
|
396
|
-
*
|
339
|
+
* Otherwise returns the least significant part of _a_, with the same sign as _a_.
|
340
|
+
*
|
341
|
+
* If _a_ is too big to fit in a Float, the returned result is probably not very useful.
|
342
|
+
* To find out if the value will fit, use the function +mpz_fits_slong_p+
|
343
|
+
* (<b>Unimplemented</b>).
|
397
344
|
*/
|
398
345
|
VALUE r_gmpz_to_d(VALUE self)
|
399
346
|
{
|
@@ -407,20 +354,23 @@ VALUE r_gmpz_to_d(VALUE self)
|
|
407
354
|
* Document-method: to_s
|
408
355
|
*
|
409
356
|
* call-seq:
|
410
|
-
*
|
357
|
+
* a.to_s(base = 10)
|
358
|
+
* a.to_s(:bin)
|
359
|
+
* a.to_s(:oct)
|
360
|
+
* a.to_s(:dec)
|
361
|
+
* a.to_s(:hex)
|
411
362
|
*
|
412
|
-
* Returns
|
413
|
-
*
|
363
|
+
* Returns _a_, as a String. If _base_ is not provided, then the decimal
|
364
|
+
* representation will be returned.
|
414
365
|
*
|
415
366
|
* From the GMP Manual:
|
416
367
|
*
|
417
|
-
* Convert
|
418
|
-
*
|
368
|
+
* Convert _a_ to a string of digits in base _base_. The _base_ argument may vary from 2
|
369
|
+
* to 62 or from -2 to -36.
|
419
370
|
*
|
420
|
-
* For
|
421
|
-
*
|
422
|
-
*
|
423
|
-
* used.
|
371
|
+
* For _base_ in the range 2..36, digits and lower-case letters are used; for -2..-36,
|
372
|
+
* digits and upper-case letters are used; for 37..62, digits, upper-case letters, and
|
373
|
+
* lower-case letters (in that significance order) are used.
|
424
374
|
*/
|
425
375
|
VALUE r_gmpz_to_s(int argc, VALUE *argv, VALUE self)
|
426
376
|
{
|
@@ -480,9 +430,9 @@ VALUE r_gmpz_to_s(int argc, VALUE *argv, VALUE self)
|
|
480
430
|
|
481
431
|
/*
|
482
432
|
* call-seq:
|
483
|
-
* +
|
433
|
+
* a + b
|
484
434
|
*
|
485
|
-
* Adds
|
435
|
+
* Adds _a_ to _b_. _b_ must be an instance of one of:
|
486
436
|
* * GMP::Z
|
487
437
|
* * Fixnum
|
488
438
|
* * GMP::Q
|
@@ -527,10 +477,9 @@ VALUE r_gmpz_add(VALUE self, VALUE arg)
|
|
527
477
|
|
528
478
|
/*
|
529
479
|
* call-seq:
|
530
|
-
* add!(
|
480
|
+
* a.add!(_b_)
|
531
481
|
*
|
532
|
-
* Adds
|
533
|
-
* can be
|
482
|
+
* Adds _a_ to _b_ in-place, setting _a_ to the sum. _b_ must be an instance of one of:
|
534
483
|
* * GMP::Z
|
535
484
|
* * Fixnum
|
536
485
|
* * GMP::Q
|
@@ -563,9 +512,9 @@ VALUE r_gmpz_add_self(VALUE self, VALUE arg)
|
|
563
512
|
|
564
513
|
/*
|
565
514
|
* call-seq:
|
566
|
-
* -
|
515
|
+
* a - b
|
567
516
|
*
|
568
|
-
* Subtracts
|
517
|
+
* Subtracts _b_ from _a_. _b_ must be an instance of one of:
|
569
518
|
* * GMP::Z
|
570
519
|
* * Fixnum
|
571
520
|
* * GMP::Q
|
@@ -615,10 +564,10 @@ VALUE r_gmpz_sub(VALUE self, VALUE arg)
|
|
615
564
|
|
616
565
|
/*
|
617
566
|
* call-seq:
|
618
|
-
* sub!(
|
567
|
+
* a.sub!(b)
|
619
568
|
*
|
620
|
-
* Subtracts
|
621
|
-
*
|
569
|
+
* Subtracts _b_ from _a_ in-place, setting _a_ to the difference. _b_ must be an
|
570
|
+
* instance of one of:
|
622
571
|
* * GMP::Z
|
623
572
|
* * Fixnum
|
624
573
|
* * GMP::Q
|
@@ -651,9 +600,9 @@ VALUE r_gmpz_sub_self(VALUE self, VALUE arg)
|
|
651
600
|
|
652
601
|
/*
|
653
602
|
* call-seq:
|
654
|
-
* *
|
603
|
+
* a * b
|
655
604
|
*
|
656
|
-
* Multiplies
|
605
|
+
* Multiplies _a_ with _b_. _a_ must be an instance of one of
|
657
606
|
* * GMP::Z
|
658
607
|
* * Fixnum
|
659
608
|
* * GMP::Q
|
@@ -696,11 +645,14 @@ VALUE r_gmpz_mul(VALUE self, VALUE arg)
|
|
696
645
|
* call-seq:
|
697
646
|
* a.addmul!(b, c)
|
698
647
|
*
|
699
|
-
*
|
700
|
-
*
|
701
|
-
* Sets
|
648
|
+
* @since 0.4.19
|
649
|
+
*
|
650
|
+
* Sets _a_ to _a_ plus _b_ times _c_. _b_ and _c_ must each be an instance of one of
|
651
|
+
* * GMP::Z
|
652
|
+
* * Fixnum
|
653
|
+
* * Bignum
|
702
654
|
*/
|
703
|
-
VALUE r_gmpz_addmul_self(VALUE self, VALUE b, VALUE c)
|
655
|
+
static VALUE r_gmpz_addmul_self(VALUE self, VALUE b, VALUE c)
|
704
656
|
{
|
705
657
|
MP_INT *self_val, *b_val, *c_val;
|
706
658
|
int free_b_val = 0;
|
@@ -743,16 +695,68 @@ VALUE r_gmpz_addmul_self(VALUE self, VALUE b, VALUE c)
|
|
743
695
|
return self;
|
744
696
|
}
|
745
697
|
|
698
|
+
/*
|
699
|
+
* call-seq:
|
700
|
+
* a.submul!(b, c)
|
701
|
+
*
|
702
|
+
* @since 0.5.23
|
703
|
+
*
|
704
|
+
* Sets _a_ to _a_ minus _b_ times _c_. _b_ and _c_ must each be an instance of one of
|
705
|
+
* * GMP::Z
|
706
|
+
* * Fixnum
|
707
|
+
* * Bignum
|
708
|
+
*/
|
709
|
+
static VALUE r_gmpz_submul_self(VALUE self, VALUE b, VALUE c)
|
710
|
+
{
|
711
|
+
MP_INT *self_val, *b_val, *c_val;
|
712
|
+
int free_b_val = 0;
|
713
|
+
|
714
|
+
if (GMPZ_P(b)) {
|
715
|
+
mpz_get_struct(b, b_val);
|
716
|
+
} else if (FIXNUM_P(b)) {
|
717
|
+
mpz_temp_alloc(b_val);
|
718
|
+
mpz_init_set_si(b_val, FIX2NUM(b));
|
719
|
+
free_b_val = 1;
|
720
|
+
} else if (BIGNUM_P(b)) {
|
721
|
+
mpz_temp_from_bignum(b_val, b);
|
722
|
+
free_b_val = 1;
|
723
|
+
} else {
|
724
|
+
typeerror_as(ZXB, "addend");
|
725
|
+
}
|
726
|
+
mpz_get_struct(self, self_val);
|
727
|
+
|
728
|
+
if (GMPZ_P(c)) {
|
729
|
+
mpz_get_struct(c, c_val);
|
730
|
+
mpz_submul(self_val, b_val, c_val);
|
731
|
+
} else if (FIXNUM_P(c)) {
|
732
|
+
if (FIX2NUM(c) < 0)
|
733
|
+
{
|
734
|
+
if (free_b_val) { mpz_temp_free(b_val); }
|
735
|
+
rb_raise(rb_eRangeError, "multiplicand (Fixnum) must be nonnegative");
|
736
|
+
}
|
737
|
+
mpz_submul_ui(self_val, b_val, FIX2NUM(c));
|
738
|
+
} else if (BIGNUM_P(c)) {
|
739
|
+
mpz_temp_from_bignum(c_val, c);
|
740
|
+
mpz_submul(self_val, b_val, c_val);
|
741
|
+
mpz_temp_free(c_val);
|
742
|
+
} else {
|
743
|
+
if (free_b_val)
|
744
|
+
mpz_temp_free(b_val);
|
745
|
+
typeerror_as(ZXB, "multiplicand");
|
746
|
+
}
|
747
|
+
if (free_b_val)
|
748
|
+
mpz_temp_free(b_val);
|
749
|
+
return self;
|
750
|
+
}
|
751
|
+
|
746
752
|
/*
|
747
753
|
* Document-method: <<
|
748
754
|
*
|
749
755
|
* call-seq:
|
750
|
-
*
|
756
|
+
* a << n
|
751
757
|
*
|
752
|
-
*
|
753
|
-
*
|
754
|
-
* Returns +integer+ times 2 raised to +n+. This operation can also be defined
|
755
|
-
* as a left shift by +n+ bits.
|
758
|
+
* Returns _a_ times 2 raised to _n_. This operation can also be defined as a left shift
|
759
|
+
* by _n_ bits.
|
756
760
|
*/
|
757
761
|
DEFUN_INT_F_UL(shl,mpz_mul_2exp,"shift size")
|
758
762
|
|
@@ -760,43 +764,35 @@ DEFUN_INT_F_UL(shl,mpz_mul_2exp,"shift size")
|
|
760
764
|
* Document-method: neg
|
761
765
|
*
|
762
766
|
* call-seq:
|
763
|
-
*
|
764
|
-
* -
|
767
|
+
* a.neg
|
768
|
+
* -a
|
765
769
|
*
|
766
|
-
*
|
767
|
-
*
|
768
|
-
* Returns -+integer+.
|
770
|
+
* Returns -_a_.
|
769
771
|
*/
|
770
772
|
/*
|
771
773
|
* Document-method: neg!
|
772
774
|
*
|
773
775
|
* call-seq:
|
774
|
-
*
|
776
|
+
* a.neg!
|
775
777
|
*
|
776
|
-
*
|
777
|
-
*
|
778
|
-
* Sets +integer+ to -+integer+.
|
778
|
+
* Sets _a_ to -_a_.
|
779
779
|
*/
|
780
780
|
DEFUN_INT2INT(neg, mpz_neg)
|
781
781
|
/*
|
782
782
|
* Document-method: abs
|
783
783
|
*
|
784
784
|
* call-seq:
|
785
|
-
*
|
785
|
+
* a.abs
|
786
786
|
*
|
787
|
-
*
|
788
|
-
*
|
789
|
-
* Returns the absolute value of +integer+.
|
787
|
+
* Returns the absolute value of _a_.
|
790
788
|
*/
|
791
789
|
/*
|
792
790
|
* Document-method: abs!
|
793
791
|
*
|
794
792
|
* call-seq:
|
795
|
-
*
|
793
|
+
* a.abs!
|
796
794
|
*
|
797
|
-
*
|
798
|
-
*
|
799
|
-
* Sets +integer+ to its absolute value.
|
795
|
+
* Sets _a_ to its absolute value.
|
800
796
|
*/
|
801
797
|
DEFUN_INT2INT(abs, mpz_abs)
|
802
798
|
|
@@ -809,10 +805,9 @@ DEFUN_INT2INT(abs, mpz_abs)
|
|
809
805
|
* call-seq:
|
810
806
|
* a / b
|
811
807
|
*
|
812
|
-
* Divides _a_ by _b_. Combines the different GMP division functions to
|
813
|
-
*
|
814
|
-
*
|
815
|
-
* instance of any of the following:
|
808
|
+
* Divides _a_ by _b_. Combines the different GMP division functions to provide what one
|
809
|
+
* is hopefully looking for. The result will either be an instance of GMP::Q or GMP::F,
|
810
|
+
* depending on _b_. _b_ must be an instance of one of the following:
|
816
811
|
* * GMP::Z
|
817
812
|
* * Fixnum
|
818
813
|
* * GMP::Q
|
@@ -881,15 +876,12 @@ VALUE r_gmpz_div(VALUE self, VALUE arg)
|
|
881
876
|
* Document-method: tdiv
|
882
877
|
*
|
883
878
|
* call-seq:
|
884
|
-
* n.tdiv
|
885
|
-
*
|
886
|
-
* From the GMP Manual:
|
879
|
+
* n.tdiv(d)
|
887
880
|
*
|
888
|
-
* Divides
|
889
|
-
*
|
881
|
+
* Divides _n_ by _d_, forming a quotient _q_. tdiv rounds _q_ towards zero. The _t_
|
882
|
+
* stands for "truncate".
|
890
883
|
*
|
891
|
-
*
|
892
|
-
* <tt>0<=abs(r)<abs(d)</tt>.
|
884
|
+
* _q_ will satisfy <i>n=q*d+r</i>, and _r_ will satisfy <i>0 <= abs( r ) < abs( d )</i>.
|
893
885
|
*
|
894
886
|
* This function calculates only the quotient.
|
895
887
|
*/
|
@@ -898,34 +890,45 @@ DEFUN_INT_DIV(tdiv, mpz_tdiv_q)
|
|
898
890
|
* Document-method: tmod
|
899
891
|
*
|
900
892
|
* call-seq:
|
901
|
-
* n.tmod
|
902
|
-
*
|
903
|
-
* From the GMP Manual:
|
893
|
+
* n.tmod(d)
|
904
894
|
*
|
905
|
-
* Divides
|
906
|
-
*
|
895
|
+
* Divides _n_ by _d_, forming a remainder _r_. _r_ will have the same sign as _n_. The
|
896
|
+
* _t_ stands for "truncate".
|
907
897
|
*
|
908
|
-
*
|
909
|
-
* <tt>0<=abs(r)<abs(d)</tt>.
|
898
|
+
* _r_ will satisfy <i>n=q*d+r</i>, and _r_ will satisfy <i>0 <= abs( r ) < abs( d )</i>.
|
910
899
|
*
|
911
900
|
* This function calculates only the remainder.
|
912
901
|
*
|
913
|
-
* The remainder can be negative, so the return value is the absolute value of
|
914
|
-
*
|
902
|
+
* The remainder can be negative, so the return value is the absolute value of the
|
903
|
+
* remainder.
|
915
904
|
*/
|
916
905
|
DEFUN_INT_DIV(tmod, mpz_tdiv_r)
|
906
|
+
/*
|
907
|
+
* Document-method: tshr
|
908
|
+
*
|
909
|
+
* call-seq:
|
910
|
+
* n.tshr(d)
|
911
|
+
*
|
912
|
+
* Divides _n_ by 2^<i>d</i>, forming a quotient _q_. tshr rounds _q_ towards zero. The
|
913
|
+
* _t_ stands for "truncate".
|
914
|
+
*
|
915
|
+
* _q_ will satisfy <i>n=q*d+r</i>, and _r_ will satisfy <i>0 <= abs( r ) < abs( d )</i>.
|
916
|
+
*
|
917
|
+
* This function calculates only the quotient.
|
918
|
+
*/
|
919
|
+
DEFUN_INT_F_UL(tshr,mpz_tdiv_q_2exp,"shift size")
|
920
|
+
DEFUN_INT_F_UL(tshrm,mpz_tdiv_r_2exp,"mark size")
|
921
|
+
|
917
922
|
/*
|
918
923
|
* Document-method: fdiv
|
919
924
|
*
|
920
925
|
* call-seq:
|
921
|
-
* n.fdiv
|
926
|
+
* n.fdiv(d)
|
922
927
|
*
|
923
|
-
*
|
924
|
-
*
|
925
|
-
* Divide n by d, forming a quotient q. fdiv rounds q down towards -infinity.
|
926
|
-
* The f stands for �floor�.
|
928
|
+
* Divide _n_ by _d_, forming a quotient _q_. fdiv rounds _q_ down towards -infinity.
|
929
|
+
* The f stands for "floor".
|
927
930
|
*
|
928
|
-
*
|
931
|
+
* _q_ will satisfy <i>n=q*d+r</i>.
|
929
932
|
*
|
930
933
|
* This function calculates only the quotient.
|
931
934
|
*/
|
@@ -934,33 +937,32 @@ DEFUN_INT_DIV(fdiv, mpz_fdiv_q)
|
|
934
937
|
* Document-method: fmod
|
935
938
|
*
|
936
939
|
* call-seq:
|
937
|
-
* n.fmod
|
940
|
+
* n.fmod(d)
|
938
941
|
*
|
939
|
-
*
|
940
|
-
*
|
941
|
-
* Divides n by d, forming a remainder r. r will have the same sign as d. The f
|
942
|
-
* stands for �floor�.
|
942
|
+
* Divides _n_ by _d_, forming a remainder _r_. _r_ will have the same sign as _d_. The
|
943
|
+
* _f_ stands for "floor".
|
943
944
|
*
|
944
|
-
*
|
945
|
+
* _r_ will satisfy <i>n=q*d+r</i>, and _r_ will satisfy <i>0 <= abs( r ) < abs( d )</i>.
|
945
946
|
*
|
946
947
|
* This function calculates only the remainder.
|
947
948
|
*
|
948
|
-
* The remainder can be negative, so the return value is the absolute value of
|
949
|
-
*
|
949
|
+
* The remainder can be negative, so the return value is the absolute value of the
|
950
|
+
* remainder.
|
950
951
|
*/
|
951
952
|
DEFUN_INT_DIV(fmod, mpz_fdiv_r)
|
953
|
+
DEFUN_INT_F_UL(fshr,mpz_fdiv_q_2exp,"shift size")
|
954
|
+
DEFUN_INT_F_UL(fshrm,mpz_fdiv_r_2exp,"mark size")
|
955
|
+
|
952
956
|
/*
|
953
957
|
* Document-method: cdiv
|
954
958
|
*
|
955
959
|
* call-seq:
|
956
|
-
* n.cdiv
|
960
|
+
* n.cdiv(d)
|
957
961
|
*
|
958
|
-
*
|
959
|
-
*
|
960
|
-
* Divide +n+ by +d+, forming a quotient +q+. +cdiv+ rounds +q+ up towards
|
961
|
-
* <tt>+infinity</tt>. The c stands for �ceil�.
|
962
|
+
* Divide _n_ by _d_, forming a quotient _q_. cdiv rounds _q_ up towards
|
963
|
+
* _+infinity_. The c stands for "ceil".
|
962
964
|
*
|
963
|
-
*
|
965
|
+
* _q_ will satisfy <i>n=q*d+r</i>.
|
964
966
|
*
|
965
967
|
* This function calculates only the quotient.
|
966
968
|
*/
|
@@ -969,15 +971,12 @@ DEFUN_INT_DIV(cdiv, mpz_cdiv_q)
|
|
969
971
|
* Document-method: cmod
|
970
972
|
*
|
971
973
|
* call-seq:
|
972
|
-
* n.cmod
|
974
|
+
* n.cmod(d)
|
973
975
|
*
|
974
|
-
*
|
975
|
-
*
|
976
|
-
* Divides +n+ by +d+, forming a remainder +r+. +r+ will have the opposite sign
|
977
|
-
* as +d+. The c stands for �ceil�.
|
976
|
+
* Divides _n_ by _d_, forming a remainder _r_. _r_ will have the opposite sign of _d_.
|
977
|
+
* The c stands for "ceil".
|
978
978
|
*
|
979
|
-
*
|
980
|
-
* <tt>0<=abs(r)<abs(d)</tt>.
|
979
|
+
* _r_ will satisfy <i>n=q*d+r</i>, and _r_ will satisfy <i>0 <= abs( r ) < abs( d )</i>.
|
981
980
|
*
|
982
981
|
* This function calculates only the remainder.
|
983
982
|
*/
|
@@ -987,6 +986,8 @@ DEFUN_INT_DIV(cmod, mpz_cdiv_r)
|
|
987
986
|
* call-seq:
|
988
987
|
* a % b
|
989
988
|
*
|
989
|
+
* @since 0.2.10
|
990
|
+
*
|
990
991
|
* Returns _a_ mod _b_. _b_ can be an instance any of the following:
|
991
992
|
* * GMP::Z
|
992
993
|
* * Fixnum
|
@@ -1016,6 +1017,47 @@ VALUE r_gmpz_mod(VALUE self, VALUE arg)
|
|
1016
1017
|
return res;
|
1017
1018
|
}
|
1018
1019
|
|
1020
|
+
/*
|
1021
|
+
* call-seq:
|
1022
|
+
* a.divisible?(b)
|
1023
|
+
*
|
1024
|
+
* @since 0.5.23
|
1025
|
+
*
|
1026
|
+
* Returns true if _a_ is divisible by _b_. _b_ can be an instance any of the following:
|
1027
|
+
* * GMP::Z
|
1028
|
+
* * Fixnum
|
1029
|
+
* * Bignum
|
1030
|
+
*/
|
1031
|
+
static VALUE r_gmpz_divisible(VALUE self, VALUE arg)
|
1032
|
+
{
|
1033
|
+
MP_INT *self_val, *arg_val;
|
1034
|
+
int res;
|
1035
|
+
mpz_get_struct (self, self_val);
|
1036
|
+
|
1037
|
+
if (FIXNUM_P (arg) && FIX2NUM (arg) > 0) {
|
1038
|
+
mpz_temp_alloc(arg_val);
|
1039
|
+
mpz_init_set_ui(arg_val, FIX2NUM(arg));
|
1040
|
+
res = mpz_divisible_ui_p (self_val, FIX2NUM (arg));
|
1041
|
+
mpz_temp_free(arg_val);
|
1042
|
+
} else if (FIXNUM_P (arg)) {
|
1043
|
+
mpz_temp_alloc(arg_val);
|
1044
|
+
mpz_make_struct_init (arg, arg_val);
|
1045
|
+
mpz_init_set_si(arg_val, FIX2NUM(arg));
|
1046
|
+
res = mpz_divisible_p (self_val, arg_val);
|
1047
|
+
mpz_temp_free(arg_val);
|
1048
|
+
} else if (BIGNUM_P (arg)) {
|
1049
|
+
mpz_temp_from_bignum(arg_val, arg);
|
1050
|
+
res = mpz_divisible_p (self_val, arg_val);
|
1051
|
+
mpz_temp_free(arg_val);
|
1052
|
+
} else if (GMPZ_P (arg)) {
|
1053
|
+
mpz_get_struct(arg, arg_val);
|
1054
|
+
res = mpz_divisible_p (self_val, arg_val);
|
1055
|
+
} else {
|
1056
|
+
typeerror_as (ZXB, "argument");
|
1057
|
+
}
|
1058
|
+
return (res != 0) ? Qtrue : Qfalse;
|
1059
|
+
}
|
1060
|
+
|
1019
1061
|
|
1020
1062
|
/**********************************************************************
|
1021
1063
|
* Integer Exponentiation *
|
@@ -1025,25 +1067,46 @@ VALUE r_gmpz_mod(VALUE self, VALUE arg)
|
|
1025
1067
|
* Document-method: **
|
1026
1068
|
*
|
1027
1069
|
* call-seq:
|
1028
|
-
*
|
1070
|
+
* a ** b
|
1029
1071
|
*
|
1030
|
-
*
|
1031
|
-
*
|
1032
|
-
* Returns +integer+ raised to +exp+. The case 0^0 yields 1.
|
1072
|
+
* Returns _a_ raised to _b_. The case 0^0 yields 1.
|
1033
1073
|
*/
|
1034
1074
|
DEFUN_INT_F_UL(pow,mpz_pow_ui,"exponent")
|
1035
1075
|
|
1036
1076
|
/*
|
1077
|
+
* Document-method: GMP::Z.pow
|
1078
|
+
*
|
1037
1079
|
* call-seq:
|
1038
|
-
*
|
1080
|
+
* GMP::Z.pow(a, b)
|
1039
1081
|
*
|
1040
|
-
*
|
1041
|
-
|
1042
|
-
|
1082
|
+
* Returns _a_ raised to _b_. The case 0^0 yields 1.
|
1083
|
+
*/
|
1084
|
+
VALUE r_gmpzsg_pow(VALUE klass, VALUE base, VALUE exp)
|
1085
|
+
{
|
1086
|
+
MP_INT *res_val;
|
1087
|
+
VALUE res;
|
1088
|
+
|
1089
|
+
if (FIXNUM_P(base) && FIXNUM_P(exp))
|
1090
|
+
{
|
1091
|
+
if (FIX2NUM(base) < 0)
|
1092
|
+
rb_raise (rb_eRangeError, "base must not be negative");
|
1093
|
+
if (FIX2NUM(exp) < 0)
|
1094
|
+
rb_raise (rb_eRangeError, "exponent must not be negative");
|
1095
|
+
mpz_make_struct_init (res, res_val);
|
1096
|
+
mpz_ui_pow_ui (res_val, FIX2NUM(base), FIX2NUM(exp));
|
1097
|
+
return res;
|
1098
|
+
}
|
1099
|
+
return r_gmpz_pow (r_gmpzsg_new(1, &base, klass), exp);
|
1100
|
+
}
|
1101
|
+
|
1102
|
+
/*
|
1103
|
+
* call-seq:
|
1104
|
+
* a.powmod(b, c)
|
1043
1105
|
*
|
1044
|
-
*
|
1045
|
-
*
|
1046
|
-
*
|
1106
|
+
* Returns _a_ raised to _b_ modulo _c_.
|
1107
|
+
*
|
1108
|
+
* Negative _b_ is supported if an inverse <i>a^-1</i> mod _c_ exists. If an inverse
|
1109
|
+
* doesn't exist then a divide by zero is raised.
|
1047
1110
|
*/
|
1048
1111
|
VALUE r_gmpz_powm(VALUE self, VALUE exp, VALUE mod)
|
1049
1112
|
{
|
@@ -1113,11 +1176,9 @@ VALUE r_gmpz_powm(VALUE self, VALUE exp, VALUE mod)
|
|
1113
1176
|
* Document-method: root
|
1114
1177
|
*
|
1115
1178
|
* call-seq:
|
1116
|
-
*
|
1179
|
+
* a.root(b)
|
1117
1180
|
*
|
1118
|
-
*
|
1119
|
-
*
|
1120
|
-
* Returns the truncated integer part of the +n+th root of +m+.
|
1181
|
+
* Returns the truncated integer part of the <i>b</i>th root of _a_.
|
1121
1182
|
*/
|
1122
1183
|
DEFUN_INT_F_UL(root,mpz_root,"root number")
|
1123
1184
|
|
@@ -1125,35 +1186,26 @@ DEFUN_INT_F_UL(root,mpz_root,"root number")
|
|
1125
1186
|
* Document-method: sqrt
|
1126
1187
|
*
|
1127
1188
|
* call-seq:
|
1128
|
-
*
|
1189
|
+
* a.sqrt
|
1129
1190
|
*
|
1130
|
-
*
|
1131
|
-
*
|
1132
|
-
* Returns the truncated integer part of the square root of +integer+.
|
1191
|
+
* Returns the truncated integer part of the square root of _a_.
|
1133
1192
|
*/
|
1134
1193
|
/*
|
1135
1194
|
* Document-method: sqrt!
|
1136
1195
|
*
|
1137
1196
|
* call-seq:
|
1138
|
-
*
|
1197
|
+
* a.sqrt!
|
1139
1198
|
*
|
1140
|
-
*
|
1141
|
-
*
|
1142
|
-
* Sets +integer+ to the truncated integer part of its square root.
|
1199
|
+
* Sets _a_ to the truncated integer part of its square root.
|
1143
1200
|
*/
|
1144
1201
|
DEFUN_INT2INT(sqrt, mpz_sqrt)
|
1145
1202
|
|
1146
1203
|
/*
|
1147
|
-
* Document-method: sqrtrem
|
1148
|
-
*
|
1149
1204
|
* call-seq:
|
1150
|
-
*
|
1205
|
+
* a.sqrtrem #=> s, r
|
1151
1206
|
*
|
1152
|
-
*
|
1153
|
-
*
|
1154
|
-
* Returns the truncated integer part of the square root of +integer+ as
|
1155
|
-
* +sqrt+ and the remainder <tt>integer - sqrt * sqrt</tt> as +rem+, which will
|
1156
|
-
* be zero if +integer+ is a perfect square.
|
1207
|
+
* Returns the truncated integer part of the square root of _a_ as _s_ and the remainder
|
1208
|
+
* <i>a - s * s</i> as _r_, which will be zero if _a_ is a perfect square.
|
1157
1209
|
*/
|
1158
1210
|
static VALUE r_gmpz_sqrtrem(VALUE self)
|
1159
1211
|
{
|
@@ -1171,29 +1223,23 @@ static VALUE r_gmpz_sqrtrem(VALUE self)
|
|
1171
1223
|
* Document-method: power?
|
1172
1224
|
*
|
1173
1225
|
* call-seq:
|
1174
|
-
*
|
1226
|
+
* p.power?
|
1175
1227
|
*
|
1176
|
-
*
|
1177
|
-
*
|
1178
|
-
* Returns true if integer is a perfect power, i.e., if there exist integers a
|
1179
|
-
* and b, with b>1, such that integer equals a raised to the power b.
|
1228
|
+
* Returns true if _p_ is a perfect power, i.e., if there exist integers _a_ and _b_,
|
1229
|
+
* with <i>b > 1</i>, such that _p_ equals _a_ raised to the power _b_.
|
1180
1230
|
*
|
1181
|
-
* Under this definition both 0 and 1 are considered to be perfect powers.
|
1182
|
-
*
|
1183
|
-
* perfect powers.
|
1231
|
+
* Under this definition both 0 and 1 are considered to be perfect powers. Negative
|
1232
|
+
* values of integers are accepted, but of course can only be odd perfect powers.
|
1184
1233
|
*/
|
1185
1234
|
DEFUN_INT_COND_P(is_power,mpz_perfect_power_p)
|
1186
1235
|
/*
|
1187
1236
|
* Document-method: square?
|
1188
1237
|
*
|
1189
1238
|
* call-seq:
|
1190
|
-
*
|
1239
|
+
* p.square?
|
1191
1240
|
*
|
1192
|
-
*
|
1193
|
-
*
|
1194
|
-
* Returns true if integer is a perfect square, i.e., if the square root of
|
1195
|
-
* integer is an integer. Under this definition both 0 and 1 are considered to
|
1196
|
-
* be perfect squares.
|
1241
|
+
* Returns true if _p_ is a perfect square, i.e., if the square root of _p_ is an
|
1242
|
+
* integer. Under this definition both 0 and 1 are considered to be perfect squares.
|
1197
1243
|
*/
|
1198
1244
|
DEFUN_INT_COND_P(is_square,mpz_perfect_square_p)
|
1199
1245
|
|
@@ -1203,21 +1249,22 @@ DEFUN_INT_COND_P(is_square,mpz_perfect_square_p)
|
|
1203
1249
|
**********************************************************************/
|
1204
1250
|
|
1205
1251
|
/*
|
1206
|
-
* call-seq:
|
1252
|
+
* call-seq:
|
1253
|
+
* n.probab_prime?(reps = 5)
|
1207
1254
|
*
|
1208
|
-
* Determine whether
|
1209
|
-
*
|
1210
|
-
*
|
1255
|
+
* Determine whether _n_ is prime. Returns 2 if _n_ is definitely prime, returns 1 if _n_
|
1256
|
+
* is probably prime (without being certain), or returns 0 if _n_ is definitely
|
1257
|
+
* composite.
|
1211
1258
|
*
|
1212
|
-
* This function does some trial divisions, then some Miller-Rabin
|
1213
|
-
*
|
1214
|
-
*
|
1215
|
-
*
|
1259
|
+
* This function does some trial divisions, then some Miller-Rabin probabilistic
|
1260
|
+
* primality tests. +reps+ controls how many such tests are done, 5 to 10 is a reasonable
|
1261
|
+
* number, more will reduce the chances of a composite being returned as "probably
|
1262
|
+
* prime".
|
1216
1263
|
*
|
1217
|
-
* Miller-Rabin and similar tests can be more properly called compositeness
|
1218
|
-
*
|
1219
|
-
* might be
|
1220
|
-
*
|
1264
|
+
* Miller-Rabin and similar tests can be more properly called compositeness tests.
|
1265
|
+
* Numbers which fail are known to be composite but those which pass might be prime or
|
1266
|
+
* might be composite. Only a few composites pass, hence those which pass are considered
|
1267
|
+
* probably prime.
|
1221
1268
|
*/
|
1222
1269
|
VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self)
|
1223
1270
|
{
|
@@ -1241,34 +1288,37 @@ VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self)
|
|
1241
1288
|
* Document-method: nextprime
|
1242
1289
|
*
|
1243
1290
|
* call-seq:
|
1244
|
-
*
|
1245
|
-
*
|
1291
|
+
* n.nextprime
|
1292
|
+
* n.next_prime
|
1246
1293
|
*
|
1247
|
-
*
|
1248
|
-
*
|
1249
|
-
* Returns the next prime greater than +integer+.
|
1294
|
+
* Returns the next prime greater than _n_.
|
1250
1295
|
*
|
1251
|
-
* This function uses a probabilistic algorithm to identify primes. For
|
1252
|
-
*
|
1253
|
-
* extremely small.
|
1296
|
+
* This function uses a probabilistic algorithm to identify primes. For practical
|
1297
|
+
* purposes it's adequate, the chance of a composite passing will be extremely small.
|
1254
1298
|
*/
|
1255
1299
|
/*
|
1256
1300
|
* Document-method: nextprime!
|
1257
1301
|
*
|
1258
1302
|
* call-seq:
|
1259
|
-
*
|
1260
|
-
*
|
1303
|
+
* n.nextprime!
|
1304
|
+
* n.next_prime!
|
1261
1305
|
*
|
1262
|
-
*
|
1263
|
-
*
|
1264
|
-
* Sets +integer+ to the next prime greater than +integer+.
|
1306
|
+
* Sets _n_ to the next prime greater than _n_.
|
1265
1307
|
*
|
1266
|
-
* This function uses a probabilistic algorithm to identify primes. For
|
1267
|
-
*
|
1268
|
-
* extremely small.
|
1308
|
+
* This function uses a probabilistic algorithm to identify primes. For practical
|
1309
|
+
* purposes it's adequate, the chance of a composite passing will be extremely small.
|
1269
1310
|
*/
|
1270
1311
|
DEFUN_INT2INT(nextprime, mpz_nextprime)
|
1271
1312
|
|
1313
|
+
/*
|
1314
|
+
* call-seq:
|
1315
|
+
* a.gcd(b)
|
1316
|
+
*
|
1317
|
+
* @since 0.2.11
|
1318
|
+
*
|
1319
|
+
* Returns the greatest common divisor of a and b. The result is always positive even if
|
1320
|
+
* one or both of _a_ or _b_ are negative.
|
1321
|
+
*/
|
1272
1322
|
VALUE r_gmpz_gcd(VALUE self, VALUE arg)
|
1273
1323
|
{
|
1274
1324
|
MP_INT *self_val, *arg_val, *res_val;
|
@@ -1293,6 +1343,66 @@ VALUE r_gmpz_gcd(VALUE self, VALUE arg)
|
|
1293
1343
|
return res;
|
1294
1344
|
}
|
1295
1345
|
|
1346
|
+
/*
|
1347
|
+
* call-seq:
|
1348
|
+
* a.gcdext(b) #=> g, s, t
|
1349
|
+
*
|
1350
|
+
* @since 0.5.23
|
1351
|
+
*
|
1352
|
+
* Returns the greatest common divisor of _a_ and _b_, in addition to _s_ and _t_, the
|
1353
|
+
* coefficients satisfying <i>a*s + b*t = g</i>. _g_ is always positive, even if one or
|
1354
|
+
* both of _a_ and _b_ are negative. _s_ and _t_ are chosen such that
|
1355
|
+
* <i>abs(s) <= abs(b)</i> and <i>abs(t) <= abs(a)</i>.
|
1356
|
+
*/
|
1357
|
+
VALUE r_gmpz_gcdext(VALUE self, VALUE arg)
|
1358
|
+
{
|
1359
|
+
MP_INT *self_val, *arg_val, *res_val, *s_val, *t_val;
|
1360
|
+
VALUE res, s, t, ary;
|
1361
|
+
int free_arg_val = 0;
|
1362
|
+
|
1363
|
+
mpz_get_struct (self,self_val);
|
1364
|
+
|
1365
|
+
if (GMPZ_P (arg)) {
|
1366
|
+
mpz_make_struct_init (res, res_val);
|
1367
|
+
mpz_make_struct_init (s, s_val);
|
1368
|
+
mpz_make_struct_init (t, t_val);
|
1369
|
+
mpz_get_struct (arg, arg_val);
|
1370
|
+
mpz_gcdext (res_val, s_val, t_val, self_val, arg_val);
|
1371
|
+
} else if (FIXNUM_P (arg)) {
|
1372
|
+
mpz_make_struct_init (res, res_val);
|
1373
|
+
mpz_make_struct_init (s, s_val);
|
1374
|
+
mpz_make_struct_init (t, t_val);
|
1375
|
+
mpz_temp_alloc(arg_val);
|
1376
|
+
mpz_init_set_ui(arg_val, FIX2NUM(arg));
|
1377
|
+
free_arg_val = 1;
|
1378
|
+
mpz_gcdext (res_val, s_val, t_val, self_val, arg_val);
|
1379
|
+
} else if (BIGNUM_P (arg)) {
|
1380
|
+
mpz_make_struct_init (res, res_val);
|
1381
|
+
mpz_make_struct_init (s, s_val);
|
1382
|
+
mpz_make_struct_init (t, t_val);
|
1383
|
+
mpz_set_bignum (res_val, arg);
|
1384
|
+
mpz_gcdext (res_val, s_val, t_val, res_val, self_val);
|
1385
|
+
} else {
|
1386
|
+
typeerror (ZXB);
|
1387
|
+
}
|
1388
|
+
|
1389
|
+
if (free_arg_val)
|
1390
|
+
mpz_temp_free(arg_val);
|
1391
|
+
|
1392
|
+
ary = rb_ary_new3(3, res, s, t);
|
1393
|
+
return ary;
|
1394
|
+
}
|
1395
|
+
|
1396
|
+
/*
|
1397
|
+
* call-seq:
|
1398
|
+
* a.invert(b)
|
1399
|
+
*
|
1400
|
+
* @since 0.2.11
|
1401
|
+
*
|
1402
|
+
* Returns the inverse of _a_ modulo _b_. If the inverse exists, the return value is
|
1403
|
+
* non-zero and the result will be non-negative and less than _b_. If an inverse doesn't
|
1404
|
+
* exist, the result is undefined.
|
1405
|
+
*/
|
1296
1406
|
VALUE r_gmpz_invert(VALUE self, VALUE arg)
|
1297
1407
|
{
|
1298
1408
|
MP_INT *self_val, *arg_val, *res_val;
|
@@ -1320,15 +1430,11 @@ VALUE r_gmpz_invert(VALUE self, VALUE arg)
|
|
1320
1430
|
}
|
1321
1431
|
|
1322
1432
|
/*
|
1323
|
-
* Document-method: jacobi
|
1324
|
-
*
|
1325
1433
|
* call-seq:
|
1326
1434
|
* a.jacobi(b)
|
1327
1435
|
*
|
1328
|
-
*
|
1329
|
-
*
|
1330
|
-
* Calculate the Jacobi symbol <tt>(a/b)</tt>. This is defined only for +b+
|
1331
|
-
* odd and positive.
|
1436
|
+
* Calculate the Jacobi symbol <i>(a/b)</i>. This is defined only for _b_ odd and
|
1437
|
+
* positive.
|
1332
1438
|
*/
|
1333
1439
|
VALUE r_gmpz_jacobi(VALUE self, VALUE b)
|
1334
1440
|
{
|
@@ -1345,15 +1451,11 @@ VALUE r_gmpz_jacobi(VALUE self, VALUE b)
|
|
1345
1451
|
}
|
1346
1452
|
|
1347
1453
|
/*
|
1348
|
-
* Document-method: GMP::Z.jacobi
|
1349
|
-
*
|
1350
1454
|
* call-seq:
|
1351
1455
|
* GMP::Z.jacobi(a, b)
|
1352
|
-
*
|
1353
|
-
* From the GMP Manual:
|
1354
1456
|
*
|
1355
|
-
* Calculate the Jacobi symbol <
|
1356
|
-
*
|
1457
|
+
* Calculate the Jacobi symbol <i>(a/b)</i>. This is defined only for _b_ odd and
|
1458
|
+
* positive.
|
1357
1459
|
*/
|
1358
1460
|
VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b)
|
1359
1461
|
{
|
@@ -1412,15 +1514,11 @@ VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b)
|
|
1412
1514
|
}
|
1413
1515
|
|
1414
1516
|
/*
|
1415
|
-
* Document-method: legendre
|
1416
|
-
*
|
1417
1517
|
* call-seq:
|
1418
1518
|
* a.legendre(p)
|
1419
1519
|
*
|
1420
|
-
*
|
1421
|
-
*
|
1422
|
-
* Calculate the Legendre symbol <tt>(a/p)</tt>. This is defined only for +p+
|
1423
|
-
* an odd positive prime, and for such +p+ it's identical to the Jacobi symbol.
|
1520
|
+
* Calculate the Legendre symbol <i>(a/p)</i>. This is defined only for _p_ an odd
|
1521
|
+
* positive prime, and for such _p_ it's identical to the Jacobi symbol.
|
1424
1522
|
*/
|
1425
1523
|
VALUE r_gmpz_legendre(VALUE self, VALUE p)
|
1426
1524
|
{
|
@@ -1439,15 +1537,11 @@ VALUE r_gmpz_legendre(VALUE self, VALUE p)
|
|
1439
1537
|
}
|
1440
1538
|
|
1441
1539
|
/*
|
1442
|
-
* Document-method: remove
|
1443
|
-
*
|
1444
1540
|
* call-seq:
|
1445
|
-
*
|
1541
|
+
* n.remove(f) #=> r, t
|
1446
1542
|
*
|
1447
|
-
*
|
1448
|
-
*
|
1449
|
-
* Remove all occurrences of the factor +factor+ from +integer+. The return
|
1450
|
-
* value is how many such occurrences were removed.
|
1543
|
+
* Remove all occurrences of the factor _f_ from _n_, returning the result as _r_. _t_,
|
1544
|
+
* how many such occurrences were removed, is also returned.
|
1451
1545
|
*/
|
1452
1546
|
VALUE r_gmpz_remove(VALUE self, VALUE arg)
|
1453
1547
|
{
|
@@ -1496,17 +1590,14 @@ VALUE r_gmpz_remove(VALUE self, VALUE arg)
|
|
1496
1590
|
* call-seq:
|
1497
1591
|
* GMP::Z.fac(n)
|
1498
1592
|
*
|
1499
|
-
*
|
1500
|
-
*
|
1501
|
-
* Returns <tt>n!</tt>, the factorial of +n+.
|
1593
|
+
* Returns <i>n!</i>, the factorial of _n_.
|
1502
1594
|
*
|
1503
1595
|
* Examples:
|
1504
|
-
*
|
1505
|
-
* GMP::Z.fac(
|
1506
|
-
* GMP::Z.fac(
|
1507
|
-
* GMP::Z.fac(
|
1508
|
-
* GMP::Z.fac(
|
1509
|
-
* GMP::Z.fac(4) #=> 24
|
1596
|
+
* * GMP::Z.fac(0) #=> 1
|
1597
|
+
* * GMP::Z.fac(1) #=> 1
|
1598
|
+
* * GMP::Z.fac(2) #=> 2
|
1599
|
+
* * GMP::Z.fac(3) #=> 6
|
1600
|
+
* * GMP::Z.fac(4) #=> 24
|
1510
1601
|
*/
|
1511
1602
|
DEFUN_INT_SINGLETON_UI(fac, mpz_fac_ui)
|
1512
1603
|
/*
|
@@ -1515,19 +1606,16 @@ DEFUN_INT_SINGLETON_UI(fac, mpz_fac_ui)
|
|
1515
1606
|
* call-seq:
|
1516
1607
|
* GMP::Z.fib(n)
|
1517
1608
|
*
|
1518
|
-
*
|
1519
|
-
*
|
1520
|
-
* Returns <tt>F[n]</tt>, the +n+th Fibonacci number.
|
1609
|
+
* Returns <i>F[n]</i>, the <i>n</i>th Fibonacci number.
|
1521
1610
|
*
|
1522
1611
|
* Examples:
|
1523
|
-
*
|
1524
|
-
* GMP::Z.fib(
|
1525
|
-
* GMP::Z.fib(
|
1526
|
-
* GMP::Z.
|
1527
|
-
* GMP::Z.fac(
|
1528
|
-
* GMP::Z.fac(
|
1529
|
-
* GMP::Z.fac(
|
1530
|
-
* GMP::Z.fac(7) #=> 13
|
1612
|
+
* * GMP::Z.fib(1) #=> 1
|
1613
|
+
* * GMP::Z.fib(2) #=> 1
|
1614
|
+
* * GMP::Z.fib(3) #=> 2
|
1615
|
+
* * GMP::Z.fac(4) #=> 3
|
1616
|
+
* * GMP::Z.fac(5) #=> 5
|
1617
|
+
* * GMP::Z.fac(6) #=> 8
|
1618
|
+
* * GMP::Z.fac(7) #=> 13
|
1531
1619
|
*/
|
1532
1620
|
DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
|
1533
1621
|
|
@@ -1536,6 +1624,12 @@ DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
|
|
1536
1624
|
* Integer Comparisons *
|
1537
1625
|
**********************************************************************/
|
1538
1626
|
|
1627
|
+
/*
|
1628
|
+
* call-seq:
|
1629
|
+
* a == b
|
1630
|
+
*
|
1631
|
+
* Returns true if _a_ is equal to _b_, and false otherwise.
|
1632
|
+
*/
|
1539
1633
|
VALUE r_gmpz_eq(VALUE self, VALUE arg)
|
1540
1634
|
{
|
1541
1635
|
MP_INT *self_val, *arg_val_z;
|
@@ -1597,6 +1691,16 @@ int mpz_cmp_value(MP_INT *OP, VALUE arg)
|
|
1597
1691
|
}
|
1598
1692
|
}
|
1599
1693
|
|
1694
|
+
/*
|
1695
|
+
* call-seq:
|
1696
|
+
* a <=> b
|
1697
|
+
*
|
1698
|
+
* Returns negative if _a_ is less than _b_.
|
1699
|
+
*
|
1700
|
+
* Returns 0 if _a_ is equal to _b_.
|
1701
|
+
*
|
1702
|
+
* Returns positive if _a_ is greater than _b_.
|
1703
|
+
*/
|
1600
1704
|
VALUE r_gmpz_cmp(VALUE self, VALUE arg)
|
1601
1705
|
{
|
1602
1706
|
MP_INT *self_val;
|
@@ -1615,39 +1719,49 @@ VALUE r_gmpz_cmp(VALUE self, VALUE arg)
|
|
1615
1719
|
* Document-method: <
|
1616
1720
|
*
|
1617
1721
|
* call-seq:
|
1618
|
-
*
|
1722
|
+
* a < b
|
1619
1723
|
*
|
1620
|
-
* Returns whether
|
1724
|
+
* Returns whether _a_ is strictly less than _b_.
|
1621
1725
|
*/
|
1622
1726
|
DEFUN_INT_CMP(lt,<)
|
1623
1727
|
/*
|
1624
1728
|
* Document-method: <=
|
1625
1729
|
*
|
1626
1730
|
* call-seq:
|
1627
|
-
*
|
1731
|
+
* a <= b
|
1628
1732
|
*
|
1629
|
-
* Returns whether
|
1733
|
+
* Returns whether _a_ is less than or equal to _b_.
|
1630
1734
|
*/
|
1631
1735
|
DEFUN_INT_CMP(le,<=)
|
1632
1736
|
/*
|
1633
1737
|
* Document-method: >
|
1634
1738
|
*
|
1635
1739
|
* call-seq:
|
1636
|
-
*
|
1740
|
+
* a > b
|
1637
1741
|
*
|
1638
|
-
* Returns whether
|
1742
|
+
* Returns whether _a_ is strictly greater than _b_.
|
1639
1743
|
*/
|
1640
1744
|
DEFUN_INT_CMP(gt,>)
|
1641
1745
|
/*
|
1642
1746
|
* Document-method: >=
|
1643
1747
|
*
|
1644
1748
|
* call-seq:
|
1645
|
-
*
|
1749
|
+
* a >= b
|
1646
1750
|
*
|
1647
|
-
* Returns whether
|
1751
|
+
* Returns whether _a_ is greater than or equal to _b_.
|
1648
1752
|
*/
|
1649
1753
|
DEFUN_INT_CMP(ge,>=)
|
1650
1754
|
|
1755
|
+
/*
|
1756
|
+
* call-seq:
|
1757
|
+
* a.cmpabs(b)
|
1758
|
+
*
|
1759
|
+
* Returns negative if abs(_a_) is less than abs(_b_).
|
1760
|
+
*
|
1761
|
+
* Returns 0 if abs(_a_) is equal to abs(_b_).
|
1762
|
+
*
|
1763
|
+
* Returns positive if abs(_a_) is greater than abs(_b_).
|
1764
|
+
*/
|
1651
1765
|
VALUE r_gmpz_cmpabs(VALUE self, VALUE arg)
|
1652
1766
|
{
|
1653
1767
|
MP_INT *arg_val_z, *self_val;
|
@@ -1686,11 +1800,9 @@ VALUE r_gmpz_cmpabs(VALUE self, VALUE arg)
|
|
1686
1800
|
|
1687
1801
|
/*
|
1688
1802
|
* call-seq:
|
1689
|
-
*
|
1803
|
+
* a.sgn
|
1690
1804
|
*
|
1691
|
-
*
|
1692
|
-
*
|
1693
|
-
* Returns +1 if +integer+ > 0, 0 if +integer+ == 0, and -1 if +integer+ < 0.
|
1805
|
+
* Returns +1 if _a_ > 0, 0 if _a_ == 0, and -1 if _a_ < 0.
|
1694
1806
|
*/
|
1695
1807
|
VALUE r_gmpz_sgn(VALUE self)
|
1696
1808
|
{
|
@@ -1699,10 +1811,15 @@ VALUE r_gmpz_sgn(VALUE self)
|
|
1699
1811
|
return INT2FIX(mpz_sgn(self_val));
|
1700
1812
|
}
|
1701
1813
|
|
1702
|
-
|
1703
1814
|
/*
|
1704
|
-
*
|
1705
|
-
*
|
1815
|
+
* call-seq:
|
1816
|
+
* a.eql?(b)
|
1817
|
+
*
|
1818
|
+
* @since 0.4.7
|
1819
|
+
*
|
1820
|
+
* Returns true if _a_ is equal to _b_. _a_ and _b_ must then be equal in cardinality,
|
1821
|
+
* and both be instances of GMP::Z. Otherwise, returns false. a.eql?(b) if and only if
|
1822
|
+
* a.hash == b.hash.
|
1706
1823
|
*/
|
1707
1824
|
VALUE r_gmpz_eql(VALUE self, VALUE arg)
|
1708
1825
|
{
|
@@ -1718,6 +1835,16 @@ VALUE r_gmpz_eql(VALUE self, VALUE arg)
|
|
1718
1835
|
}
|
1719
1836
|
}
|
1720
1837
|
|
1838
|
+
/*
|
1839
|
+
* call-seq:
|
1840
|
+
* a.hash
|
1841
|
+
*
|
1842
|
+
* @since 0.4.7
|
1843
|
+
*
|
1844
|
+
* Returns the computed hash value of _a_. This method first converts _a_ into a String
|
1845
|
+
* (base 10), then calls String#hash on the result, returning the hash value. a.eql?(b)
|
1846
|
+
* if and only if a.hash == b.hash.
|
1847
|
+
*/
|
1721
1848
|
VALUE r_gmpz_hash(VALUE self)
|
1722
1849
|
{
|
1723
1850
|
ID to_s_sym = rb_intern("to_s");
|
@@ -1734,33 +1861,36 @@ VALUE r_gmpz_hash(VALUE self)
|
|
1734
1861
|
* Document-method: &
|
1735
1862
|
*
|
1736
1863
|
* call-seq:
|
1737
|
-
*
|
1864
|
+
* a & b
|
1738
1865
|
*
|
1739
|
-
*
|
1740
|
-
*
|
1741
|
-
*
|
1866
|
+
* Returns _a_ bitwise-and _b_. _b_ must be an instance of one of the following:
|
1867
|
+
* * GMP::Z
|
1868
|
+
* * Fixnum
|
1869
|
+
* * Bignum
|
1742
1870
|
*/
|
1743
1871
|
DEFUN_INT_LOGIC(and, mpz_and)
|
1744
1872
|
/*
|
1745
1873
|
* Document-method: |
|
1746
1874
|
*
|
1747
1875
|
* call-seq:
|
1748
|
-
*
|
1876
|
+
* a | b
|
1749
1877
|
*
|
1750
|
-
*
|
1751
|
-
*
|
1752
|
-
*
|
1878
|
+
* Returns _a_ bitwise inclusive-or _b_. _b_ must be an instance of one of the following:
|
1879
|
+
* * GMP::Z
|
1880
|
+
* * Fixnum
|
1881
|
+
* * Bignum
|
1753
1882
|
*/
|
1754
1883
|
DEFUN_INT_LOGIC(or, mpz_ior)
|
1755
1884
|
/*
|
1756
1885
|
* Document-method: ^
|
1757
1886
|
*
|
1758
1887
|
* call-seq:
|
1759
|
-
*
|
1888
|
+
* a ^ b
|
1760
1889
|
*
|
1761
|
-
*
|
1762
|
-
*
|
1763
|
-
*
|
1890
|
+
* Returns _a_ bitwise exclusive-or _b_. _b_ must be an instance of one of the following:
|
1891
|
+
* * GMP::Z
|
1892
|
+
* * Fixnum
|
1893
|
+
* * Bignum
|
1764
1894
|
*/
|
1765
1895
|
DEFUN_INT_LOGIC(xor, mpz_xor)
|
1766
1896
|
|
@@ -1768,21 +1898,17 @@ DEFUN_INT_LOGIC(xor, mpz_xor)
|
|
1768
1898
|
* Document-method: com
|
1769
1899
|
*
|
1770
1900
|
* call-seq:
|
1771
|
-
*
|
1901
|
+
* a.com
|
1772
1902
|
*
|
1773
|
-
*
|
1774
|
-
*
|
1775
|
-
* Returns the one's complement of +integer+.
|
1903
|
+
* Returns the one's complement of _a_.
|
1776
1904
|
*/
|
1777
1905
|
/*
|
1778
1906
|
* Document-method: com!
|
1779
1907
|
*
|
1780
1908
|
* call-seq:
|
1781
|
-
*
|
1909
|
+
* a.com!
|
1782
1910
|
*
|
1783
|
-
*
|
1784
|
-
*
|
1785
|
-
* Sets +integer+ to its one's complement.
|
1911
|
+
* Sets _a_ to its one's complement.
|
1786
1912
|
*/
|
1787
1913
|
DEFUN_INT2INT(com, mpz_com)
|
1788
1914
|
|
@@ -1790,14 +1916,11 @@ DEFUN_INT2INT(com, mpz_com)
|
|
1790
1916
|
* Document-method: popcount
|
1791
1917
|
*
|
1792
1918
|
* call-seq:
|
1793
|
-
*
|
1919
|
+
* a.popcount
|
1794
1920
|
*
|
1795
|
-
*
|
1796
|
-
*
|
1797
|
-
*
|
1798
|
-
* which is the number of 1 bits in the binary representation. If
|
1799
|
-
* <tt>op<0</tt>, the number of 1s is infinite, and the return value is
|
1800
|
-
* INT2FIX(ULONG_MAX), the largest possible unsigned long.
|
1921
|
+
* If _a_ >= 0, return the population count of _a_, which is the number of 1 bits in the
|
1922
|
+
* binary representation. If _a_ < 0, the number of 1s is infinite, and the return value
|
1923
|
+
* is INT2FIX(ULONG_MAX), the largest possible unsigned long.
|
1801
1924
|
*/
|
1802
1925
|
VALUE r_gmpz_popcount(VALUE self)
|
1803
1926
|
{
|
@@ -1808,18 +1931,16 @@ VALUE r_gmpz_popcount(VALUE self)
|
|
1808
1931
|
|
1809
1932
|
/*
|
1810
1933
|
* call-seq:
|
1811
|
-
*
|
1934
|
+
* a.scan0(starting_bit)
|
1812
1935
|
*
|
1813
|
-
*
|
1814
|
-
*
|
1815
|
-
* Scan integer, starting from bit starting_bit, towards more significant bits,
|
1816
|
-
* until the first 0 bit is found. Return the index of the found bit.
|
1936
|
+
* Scan _a_, starting from bit _starting_bit_, towards more significant bits, until the
|
1937
|
+
* first 0 bit is found. Return the index of the found bit.
|
1817
1938
|
*
|
1818
|
-
* If the bit at
|
1939
|
+
* If the bit at _starting_bit_ is already what's sought, then _starting_bit_ is
|
1819
1940
|
* returned.
|
1820
1941
|
*
|
1821
|
-
* If there's no bit found, then INT2FIX(ULONG_MAX) is returned. This will
|
1822
|
-
*
|
1942
|
+
* If there's no bit found, then INT2FIX(ULONG_MAX) is returned. This will happen in
|
1943
|
+
* scan0 past the end of a negative number.
|
1823
1944
|
*/
|
1824
1945
|
VALUE r_gmpz_scan0(VALUE self, VALUE bitnr)
|
1825
1946
|
{
|
@@ -1836,18 +1957,16 @@ VALUE r_gmpz_scan0(VALUE self, VALUE bitnr)
|
|
1836
1957
|
|
1837
1958
|
/*
|
1838
1959
|
* call-seq:
|
1839
|
-
*
|
1960
|
+
* a.scan1(starting_bit)
|
1840
1961
|
*
|
1841
|
-
*
|
1962
|
+
* Scan _a_, starting from bit _starting_bit_, towards more significant bits, until the
|
1963
|
+
* first 1 bit is found. Return the index of the found bit.
|
1842
1964
|
*
|
1843
|
-
*
|
1844
|
-
* until the first 1 bit is found. Return the index of the found bit.
|
1845
|
-
*
|
1846
|
-
* If the bit at starting_bit is already what's sought, then starting_bit is
|
1965
|
+
* If the bit at _starting_bit_ is already what's sought, then _starting_bit_ is
|
1847
1966
|
* returned.
|
1848
1967
|
*
|
1849
|
-
* If there's no bit found, then INT2FIX(ULONG_MAX) is returned. This will
|
1850
|
-
*
|
1968
|
+
* If there's no bit found, then INT2FIX(ULONG_MAX) is returned. This will happen in
|
1969
|
+
* scan1 past the end of a nonnegative number.
|
1851
1970
|
*/
|
1852
1971
|
VALUE r_gmpz_scan1(VALUE self, VALUE bitnr)
|
1853
1972
|
{
|
@@ -1867,9 +1986,9 @@ VALUE r_gmpz_scan1(VALUE self, VALUE bitnr)
|
|
1867
1986
|
|
1868
1987
|
/*
|
1869
1988
|
* call-seq:
|
1870
|
-
*
|
1989
|
+
* a[index] = x
|
1871
1990
|
*
|
1872
|
-
* Sets the bit at
|
1991
|
+
* Sets the bit at _index_ to _x_.
|
1873
1992
|
*/
|
1874
1993
|
VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to)
|
1875
1994
|
{
|
@@ -1896,9 +2015,9 @@ VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to)
|
|
1896
2015
|
|
1897
2016
|
/*
|
1898
2017
|
* call-seq:
|
1899
|
-
*
|
2018
|
+
* a[index] #=> boolean
|
1900
2019
|
*
|
1901
|
-
* Gets the bit at
|
2020
|
+
* Gets the bit at _index_, returned as either true or false.
|
1902
2021
|
*/
|
1903
2022
|
VALUE r_gmpz_getbit(VALUE self, VALUE bitnr)
|
1904
2023
|
{
|
@@ -1922,25 +2041,33 @@ VALUE r_gmpz_getbit(VALUE self, VALUE bitnr)
|
|
1922
2041
|
* Document-method: even?
|
1923
2042
|
*
|
1924
2043
|
* call-seq:
|
1925
|
-
*
|
2044
|
+
* a.even?
|
1926
2045
|
*
|
1927
|
-
*
|
1928
|
-
*
|
1929
|
-
* Determines whether integer is even. Returns true or false.
|
2046
|
+
* Determines whether _a_ is even. Returns true or false.
|
1930
2047
|
*/
|
1931
2048
|
DEFUN_INT_COND_P(is_even,mpz_even_p)
|
1932
2049
|
/*
|
1933
2050
|
* Document-method: odd?
|
1934
2051
|
*
|
1935
2052
|
* call-seq:
|
1936
|
-
*
|
2053
|
+
* a.odd?
|
1937
2054
|
*
|
1938
|
-
*
|
1939
|
-
*
|
1940
|
-
* Determines whether integer is odd. Returns true or false.
|
2055
|
+
* Determines whether _a_ is odd. Returns true or false.
|
1941
2056
|
*/
|
1942
2057
|
DEFUN_INT_COND_P(is_odd,mpz_odd_p)
|
1943
2058
|
|
2059
|
+
/*
|
2060
|
+
* call-seq:
|
2061
|
+
* a.sizeinbase
|
2062
|
+
* a.size_in_base
|
2063
|
+
*
|
2064
|
+
* @since 0.2.11
|
2065
|
+
*
|
2066
|
+
* Return the size of _a_ measured in number of digits in the given base. base can vary
|
2067
|
+
* from 2 to 62. The sign of _a_ is ignored, just the absolute value is used. The result
|
2068
|
+
* will be either exact or 1 too big. If base is a power of 2, the result is always
|
2069
|
+
* exact. If _a_ is zero the return value is always 1.
|
2070
|
+
*/
|
1944
2071
|
VALUE r_gmpz_sizeinbase(VALUE self, VALUE base)
|
1945
2072
|
{
|
1946
2073
|
MP_INT *self_val;
|
@@ -1950,6 +2077,15 @@ VALUE r_gmpz_sizeinbase(VALUE self, VALUE base)
|
|
1950
2077
|
return INT2FIX (mpz_sizeinbase (self_val, base_val));
|
1951
2078
|
}
|
1952
2079
|
|
2080
|
+
/*
|
2081
|
+
* call-seq:
|
2082
|
+
* a.size_in_bin
|
2083
|
+
*
|
2084
|
+
* @since 0.2.11
|
2085
|
+
*
|
2086
|
+
* Return the size of _a_ measured in number of digits in binary. The sign of _a_ is
|
2087
|
+
* ignored, just the absolute value is used. If _a_ is zero the return value is 1.
|
2088
|
+
*/
|
1953
2089
|
VALUE r_gmpz_size_in_bin(VALUE self)
|
1954
2090
|
{
|
1955
2091
|
MP_INT *self_val;
|
@@ -1963,15 +2099,13 @@ VALUE r_gmpz_size_in_bin(VALUE self)
|
|
1963
2099
|
**********************************************************************/
|
1964
2100
|
|
1965
2101
|
/*
|
1966
|
-
* Document-method: size
|
1967
|
-
*
|
1968
2102
|
* call-seq:
|
1969
|
-
*
|
2103
|
+
* a.size
|
1970
2104
|
*
|
1971
|
-
*
|
1972
|
-
*
|
1973
|
-
* Return the size of
|
1974
|
-
*
|
2105
|
+
* @since 0.4.19
|
2106
|
+
*
|
2107
|
+
* Return the size of _a_ measured in number of limbs. If _a_ is zero, the returned
|
2108
|
+
* value will be zero.
|
1975
2109
|
*/
|
1976
2110
|
VALUE r_gmpz_size(VALUE self)
|
1977
2111
|
{
|
@@ -1985,28 +2119,10 @@ VALUE r_gmpz_size(VALUE self)
|
|
1985
2119
|
* _unsorted_ *
|
1986
2120
|
**********************************************************************/
|
1987
2121
|
|
1988
|
-
DEFUN_INT_F_UL(fshr,mpz_fdiv_q_2exp,"shift size")
|
1989
|
-
DEFUN_INT_F_UL(tshr,mpz_tdiv_q_2exp,"shift size")
|
1990
|
-
DEFUN_INT_F_UL(fshrm,mpz_fdiv_r_2exp,"mark size")
|
1991
|
-
DEFUN_INT_F_UL(tshrm,mpz_tdiv_r_2exp,"mark size")
|
1992
|
-
|
1993
|
-
VALUE r_gmpzsg_pow(VALUE klass, VALUE base, VALUE exp)
|
1994
|
-
{
|
1995
|
-
MP_INT *res_val;
|
1996
|
-
VALUE res;
|
1997
2122
|
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
rb_raise (rb_eRangeError, "base must not be negative");
|
2002
|
-
if (FIX2NUM(exp) < 0)
|
2003
|
-
rb_raise (rb_eRangeError, "exponent must not be negative");
|
2004
|
-
mpz_make_struct_init (res, res_val);
|
2005
|
-
mpz_ui_pow_ui (res_val, FIX2NUM(base), FIX2NUM(exp));
|
2006
|
-
return res;
|
2007
|
-
}
|
2008
|
-
return r_gmpz_pow (r_gmpzsg_new(1, &base, klass), exp);
|
2009
|
-
}
|
2123
|
+
/**********************************************************************
|
2124
|
+
* Init function *
|
2125
|
+
**********************************************************************/
|
2010
2126
|
|
2011
2127
|
void init_gmpz()
|
2012
2128
|
{
|
@@ -2017,8 +2133,8 @@ void init_gmpz()
|
|
2017
2133
|
|
2018
2134
|
// Initializing, Assigning Integers
|
2019
2135
|
rb_define_singleton_method(cGMP_Z, "new", r_gmpzsg_new, -1);
|
2020
|
-
rb_define_method(cGMP_Z, "initialize",
|
2021
|
-
rb_define_method(cGMP_Z, "swap",
|
2136
|
+
rb_define_method(cGMP_Z, "initialize", r_gmpz_initialize, -1);
|
2137
|
+
rb_define_method(cGMP_Z, "swap", r_gmpz_swap, 1);
|
2022
2138
|
|
2023
2139
|
// Converting Integers
|
2024
2140
|
rb_define_method(cGMP_Z, "to_i", r_gmpz_to_i, 0);
|
@@ -2032,6 +2148,7 @@ void init_gmpz()
|
|
2032
2148
|
rb_define_method(cGMP_Z, "sub!", r_gmpz_sub_self, 1);
|
2033
2149
|
rb_define_method(cGMP_Z, "*", r_gmpz_mul, 1);
|
2034
2150
|
rb_define_method(cGMP_Z, "addmul!", r_gmpz_addmul_self, 2);
|
2151
|
+
rb_define_method(cGMP_Z, "submul!", r_gmpz_submul_self, 2);
|
2035
2152
|
rb_define_method(cGMP_Z, "<<", r_gmpz_shl, 1);
|
2036
2153
|
rb_define_method(cGMP_Z, "neg", r_gmpz_neg, 0);
|
2037
2154
|
rb_define_method(cGMP_Z, "neg!", r_gmpz_neg_self, 0);
|
@@ -2040,14 +2157,17 @@ void init_gmpz()
|
|
2040
2157
|
rb_define_method(cGMP_Z, "abs!", r_gmpz_abs_self, 0);
|
2041
2158
|
|
2042
2159
|
// Integer Division
|
2043
|
-
rb_define_method(cGMP_Z, "/",
|
2044
|
-
rb_define_method(cGMP_Z, "tdiv",
|
2045
|
-
rb_define_method(cGMP_Z, "tmod",
|
2046
|
-
rb_define_method(cGMP_Z, "
|
2047
|
-
rb_define_method(cGMP_Z, "
|
2048
|
-
rb_define_method(cGMP_Z, "
|
2049
|
-
rb_define_method(cGMP_Z, "
|
2050
|
-
rb_define_method(cGMP_Z, "
|
2160
|
+
rb_define_method(cGMP_Z, "/", r_gmpz_div, 1);
|
2161
|
+
rb_define_method(cGMP_Z, "tdiv", r_gmpz_tdiv, 1);
|
2162
|
+
rb_define_method(cGMP_Z, "tmod", r_gmpz_tmod, 1);
|
2163
|
+
rb_define_method(cGMP_Z, "tshr", r_gmpz_tshr, 1);
|
2164
|
+
rb_define_method(cGMP_Z, "lastbits_sgn", r_gmpz_tshrm, 1);
|
2165
|
+
rb_define_method(cGMP_Z, "fdiv", r_gmpz_fdiv, 1);
|
2166
|
+
rb_define_method(cGMP_Z, "fmod", r_gmpz_fmod, 1);
|
2167
|
+
rb_define_method(cGMP_Z, "cdiv", r_gmpz_cdiv, 1);
|
2168
|
+
rb_define_method(cGMP_Z, "cmod", r_gmpz_cmod, 1);
|
2169
|
+
rb_define_method(cGMP_Z, "%", r_gmpz_mod, 1);
|
2170
|
+
rb_define_method(cGMP_Z, "divisible?", r_gmpz_divisible, 1);
|
2051
2171
|
|
2052
2172
|
// Integer Exponentiation
|
2053
2173
|
rb_define_singleton_method(cGMP_Z, "pow", r_gmpzsg_pow, 2);
|
@@ -2069,6 +2189,7 @@ void init_gmpz()
|
|
2069
2189
|
rb_define_alias( cGMP_Z, "next_prime", "nextprime");
|
2070
2190
|
rb_define_alias( cGMP_Z, "next_prime!", "nextprime!");
|
2071
2191
|
rb_define_method( cGMP_Z, "gcd", r_gmpz_gcd, 1);
|
2192
|
+
rb_define_method( cGMP_Z, "gcdext", r_gmpz_gcdext, 1);
|
2072
2193
|
rb_define_method( cGMP_Z, "invert", r_gmpz_invert, 1);
|
2073
2194
|
rb_define_method( cGMP_Z, "jacobi", r_gmpz_jacobi, 1);
|
2074
2195
|
rb_define_singleton_method(cGMP_Z, "jacobi", r_gmpzsg_jacobi, 2);
|
@@ -2114,8 +2235,6 @@ void init_gmpz()
|
|
2114
2235
|
|
2115
2236
|
// _unsorted_
|
2116
2237
|
rb_define_method(cGMP_Z, ">>", r_gmpz_fshr, 1);
|
2117
|
-
rb_define_method(cGMP_Z, "tshr", r_gmpz_tshr, 1);
|
2118
|
-
rb_define_method(cGMP_Z, "lastbits_sgn", r_gmpz_tshrm, 1);
|
2119
2238
|
rb_define_method(cGMP_Z, "lastbits_pos", r_gmpz_fshrm, 1);
|
2120
2239
|
|
2121
2240
|
}
|