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/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
- * also contains many methods that act as the functions for mpq_t variables,
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_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 arg as its value, converting where
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 +GMP::Q.new(arg)+.
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
- * rat1.swap rat2
107
+ * p.swap(q)
100
108
  *
101
- * Efficiently swaps the contents of +rat1+ with +rat2+.
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
- * rational.to_d
133
+ * p.to_d
126
134
  *
127
- * Returns +rational+ as an Float if +rational+ fits in a Float.
135
+ * Returns _p_ as an Float if _p_ fits in a Float.
128
136
  *
129
- * Otherwise returns the least significant part of +rational+, with the same
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
- * then the result is system dependent. For too big an infinity is returned
134
- * when available. For too small 0.0 is normally returned. Hardware overflow,
135
- * underflow and denorm traps may or may not occur.
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
- * rational.to_s
154
+ * p.to_s
150
155
  *
151
- * Returns the decimal representation of +rational+, as a Ruby string.
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
- * rat1 + rat2
200
+ * p + q
196
201
  *
197
- * Adds +rat1+ to +rat2+. +rat2+ can be
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
- * rat1 - rat2
252
+ * p - q
248
253
  *
249
- * Subtracts +rat2+ from +rat1+. +rat2+ can be
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
- * rat1 * rat2
307
+ * p * q
303
308
  *
304
- * Multiplies +rat1+ with +rat2+. +rat2+ can be
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
- * rat1 / rat2
379
+ * p / q
375
380
  *
376
- * Divides +rat1+ by +rat2+. +rat2+ can be
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
- * -rational
445
- * rational.neg
449
+ * a.neg
450
+ * -a
446
451
  *
447
- * From the GMP Manual:
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
- * rational.neg!
458
+ * a.neg!
466
459
  *
467
- * From the GMP Manual:
468
- *
469
- * Sets +rational+ to -+rational+.
460
+ * Sets _a_ to -_a_.
470
461
  */
471
- VALUE r_gmpq_neg_self(VALUE self)
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
- * Document-method: abs
465
+ * call-seq:
466
+ * p.abs
481
467
  *
468
+ * Returns the absolute value of _p_.
469
+ */
470
+ /*
482
471
  * call-seq:
483
- * rational.abs
472
+ * p.abs!
484
473
  *
485
- * From the GMP Manual:
486
- *
487
- * Returns the absolute value of +rational+.
474
+ * Sets _p_ to its absolute value.
488
475
  */
489
- VALUE r_gmpq_abs(VALUE self)
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
- * rational.abs!
480
+ * p.inv
506
481
  *
507
- * From the GMP Manual:
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
- * rational.sgn
678
+ * p.sgn
708
679
  *
709
- * From the GMP Manual:
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, "+", r_gmpq_add, 1);
765
- rb_define_method(cGMP_Q, "-", r_gmpq_sub, 1);
766
- rb_define_method(cGMP_Q, "*", r_gmpq_mul, 1);
767
- rb_define_method(cGMP_Q, "/", r_gmpq_div, 1);
768
- rb_define_method(cGMP_Q, "-@", r_gmpq_neg, 0);
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, "inv", r_gmpq_inv, 0);
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(arg = 0)
189
+ * GMP::Z.new(value = 0)
261
190
  *
262
- * Creates a new GMP::Z integer, with +arg+ as its value, converting where
263
- * necessary.
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 +a+ to the value of +b+. +b+ may be one of the following
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(arg)
267
+ * GMP::Z(value)
325
268
  *
326
- * A convenience method for +GMP::Z.new(arg)+.
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
- * int1.swap int2
279
+ * a.swap(b)
337
280
  *
338
- * Efficiently swaps the contents of +int1+ with +int2+.
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
- * integer.to_i
304
+ * a.to_i
305
+ *
306
+ * @todo Implement mpz_fits_slong_p
360
307
  *
361
- * Returns +integer+ as an Fixnum if +integer+ fits in a Fixnum.
308
+ * Returns _a_ as an Fixnum if _a_ fits into a Fixnum.
362
309
  *
363
- * Otherwise returns the least significant part of +integer+, with the same
364
- * sign as +integer+.
310
+ * Otherwise returns the least significant part of _a_, with the same sign as _a_.
365
311
  *
366
- * If +integer+ is too big to fit in a Fixnum, the returned result is probably
367
- * not very useful. To find out if the value will fit, use the function
368
- * mpz_fits_slong_p (<b>Unimplemented</b>).
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
- * integer.to_d
333
+ * a.to_d
388
334
  *
389
- * Returns +integer+ as an Float if +integer+ fits in a Float.
335
+ * @todo Implement mpz_fits_slong_p
390
336
  *
391
- * Otherwise returns the least significant part of +integer+, with the same
392
- * sign as +integer+.
337
+ * Returns _a_ as a Float if _a_ fits in a Float.
393
338
  *
394
- * If +integer+ is too big to fit in a Float, the returned result is probably
395
- * not very useful. To find out if the value will fit, use the function
396
- * mpz_fits_slong_p (<b>Unimplemented</b>).
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
- * integer.to_s(base = 10)
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 +integer+, as a Ruby string. If +base+ is not provided, then
413
- * the string will be the decimal representation.
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 +integer+ to a string of digits in base +base+. The +base+ argument
418
- * may vary from 2 to 62 or from -2 to -36.
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 +base+ in the range 2..36, digits and lower-case letters are used; for
421
- * -2..-36, digits and upper-case letters are used; for 37..62, digits,
422
- * upper-case letters, and lower-case letters (in that significance order) are
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
- * +(other)
433
+ * a + b
484
434
  *
485
- * Adds this GMP::Z to other. Other can be
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!(other)
480
+ * a.add!(_b_)
531
481
  *
532
- * Adds this GMP::Z to other, and sets this GMP::Z's value to the result. Other
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
- * -(other)
515
+ * a - b
567
516
  *
568
- * Subtracts other from this GMP::Z. Other can be
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!(other)
567
+ * a.sub!(b)
619
568
  *
620
- * Subtracts other from this GMP::Z, and sets this GMP::Z's value to the
621
- * result. Other can be
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
- * *(other)
603
+ * a * b
655
604
  *
656
- * Multiplies this GMP::Z with other. Other can be
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
- * From the GMP Manual:
700
- *
701
- * Sets +a+ to +a+ plus +b+ times +c+.
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
- * integer << n
756
+ * a << n
751
757
  *
752
- * From the GMP Manual:
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
- * integer.neg
764
- * -integer
767
+ * a.neg
768
+ * -a
765
769
  *
766
- * From the GMP Manual:
767
- *
768
- * Returns -+integer+.
770
+ * Returns -_a_.
769
771
  */
770
772
  /*
771
773
  * Document-method: neg!
772
774
  *
773
775
  * call-seq:
774
- * integer.neg!
776
+ * a.neg!
775
777
  *
776
- * From the GMP Manual:
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
- * integer.abs
785
+ * a.abs
786
786
  *
787
- * From the GMP Manual:
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
- * integer.abs!
793
+ * a.abs!
796
794
  *
797
- * From the GMP Manual:
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
- * provide what one is hopefully looking for. The result will either be
814
- * an instance of GMP::Q or GMP::F, depending on _b_. _b_ can be an
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 d
885
- *
886
- * From the GMP Manual:
879
+ * n.tdiv(d)
887
880
  *
888
- * Divides +n+ by +d+, forming a quotient +q+. tdiv rounds +q+ towards zero.
889
- * The +t+ stands for "truncate".
881
+ * Divides _n_ by _d_, forming a quotient _q_. tdiv rounds _q_ towards zero. The _t_
882
+ * stands for "truncate".
890
883
  *
891
- * +q+ will satisfy <tt>n=q*d+r</tt>, and +r+ will satisfy
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 d
902
- *
903
- * From the GMP Manual:
893
+ * n.tmod(d)
904
894
  *
905
- * Divides +n+ by +d+, forming a remainder +r+. +r+ will have the same sign as
906
- * +n+. The +t+ stands for truncate�.
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
- * +r+ will satisfy <tt>n=q*d+r</tt>, and +r+ will satisfy
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
- * the remainder.
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 d
926
+ * n.fdiv(d)
922
927
  *
923
- * From the GMP Manual:
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
- * q will satisfy n=q*d+r.
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 d
940
+ * n.fmod(d)
938
941
  *
939
- * From the GMP Manual:
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
- * r will satisfy n=q*d+r, and r will satisfy 0<=abs(r)<abs(d).
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
- * the remainder.
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 d
960
+ * n.cdiv(d)
957
961
  *
958
- * From the GMP Manual:
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
- * +q+ will satisfy <tt>n=q*d+r</tt>.
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 d
974
+ * n.cmod(d)
973
975
  *
974
- * From the GMP Manual:
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
- * +r+ will satisfy <tt>n=q*d+r</tt>, and +r+ will satisfy
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
- * integer ** exp
1070
+ * a ** b
1029
1071
  *
1030
- * From the GMP Manual:
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
- * integer.powmod(exp, mod)
1080
+ * GMP::Z.pow(a, b)
1039
1081
  *
1040
- * From the GMP Manual:
1041
- *
1042
- * Returns +integer+ raised to +exp+ modulo +mod+.
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
- * Negative +exp+ is supported if an inverse <tt>integer^-1</tt> mod
1045
- * <tt>mod</tt> exists. If an inverse doesn't exist then a divide by zero is
1046
- * raised.
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
- * GMP::Z.root(m, n)
1179
+ * a.root(b)
1117
1180
  *
1118
- * From the GMP Manual:
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
- * integer.sqrt
1189
+ * a.sqrt
1129
1190
  *
1130
- * From the GMP Manual:
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
- * integer.sqrt!
1197
+ * a.sqrt!
1139
1198
  *
1140
- * From the GMP Manual:
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
- * integer.sqrtrem #=> sqrt, rem
1205
+ * a.sqrtrem #=> s, r
1151
1206
  *
1152
- * From the GMP Manual:
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
- * integer.power?
1226
+ * p.power?
1175
1227
  *
1176
- * From the GMP Manual:
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
- * Negative values of integers are accepted, but of course can only be odd
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
- * integer.square?
1239
+ * p.square?
1191
1240
  *
1192
- * From the GMP Manual:
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: probab_prime?(reps = 5)
1252
+ * call-seq:
1253
+ * n.probab_prime?(reps = 5)
1207
1254
  *
1208
- * Determine whether +n+ is prime. Returns 2 if +n+ is definitely prime,
1209
- * returns 1 if +n+ is probably prime (without being certain), or returns 0 if
1210
- * +n+ is definitely composite.
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
- * probabilistic primality tests. +reps+ controls how many such tests are done,
1214
- * 5 to 10 is a reasonable number, more will reduce the chances of a composite
1215
- * being returned as "probably prime".
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
- * tests. Numbers which fail are known to be composite but those which pass
1219
- * might be prime or might be composite. Only a few composites pass, hence
1220
- * those which pass are considered probably prime.
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
- * integer.nextprime
1245
- * integer.next_prime
1291
+ * n.nextprime
1292
+ * n.next_prime
1246
1293
  *
1247
- * From the GMP Manual:
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
- * practical purposes it's adequate, the chance of a composite passing will be
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
- * integer.nextprime!
1260
- * integer.next_prime!
1303
+ * n.nextprime!
1304
+ * n.next_prime!
1261
1305
  *
1262
- * From the GMP Manual:
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
- * practical purposes it's adequate, the chance of a composite passing will be
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
- * From the GMP Manual:
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 <tt>(a/b)</tt>. This is defined only for +b+
1356
- * odd and positive.
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
- * From the GMP Manual:
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
- * integer.remove(factor)
1541
+ * n.remove(f) #=> r, t
1446
1542
  *
1447
- * From the GMP Manual:
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
- * From the GMP Manual:
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(0) #=> 1
1506
- * GMP::Z.fac(1) #=> 1
1507
- * GMP::Z.fac(2) #=> 2
1508
- * GMP::Z.fac(3) #=> 6
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
- * From the GMP Manual:
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(1) #=> 1
1525
- * GMP::Z.fib(2) #=> 1
1526
- * GMP::Z.fib(3) #=> 2
1527
- * GMP::Z.fac(4) #=> 3
1528
- * GMP::Z.fac(5) #=> 5
1529
- * GMP::Z.fac(6) #=> 8
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
- * int1 < int2
1722
+ * a < b
1619
1723
  *
1620
- * Returns whether +int1+ is strictly less than +int2+.
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
- * int1 <= int2
1731
+ * a <= b
1628
1732
  *
1629
- * Returns whether +int1+ is less than or equal to +int2+.
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
- * int1 > int2
1740
+ * a > b
1637
1741
  *
1638
- * Returns whether +int1+ is strictly greater than +int2+.
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
- * int1 >= int2
1749
+ * a >= b
1646
1750
  *
1647
- * Returns whether +int1+ is greater than or equal to +int2+.
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
- * integer.sgn
1803
+ * a.sgn
1690
1804
  *
1691
- * From the GMP Manual:
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
- * eql? and hash are defined so that GMP::Z objects can be used as keys in
1705
- * hashes.
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
- * integer & other
1864
+ * a & b
1738
1865
  *
1739
- * From the GMP Manual:
1740
- *
1741
- * Returns +integer+ bitwise-and +other+.
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
- * integer | other
1876
+ * a | b
1749
1877
  *
1750
- * From the GMP Manual:
1751
- *
1752
- * Returns +integer+ bitwise inclusive-or +other+.
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
- * integer ^ other
1888
+ * a ^ b
1760
1889
  *
1761
- * From the GMP Manual:
1762
- *
1763
- * Returns +integer+ bitwise exclusive-or +other+.
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
- * integer.com
1901
+ * a.com
1772
1902
  *
1773
- * From the GMP Manual:
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
- * integer.com!
1909
+ * a.com!
1782
1910
  *
1783
- * From the GMP Manual:
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
- * integer.popcount
1919
+ * a.popcount
1794
1920
  *
1795
- * From the GMP Manual:
1796
- *
1797
- * If <tt>integer>=0</tt>, return the population count of <tt>integer</tt>,
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
- * integer.scan0(starting_bit)
1934
+ * a.scan0(starting_bit)
1812
1935
  *
1813
- * From the GMP Manual:
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 starting_bit is already what's sought, then starting_bit is
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
- * happen in scan0 past the end of a negative number.
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
- * integer.scan1(starting_bit)
1960
+ * a.scan1(starting_bit)
1840
1961
  *
1841
- * From the GMP Manual:
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
- * Scan integer, starting from bit starting_bit, towards more significant bits,
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
- * happen in mpz_scan1 past the end of a nonnegative number.
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
- * integer[index] = x &rarr; nil
1989
+ * a[index] = x
1871
1990
  *
1872
- * Sets the bit at index to x.
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
- * integer[index] &rarr; boolean
2018
+ * a[index] #=> boolean
1900
2019
  *
1901
- * Gets the bit at index, returned as either true or false.
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
- * integer.even?
2044
+ * a.even?
1926
2045
  *
1927
- * From the GMP Manual:
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
- * integer.odd?
2053
+ * a.odd?
1937
2054
  *
1938
- * From the GMP Manual:
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
- * integer.size
2103
+ * a.size
1970
2104
  *
1971
- * From the GMP Manual:
1972
- *
1973
- * Return the size of <tt>integer</tt> measured in number of limbs. If
1974
- * <tt>integer</tt> is zero, the returned value will be zero.
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
- if (FIXNUM_P(base) && FIXNUM_P(exp))
1999
- {
2000
- if (FIX2NUM(base) < 0)
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", r_gmpz_initialize, -1);
2021
- rb_define_method(cGMP_Z, "swap", r_gmpz_swap, 1);
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, "/", r_gmpz_div, 1);
2044
- rb_define_method(cGMP_Z, "tdiv", r_gmpz_tdiv, 1);
2045
- rb_define_method(cGMP_Z, "tmod", r_gmpz_tmod, 1);
2046
- rb_define_method(cGMP_Z, "fdiv", r_gmpz_fdiv, 1);
2047
- rb_define_method(cGMP_Z, "fmod", r_gmpz_fmod, 1);
2048
- rb_define_method(cGMP_Z, "cdiv", r_gmpz_cdiv, 1);
2049
- rb_define_method(cGMP_Z, "cmod", r_gmpz_cmod, 1);
2050
- rb_define_method(cGMP_Z, "%", r_gmpz_mod, 1);
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
  }