gmp 0.6.7 → 0.6.13

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ 0.6.13:
2
+ * Added three new GMP::Z methods for GMP 5.1.x: GMP::Z#2fac
3
+ (GMP::Z#double_fac), GMP::Z#mfac, and GMP::Z#primorial
4
+ * Fixed a compilation bug when MPFR is not available.
5
+ * Fixed test bugs when MPFR is not available.
6
+ * Tweaked README documentation
7
+ * Added GMP::Z method: GMP::Z#hamdist, with minimal tests
8
+
1
9
  0.6.7:
2
10
  * Added 9th set of Functional Mappings: GMP::Z.divisible?
3
11
  * Added 11th set of Functional Mappings: GMP::Z.congruent?
data/README.html CHANGED
@@ -3,7 +3,8 @@
3
3
  <p>gmp is library providing Ruby bindings to GMP library. Here is the introduction
4
4
  paragraph at <a href="http://gmplib.org/#WHAT">their homepage</a>:</p>
5
5
 
6
- <blockquote><p>GMP is a free library for arbitrary precision arithmetic, operating on
6
+ <blockquote>
7
+ <p>GMP is a free library for arbitrary precision arithmetic, operating on
7
8
  signed integers, rational numbers, and floating point numbers. There is no
8
9
  practical limit to the precision except the ones implied by the available
9
10
  memory in the machine GMP runs on. GMP has a rich set of functions, and the
@@ -34,7 +35,7 @@ programs.</p>
34
35
  <p>GMP is part of the GNU project. For more information about the GNU project,
35
36
  please see the official GNU web site.</p>
36
37
 
37
- <p>GMP's main target platforms are Unix-type systems, such as GNU/Linux,
38
+ <p>GMP&#39;s main target platforms are Unix-type systems, such as GNU/Linux,
38
39
  Solaris, HP-UX, Mac OS X/Darwin, BSD, AIX, etc. It also is known to work on
39
40
  Windoze in 32-bit mode.</p>
40
41
 
@@ -44,10 +45,11 @@ Windoze in 32-bit mode.</p>
44
45
  of course inspect and test contributed code carefully, but equally
45
46
  importantly we make sure we have the legal right to distribute the
46
47
  contributions, meaning users can safely use GMP. To achieve this, we will ask
47
- contributors to sign paperwork where they allow us to distribute their work."</p></blockquote>
48
+ contributors to sign paperwork where they allow us to distribute their work.&quot;</p>
49
+ </blockquote>
48
50
 
49
51
  <p>Only GMP 4 or newer is supported. The following environments have been tested
50
- by me: gmp gem 0.5.41 on:</p>
52
+ by me: gmp gem 0.5.47 on:</p>
51
53
 
52
54
  <table border="1">
53
55
  <tr>
@@ -96,20 +98,15 @@ by me: gmp gem 0.5.41 on:</p>
96
98
  GMP 5.0.1 (3.0.0)</td>
97
99
  </tr>
98
100
  <tr>
99
- <td rowspan="4">Mac OS X 10.6.4 on x86_64 (64-bit)</td>
101
+ <td rowspan="4">Mac OS X 10.6.8 on x86_64 (64-bit)</td>
100
102
  <td>(MRI) Ruby 1.8.7</td>
101
103
  <td>GMP 4.3.2 (2.4.2)<br />
102
- GMP 5.0.1 (3.0.0)</td>
104
+ GMP 5.0.5 (3.1.1)</td>
103
105
  </tr>
104
106
  <tr>
105
- <td>(MRI) Ruby 1.9.1</td>
106
- <td>GMP 4.3.2 (2.4.2)<br />
107
- GMP 5.0.1 (3.0.0)</td>
108
- </tr>
109
- <tr>
110
- <td>(MRI) Ruby 1.9.2</td>
107
+ <td>(MRI) Ruby 1.9.3</td>
111
108
  <td>GMP 4.3.2 (2.4.2)<br />
112
- GMP 5.0.1 (3.0.0)</td>
109
+ GMP 5.0.5 (3.1.1)</td>
113
110
  </tr>
114
111
  <tr>
115
112
  <td>(RBX) Rubinius 1.1.0</td>
@@ -140,7 +137,6 @@ by me: gmp gem 0.5.41 on:</p>
140
137
  </tr>
141
138
  </table>
142
139
 
143
-
144
140
  <h2>Authors</h2>
145
141
 
146
142
  <ul>
@@ -148,36 +144,34 @@ by me: gmp gem 0.5.41 on:</p>
148
144
  <li>srawlins</li>
149
145
  </ul>
150
146
 
151
-
152
147
  <h2>Constants</h2>
153
148
 
154
149
  <p>The GMP module includes the following constants. Mathematical constants, such
155
150
  as pi, are defined under class methods of GMP::F, listed below.</p>
156
151
 
157
152
  <ul>
158
- <li><code>GMP::GMP_VERSION</code> - A string like "5.0.1"</li>
153
+ <li><code>GMP::GMP_VERSION</code> - A string like &quot;5.0.1&quot;</li>
159
154
  <li><code>GMP::GMP_CC</code> - The compiler used to compile GMP</li>
160
155
  <li><code>GMP::GMP_CFLAGS</code> - The CFLAGS used to compile GMP</li>
161
156
  <li><code>GMP::GMP\_BITS_PER_LIMB</code> The number of bits per limb</li>
162
157
  <li><code>GMP::GMP_NUMB_MAX</code> - The maximum value that can be stored in the number part of a limb</li>
163
158
  </ul>
164
159
 
165
-
166
160
  <p>if MPFR is available:
167
- * <code>GMP::MPFR_VERSION</code> - A string like "2.4.2"
161
+ * <code>GMP::MPFR_VERSION</code> - A string like &quot;2.4.2&quot;
168
162
  * <code>GMP::MPFR\_PREC_MIN</code> - The minimum precision available
169
163
  * <code>GMP::MPFR_PREC_MAX</code> - The maximum precision available
170
- * <code>GMP::GMP_RNDN</code> - The constant representing "round to nearest"
171
- * <code>GMP::GMP_RNDZ</code> - The constant representing "round toward zero"
172
- * <code>GMP::GMP_RNDU</code> - The constant representing "round toward plus infinity"
173
- * <code>GMP::GMP_RNDD</code> - The constant representing "round toward minus infinity"</p>
164
+ * <code>GMP::GMP_RNDN</code> - The constant representing &quot;round to nearest&quot;
165
+ * <code>GMP::GMP_RNDZ</code> - The constant representing &quot;round toward zero&quot;
166
+ * <code>GMP::GMP_RNDU</code> - The constant representing &quot;round toward plus infinity&quot;
167
+ * <code>GMP::GMP_RNDD</code> - The constant representing &quot;round toward minus infinity&quot;</p>
174
168
 
175
169
  <p>New in MPFR 3.0.0:
176
170
  * <code>GMP::MPFR_RNDN</code>
177
171
  * <code>GMP::MPFR_RNDZ</code>
178
172
  * <code>GMP::MPFR_RNDU</code>
179
173
  * <code>GMP::MPFR_RNDD</code>
180
- * <code>GMP::MPFR_RNDA</code> - The constant representing "round away from zero"</p>
174
+ * <code>GMP::MPFR_RNDA</code> - The constant representing &quot;round away from zero&quot;</p>
181
175
 
182
176
  <h2>Classes</h2>
183
177
 
@@ -239,6 +233,9 @@ GMP.RandState()
239
233
  &lt;=&gt;,&gt;=,&gt;,&lt;=,&lt; comparisions
240
234
  class methods of GMP::Z
241
235
  fac(n) factorial of n
236
+ 2fac(n), double_fac(n) double factorial of n
237
+ mfac(n) m-multi-factorial of n
238
+ primorial(n) primorial of n
242
239
  fib(n) nth fibonacci number
243
240
  pow(n,m) n to mth power
244
241
  GMP::Z and GMP::Q
@@ -263,8 +260,8 @@ GMP::Z
263
260
  (respectively), then return the index of the
264
261
  first instance.
265
262
  cmpabs comparison of absolute value
266
- com 2's complement
267
- com! in-place 2's complement
263
+ com 2&#39;s complement
264
+ com! in-place 2&#39;s complement
268
265
  &amp;,|,^ logical operations: and, or, xor
269
266
  even? is even
270
267
  odd? is odd
@@ -282,12 +279,14 @@ GMP::Z
282
279
  certainly prime
283
280
  nextprime next *probable* prime
284
281
  nextprime! change the object into its next *probable* prime
285
- gcd, gcdext greatest common divisor
282
+ gcd, gcdext, gcdext2 greatest common divisor
283
+ lcm least common multiple
286
284
  invert(m) invert mod m
287
285
  jacobi jacobi symbol
288
286
  legendre legendre symbol
289
287
  remove(n) remove all occurences of factor n
290
288
  popcount the number of bits equal to 1
289
+ hamdist the hamming distance between two integers
291
290
  sizeinbase(b) digits in base b
292
291
  size_in_bin digits in binary
293
292
  size number of limbs
@@ -342,7 +341,7 @@ GMP::F
342
341
  li2 real part of the dilogarithm of object
343
342
  gamma Gamma fucntion of object
344
343
  lngamma logarithm of the Gamma function of object
345
- digamma Digamma function of object (MPFR_VERSION &gt;= "3.0.0")
344
+ digamma Digamma function of object (MPFR_VERSION &gt;= &quot;3.0.0&quot;)
346
345
  zeta Reimann Zeta function of object
347
346
  erf error function of object
348
347
  erfc complementary error function of object
@@ -379,7 +378,7 @@ GMP::F
379
378
  infinite? | type of floating point number
380
379
  finite? |
381
380
  number? |
382
- regular? / (MPFR_VERSION &gt;= "3.0.0")
381
+ regular? / (MPFR_VERSION &gt;= &quot;3.0.0&quot;)
383
382
  GMP::RandState
384
383
  mpfr_urandomb(fixnum) get uniformly distributed random floating-point
385
384
  number within 0 &lt;= rop &lt; 1
@@ -387,7 +386,7 @@ GMP::RandState
387
386
 
388
387
  <h2>Functional Mappings</h2>
389
388
 
390
- <p>In order to align better with the GMP paradigms of using return arguments, I have started creating "functional mappings", singleton methods that map directly to functions in GMP. These methods take return arguments, so that passing an object to a functional mapping may change the object itself. For example:</p>
389
+ <p>In order to align better with the GMP paradigms of using return arguments, I have started creating &quot;functional mappings&quot;, singleton methods that map directly to functions in GMP. These methods take return arguments, so that passing an object to a functional mapping may change the object itself. For example:</p>
391
390
 
392
391
  <pre><code>a = GMP::Z(0)
393
392
  b = GMP::Z(13)
@@ -396,7 +395,7 @@ GMP::Z.add(a, b, c)
396
395
  a #=&gt; 30
397
396
  </code></pre>
398
397
 
399
- <p>Here's a fun list of all of the functional mappings written so far:</p>
398
+ <p>Here&#39;s a fun list of all of the functional mappings written so far:</p>
400
399
 
401
400
  <pre><code>GMP::Z
402
401
  .abs .add .addmul .cdiv_q_2exp .cdiv_r_2exp .com
@@ -415,7 +414,6 @@ a #=&gt; 30
415
414
  <li><a href="https://github.com/srawlins/gmp/blob/master/CHANGELOG">CHANGELOG</a></li>
416
415
  </ul>
417
416
 
418
-
419
417
  <h2>Testing</h2>
420
418
 
421
419
  <p>Tests can be run with:</p>
@@ -424,21 +422,26 @@ a #=&gt; 30
424
422
  ruby unit_tests.rb
425
423
  </code></pre>
426
424
 
427
- <p>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 <code>Test::Unit</code> package that is fixed with the unit_test gem.</p>
425
+ <p>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&#39;s built-in <code>Test::Unit</code> package that is fixed with the unit_test gem.</p>
426
+
427
+ <p>You can also use the following shiny new rake tasks:</p>
428
+
429
+ <pre><code>rake test
430
+ rake report
431
+ MPFR=no-mpfr rake report
432
+ </code></pre>
428
433
 
429
434
  <h2>Known Issues</h2>
430
435
 
431
436
  <ul>
432
- <li>Don't call <code>GMP::RandState(:lc_2exp_size)</code>. Give a 2nd arg.</li>
433
- <li>Don't use multiple assignment (<code>a = b = GMP::Z(0)</code>) with functional mappings.</li>
434
- <li>JRuby has some interesting bugs and flickering tests. GMP::Z(GMP::GMP_NUMB_MAX) for example, blows up.</li>
435
- <li>MPFR 3.1.0 breaks some of the random tests. This is because of a known change in MPFR. I just need my tests to become aware of the change.</li>
437
+ <li>Don&#39;t call <code>GMP::RandState(:lc_2exp_size)</code>. Give a 2nd arg.</li>
438
+ <li>Don&#39;t use multiple assignment (<code>a = b = GMP::Z(0)</code>) with functional mappings.</li>
439
+ <li>JRuby has some interesting bugs and flickering tests. GMP::Z(GMP::GMP<em>NUMB</em>MAX) for example, blows up.</li>
436
440
  </ul>
437
441
 
438
-
439
442
  <h2>Precision</h2>
440
443
 
441
- <p>Precision can be explicitely set as second argument for <code>GMP::F.new()</code>. If there is no explicit precision, highest precision of all <code>GMP::F</code> arguments is used. That doesn't ensure that result will be exact. For details, consult any paper about floating point arithmetics.</p>
444
+ <p>Precision can be explicitely set as second argument for <code>GMP::F.new()</code>. If there is no explicit precision, highest precision of all <code>GMP::F</code> arguments is used. That doesn&#39;t ensure that result will be exact. For details, consult any paper about floating point arithmetics.</p>
442
445
 
443
446
  <p>Default precision can be explicitely set by passing <code>0</code> as the second argument for to <code>GMP::F.new()</code>. In particular, you can set precision of copy of <code>GMP::F</code> object by:</p>
444
447
 
@@ -449,63 +452,40 @@ ruby unit_tests.rb
449
452
 
450
453
  <h2>Benchmarking</h2>
451
454
 
452
- <p>"GMP is carefully designed to be as fast as possible." Therefore, I believe it is very important for GMP, and its various language bindings to be benchmarked. In recent years, the GMP team developed GMPbench, an elegant, weighted benchmark. Currently, they maintain a list of recent benchmark <a href="http://www.gmplib.org/gmpbench.html">results</a>, broken down by CPU, CPU freq, ABI, and compiler flags; GMPbench compares different processor's performance against eachother, rather than GMP against other bignum libraries, or comparing different versions of GMP.</p>
453
-
454
- <p>I intend to build a plug-in to GMPbench that will test the ruby gmp gem. The results of this benchmark should be directly comparable with the results of GMP (on same CPU, etc.). Rather than write a benchmark from the ground up, or try to emulate what GMPbench does, a plug-in will allow for this type of comparison. And in fact, GMPbench is (perhaps intentionally) written perfectly to allow for plugging in.</p>
455
-
456
- <p>Various scores are derived from GMPbench by running the <code>runbench</code> script. This script compiles and runs various individual programs that measure the performance of base functions, such as multiply, and app functions such as rsa.</p>
457
-
458
- <p>The gmp gem benchmark uses the GMPbench framework (that is, runbench, gexpr, and the timing methods), and plugs in ruby scripts as the individual programs. Right now, there are only four (of six) such plugged in ruby scripts:</p>
459
-
460
- <ul>
461
- <li>multiply - measures performance of multiplying (or squaring) <code>GMP::Z</code> objects whose size (in bits) is given by one or two operands.</li>
462
- <li>divide - measures performance of dividing two <code>GMP::Z</code> objects (using <code>tdiv</code>) whose size (in bits) is given by two operands.</li>
463
- <li>gcd - measure...</li>
464
- <li>rsa - measures performance of using RSA to sign messages. The size of <code>pq</code>, the product of the two co-prime <code>GMP::Z</code> objects, <code>p</code> and <code>q</code>, is given by one operand.</li>
465
- </ul>
466
-
467
-
468
- <p><strong>insert table here</strong></p>
469
-
470
- <p>My guess is that the increase in ruby gmp gem overhead is caused by increased efficiency in GMP; the inefficiencies of the gmp gem are relatively greater.</p>
455
+ <p>Please see <a href="performance.md">performance</a></p>
471
456
 
472
457
  <h2>Todo</h2>
473
458
 
474
459
  <ul>
475
- <li><code>GMP::Z#to_d_2exp</code>, <code>#congruent?</code>, <code>#rootrem</code>, <code>#lcm</code>, <code>#kronecker</code>, <code>#bin</code>, <code>#fib2</code>, <code>#lucnum</code>, <code>#lucnum2</code>, <code>#hamdist</code>, <code>#combit</code>, <code>#fits_x?</code></li>
460
+ <li><code>GMP::Z#to_d_2exp</code>, <code>#congruent?</code>, <code>#rootrem</code>, <code>#kronecker</code>, <code>#bin</code>, <code>#fib2</code>, <code>#lucnum</code>, <code>#lucnum2</code>, <code>#combit</code>, <code>#fits_x?</code></li>
476
461
  <li><code>GMP::Q#to_s(base)</code>, <code>GMP::F#to_s(base)</code> (test it!)</li>
477
- <li>benchmark gcdext, pi</li>
462
+ <li>benchmark pi</li>
478
463
  <li>a butt-load of functional mappings. 47-ish sets.</li>
479
- <li>use Rake use Rake use Rake</li>
480
464
  <li>investigate possible memory leaks when using <code>GMP::Q(22/7)</code> for example</li>
481
- <li>beef up <code>r_gmpq_initialize</code>; I don't like to rely on <code>mpz_set_value</code>.</li>
465
+ <li>beef up <code>r_gmpq_initialize</code>; I don&#39;t like to rely on <code>mpz_set_value</code>.</li>
482
466
  <li>finish compile-results.rb</li>
483
- <li>New in MPFR 3.1.0: mpfr_frexp, mpfr_grandom, mpfr_z_sub, divide-by-zero exception (?)</li>
467
+ <li>New in MPFR 3.1.0: mpfr<em>frexp, mpfr</em>grandom, mpfr<em>z</em>sub, divide-by-zero exception (?)</li>
468
+ <li>benchmark different orderings of type checks</li>
484
469
  </ul>
485
470
 
486
-
487
471
  <p>The below are inherited from Tomasz. I will go through these and see which are
488
472
  still relevant, and which I understand.</p>
489
473
 
490
474
  <ul>
491
475
  <li><code>mpz_fits_*</code> and 31 vs. 32 integer variables</li>
492
- <li>fix all sign issues (don't know what these are)</li>
476
+ <li>fix all sign issues (don&#39;t know what these are)</li>
493
477
  <li><code>to_s</code> vs. <code>inspect</code></li>
494
478
  <li>check if <code>mpz_addmul_ui</code> would optimize some statements</li>
495
479
  <li>some system that allows using denref and numref as normal ruby objects</li>
496
480
  <li>takeover code that replaces all <code>Bignums</code> with <code>GMP::Z</code></li>
497
- <li>better bignum parser (how? <code>to_s</code> seems good to me.)</li>
481
+ <li>better bignum parser (crawling into the Bignum extension)</li>
498
482
  <li>zero-copy method for strings generation</li>
499
483
  <li>benchmarks against Python GMP and Perl GMP</li>
500
- <li><code>dup</code> methods</li>
484
+ <li><code>dup</code> methods for GMP::Q and GMP::F</li>
501
485
  <li>integrate <code>F</code> into system</li>
502
486
  <li>should <code>Z.\[\]</code> bits be 0/1 or true/false, 0 is true, which might surprise users</li>
503
487
  <li><code>any2small_integer()</code></li>
504
- <li>check asm output, especially local memory efficiency (uh... no)</li>
505
- <li>it might be better to use 'register' for some local variables (uh... no)</li>
506
488
  <li>powm with negative exponents</li>
507
- <li>check if different sorting of operatations gives better cache usage</li>
489
+ <li>check if different sorting of operations gives better cache usage</li>
508
490
  <li><code>GMP::\*</code> op <code>RubyFloat</code> and <code>RubyFloat</code> op <code>GMP::\*</code></li>
509
- <li>sort checks</li>
510
491
  </ul>
511
-
data/README.markdown CHANGED
@@ -230,6 +230,9 @@ Methods
230
230
  <=>,>=,>,<=,< comparisions
231
231
  class methods of GMP::Z
232
232
  fac(n) factorial of n
233
+ 2fac(n), double_fac(n) double factorial of n
234
+ mfac(n) m-multi-factorial of n
235
+ primorial(n) primorial of n
233
236
  fib(n) nth fibonacci number
234
237
  pow(n,m) n to mth power
235
238
  GMP::Z and GMP::Q
@@ -280,6 +283,7 @@ Methods
280
283
  legendre legendre symbol
281
284
  remove(n) remove all occurences of factor n
282
285
  popcount the number of bits equal to 1
286
+ hamdist the hamming distance between two integers
283
287
  sizeinbase(b) digits in base b
284
288
  size_in_bin digits in binary
285
289
  size number of limbs
@@ -414,6 +418,12 @@ Tests can be run with:
414
418
 
415
419
  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.
416
420
 
421
+ You can also use the following shiny new rake tasks:
422
+
423
+ rake test
424
+ rake report
425
+ MPFR=no-mpfr rake report
426
+
417
427
  Known Issues
418
428
  ------------
419
429
 
@@ -440,7 +450,7 @@ Please see [performance](performance.md)
440
450
  Todo
441
451
  ----
442
452
 
443
- * `GMP::Z#to_d_2exp`, `#congruent?`, `#rootrem`, `#kronecker`, `#bin`, `#fib2`, `#lucnum`, `#lucnum2`, `#hamdist`, `#combit`, `#fits_x?`
453
+ * `GMP::Z#to_d_2exp`, `#congruent?`, `#rootrem`, `#kronecker`, `#bin`, `#fib2`, `#lucnum`, `#lucnum2`, `#combit`, `#fits_x?`
444
454
  * `GMP::Q#to_s(base)`, `GMP::F#to_s(base)` (test it!)
445
455
  * benchmark pi
446
456
  * a butt-load of functional mappings. 47-ish sets.
@@ -448,6 +458,7 @@ Todo
448
458
  * beef up `r_gmpq_initialize`; I don't like to rely on `mpz_set_value`.
449
459
  * finish compile-results.rb
450
460
  * New in MPFR 3.1.0: mpfr_frexp, mpfr_grandom, mpfr_z_sub, divide-by-zero exception (?)
461
+ * benchmark different orderings of type checks
451
462
 
452
463
  The below are inherited from Tomasz. I will go through these and see which are
453
464
  still relevant, and which I understand.
@@ -458,16 +469,13 @@ still relevant, and which I understand.
458
469
  * check if `mpz_addmul_ui` would optimize some statements
459
470
  * some system that allows using denref and numref as normal ruby objects
460
471
  * takeover code that replaces all `Bignums` with `GMP::Z`
461
- * better bignum parser (how? `to_s` seems good to me.)
472
+ * better bignum parser (crawling into the Bignum extension)
462
473
  * zero-copy method for strings generation
463
474
  * benchmarks against Python GMP and Perl GMP
464
- * `dup` methods
475
+ * `dup` methods for GMP::Q and GMP::F
465
476
  * integrate `F` into system
466
477
  * should `Z.\[\]` bits be 0/1 or true/false, 0 is true, which might surprise users
467
478
  * `any2small_integer()`
468
- * check asm output, especially local memory efficiency (uh... no)
469
- * it might be better to use 'register' for some local variables (uh... no)
470
479
  * powm with negative exponents
471
- * check if different sorting of operatations gives better cache usage
480
+ * check if different sorting of operations gives better cache usage
472
481
  * `GMP::\*` op `RubyFloat` and `RubyFloat` op `GMP::\*`
473
- * sort checks
data/ext/gmpz.c CHANGED
@@ -172,6 +172,39 @@ static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg) \
172
172
  return res; \
173
173
  }
174
174
 
175
+ #define DEFUN_INT_SINGLETON_UIUI(fname,mpz_fname) \
176
+ static VALUE r_gmpzsg_##fname(VALUE klass, VALUE arg1, VALUE arg2) \
177
+ { \
178
+ MP_INT *arg1_val_z, *res_val; \
179
+ unsigned long arg1_val_ul, arg2_val_ul; \
180
+ VALUE res; \
181
+ \
182
+ (void)klass; \
183
+ \
184
+ if (FIXNUM_P (arg1)) { \
185
+ arg1_val_ul = FIX2NUM (arg1); \
186
+ } else if (GMPZ_P (arg1)) { \
187
+ mpz_get_struct (arg1, arg1_val_z); \
188
+ if (!mpz_fits_ulong_p (arg1_val_z)) \
189
+ rb_raise (rb_eRangeError, "first argument out of range"); \
190
+ arg1_val_ul = mpz_get_ui (arg1_val_z); \
191
+ if (arg1_val_ul == 0) \
192
+ rb_raise (rb_eRangeError, "first argument out of range"); \
193
+ } else { \
194
+ typeerror_as (ZX, "first argument"); \
195
+ } \
196
+ \
197
+ if (FIXNUM_P (arg2)) { \
198
+ arg2_val_ul = FIX2NUM (arg2); \
199
+ } else { \
200
+ typeerror_as (X, "second argument"); \
201
+ } \
202
+ \
203
+ mpz_make_struct_init (res, res_val); \
204
+ mpz_fname (res_val, arg1_val_ul, arg2_val_ul); \
205
+ return res; \
206
+ }
207
+
175
208
  #define DEFUN_INT_COND_P(fname,mpz_fname) \
176
209
  static VALUE r_gmpz_##fname(VALUE self) \
177
210
  { \
@@ -1968,7 +2001,7 @@ VALUE r_gmpz_jacobi(VALUE self, VALUE b)
1968
2001
  /*
1969
2002
  * call-seq:
1970
2003
  * GMP::Z.jacobi(a, b)
1971
- *
2004
+ *
1972
2005
  * Calculate the Jacobi symbol <i>(a/b)</i>. This is defined only for _b_ odd and
1973
2006
  * positive.
1974
2007
  */
@@ -1979,7 +2012,7 @@ VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b)
1979
2012
  int free_a_val = 0;
1980
2013
  int free_b_val = 0;
1981
2014
  (void)klass;
1982
-
2015
+
1983
2016
  if (GMPZ_P(a)) {
1984
2017
  mpz_get_struct(a, a_val);
1985
2018
  } else if (FIXNUM_P(a)) {
@@ -1992,7 +2025,7 @@ VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b)
1992
2025
  } else {
1993
2026
  typeerror_as(ZXB, "a");
1994
2027
  }
1995
-
2028
+
1996
2029
  if (GMPZ_P(b)) {
1997
2030
  mpz_get_struct(b, b_val);
1998
2031
  if (mpz_sgn(b_val) != 1)
@@ -2021,7 +2054,7 @@ VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b)
2021
2054
  } else {
2022
2055
  typeerror_as(ZXB, "b");
2023
2056
  }
2024
-
2057
+
2025
2058
  res_val = mpz_jacobi(a_val, b_val);
2026
2059
  if (free_a_val) { mpz_temp_free(a_val); }
2027
2060
  if (free_b_val) { mpz_temp_free(b_val); }
@@ -2115,6 +2148,80 @@ VALUE r_gmpz_remove(VALUE self, VALUE arg)
2115
2148
  * * GMP::Z.fac(4) #=> 24
2116
2149
  */
2117
2150
  DEFUN_INT_SINGLETON_UI(fac, mpz_fac_ui)
2151
+ #if __GNU_MP_VERSION >= 5 && __GNU_MP_VERSION_MINOR >= 1 // 5.1.0 and newer
2152
+
2153
+ /*
2154
+ * Document-method: GMP::Z.2fac
2155
+ *
2156
+ * call-seq:
2157
+ * GMP::Z.send(:"2fac", n)
2158
+ * GMP::Z.double_fac(n)
2159
+ *
2160
+ * Returns <i>n!!</i>, the double factorial of _n_.
2161
+ *
2162
+ * Examples:
2163
+ * * GMP::Z.double_fac( 0) #=> 1
2164
+ * * GMP::Z.double_fac( 1) #=> 1
2165
+ * * GMP::Z.double_fac( 2) #=> 2
2166
+ * * GMP::Z.double_fac( 3) #=> 3
2167
+ * * GMP::Z.double_fac( 4) #=> 8
2168
+ * * GMP::Z.double_fac( 5) #=> 15
2169
+ * * GMP::Z.double_fac( 6) #=> 48
2170
+ * * GMP::Z.double_fac( 7) #=> 105
2171
+ * * GMP::Z.double_fac( 8) #=> 384
2172
+ * * GMP::Z.double_fac( 9) #=> 945
2173
+ * * GMP::Z.double_fac( 10) #=> 3840
2174
+ * * GMP::Z.double_fac(100)
2175
+ * #=> 34243224702511976248246432895208185975118675053719198827915654463488000000000000
2176
+ */
2177
+ DEFUN_INT_SINGLETON_UI(2fac, mpz_2fac_ui)
2178
+
2179
+ /*
2180
+ * Document-method: GMP::Z.mfac
2181
+ *
2182
+ * call-seq:
2183
+ * GMP::Z.mfac(n)
2184
+ *
2185
+ * Returns <i>n!^(m)</i>, the m-multi-factorial of _n_.
2186
+ *
2187
+ * Examples:
2188
+ * * GMP::Z.mfac(0, 3) #=> 1
2189
+ * * GMP::Z.mfac(1, 3) #=> 1
2190
+ * * GMP::Z.mfac(2, 3) #=> 2
2191
+ * * GMP::Z.mfac(3, 3) #=> 3
2192
+ * * GMP::Z.mfac(4, 3) #=> 4
2193
+ * * GMP::Z.mfac(5, 3) #=> 10
2194
+ * * GMP::Z.mfac(6, 3) #=> 18
2195
+ * * GMP::Z.mfac(7, 3) #=> 28
2196
+ * * GMP::Z.mfac(8, 3) #=> 80
2197
+ * * GMP::Z.mfac(9, 3) #=> 162
2198
+ * * GMP::Z.mfac(10, 3) #=> 280
2199
+ * * GMP::Z.mfac(11, 3) #=> 880
2200
+ * * GMP::Z.mfac(12, 3) #=> 1944
2201
+ */
2202
+ DEFUN_INT_SINGLETON_UIUI(mfac, mpz_mfac_uiui)
2203
+
2204
+ /*
2205
+ * Document-method: GMP::Z.primorial
2206
+ *
2207
+ * call-seq:
2208
+ * GMP::Z.primorial(n)
2209
+ *
2210
+ * Returns the primorial _n_.
2211
+ *
2212
+ * Examples:
2213
+ * * GMP::Z.primorial(0) #=> 1
2214
+ * * GMP::Z.primorial(1) #=> 1
2215
+ * * GMP::Z.primorial(2) #=> 2
2216
+ * * GMP::Z.primorial(3) #=> 6
2217
+ * * GMP::Z.primorial(4) #=> 6
2218
+ * * GMP::Z.primorial(5) #=> 30
2219
+ * * GMP::Z.primorial(6) #=> 30
2220
+ * * GMP::Z.primorial(7) #=> 210
2221
+ */
2222
+ DEFUN_INT_SINGLETON_UI(primorial, mpz_primorial_ui)
2223
+ #endif
2224
+
2118
2225
  /*
2119
2226
  * Document-method: GMP::Z.fib
2120
2227
  *
@@ -2132,7 +2239,8 @@ DEFUN_INT_SINGLETON_UI(fac, mpz_fac_ui)
2132
2239
  * * GMP::Z.fib(6) #=> 8
2133
2240
  * * GMP::Z.fib(7) #=> 13
2134
2241
  */
2135
- DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
2242
+ DEFUN_INT_SINGLETON_UI(fib, mpz_fib_ui)
2243
+ DEFUN_INT_SINGLETON_UI(lucnum, mpz_lucnum_ui)
2136
2244
 
2137
2245
 
2138
2246
  /**********************************************************************
@@ -2444,6 +2552,25 @@ VALUE r_gmpz_popcount(VALUE self)
2444
2552
  return INT2FIX(mpz_popcount(self_val));
2445
2553
  }
2446
2554
 
2555
+ /*
2556
+ * call-seq:
2557
+ * a.hamdist(b)
2558
+ *
2559
+ * If _a_ and _b_ are both >= 0 or both < 0, calculate the hamming distance between _a_ and _b_. If one operand is >= 0 and the other is less than 0, then return "infinity" (the largest possible `mp_bitcnt_t`.
2560
+ * positive.
2561
+ */
2562
+ VALUE r_gmpz_hamdist(VALUE self_val, VALUE b_val)
2563
+ {
2564
+ MP_INT *self, *b;
2565
+ mpz_get_struct (self_val, self);
2566
+ mpz_get_struct ( b_val, b);
2567
+ if (! GMPZ_P (b_val)) {
2568
+ typeerror_as (Z, "b");
2569
+ }
2570
+
2571
+ return INT2FIX (mpz_hamdist(self, b));
2572
+ }
2573
+
2447
2574
  /*
2448
2575
  * call-seq:
2449
2576
  * a.scan0(starting_bit)
@@ -2736,7 +2863,14 @@ void init_gmpz()
2736
2863
  rb_define_method( cGMP_Z, "legendre", r_gmpz_legendre, 1);
2737
2864
  rb_define_method( cGMP_Z, "remove", r_gmpz_remove, 1);
2738
2865
  rb_define_singleton_method(cGMP_Z, "fac", r_gmpzsg_fac, 1);
2866
+ #if __GNU_MP_VERSION >= 5 && __GNU_MP_VERSION_MINOR >= 1 // 5.1.0 and newer
2867
+ rb_define_singleton_method(cGMP_Z, "2fac", r_gmpzsg_2fac, 1);
2868
+ rb_define_singleton_method(cGMP_Z, "double_fac", r_gmpzsg_2fac, 1);
2869
+ rb_define_singleton_method(cGMP_Z, "mfac", r_gmpzsg_mfac, 2);
2870
+ rb_define_singleton_method(cGMP_Z, "primorial", r_gmpzsg_primorial, 1);
2871
+ #endif
2739
2872
  rb_define_singleton_method(cGMP_Z, "fib", r_gmpzsg_fib, 1);
2873
+ rb_define_singleton_method(cGMP_Z, "lucnum", r_gmpzsg_lucnum, 1);
2740
2874
  // Functional Mappings
2741
2875
  rb_define_singleton_method(cGMP_Z, "lcm", r_gmpzsg_lcm, 3);
2742
2876
  rb_define_singleton_method(cGMP_Z, "nextprime", r_gmpzsg_nextprime, 2);
@@ -2755,16 +2889,17 @@ void init_gmpz()
2755
2889
  rb_define_method(cGMP_Z, "hash", r_gmpz_hash, 0);
2756
2890
 
2757
2891
  // Integer Logic and Bit Fiddling
2758
- rb_define_method(cGMP_Z, "&", r_gmpz_and, 1);
2759
- rb_define_method(cGMP_Z, "|", r_gmpz_or, 1);
2760
- rb_define_method(cGMP_Z, "^", r_gmpz_xor, 1);
2761
- rb_define_method(cGMP_Z, "com", r_gmpz_com, 0);
2892
+ rb_define_method(cGMP_Z, "&", r_gmpz_and, 1);
2893
+ rb_define_method(cGMP_Z, "|", r_gmpz_or, 1);
2894
+ rb_define_method(cGMP_Z, "^", r_gmpz_xor, 1);
2895
+ rb_define_method(cGMP_Z, "com", r_gmpz_com, 0);
2762
2896
  rb_define_method(cGMP_Z, "com!", r_gmpz_com_self, 0);
2763
2897
  rb_define_method(cGMP_Z, "popcount", r_gmpz_popcount, 0);
2764
- rb_define_method(cGMP_Z, "scan0", r_gmpz_scan0, 1);
2765
- rb_define_method(cGMP_Z, "scan1", r_gmpz_scan1, 1);
2766
- rb_define_method(cGMP_Z, "[]=", r_gmpz_setbit, 2);
2767
- rb_define_method(cGMP_Z, "[]", r_gmpz_getbit, 1);
2898
+ rb_define_method(cGMP_Z, "hamdist", r_gmpz_hamdist, 1);
2899
+ rb_define_method(cGMP_Z, "scan0", r_gmpz_scan0, 1);
2900
+ rb_define_method(cGMP_Z, "scan1", r_gmpz_scan1, 1);
2901
+ rb_define_method(cGMP_Z, "[]=", r_gmpz_setbit, 2);
2902
+ rb_define_method(cGMP_Z, "[]", r_gmpz_getbit, 1);
2768
2903
  // Functional Mappings
2769
2904
  rb_define_singleton_method(cGMP_Z, "com", r_gmpzsg_com, 2);
2770
2905
 
data/ext/ruby_gmp.h CHANGED
@@ -265,7 +265,11 @@ extern VALUE r_gmpf_set_prec_raw(VALUE self, VALUE arg);
265
265
 
266
266
  // Converting Floats
267
267
  extern VALUE r_gmpf_to_d(VALUE self);
268
+ #ifdef MPFR
268
269
  extern VALUE r_gmpf_to_s(int argc, VALUE *argv, VALUE self);
270
+ #else
271
+ extern VALUE r_gmpf_to_s(VALUE self);
272
+ #endif
269
273
 
270
274
  // Float Arithmetic
271
275
  #ifndef MPFR
data/manual.pdf CHANGED
Binary file
data/test/gmp_tprintf.rb CHANGED
@@ -1,124 +1,126 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class GMP_TPRINTF < Test::Unit::TestCase
4
- MAX_OUTPUT = 1024
5
- def setup
6
- end
3
+ unless RUBY_VERSION =~ /^1.8/
4
+ class GMP_TPRINTF < Test::Unit::TestCase
5
+ MAX_OUTPUT = 1024
6
+ def setup
7
+ end
7
8
 
8
- def check_plain(want, fmt_orig, *args)
9
- fmt = ''
10
- idx2 = 0
11
- fmt_orig.split(//).each_with_index do |char, idx|
12
- case char
13
- # The exact value of the exponent isn't guaranteed in glibc, and it and
14
- # gmp_printf do slightly different things, so don't compare directly.
15
- when 'a' then return
16
- when 'A' then return
17
- when 'F'
18
- if idx > 0 and fmt_orig[idx-1] == '.'
19
- return # don't test the "all digits" cases
9
+ def check_plain(want, fmt_orig, *args)
10
+ fmt = ''
11
+ idx2 = 0
12
+ fmt_orig.split(//).each_with_index do |char, idx|
13
+ case char
14
+ # The exact value of the exponent isn't guaranteed in glibc, and it and
15
+ # gmp_printf do slightly different things, so don't compare directly.
16
+ when 'a' then return
17
+ when 'A' then return
18
+ when 'F'
19
+ if idx > 0 and fmt_orig[idx-1] == '.'
20
+ return # don't test the "all digits" cases
21
+ end
22
+ # discard 'F' type
23
+ next
24
+ when 'Z'
25
+ # transmute
26
+ # was 'l' in t-printf.c, but Ruby does not have such an 'l'
27
+ next
28
+ else
29
+ fmt[idx2] = fmt_orig[idx]
30
+ idx2 += 1
20
31
  end
21
- # discard 'F' type
22
- next
23
- when 'Z'
24
- # transmute
25
- # was 'l' in t-printf.c, but Ruby does not have such an 'l'
26
- next
27
- else
28
- fmt[idx2] = fmt_orig[idx]
29
- idx2 += 1
30
32
  end
31
- end
32
- assert(fmt.size < MAX_OUTPUT)
33
- got = GMP.sprintf(fmt, *args)
33
+ assert(fmt.size < MAX_OUTPUT)
34
+ got = GMP.sprintf(fmt, *args)
34
35
 
35
- assert_equal(want, got, "GMP.sprintf() generates correct output.")
36
- end
36
+ assert_equal(want, got, "GMP.sprintf() generates correct output.")
37
+ end
37
38
 
38
- def check_one(want, fmt, *args)
39
- assert_equal(want, GMP.sprintf(fmt, *args))
40
- end
39
+ def check_one(want, fmt, *args)
40
+ assert_equal(want, GMP.sprintf(fmt, *args))
41
+ end
41
42
 
42
- def hex_or_octal(fmt)
43
- fmt =~ /[xXo]/
44
- end
43
+ def hex_or_octal(fmt)
44
+ fmt =~ /[xXo]/
45
+ end
45
46
 
46
- def test_check_z
47
- data = [
48
- ['%Zd', '0', '0'],
49
- ['%Zd', '1', '1'],
50
- ['%Zd', '123', '123'],
51
- ['%Zd', '-1', '-1'],
52
- ['%Zd', '-123', '-123'],
53
-
54
- ['%+Zd', '0', '+0'],
55
- ['%+Zd', '123', '+123'],
56
- ['%+Zd', '-123', '-123'],
57
-
58
- ['%Zx', '123', '7b'],
59
- ['%ZX', '123', '7B'],
60
- ['%Zx', '-123', '-7b'],
61
- ['%ZX', '-123', '-7B'],
62
- ['%Zo', '123', '173'],
63
- ['%Zo', '-123', '-173'],
64
-
65
- ['%#Zx', '0', '0'],
66
- ['%#ZX', '0', '0'],
67
- ['%#Zx', '123', '0x7b'],
68
- ['%#ZX', '123', '0X7B'],
69
- ['%#Zx', '-123', '-0x7b'],
70
- ['%#ZX', '-123', '-0X7B'],
71
-
72
- ['%#Zo', '0', '0'],
73
- ['%#Zo', '123', '0173'],
74
- ['%#Zo', '-123', '-0173'],
75
-
76
- ['%10Zd', '0', ' 0'],
77
- ['%10Zd', '123', ' 123'],
78
- ['%10Zd', '-123', ' -123'],
79
-
80
- ['%-10Zd', '0', '0 '],
81
- ['%-10Zd', '123', '123 '],
82
- ['%-10Zd', '-123', '-123 '],
83
-
84
- ['%+10Zd', '123', ' +123'],
85
- ['%+-10Zd', '123', '+123 '],
86
- ['%+10Zd', '-123', ' -123'],
87
- ['%+-10Zd', '-123', '-123 '],
88
-
89
- ['%08Zd', '0', '00000000'],
90
- ['%08Zd', '123', '00000123'],
91
- ['%08Zd', '-123', '-0000123'],
92
-
93
- ['%+08Zd', '0', '+0000000'],
94
- ['%+08Zd', '123', '+0000123'],
95
- ['%+08Zd', '-123', '-0000123'],
96
-
97
- ['%#08Zx', '0', '00000000'],
98
- ['%#08Zx', '123', '0x00007b'],
99
- ['%#08Zx', '-123', '-0x0007b'],
100
-
101
- ['%+#08Zx', '0', '+0000000'],
102
- ['%+#08Zx', '123', '+0x0007b'],
103
- ['%+#08Zx', '-123', '-0x0007b'],
104
-
105
- ['%.0Zd', '0', ''],
106
- ['%.1Zd', '0', '0'],
107
- ['%.2Zd', '0', '00'],
108
- ['%.3Zd', '0', '000']
109
- ]
110
-
111
- data.each do |parameters|
112
- z = GMP::Z(parameters[1])
113
- if not hex_or_octal(parameters[0]) and (parameters[0]['+'] or z < 0)
114
- check_plain(parameters[2], parameters[0], z.to_i)
115
- end
47
+ def test_check_z
48
+ data = [
49
+ ['%Zd', '0', '0'],
50
+ ['%Zd', '1', '1'],
51
+ ['%Zd', '123', '123'],
52
+ ['%Zd', '-1', '-1'],
53
+ ['%Zd', '-123', '-123'],
54
+
55
+ ['%+Zd', '0', '+0'],
56
+ ['%+Zd', '123', '+123'],
57
+ ['%+Zd', '-123', '-123'],
58
+
59
+ ['%Zx', '123', '7b'],
60
+ ['%ZX', '123', '7B'],
61
+ ['%Zx', '-123', '-7b'],
62
+ ['%ZX', '-123', '-7B'],
63
+ ['%Zo', '123', '173'],
64
+ ['%Zo', '-123', '-173'],
65
+
66
+ ['%#Zx', '0', '0'],
67
+ ['%#ZX', '0', '0'],
68
+ ['%#Zx', '123', '0x7b'],
69
+ ['%#ZX', '123', '0X7B'],
70
+ ['%#Zx', '-123', '-0x7b'],
71
+ ['%#ZX', '-123', '-0X7B'],
72
+
73
+ ['%#Zo', '0', '0'],
74
+ ['%#Zo', '123', '0173'],
75
+ ['%#Zo', '-123', '-0173'],
76
+
77
+ ['%10Zd', '0', ' 0'],
78
+ ['%10Zd', '123', ' 123'],
79
+ ['%10Zd', '-123', ' -123'],
80
+
81
+ ['%-10Zd', '0', '0 '],
82
+ ['%-10Zd', '123', '123 '],
83
+ ['%-10Zd', '-123', '-123 '],
84
+
85
+ ['%+10Zd', '123', ' +123'],
86
+ ['%+-10Zd', '123', '+123 '],
87
+ ['%+10Zd', '-123', ' -123'],
88
+ ['%+-10Zd', '-123', '-123 '],
89
+
90
+ ['%08Zd', '0', '00000000'],
91
+ ['%08Zd', '123', '00000123'],
92
+ ['%08Zd', '-123', '-0000123'],
93
+
94
+ ['%+08Zd', '0', '+0000000'],
95
+ ['%+08Zd', '123', '+0000123'],
96
+ ['%+08Zd', '-123', '-0000123'],
97
+
98
+ ['%#08Zx', '0', '00000000'],
99
+ ['%#08Zx', '123', '0x00007b'],
100
+ ['%#08Zx', '-123', '-0x0007b'],
101
+
102
+ ['%+#08Zx', '0', '+0000000'],
103
+ ['%+#08Zx', '123', '+0x0007b'],
104
+ ['%+#08Zx', '-123', '-0x0007b'],
105
+
106
+ ['%.0Zd', '0', ''],
107
+ ['%.1Zd', '0', '0'],
108
+ ['%.2Zd', '0', '00'],
109
+ ['%.3Zd', '0', '000']
110
+ ]
111
+
112
+ data.each do |parameters|
113
+ z = GMP::Z(parameters[1])
114
+ if not hex_or_octal(parameters[0]) and (parameters[0]['+'] or z < 0)
115
+ check_plain(parameters[2], parameters[0], z.to_i)
116
+ end
116
117
 
117
- check_one(parameters[2], parameters[0], z)
118
+ check_one(parameters[2], parameters[0], z)
118
119
 
119
- # Same again, with %N and possibly some high zero limbs
120
- nfmt = parameters[0].dup
121
- #lots more weird code... resulting in another check_one
120
+ # Same again, with %N and possibly some high zero limbs
121
+ nfmt = parameters[0].dup
122
+ #lots more weird code... resulting in another check_one
123
+ end
122
124
  end
123
125
  end
124
126
  end
@@ -9,7 +9,7 @@ class TC_precision < Test::Unit::TestCase
9
9
  @initial_default_prec = GMP::F.default_prec
10
10
  end
11
11
  end
12
-
12
+
13
13
  def test_initial_default_precision
14
14
  begin
15
15
  GMP::MPFR_VERSION
@@ -18,7 +18,7 @@ class TC_precision < Test::Unit::TestCase
18
18
  assert_equal(64, GMP::F.default_prec, "The initial default precision without MPFR should be 64.")
19
19
  end
20
20
  end
21
-
21
+
22
22
  def test_initial_default_precision2
23
23
  @pi = GMP::F.new(3.14)
24
24
  @seven_halves = GMP::F.new(GMP::Q.new(7,2), 1000)
@@ -39,7 +39,7 @@ class TC_precision < Test::Unit::TestCase
39
39
  assert_in_delta(3.14000000000000012434, GMP::F.new(@pi), 1e-12)
40
40
  assert_equal(@initial_default_prec, GMP::F.new(@pi).prec)
41
41
  end
42
-
42
+
43
43
  def test_default_precision
44
44
  GMP::F.default_prec = 128
45
45
  @pi = GMP::F.new(3.14)
@@ -62,8 +62,9 @@ class TC_precision < Test::Unit::TestCase
62
62
  assert_equal(128, GMP::F.new(@pi).prec)
63
63
  GMP::F.default_prec = @initial_default_prec
64
64
  end
65
-
65
+
66
66
  def test_specific_precision
67
+ return if not GMP.const_defined? :MPFR_VERSION # I think I can actually fix this...
67
68
  @pi = GMP::F.new(3.14)
68
69
  @seven_halves = GMP::F.new(GMP::Q.new(7,2), 1024)
69
70
  assert_equal(0, GMP::F.new(3.14, 1024).to_s =~ /0\.31400000000000001243449787580175325274467468261718750*e\+1/)
@@ -85,7 +86,7 @@ class TC_precision < Test::Unit::TestCase
85
86
  assert_in_delta(3.5, GMP::F.new(@seven_halves, 0), 1e-12)
86
87
  assert_equal(@initial_default_prec, GMP::F.new(@seven_halves, 0).prec)
87
88
  end
88
-
89
+
89
90
  def test_set_default_prec
90
91
  begin
91
92
  GMP::MPFR_VERSION
data/test/tc_f_to_s.rb CHANGED
@@ -10,6 +10,7 @@ class TC_F_to_s < Test::Unit::TestCase
10
10
  end
11
11
 
12
12
  def test_to_s_default_prec
13
+ return if not GMP.const_defined? :MPFR_VERSION # I might be able to add this one back in...
13
14
  rs = GMP::RandState.new(11213)
14
15
  if GMP.const_defined? :MPFR_VERSION
15
16
  strings = [
@@ -37,6 +38,7 @@ class TC_F_to_s < Test::Unit::TestCase
37
38
  end
38
39
 
39
40
  def test_to_s_bigger_prec
41
+ return if not GMP.const_defined? :MPFR_VERSION
40
42
  rs = GMP::RandState.new(19937)
41
43
  rs2 = GMP::RandState.new(21701)
42
44
  if GMP.const_defined? :MPFR_VERSION
@@ -57,6 +59,7 @@ class TC_F_to_s < Test::Unit::TestCase
57
59
  end
58
60
 
59
61
  def test_different_bases
62
+ return if not GMP.const_defined? :MPFR_VERSION
60
63
  f = GMP::F(0.5)
61
64
  assert_equal("0.50000000000000000e+0", f.to_s)
62
65
  assert_equal("0.10000000000000000000000000000000000000000000000000000e+0", f.to_s(2))
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
+
3
+ class TC_Z_Hamdist < Test::Unit::TestCase
4
+ def setup
5
+ @z32 = GMP::Z(32) # 100000
6
+ @z33 = GMP::Z(33) # 100001
7
+ @z34 = GMP::Z(34) # 100010
8
+ @z35 = GMP::Z(35) # 100011
9
+ @z36 = GMP::Z(36) # 100100
10
+ @z37 = GMP::Z(37) # 100101
11
+ @z38 = GMP::Z(38) # 100110
12
+ @z39 = GMP::Z(39) # 100111
13
+ end
14
+
15
+ def test_hamdist
16
+ assert_equal(0, @z32.hamdist(@z32), "GMP::Z should hamdist(GMP::Z:positive) correctly")
17
+ assert_equal(1, @z32.hamdist(@z33), "GMP::Z should hamdist(GMP::Z:positive) correctly")
18
+ assert_equal(1, @z32.hamdist(@z34), "GMP::Z should hamdist(GMP::Z:positive) correctly")
19
+ assert_equal(2, @z32.hamdist(@z35), "GMP::Z should hamdist(GMP::Z:positive) correctly")
20
+ assert_equal(1, @z32.hamdist(@z36), "GMP::Z should hamdist(GMP::Z:positive) correctly")
21
+ assert_equal(2, @z32.hamdist(@z37), "GMP::Z should hamdist(GMP::Z:positive) correctly")
22
+ assert_equal(2, @z32.hamdist(@z38), "GMP::Z should hamdist(GMP::Z:positive) correctly")
23
+ assert_equal(3, @z32.hamdist(@z39), "GMP::Z should hamdist(GMP::Z:positive) correctly")
24
+ end
25
+ end
data/test/unit_tests.rb CHANGED
@@ -13,6 +13,7 @@ require './tc_z_addmul'
13
13
  require './tc_z_submul'
14
14
  require './tc_z_logic'
15
15
  require './tc_z_exponentiation'
16
+ require './tc_z_hamdist'
16
17
  require './tc_z_to_dis'
17
18
  require './tc_z_shifts_last_bits'
18
19
  require './tc_z_jac_leg_rem'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.7
4
+ version: 0.6.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-09 00:00:00.000000000 Z
13
+ date: 2012-12-12 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: gmp - providing Ruby bindings to the GMP library.
16
16
  email:
@@ -70,6 +70,7 @@ files:
70
70
  - test/tc_z_exponentiation.rb
71
71
  - test/tc_z_functional_mappings.rb
72
72
  - test/tc_z_gcd_lcm_invert.rb
73
+ - test/tc_z_hamdist.rb
73
74
  - test/tc_z_jac_leg_rem.rb
74
75
  - test/tc_z_logic.rb
75
76
  - test/tc_z_shifts_last_bits.rb