gmp 0.6.31 → 0.6.41

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8f050d69659030fb11abceaf21d1ad265ac6d696
4
+ data.tar.gz: e15d7ae348a201bb6f5d53754141939128fa96ac
5
+ SHA512:
6
+ metadata.gz: 10b8ea24e97956f68d0315211113c2b93642c16aaeb40ff767c45d5137a79b252ae2d94b5136ba4e230de2a5cf4aa3ff3f308ab51b5f8f2dc9a22d932eaa5d56
7
+ data.tar.gz: 55ebb541e81d2045a300006adc26926c8483ff3947618b21478abdba52c66eef89f0bf86e69fe2b6547427010ff60d1bab471d06ae1746bceff7041687873684
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ 0.6.41
2
+ * Added GMP::Z.fib2, with documentation and tests
3
+ * Properly coerce GMP::Q and Float. GMP::Q / Float will now convert both
4
+ operands into GMP::F
5
+ * Workaround Ruby 2.0.0 bug in using --with-gmp-dir in extconf.rb (#8047)
6
+ * Fixed bugs for Z#fac, Z#2fac, Z#primorial, Z#fib, and Z#lucnum, where Ruby
7
+ would crash if a negative number was passed in as the argument.
8
+ * Aliasing #inspect to #to_s for GMP::Z, GMP::Q, and GMP::F, for better
9
+ usability in Ruby 2.x, where Object#inspect no longer calls #to_s.
10
+ * Support now verified for Ruby 2.0.0 and Ruby 2.1.0-preview1
11
+
1
12
  0.6.31:
2
13
  * Added GMP::Z#rootrem and tests
3
14
 
@@ -106,8 +106,8 @@ Ext.onReady(function(){
106
106
  ['GMP::Z#remove', "mpz_remove", "yes","yes", "", "no"],
107
107
  ['GMP::Z.fac', "mpz_fac_ui", "yes","yes", "", "no"],
108
108
  ['', "mpz_bin_ui<br />mpz_bin_uiui", "no", "no", "no", "no"],
109
- ['GMP::Z.fib', "mpz_fib_ui", "yes","yes", "", "no"],
110
- ['', "mpz_fib2_ui", "no", "no", "no", "no"],
109
+ ['GMP::Z.fib', "mpz_fib_ui", "yes","yes","yes", "no"],
110
+ ['GMP::Z.fib2', "mpz_fib2_ui", "yes","yes","yes", "no"],
111
111
  ['', "mpz_lucnum_ui", "no", "no", "no", "no"],
112
112
  ['', "mpz_lucnum2_ui", "no", "no", "no", "no"],
113
113
  ['GMP::Z#==<br />GMP::Z#<=><br />' +
@@ -200,8 +200,8 @@ Ext.onReady(function(){
200
200
  ['GMP::Z#remove', "mpz_remove", "yes","yes", "", "no"],
201
201
  ['GMP::Z.fac', "mpz_fac_ui", "yes","yes", "", "no"],
202
202
  ['', "mpz_bin_ui<br />mpz_bin_uiui", "no", "no", "no", "no"],
203
- ['GMP::Z.fib', "mpz_fib_ui", "yes","yes", "", "no"],
204
- ['', "mpz_fib2_ui", "no", "no", "no", "no"],
203
+ ['GMP::Z.fib', "mpz_fib_ui", "yes","yes","yes", "no"],
204
+ ['GMP::Z.fib2', "mpz_fib2_ui", "yes","yes","yes", "no"],
205
205
  ['', "mpz_lucnum_ui", "no", "no", "no", "no"],
206
206
  ['', "mpz_lucnum2_ui", "no", "no", "no", "no"],
207
207
  ['GMP::Z#==<br />GMP::Z#<=><br />' +
@@ -47,8 +47,15 @@ paragraph at [their homepage](http://gmplib.org/#WHAT):
47
47
  > contributions, meaning users can safely use GMP. To achieve this, we will ask
48
48
  > contributors to sign paperwork where they allow us to distribute their work."
49
49
 
50
- Only GMP 4 or newer is supported. The following environments have been tested
51
- by me: gmp gem 0.5.47 on:
50
+ GMP 4.3.x and GMP 5.x are each supported against Ruby (MRI) 1.9.x, 2.0.0, and
51
+ 2.1.0. GMP 5.1.x is the only version of GMP that has been tested recently.
52
+ Other Ruby platforms (such as Rubinius and JRuby) should be supported, but have not
53
+ been tested recently.
54
+
55
+ ### Previously
56
+
57
+ Previously, on version 0.5.47, this gem was verified as functioning in the
58
+ following combinations:
52
59
 
53
60
  <table border="1">
54
61
  <tr>
@@ -217,14 +224,16 @@ Methods
217
224
  - substraction
218
225
  * multiplication
219
226
  / division
220
- to_s convert to string. For GMP::Z, this method takes
221
- one optional argument, a base. The base can be a
222
- Fixnum in the ranges \[2, 62\] or \[-36, -2\] or a
223
- Symbol: :bin, :oct, :dec, or :hex.
227
+ to_s convert to string. For GMP::Z and GMP::F, this
228
+ method takes one optional argument, a base. The
229
+ base can be a Fixnum in the ranges \[2, 62\] or
230
+ \[-36, -2\] or a Symbol: one of :bin, :oct,
231
+ :dec, or :hex.
232
+ inspect alias for #to_s
224
233
  -@ negation
225
234
  neg! in-place negation
226
235
  abs absolute value
227
- asb! in-place absolute value
236
+ abs! in-place absolute value
228
237
  coerce promotion of arguments
229
238
  == equality test
230
239
  <=>,>=,>,<=,< comparisions
@@ -233,7 +242,8 @@ Methods
233
242
  2fac(n), double_fac(n) double factorial of n
234
243
  mfac(n) m-multi-factorial of n
235
244
  primorial(n) primorial of n
236
- fib(n) nth fibonacci number
245
+ fib(n) nth Fibonacci number
246
+ fib2(n) nth and (n-1)th Fibonacci numbers
237
247
  pow(n,m) n to mth power
238
248
  GMP::Z and GMP::Q
239
249
  swap efficiently swap contents of two objects, there
@@ -406,6 +416,122 @@ Here's a fun list of all of the functional mappings written so far:
406
416
  .neg .nextprime .sqrt .sub .submul .tdiv_q_2exp
407
417
  .tdiv_r_2exp
408
418
 
419
+ Method Tables
420
+ -------------
421
+
422
+ The following is organized in the same categories as in the GMP and MPFR manuals.
423
+
424
+ ### Integer Functions
425
+
426
+ <table>
427
+ <tr><th colspan="2"><h4>Assigning Integers</h4></th></tr>
428
+ <tr><th>GMP Function</th><th>GMP::Z method</th></tr>
429
+ <tr><td>mpz_swap</td><td>GMP::Z#swap</td></tr>
430
+
431
+ <tr><th colspan="2"><h4>Converting Integers</h4>
432
+ 4x C functions mapped to 3x Ruby methods; 1x unmapped C function</th></tr>
433
+ <tr><th>GMP Function</th><th>GMP::Z method</th></tr>
434
+ <tr><td>mpz_get_ui<br />
435
+ mpz_get_si</td> <td>GMP::Z#to_i</td></tr>
436
+ <tr><td>mpz_get_d</td> <td>GMP::Z#to_d</td></tr>
437
+ <tr><td>mpz_get_d_2exp</td> <td><em>not implemented yet</em></td></tr>
438
+ <tr><td>mpz_get_str</td> <td>GMP::Z#to_s</td></tr>
439
+
440
+ <tr><th colspan="2"><h4>Integer Arithmetic</h4>
441
+ 12x C functions mapped to 19x Ruby methods; 2x unmapped C functions</th></tr>
442
+ <tr><th>GMP Function</th><th>GMP::Z method</th></tr>
443
+ <tr><td>mpz_add<br />
444
+ mpz_add_ui</td> <td>GMP::Z#+<br />
445
+ GMP::Z#add! (destructive method)<br />
446
+ GMP::Z.add (in-place singleton method)</td></tr>
447
+ <tr><td>mpz_sub<br />
448
+ mpz_sub_ui<br />
449
+ mpz_ui_sub (never used)</td> <td>GMP::Z#-<br />
450
+ GMP::Z#sub! (destructive method)<br />
451
+ GMP::Z.sub (in-place singleton method)</td></tr>
452
+ <tr><td>mpz_mul<br />
453
+ mpz_mul_si<br />
454
+ mpz_mul_ui (not used yet)</td><td>GMP::Z#*<br />
455
+ GMP::Z.mul (in-place singleton method)</td></tr>
456
+ <tr><td>mpz_addmul<br />
457
+ mpz_addmul_ui</td> <td>GMP::Z#addmul! (destructive method)<br />
458
+ GMP::Z.addmul (in-place singleton method)</td></tr>
459
+ <tr><td>mpz_submul<br />
460
+ mpz_submul_ui</td> <td>GMP::Z#submul! (destructive method)<br />
461
+ GMP::Z.submul (in-place singleton method)</td></tr>
462
+ <tr><td>mpz_mul_2exp</td> <td>GMP::Z.mul_2exp (in-place singleton method)</td></tr>
463
+ <tr><td>mpz_neg</td> <td>GMP::Z@-<br />
464
+ GMP::Z#neg! (destructive method)<br />
465
+ GMP::Z.neg (in-place singleton method)</td></tr>
466
+ <tr><td>mpz_abs</td> <td>GMP::Z#abs<br />
467
+ GMP::Z#abs! (destructive method)<br />
468
+ GMP::Z.abs (in-place singleton method)</td></tr>
469
+
470
+ <tr><th colspan="2"><h4>Integer Division</h4>
471
+ 26x C functions mapped to 18x Ruby methods; 11x unmapped C functions</th></tr>
472
+ <tr><th>GMP Function</th><th>GMP::Z method</th></tr>
473
+ <tr><td>mpz_cdiv_q<br />
474
+ mpz_cdiv_q_ui</td> <td>GMP::Z#cdiv</td></tr>
475
+ <tr><td>mpz_cdiv_r<br />
476
+ mpz_cdiv_r_ui</td> <td>GMP::Z#cmod</td></tr>
477
+ <tr><td>mpz_cdiv_qr<br />
478
+ mpz_cdiv_qr_ui</td> <td><em>not implemented yet</em></td></tr>
479
+ <tr><td>mpz_cdiv_ui</td> <td><em>not implemented yet</em></td></tr>
480
+ <tr><td>mpz_cdiv_q_2exp<br />
481
+ mpz_cdiv_r_2exp</td> <td>GMP::Z.cdiv_q_2exp (in-place singleton method)<br />
482
+ GMP::Z.cdiv_r_2exp (in-place singleton method)</td></tr>
483
+ <tr><td>mpz_fdiv_q<br />
484
+ mpz_fdiv_q_ui</td> <td>GMP::Z#fdiv</td></tr>
485
+ <tr><td>mpz_fdiv_r<br />
486
+ mpz_fdiv_r_ui</td> <td>GMP::Z#fmod</td></tr>
487
+ <tr><td>mpz_fdiv_qr<br />
488
+ mpz_fdiv_qr_ui</td> <td><em>not implemented yet</em></td></tr>
489
+ <tr><td>mpz_fdiv_ui</td> <td><em>not implemented yet</em></td></tr>
490
+ <tr><td>mpz_fdiv_q_2exp<br />
491
+ mpz_fdiv_r_2exp</td> <td>GMP::Z.fdiv_q_2exp (in-place singleton method)<br />
492
+ GMP::Z.fdiv_r_2exp (in-place singleton method)</td></tr>
493
+ <tr><td>mpz_tdiv_q<br />
494
+ mpz_tdiv_q_ui</td> <td>GMP::Z#tdiv</td></tr>
495
+ <tr><td>mpz_tdiv_r<br />
496
+ mpz_tdiv_r_ui</td> <td>GMP::Z#tmod</td></tr>
497
+ <tr><td>mpz_tdiv_qr<br />
498
+ mpz_tdiv_qr_ui</td> <td><em>not implemented yet</em></td></tr>
499
+ <tr><td>mpz_tdiv_ui</td> <td><em>not implemented yet</em></td></tr>
500
+ <tr><td>mpz_tdiv_q_2exp<br />
501
+ mpz_tdiv_r_2exp</td> <td>GMP::Z.tdiv_q_2exp (in-place singleton method)<br />
502
+ GMP::Z.tdiv_r_2exp (in-place singleton method)</td></tr>
503
+ <tr><td>mpz_mod<br />
504
+ mpz_mod_ui</td> <td>GMP::Z#mod</td></tr>
505
+ <tr><td>mpz_divexact<br />
506
+ mpz_divexact_ui</td> <td>GMP::Z.divexact (in-place singleton method)</td></tr>
507
+ <tr><td>mpz_divisible_p<br />
508
+ mpz_divisible_ui_p</td> <td>GMP::Z#divisible?<br />
509
+ GMP::Z.divisible? (in-place singleton method)</td></tr>
510
+ <tr><td>mpz_divisible_2exp_p</td> <td><em>not implemented yet</em></td></tr>
511
+ <tr><td>mpz_congruent_p<br />
512
+ mpz_congruent_ui_p</td> <td>GMP::Z#congruent?<br />
513
+ GMP::Z.congruent? (in-place singleton method)</td></tr>
514
+ <tr><td>mpz_congruent_2exp_p</td> <td><em>not implemented yet</em></td></tr>
515
+
516
+ <tr><th colspan="2"><h4>Integer Exponentiation</h4>
517
+
518
+ <tr><th colspan="2"><h4>Integer Roots</h4>
519
+
520
+ <tr><th colspan="2"><h4>Number Theoretic Functions</h4>
521
+
522
+ <tr><th colspan="2"><h4>Integer Comparisons</h4>
523
+
524
+ <tr><th colspan="2"><h4>Integer Logic and Bit Fiddling</h4>
525
+
526
+ <tr><th colspan="2"><h4>I/O of Integers</h4>
527
+
528
+ <tr><th colspan="2"><h4>Integer Random Numbers</h4>
529
+
530
+ <tr><th colspan="2"><h4>Integer Import and Export</h4>
531
+
532
+ <tr><th colspan="2"><h4>Miscellaneous Integer Functions</h4>
533
+ </table>
534
+
409
535
  Documentation
410
536
  -------------
411
537
 
@@ -417,18 +543,12 @@ Documentation
417
543
  Testing
418
544
  -------
419
545
 
420
- Tests can be run with:
421
-
422
- cd test
423
- ruby unit_tests.rb
546
+ Tests can be run with `rake test`. I like to run tests and print out a quick report of Ruby, GMP, and MPFR versions with `rake report`. You can precede any rake task with `GMP=gmp_install_dir` and `MPFR=mpfr_install_dir` (or `MPFR=--no-mpfr`) to pass `--with-gmp-dir` and `--with-mpfr-dir` options to `extconf.rb` as well.
424
547
 
425
- If you have the unit\_test gem installed, all tests should pass. Otherwise, one test may error. I imagine there is a bug in Ruby's built-in `Test::Unit` package that is fixed with the unit_test gem.
548
+ You can also run tests from an individual file with:
426
549
 
427
- You can also use the following shiny new rake tasks:
428
-
429
- rake test
430
- rake report
431
- MPFR=no-mpfr rake report
550
+ cd test
551
+ ruby some_test_file.rb
432
552
 
433
553
  Known Issues
434
554
  ------------
@@ -469,13 +589,14 @@ Please see [performance](https://github.com/srawlins/gmp/blob/master/performance
469
589
  Todo
470
590
  ----
471
591
 
472
- * `GMP::Z#to_d_2exp`, `#kronecker`, `#bin`, `#fib2`, `#lucnum`, `#lucnum2`, `#combit`, `#fits_x?`
592
+ * `GMP::Z#to_d_2exp`, `#kronecker`, `#bin`, `::lucnum2`, `#combit`, `#fits_x?`
473
593
  * `GMP::Q#to_s(base)`, `GMP::F#to_s(base)` (test it!)
474
594
  * benchmark pi
475
595
  * a butt-load of functional mappings. 47-ish sets.
476
596
  * investigate possible memory leaks when using `GMP::Q(22/7)` for example
477
597
  * beef up `r_gmpq_initialize`; I don't like to rely on `mpz_set_value`.
478
598
  * finish compile-results.rb
599
+ * check if `mpz_mul_ui` would optimize `GMP::Z#*`
479
600
  * New in MPFR 3.1.0: mpfr_frexp, mpfr_grandom, mpfr_z_sub, divide-by-zero exception (?)
480
601
  * JRuby doesn't like some MPFR stuff, specifically sqrt tests fail.
481
602
  * Rubinius in 1.9 mode fails a sprintf test in a minor way.
@@ -484,7 +605,6 @@ The below are inherited from Tomasz. I will go through these and see which are
484
605
  still relevant, and which I understand.
485
606
 
486
607
  * `mpz_fits_*` and 31 vs. 32 integer variables
487
- * fix all sign issues (don't know what these are)
488
608
  * check if `mpz_addmul_ui` would optimize some statements
489
609
  * some system that allows using denref and numref as normal ruby objects
490
610
  * takeover code that replaces all `Bignums` with `GMP::Z`
@@ -0,0 +1,32 @@
1
+ #! /bin/bash
2
+ source ~/.rvm/scripts/rvm
3
+
4
+ function out {
5
+ echo "========================================"
6
+ echo "$*"
7
+ echo "========================================"
8
+ }
9
+
10
+ echo "RUBY: `ruby -v`"
11
+ echo "GMP: `ruby -r '../ext/gmp' -e \"puts GMP::GMP_VERSION\"`"
12
+ echo "GMP_CC: `ruby -r '../ext/gmp' -e \"puts GMP::GMP_CC\"`"
13
+ echo "MPFR: `ruby -r '../ext/gmp' -e \"puts GMP::MPFR_VERSION\"`"
14
+
15
+ if [[ $1 == --help ]]; then
16
+ echo "bench.sh benchmark_directory ..."
17
+ exit 1
18
+ fi
19
+
20
+ ruby_version=`ruby -v |cut -d' ' -f 2`
21
+ PATH=.:$PATH
22
+ for directory in "$@"; do
23
+ out "Benchmarking in $directory..."
24
+ cd $directory
25
+ if [ ! -f runbench ]; then
26
+ echo "Oops, not a benchmark directory! 'runbench' does not exist."
27
+ else
28
+ echo "./runbench -n |tee ${ruby_version}.txt"
29
+ ./runbench -n |tee ${ruby_version}.txt
30
+ cd -
31
+ fi
32
+ done
@@ -0,0 +1 @@
1
+ sed 's/[ ]*GMPbench:[ ]*//' |sed 's/[ ]*GMPbench.[a-z]*.[a-z]*([0-9,]*)[ ]*/,,,/' |sed 's/[ ]*GMPbench.[a-z]*\.[a-z]*[ ]*/,,/' |sed 's/[ ]*GMPbench.[a-z]*[ ]*/,/' |sed 's/Program.*//' |sed 's/Category.*//'
@@ -2,6 +2,10 @@
2
2
 
3
3
  require 'mkmf'
4
4
 
5
+ # Workaround for Ruby bug #8074, introduced in Ruby 2.0.0, fixed in Ruby 2.1.0
6
+ # https://bugs.ruby-lang.org/issues/8074
7
+ @libdir_basename = "lib"
8
+
5
9
  dir_config('gmp')
6
10
  dir_config('mpfr')
7
11
 
data/ext/gmp.c CHANGED
@@ -27,7 +27,10 @@ static VALUE r_gmpz_coerce(VALUE self, VALUE arg)
27
27
 
28
28
  static VALUE r_gmpq_coerce(VALUE self, VALUE arg)
29
29
  {
30
- return rb_assoc_new(r_gmpqsg_new(1, &arg, cGMP_Q), self);
30
+ if (FLOAT_P(arg))
31
+ return rb_assoc_new(r_gmpfsg_new(1, &arg, cGMP_F), r_gmpfsg_new(1, &self, cGMP_F));
32
+ else
33
+ return rb_assoc_new(r_gmpqsg_new(1, &arg, cGMP_Q), self);
31
34
  }
32
35
 
33
36
  static VALUE r_gmpf_coerce(VALUE self, VALUE arg)
@@ -55,6 +58,34 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
55
58
  return Qnil;
56
59
  }
57
60
 
61
+ ID bin_base_id; /* binary */
62
+ ID oct_base_id; /* octal */
63
+ ID dec_base_id; /* decimal */
64
+ ID hex_base_id; /* hexadecimal */
65
+
66
+ int get_base(VALUE base_val) {
67
+ ID base_id;
68
+ int base = 10;
69
+
70
+ if (FIXNUM_P(base_val)) {
71
+ base = FIX2INT(base_val);
72
+
73
+ if ((base >= 2 && base <= 62) || (base >= -36 && base <= -2))
74
+ return base;
75
+ else
76
+ rb_raise(rb_eRangeError, "base must be within [2, 62] or [-36, -2].");
77
+ } else if (SYMBOL_P(base_val)) {
78
+ base_id = rb_to_id(base_val);
79
+ if (base_id == bin_base_id) return 2;
80
+ else if (base_id == oct_base_id) return 8;
81
+ else if (base_id == dec_base_id) return 10;
82
+ else if (base_id == hex_base_id) return 16;
83
+ else rb_raise(rb_eRangeError, "base must be within [2, 62] or [-36, -2].");
84
+ } else {
85
+ rb_raise(rb_eTypeError, "Expected Fixnum or one of :bin, :oct, :dec, :hex");
86
+ }
87
+ }
88
+
58
89
  VALUE r_gmpsg_sprintf2(VALUE klass, VALUE format, VALUE arg) {
59
90
  VALUE res;
60
91
  char *buffer;
@@ -128,6 +159,11 @@ mp_rnd_t r_get_rounding_mode(VALUE rnd)
128
159
  rb_define_method(rb_cBignum, ruby_fname, takeover_bignum_##fname, -1);
129
160
 
130
161
  void Init_gmp() {
162
+ bin_base_id = rb_intern("bin");
163
+ oct_base_id = rb_intern("oct");
164
+ dec_base_id = rb_intern("dec");
165
+ hex_base_id = rb_intern("hex");
166
+
131
167
  mGMP = rb_define_module("GMP");
132
168
  rb_define_const(mGMP, "GMP_VERSION", rb_str_new2(gmp_version));
133
169
  rb_define_const(mGMP, "GMP_CC", rb_str_new2(__GMP_CC));
data/ext/gmpf.c CHANGED
@@ -136,6 +136,8 @@ VALUE r_gmpf_initialize(int argc, VALUE *argv, VALUE self)
136
136
  }
137
137
 
138
138
  #else
139
+ (void)base;
140
+
139
141
  if (prec == 0)
140
142
  r_mpf_init (self_val);
141
143
  else
@@ -266,54 +268,17 @@ VALUE r_gmpf_to_s(int argc, VALUE *argv, VALUE self)
266
268
  char *str, *str2;
267
269
  VALUE res;
268
270
  mp_exp_t exponent;
269
-
270
- VALUE base;
271
- int base_val = 10;
272
- ID base_id;
273
- const char * bin_base = "bin"; /* binary */
274
- const char * oct_base = "oct"; /* octal */
275
- const char * dec_base = "dec"; /* decimal */
276
- const char * hex_base = "hex"; /* hexadecimal */
277
- ID bin_base_id = rb_intern(bin_base);
278
- ID oct_base_id = rb_intern(oct_base);
279
- ID dec_base_id = rb_intern(dec_base);
280
- ID hex_base_id = rb_intern(hex_base);
271
+ VALUE base_val;
272
+ int base = 10;
281
273
 
282
274
  mpf_get_struct(self, self_val);
283
275
 
284
276
  /* TODO: accept a second optional argument, n_digits */
285
- rb_scan_args (argc, argv, "01", &base);
286
-
287
- /* The entire following stanza is determining the base. */
288
- if (NIL_P (base)) { base = INT2FIX (10); } /* default value */
289
- if (FIXNUM_P (base)) {
290
- base_val = FIX2INT (base);
291
- if ((base_val >= 2 && base_val <= 62) ||
292
- (base_val >= -36 && base_val <= -2)) {
293
- /* good base */
294
- } else {
295
- base_val = 10;
296
- rb_raise (rb_eRangeError, "base must be within [2, 62] or [-36, -2].");
297
- }
298
- } else if (SYMBOL_P (base)) {
299
- base_id = rb_to_id (base);
300
- if (base_id == bin_base_id) {
301
- base_val = 2;
302
- } else if (base_id == oct_base_id) {
303
- base_val = 8;
304
- } else if (base_id == dec_base_id) {
305
- base_val = 10;
306
- } else if (base_id == hex_base_id) {
307
- base_val = 16;
308
- } else {
309
- base_val = 10; /* TODO: should raise an exception here. */
310
- }
311
- }
277
+ rb_scan_args(argc, argv, "01", &base_val);
278
+ if (NIL_P(base_val)) { base = 10; } /* default value */
279
+ else { base = get_base(base_val); }
312
280
 
313
- //mpfr_sprintf(str, "%Rf", self_val);
314
- //res = rb_str_new2(str);
315
-
316
- str = mpfr_get_str(NULL, &exponent, base_val, 0, self_val, __gmp_default_rounding_mode);
281
+ str = mpfr_get_str(NULL, &exponent, base, 0, self_val, __gmp_default_rounding_mode);
317
282
  if ((strcmp(str, "NaN") == 0) ||
318
283
  (strcmp(str, "Inf") == 0) ||
319
284
  (strcmp(str, "-Inf") == 0))
@@ -326,6 +291,7 @@ VALUE r_gmpf_to_s(int argc, VALUE *argv, VALUE self)
326
291
  __gmp_asprintf(&str2, "-0.%se%+ld", str+1, exponent);
327
292
  else
328
293
  __gmp_asprintf(&str2, "0.%se%+ld", str, exponent);
294
+
329
295
  res = rb_str_new2(str2);
330
296
  mpfr_free_str(str2);
331
297
  }
@@ -1288,6 +1254,7 @@ void init_gmpf()
1288
1254
 
1289
1255
  // Converting Floats
1290
1256
  rb_define_method(cGMP_F, "to_s", r_gmpf_to_s, -1);
1257
+ rb_define_alias(cGMP_F, "inspect", "to_s");
1291
1258
  rb_define_method(cGMP_F, "to_d", r_gmpf_to_d, 0);
1292
1259
  rb_define_alias(cGMP_F, "to_f", "to_d");
1293
1260
 
data/ext/gmpq.c CHANGED
@@ -807,12 +807,13 @@ void init_gmpq()
807
807
  // Initializing Rationals
808
808
  rb_define_singleton_method(cGMP_Q, "new", r_gmpqsg_new, -1);
809
809
  rb_define_method(cGMP_Q, "swap", r_gmpq_swap, 1);
810
-
810
+
811
811
  // Rational Conversions
812
812
  rb_define_method(cGMP_Q, "to_d", r_gmpq_to_d, 0);
813
813
  rb_define_alias(cGMP_Q, "to_f", "to_d");
814
814
  rb_define_method(cGMP_Q, "to_s", r_gmpq_to_s, 0);
815
-
815
+ rb_define_alias(cGMP_Q, "inspect", "to_s");
816
+
816
817
  // Rational Arithmetic
817
818
  rb_define_method(cGMP_Q, "+", r_gmpq_add, 1);
818
819
  rb_define_method(cGMP_Q, "-", r_gmpq_sub, 1);
data/ext/gmpz.c CHANGED
@@ -154,7 +154,7 @@ static VALUE r_gmpz_##fname(VALUE self, VALUE arg) \
154
154
  static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg) \
155
155
  { \
156
156
  MP_INT *arg_val_z, *res_val; \
157
- unsigned long arg_val_ul; \
157
+ long arg_val_ul; \
158
158
  VALUE res; \
159
159
  \
160
160
  (void)klass; \
@@ -165,17 +165,50 @@ static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg) \
165
165
  mpz_get_struct (arg, arg_val_z); \
166
166
  if (!mpz_fits_ulong_p (arg_val_z)) \
167
167
  rb_raise (rb_eRangeError, "argument out of range"); \
168
- arg_val_ul = mpz_get_ui (arg_val_z); \
169
- if (arg_val_ul == 0) \
170
- rb_raise (rb_eRangeError, "argument out of range"); \
168
+ arg_val_ul = mpz_get_si (arg_val_z); \
171
169
  } else { \
172
170
  typeerror_as (ZX, "argument"); \
173
171
  } \
172
+ \
173
+ if (arg_val_ul < 0) \
174
+ rb_raise (rb_eRangeError, "argument out of range"); \
175
+ \
174
176
  mpz_make_struct_init (res, res_val); \
175
- mpz_fname (res_val, arg_val_ul); \
177
+ mpz_fname (res_val, (unsigned long)arg_val_ul); \
178
+ \
176
179
  return res; \
177
180
  }
178
181
 
182
+ #define DEFUN_INT_SINGLETON_ZZ_UI(fname,mpz_fname) \
183
+ static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg) \
184
+ { \
185
+ MP_INT *arg_val_z, *res_val_1, *res_val_2; \
186
+ long arg_val_ul; \
187
+ VALUE res_1, res_2; \
188
+ \
189
+ (void)klass; \
190
+ \
191
+ if (FIXNUM_P (arg)) { \
192
+ arg_val_ul = FIX2NUM (arg); \
193
+ } else if (GMPZ_P (arg)) { \
194
+ mpz_get_struct (arg, arg_val_z); \
195
+ if (!mpz_fits_ulong_p (arg_val_z)) \
196
+ rb_raise (rb_eRangeError, "argument out of range"); \
197
+ arg_val_ul = mpz_get_si (arg_val_z); \
198
+ } else { \
199
+ typeerror_as (ZX, "argument"); \
200
+ } \
201
+ \
202
+ if (arg_val_ul < 0) \
203
+ rb_raise (rb_eRangeError, "argument out of range"); \
204
+ \
205
+ mpz_make_struct_init (res_1, res_val_1); \
206
+ mpz_make_struct_init (res_2, res_val_2); \
207
+ mpz_fname (res_val_1, res_val_2, (unsigned long)arg_val_ul); \
208
+ \
209
+ return rb_assoc_new(res_1, res_2); \
210
+ }
211
+
179
212
  #define DEFUN_INT_SINGLETON_UIUI(fname,mpz_fname) \
180
213
  static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg1, VALUE arg2) \
181
214
  { \
@@ -851,51 +884,20 @@ VALUE r_gmpz_to_d(VALUE self)
851
884
  * digits and upper-case letters are used; for 37..62, digits, upper-case letters, and
852
885
  * lower-case letters (in that significance order) are used.
853
886
  */
854
- VALUE r_gmpz_to_s(int argc, VALUE *argv, VALUE self)
887
+ VALUE r_gmpz_to_s(int argc, VALUE *argv, VALUE self_val)
855
888
  {
856
- MP_INT *self_val;
889
+ MP_INT *self;
857
890
  char *str;
858
891
  VALUE res;
859
- VALUE base;
860
- int base_val = 10;
861
- ID base_id;
862
- const char * bin_base = "bin"; /* binary */
863
- const char * oct_base = "oct"; /* octal */
864
- const char * dec_base = "dec"; /* decimal */
865
- const char * hex_base = "hex"; /* hexadecimal */
866
- ID bin_base_id = rb_intern(bin_base);
867
- ID oct_base_id = rb_intern(oct_base);
868
- ID dec_base_id = rb_intern(dec_base);
869
- ID hex_base_id = rb_intern(hex_base);
870
-
871
- rb_scan_args(argc, argv, "01", &base);
872
- if (NIL_P(base)) { base = INT2FIX(10); } /* default value */
873
- if (FIXNUM_P(base)) {
874
- base_val = FIX2INT(base);
875
- if ((base_val >= 2 && base_val <= 62) ||
876
- (base_val >= -36 && base_val <= -2)) {
877
- /* good base */
878
- } else {
879
- base_val = 10;
880
- rb_raise(rb_eRangeError, "base must be within [2, 62] or [-36, -2].");
881
- }
882
- } else if (SYMBOL_P(base)) {
883
- base_id = rb_to_id(base);
884
- if (base_id == bin_base_id) {
885
- base_val = 2;
886
- } else if (base_id == oct_base_id) {
887
- base_val = 8;
888
- } else if (base_id == dec_base_id) {
889
- base_val = 10;
890
- } else if (base_id == hex_base_id) {
891
- base_val = 16;
892
- } else {
893
- base_val = 10; /* should raise an exception here. */
894
- }
895
- }
892
+ VALUE base_val;
893
+ unsigned int base;
896
894
 
897
- Data_Get_Struct(self, MP_INT, self_val);
898
- str = mpz_get_str(NULL, base_val, self_val);
895
+ rb_scan_args(argc, argv, "01", &base_val);
896
+ if (NIL_P(base_val)) { base = 10; } /* default value */
897
+ else { base = get_base(base_val); }
898
+
899
+ Data_Get_Struct(self_val, MP_INT, self);
900
+ str = mpz_get_str(NULL, base, self);
899
901
  res = rb_str_new2(str);
900
902
  free (str);
901
903
 
@@ -1101,6 +1103,7 @@ VALUE r_gmpz_mul(VALUE self, VALUE arg)
1101
1103
  mpz_mul(res_val, self_val, arg_val);
1102
1104
  } else if (FIXNUM_P(arg)) {
1103
1105
  mpz_make_struct_init(res, res_val);
1106
+ /* TODO: use mpz_mul_ui */
1104
1107
  mpz_mul_si(res_val, self_val, FIX2NUM(arg));
1105
1108
  } else if (GMPQ_P(arg)) {
1106
1109
  return r_gmpq_mul(arg, self);
@@ -1293,6 +1296,12 @@ DEFUN_INT2INT(abs, mpz_abs)
1293
1296
  * * GMP::Q
1294
1297
  * * GMP::F
1295
1298
  * * Bignum
1299
+ *
1300
+ * If _b_ is a GMP::Z, Fixnum, GMP::Q, or Bignum, then no division is actually
1301
+ * performed. Instead, we simply construct a new GMP::Q number, using _a_ and
1302
+ * _b_ as the numerator and denominator (not exactly true for the GMP::Q case).
1303
+ *
1304
+ * If _b_ is a GMP::F, then the result is calculated via `mpf_div`.
1296
1305
  */
1297
1306
  VALUE r_gmpz_div(VALUE self, VALUE arg)
1298
1307
  {
@@ -2344,7 +2353,27 @@ DEFUN_INT_SINGLETON_UI(primorial, mpz_primorial_ui)
2344
2353
  * * GMP::Z.fib(6) #=> 8
2345
2354
  * * GMP::Z.fib(7) #=> 13
2346
2355
  */
2347
- DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
2356
+ DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
2357
+
2358
+ /*
2359
+ * Document-method: GMP::Z.fib2
2360
+ *
2361
+ * call-seq:
2362
+ * GMP::Z.fib2(n)
2363
+ *
2364
+ * Returns [<i>F[n]</i>, <i>F[n-1]</i>], the <i>n</i>th and <i>n-1</i>th Fibonacci numbers.
2365
+ *
2366
+ * Examples:
2367
+ * * GMP::Z.fib2(1) #=> [ 1, 0]
2368
+ * * GMP::Z.fib2(2) #=> [ 1, 1]
2369
+ * * GMP::Z.fib2(3) #=> [ 2, 1]
2370
+ * * GMP::Z.fib2(4) #=> [ 3, 2]
2371
+ * * GMP::Z.fib2(5) #=> [ 5, 3]
2372
+ * * GMP::Z.fib2(6) #=> [ 8, 5]
2373
+ * * GMP::Z.fib2(7) #=> [13, 8]
2374
+ */
2375
+ DEFUN_INT_SINGLETON_ZZ_UI(fib2, mpz_fib2_ui)
2376
+
2348
2377
  DEFUN_INT_SINGLETON_UI(lucnum, mpz_lucnum_ui)
2349
2378
 
2350
2379
 
@@ -3034,6 +3063,7 @@ void init_gmpz()
3034
3063
  rb_define_method(cGMP_Z, "to_i", r_gmpz_to_i, 0);
3035
3064
  rb_define_method(cGMP_Z, "to_d", r_gmpz_to_d, 0);
3036
3065
  rb_define_method(cGMP_Z, "to_s", r_gmpz_to_s, -1);
3066
+ rb_define_alias(cGMP_Z, "inspect", "to_s");
3037
3067
 
3038
3068
  // Integer Arithmetic
3039
3069
  rb_define_method(cGMP_Z, "+", r_gmpz_add, 1);
@@ -3122,6 +3152,7 @@ void init_gmpz()
3122
3152
  rb_define_singleton_method(cGMP_Z, "primorial", r_gmpzsg_primorial, 1);
3123
3153
  #endif
3124
3154
  rb_define_singleton_method(cGMP_Z, "fib", r_gmpzsg_fib, 1);
3155
+ rb_define_singleton_method(cGMP_Z, "fib2", r_gmpzsg_fib2, 1);
3125
3156
  rb_define_singleton_method(cGMP_Z, "lucnum", r_gmpzsg_lucnum, 1);
3126
3157
  // Functional Mappings
3127
3158
  rb_define_singleton_method(cGMP_Z, "lcm", r_gmpzsg_lcm, 3);
@@ -154,6 +154,8 @@ extern VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F, cGMP_RandState;
154
154
  extern VALUE cGMP_Rnd;
155
155
  #endif /* MPFR */
156
156
 
157
+ extern int get_base(VALUE base_val);
158
+
157
159
  extern void r_gmpz_free(void *ptr);
158
160
  extern void r_gmpq_free(void *ptr);
159
161
  extern void r_gmpf_free(void *ptr);
data/manual.pdf CHANGED
Binary file
data/manual.tex CHANGED
@@ -34,8 +34,8 @@
34
34
  \huge{gmp} &\\
35
35
  \midrule[3pt]
36
36
  \multicolumn{2}{r}{\large{Ruby bindings to the GMP library}}\\
37
- \multicolumn{2}{r}{\large{Edition 0.6.7}}\\
38
- \multicolumn{2}{r}{\large{9 December 2012}}
37
+ \multicolumn{2}{r}{\large{Edition 0.6.41}}\\
38
+ \multicolumn{2}{r}{\large{15 October 2013}}
39
39
  \end{tabular}
40
40
 
41
41
  \vfill
@@ -45,9 +45,9 @@
45
45
 
46
46
  \vfill
47
47
  This manual describes how to use the gmp Ruby gem, which provides bindings to
48
- the GNU multiple precision arithmetic library, version 4.3.x or 5.0.x.\\
48
+ the GNU multiple precision arithmetic library, version 4.3.x or 5.x.\\
49
49
  \\
50
- Copyright 2009, 2010, 2011, 2012 Sam Rawlins.\\
50
+ Copyright 2009, 2010, 2011, 2012, 2013 Sam Rawlins.\\
51
51
  No license yet.
52
52
  \newpage
53
53
 
@@ -143,9 +143,9 @@ OK. First, we've got a few requirements. To install the gmp gem, you need one
143
143
  of the following versions of Ruby:
144
144
  \begin{itemize}
145
145
  \item (MRI) Ruby 1.8.6 - tested lightly.
146
- \item (MRI) Ruby 1.8.7 - tested seriously.
147
- \item (MRI) Ruby 1.9.1 - tested seriously.
148
- \item (MRI) Ruby 1.9.2 - tested seriously.
146
+ \item (MRI) Ruby 1.8.7 - tested lightly.
147
+ \item (MRI) Ruby 1.9.3 - tested seriously.
148
+ \item (MRI) Ruby 2.0.0 - tested seriously.
149
149
  \item (REE) Ruby 1.8.7 - tested lightly.
150
150
  \item (RBX) Rubinius 1.1 - tested lightly.
151
151
  \end{itemize}
@@ -854,7 +854,17 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
854
854
  \textbf{fib} & & GMP::Z.fib($n$) $\rightarrow$ $integer$ \\
855
855
  \cmidrule(r){2-3}
856
856
  & \multicolumn{2}{p{\defnwidth}}{
857
- Returns $F[n]$, or, the $n$th Fibonacci number.
857
+ Returns $F[n]$, the $n$th Fibonacci number.
858
+ }
859
+ \end{tabular}
860
+ \newline\newline
861
+
862
+ \begin{tabular}{p{\methwidth} l r}
863
+ \toprule
864
+ \textbf{fib2} & & GMP::Z.fib2($n$) $\rightarrow$ $integer$ \\
865
+ \cmidrule(r){2-3}
866
+ & \multicolumn{2}{p{\defnwidth}}{
867
+ Returns $F[n]$ and $F[n-1]$, the $n$th and $n-1$th Fibonacci numbers.
858
868
  }
859
869
  \end{tabular}
860
870
 
@@ -15,23 +15,13 @@ class TC_division < Test::Unit::TestCase
15
15
  assert_equal(GMP::Q, (@a / 3 ).class, "GMP::Z / Fixnum should be GMP::Q.")
16
16
  assert_equal(GMP::Q, (@a / 2**32).class, "GMP::Z / Bignum should be GMP::Q.")
17
17
  assert_equal(GMP::Q, (@a / @c ).class, "GMP::Z / GMP::Z should be GMP::Q.")
18
- begin
18
+
19
19
  assert_in_delta(0.7142857142, @a / @b, 1e-7, "GMP::Z./ should work.")
20
20
  assert_in_delta(1.4 , @b / @a, 1e-7, "GMP::Z./ should work.")
21
21
  assert_in_delta(1.6666666667, @a / 3, 1e-7, "GMP::Z./ should work.")
22
22
  assert_in_delta(0.6 , 3 / @a, 1e-7, "GMP::Z./ should work.")
23
23
  assert_in_delta(0.2 , @a / @c, 1e-7, "GMP::Z./ should work.")
24
24
  assert_in_delta(5.0 , @c / @a, 1e-7, "GMP::Z./ should work.")
25
- rescue TypeError => e
26
- if e.message == "GMP::Q can't be coerced into Float"
27
- #puts ""
28
- print "[Suppressing error that should be fixed with a recent version of Test::Unit installed]"
29
- #puts "installed."
30
- else
31
- puts "Accidentally rescued TypeError with message \"#{e.message}\", raising..."
32
- raise e
33
- end
34
- end
35
25
  end
36
26
 
37
27
  def test_z_tdiv
@@ -63,13 +63,16 @@ class TC_F_to_s < Test::Unit::TestCase
63
63
  f = GMP::F(0.5)
64
64
  assert_equal("0.50000000000000000e+0", f.to_s)
65
65
  assert_equal("0.10000000000000000000000000000000000000000000000000000e+0", f.to_s(2))
66
+ assert_equal("0.10000000000000000000000000000000000000000000000000000e+0", f.to_s(:bin))
66
67
  assert_equal("0.11111111111111111111111111111111112e+0", f.to_s(3))
67
68
  assert_equal("0.200000000000000000000000000e+0", f.to_s(4))
69
+ assert_equal("0.50000000000000000e+0", f.inspect)
68
70
 
69
71
  g = GMP::F(0.8)
70
72
  assert_equal("0.80000000000000004e+0", g.to_s)
71
73
  assert_equal("0.21012101210121012101210121012101220e+0", g.to_s(3))
72
74
  assert_equal("0.400000000000000000000003e+0", g.to_s(5))
73
75
  assert_equal("0.k00000000002ge+0", g.to_s(25))
76
+ assert_equal("0.80000000000000004e+0", g.inspect)
74
77
  end
75
78
  end
@@ -2,15 +2,20 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
3
  class TC_fib_fac_nextprime < Test::Unit::TestCase
4
4
  def setup
5
- @z10 = GMP::Z.new(10)
5
+ @z0 = GMP::Z.new( 0)
6
+ @z1 = GMP::Z.new( 1)
7
+ @z2 = GMP::Z.new( 2)
6
8
  @z7 = GMP::Z.new( 7)
7
9
  @z8 = GMP::Z.new( 8)
10
+ @z10 = GMP::Z.new(10)
8
11
  @z11 = GMP::Z.new(11)
9
12
  @z13 = GMP::Z.new(13)
10
13
  @z17 = GMP::Z.new(17)
11
14
  @z19 = GMP::Z.new(19)
15
+ @z34 = GMP::Z.new(34)
16
+ @z55 = GMP::Z.new(55)
12
17
  end
13
-
18
+
14
19
  def test_fib
15
20
  assert_equal( 1, GMP::Z.fib( 1), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
16
21
  assert_equal( 1, GMP::Z.fib( 2), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
@@ -19,6 +24,7 @@ class TC_fib_fac_nextprime < Test::Unit::TestCase
19
24
  assert_equal( 5, GMP::Z.fib( 5), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
20
25
  assert_equal( 8, GMP::Z.fib( 6), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
21
26
  assert_equal( 13, GMP::Z.fib( 7), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
27
+ assert_equal( 13, GMP::Z.fib( @z7), "GMP::Z::fib(x : GMP::Z) should be calculated correctly.")
22
28
  assert_equal( 21, GMP::Z.fib( 8), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
23
29
  assert_equal( 34, GMP::Z.fib( 9), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
24
30
  assert_equal( 55, GMP::Z.fib( 10), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
@@ -27,8 +33,24 @@ class TC_fib_fac_nextprime < Test::Unit::TestCase
27
33
  assert_equal(144, GMP::Z.fib( 12), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
28
34
  assert_equal(233, GMP::Z.fib( 13), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
29
35
  assert_equal(377, GMP::Z.fib( 14), "GMP::Z::fib(x : Fixnum) should be calculated correctly.")
36
+
37
+ assert_raise(RangeError) { GMP::Z.fib(-1) }
38
+ assert_raise(RangeError) { GMP::Z.fib(GMP::Z(-1)) }
30
39
  end
31
-
40
+
41
+ def test_fib2
42
+ assert_equal([ @z1, @z0], GMP::Z.fib2( 1), "GMP::Z::fib2(x : Fixnum) should be calculated correctly.")
43
+ assert_equal([ @z1, @z1], GMP::Z.fib2( 2), "GMP::Z::fib2(x : Fixnum) should be calculated correctly.")
44
+ assert_equal([ @z2, @z1], GMP::Z.fib2( 3), "GMP::Z::fib2(x : Fixnum) should be calculated correctly.")
45
+ assert_equal([@z13, @z8], GMP::Z.fib2( 7), "GMP::Z::fib2(x : Fixnum) should be calculated correctly.")
46
+ assert_equal([@z13, @z8], GMP::Z.fib2( @z7), "GMP::Z::fib2(x : GMP::Z) should be calculated correctly.")
47
+ assert_equal([@z55,@z34], GMP::Z.fib2( 10), "GMP::Z::fib2(x : Fixnum) should be calculated correctly.")
48
+ assert_equal([@z55,@z34], GMP::Z.fib2(@z10), "GMP::Z::fib2(x : GMP::Z) should be calculated correctly.")
49
+
50
+ assert_raise(RangeError) { GMP::Z.fib2(-1) }
51
+ assert_raise(RangeError) { GMP::Z.fib2(GMP::Z(-1)) }
52
+ end
53
+
32
54
  def test_fac
33
55
  assert_equal( 1, GMP::Z.fac( 0), "GMP::Z::fac(x : Fixnum) should be calculated correctly.")
34
56
  assert_equal( 1, GMP::Z.fac( 1), "GMP::Z::fac(x : Fixnum) should be calculated correctly.")
@@ -38,6 +60,9 @@ class TC_fib_fac_nextprime < Test::Unit::TestCase
38
60
  assert_equal( 120, GMP::Z.fac( 5), "GMP::Z::fac(x : Fixnum) should be calculated correctly.")
39
61
  assert_equal( 720, GMP::Z.fac( 6), "GMP::Z::fac(x : Fixnum) should be calculated correctly.")
40
62
  assert_equal(5040, GMP::Z.fac( 7), "GMP::Z::fac(x : Fixnum) should be calculated correctly.")
63
+
64
+ assert_raise(RangeError) { GMP::Z.fac(-1) }
65
+ assert_raise(RangeError) { GMP::Z.fac(GMP::Z(-1)) }
41
66
  end
42
67
 
43
68
  def test_nextprime
@@ -115,5 +115,7 @@ class TC_Q < Test::Unit::TestCase
115
115
  assert_equal("0", GMP::Q(0,1).to_s, "GMP::Q should to_s properly.")
116
116
  assert_equal("0", GMP::Q(0,2000).to_s, "GMP::Q should to_s properly.")
117
117
  assert_equal("0", GMP::Q(0,-2000).to_s, "GMP::Q should to_s properly.")
118
+
119
+ assert_equal("1/2", GMP::Q(1,2).inspect, "GMP::Q should inspect properly.")
118
120
  end
119
121
  end
@@ -50,7 +50,7 @@ class TC_to_i_to_d < Test::Unit::TestCase
50
50
  assert_equal( "-726746425", @d.to_s(:oct), "GMP::Z should to_s correctly.")
51
51
  assert_equal( "-123456789", @d.to_s(:dec), "GMP::Z should to_s correctly.")
52
52
  assert_equal( "-75bcd15", @d.to_s(:hex), "GMP::Z should to_s correctly.")
53
-
53
+
54
54
  assert_equal("1", GMP::Z.new(1).to_s, "Z(1).to_s should equal '1'")
55
55
  assert_equal("-1", GMP::Z.new(-1).to_s, "Z(1).to_s should equal '-1'")
56
56
  assert_equal("1234567890", GMP::Z.new(1234567890).to_s, "GMP::Z should to_s correctly.")
@@ -65,5 +65,8 @@ class TC_to_i_to_d < Test::Unit::TestCase
65
65
  assert_equal("377", GMP::Z.new(255).to_s(:oct), "GMP::Z should to_s(:oct) correctly.")
66
66
  assert_equal("255", GMP::Z.new(255).to_s(:dec), "GMP::Z should to_s(:dec) correctly.")
67
67
  assert_equal("ff", GMP::Z.new(255).to_s(:hex), "GMP::Z should to_s(:hex) correctly.")
68
+
69
+ assert_equal("1", GMP::Z.new(1).inspect, "Z(1).inspect should equal '1'")
70
+ assert_equal("-1", GMP::Z.new(-1).inspect, "Z(1).inspect should equal '-1'")
68
71
  end
69
72
  end
@@ -1,55 +1,55 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- #require './test_helper'
3
+ DIR = File.expand_path(File.dirname(__FILE__))
4
4
 
5
- require './tc_constants'
6
- require './tc_division'
7
- require './tc_f_precision'
8
- require './tc_f_arithmetics_coersion'
9
- require './tc_f_to_s'
10
- require './tc_z'
11
- require './tc_z_basic'
12
- require './tc_z_addmul'
13
- require './tc_z_submul'
14
- require './tc_z_logic'
15
- require './tc_z_exponentiation'
16
- require './tc_z_export_import'
17
- require './tc_z_hamdist'
18
- require './tc_z_io'
19
- require './tc_z_to_dis'
20
- require './tc_z_shifts_last_bits'
21
- require './tc_z_jac_leg_rem'
22
- require './tc_z_gcd_lcm_invert'
23
- require './tc_q'
24
- require './tc_q_basic'
25
- require './tc_cmp'
26
- require './tc_zerodivisionexceptions'
27
- require './tc_sgn_neg_abs'
28
- require './tc_fib_fac_nextprime'
29
- require './tc_swap'
30
- require './tc_floor_ceil_truncate'
31
- require './tc_logical_roots'
32
- require './tc_random'
33
- require './tc_hashes'
34
- require './tc_z_functional_mappings'
5
+ require File.join(DIR, 'tc_constants')
6
+ require File.join(DIR, 'tc_division')
7
+ require File.join(DIR, 'tc_f_precision')
8
+ require File.join(DIR, 'tc_f_arithmetics_coersion')
9
+ require File.join(DIR, 'tc_f_to_s')
10
+ require File.join(DIR, 'tc_z')
11
+ require File.join(DIR, 'tc_z_basic')
12
+ require File.join(DIR, 'tc_z_addmul')
13
+ require File.join(DIR, 'tc_z_submul')
14
+ require File.join(DIR, 'tc_z_logic')
15
+ require File.join(DIR, 'tc_z_exponentiation')
16
+ require File.join(DIR, 'tc_z_export_import')
17
+ require File.join(DIR, 'tc_z_hamdist')
18
+ require File.join(DIR, 'tc_z_io')
19
+ require File.join(DIR, 'tc_z_to_dis')
20
+ require File.join(DIR, 'tc_z_shifts_last_bits')
21
+ require File.join(DIR, 'tc_z_jac_leg_rem')
22
+ require File.join(DIR, 'tc_z_gcd_lcm_invert')
23
+ require File.join(DIR, 'tc_q')
24
+ require File.join(DIR, 'tc_q_basic')
25
+ require File.join(DIR, 'tc_cmp')
26
+ require File.join(DIR, 'tc_zerodivisionexceptions')
27
+ require File.join(DIR, 'tc_sgn_neg_abs')
28
+ require File.join(DIR, 'tc_fib_fac_nextprime')
29
+ require File.join(DIR, 'tc_swap')
30
+ require File.join(DIR, 'tc_floor_ceil_truncate')
31
+ require File.join(DIR, 'tc_logical_roots')
32
+ require File.join(DIR, 'tc_random')
33
+ require File.join(DIR, 'tc_hashes')
34
+ require File.join(DIR, 'tc_z_functional_mappings')
35
35
 
36
- require './gmp_tcong'
37
- require './gmp_tgcd'
38
- require './gmp_tlcm'
39
- require './gmp_tprintf'
40
- require './gmp_troot'
36
+ require File.join(DIR, 'gmp_tcong')
37
+ require File.join(DIR, 'gmp_tgcd')
38
+ require File.join(DIR, 'gmp_tlcm')
39
+ require File.join(DIR, 'gmp_tprintf')
40
+ require File.join(DIR, 'gmp_troot')
41
41
 
42
42
  begin
43
43
  GMP::MPFR_VERSION
44
- require './tc_mpfr_constants'
45
- require './tc_mpfr_integer'
46
- require './tc_mpfr_random'
47
- require './tc_mpfr_functions'
48
- require './tc_mpfr_rounding'
49
- require './mpfr_tcbrt'
50
- require './mpfr_tisnan'
51
- require './mpfr_trec_sqrt'
52
- require './mpfr_tsqrt'
44
+ require File.join(DIR, 'tc_mpfr_constants')
45
+ require File.join(DIR, 'tc_mpfr_integer')
46
+ require File.join(DIR, 'tc_mpfr_random')
47
+ require File.join(DIR, 'tc_mpfr_functions')
48
+ require File.join(DIR, 'tc_mpfr_rounding')
49
+ require File.join(DIR, 'mpfr_tcbrt')
50
+ require File.join(DIR, 'mpfr_tisnan')
51
+ require File.join(DIR, 'mpfr_trec_sqrt')
52
+ require File.join(DIR, 'mpfr_tsqrt')
53
53
  rescue
54
54
 
55
55
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.31
5
- prerelease:
4
+ version: 0.6.41
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tomasz Wegrzanowski
@@ -10,7 +9,7 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-02-06 00:00:00.000000000 Z
12
+ date: 2013-10-15 00:00:00.000000000 Z
14
13
  dependencies: []
15
14
  description: gmp - providing Ruby bindings to the GMP library.
16
15
  email:
@@ -89,8 +88,11 @@ files:
89
88
  - test/unit_tests.rb
90
89
  - test/README
91
90
  - test/test_unit/assertions.rb
92
- - benchmark/benchmark-results-5.0.5_1.9.3_0.6.7.ods
93
- - benchmark/benchmark-results-5.1.0_0.6.19.ods
91
+ - benchmark/bench.sh
92
+ - benchmark/csv.sh
93
+ - benchmark/results-5.0.5_1.9.3_0.6.7.ods
94
+ - benchmark/results-5.1.0_0.6.19.ods
95
+ - benchmark/results-5.1.3_0.6.31.ods
94
96
  - CHANGELOG
95
97
  - INSTALL
96
98
  - README.html
@@ -103,28 +105,26 @@ files:
103
105
  - performance.2012.pdf
104
106
  homepage: http://github.com/srawlins/gmp
105
107
  licenses: []
108
+ metadata: {}
106
109
  post_install_message:
107
110
  rdoc_options: []
108
111
  require_paths:
109
112
  - lib
110
113
  required_ruby_version: !ruby/object:Gem::Requirement
111
- none: false
112
114
  requirements:
113
- - - ! '>='
115
+ - - ">="
114
116
  - !ruby/object:Gem::Version
115
117
  version: 1.8.6
116
118
  required_rubygems_version: !ruby/object:Gem::Requirement
117
- none: false
118
119
  requirements:
119
- - - ! '>='
120
+ - - ">="
120
121
  - !ruby/object:Gem::Version
121
122
  version: '0'
122
123
  requirements:
123
124
  - GMP compiled and working properly.
124
125
  rubyforge_project:
125
- rubygems_version: 1.8.24
126
+ rubygems_version: 2.1.8
126
127
  signing_key:
127
- specification_version: 3
128
+ specification_version: 4
128
129
  summary: Provides Ruby bindings to the GMP library.
129
130
  test_files: []
130
- has_rdoc: yard