gmp 0.5.3 → 0.5.23
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +19 -0
- data/FEATURES.html +393 -0
- data/README.rdoc +64 -32
- data/ext/gmp.c +5 -55
- data/ext/gmpf.c +300 -179
- data/ext/gmpq.c +81 -111
- data/ext/gmprandstate.c +30 -0
- data/ext/gmpz.c +543 -424
- data/ext/gmpz.h +0 -8
- data/ext/ruby_gmp.h +14 -20
- data/manual.pdf +0 -0
- data/manual.tex +56 -11
- data/test/gmp_tgcd.rb +126 -0
- data/test/mpfr_tconst_euler.rb +36 -0
- data/test/tc_mpfr_functions.rb +48 -17
- data/test/tc_q.rb +80 -0
- data/test/tc_q_basic.rb +2 -2
- data/test/tc_z.rb +46 -16
- data/test/tc_z_submul.rb +94 -0
- data/test/tc_z_to_dis.rb +69 -0
- data/test/unit_tests.rb +8 -5
- metadata +10 -9
- data/benchmark/gexpr +0 -0
- data/test/tc_z_to_d_to_i.rb +0 -24
- data/test/test-12.rb +0 -14
- data/test/test-19.rb +0 -13
data/CHANGELOG
CHANGED
@@ -1,7 +1,26 @@
|
|
1
|
+
0.5.23:
|
2
|
+
* Added MPFR method GMP::F.can_round? (mpfr_can_round), not tested.
|
3
|
+
* MPFR const_ functions now accept an optional rounding mode and precision.
|
4
|
+
* Added GMP method GMP::RandState.rrandomb (mpz_rrandomb)
|
5
|
+
* Added GMP constant GMP_NUMB_MAX
|
6
|
+
* Added GMP method GMP::Z.gcdext.
|
7
|
+
* GMP::Z.gcd and GMP::Z.gcdext are now heavily tested via GMP's tests.
|
8
|
+
* Added MPFR methods GMP::F.sin[h]_cos[h] (mpfr_sin[h]_cos[h]), not tested.
|
9
|
+
* Added MPFR methods GMP::F.atan2, .agm, and .hypot, not tested.
|
10
|
+
* Seriously improved RDoc/YARD documentation.
|
11
|
+
I didn't know rubygems.org auto-yardocs my stuff!
|
12
|
+
* Added GMP method GMP::Z#submul! (mpz_submul) with tests.
|
13
|
+
* Added GMP method GMP::Z#divisible? (mpz_divisible[_ui]_p) with tests.
|
14
|
+
* Preliminary testing with REE on Linux... probably supported next release.
|
15
|
+
* Unit test results: 109 tests, 16144 assertions, 0 failures, 0 errors
|
16
|
+
* Unit test results: 109 tests, 16131 assertions, 0 failures, 0 errors (MPFR 2.4.2)
|
17
|
+
* Unit test results: 90 tests, 4866 assertions, 0 failures, 0 errors (w/o MPFR)
|
18
|
+
|
1
19
|
0.5.3:
|
2
20
|
* Now supporting GMP 5.0.1 (I now test with GMP 4.3.2 and 5.0.1).
|
3
21
|
* Now supporting MPFR 3.0.0 (I now test with MPFR 2.4.2 and 3.0.0).
|
4
22
|
* Now supporting Ruby 1.9.2. A few changes had to be made.
|
23
|
+
* Now supporting 64-bit (mostly Linux right now).
|
5
24
|
* Added MPFR method GMP::F.zero? (mpfr_zero_p) with tests.
|
6
25
|
* Added MPFR method GMP::F.regular? (mpfr_regular_p) with tests (MPFR 3.0.0
|
7
26
|
only).
|
data/FEATURES.html
ADDED
@@ -0,0 +1,393 @@
|
|
1
|
+
<!--A table to show wtf I have completed, etc. For every function that I try to port, there are several tasks to check off. This is that.-->
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<script type="text/javascript" src="http://extjs-public.googlecode.com/svn/tags/extjs-3.2.1/release/adapter/ext/ext-base.js"></script>
|
6
|
+
<script type="text/javascript" src="http://extjs-public.googlecode.com/svn/tags/extjs-3.2.1/release/ext-all.js"></script>
|
7
|
+
<link rel="stylesheet" href="http://extjs-public.googlecode.com/svn/tags/extjs-3.2.1/release/resources/css/ext-all.css"></script>
|
8
|
+
<style>
|
9
|
+
body {
|
10
|
+
padding: 32px;
|
11
|
+
}
|
12
|
+
|
13
|
+
.x-grid3-row-unimplemented {
|
14
|
+
background-color: #FAB;
|
15
|
+
}
|
16
|
+
|
17
|
+
#mpz-grid {
|
18
|
+
margin-bottom: 32px;
|
19
|
+
}
|
20
|
+
|
21
|
+
#mpq-grid {
|
22
|
+
margin-bottom: 32px;
|
23
|
+
}
|
24
|
+
|
25
|
+
#mpf-grid {
|
26
|
+
margin-bottom: 32px;
|
27
|
+
}
|
28
|
+
</style>
|
29
|
+
<script>
|
30
|
+
/*!
|
31
|
+
* Ext JS Library 3.2.1
|
32
|
+
* Copyright(c) 2006-2010 Ext JS, Inc.
|
33
|
+
* licensing@extjs.com
|
34
|
+
* http://www.extjs.com/license
|
35
|
+
*/
|
36
|
+
Ext.onReady(function(){
|
37
|
+
|
38
|
+
// NOTE: This is an example showing simple state management. During development,
|
39
|
+
// it is generally best to disable state management as dynamically-generated ids
|
40
|
+
// can change across page loads, leading to unpredictable results. The developer
|
41
|
+
// should ensure that stable state ids are set for stateful components in real apps.
|
42
|
+
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
43
|
+
|
44
|
+
var mpzData = [
|
45
|
+
/* method, function, manual, yard, testB, testO */
|
46
|
+
['GMP::Z.new', "mpz_init", "yes","yes","yes", "no"],
|
47
|
+
['GMP::Z#swap', "mpz_swap", "","yes","yes", "no"],
|
48
|
+
['GMP::Z#to_i', "mpz_get_si", "yes","yes","yes", "no"],
|
49
|
+
['GMP::Z#to_d', "mpz_get_d", "yes","yes","yes", "no"],
|
50
|
+
['', "mpz_get_d_2exp", "no", "no", "no", "no"],
|
51
|
+
['GMP::Z#to_s', "mpz_get_str", "yes","yes","yes", "no"],
|
52
|
+
['GMP::Z#+<br />GMP::Z#add!', "mpz_add<br />mpz_add_ui<br />mpz_sub_ui", "yes","yes","yes", "no"],
|
53
|
+
['GMP::Z#-<br />GMP::Z#sub!', "mpz_sub<br />mpz_sub_ui<br />mpz_add_ui", "yes","yes","yes", "no"],
|
54
|
+
['GMP::Z#*', "mpz_mul<br />mpz_mul_si", "yes","yes","yes", "no"],
|
55
|
+
['GMP::Z#addmul!', "mpz_addmul<br />mpz_addmul_ui", "yes","yes","yes", "no"],
|
56
|
+
['GMP::Z#submul!', "mpz_submul<br />mpz_submul_ui", "no","yes","yes", "no"],
|
57
|
+
['GMP::Z#<<', "mpz_mul_2exp", "yes","yes", "", "no"],
|
58
|
+
['GMP::Z#-@<br />' +
|
59
|
+
'GMP::Z#neg<br />GMP::Z#neg!', "mpz_neg", "yes","yes", "", "no"],
|
60
|
+
['GMP::Z#abs<br />GMP::Z#abs!', "mpz_abs", "yes","yes", "", "no"],
|
61
|
+
['GMP::Z#/', "mpz_divexact<br />...", "no","yes","yes", "no"],
|
62
|
+
['GMP::Z#tdiv', "mpz_tdiv_q", "yes","yes","yes", "no"],
|
63
|
+
['GMP::Z#tmod', "mpz_tdiv_r", "yes","yes","yes", "no"],
|
64
|
+
['GMP::Z#tdivmod', "mpz_tdiv_qr", "no", "no", "no", "no"],
|
65
|
+
['GMP::Z#tshr', "mpz_tdiv_q_2exp", "","yes", "no", "no"],
|
66
|
+
['GMP::Z#tshrm', "mpz_tdiv_r_2exp", "", "no", "no", "no"],
|
67
|
+
['GMP::Z#fdiv', "mpz_fdiv_q", "yes","yes","yes", "no"],
|
68
|
+
['GMP::Z#fmod', "mpz_fdiv_r", "yes","yes","yes", "no"],
|
69
|
+
['GMP::Z#fdivmod', "mpz_fdiv_rq", "no", "no", "no", "no"],
|
70
|
+
['GMP::Z#fshr', "mpz_fdiv_q_2exp", "", "no", "no", "no"],
|
71
|
+
['GMP::Z#fshrm', "mpz_fdiv_r_2exp", "", "no", "no", "no"],
|
72
|
+
['GMP::Z#cdiv', "mpz_cdiv_q", "yes","yes","yes", "no"],
|
73
|
+
['GMP::Z#cmod', "mpz_cdiv_r", "yes","yes","yes", "no"],
|
74
|
+
['GMP::Z#cdivmod', "mpz_cdiv_qr", "no", "no", "no", "no"],
|
75
|
+
['', "mpz_cdiv_q_2exp", "no", "no", "no", "no"],
|
76
|
+
['', "mpz_cdiv_r_2exp", "no", "no", "no", "no"],
|
77
|
+
['GMP::Z#%', "mpz_mod<br />mpz_mod_ui", "yes","yes", "", "no"],
|
78
|
+
['GMP::Z#divisible?', "mpz_divisible_p<br />mpz_divisible_ui_p", "no","yes","yes", "no"],
|
79
|
+
['', "mpz_divisible_2exp_p", "no", "no", "no", "no"],
|
80
|
+
['', "mpz_congruent_p<br />mpz_congruent_ui_p", "no", "no", "no", "no"],
|
81
|
+
['', "mpz_congruent_2exp_p", "no", "no", "no", "no"],
|
82
|
+
['GMP::Z#**<br />GMP::Z.pow', "mpz_pow_ui", "yes","yes", "", "no"],
|
83
|
+
['GMP::Z#powmod', "mpz_powm<br />mpz_powm_ui", "yes","yes", "", "no"],
|
84
|
+
['GMP::Z#root', "mpz_root", "yes","yes", "", "no"],
|
85
|
+
['', "mpz_rootrem", "no", "no", "no", "no"],
|
86
|
+
['GMP::Z#sqrt<br />GMP::Z#sqrt!', "mpz_sqrt", "yes","yes", "", "no"],
|
87
|
+
['GMP::Z#sqrtrem', "mpz_sqrtrem", "yes","yes", "", "no"],
|
88
|
+
['GMP::Z#power?', "mpz_perfect_power_p", "yes","yes", "", "no"],
|
89
|
+
['GMP::Z#square?', "mpz_perfect_square_p", "yes","yes", "", "no"],
|
90
|
+
['GMP::Z#probab_prime?', "mpz_probab_prime_p", "yes","yes", "", "no"],
|
91
|
+
['GMP::Z#next_prime<br />' +
|
92
|
+
'GMP::Z#next_prime!', "mpz_nextprime", "yes","yes", "", "no"],
|
93
|
+
['GMP::Z#gcd', "mpz_gcd<br />mpz_gcd_ui", "yes","yes", "", "no"],
|
94
|
+
['GMP::Z#gcdext', "mpz_gcdext", "no","yes", "", "no"],
|
95
|
+
['', "mpz_lcm<br />mpz_lcm_ui", "no", "no", "no", "no"],
|
96
|
+
['GMP::Z#invert', "mpz_invert", "yes","yes", "", "no"],
|
97
|
+
['GMP::Z#jacobi<br />GMP::Z.jacobi',"mpz_jacobi", "yes","yes", "", "no"],
|
98
|
+
['GMP::Z#legendre', "mpz_legendre", "yes","yes", "", "no"],
|
99
|
+
['', "mpz_kronecker<br />mpz_kronecker_si<br />" +
|
100
|
+
"mpz_kronecker_ui<br />mpz_si_kronecker" +
|
101
|
+
"<br />mpz_ui_kronecker", "yes","yes", "", "no"],
|
102
|
+
['GMP::Z#remove', "mpz_remove", "yes","yes", "", "no"],
|
103
|
+
['GMP::Z.fac', "mpz_fac_ui", "yes","yes", "", "no"],
|
104
|
+
['', "mpz_bin_ui<br />mpz_bin_uiui", "no", "no", "no", "no"],
|
105
|
+
['GMP::Z.fib', "mpz_fib_ui", "yes","yes", "", "no"],
|
106
|
+
['', "mpz_fib2_ui", "no", "no", "no", "no"],
|
107
|
+
['', "mpz_lucnum_ui", "no", "no", "no", "no"],
|
108
|
+
['', "mpz_lucnum2_ui", "no", "no", "no", "no"],
|
109
|
+
['GMP::Z#==<br />GMP::Z#<=><br />' +
|
110
|
+
'GMP::Z#<<br />GMP::Z#<=<br />' +
|
111
|
+
'GMP::Z#><br />GMP::Z#>=', "mpz_cmp<br />mpz_cmp_si<br />mpz_cmp_ui", "yes","yes", "", "no"],
|
112
|
+
['GMP::Z#cmpabs', "mpz_cmpabs", "yes","yes", "", "no"],
|
113
|
+
['GMP::Z#sgn', "mpz_sgn", "yes","yes", "", "no"],
|
114
|
+
['GMP::Z#eql?', "mpz_get_str", "no","yes", "","n/a"],
|
115
|
+
['GMP::Z#hash', "mpz_get_str", "no","yes", "","n/a"],
|
116
|
+
['GMP::Z#&', "mpz_and", "yes","yes", "", "no"],
|
117
|
+
['GMP::Z#|', "mpz_ior", "yes","yes", "", "no"],
|
118
|
+
['GMP::Z#^', "mpz_xor", "yes","yes", "", "no"],
|
119
|
+
['GMP::Z#com<br />GMP::Z#com!', "mpz_com", "yes","yes", "", "no"],
|
120
|
+
['GMP::Z#popcount', "mpz_popcount", "yes","yes", "", "no"],
|
121
|
+
['', "mpz_hamdist", "no", "no", "no", "no"],
|
122
|
+
['GMP::Z#scan0', "mpz_scan0", "yes","yes", "", "no"],
|
123
|
+
['GMP::Z#scan1', "mpz_scan1", "yes","yes", "", "no"],
|
124
|
+
['GMP::Z#[]=', "mpz_setbit<br />mpz_clrbit", "yes","yes", "", "no"],
|
125
|
+
['', "mpz_combit", "no", "no", "no", "no"],
|
126
|
+
['GMP::Z#[]', "mpz_tstbit", "yes","yes", "", "no"],
|
127
|
+
['', "mpz_fits_ulong_p", "no", "no", "no", "no"],
|
128
|
+
['', "mpz_fits_slong_p", "no", "no", "no", "no"],
|
129
|
+
['', "mpz_fits_uint_p", "no", "no", "no", "no"],
|
130
|
+
['', "mpz_fits_sint_p", "no", "no", "no", "no"],
|
131
|
+
['', "mpz_fits_ushort_p", "no", "no", "no", "no"],
|
132
|
+
['', "mpz_fits_sshort_p", "no", "no", "no", "no"],
|
133
|
+
['GMP::Z#even?', "mpz_even_p", "yes","yes", "", "no"],
|
134
|
+
['GMP::Z#odd?', "mpz_odd_p", "yes","yes", "", "no"],
|
135
|
+
['GMP::Z#sizeinbase<br />' +
|
136
|
+
'GMP::Z#size_in_base', "mpz_sizeinbase", "yes","yes", "", "no"],
|
137
|
+
['GMP::Z#size_in_bin', "mpz_sizeinbase", "yes","yes", "", "no"],
|
138
|
+
['GMP::Z#size', "mpz_size", "yes","yes", "", "no"]
|
139
|
+
];
|
140
|
+
|
141
|
+
var mpqData = [
|
142
|
+
/* method, function, manual, yard, testB, testO */
|
143
|
+
['GMP::Q.new', "mpq_init", "","yes","yes", "no"],
|
144
|
+
['GMP::Q#swap', "mpq_swap", "","yes", "", "no"],
|
145
|
+
['GMP::Q#to_d', "mpq_get_d", "yes","yes", "", "no"],
|
146
|
+
['GMP::Q#to_s', "mpq_get_str", "yes","yes","yes", "no"],
|
147
|
+
['GMP::Q#+', "mpq_add", "no","yes", "", "no"],
|
148
|
+
['GMP::Q#-', "mpq_sub", "no","yes", "", "no"],
|
149
|
+
['GMP::Q#*', "mpq_mul", "no","yes", "", "no"],
|
150
|
+
['', "mpq_mul_2exp", "no", "no", "no", "no"],
|
151
|
+
['GMP::Q#/', "mpq_div", "no","yes", "", "no"],
|
152
|
+
['', "mpq_div_2exp", "no", "no", "no", "no"],
|
153
|
+
['GMP::Q#-@<br />' +
|
154
|
+
'GMP::Q#neg<br />GMP::Q#neg!', "mpq_neg", "no","yes","yes", "no"],
|
155
|
+
['GMP::Q#abs<br />GMP::Q#abs!', "mpq_abs", "no","yes","yes", "no"],
|
156
|
+
['GMP::Q#inv<br />GMP::Q#inv!', "mpq_inv", "no","yes","yes", "no"],
|
157
|
+
['GMP::Q#==<br />GMP::Q#<=><br />' +
|
158
|
+
'GMP::Q#<<br />GMP::Q#<=<br />' +
|
159
|
+
'GMP::Q#><br />GMP::Q#>=', "mpq_cmp<br />mpq_cmp_si<br />mpq_cmp_ui", "no", "no", "", "no"],
|
160
|
+
['GMP::Q#cmpabs', "mpq_cmpabs", "no", "no", "", "no"],
|
161
|
+
['GMP::Q#sgn', "mpq_sgn", "no","yes", "", "no"],
|
162
|
+
['GMP::Q#num', "mpq_get_num", "no", "no", "no", "no"],
|
163
|
+
['GMP::Q#den', "mpq_get_den", "no", "no", "no", "no"],
|
164
|
+
['', "mpq_set_num", "no", "no", "no", "no"],
|
165
|
+
['', "mpq_set_den", "no", "no", "no", "no"]
|
166
|
+
];
|
167
|
+
|
168
|
+
var mpfData = [
|
169
|
+
/* method, function, manual, yard, testB, testO */
|
170
|
+
['GMP::F.new', "mpq_init", "no", "","yes", "no"],
|
171
|
+
['', "mpf_swap", "no", "no", "no", "no"],
|
172
|
+
['GMP::F#to_d', "mpf_get_d", "no","yes", "", "no"],
|
173
|
+
['GMP::F#to_s', "mpf_get_str", "no","yes", "", "no"],
|
174
|
+
['GMP::F#+', "mpf_add", "no","yes", "", "no"],
|
175
|
+
['GMP::F#-', "mpf_sub", "no","yes", "", "no"],
|
176
|
+
['GMP::F#*', "mpf_mul", "no","yes", "", "no"],
|
177
|
+
['GMP::F#/', "mpf_div", "no","yes", "", "no"],
|
178
|
+
['GMP::F#-@<br />' +
|
179
|
+
'GMP::F#neg<br />GMP::F#neg!', "mpf_neg", "no","yes", "", "no"],
|
180
|
+
['GMP::F#abs<br />GMP::F#abs!', "mpf_abs", "no","yes", "", "no"],
|
181
|
+
['GMP::F#==<br />GMP::F#<=><br />' +
|
182
|
+
'GMP::F#<<br />GMP::F#<=<br />' +
|
183
|
+
'GMP::F#><br />GMP::F#>=', "mpf_cmp<br />mpf_cmp_si<br />mpf_cmp_ui", "no", "no", "", "no"],
|
184
|
+
['', "mpf_reldiff", "no", "no", "no", "no"],
|
185
|
+
['GMP::F#sgn', "mpf_sgn", "no","yes", "", "no"],
|
186
|
+
['GMP::F#ceil', "mpf_ceil", "no","yes", "", "no"],
|
187
|
+
['GMP::F#floor', "mpf_floor", "no","yes", "", "no"],
|
188
|
+
['GMP::F#trunc', "mpf_trunc", "no","yes", "", "no"],
|
189
|
+
['', "mpf_fits_ulong_p", "no", "no", "no", "no"],
|
190
|
+
['', "mpf_fits_slong_p", "no", "no", "no", "no"],
|
191
|
+
['', "mpf_fits_uint_p", "no", "no", "no", "no"],
|
192
|
+
['', "mpf_fits_sint_p", "no", "no", "no", "no"],
|
193
|
+
['', "mpf_fits_ushort_p", "no", "no", "no", "no"],
|
194
|
+
['', "mpf_fits_sshort_p", "no", "no", "no", "no"]
|
195
|
+
];
|
196
|
+
|
197
|
+
/**
|
198
|
+
* Custom function used for column renderer
|
199
|
+
* @param {Object} val
|
200
|
+
*/
|
201
|
+
function change(val){
|
202
|
+
if(val > 0){
|
203
|
+
return '<span style="color:green;">' + val + '</span>';
|
204
|
+
}else if(val < 0){
|
205
|
+
return '<span style="color:red;">' + val + '</span>';
|
206
|
+
}
|
207
|
+
return val;
|
208
|
+
}
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Custom function used for column renderer
|
212
|
+
* @param {Object} val
|
213
|
+
*/
|
214
|
+
function pctChange(val){
|
215
|
+
if(val > 0){
|
216
|
+
return '<span style="color:green;">' + val + '%</span>';
|
217
|
+
}else if(val < 0){
|
218
|
+
return '<span style="color:red;">' + val + '%</span>';
|
219
|
+
}
|
220
|
+
return val;
|
221
|
+
}
|
222
|
+
|
223
|
+
/**
|
224
|
+
* Custom function used for column renderer
|
225
|
+
* @param {Object} val
|
226
|
+
*/
|
227
|
+
function shouldExist(val){
|
228
|
+
if(val == ''){
|
229
|
+
return '<span style="background-color:#FFCCCC;"> <i>missing</i> </span>';
|
230
|
+
}
|
231
|
+
return val;
|
232
|
+
}
|
233
|
+
|
234
|
+
/**
|
235
|
+
* Custom function used for column renderer
|
236
|
+
* @param {Object} val
|
237
|
+
*/
|
238
|
+
function shouldYes(val){
|
239
|
+
if(val == ''){
|
240
|
+
return '<span style="background-color:#FFCCCC;"> <i>missing</i> </span>';
|
241
|
+
}else if(typeof val != "string"){
|
242
|
+
return val;
|
243
|
+
} else if(val.match(/no/i)){
|
244
|
+
return '<span style="color:red;">' + val + '</span>';
|
245
|
+
} else if(val.match(/yes/i)){
|
246
|
+
return '<span style="color:green;">' + val + '</span>';
|
247
|
+
} else if(val.match(/n\/a/i)){
|
248
|
+
return '<span style="color:#AAAAAA;">' + val + '</span>';
|
249
|
+
}
|
250
|
+
return val;
|
251
|
+
}
|
252
|
+
|
253
|
+
// create the MPZ data store
|
254
|
+
var mpzStore = new Ext.data.ArrayStore({
|
255
|
+
fields: [
|
256
|
+
{name: 'method'},
|
257
|
+
{name: 'function'},
|
258
|
+
{name: 'manual'},
|
259
|
+
{name: 'yard'},
|
260
|
+
{name: 'testBasic'},
|
261
|
+
{name: 'testOriginal'}
|
262
|
+
]
|
263
|
+
});
|
264
|
+
|
265
|
+
// create the MPQ data store
|
266
|
+
var mpqStore = new Ext.data.ArrayStore({
|
267
|
+
fields: [
|
268
|
+
{name: 'method'},
|
269
|
+
{name: 'function'},
|
270
|
+
{name: 'manual'},
|
271
|
+
{name: 'yard'},
|
272
|
+
{name: 'testBasic'},
|
273
|
+
{name: 'testOriginal'}
|
274
|
+
]
|
275
|
+
});
|
276
|
+
|
277
|
+
// create the MPQ data store
|
278
|
+
var mpfStore = new Ext.data.ArrayStore({
|
279
|
+
fields: [
|
280
|
+
{name: 'method'},
|
281
|
+
{name: 'function'},
|
282
|
+
{name: 'manual'},
|
283
|
+
{name: 'yard'},
|
284
|
+
{name: 'testBasic'},
|
285
|
+
{name: 'testOriginal'}
|
286
|
+
]
|
287
|
+
});
|
288
|
+
|
289
|
+
// manually load local data
|
290
|
+
mpzStore.loadData(mpzData);
|
291
|
+
mpqStore.loadData(mpqData);
|
292
|
+
mpfStore.loadData(mpfData);
|
293
|
+
|
294
|
+
// create the MPZ Grid
|
295
|
+
var mpzGrid = new Ext.grid.GridPanel({
|
296
|
+
store: mpzStore,
|
297
|
+
columns: [
|
298
|
+
{id:'method',header: 'Ruby method', width: 140, sortable: true, dataIndex: 'method'},
|
299
|
+
{header: 'C function', width: 130, sortable: true, renderer: shouldExist, dataIndex: 'function'},
|
300
|
+
{header: "Doc'd in manual.pdf?", width: 140, sortable: true, renderer: shouldYes, dataIndex: 'manual'},
|
301
|
+
{header: "Doc'd in YARD?", width: 100, sortable: true, renderer: shouldYes, dataIndex: 'yard'},
|
302
|
+
{header: 'Basic Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testBasic'},
|
303
|
+
{header: 'Original Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testOriginal'}
|
304
|
+
],
|
305
|
+
stripeRows: true,
|
306
|
+
autoExpandColumn: 'method',
|
307
|
+
height: 260,
|
308
|
+
width: 820,
|
309
|
+
title: 'GMP::Z',
|
310
|
+
// config options for stateful behavior
|
311
|
+
stateful: true,
|
312
|
+
stateId: 'grid',
|
313
|
+
viewConfig: {
|
314
|
+
getRowClass: function(record, rowIndex, rp, ds){
|
315
|
+
if(record.data.method == ""){
|
316
|
+
return 'x-grid3-row-unimplemented';
|
317
|
+
}
|
318
|
+
return 'x-grid3-row';
|
319
|
+
}
|
320
|
+
}
|
321
|
+
});
|
322
|
+
|
323
|
+
// create the MPZ Grid
|
324
|
+
var mpqGrid = new Ext.grid.GridPanel({
|
325
|
+
store: mpqStore,
|
326
|
+
columns: [
|
327
|
+
{id:'method',header: 'Ruby method', width: 140, sortable: true, dataIndex: 'method'},
|
328
|
+
{header: 'C function', width: 130, sortable: true, renderer: shouldExist, dataIndex: 'function'},
|
329
|
+
{header: "Doc'd in manual.pdf?", width: 140, sortable: true, renderer: shouldYes, dataIndex: 'manual'},
|
330
|
+
{header: "Doc'd in YARD?", width: 100, sortable: true, renderer: shouldYes, dataIndex: 'yard'},
|
331
|
+
{header: 'Basic Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testBasic'},
|
332
|
+
{header: 'Original Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testOriginal'}
|
333
|
+
],
|
334
|
+
stripeRows: true,
|
335
|
+
autoExpandColumn: 'method',
|
336
|
+
height: 260,
|
337
|
+
width: 820,
|
338
|
+
title: 'GMP::Q',
|
339
|
+
// config options for stateful behavior
|
340
|
+
stateful: true,
|
341
|
+
stateId: 'grid',
|
342
|
+
viewConfig: {
|
343
|
+
getRowClass: function(record, rowIndex, rp, ds){
|
344
|
+
if(record.data.method == ""){
|
345
|
+
return 'x-grid3-row-unimplemented';
|
346
|
+
}
|
347
|
+
return 'x-grid3-row';
|
348
|
+
}
|
349
|
+
}
|
350
|
+
});
|
351
|
+
|
352
|
+
// create the MPZ Grid
|
353
|
+
var mpfGrid = new Ext.grid.GridPanel({
|
354
|
+
store: mpfStore,
|
355
|
+
columns: [
|
356
|
+
{id:'method',header: 'Ruby method', width: 140, sortable: true, dataIndex: 'method'},
|
357
|
+
{header: 'C function', width: 130, sortable: true, renderer: shouldExist, dataIndex: 'function'},
|
358
|
+
{header: "Doc'd in manual.pdf?", width: 140, sortable: true, renderer: shouldYes, dataIndex: 'manual'},
|
359
|
+
{header: "Doc'd in YARD?", width: 100, sortable: true, renderer: shouldYes, dataIndex: 'yard'},
|
360
|
+
{header: 'Basic Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testBasic'},
|
361
|
+
{header: 'Original Tests?', width: 100, sortable: true, renderer: shouldYes, dataIndex: 'testOriginal'}
|
362
|
+
],
|
363
|
+
stripeRows: true,
|
364
|
+
autoExpandColumn: 'method',
|
365
|
+
height: 260,
|
366
|
+
width: 820,
|
367
|
+
title: 'GMP::F',
|
368
|
+
// config options for stateful behavior
|
369
|
+
stateful: true,
|
370
|
+
stateId: 'grid',
|
371
|
+
viewConfig: {
|
372
|
+
getRowClass: function(record, rowIndex, rp, ds){
|
373
|
+
if(record.data.method == ""){
|
374
|
+
return 'x-grid3-row-unimplemented';
|
375
|
+
}
|
376
|
+
return 'x-grid3-row';
|
377
|
+
}
|
378
|
+
}
|
379
|
+
});
|
380
|
+
|
381
|
+
// render the grid to the specified div in the page
|
382
|
+
mpzGrid.render('mpz-grid');
|
383
|
+
mpqGrid.render('mpq-grid');
|
384
|
+
mpfGrid.render('mpf-grid');
|
385
|
+
});
|
386
|
+
</script>
|
387
|
+
</head>
|
388
|
+
<body>
|
389
|
+
<div id="mpz-grid"></div>
|
390
|
+
<div id='mpq-grid'></div>
|
391
|
+
<div id='mpf-grid'></div>
|
392
|
+
</body>
|
393
|
+
</html>
|
data/README.rdoc
CHANGED
@@ -47,25 +47,44 @@ 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.
|
51
|
-
|
52
|
-
| Platform
|
53
|
-
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
58
|
-
|
|
59
|
-
|
60
|
-
|
|
61
|
-
|
62
|
-
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
+
+-----------------------------------------+------------------+-------------------+
|
69
88
|
|
70
89
|
=Authors
|
71
90
|
|
@@ -81,8 +100,11 @@ as pi, are defined under class methods of GMP::F, listed below.
|
|
81
100
|
GMP::GMP_CC #=> The compiler used to compile GMP
|
82
101
|
GMP::GMP_CFLAGS #=> The CFLAGS used to compile GMP
|
83
102
|
GMP::GMP_BITS_PER_LIMB #=> The number of bits per limb
|
103
|
+
GMP::GMP_NUMB_MAX #=> The maximum value that can be stored in the number part of a limb
|
84
104
|
(if MPFR is available)
|
85
105
|
GMP::MPFR_VERSION #=> A string like "2.4.2"
|
106
|
+
GMP::MPFR_PREC_MIN #=> The minimum precision available
|
107
|
+
GMP::MPFR_PREC_MAX #=> The maximum precision available
|
86
108
|
GMP::GMP_RNDN #=> The constant representing "round to nearest"
|
87
109
|
GMP::GMP_RNDZ #=> The constant representing "round toward zero"
|
88
110
|
GMP::GMP_RNDU #=> The constant representing "round toward plus infinity"
|
@@ -138,6 +160,7 @@ You can also call them as:
|
|
138
160
|
+ addition
|
139
161
|
- substraction
|
140
162
|
* multiplication
|
163
|
+
/ division
|
141
164
|
to_s convert to string. For GMP::Z, this method takes
|
142
165
|
one optional argument, a base. The base can be a
|
143
166
|
Fixnum in the ranges [2, 62] or [-36, -2] or a
|
@@ -159,10 +182,17 @@ You can also call them as:
|
|
159
182
|
may have different precisions, which would make
|
160
183
|
them unswapable
|
161
184
|
GMP::Z
|
185
|
+
to_i convert to Fixnum or Bignum
|
162
186
|
add! in-place addition
|
163
187
|
sub! in-place subtraction
|
188
|
+
addmul!(b,c) in-place += b*c
|
189
|
+
submul!(b,c) in-place -= b*c
|
164
190
|
tdiv,fdiv,cdiv truncate, floor and ceil division
|
165
191
|
tmod,fmod,cmod truncate, floor and ceil modulus
|
192
|
+
>> shift right, floor
|
193
|
+
divisible?(b) true if divisible by b
|
194
|
+
** power
|
195
|
+
powmod power modulo
|
166
196
|
[],[]= testing and setting bits (as booleans)
|
167
197
|
scan0,scan1 starting at bitnr (1st arg), scan for a 0 or 1
|
168
198
|
(respectively), then return the index of the
|
@@ -171,12 +201,9 @@ You can also call them as:
|
|
171
201
|
com 2's complement
|
172
202
|
com! in-place 2's complement
|
173
203
|
&,|,^ logical operations: and, or, xor
|
174
|
-
** power
|
175
|
-
powmod power modulo
|
176
204
|
even? is even
|
177
205
|
odd? is odd
|
178
206
|
<< shift left
|
179
|
-
>> shift right, floor
|
180
207
|
tshr shift right, truncate
|
181
208
|
lastbits_pos(n) last n bits of object, modulo if negative
|
182
209
|
lastbits_sgn(n) last n bits of object, preserve sign
|
@@ -190,7 +217,7 @@ You can also call them as:
|
|
190
217
|
certainly prime
|
191
218
|
nextprime next *probable* prime
|
192
219
|
nextprime! change the object into its next *probable* prime
|
193
|
-
gcd
|
220
|
+
gcd, gcdext greatest common divisor
|
194
221
|
invert(m) invert mod m
|
195
222
|
jacobi jacobi symbol
|
196
223
|
legendre legendre symbol
|
@@ -199,9 +226,6 @@ You can also call them as:
|
|
199
226
|
sizeinbase(b) digits in base b
|
200
227
|
size_in_bin digits in binary
|
201
228
|
size number of limbs
|
202
|
-
to_i convert to Fixnum or Bignum
|
203
|
-
GMP::Q and GMP::F
|
204
|
-
/ division
|
205
229
|
GMP::Q
|
206
230
|
num numerator
|
207
231
|
den denominator
|
@@ -260,18 +284,23 @@ You can also call them as:
|
|
260
284
|
y0 second kind Bessel function of order 0 of object
|
261
285
|
y1 second kind Bessel function of order 1 of object
|
262
286
|
yn second kind Bessel function of order n of object
|
287
|
+
agm arithmetic-geometric mean
|
288
|
+
hypot
|
263
289
|
cos \
|
264
290
|
sin |
|
265
291
|
tan |
|
292
|
+
sin_cos |
|
266
293
|
sec |
|
267
294
|
csc |
|
268
295
|
cot |
|
269
296
|
acos |
|
270
297
|
asin |
|
271
298
|
atan | trigonometric functions
|
299
|
+
atan2 |
|
272
300
|
cosh | of the object
|
273
301
|
sinh |
|
274
302
|
tanh |
|
303
|
+
sinh_cosh |
|
275
304
|
sec |
|
276
305
|
csc |
|
277
306
|
cot |
|
@@ -352,7 +381,9 @@ Right now, there are only three such plugged in ruby scripts:
|
|
352
381
|
whose size (in bits) is given by 2 operands.
|
353
382
|
* rsa - measures performance of using RSA to sign messages. The size of pq, the
|
354
383
|
product of the two co-prime GMP::Z objects, p and q, is given by 1 operand.
|
355
|
-
|
384
|
+
|
385
|
+
<b>OOOLLLDDD... UPDATE PLZ</b>
|
386
|
+
|
356
387
|
Results: on my little Intel Core Duo T2400 @ 1.83GHz:
|
357
388
|
+---------------------------------------------------------+
|
358
389
|
| GMP 4.3.1* compiled with GCC 3.4.4, I think (cygwin did |
|
@@ -388,6 +419,11 @@ efficiency in GMP; the inefficiencies of the gmp gem are relatively greater.
|
|
388
419
|
|
389
420
|
=Todo
|
390
421
|
|
422
|
+
* GMP::Z#to_d_2exp, #congruent?, #rootrem, #lcm, #kronecker, #bin,
|
423
|
+
#fib2, #lucnum, #lucnum2, #hamdist, #combit, #fits_x?
|
424
|
+
* GMP::Q#to_s(base), GMP::F#to_s(base) (test it!)
|
425
|
+
* benchmark gcdext, pi
|
426
|
+
|
391
427
|
These are inherited from Tomasz. I will go through these and see which are
|
392
428
|
still relevant, and which I understand.
|
393
429
|
|
@@ -396,11 +432,9 @@ still relevant, and which I understand.
|
|
396
432
|
* to_s vs. inspect
|
397
433
|
* check if mpz_addmul_ui would optimize some statements
|
398
434
|
* some system that allows using denref and numref as normal ruby objects (?)
|
399
|
-
* should we allocate global temporary variables like Perl GMP does?
|
400
435
|
* takeover code that replaces all Bignums with GMP::Z
|
401
|
-
* better bignum parser
|
436
|
+
* better bignum parser (how? to_s seems good to me.)
|
402
437
|
* zero-copy method for strings generation
|
403
|
-
* put rb_raise into nice macros
|
404
438
|
* benchmarks against Python GMP and Perl GMP
|
405
439
|
* dup methods
|
406
440
|
* integrate F into system
|
@@ -412,5 +446,3 @@ still relevant, and which I understand.
|
|
412
446
|
* check if different sorting of operatations gives better cache usage
|
413
447
|
* GMP::* op RubyFloat and RubyFloat op GMP::*
|
414
448
|
* sort checks
|
415
|
-
* GMP::Q.to_s(base), GMP::F.to_s(base) (test it!)
|
416
|
-
* benchmark gcdext, pi
|