gmp 0.5.3-x86-mingw32 → 0.5.23-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +19 -0
- data/FEATURES.html +393 -0
- data/README.rdoc +64 -32
- data/ext/gmp.c +5 -55
- data/ext/gmp.so +0 -0
- 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
|