srawlins-gmp 0.1.5 → 0.1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +13 -1
- data/ext/gmpf.c +423 -0
- data/ext/gmpq.c +679 -0
- data/ext/gmpz.c +1598 -0
- data/ext/ruby_gmp.h +192 -0
- metadata +5 -1
data/ext/ruby_gmp.h
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
#ifndef _RUBY_GMP_H_
|
2
|
+
#define _RUBY_GMP_H_
|
3
|
+
|
4
|
+
#define _GNU_SOURCE
|
5
|
+
#include <stdio.h>
|
6
|
+
|
7
|
+
#include <ruby.h>
|
8
|
+
#include <gmp.h>
|
9
|
+
|
10
|
+
#ifdef MPFR
|
11
|
+
|
12
|
+
#ifdef HAVE_MPFR_H
|
13
|
+
#include <mpfr.h>
|
14
|
+
#endif /* HAVE_MPFR_H */
|
15
|
+
|
16
|
+
#ifdef HAVE_MPF2MPFR_H
|
17
|
+
#include <mpf2mpfr.h>
|
18
|
+
#endif /* HAVE_MPF2MPFR_H */
|
19
|
+
|
20
|
+
#endif /* MPFR */
|
21
|
+
|
22
|
+
#include <stdlib.h>
|
23
|
+
|
24
|
+
/*
|
25
|
+
MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
|
26
|
+
of single-element arrays mp*_t
|
27
|
+
|
28
|
+
MP_FLOAT is defined here, as it's commented out in gmp.h
|
29
|
+
*/
|
30
|
+
#if defined(MPFR) && defined(HAVE_MPFR_H)
|
31
|
+
typedef __mpfr_struct MP_FLOAT;
|
32
|
+
#else
|
33
|
+
typedef __mpf_struct MP_FLOAT;
|
34
|
+
#endif /* HAVE_MPF2MPFR_H */
|
35
|
+
|
36
|
+
#define mpz_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_INT, c_var); }
|
37
|
+
#define mpq_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_RAT, c_var); }
|
38
|
+
#define mpf_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_FLOAT, c_var); }
|
39
|
+
#define mpf_get_struct_prec(ruby_var,c_var,prec) { mpf_get_struct(ruby_var,c_var); prec = mpf_get_prec(c_var); }
|
40
|
+
#define mpz_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Z, MP_INT, 0, r_gmpz_free, c_var); }
|
41
|
+
#define mpq_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Q, MP_RAT, 0, r_gmpq_free, c_var); }
|
42
|
+
#define mpf_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_F, MP_FLOAT, 0, r_gmpf_free, c_var); }
|
43
|
+
#define mpz_make_struct_init(ruby_var,c_var) { mpz_make_struct(ruby_var,c_var); mpz_init (c_var); }
|
44
|
+
#define mpq_make_struct_init(ruby_var,c_var) { mpq_make_struct(ruby_var,c_var); mpq_init (c_var); }
|
45
|
+
#define mpf_make_struct_init(ruby_var,c_var,prec) { mpf_make_struct(ruby_var,c_var); mpf_init2 (c_var,prec); }
|
46
|
+
#define BIGNUM_P(value) (TYPE(value) == T_BIGNUM)
|
47
|
+
#define FLOAT_P(value) (TYPE(value) == T_FLOAT)
|
48
|
+
#define STRING_P(value) (TYPE(value) == T_STRING)
|
49
|
+
#define GMPZ_P(value) (rb_obj_is_instance_of(value, cGMP_Z) == Qtrue)
|
50
|
+
#define GMPQ_P(value) (rb_obj_is_instance_of(value, cGMP_Q) == Qtrue)
|
51
|
+
#define GMPF_P(value) (rb_obj_is_instance_of(value, cGMP_F) == Qtrue)
|
52
|
+
#define mpz_set_bignum(var_mpz,var_bignum) \
|
53
|
+
mpz_set_str (var_mpz, STR2CSTR (rb_funcall (var_bignum, rb_intern ("to_s"), 0)), 0);
|
54
|
+
#define mpz_temp_alloc(var) { var=malloc(sizeof(MP_INT)); }
|
55
|
+
#define mpz_temp_init(var) { mpz_temp_alloc(var); mpz_init(var); }
|
56
|
+
#define mpz_temp_from_bignum(var,var_bignum) \
|
57
|
+
{ mpz_temp_alloc(var); mpz_init_set_str (var, STR2CSTR (rb_funcall (var_bignum, rb_intern ("to_s"), 0)), 0); }
|
58
|
+
#define mpz_temp_free(var) { mpz_clear(var); free(var); }
|
59
|
+
#define mpf_temp_alloc(var) { var=malloc(sizeof(MP_FLOAT)); }
|
60
|
+
#define mpf_temp_init(var,prec) { mpf_temp_alloc(var); mpf_init2(var,prec); }
|
61
|
+
#define mpf_temp_free(var) { mpf_clear(var); free(var); }
|
62
|
+
#define FLT2DBL(var) (RFLOAT(var)->value)
|
63
|
+
#define prec_max(prec,var) {if(mpf_get_prec(var) > prec) prec = mpf_get_prec(var); }
|
64
|
+
|
65
|
+
#define EXPECTED_ZQFXBD "Expected GMP::Z, GMP::Q, GMP::F, FixNum, BigNum or Float"
|
66
|
+
#define EXPECTED_ZQFXB "Expected GMP::Z, GMP::Q, GMP::F, FixNum or BigNum"
|
67
|
+
#define EXPECTED_ZXB "Expected GMP::Z, FixNum or BigNum"
|
68
|
+
#define EXPECTED_ZX "Expected GMP::Z or FixNum"
|
69
|
+
#define EXPECTED_X "Expected FixNum"
|
70
|
+
#define typeerror(expected) rb_raise(rb_eTypeError, EXPECTED_##expected)
|
71
|
+
#define typeerror_as(expected, argname) rb_raise(rb_eTypeError, EXPECTED_##expected " as " argname)
|
72
|
+
|
73
|
+
//should change exception type
|
74
|
+
#define not_yet rb_raise(rb_eTypeError,"Not implemented yet")
|
75
|
+
|
76
|
+
extern VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F;
|
77
|
+
|
78
|
+
extern void r_gmpz_free(void *ptr);
|
79
|
+
extern void r_gmpq_free(void *ptr);
|
80
|
+
extern void r_gmpf_free(void *ptr);
|
81
|
+
|
82
|
+
|
83
|
+
/* from gmpz.h */
|
84
|
+
|
85
|
+
// Initializing, Assigning Integers
|
86
|
+
extern VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass);
|
87
|
+
extern void mpz_set_value(MP_INT *target, VALUE source);
|
88
|
+
extern VALUE r_gmpmod_z(int argc, VALUE *argv, VALUE module);
|
89
|
+
extern VALUE r_gmpz_swap(VALUE self, VALUE arg);
|
90
|
+
|
91
|
+
// Converting Integers
|
92
|
+
extern VALUE r_gmpz_to_i(VALUE self);
|
93
|
+
extern VALUE r_gmpz_to_d(VALUE self);
|
94
|
+
|
95
|
+
// Integer Arithmetic
|
96
|
+
extern VALUE r_gmpz_add(VALUE self, VALUE arg);
|
97
|
+
extern VALUE r_gmpz_add_self(VALUE self, VALUE arg);
|
98
|
+
extern VALUE r_gmpz_sub(VALUE self, VALUE arg);
|
99
|
+
extern VALUE r_gmpz_sub_self(VALUE self, VALUE arg);
|
100
|
+
extern VALUE r_gmpz_mul(VALUE self, VALUE arg);
|
101
|
+
|
102
|
+
// Number Theoretic Functions
|
103
|
+
extern VALUE r_gmpz_remove(VALUE self, VALUE arg);
|
104
|
+
|
105
|
+
// Integer Comparisons
|
106
|
+
extern VALUE r_gmpz_eq(VALUE self, VALUE arg);
|
107
|
+
extern VALUE r_gmpz_cmp(VALUE self, VALUE arg);
|
108
|
+
extern VALUE r_gmpz_cmpabs(VALUE self, VALUE arg);
|
109
|
+
|
110
|
+
// _unsorted_
|
111
|
+
extern VALUE r_gmpz_div(VALUE self, VALUE arg);
|
112
|
+
extern VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self);
|
113
|
+
extern VALUE r_gmpz_popcount(VALUE self);
|
114
|
+
extern VALUE r_gmpz_jacobi(VALUE self);
|
115
|
+
extern VALUE r_gmpz_legendre(VALUE self);
|
116
|
+
extern VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to);
|
117
|
+
extern VALUE r_gmpz_getbit(VALUE self, VALUE bitnr);
|
118
|
+
extern VALUE r_gmpz_scan0(VALUE self, VALUE bitnr);
|
119
|
+
extern VALUE r_gmpz_scan1(VALUE self, VALUE bitnr);
|
120
|
+
extern VALUE r_gmpz_powm(VALUE self, VALUE exp, VALUE mod);
|
121
|
+
extern VALUE r_gmpz_sgn(VALUE self);
|
122
|
+
extern int mpz_cmp_value(MP_INT *OP, VALUE arg);
|
123
|
+
|
124
|
+
extern VALUE r_gmpzsg_pow(VALUE klass, VALUE base, VALUE exp);
|
125
|
+
extern VALUE r_gmpz_to_s(VALUE self);
|
126
|
+
|
127
|
+
|
128
|
+
/* from gmpq.h */
|
129
|
+
|
130
|
+
// Initializing Rationals
|
131
|
+
extern VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module);
|
132
|
+
extern VALUE r_gmpq_swap(VALUE self, VALUE arg);
|
133
|
+
|
134
|
+
// Rational Conversions
|
135
|
+
extern VALUE r_gmpq_to_d(VALUE self);
|
136
|
+
|
137
|
+
// Rational Arithmetic
|
138
|
+
extern VALUE r_gmpq_add(VALUE self, VALUE arg);
|
139
|
+
extern VALUE r_gmpq_sub(VALUE self, VALUE arg);
|
140
|
+
extern VALUE r_gmpq_mul(VALUE self, VALUE arg);
|
141
|
+
extern VALUE r_gmpq_div(VALUE self, VALUE arg);
|
142
|
+
extern VALUE r_gmpq_neg(VALUE self);
|
143
|
+
extern VALUE r_gmpq_neg_self(VALUE self);
|
144
|
+
extern VALUE r_gmpq_abs(VALUE self);
|
145
|
+
extern VALUE r_gmpq_abs_self(VALUE self);
|
146
|
+
extern VALUE r_gmpq_inv(VALUE self);
|
147
|
+
extern VALUE r_gmpq_inv_self(VALUE self);
|
148
|
+
|
149
|
+
// Comparing Rationals
|
150
|
+
extern VALUE r_gmpq_eq(VALUE self, VALUE arg);
|
151
|
+
extern VALUE r_gmpq_cmp(VALUE self, VALUE arg);
|
152
|
+
extern int mpq_cmp_value(MP_RAT *OP, VALUE arg);
|
153
|
+
extern VALUE r_gmpq_sgn(VALUE self);
|
154
|
+
|
155
|
+
// Applying Integer Functions
|
156
|
+
extern VALUE r_gmpq_num(VALUE self);
|
157
|
+
extern VALUE r_gmpq_den(VALUE self);
|
158
|
+
|
159
|
+
// _unsorted_
|
160
|
+
|
161
|
+
|
162
|
+
/* from gmpf.h */
|
163
|
+
|
164
|
+
// Initializing, Assigning Floats
|
165
|
+
extern void mpf_set_value(MP_FLOAT *self_val, VALUE arg);
|
166
|
+
extern VALUE r_gmpmod_f(int argc, VALUE *argv, VALUE module);
|
167
|
+
|
168
|
+
// Converting Floats
|
169
|
+
extern VALUE r_gmpf_to_d(VALUE self);
|
170
|
+
extern VALUE r_gmpf_to_s(VALUE self);
|
171
|
+
|
172
|
+
// Float Arithmetic
|
173
|
+
extern VALUE r_gmpf_add(VALUE self, VALUE arg);
|
174
|
+
extern VALUE r_gmpf_sub(VALUE self, VALUE arg);
|
175
|
+
extern VALUE r_gmpf_mul(VALUE self, VALUE arg);
|
176
|
+
extern VALUE r_gmpf_div(VALUE self, VALUE arg);
|
177
|
+
|
178
|
+
// Float Comparison
|
179
|
+
extern VALUE r_gmpf_eq(VALUE self, VALUE arg);
|
180
|
+
extern VALUE r_gmpf_cmp(VALUE self, VALUE arg);
|
181
|
+
extern int mpf_cmp_value(MP_FLOAT *OP, VALUE arg);
|
182
|
+
|
183
|
+
// _unsorted_
|
184
|
+
extern VALUE r_gmpf_sgn(VALUE self);
|
185
|
+
extern VALUE r_gmpf_get_prec(VALUE self);
|
186
|
+
|
187
|
+
|
188
|
+
extern void init_gmpz();
|
189
|
+
extern void init_gmpq();
|
190
|
+
extern void init_gmpf();
|
191
|
+
|
192
|
+
#endif
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: srawlins-gmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.5
|
4
|
+
version: 0.1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomasz Wegrzanowski
|
@@ -27,9 +27,13 @@ extra_rdoc_files: []
|
|
27
27
|
files:
|
28
28
|
- ext/extconf.rb
|
29
29
|
- ext/gmp.c
|
30
|
+
- ext/gmpf.c
|
30
31
|
- ext/gmpf.h
|
32
|
+
- ext/gmpq.c
|
31
33
|
- ext/gmpq.h
|
34
|
+
- ext/gmpz.c
|
32
35
|
- ext/gmpz.h
|
36
|
+
- ext/ruby_gmp.h
|
33
37
|
- ext/takeover.h
|
34
38
|
- test/README
|
35
39
|
- test/tc_cmp.rb
|