gmp 0.4.3-x86-mingw32 → 0.4.7-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 +16 -1
- data/README.rdoc +20 -1
- data/ext/gmp.c +55 -52
- data/ext/gmp.so +0 -0
- data/ext/gmpf.c +123 -28
- data/ext/gmpq.c +7 -6
- data/ext/gmpz.c +220 -179
- data/ext/mprnd.c +77 -0
- data/ext/mprnd.h +12 -0
- data/ext/ruby_gmp.h +66 -31
- data/manual.pdf +0 -0
- data/manual.tex +271 -39
- data/test/mpfr_tsqrt.rb +37 -8
- data/test/tc_hashes.rb +30 -0
- data/test/tc_mpfr_functions.rb +45 -2
- data/test/tc_mpfr_rounding.rb +27 -0
- data/test/tc_q.rb +12 -0
- data/test/test_helper.rb +1 -1
- data/test/unit_tests.rb +2 -0
- metadata +6 -2
data/ext/mprnd.c
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#include <mprnd.h>
|
2
|
+
|
3
|
+
#ifdef MPFR
|
4
|
+
|
5
|
+
VALUE r_mprnd_initialize(int argc, VALUE *argv, VALUE self);
|
6
|
+
|
7
|
+
VALUE r_mprndsg_new(int argc, VALUE *argv, VALUE klass)
|
8
|
+
{
|
9
|
+
VALUE res;
|
10
|
+
int *res_value;
|
11
|
+
(void)klass;
|
12
|
+
res_value = 0;
|
13
|
+
|
14
|
+
mprnd_make_struct(res, res_value);
|
15
|
+
rb_obj_call_init(res, argc, argv);
|
16
|
+
return res;
|
17
|
+
}
|
18
|
+
|
19
|
+
VALUE r_mprnd_initialize(int argc, VALUE *argv, VALUE self)
|
20
|
+
{
|
21
|
+
VALUE mode, name, ieee754;
|
22
|
+
mode = argv[0];
|
23
|
+
(void)argc;
|
24
|
+
switch (FIX2INT(mode)) {
|
25
|
+
case 0:
|
26
|
+
name = rb_str_new2("GMP_RNDN");
|
27
|
+
ieee754 = rb_str_new2("roundTiesToEven");
|
28
|
+
break;
|
29
|
+
case 1:
|
30
|
+
name = rb_str_new2("GMP_RNDZ");
|
31
|
+
ieee754 = rb_str_new2("roundTowardZero");
|
32
|
+
break;
|
33
|
+
case 2:
|
34
|
+
name = rb_str_new2("GMP_RNDU");
|
35
|
+
ieee754 = rb_str_new2("roundTowardPositive");
|
36
|
+
break;
|
37
|
+
case 3:
|
38
|
+
name = rb_str_new2("GMP_RNDD");
|
39
|
+
ieee754 = rb_str_new2("roundTowardNegative");
|
40
|
+
break;
|
41
|
+
default:
|
42
|
+
name = rb_str_new2("GMP_RNDN");
|
43
|
+
ieee754 = rb_str_new2("roundTiesToEven");
|
44
|
+
}
|
45
|
+
rb_iv_set(self, "@mode", mode);
|
46
|
+
rb_iv_set(self, "@name", name);
|
47
|
+
rb_iv_set(self, "@ieee754", ieee754);
|
48
|
+
return Qnil;
|
49
|
+
}
|
50
|
+
|
51
|
+
VALUE r_mprnd_inspect(VALUE self)
|
52
|
+
{
|
53
|
+
return rb_iv_get(self, "@name");
|
54
|
+
}
|
55
|
+
|
56
|
+
void init_gmprnd()
|
57
|
+
{
|
58
|
+
mGMP = rb_define_module("GMP");
|
59
|
+
ID new_id = rb_intern("new");
|
60
|
+
|
61
|
+
cGMP_Rnd = rb_define_class_under(mGMP, "Rnd", rb_cObject);
|
62
|
+
|
63
|
+
rb_define_singleton_method(cGMP_Rnd, "new", r_mprndsg_new, -1);
|
64
|
+
rb_define_method(cGMP_Rnd, "initialize", r_mprnd_initialize, -1);
|
65
|
+
rb_define_method(cGMP_Rnd, "inspect", r_mprnd_inspect, 0);
|
66
|
+
|
67
|
+
rb_define_attr (cGMP_Rnd, "mode", 1, 0);
|
68
|
+
rb_define_attr (cGMP_Rnd, "name", 1, 0);
|
69
|
+
rb_define_attr (cGMP_Rnd, "ieee754", 1, 0);
|
70
|
+
|
71
|
+
rb_define_const(mGMP, "GMP_RNDN", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(0)));
|
72
|
+
rb_define_const(mGMP, "GMP_RNDZ", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(1)));
|
73
|
+
rb_define_const(mGMP, "GMP_RNDU", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(2)));
|
74
|
+
rb_define_const(mGMP, "GMP_RNDD", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(3)));
|
75
|
+
}
|
76
|
+
|
77
|
+
#endif /* MPFR */
|
data/ext/mprnd.h
ADDED
data/ext/ruby_gmp.h
CHANGED
@@ -82,7 +82,16 @@ typedef __gmp_randstate_struct MP_RANDSTATE;
|
|
82
82
|
//should change exception type
|
83
83
|
#define not_yet rb_raise(rb_eTypeError,"Not implemented yet")
|
84
84
|
|
85
|
+
#ifdef MPFR
|
86
|
+
#define mprnd_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, int, c_var); }
|
87
|
+
#define mprnd_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Rnd, int, 0, 0, c_var); }
|
88
|
+
#define GMPRND_P(value) (rb_obj_is_instance_of(value, cGMP_Rnd) == Qtrue)
|
89
|
+
#endif /* MPFR */
|
90
|
+
|
85
91
|
extern VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F, cGMP_RandState;
|
92
|
+
#ifdef MPFR
|
93
|
+
extern VALUE cGMP_Rnd;
|
94
|
+
#endif /* MPFR */
|
86
95
|
|
87
96
|
extern void r_gmpz_free(void *ptr);
|
88
97
|
extern void r_gmpq_free(void *ptr);
|
@@ -110,12 +119,16 @@ extern VALUE r_gmpz_add_self(VALUE self, VALUE arg);
|
|
110
119
|
extern VALUE r_gmpz_sub(VALUE self, VALUE arg);
|
111
120
|
extern VALUE r_gmpz_sub_self(VALUE self, VALUE arg);
|
112
121
|
extern VALUE r_gmpz_mul(VALUE self, VALUE arg);
|
122
|
+
extern VALUE r_gmpz_div(VALUE self, VALUE arg);
|
113
123
|
|
114
124
|
// Integer Division
|
115
125
|
extern VALUE r_gmpz_mod(VALUE self, VALUE arg);
|
116
126
|
|
117
127
|
// Integer Exponentiation
|
118
128
|
extern VALUE r_gmpzsg_pow(VALUE klass, VALUE base, VALUE exp);
|
129
|
+
extern VALUE r_gmpz_powm(VALUE self, VALUE exp, VALUE mod);
|
130
|
+
|
131
|
+
// Integer Roots
|
119
132
|
|
120
133
|
// Number Theoretic Functions
|
121
134
|
extern VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self);
|
@@ -130,22 +143,19 @@ extern VALUE r_gmpz_remove(VALUE self, VALUE arg);
|
|
130
143
|
extern VALUE r_gmpz_eq(VALUE self, VALUE arg);
|
131
144
|
extern VALUE r_gmpz_cmp(VALUE self, VALUE arg);
|
132
145
|
extern VALUE r_gmpz_cmpabs(VALUE self, VALUE arg);
|
146
|
+
extern VALUE r_gmpz_sgn(VALUE self);
|
147
|
+
extern int mpz_cmp_value(MP_INT *OP, VALUE arg);
|
133
148
|
|
134
|
-
//
|
135
|
-
extern VALUE r_gmpz_sizeinbase(VALUE self, VALUE base);
|
136
|
-
extern VALUE r_gmpz_size_in_bin(VALUE self);
|
137
|
-
|
138
|
-
// _unsorted_
|
139
|
-
extern VALUE r_gmpz_div(VALUE self, VALUE arg);
|
149
|
+
// Integer Logic and Bit Fiddling
|
140
150
|
extern VALUE r_gmpz_popcount(VALUE self);
|
141
|
-
extern VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to);
|
142
|
-
extern VALUE r_gmpz_getbit(VALUE self, VALUE bitnr);
|
143
151
|
extern VALUE r_gmpz_scan0(VALUE self, VALUE bitnr);
|
144
152
|
extern VALUE r_gmpz_scan1(VALUE self, VALUE bitnr);
|
145
|
-
extern VALUE
|
146
|
-
extern VALUE
|
147
|
-
extern int mpz_cmp_value(MP_INT *OP, VALUE arg);
|
153
|
+
extern VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to);
|
154
|
+
extern VALUE r_gmpz_getbit(VALUE self, VALUE bitnr);
|
148
155
|
|
156
|
+
// Miscelaneous Integer Functions
|
157
|
+
extern VALUE r_gmpz_sizeinbase(VALUE self, VALUE base);
|
158
|
+
extern VALUE r_gmpz_size_in_bin(VALUE self);
|
149
159
|
|
150
160
|
|
151
161
|
/* from gmpq.h */
|
@@ -209,36 +219,58 @@ extern int mpf_cmp_value(MP_FLOAT *OP, VALUE arg);
|
|
209
219
|
|
210
220
|
// MPFR
|
211
221
|
#ifdef MPFR
|
212
|
-
extern VALUE r_gmpfr_sqrt(VALUE self);
|
222
|
+
extern VALUE r_gmpfr_sqrt(int argc, VALUE *argv, VALUE self);
|
213
223
|
|
214
|
-
extern VALUE r_gmpfr_log(VALUE self);
|
215
|
-
extern VALUE r_gmpfr_log2(VALUE self);
|
216
|
-
extern VALUE r_gmpfr_log10(VALUE self);
|
217
|
-
extern VALUE r_gmpfr_exp(VALUE self);
|
224
|
+
extern VALUE r_gmpfr_log(int argc, VALUE *argv, VALUE self);
|
225
|
+
extern VALUE r_gmpfr_log2(int argc, VALUE *argv, VALUE self);
|
226
|
+
extern VALUE r_gmpfr_log10(int argc, VALUE *argv, VALUE self);
|
227
|
+
extern VALUE r_gmpfr_exp(int argc, VALUE *argv, VALUE self);
|
228
|
+
extern VALUE r_gmpfr_exp2(int argc, VALUE *argv, VALUE self);
|
229
|
+
extern VALUE r_gmpfr_exp10(int argc, VALUE *argv, VALUE self);
|
230
|
+
extern VALUE r_gmpfr_cos(int argc, VALUE *argv, VALUE self);
|
231
|
+
extern VALUE r_gmpfr_sin(int argc, VALUE *argv, VALUE self);
|
232
|
+
extern VALUE r_gmpfr_tan(int argc, VALUE *argv, VALUE self);
|
233
|
+
extern VALUE r_gmpfr_sec(int argc, VALUE *argv, VALUE self);
|
234
|
+
extern VALUE r_gmpfr_csc(int argc, VALUE *argv, VALUE self);
|
235
|
+
extern VALUE r_gmpfr_cot(int argc, VALUE *argv, VALUE self);
|
218
236
|
|
219
|
-
extern VALUE
|
220
|
-
extern VALUE
|
221
|
-
extern VALUE
|
222
|
-
extern VALUE r_gmpfr_sec(VALUE self);
|
223
|
-
extern VALUE r_gmpfr_csc(VALUE self);
|
224
|
-
extern VALUE r_gmpfr_cot(VALUE self);
|
237
|
+
extern VALUE r_gmpfr_acos(int argc, VALUE *argv, VALUE self);
|
238
|
+
extern VALUE r_gmpfr_asin(int argc, VALUE *argv, VALUE self);
|
239
|
+
extern VALUE r_gmpfr_atan(int argc, VALUE *argv, VALUE self);
|
225
240
|
|
226
|
-
extern VALUE
|
227
|
-
extern VALUE
|
228
|
-
extern VALUE
|
241
|
+
extern VALUE r_gmpfr_cosh(int argc, VALUE *argv, VALUE self);
|
242
|
+
extern VALUE r_gmpfr_sinh(int argc, VALUE *argv, VALUE self);
|
243
|
+
extern VALUE r_gmpfr_tanh(int argc, VALUE *argv, VALUE self);
|
229
244
|
|
230
|
-
extern VALUE
|
231
|
-
extern VALUE
|
232
|
-
extern VALUE
|
245
|
+
extern VALUE r_gmpfr_sech(int argc, VALUE *argv, VALUE self);
|
246
|
+
extern VALUE r_gmpfr_csch(int argc, VALUE *argv, VALUE self);
|
247
|
+
extern VALUE r_gmpfr_coth(int argc, VALUE *argv, VALUE self);
|
248
|
+
extern VALUE r_gmpfr_acosh(int argc, VALUE *argv, VALUE self);
|
249
|
+
extern VALUE r_gmpfr_asinh(int argc, VALUE *argv, VALUE self);
|
250
|
+
extern VALUE r_gmpfr_atanh(int argc, VALUE *argv, VALUE self);
|
233
251
|
|
234
|
-
extern VALUE
|
235
|
-
extern VALUE
|
236
|
-
extern VALUE
|
252
|
+
extern VALUE r_gmpfr_log1p(int argc, VALUE *argv, VALUE self);
|
253
|
+
extern VALUE r_gmpfr_expm1(int argc, VALUE *argv, VALUE self);
|
254
|
+
extern VALUE r_gmpfr_eint(int argc, VALUE *argv, VALUE self);
|
255
|
+
extern VALUE r_gmpfr_li2(int argc, VALUE *argv, VALUE self);
|
256
|
+
extern VALUE r_gmpfr_gamma(int argc, VALUE *argv, VALUE self);
|
257
|
+
extern VALUE r_gmpfr_lngamma(int argc, VALUE *argv, VALUE self);
|
258
|
+
/*extern VALUE r_gmpfr_lgamma(int argc, VALUE *argv, VALUE self);*/
|
259
|
+
extern VALUE r_gmpfr_zeta(int argc, VALUE *argv, VALUE self);
|
260
|
+
extern VALUE r_gmpfr_erf(int argc, VALUE *argv, VALUE self);
|
261
|
+
extern VALUE r_gmpfr_erfc(int argc, VALUE *argv, VALUE self);
|
262
|
+
extern VALUE r_gmpfr_j0(int argc, VALUE *argv, VALUE self);
|
263
|
+
extern VALUE r_gmpfr_j1(int argc, VALUE *argv, VALUE self);
|
264
|
+
extern VALUE r_gmpfr_jn(int argc, VALUE *argv, VALUE self);
|
265
|
+
extern VALUE r_gmpfr_y0(int argc, VALUE *argv, VALUE self);
|
266
|
+
extern VALUE r_gmpfr_y1(int argc, VALUE *argv, VALUE self);
|
237
267
|
|
238
268
|
extern VALUE r_gmpfrsg_const_log2();
|
239
269
|
extern VALUE r_gmpfrsg_const_pi();
|
240
270
|
extern VALUE r_gmpfrsg_const_euler();
|
241
271
|
extern VALUE r_gmpfrsg_const_catalan();
|
272
|
+
|
273
|
+
extern mp_rnd_t r_get_rounding_mode(VALUE rnd);
|
242
274
|
#endif /* MPFR */
|
243
275
|
|
244
276
|
// _unsorted_
|
@@ -279,5 +311,8 @@ extern void init_gmpq();
|
|
279
311
|
extern void init_gmpf();
|
280
312
|
extern void init_gmprandstate();
|
281
313
|
extern void init_gmpbench_timing();
|
314
|
+
#ifdef MPFR
|
315
|
+
extern void init_gmprnd();
|
316
|
+
#endif /* MPFR */
|
282
317
|
|
283
318
|
#endif
|
data/manual.pdf
CHANGED
Binary file
|
data/manual.tex
CHANGED
@@ -28,8 +28,8 @@
|
|
28
28
|
\huge{gmp} &\\
|
29
29
|
\midrule[3pt]
|
30
30
|
\multicolumn{2}{r}{\large{Ruby bindings to the GMP library}}\\
|
31
|
-
\multicolumn{2}{r}{\large{Edition 0.4.
|
32
|
-
\multicolumn{2}{r}{\large{
|
31
|
+
\multicolumn{2}{r}{\large{Edition 0.4.7}}\\
|
32
|
+
\multicolumn{2}{r}{\large{25 March 2010}}
|
33
33
|
\end{tabular}
|
34
34
|
|
35
35
|
\vfill
|
@@ -159,12 +159,8 @@ Or you may install the gem from gemcutter:\\
|
|
159
159
|
\\
|
160
160
|
\texttt{gem install gmp}\\
|
161
161
|
|
162
|
-
|
163
|
-
|
164
|
-
\texttt{gem install srawlins-gmp}\\
|
165
|
-
|
166
|
-
At this time, the gem does not self-compile (how does that work?). To compile the C
|
167
|
-
extensions, do the following:\\
|
162
|
+
At this time, the gem does self-compiles. If required libraries cannot be found, you may
|
163
|
+
compile the C extensions manually with:\\
|
168
164
|
\\
|
169
165
|
\texttt{cd <gmp gem directory>/ext}\\
|
170
166
|
\texttt{ruby extconf.rb}\\
|
@@ -181,16 +177,15 @@ You can run this test suite with:\\
|
|
181
177
|
\texttt{ruby unit\_tests.rb}\\
|
182
178
|
|
183
179
|
All tests should pass. If you don't have the test-unit gem installed, then you may
|
184
|
-
run into one error.
|
185
|
-
that the test-unit gem monkey patches.
|
180
|
+
run into one error.
|
186
181
|
|
187
182
|
\section{GMP and gmp gem basics}
|
188
183
|
|
189
184
|
\subsection{Classes}
|
190
185
|
The gmp gem includes the namespace \texttt{GMP} and four classes within \texttt{GMP}:
|
191
186
|
\begin{itemize}
|
192
|
-
\item \texttt{GMP::Z} - Methods for signed integer arithmetic. There are
|
193
|
-
methods here
|
187
|
+
\item \texttt{GMP::Z} - Methods for signed integer arithmetic. There are about 64
|
188
|
+
methods here.
|
194
189
|
\item \texttt{GMP::Q} - Methods for rational number arithmetic. There are at least 11
|
195
190
|
methods here (still accounting).
|
196
191
|
\item \texttt{GMP::F} - Methods for floating-point arithmetic. There are at least 6
|
@@ -199,7 +194,7 @@ The gmp gem includes the namespace \texttt{GMP} and four classes within \texttt{
|
|
199
194
|
methods here.
|
200
195
|
\end{itemize}
|
201
196
|
|
202
|
-
In addition to the above four classes, there
|
197
|
+
In addition to the above four classes, there are also four constants within \texttt{GMP}:
|
203
198
|
\begin{itemize}
|
204
199
|
\item \texttt{GMP::GMP\_VERSION} - The version of GMP linked into the gmp gem
|
205
200
|
\item \texttt{GMP::GMP\_CC} - The compiler that compiled GMP linked into the gmp gem
|
@@ -502,6 +497,31 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
502
497
|
}
|
503
498
|
\end{tabular}
|
504
499
|
|
500
|
+
\newpage
|
501
|
+
\subsection{Integer Exponentiation}
|
502
|
+
|
503
|
+
\begin{tabular}{p{\methwidth} l r}
|
504
|
+
\toprule
|
505
|
+
\textbf{**} & & \textit{integer} ** \textit{numeric} $\rightarrow$ \textit{numeric} \\
|
506
|
+
& & \textit{integer}.pow(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
|
507
|
+
\cmidrule(r){2-3}
|
508
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
509
|
+
Returns $integer$ raised to the $numeric$ power.
|
510
|
+
}
|
511
|
+
\end{tabular}
|
512
|
+
\newline\newline
|
513
|
+
|
514
|
+
\begin{tabular}{p{\methwidth} l r}
|
515
|
+
\toprule
|
516
|
+
\textbf{powmod} & & \textit{integer}.powmod(\textit{exp}, \textit{mod}) $\rightarrow$ \textit{integer} \\
|
517
|
+
\cmidrule(r){2-3}
|
518
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
519
|
+
Returns $integer$ raised to the $exp$ power, modulo $mod$. Negative $exp$ is supported
|
520
|
+
if an inverse, $integer^{-1}$ modulo $mod$, exists. If an inverse doesn't exist then a
|
521
|
+
divide by zero exception is raised.
|
522
|
+
}
|
523
|
+
\end{tabular}
|
524
|
+
|
505
525
|
\subsection{Integer Roots}
|
506
526
|
|
507
527
|
\begin{tabular}{p{\methwidth} l r}
|
@@ -517,7 +537,7 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
517
537
|
\begin{tabular}{p{\methwidth} l r}
|
518
538
|
\toprule
|
519
539
|
\textbf{sqrt} & & \textit{integer}.sqrt $\rightarrow$ \textit{numeric} \\
|
520
|
-
& & \textit{integer}.sqrt!
|
540
|
+
& & \textit{integer}.sqrt! $\rightarrow$ \textit{numeric} \\
|
521
541
|
\cmidrule(r){2-3}
|
522
542
|
& \multicolumn{2}{p{\defnwidth}}{
|
523
543
|
Returns the truncated integer part of the square root of $integer$.
|
@@ -562,30 +582,6 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
562
582
|
}
|
563
583
|
\end{tabular}
|
564
584
|
|
565
|
-
\subsection{Integer Exponentiation}
|
566
|
-
|
567
|
-
\begin{tabular}{p{\methwidth} l r}
|
568
|
-
\toprule
|
569
|
-
\textbf{**} & & \textit{integer} ** \textit{numeric} $\rightarrow$ \textit{numeric} \\
|
570
|
-
& & \textit{integer}.pow(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
|
571
|
-
\cmidrule(r){2-3}
|
572
|
-
& \multicolumn{2}{p{\defnwidth}}{
|
573
|
-
Returns $integer$ raised to the $numeric$ power.
|
574
|
-
}
|
575
|
-
\end{tabular}
|
576
|
-
\newline\newline
|
577
|
-
|
578
|
-
\begin{tabular}{p{\methwidth} l r}
|
579
|
-
\toprule
|
580
|
-
\textbf{powmod} & & \textit{integer}.powmod(\textit{exp}, \textit{mod}) $\rightarrow$ \textit{integer} \\
|
581
|
-
\cmidrule(r){2-3}
|
582
|
-
& \multicolumn{2}{p{\defnwidth}}{
|
583
|
-
Returns $integer$ raised to the $exp$ power, modulo $mod$. Negative $exp$ is supported
|
584
|
-
if an inverse, $integer^{-1}$ modulo $mod$, exists. If an inverse doesn't exist then a
|
585
|
-
divide by zero exception is raised.
|
586
|
-
}
|
587
|
-
\end{tabular}
|
588
|
-
|
589
585
|
\subsection{Number Theoretic Functions}
|
590
586
|
|
591
587
|
\begin{tabular}{p{\methwidth} l r}
|
@@ -715,6 +711,113 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
715
711
|
}
|
716
712
|
\end{tabular}
|
717
713
|
|
714
|
+
\subsection{Integer Comparisons}
|
715
|
+
|
716
|
+
\begin{tabular}{p{\methwidth} l r}
|
717
|
+
\toprule
|
718
|
+
\textbf{\textless=\textgreater} & & $a$ \textless=\textgreater\ $b$ $\rightarrow$ $fixnum$ \\
|
719
|
+
\cmidrule(r){2-3}
|
720
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
721
|
+
Returns a negative Fixnum if $a$ is less than $b$.\newline
|
722
|
+
Returns 0 if $a$ is equal to $b$.\newline
|
723
|
+
Returns a positive Fixnum if $a$ is greater than $b$.
|
724
|
+
}
|
725
|
+
\end{tabular}
|
726
|
+
\newline\newline
|
727
|
+
|
728
|
+
\begin{tabular}{p{\methwidth} l r}
|
729
|
+
\toprule
|
730
|
+
\textbf{\textless} & & $a$ \textless\ $b$ $\rightarrow$ $boolean$ \\
|
731
|
+
\cmidrule(r){2-3}
|
732
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
733
|
+
Returns true if $a$ is less than $b$.
|
734
|
+
}
|
735
|
+
\end{tabular}
|
736
|
+
\newline\newline
|
737
|
+
|
738
|
+
\begin{tabular}{p{\methwidth} l r}
|
739
|
+
\toprule
|
740
|
+
\textbf{\textless=} & & $a$ \textless=\ $b$ $\rightarrow$ $boolean$ \\
|
741
|
+
\cmidrule(r){2-3}
|
742
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
743
|
+
Returns true if $a$ is less than or equal to $b$.
|
744
|
+
}
|
745
|
+
\end{tabular}
|
746
|
+
\newline\newline
|
747
|
+
|
748
|
+
\begin{tabular}{p{\methwidth} l r}
|
749
|
+
\toprule
|
750
|
+
\textbf{==} & & $a$ == $b$ $\rightarrow$ $boolean$ \\
|
751
|
+
\cmidrule(r){2-3}
|
752
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
753
|
+
Returns true if $a$ is equal to $b$.
|
754
|
+
}
|
755
|
+
\end{tabular}
|
756
|
+
\newline\newline
|
757
|
+
|
758
|
+
\begin{tabular}{p{\methwidth} l r}
|
759
|
+
\toprule
|
760
|
+
\textbf{\textgreater=} & & $a$ \textgreater= $b$ $\rightarrow$ $boolean$ \\
|
761
|
+
\cmidrule(r){2-3}
|
762
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
763
|
+
Returns true if $a$ is greater than or equal to $b$.
|
764
|
+
}
|
765
|
+
\end{tabular}
|
766
|
+
\newline\newline
|
767
|
+
|
768
|
+
\begin{tabular}{p{\methwidth} l r}
|
769
|
+
\toprule
|
770
|
+
\textbf{\textgreater} & & $a$ \textgreater\ $b$ $\rightarrow$ $boolean$ \\
|
771
|
+
\cmidrule(r){2-3}
|
772
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
773
|
+
Returns true if $a$ is greater than $b$.
|
774
|
+
}
|
775
|
+
\end{tabular}
|
776
|
+
\newline\newline
|
777
|
+
|
778
|
+
\begin{tabular}{p{\methwidth} l r}
|
779
|
+
\toprule
|
780
|
+
\textbf{cmpabs} & & $a$.cmpabs($b$) $\rightarrow$ $fixnum$ \\
|
781
|
+
\cmidrule(r){2-3}
|
782
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
783
|
+
Returns a negative Fixnum if abs($a$) is less than abs($b$).\newline
|
784
|
+
Returns 0 if abs($a$) is equal to abs($b$).\newline
|
785
|
+
Returns a positive Fixnum if abs($a$) is greater than abs($b$).
|
786
|
+
}
|
787
|
+
\end{tabular}
|
788
|
+
\newline\newline
|
789
|
+
|
790
|
+
\begin{tabular}{p{\methwidth} l r}
|
791
|
+
\toprule
|
792
|
+
\textbf{sgn} & & $a$.sgn $\rightarrow$ $-1$, $0$, or $1$ \\
|
793
|
+
\cmidrule(r){2-3}
|
794
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
795
|
+
Returns -1 if $a$ is less than $b$.\newline
|
796
|
+
Returns 0 if $a$ is equal to $b$.\newline
|
797
|
+
Returns 1 if $a$ is greater than $b$.
|
798
|
+
}
|
799
|
+
\end{tabular}
|
800
|
+
\newline\newline
|
801
|
+
|
802
|
+
\begin{tabular}{p{\methwidth} l r}
|
803
|
+
\toprule
|
804
|
+
\textbf{eql?} & & $a$.eql?($b$) $\rightarrow$ $boolean$ \\
|
805
|
+
\cmidrule(r){2-3}
|
806
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
807
|
+
Used when comparing objects as Hash keys.
|
808
|
+
}
|
809
|
+
\end{tabular}
|
810
|
+
\newline\newline
|
811
|
+
|
812
|
+
\begin{tabular}{p{\methwidth} l r}
|
813
|
+
\toprule
|
814
|
+
\textbf{hash} & & $a$.hash $\rightarrow$ $string$ \\
|
815
|
+
\cmidrule(r){2-3}
|
816
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
817
|
+
Used when comparing objects as Hash keys.
|
818
|
+
}
|
819
|
+
\end{tabular}
|
820
|
+
|
718
821
|
\subsection{Integer Logic and Bit Fiddling}
|
719
822
|
|
720
823
|
\begin{tabular}{p{\methwidth} l r}
|
@@ -747,6 +850,30 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
747
850
|
\end{tabular}
|
748
851
|
\newline\newline
|
749
852
|
|
853
|
+
\begin{tabular}{p{\methwidth} l r}
|
854
|
+
\toprule
|
855
|
+
\textbf{com} & & $integer$.com $\rightarrow$ $complement$ \\
|
856
|
+
& & $integer$.com! $\rightarrow$ $complement$ \\
|
857
|
+
\cmidrule(r){2-3}
|
858
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
859
|
+
Returns the one's complement of $integer$. The destructive method sets $integer$ to
|
860
|
+
the one's complement of $integer$.
|
861
|
+
}
|
862
|
+
\end{tabular}
|
863
|
+
\newline\newline
|
864
|
+
|
865
|
+
\begin{tabular}{p{\methwidth} l r}
|
866
|
+
\toprule
|
867
|
+
\textbf{popcount} & & $n$.popcount $\rightarrow$ $fixnum$ \\
|
868
|
+
\cmidrule(r){2-3}
|
869
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
870
|
+
If $n>=0$, return the population count of $n$, which is the number of 1 bits in the
|
871
|
+
binary representation. If $n<0$, the number of 1s is infinite, and the return value
|
872
|
+
is the largest possible $mp\_bitcnt\_t$.
|
873
|
+
}
|
874
|
+
\end{tabular}
|
875
|
+
\newline\newline
|
876
|
+
|
750
877
|
\begin{tabular}{p{\methwidth} l r}
|
751
878
|
\toprule
|
752
879
|
\textbf{scan0} & & $n$.scan0($i$) $\rightarrow$ $integer$ \\
|
@@ -761,6 +888,84 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
761
888
|
scan0 past the end of a negative number.
|
762
889
|
}
|
763
890
|
\end{tabular}
|
891
|
+
\newline\newline
|
892
|
+
|
893
|
+
\begin{tabular}{p{\methwidth} l r}
|
894
|
+
\toprule
|
895
|
+
\textbf{scan1} & & $n$.scan1($i$) $\rightarrow$ $integer$ \\
|
896
|
+
\cmidrule(r){2-3}
|
897
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
898
|
+
Scans $n$, starting from bit $i$, towards more significant bits, until the first 1 bit
|
899
|
+
is found. Return the index of the found bit.
|
900
|
+
\newline\newline
|
901
|
+
If the bit at $i$ is already what's sought, then $i$ is returned.
|
902
|
+
\newline\newline
|
903
|
+
If there's no bit found, then $INT2FIX(ULONG\_MAX)$ is returned. This will happen in
|
904
|
+
scan1 past the end of a negative number.
|
905
|
+
}
|
906
|
+
\end{tabular}
|
907
|
+
\newline\newline
|
908
|
+
|
909
|
+
\begin{tabular}{p{\methwidth} l r}
|
910
|
+
\toprule
|
911
|
+
\textbf{[]} & & $n$[$bit\_index$] $\rightarrow$ $0$ or $1$ \\
|
912
|
+
\cmidrule(r){2-3}
|
913
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
914
|
+
Tests bit $bit\_index$ in $n$ and return $0$ or $1$ accordingly.
|
915
|
+
}
|
916
|
+
\end{tabular}
|
917
|
+
\newline\newline
|
918
|
+
|
919
|
+
\begin{tabular}{p{\methwidth} l r}
|
920
|
+
\toprule
|
921
|
+
\textbf{[]=} & & $n$[$bit\_index$]=$i$ $\rightarrow$ $nil$ \\
|
922
|
+
\cmidrule(r){2-3}
|
923
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
924
|
+
Sets bit $bit\_index$ in $n$ to $i$.
|
925
|
+
}
|
926
|
+
\end{tabular}
|
927
|
+
|
928
|
+
\newpage
|
929
|
+
\subsection{Miscellaneous Integer Functions}
|
930
|
+
|
931
|
+
\begin{tabular}{p{\methwidth} l r}
|
932
|
+
\toprule
|
933
|
+
\textbf{odd?} & & $n$.odd? $\rightarrow$ $boolean$ \\
|
934
|
+
\cmidrule(r){2-3}
|
935
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
936
|
+
Returns whether $n$ is odd.
|
937
|
+
}
|
938
|
+
\end{tabular}
|
939
|
+
\newline\newline
|
940
|
+
|
941
|
+
\begin{tabular}{p{\methwidth} l r}
|
942
|
+
\toprule
|
943
|
+
\textbf{even?} & & $n$.even? $\rightarrow$ $boolean$ \\
|
944
|
+
\cmidrule(r){2-3}
|
945
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
946
|
+
Returns whether $n$ is even.
|
947
|
+
}
|
948
|
+
\end{tabular}
|
949
|
+
\newline\newline
|
950
|
+
|
951
|
+
\begin{tabular}{p{\methwidth} l r}
|
952
|
+
\toprule
|
953
|
+
\textbf{sizeinbase} & & $n$.sizeinbase($b$) $\rightarrow$ $digits$ \\
|
954
|
+
\cmidrule(r){2-3}
|
955
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
956
|
+
Returns the number of digits in base $b$. $b$ can vary between 2 and 62.
|
957
|
+
}
|
958
|
+
\end{tabular}
|
959
|
+
\newline\newline
|
960
|
+
|
961
|
+
\begin{tabular}{p{\methwidth} l r}
|
962
|
+
\toprule
|
963
|
+
\textbf{size\_in\_bin} & & $n$.size\_in\_bin $\rightarrow$ $digits$ \\
|
964
|
+
\cmidrule(r){2-3}
|
965
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
966
|
+
Returns the number of digits in $n$'s binary representation.
|
967
|
+
}
|
968
|
+
\end{tabular}
|
764
969
|
|
765
970
|
\newpage
|
766
971
|
\section{Rational Functions}
|
@@ -781,7 +986,7 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
781
986
|
|
782
987
|
\texttt{GMP::Q.new \qqqquad\qqqquad \#=> 0 (default) \newline
|
783
988
|
GMP::Q.new(1) \qqqquad\qquad\ \#=> 1 (Ruby Fixnum) \newline
|
784
|
-
GMP::Q.new(1,3) \qqqquad\ \#=> 1/3 (Ruby Fixnums) \newline
|
989
|
+
GMP::Q.new(1,3) \qqqquad\quad\ \#=> 1/3 (Ruby Fixnums) \newline
|
785
990
|
GMP::Q.new("127") \qqqquad\ \#=> 127 (Ruby String)\newline
|
786
991
|
GMP::Q.new(4294967296) \qquad \#=> 4294967296 (Ruby Bignum)\newline
|
787
992
|
GMP::Q.new(GMP::Z.new(31)) \#=> 31 (GMP Integer)}
|
@@ -791,6 +996,33 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
791
996
|
|
792
997
|
There is also a convenience method available, \texttt{GMP::Q()}.\\
|
793
998
|
|
999
|
+
\subsection{Converting Rationals}
|
1000
|
+
|
1001
|
+
\begin{tabular}{p{\methwidth} l r}
|
1002
|
+
\toprule
|
1003
|
+
\textbf{to\_d} & & \textit{rational}.to\_d $\rightarrow$ \textit{float} \\
|
1004
|
+
\cmidrule(r){2-3}
|
1005
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
1006
|
+
Returns \textit{rational} as an Float if \textit{rational} fits in a Float.
|
1007
|
+
|
1008
|
+
Otherwise returns the least significant part of \texttt{rational}, with the same sign as
|
1009
|
+
\textit{rational}.
|
1010
|
+
|
1011
|
+
If \textit{rational} is too big to fit in a Float, the returned result is probably not
|
1012
|
+
very useful.
|
1013
|
+
}
|
1014
|
+
\end{tabular}
|
1015
|
+
\newline\newline
|
1016
|
+
|
1017
|
+
\begin{tabular}{p{\methwidth} l r}
|
1018
|
+
\toprule
|
1019
|
+
\textbf{to\_s} & & \textit{rational}.to\_s $\rightarrow$ \textit{str} \\
|
1020
|
+
\cmidrule(r){2-3}
|
1021
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
1022
|
+
Converts \textit{rational} to a string.
|
1023
|
+
}
|
1024
|
+
\end{tabular}
|
1025
|
+
|
794
1026
|
\newpage
|
795
1027
|
\section{Random Number Functions}
|
796
1028
|
|