| 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 |