line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# [[[ HEADER ]]] |
2
|
|
|
|
|
|
|
package RPerl::Operation::Expression::Operator::GMPFunctions; |
3
|
1
|
|
|
1
|
|
7
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
25
|
|
4
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
24
|
|
5
|
1
|
|
|
1
|
|
6
|
use RPerl::AfterSubclass; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
218
|
|
6
|
|
|
|
|
|
|
our $VERSION = 0.004_000; |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
# [[[ OO INHERITANCE ]]] |
9
|
1
|
|
|
1
|
|
7
|
use parent qw(RPerl::Operation::Expression::Operator); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
7
|
|
10
|
1
|
|
|
1
|
|
49
|
use RPerl::Operation::Expression::Operator; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
23
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
# [[[ CRITICS ]]] |
13
|
|
|
|
|
|
|
## no critic qw(ProhibitUselessNoCritic ProhibitMagicNumbers RequireCheckedSyscalls) # USER DEFAULT 1: allow numeric values & print operator |
14
|
|
|
|
|
|
|
## no critic qw(RequireInterpolationOfMetachars) # USER DEFAULT 2: allow single-quoted control characters & sigils |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
# [[[ INCLUDES ]]] |
17
|
1
|
|
|
1
|
|
6
|
use RPerl::DataType::GMPInteger; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
19
|
|
18
|
1
|
|
|
1
|
|
397
|
use Math::BigInt lib => 'GMP'; # we still actually use GMP in PERLOPS_PERLTYPES mode, albeit indirectly via Math::BigInt::GMP |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
5
|
|
19
|
1
|
|
|
1
|
|
1133
|
use Exporter 'import'; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
788
|
|
20
|
|
|
|
|
|
|
our @EXPORT = qw( |
21
|
|
|
|
|
|
|
gmp_init gmp_init_set_unsigned_integer gmp_init_set_signed_integer |
22
|
|
|
|
|
|
|
gmp_set gmp_set_unsigned_integer gmp_set_signed_integer gmp_set_number gmp_set_string |
23
|
|
|
|
|
|
|
gmp_get_unsigned_integer gmp_get_signed_integer gmp_get_number gmp_get_string |
24
|
|
|
|
|
|
|
gmp_add gmp_sub gmp_mul gmp_mul_unsigned_integer gmp_mul_signed_integer gmp_sub_mul_unsigned_integer gmp_add_mul_unsigned_integer gmp_neg |
25
|
|
|
|
|
|
|
gmp_div_truncate_quotient |
26
|
|
|
|
|
|
|
gmp_cmp |
27
|
|
|
|
|
|
|
); |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
# [[[ OO PROPERTIES ]]] |
30
|
|
|
|
|
|
|
our hashref $properties = {}; |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# [[[ SUBROUTINES & OO METHODS ]]] |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
# [[[ INITIALIZATION FUNCTIONS ]]] |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# void mpz_init (mpz_t x) |
37
|
|
|
|
|
|
|
#our void $gmp_init = sub { |
38
|
|
|
|
0
|
0
|
|
sub gmp_init { |
39
|
|
|
|
|
|
|
# ( my gmp_integer $x ) = @_; |
40
|
|
|
|
|
|
|
} |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
# [[[ COMBINED INITIALIZATION AND ASSIGNMENT FUNCTIONS ]]] |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# void mpz_init_set_ui (mpz_t rop, unsigned long int op) |
45
|
|
|
|
|
|
|
#our void $gmp_init_set_unsigned_integer = sub { |
46
|
|
|
|
|
|
|
sub gmp_init_set_unsigned_integer { |
47
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $rop, my unsigned_integer $op ) = @_; |
48
|
0
|
|
|
|
|
0
|
$rop->bzero(); |
49
|
0
|
|
|
|
|
0
|
$rop->badd($op); |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
# void mpz_init_set_si (mpz_t rop, signed long int op) |
53
|
|
|
|
|
|
|
#our void $gmp_init_set_signed_integer = sub { |
54
|
|
|
|
|
|
|
sub gmp_init_set_signed_integer { |
55
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $rop, my integer $op ) = @_; |
56
|
0
|
|
|
|
|
0
|
$rop->bzero(); |
57
|
0
|
|
|
|
|
0
|
$rop->badd($op); |
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
# [[[ ASSIGNMENT FUNCTIONS ]]] |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
# void mpz_set (mpz_t rop, const mpz_t op) |
63
|
|
|
|
|
|
|
#our void $gmp_set = sub { |
64
|
|
|
|
|
|
|
sub gmp_set { |
65
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $rop, my gmp_integer $op ) = @_; |
66
|
0
|
|
|
|
|
0
|
$rop->bzero(); |
67
|
0
|
|
|
|
|
0
|
$rop->badd($op); |
68
|
|
|
|
|
|
|
} |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
# void mpz_set_ui (mpz_t rop, unsigned long int op) |
71
|
|
|
|
|
|
|
#our void $gmp_set_unsigned_integer = sub { |
72
|
|
|
|
|
|
|
sub gmp_set_unsigned_integer { |
73
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $rop, my unsigned_integer $op ) = @_; |
74
|
0
|
|
|
|
|
0
|
$rop->bzero(); |
75
|
0
|
|
|
|
|
0
|
$rop->badd($op); |
76
|
|
|
|
|
|
|
} |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
# void mpz_set_si (mpz_t rop, signed long int op) |
79
|
|
|
|
|
|
|
#our void $gmp_set_signed_integer = sub { |
80
|
|
|
|
|
|
|
sub gmp_set_signed_integer { |
81
|
22
|
|
|
22
|
0
|
2435
|
( my gmp_integer $rop, my integer $op ) = @_; |
82
|
22
|
|
|
|
|
90
|
$rop->bzero(); |
83
|
22
|
|
|
|
|
590
|
$rop->badd($op); |
84
|
|
|
|
|
|
|
} |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
# void mpz_set_d (mpz_t rop, double op) |
87
|
|
|
|
|
|
|
#our void $gmp_set_number = sub { |
88
|
|
|
|
|
|
|
sub gmp_set_number { |
89
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $rop, my number $op ) = @_; |
90
|
0
|
|
|
|
|
0
|
$rop->bzero(); |
91
|
0
|
|
|
|
|
0
|
$rop->badd($op); |
92
|
|
|
|
|
|
|
} |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
# int mpz_set_str (mpz_t rop, const char *str, int base) |
95
|
|
|
|
|
|
|
#our integer $gmp_set_string = sub { |
96
|
|
|
|
|
|
|
sub gmp_set_string { |
97
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $rop, my string $str ) = @_; |
98
|
0
|
|
|
|
|
0
|
my Math::BigInt $tmp = Math::BigInt->new($str); |
99
|
0
|
|
|
|
|
0
|
$rop->bzero(); |
100
|
0
|
|
|
|
|
0
|
$rop->badd($tmp); |
101
|
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
# [[[ CONVERSION FUNCTIONS ]]] |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
# unsigned long int mpz_get_ui (const mpz_t op) |
106
|
|
|
|
|
|
|
#our unsigned_integer $gmp_get_unsigned_integer = sub { |
107
|
|
|
|
|
|
|
sub gmp_get_unsigned_integer { |
108
|
0
|
|
|
0
|
0
|
0
|
( my gmp_integer $op ) = @_; |
109
|
0
|
|
|
|
|
0
|
return $op->numify(); |
110
|
|
|
|
|
|
|
} |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
# signed long int mpz_get_si (const mpz_t op) |
113
|
|
|
|
|
|
|
#our integer $gmp_get_signed_integer = sub { |
114
|
|
|
|
|
|
|
sub gmp_get_signed_integer { |
115
|
2
|
|
|
2
|
0
|
6
|
( my gmp_integer $op ) = @_; |
116
|
2
|
|
|
|
|
19
|
return $op->numify(); |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
# double mpz_get_d (const mpz_t op) |
120
|
|
|
|
|
|
|
#our integer $gmp_get_number = sub { |
121
|
|
|
|
|
|
|
sub gmp_get_number { |
122
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $op ) = @_; |
123
|
0
|
|
|
|
|
|
return $op->numify(); |
124
|
|
|
|
|
|
|
} |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
# char * mpz_get_str (char *str, int base, const mpz_t op) |
127
|
|
|
|
|
|
|
#our string $gmp_get_string = sub { |
128
|
|
|
|
|
|
|
sub gmp_get_string { |
129
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $op ) = @_; |
130
|
0
|
|
|
|
|
|
return $op->bstr(); |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
# [[[ ARITHMETIC FUNCTIONS ]]] |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
# void mpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2) |
136
|
|
|
|
|
|
|
#our gmp_integer $gmp_add = sub { |
137
|
|
|
|
|
|
|
sub gmp_add { |
138
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my gmp_integer $op2 ) = @_; |
139
|
|
|
|
|
|
|
# in case $op1 and/or $op2 are the same variables as $rop, make copies so you don't zero them out before reading them |
140
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
141
|
0
|
|
|
|
|
|
my gmp_integer $op2_copy = $op2->copy(); |
142
|
0
|
|
|
|
|
|
$rop->bzero(); |
143
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
144
|
0
|
|
|
|
|
|
$rop->badd($op2_copy); |
145
|
|
|
|
|
|
|
} |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
# void mpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2) |
148
|
|
|
|
|
|
|
#our gmp_integer $gmp_sub = sub { |
149
|
|
|
|
|
|
|
sub gmp_sub { |
150
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my gmp_integer $op2 ) = @_; |
151
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
152
|
0
|
|
|
|
|
|
my gmp_integer $op2_copy = $op2->copy(); |
153
|
0
|
|
|
|
|
|
$rop->bzero(); |
154
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
155
|
0
|
|
|
|
|
|
$rop->bsub($op2_copy); |
156
|
|
|
|
|
|
|
} |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
# void mpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2) |
159
|
|
|
|
|
|
|
#our void $gmp_mul = sub { |
160
|
|
|
|
|
|
|
sub gmp_mul { |
161
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my gmp_integer $op2 ) = @_; |
162
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
163
|
0
|
|
|
|
|
|
$rop->bzero(); |
164
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
165
|
0
|
|
|
|
|
|
$rop->bmul($op2); |
166
|
|
|
|
|
|
|
} |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
# void mpz_mul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2) |
169
|
|
|
|
|
|
|
#our void $gmp_mul_unsigned_integer = sub { |
170
|
|
|
|
|
|
|
sub gmp_mul_unsigned_integer { |
171
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my unsigned_integer $op2 ) = @_; |
172
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
173
|
0
|
|
|
|
|
|
$rop->bzero(); |
174
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
175
|
0
|
|
|
|
|
|
$rop->bmul($op2); |
176
|
|
|
|
|
|
|
} |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
# void mpz_mul_si (mpz_t rop, const mpz_t op1, long int op2) |
179
|
|
|
|
|
|
|
#our void $gmp_mul_signed_integer = sub { |
180
|
|
|
|
|
|
|
sub gmp_mul_signed_integer { |
181
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my integer $op2 ) = @_; |
182
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
183
|
0
|
|
|
|
|
|
$rop->bzero(); |
184
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
185
|
0
|
|
|
|
|
|
$rop->bmul($op2); |
186
|
|
|
|
|
|
|
} |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
# void mpz_submul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2) |
189
|
|
|
|
|
|
|
#our gmp_integer $gmp_sub_mul_unsigned_integer = sub { |
190
|
|
|
|
|
|
|
sub gmp_sub_mul_unsigned_integer { |
191
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my unsigned_integer $op2 ) = @_; |
192
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
193
|
0
|
|
|
|
|
|
$op1_copy->bmul($op2); |
194
|
0
|
|
|
|
|
|
$rop->bsub($op1_copy); |
195
|
|
|
|
|
|
|
} |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
# void mpz_addmul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2) |
198
|
|
|
|
|
|
|
#our void $gmp_add_mul_unsigned_integer = sub { |
199
|
|
|
|
|
|
|
sub gmp_add_mul_unsigned_integer { |
200
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1, my unsigned_integer $op2 ) = @_; |
201
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
202
|
0
|
|
|
|
|
|
$op1_copy->bmul($op2); |
203
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
204
|
|
|
|
|
|
|
} |
205
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
# void mpz_neg (mpz_t rop, const mpz_t op) |
207
|
|
|
|
|
|
|
#our void $gmp_neg = sub { |
208
|
|
|
|
|
|
|
sub gmp_neg { |
209
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $rop, my gmp_integer $op1 ) = @_; |
210
|
0
|
|
|
|
|
|
my gmp_integer $op1_copy = $op1->copy(); |
211
|
0
|
|
|
|
|
|
$rop->bzero(); |
212
|
0
|
|
|
|
|
|
$rop->badd($op1_copy); |
213
|
0
|
|
|
|
|
|
$rop->bmul(Math::BigInt->bone('-')); |
214
|
|
|
|
|
|
|
} |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
# [[[ DIVISION FUNCTIONS ]]] |
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
# void mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d) |
219
|
|
|
|
|
|
|
#our void $gmp_div_truncate_quotient = sub { |
220
|
|
|
|
|
|
|
sub gmp_div_truncate_quotient { |
221
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $q, my gmp_integer $n, my gmp_integer $d ) = @_; |
222
|
0
|
|
|
|
|
|
my gmp_integer $n_copy = $n->copy(); |
223
|
0
|
|
|
|
|
|
my gmp_integer $d_copy = $d->copy(); |
224
|
0
|
|
|
|
|
|
$q->bzero(); |
225
|
0
|
|
|
|
|
|
$q->badd($n_copy); |
226
|
0
|
|
|
|
|
|
$q->bdiv($d_copy); |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
# [[[ COMPARISON FUNCTIONS ]]] |
230
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
# int mpz_cmp (const mpz_t op1, const mpz_t op2) |
232
|
|
|
|
|
|
|
#our integer $gmp_cmp = sub { |
233
|
|
|
|
|
|
|
sub gmp_cmp { |
234
|
0
|
|
|
0
|
0
|
|
( my gmp_integer $op1, my gmp_integer $op2 ) = @_; |
235
|
0
|
|
|
|
|
|
return $op1->bcmp($op2); |
236
|
|
|
|
|
|
|
} |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
1; # end of class |