gmp 0.5.23 → 0.5.41

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,16 @@
1
+ 0.5.41:
2
+ * Added first five sets of Functional Mappings. These will be the primary new features
3
+ of 0.6.
4
+ * First Functional Mappings: GMP::Z.add, .addmul, .submul, .divexact, .lcm, .sub, .mul,
5
+ .mul_2exp, .cdiv_q_2exp, .cdiv_r_2exp, .fdiv_q_2exp, .fdiv_r_2exp, .tdiv_q_2exp,
6
+ .tdiv_r_2exp, .neg, .abs, .sqrt, .nextprime, .com
7
+ * Added hopeful support for the Rubinius Ruby interpreter and VM! All tests pass in
8
+ Rubinius 1.1.0, but full support won't be added until the release and inspection of
9
+ Rubinius 1.1.1. Tested on 64-bit OS X 10.6 and 64-bit Linux 2.6.35.
10
+ * Unit test results: 114 tests, 16203 assertions, 0 failures, 0 errors
11
+ * Unit test results: 114 tests, 16190 assertions, 0 failures, 0 errors (MPFR 2.4.2)
12
+ * Unit test results: 95 tests, 4925 assertions, 0 failures, 0 errors (w/o MPFR)
13
+
1
14
  0.5.23:
2
15
  * Added MPFR method GMP::F.can_round? (mpfr_can_round), not tested.
3
16
  * MPFR const_ functions now accept an optional rounding mode and precision.
@@ -18,6 +18,10 @@ body {
18
18
  margin-bottom: 32px;
19
19
  }
20
20
 
21
+ #mpzfm-grid {
22
+ margin-bottom: 32px;
23
+ }
24
+
21
25
  #mpq-grid {
22
26
  margin-bottom: 32px;
23
27
  }
@@ -138,6 +142,101 @@ Ext.onReady(function(){
138
142
  ['GMP::Z#size', "mpz_size", "yes","yes", "", "no"]
139
143
  ];
140
144
 
145
+ var mpzFmData = [
146
+ /* method, function, manual, yard, testB, testO */
147
+ //['GMP::Z#swap', "mpz_swap", "","yes","yes", "no"],
148
+ //['GMP::Z#to_i', "mpz_get_si", "yes","yes","yes", "no"],
149
+ //['GMP::Z#to_d', "mpz_get_d", "yes","yes","yes", "no"],
150
+ //['', "mpz_get_d_2exp", "no", "no", "no", "no"],
151
+ //['GMP::Z#to_s', "mpz_get_str", "yes","yes","yes", "no"],
152
+ ['GMP::Z.add', "mpz_add<br />mpz_add_ui", "no", "no", "no", "no"],
153
+ ['GMP::Z.sub', "mpz_sub<br />mpz_sub_ui<br />mpz_ui_sub", "no", "no", "no", "no"],
154
+ ['GMP::Z.mul', "mpz_mul<br />mpz_mul_si<br />mpz_mul_ui", "no", "no", "no", "no"],
155
+ ['GMP::Z.addmul', "mpz_addmul<br />mpz_addmul_ui", "no", "no", "no", "no"],
156
+ ['GMP::Z.submul', "mpz_submul<br />mpz_submul_ui", "no", "no", "no", "no"],
157
+ ['', "mpz_mul_2exp", "no", "no", "no", "no"],
158
+ ['', "mpz_neg", "no", "no", "no", "no"],
159
+ ['', "mpz_abs", "no", "no", "no", "no"],
160
+ ['GMP::Z.divexact', "mpz_divexact<br />mpz_divexact_ui", "no", "no", "no", "no"],
161
+ ['', "mpz_tdiv_q", "no", "no", "no", "no"],
162
+ ['', "mpz_tdiv_r", "no", "no", "no", "no"],
163
+ ['', "mpz_tdiv_qr", "no", "no", "no", "no"],
164
+ /*['GMP::Z#tshr', "mpz_tdiv_q_2exp", "","yes", "no", "no"],
165
+ ['GMP::Z#tshrm', "mpz_tdiv_r_2exp", "", "no", "no", "no"],
166
+ ['GMP::Z#fdiv', "mpz_fdiv_q", "yes","yes","yes", "no"],
167
+ ['GMP::Z#fmod', "mpz_fdiv_r", "yes","yes","yes", "no"],
168
+ ['GMP::Z#fdivmod', "mpz_fdiv_rq", "no", "no", "no", "no"],
169
+ ['GMP::Z#fshr', "mpz_fdiv_q_2exp", "", "no", "no", "no"],
170
+ ['GMP::Z#fshrm', "mpz_fdiv_r_2exp", "", "no", "no", "no"],
171
+ ['GMP::Z#cdiv', "mpz_cdiv_q", "yes","yes","yes", "no"],
172
+ ['GMP::Z#cmod', "mpz_cdiv_r", "yes","yes","yes", "no"],
173
+ ['GMP::Z#cdivmod', "mpz_cdiv_qr", "no", "no", "no", "no"],
174
+ ['', "mpz_cdiv_q_2exp", "no", "no", "no", "no"],
175
+ ['', "mpz_cdiv_r_2exp", "no", "no", "no", "no"],
176
+ ['GMP::Z#%', "mpz_mod<br />mpz_mod_ui", "yes","yes", "", "no"],
177
+ ['GMP::Z#divisible?', "mpz_divisible_p<br />mpz_divisible_ui_p", "no","yes","yes", "no"],
178
+ ['', "mpz_divisible_2exp_p", "no", "no", "no", "no"],
179
+ ['', "mpz_congruent_p<br />mpz_congruent_ui_p", "no", "no", "no", "no"],
180
+ ['', "mpz_congruent_2exp_p", "no", "no", "no", "no"],
181
+ ['GMP::Z#**<br />GMP::Z.pow', "mpz_pow_ui", "yes","yes", "", "no"],
182
+ ['GMP::Z#powmod', "mpz_powm<br />mpz_powm_ui", "yes","yes", "", "no"],
183
+ ['GMP::Z#root', "mpz_root", "yes","yes", "", "no"],
184
+ ['', "mpz_rootrem", "no", "no", "no", "no"],
185
+ ['GMP::Z#sqrt<br />GMP::Z#sqrt!', "mpz_sqrt", "yes","yes", "", "no"],
186
+ ['GMP::Z#sqrtrem', "mpz_sqrtrem", "yes","yes", "", "no"],
187
+ ['GMP::Z#power?', "mpz_perfect_power_p", "yes","yes", "", "no"],
188
+ ['GMP::Z#square?', "mpz_perfect_square_p", "yes","yes", "", "no"],
189
+ ['GMP::Z#probab_prime?', "mpz_probab_prime_p", "yes","yes", "", "no"],
190
+ ['GMP::Z#next_prime<br />' +
191
+ 'GMP::Z#next_prime!', "mpz_nextprime", "yes","yes", "", "no"],*/
192
+ ['', "mpz_gcd<br />mpz_gcd_ui", "no", "no", "no", "no"],
193
+ ['', "mpz_gcdext", "no", "no", "no", "no"],
194
+ ['GMP::Z.lcm', "mpz_lcm<br />mpz_lcm_ui", "no", "no", "no", "no"],
195
+ ['', "mpz_invert", "no", "no", "no", "no"],
196
+ ['', "mpz_jacobi", "no", "no", "no", "no"],
197
+ ['', "mpz_legendre", "no", "no", "no", "no"],
198
+ /*['', "mpz_kronecker<br />mpz_kronecker_si<br />" +
199
+ "mpz_kronecker_ui<br />mpz_si_kronecker" +
200
+ "<br />mpz_ui_kronecker", "yes","yes", "", "no"],
201
+ ['GMP::Z#remove', "mpz_remove", "yes","yes", "", "no"],
202
+ ['GMP::Z.fac', "mpz_fac_ui", "yes","yes", "", "no"],
203
+ ['', "mpz_bin_ui<br />mpz_bin_uiui", "no", "no", "no", "no"],
204
+ ['GMP::Z.fib', "mpz_fib_ui", "yes","yes", "", "no"],
205
+ ['', "mpz_fib2_ui", "no", "no", "no", "no"],
206
+ ['', "mpz_lucnum_ui", "no", "no", "no", "no"],
207
+ ['', "mpz_lucnum2_ui", "no", "no", "no", "no"],
208
+ ['GMP::Z#==<br />GMP::Z#<=><br />' +
209
+ 'GMP::Z#&lt;<br />GMP::Z#&lt;=<br />' +
210
+ 'GMP::Z#&gt;<br />GMP::Z#&gt;=', "mpz_cmp<br />mpz_cmp_si<br />mpz_cmp_ui", "yes","yes", "", "no"],
211
+ ['GMP::Z#cmpabs', "mpz_cmpabs", "yes","yes", "", "no"],
212
+ ['GMP::Z#sgn', "mpz_sgn", "yes","yes", "", "no"],
213
+ ['GMP::Z#eql?', "mpz_get_str", "no","yes", "","n/a"],
214
+ ['GMP::Z#hash', "mpz_get_str", "no","yes", "","n/a"],
215
+ ['GMP::Z#&', "mpz_and", "yes","yes", "", "no"],
216
+ ['GMP::Z#|', "mpz_ior", "yes","yes", "", "no"],
217
+ ['GMP::Z#^', "mpz_xor", "yes","yes", "", "no"],
218
+ ['GMP::Z#com<br />GMP::Z#com!', "mpz_com", "yes","yes", "", "no"],
219
+ ['GMP::Z#popcount', "mpz_popcount", "yes","yes", "", "no"],
220
+ ['', "mpz_hamdist", "no", "no", "no", "no"],
221
+ ['GMP::Z#scan0', "mpz_scan0", "yes","yes", "", "no"],
222
+ ['GMP::Z#scan1', "mpz_scan1", "yes","yes", "", "no"],
223
+ ['GMP::Z#[]=', "mpz_setbit<br />mpz_clrbit", "yes","yes", "", "no"],
224
+ ['', "mpz_combit", "no", "no", "no", "no"],
225
+ ['GMP::Z#[]', "mpz_tstbit", "yes","yes", "", "no"],
226
+ ['', "mpz_fits_ulong_p", "no", "no", "no", "no"],
227
+ ['', "mpz_fits_slong_p", "no", "no", "no", "no"],
228
+ ['', "mpz_fits_uint_p", "no", "no", "no", "no"],
229
+ ['', "mpz_fits_sint_p", "no", "no", "no", "no"],
230
+ ['', "mpz_fits_ushort_p", "no", "no", "no", "no"],
231
+ ['', "mpz_fits_sshort_p", "no", "no", "no", "no"],
232
+ ['GMP::Z#even?', "mpz_even_p", "yes","yes", "", "no"],
233
+ ['GMP::Z#odd?', "mpz_odd_p", "yes","yes", "", "no"],
234
+ ['GMP::Z#sizeinbase<br />' +
235
+ 'GMP::Z#size_in_base', "mpz_sizeinbase", "yes","yes", "", "no"],
236
+ ['GMP::Z#size_in_bin', "mpz_sizeinbase", "yes","yes", "", "no"],
237
+ ['GMP::Z#size', "mpz_size", "yes","yes", "", "no"]*/
238
+ ];
239
+
141
240
  var mpqData = [
142
241
  /* method, function, manual, yard, testB, testO */
143
242
  ['GMP::Q.new', "mpq_init", "","yes","yes", "no"],
@@ -262,6 +361,18 @@ Ext.onReady(function(){
262
361
  ]
263
362
  });
264
363
 
364
+ // create the MPZ Functional Mappings data store
365
+ var mpzfmStore = new Ext.data.ArrayStore({
366
+ fields: [
367
+ {name: 'method'},
368
+ {name: 'function'},
369
+ {name: 'manual'},
370
+ {name: 'yard'},
371
+ {name: 'testBasic'},
372
+ {name: 'testOriginal'}
373
+ ]
374
+ });
375
+
265
376
  // create the MPQ data store
266
377
  var mpqStore = new Ext.data.ArrayStore({
267
378
  fields: [
@@ -288,6 +399,7 @@ Ext.onReady(function(){
288
399
 
289
400
  // manually load local data
290
401
  mpzStore.loadData(mpzData);
402
+ mpzfmStore.loadData(mpzFmData);
291
403
  mpqStore.loadData(mpqData);
292
404
  mpfStore.loadData(mpfData);
293
405
 
@@ -320,7 +432,36 @@ Ext.onReady(function(){
320
432
  }
321
433
  });
322
434
 
323
- // create the MPZ Grid
435
+ // create the MPZ Functional Mappings Grid
436
+ var mpzfmGrid = new Ext.grid.GridPanel({
437
+ store: mpzfmStore,
438
+ columns: [
439
+ {id:'method',header: 'Ruby method', width: 140, sortable: true, dataIndex: 'method'},
440
+ {header: 'C function', width: 130, sortable: true, renderer: shouldExist, dataIndex: 'function'},
441
+ {header: "Doc'd in manual.pdf?", width: 140, sortable: true, renderer: shouldYes, dataIndex: 'manual'},
442
+ {header: "Doc'd in YARD?", width: 100, sortable: true, renderer: shouldYes, dataIndex: 'yard'},
443
+ {header: 'Basic Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testBasic'},
444
+ {header: 'Original Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testOriginal'}
445
+ ],
446
+ stripeRows: true,
447
+ autoExpandColumn: 'method',
448
+ height: 260,
449
+ width: 820,
450
+ title: 'GMP::Z Functional Mappings',
451
+ // config options for stateful behavior
452
+ stateful: true,
453
+ stateId: 'grid',
454
+ viewConfig: {
455
+ getRowClass: function(record, rowIndex, rp, ds){
456
+ if(record.data.method == ""){
457
+ return 'x-grid3-row-unimplemented';
458
+ }
459
+ return 'x-grid3-row';
460
+ }
461
+ }
462
+ });
463
+
464
+ // create the MPQ Grid
324
465
  var mpqGrid = new Ext.grid.GridPanel({
325
466
  store: mpqStore,
326
467
  columns: [
@@ -349,7 +490,7 @@ Ext.onReady(function(){
349
490
  }
350
491
  });
351
492
 
352
- // create the MPZ Grid
493
+ // create the MPF Grid
353
494
  var mpfGrid = new Ext.grid.GridPanel({
354
495
  store: mpfStore,
355
496
  columns: [
@@ -380,6 +521,7 @@ Ext.onReady(function(){
380
521
 
381
522
  // render the grid to the specified div in the page
382
523
  mpzGrid.render('mpz-grid');
524
+ mpzfmGrid.render('mpzfm-grid');
383
525
  mpqGrid.render('mpq-grid');
384
526
  mpfGrid.render('mpf-grid');
385
527
  });
@@ -387,6 +529,7 @@ Ext.onReady(function(){
387
529
  </head>
388
530
  <body>
389
531
  <div id="mpz-grid"></div>
532
+ <div id="mpzfm-grid"></div>
390
533
  <div id='mpq-grid'></div>
391
534
  <div id='mpf-grid'></div>
392
535
  </body>
@@ -47,44 +47,48 @@ paragraph at http://gmplib.org/#WHAT :
47
47
  contributors to sign paperwork where they allow us to distribute their work."
48
48
 
49
49
  Only GMP 4 or newer is supported. The following environments have been tested
50
- by me: gmp gem 0.5.23 on:
51
- +-----------------------------------------+------------------+-------------------+
52
- | Platform | Ruby | GMP (MPFR) |
53
- +-----------------------------------------+------------------+-------------------+
54
- | Linux (Ubuntu NR 10.04) on x86 (32-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.1 (2.4.2) |
55
- | | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
56
- | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
57
- | | (MRI) Ruby 1.9.1 | GMP 4.3.1 (2.4.2) |
58
- | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
59
- | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
60
- | | (MRI) Ruby 1.9.2 | GMP 4.3.1 (2.4.2) |
61
- | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
62
- | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
63
- +-----------------------------------------+------------------+-------------------+
64
- | Linux (Ubuntu 10.04) on x86_64 (64-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
65
- | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
66
- | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
67
- | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
68
- | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
69
- | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
70
- +-----------------------------------------+------------------+-------------------+
71
- | Mac OS X 10.6.4 on x86_64 (64-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
72
- | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
73
- | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
74
- | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
75
- | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
76
- | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
77
- +-----------------------------------------+------------------+-------------------+
78
- | Windows 7 on x86_64 (64-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
79
- | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
80
- | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
81
- | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
82
- | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
83
- | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
84
- +-----------------------------------------+------------------+-------------------+
85
- | Windows XP on x86 (32-bit) | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
86
- | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
87
- +-----------------------------------------+------------------+-------------------+
50
+ by me: gmp gem 0.5.41 on:
51
+ +-----------------------------------------+--------------------+-------------------+
52
+ | Platform | Ruby | GMP (MPFR) |
53
+ +-----------------------------------------+--------------------+-------------------+
54
+ | Linux (Ubuntu NR 10.04) on x86 (32-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.1 (2.4.2) |
55
+ | | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
56
+ | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
57
+ | | (MRI) Ruby 1.9.1 | GMP 4.3.1 (2.4.2) |
58
+ | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
59
+ | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
60
+ | | (MRI) Ruby 1.9.2 | GMP 4.3.1 (2.4.2) |
61
+ | | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
62
+ | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
63
+ +-----------------------------------------+--------------------+-------------------+
64
+ | Linux (Ubuntu 10.04) on x86_64 (64-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
65
+ | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
66
+ | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
67
+ | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
68
+ | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
69
+ | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
70
+ | | (RBX) Rubinius 1.1 | GMP 4.3.2 (2.4.2) |
71
+ | | (RBX) Rubinius 1.1 | GMP 5.0.1 (3.0.0) |
72
+ +-----------------------------------------+--------------------+-------------------+
73
+ | Mac OS X 10.6.4 on x86_64 (64-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
74
+ | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
75
+ | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
76
+ | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
77
+ | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
78
+ | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
79
+ | | (RBX) Rubinius 1.1 | GMP 4.3.2 (2.4.2) |
80
+ | | (RBX) Rubinius 1.1 | GMP 5.0.1 (3.0.0) |
81
+ +-----------------------------------------+--------------------+-------------------+
82
+ | Windows 7 on x86_64 (64-bit) | (MRI) Ruby 1.8.7 | GMP 4.3.2 (2.4.2) |
83
+ | | (MRI) Ruby 1.8.7 | GMP 5.0.1 (3.0.0) |
84
+ | | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
85
+ | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
86
+ | | (MRI) Ruby 1.9.2 | GMP 4.3.2 (2.4.2) |
87
+ | | (MRI) Ruby 1.9.2 | GMP 5.0.1 (3.0.0) |
88
+ +-----------------------------------------+--------------------+-------------------+
89
+ | Windows XP on x86 (32-bit) | (MRI) Ruby 1.9.1 | GMP 4.3.2 (2.4.2) |
90
+ | | (MRI) Ruby 1.9.1 | GMP 5.0.1 (3.0.0) |
91
+ +-----------------------------------------+--------------------+-------------------+
88
92
 
89
93
  =Authors
90
94
 
@@ -317,6 +321,33 @@ You can also call them as:
317
321
  number within 0 <= rop < 1
318
322
 
319
323
 
324
+ =Functional Mappings
325
+
326
+ 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:
327
+
328
+ a = GMP::Z(0)
329
+ b = GMP::Z(13)
330
+ c = GMP::Z(17)
331
+ GMP::Z.add(a, b, c)
332
+ a #=> 30
333
+
334
+ Here's a fun list of all of the functional mappings written so far:
335
+
336
+ GMP::Z
337
+ .abs .add .addmul .cdiv_q_2exp .cdiv_r_2exp .com
338
+ .divexact .fdiv_q_2exp .fdiv_r_2exp .lcm .mul .mul_2exp
339
+ .neg .nextprime .sqrt .sub .submul .tdiv_q_2exp
340
+ .tdiv_r_2exp
341
+
342
+ =Documentation
343
+
344
+ * This README (https://github.com/srawlins/gmp)
345
+ * Loren Segal and the guys at RubyGems.org are badasses. YARDoc is here:
346
+ http://rubydoc.info/gems/gmp/frames
347
+ * There should be a manual.pdf at https://github.com/srawlins/gmp/blob/master/manual.pdf
348
+ I spend waaay too much time working on this, but it looks very pretty.
349
+ * CHANGELOG (https://github.com/srawlins/gmp/blob/master/CHANGELOG)
350
+
320
351
  =Testing
321
352
 
322
353
  Tests can be run with:
@@ -384,36 +415,6 @@ Right now, there are only three such plugged in ruby scripts:
384
415
 
385
416
  <b>OOOLLLDDD... UPDATE PLZ</b>
386
417
 
387
- Results: on my little Intel Core Duo T2400 @ 1.83GHz:
388
- +---------------------------------------------------------+
389
- | GMP 4.3.1* compiled with GCC 3.4.4, I think (cygwin did |
390
- | it) |
391
- +------------+-----------+--------------------------------+
392
- | test | GMP | ruby gmp gem |
393
- | multiply | 4660 | 2473.8 (47% overhead) |
394
- | divide | 2744 | 2253.1 (18% overhead) |
395
- | gcd | 1004.5 | 865.13 (14% overhead) |
396
- | rsa | 515.49 | 506.69 ( 2% overhead) |
397
- +------------+-----------+--------------------------------+
398
- | GMP 5.0.0 compiled with GCC 3.4.4, I think (cygwin did |
399
- | it) |
400
- +------------+-----------+--------------------------------+
401
- | test | GMP | ruby gmp gem |
402
- | multiply | 4905 | 2572.1 (48% overhead) |
403
- | divide | 4873 | 3427.4 (30% overhead) |
404
- | gcd | 1083.5 | 931.75 (14% overhead) |
405
- | rsa | 520.20 | 506.14 ( 3% overhead) |
406
- +------------+--------+-----------------------------------+
407
- | GMP 5.0.1 compiled with GCC 3.4.5 in MinGW |
408
- +------------+-----------+--------------------------------+
409
- | test | GMP | ruby gmp gem |
410
- | multiply | 4950 | xxxx.x (xx% overhead) |
411
- | divide | 4809 | xxxx.x (xx% overhead) |
412
- | gcd | 1071.3 | xxx.xx (xx% overhead) |
413
- | rsa | 524.96 | xxx.xx ( x% overhead) |
414
- +------------+--------+-----------------------------------+
415
- \* GMP 4.3.2 evaluated to almost the same benchmarks.
416
-
417
418
  My guess is that the increase in ruby gmp gem overhead is caused by increased
418
419
  efficiency in GMP; the inefficiencies of the gmp gem are relatively greater.
419
420
 
@@ -423,6 +424,7 @@ efficiency in GMP; the inefficiencies of the gmp gem are relatively greater.
423
424
  #fib2, #lucnum, #lucnum2, #hamdist, #combit, #fits_x?
424
425
  * GMP::Q#to_s(base), GMP::F#to_s(base) (test it!)
425
426
  * benchmark gcdext, pi
427
+ * use Rake use Rake use Rake
426
428
 
427
429
  These are inherited from Tomasz. I will go through these and see which are
428
430
  still relevant, and which I understand.
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require '../ext/gmp'
4
+
5
+ multiplicands = ARGV
6
+ random_state = GMP::RandState.new
7
+
8
+ if multiplicands.size > 1
9
+ m, n = multiplicands[0].to_i, multiplicands[1].to_i
10
+ x = random_state.urandomb(m)
11
+ y = random_state.urandomb(n)
12
+ else
13
+ m = multiplicands[0].to_i
14
+ x = random_state.urandomb(m)
15
+ y = x
16
+ end
17
+
18
+ z = GMP::Z()
19
+ #t = GMP::time { z = x * y }
20
+ t = GMP::time { GMP::Z.mul(z,x,y) }
21
+ iterations = (1 + (1e4 / t)).to_i
22
+
23
+ if multiplicands.size > 1
24
+ print "Multiplying %i-bit number with %i-bit number %i times..." % [m, n, iterations]
25
+ else
26
+ print "Squaring a %i-bit number %i times..." % [m, iterations]
27
+ end
28
+ STDOUT.flush
29
+
30
+ t0 = GMP::cputime
31
+ iterations.times do
32
+ #z = x * y
33
+ GMP::Z.mul(z,x,y)
34
+ end
35
+ ti = GMP::cputime - t0
36
+
37
+ puts "done!"
38
+ ops_per_sec = 1000.0 * iterations / ti
39
+ f = 100.0
40
+ decimals = 0
41
+ while true
42
+ decimals += 1
43
+ break if ops_per_sec > f
44
+ f = f * 0.1
45
+ end
46
+
47
+ puts "RESULT: %#{decimals}f operations per second\n" % ops_per_sec
@@ -25,6 +25,10 @@ if (have_header('mpfr.h') and
25
25
  end
26
26
  end
27
27
 
28
+ unless have_macro('SIZEOF_INTPTR_T')
29
+ check_sizeof('intptr_t')
30
+ end
31
+
28
32
  $CFLAGS += ' -Wall -W -O6 -g'
29
33
  if ok
30
34
  create_makefile('gmp')
data/ext/gmpf.c CHANGED
@@ -1211,6 +1211,7 @@ void init_gmpf()
1211
1211
  // Float Arithmetic
1212
1212
  rb_define_method(cGMP_F, "-", r_gmpf_sub, 1);
1213
1213
  rb_define_method(cGMP_F, "/", r_gmpf_div, 1);
1214
+ rb_define_alias(cGMP_F, "divide", "/");
1214
1215
  #ifndef MPFR
1215
1216
  rb_define_method(cGMP_F, "+", r_gmpf_add, 1);
1216
1217
  rb_define_method(cGMP_F, "*", r_gmpf_mul, 1);