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 +13 -0
- data/FEATURES.html +145 -2
- data/README.rdoc +70 -68
- data/benchmark/multiply.fnl +47 -0
- data/ext/extconf.rb +4 -0
- data/ext/gmpf.c +1 -0
- data/ext/gmpz.c +302 -4
- data/ext/ruby_gmp.h +10 -4
- data/manual.pdf +0 -0
- data/manual.tex +84 -61
- data/test/tc_f_precision.rb +1 -1
- data/test/tc_hashes.rb +2 -0
- data/test/tc_logical_roots.rb +2 -0
- data/test/tc_mpfr_constants.rb +2 -0
- data/test/tc_mpfr_functions.rb +2 -0
- data/test/tc_mpfr_random.rb +2 -0
- data/test/tc_mpfr_rounding.rb +2 -0
- data/test/tc_q.rb +2 -0
- data/test/tc_q_basic.rb +2 -0
- data/test/tc_random.rb +2 -0
- data/test/tc_sgn_neg_abs.rb +2 -0
- data/test/tc_swap.rb +2 -0
- data/test/tc_z.rb +2 -2
- data/test/tc_z_addmul.rb +2 -0
- data/test/tc_z_basic.rb +2 -0
- data/test/tc_z_exponentiation.rb +3 -1
- data/test/tc_z_functional_mappings.rb +100 -0
- data/test/tc_z_gcd_lcm_invert.rb +2 -0
- data/test/tc_z_jac_leg_rem.rb +2 -0
- data/test/tc_zerodivisionexceptions.rb +3 -1
- data/test/unit_tests.rb +5 -4
- metadata +6 -4
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.
|
data/FEATURES.html
CHANGED
@@ -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#<<br />GMP::Z#<=<br />' +
|
210
|
+
'GMP::Z#><br />GMP::Z#>=', "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
|
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>
|
data/README.rdoc
CHANGED
@@ -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.
|
51
|
-
|
52
|
-
| Platform |
|
53
|
-
|
54
|
-
| Linux (Ubuntu NR 10.04) on x86 (32-bit) | (MRI) Ruby 1.8.7
|
55
|
-
| | (MRI) Ruby 1.8.7
|
56
|
-
| | (MRI) Ruby 1.8.7
|
57
|
-
| | (MRI) Ruby 1.9.1
|
58
|
-
| | (MRI) Ruby 1.9.1
|
59
|
-
| | (MRI) Ruby 1.9.1
|
60
|
-
| | (MRI) Ruby 1.9.2
|
61
|
-
| | (MRI) Ruby 1.
|
62
|
-
| | (MRI) Ruby 1.
|
63
|
-
|
64
|
-
| Linux (Ubuntu 10.04) on x86_64 (64-bit) | (MRI) Ruby 1.8.7
|
65
|
-
| | (MRI) Ruby 1.8.7
|
66
|
-
| | (MRI) Ruby 1.9.1
|
67
|
-
| | (MRI) Ruby 1.9.1
|
68
|
-
| | (MRI) Ruby 1.9.2
|
69
|
-
| | (MRI) Ruby 1.9.2
|
70
|
-
|
71
|
-
|
|
72
|
-
|
73
|
-
|
|
74
|
-
| | (MRI) Ruby 1.
|
75
|
-
| | (MRI) Ruby 1.9.
|
76
|
-
| | (MRI) Ruby 1.9.
|
77
|
-
|
78
|
-
|
|
79
|
-
| | (
|
80
|
-
| | (
|
81
|
-
|
82
|
-
|
|
83
|
-
| | (MRI) Ruby 1.
|
84
|
-
|
85
|
-
|
|
86
|
-
| | (MRI) Ruby 1.9.
|
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
|
data/ext/extconf.rb
CHANGED
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);
|