| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
=head1 NAME |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
Math::Pari - Perl interface to PARI. |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
use Math::Pari; |
|
8
|
|
|
|
|
|
|
$a = PARI 2; |
|
9
|
|
|
|
|
|
|
print $a**10000; |
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
or |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
use Math::Pari qw(Mod); |
|
14
|
|
|
|
|
|
|
$a = Mod(3,5); |
|
15
|
|
|
|
|
|
|
print $a**10000; |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
This package is a Perl interface to famous library PARI for |
|
20
|
|
|
|
|
|
|
numerical/scientific/number-theoretic calculations. It allows use of |
|
21
|
|
|
|
|
|
|
most PARI functions as Perl functions, and (almost) seamless merging |
|
22
|
|
|
|
|
|
|
of PARI and Perl data. In what follows we suppose prior knowledge of |
|
23
|
|
|
|
|
|
|
what PARI is (see L, or |
|
24
|
|
|
|
|
|
|
L). |
|
25
|
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=head1 EXPORTed functions |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
=over 4 |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=item DEFAULT |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
By default the package exports functions PARI(), PARIcol(), PARIvar(), |
|
33
|
|
|
|
|
|
|
PARImat(), PARImat_tr() and parse_as_gp() which convert their argument(s) to a |
|
34
|
|
|
|
|
|
|
PARI object. (In fact PARI() is just an alias for C). |
|
35
|
|
|
|
|
|
|
The function PARI() accepts following data as its arguments |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
=over 17 |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
=item One integer |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
Is converted to a PARI integer. |
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=item One float |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
Is converted to a PARI float. |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=item One string |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
Is executed as a PARI expression (so should not contain whitespace). |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
=item PARI object |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
Is passed unchanged. |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=item Reference to a Perl array |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
Each element is converted using the same rules, PARI vector-row with these |
|
58
|
|
|
|
|
|
|
elements is returned. |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
=item Several of above |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
The same as with a reference to array. |
|
63
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=back |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
=item Conflicts of rules in PARI() |
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
In deciding what rule of the above to apply the preference is given to |
|
69
|
|
|
|
|
|
|
the uppermost choice of those available I. If none matches, then |
|
70
|
|
|
|
|
|
|
the string rule is used. So C returns integer, C |
|
71
|
|
|
|
|
|
|
returns float, C evaluates C<1> as a PARI expression (well, |
|
72
|
|
|
|
|
|
|
the result is the same as C, only slower). |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
Note that for Perl these data are synonymous, since Perl freely |
|
75
|
|
|
|
|
|
|
converts between integers, float and strings. However, to PARI() only |
|
76
|
|
|
|
|
|
|
what the argument I is important. If $v is C<1> in the Perl |
|
77
|
|
|
|
|
|
|
world, C may convert it to an integer, float, or to the |
|
78
|
|
|
|
|
|
|
result of evaluating the PARI program C<1> (all depending on how $v |
|
79
|
|
|
|
|
|
|
was created and accessed in Perl). |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
This is a fundamental limitation of creating an interface between two |
|
82
|
|
|
|
|
|
|
systems, both with polymorphic objects, but with subtly different |
|
83
|
|
|
|
|
|
|
semantic of the flavors of these objects. In reality, however, this |
|
84
|
|
|
|
|
|
|
is rarely a problem. |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
=item PARIcol(), PARImat() and PARImat_tr() |
|
87
|
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
PARIcol() behaves in the same way as PARI() unless given several |
|
89
|
|
|
|
|
|
|
arguments. In the latter case it returns a vector-column instead of |
|
90
|
|
|
|
|
|
|
a vector-row. |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
PARImat() constructs a matrix out of the given arguments. It will work |
|
93
|
|
|
|
|
|
|
if PARI() will construct a vector of vectors given the same arguments. |
|
94
|
|
|
|
|
|
|
The internal vectors become columns of the matrix. PARImat_tr() |
|
95
|
|
|
|
|
|
|
behaves similarly, but the internal vectors become rows of the matrix. |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
Since PARI matrices are similar to vector-rows of vector-columns, |
|
98
|
|
|
|
|
|
|
PARImat() is quicker, but PARImat_tr() better corresponds to the PARI |
|
99
|
|
|
|
|
|
|
input and output forms of matrices: |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
print PARImat [[1,2], [3,4]]; # prints [1,3;2,4] |
|
102
|
|
|
|
|
|
|
print PARImat_tr [[1,2], [3,4]]; # prints [1,2;3,4] |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=item parse_as_gp() |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
Did you notice that when taking a string, PARI() requires that there |
|
107
|
|
|
|
|
|
|
is no whitespace there (outside of string constants)? This is exactly |
|
108
|
|
|
|
|
|
|
as the C library parses strings. |
|
109
|
|
|
|
|
|
|
However, to simplify human interaction, the C calculator |
|
110
|
|
|
|
|
|
|
allows whitespace, comments, breaking into multiple lines, many |
|
111
|
|
|
|
|
|
|
independent expressions (such as function definitions). |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
We do not include the corresponding C code from the calculator, but provide |
|
114
|
|
|
|
|
|
|
a Perl clone. It supports whitespace, C<\\>- and C* */>-comments, and, for multi-line |
|
115
|
|
|
|
|
|
|
arguments, it supports line continuation via trailing C<\>, trailing binary ops, |
|
116
|
|
|
|
|
|
|
comma, opening parenthesis/bracket; moreover, group of |
|
117
|
|
|
|
|
|
|
lines in C<{}> are joined into one line. (Additionally, C<\q> and C<\p> are |
|
118
|
|
|
|
|
|
|
recognized, as well as trailing allocatemem(). C<\e> is tolerated.) |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
Keep in mind that this is just a convenience function, and no attempt was |
|
121
|
|
|
|
|
|
|
performed to make it particularly quick. Moreover, the PARI user functions |
|
122
|
|
|
|
|
|
|
(or maybe it is better to call them user macros?) are currently not |
|
123
|
|
|
|
|
|
|
automatically importable into Perl, so to access functions defined in |
|
124
|
|
|
|
|
|
|
parse_as_gp()' argument may be awkward. (The temporary fix is to use |
|
125
|
|
|
|
|
|
|
a temporary convenience function __wrap_PARI_macro(): |
|
126
|
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
parse_as_gp <
|
|
128
|
|
|
|
|
|
|
add2(x) = x + 2 |
|
129
|
|
|
|
|
|
|
EOP |
|
130
|
|
|
|
|
|
|
*add2 = Math::Pari::__wrap_PARI_macro 'add2'; |
|
131
|
|
|
|
|
|
|
print add2(17); |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
but keep in mind that the generated this way wrapper is also not designed |
|
134
|
|
|
|
|
|
|
to be quick.) |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
With the optional second argument C<'quote'>, it would return an unevaluated array |
|
137
|
|
|
|
|
|
|
of strings instead of the result of evaluation. Special strings C<\q> etc. are |
|
138
|
|
|
|
|
|
|
replaced by references to appropriate (undocumented) Perl subroutines. |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
With the optional third argument C<'echo'>, would "echo" the commands (preceded by |
|
141
|
|
|
|
|
|
|
C<"? ">) before execution. With C |
|
142
|
|
|
|
|
|
|
optional fourth argument (command counter), would "echo" the result too |
|
143
|
|
|
|
|
|
|
(preceded by C<"%C = ">, with C being the command counter, which is |
|
144
|
|
|
|
|
|
|
incremented). |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
=item C |
|
147
|
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
If arguments are specified in the C |
|
149
|
|
|
|
|
|
|
PARI functions appearing as arguments are exported in the caller |
|
150
|
|
|
|
|
|
|
context. In this case the function PARI() and friends is not exported, |
|
151
|
|
|
|
|
|
|
so if you need them, you should include them into export list |
|
152
|
|
|
|
|
|
|
explicitly, or include C<:DEFAULT> tag: |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
use Math::Pari qw(factorint PARI); |
|
155
|
|
|
|
|
|
|
use Math::Pari qw(:DEFAULT factorint); |
|
156
|
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
or simply do it in two steps |
|
158
|
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
use Math::Pari; |
|
160
|
|
|
|
|
|
|
use Math::Pari 'factorint'; |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
The other recognized tags are C<:PARI>, C<:all>, C, |
|
163
|
|
|
|
|
|
|
overloaded constants tags (C<:int>, C<:float>, C<:hex>) and "section |
|
164
|
|
|
|
|
|
|
names" tags. |
|
165
|
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
Additionally, the number tags (e.g., C<:4>) export |
|
167
|
|
|
|
|
|
|
functions from the PARI library from the given "section" (moreover, |
|
168
|
|
|
|
|
|
|
C<:PARI> exports all of the "sections"). Tag C<:all> exports all of the |
|
169
|
|
|
|
|
|
|
exportable symbols and C<:PARI>. |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
With older versions of B, giving C> command to C (the B |
|
172
|
|
|
|
|
|
|
calculator) lists the following sections: |
|
173
|
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
1: Standard monadic or dyadic OPERATORS |
|
175
|
|
|
|
|
|
|
2: CONVERSIONS and similar elementary functions |
|
176
|
|
|
|
|
|
|
3: TRANSCENDENTAL functions |
|
177
|
|
|
|
|
|
|
4: NUMBER THEORETICAL functions |
|
178
|
|
|
|
|
|
|
5: Functions related to ELLIPTIC CURVES |
|
179
|
|
|
|
|
|
|
6: Functions related to general NUMBER FIELDS |
|
180
|
|
|
|
|
|
|
7: POLYNOMIALS and power series |
|
181
|
|
|
|
|
|
|
8: Vectors, matrices, LINEAR ALGEBRA and sets |
|
182
|
|
|
|
|
|
|
9: SUMS, products, integrals and similar functions |
|
183
|
|
|
|
|
|
|
10: GRAPHIC functions |
|
184
|
|
|
|
|
|
|
11: PROGRAMMING under GP |
|
185
|
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
Starting with GP/PARI version 2.9.0, this list depends significantly on this |
|
187
|
|
|
|
|
|
|
version; for backward compatibility, we follow this older list of section |
|
188
|
|
|
|
|
|
|
numbers (to avoid confusion, better use symbolic names below). For |
|
189
|
|
|
|
|
|
|
compatibility, we assign arbitrary numbers to newer sections: |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
100: L-FUNCTIONS |
|
192
|
|
|
|
|
|
|
101: MODULAR SYMBOLS |
|
193
|
|
|
|
|
|
|
102: Associative and central simple ALGEBRAS |
|
194
|
|
|
|
|
|
|
103: functions related to COMBINATORICS |
|
195
|
|
|
|
|
|
|
104: MODULAR FORMS |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
One can use section names instead of number tags. Recognized names are |
|
198
|
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
:standard :conversions :transcendental :number :elliptic |
|
200
|
|
|
|
|
|
|
:fields :polynomials :vectors :sums :graphic :programming |
|
201
|
|
|
|
|
|
|
:l_functions :modular_symb :algebras :combinatorics :modular |
|
202
|
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
One can get the list of all of the functions accessible by C, |
|
204
|
|
|
|
|
|
|
or the accessible functions from the given section using listPari() function. |
|
205
|
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
Starting from version 5.005 of Perl, three constant-overload tags are |
|
207
|
|
|
|
|
|
|
supported: C<:int>, C<:float>, C<:hex>. If used, all the |
|
208
|
|
|
|
|
|
|
integer/float/hex-or-octal-or-binary literals in Perl will be automatically |
|
209
|
|
|
|
|
|
|
converted to became PARI objects. For example, |
|
210
|
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
use Math::Pari ':int'; |
|
212
|
|
|
|
|
|
|
print 2**1000; |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
is equivalent to |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
print PARI(2)**PARI(1000); |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
(The support for this Perl feature is buggy before the Perl version 5.005_57 - |
|
219
|
|
|
|
|
|
|
unless Perl uses mymalloc options; you can check for this with C
|
|
220
|
|
|
|
|
|
|
-V:usemymalloc>.) Note also that (at least with some versions of Perl) |
|
221
|
|
|
|
|
|
|
one should enable C<':float'> for conversion of long integer literals |
|
222
|
|
|
|
|
|
|
(I may consider them as floats, since they won't fit into Perl |
|
223
|
|
|
|
|
|
|
integers); note that it is PARI which determines which PARI subtype is |
|
224
|
|
|
|
|
|
|
assigned to each such literal: |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
use Math::Pari ':float', 'type_name'; |
|
227
|
|
|
|
|
|
|
print type_name 22222222222222222222222; |
|
228
|
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
prints C. |
|
230
|
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
=back |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
=head1 Available functions |
|
234
|
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
=head2 Directly accessible from Perl |
|
236
|
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
This package supports I the functions from the PARI library with |
|
238
|
|
|
|
|
|
|
a I which can be recognized by Math::Pari. This means that |
|
239
|
|
|
|
|
|
|
when you update the PARI library, the newly added functions will we |
|
240
|
|
|
|
|
|
|
available without any change to this package; only a recompile is |
|
241
|
|
|
|
|
|
|
needed. In fact no recompile will be needed if you link libPARI |
|
242
|
|
|
|
|
|
|
dynamically (you need to modify the F manually to do |
|
243
|
|
|
|
|
|
|
this). |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
You can "reach" unsupported functions via going directly to PARI |
|
246
|
|
|
|
|
|
|
parser using the string flavor of PARI() function, as in |
|
247
|
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
3 + PARI('O(x^17)'); |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
For some "unreachable" functions there is a special wrapper functions, |
|
251
|
|
|
|
|
|
|
such as C). |
|
252
|
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
The following functions are specific to GP calculator, thus are not |
|
254
|
|
|
|
|
|
|
available to Math::Pari in any way: |
|
255
|
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
default error extern input print print1 printp printp1 |
|
257
|
|
|
|
|
|
|
printtex quit read system whatnow write write1 writetex |
|
258
|
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
whatnow() function is useless, since Math::Pari does not support the |
|
260
|
|
|
|
|
|
|
"compatibility" mode (with older PARI library). The functionality of |
|
261
|
|
|
|
|
|
|
print(), write() and variants is available via automatic string |
|
262
|
|
|
|
|
|
|
translation, and pari_print() function and its variants (see L). |
|
263
|
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
default() is the only important function with functionality not |
|
265
|
|
|
|
|
|
|
supported by the current interface. Note however, that four most |
|
266
|
|
|
|
|
|
|
important default() actions are supported by allocatemem(), |
|
267
|
|
|
|
|
|
|
setprimelimit(), setprecision() and setseriesprecision() functions. |
|
268
|
|
|
|
|
|
|
(When called without arguments, these functions return the current |
|
269
|
|
|
|
|
|
|
values.) |
|
270
|
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
allocatemem($bytes) should not be called from inside Math::Pari |
|
272
|
|
|
|
|
|
|
functions (such as forprimes()). |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
=head2 Arguments |
|
275
|
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
Arguments to PARI functions are automatically converted to C or |
|
277
|
|
|
|
|
|
|
a PARI object depending on the signature of the actual library function. |
|
278
|
|
|
|
|
|
|
The arguments are I into the given type, so even if C |
|
279
|
|
|
|
|
|
|
rejects your code similar to |
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
func(2.5); # func() takes a long in C |
|
282
|
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
arguing that a particular argument should be of C (i.e., a |
|
284
|
|
|
|
|
|
|
Pari integer), the corresponding code will work in C, |
|
285
|
|
|
|
|
|
|
since 2.5 is silently converted to C, per the function |
|
286
|
|
|
|
|
|
|
signature. |
|
287
|
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
=head2 Return values |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
PARI functions return a PARI object or a Perl's integer depending on |
|
291
|
|
|
|
|
|
|
what the actual library function returns. |
|
292
|
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
=head2 Additional functions |
|
294
|
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
Some PARI functions are available in C (i.e., in C |
|
296
|
|
|
|
|
|
|
calculator) via infix notation only. In C these functions |
|
297
|
|
|
|
|
|
|
are available in functional notations too. Some other convenience |
|
298
|
|
|
|
|
|
|
functions are also made available. |
|
299
|
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
=over 5 |
|
301
|
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
=item Infix, prefix and postfix operations |
|
303
|
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
are available under names |
|
305
|
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
gneg, gadd, gsub, gmul, gdiv, gdivent, gmod, gpui, |
|
307
|
|
|
|
|
|
|
gle, gge, glt, ggt, geq, gne, gegal, gor, gand, |
|
308
|
|
|
|
|
|
|
gcmp, gcmp0, gcmp1, gcmp_1. |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
C means euclidean quotient, C is power, C checks |
|
311
|
|
|
|
|
|
|
whether two objects are equal, C is applicable to two real |
|
312
|
|
|
|
|
|
|
numbers only, C, C, C compare with 0, 1 and -1 |
|
313
|
|
|
|
|
|
|
correspondingly (see PARI user manual for details, or |
|
314
|
|
|
|
|
|
|
L). Note that all these functions are more readily |
|
315
|
|
|
|
|
|
|
available via operator overloading, so instead of |
|
316
|
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
gadd(gneg($x), $y) |
|
318
|
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
one can write |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
-$x+$y |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
(as far as overloading may be triggered, see L, so we assume |
|
324
|
|
|
|
|
|
|
that at least one of $x or $y is a PARI object). |
|
325
|
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
=item Conversion functions |
|
327
|
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
pari2iv, pari2nv, pari2num, pari2pv, pari2bool |
|
329
|
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
convert a PARI object to an integer, float, integer/float (whatever is |
|
331
|
|
|
|
|
|
|
better), string, and a boolean value correspondingly. Most the time |
|
332
|
|
|
|
|
|
|
you do not need these functions due to automatic conversions. |
|
333
|
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
=item Printout functions |
|
335
|
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
pari_print, pari_pprint, pari_texprint |
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
perform the same conversions to strings as their PARI counterparts, |
|
339
|
|
|
|
|
|
|
but do not print the result. The difference of pari_print() with |
|
340
|
|
|
|
|
|
|
pari2pv() is the number of significant digits they output, and |
|
341
|
|
|
|
|
|
|
whitespace in the output. pari2pv(), which is intended for |
|
342
|
|
|
|
|
|
|
"computer-readable strings", outputs as many digits as is supported by |
|
343
|
|
|
|
|
|
|
the current precision of the number; while pari_print(), which targets |
|
344
|
|
|
|
|
|
|
human-readable strings, takes into account the currently specified |
|
345
|
|
|
|
|
|
|
output precision too. |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=item Constant functions |
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
Some mathematical constants appear as function without arguments in |
|
350
|
|
|
|
|
|
|
PARI. These functions are available in Math::Pari too. If you export |
|
351
|
|
|
|
|
|
|
them as in |
|
352
|
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
use Math::Pari qw(:DEFAULT Pi I Euler); |
|
354
|
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
they can be used as barewords in your program: |
|
356
|
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
$x = Pi ** Euler; |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
=item Low-level functions |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
For convenience of low-level PARI programmers some low-level functions |
|
362
|
|
|
|
|
|
|
are made available as well (all except type_name() and changevalue() |
|
363
|
|
|
|
|
|
|
are not exportable): |
|
364
|
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
typ($x) |
|
366
|
|
|
|
|
|
|
lg($x) |
|
367
|
|
|
|
|
|
|
lgef($x) |
|
368
|
|
|
|
|
|
|
lgefint($x) |
|
369
|
|
|
|
|
|
|
longword($x, $n) |
|
370
|
|
|
|
|
|
|
type_name($x) |
|
371
|
|
|
|
|
|
|
changevalue($name,$newvalue) |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
Here longword($x,$n) returns C<$n>-th word in the memory |
|
374
|
|
|
|
|
|
|
representation of $x (including non-code words). type_name() differs |
|
375
|
|
|
|
|
|
|
from the PARI function type(): type() returns a PARI object, while |
|
376
|
|
|
|
|
|
|
type_name() returns a Perl string. (PARI objects of string type |
|
377
|
|
|
|
|
|
|
behave very non-intuitive w.r.t. string comparison functions; remember |
|
378
|
|
|
|
|
|
|
that they are compared using lex() to I of |
|
379
|
|
|
|
|
|
|
other argument of comparison!) |
|
380
|
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
The function listPari($number) outputs a list of names of PARI |
|
382
|
|
|
|
|
|
|
functions in the section $number. Use listPari(-1) to get the list |
|
383
|
|
|
|
|
|
|
across all of the sections. (_listPari() behaves likewise, with the |
|
384
|
|
|
|
|
|
|
version-specific section numbers.) |
|
385
|
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
=item Uncompatible functions |
|
387
|
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
O |
|
389
|
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
Since implementing C would be very tedious, we provide a |
|
391
|
|
|
|
|
|
|
two-argument form C instead (meaning the same as C in |
|
392
|
|
|
|
|
|
|
PARI). Note that with polynomials there is no problem like this one, |
|
393
|
|
|
|
|
|
|
both C and C work. |
|
394
|
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
ifact(n) |
|
396
|
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
integer factorial functions, available from C as C. |
|
398
|
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
=back |
|
400
|
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
=head2 Looping functions |
|
402
|
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
PARI has a big collection of functions which loops over some set. |
|
404
|
|
|
|
|
|
|
Such a function takes two I arguments: loop variable, and the |
|
405
|
|
|
|
|
|
|
code to execute in the loop. |
|
406
|
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
The code can be either a string (which contains PARI code to execute - |
|
408
|
|
|
|
|
|
|
thus should not contain whitespace), or a Perl code reference. The |
|
409
|
|
|
|
|
|
|
loop variable can be a string giving the name of PARI variable (as in |
|
410
|
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
fordiv(28, 'j', 'a=a+j+j^2'); |
|
412
|
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
or |
|
414
|
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
$j= 'j'; |
|
416
|
|
|
|
|
|
|
fordiv(28, $j, 'a=a+j+j^2'); |
|
417
|
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
), a PARI monomial (as in |
|
419
|
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
$j = PARI 'j'; |
|
421
|
|
|
|
|
|
|
fordiv(28, $j, sub { $a += $j + $j**2 }); |
|
422
|
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
), or a "delayed Math::Pari variable" (as in |
|
424
|
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
$j = PARIvar 'j'; |
|
426
|
|
|
|
|
|
|
fordiv(28, $j, 'a=a+j+j^2'); |
|
427
|
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
). If none of these applies, as in |
|
429
|
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
my $j; # Have this in a separate statement |
|
431
|
|
|
|
|
|
|
fordiv(28, $j, sub { $a += $j + $j**2 }); |
|
432
|
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
then during the execution of the C, Math::Pari would autogenerate |
|
434
|
|
|
|
|
|
|
a PARI variable, and would put its value in $j; this value of $j is |
|
435
|
|
|
|
|
|
|
temporary only, the old contents of $j is restored when fordiv() returns. |
|
436
|
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
Note that since you have no control over this name, you will not be |
|
438
|
|
|
|
|
|
|
able to use this variable from your PARI code; e.g., |
|
439
|
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
$j = 7.8; |
|
441
|
|
|
|
|
|
|
fordiv(28, $j, 'a=a+j+j^2'); |
|
442
|
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
will not make C mirror $j (unless you explicitly set up C to be |
|
444
|
|
|
|
|
|
|
a no-argument PARI function mirroring $j, see L<"Accessing Perl functions from PARI code">). |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
B. There are 2 flavors of the "code" arguments |
|
447
|
|
|
|
|
|
|
(string/C), and 4 types of the "variable" arguments |
|
448
|
|
|
|
|
|
|
(string/monomial/C/other). However, not all 8 combinations |
|
449
|
|
|
|
|
|
|
make sense. As we already explained, an "other" variable cannot work |
|
450
|
|
|
|
|
|
|
with a "string" code. |
|
451
|
|
|
|
|
|
|
|
|
452
|
|
|
|
|
|
|
B Do not |
|
453
|
|
|
|
|
|
|
use "string" variables with C code, and do not ask I! |
|
454
|
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
Additionally, the following code will not do what you expect |
|
456
|
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
$x = 0; |
|
458
|
|
|
|
|
|
|
$j = PARI 'j'; |
|
459
|
|
|
|
|
|
|
fordiv(28, 'j', sub { $x += $j } ); # Use $j as a loop variable! |
|
460
|
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
since the PARI function C I the PARI variable C |
|
462
|
|
|
|
|
|
|
inside the loop, but $j will still reference the old value; the old |
|
463
|
|
|
|
|
|
|
value is a monomial, not the index of the loop (which is an integer |
|
464
|
|
|
|
|
|
|
each time C is called). The simplest workaround is not to use |
|
465
|
|
|
|
|
|
|
the above syntax (i.e., not mixing literal loop variable with Perl |
|
466
|
|
|
|
|
|
|
loop code, just using $j as the second argument to C is |
|
467
|
|
|
|
|
|
|
enough): |
|
468
|
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
$x = 0; |
|
470
|
|
|
|
|
|
|
$j = PARI 'j'; |
|
471
|
|
|
|
|
|
|
fordiv(28, $j, sub { $x += $j } ); |
|
472
|
|
|
|
|
|
|
|
|
473
|
|
|
|
|
|
|
Alternately, one can make a I variable $j which will always |
|
474
|
|
|
|
|
|
|
reference the same thing C references in PARI I by using |
|
475
|
|
|
|
|
|
|
C constructor |
|
476
|
|
|
|
|
|
|
|
|
477
|
|
|
|
|
|
|
$x = 0; |
|
478
|
|
|
|
|
|
|
$j = PARIvar 'j'; |
|
479
|
|
|
|
|
|
|
fordiv(28, 'j', sub { $x += $j } ); |
|
480
|
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
(This problem is similar to |
|
482
|
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
$ref = \$_; # $$ref is going to be old value even after |
|
484
|
|
|
|
|
|
|
# localizing $_ in Perl's grep/map |
|
485
|
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
not accessing localized values of $_ in the plain Perl.) |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
Another possible quirk is that |
|
489
|
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
fordiv(28, my $j, sub { $a += $j + $j**2 }); |
|
491
|
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
will not work too - by a different reason. C declarations change |
|
493
|
|
|
|
|
|
|
the I of $j only I the end of the current statement; |
|
494
|
|
|
|
|
|
|
thus $j inside C will access a I variable $j |
|
495
|
|
|
|
|
|
|
(typically a non-lexical, global variable $j) than one you declared on this line. |
|
496
|
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
=head2 Accessing Perl functions from PARI code |
|
498
|
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
Use the same name inside PARI code: |
|
500
|
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
sub counter { $i += shift; } |
|
502
|
|
|
|
|
|
|
$i = 145; |
|
503
|
|
|
|
|
|
|
PARI 'k=5' ; |
|
504
|
|
|
|
|
|
|
fordiv(28, 'j', 'k=k+counter(j)'); |
|
505
|
|
|
|
|
|
|
print PARI('k'), "\n"; |
|
506
|
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
prints |
|
508
|
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
984 |
|
510
|
|
|
|
|
|
|
|
|
511
|
|
|
|
|
|
|
Due to a difference in the semantic of |
|
512
|
|
|
|
|
|
|
variable-number-of-parameters-functions between PARI and Perl, if the |
|
513
|
|
|
|
|
|
|
Perl subroutine takes a variable number of arguments (via C<@> in the |
|
514
|
|
|
|
|
|
|
prototype or a missing prototype), up to 6 arguments are supported |
|
515
|
|
|
|
|
|
|
when this function is called from PARI. If called from PARI with |
|
516
|
|
|
|
|
|
|
fewer arguments, the rest of arguments will be set to be integers C. |
|
517
|
|
|
|
|
|
|
|
|
518
|
|
|
|
|
|
|
Note also that no direct import of Perl variables is available yet |
|
519
|
|
|
|
|
|
|
(but you can write a function wrapper for this): |
|
520
|
|
|
|
|
|
|
|
|
521
|
|
|
|
|
|
|
sub getv () {$v} |
|
522
|
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
There is an unsupported (and undocumented ;-) function for explicitly |
|
524
|
|
|
|
|
|
|
importing Perl functions into PARI, possibly with a different name, |
|
525
|
|
|
|
|
|
|
and possibly with explicitly specifying number of arguments. |
|
526
|
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
=head1 PARI objects |
|
528
|
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
Functions from PARI library may take as arguments and/or return values |
|
530
|
|
|
|
|
|
|
the objects of C type C. In Perl these data are encapsulated into |
|
531
|
|
|
|
|
|
|
special kind of Perl variables: PARI objects. You can check for a |
|
532
|
|
|
|
|
|
|
variable C<$obj> to be a PARI object using |
|
533
|
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
ref $obj and $obj->isa('Math::Pari'); |
|
535
|
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
Most the time you do not need this due to automatic conversions and overloading. |
|
537
|
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
=head1 PARI monomials and Perl barewords |
|
539
|
|
|
|
|
|
|
|
|
540
|
|
|
|
|
|
|
If very lazy, one can code in Perl the same way one does it in PARI. |
|
541
|
|
|
|
|
|
|
Variables in PARI are denoted by barewords, as in C, and in the |
|
542
|
|
|
|
|
|
|
default configuration (no warnings, no strict) Perl allows the same - |
|
543
|
|
|
|
|
|
|
up to some extent. Do not do this, since there are many surprising problems. |
|
544
|
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
Some bareletters denote Perl operators, like C, C, C, |
|
546
|
|
|
|
|
|
|
C. This can lead to errors in Perl parsing your expression. E.g., |
|
547
|
|
|
|
|
|
|
|
|
548
|
|
|
|
|
|
|
print sin(tan(t))-tan(sin(t))-asin(atan(t))+atan(asin(t)); |
|
549
|
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
may parse OK after C |
|
551
|
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
After importing, the word C will denote the PARI function sin(), |
|
553
|
|
|
|
|
|
|
not Perl operator sin(). The difference is subtle: the PARI function |
|
554
|
|
|
|
|
|
|
I forces its arguments to be converted PARI objects; it |
|
555
|
|
|
|
|
|
|
gets C<'t'> as the argument, which is a string, thus is converted to |
|
556
|
|
|
|
|
|
|
what C denotes in PARI - a monomial. While the Perl operator sin() |
|
557
|
|
|
|
|
|
|
grants overloading (i.e., it will call PARI function sin() if the |
|
558
|
|
|
|
|
|
|
argument is a PARI object), it does not I its argument; given |
|
559
|
|
|
|
|
|
|
C<'t'> as argument, it converts it to what sin() understands, a float |
|
560
|
|
|
|
|
|
|
(producing C<0.>), so will give C<0.> as the answer. |
|
561
|
|
|
|
|
|
|
|
|
562
|
|
|
|
|
|
|
However |
|
563
|
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
print sin(tan(y))-tan(sin(y))-asin(atan(y))+atan(asin(y)); |
|
565
|
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
would not compile. You should avoid lower-case barewords used as PARI |
|
567
|
|
|
|
|
|
|
variables, e.g., do |
|
568
|
|
|
|
|
|
|
|
|
569
|
|
|
|
|
|
|
$y = PARI 'y'; |
|
570
|
|
|
|
|
|
|
print sin(tan($y))-tan(sin($y))-asin(atan($y))+atan(asin($y)); |
|
571
|
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
to get |
|
573
|
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
-1/18*y^9+26/4725*y^11-41/1296*y^13+328721/16372125*y^15+O(y^16) |
|
575
|
|
|
|
|
|
|
|
|
576
|
|
|
|
|
|
|
(BTW, it is a very good exercise to get the leading term by hand). |
|
577
|
|
|
|
|
|
|
|
|
578
|
|
|
|
|
|
|
Well, the same advice again: do not use barewords anywhere in your program! |
|
579
|
|
|
|
|
|
|
|
|
580
|
|
|
|
|
|
|
=head1 Overloading and automatic conversion |
|
581
|
|
|
|
|
|
|
|
|
582
|
|
|
|
|
|
|
Whenever an arithmetic operation includes at least one PARI object, |
|
583
|
|
|
|
|
|
|
the other arguments are converted to a PARI object and the corresponding |
|
584
|
|
|
|
|
|
|
PARI library functions is used to implement the operation. Currently |
|
585
|
|
|
|
|
|
|
the following arithmetic operations are overloaded: |
|
586
|
|
|
|
|
|
|
|
|
587
|
|
|
|
|
|
|
unary - |
|
588
|
|
|
|
|
|
|
+ - * / % ** abs cos sin exp log sqrt |
|
589
|
|
|
|
|
|
|
<< >> |
|
590
|
|
|
|
|
|
|
<= == => < > != <=> |
|
591
|
|
|
|
|
|
|
le eq ge lt gt ne cmp |
|
592
|
|
|
|
|
|
|
| & ^ ~ |
|
593
|
|
|
|
|
|
|
|
|
594
|
|
|
|
|
|
|
Numeric comparison operations are converted to C and friends, string |
|
595
|
|
|
|
|
|
|
comparisons compare in lexicographical order using C. |
|
596
|
|
|
|
|
|
|
|
|
597
|
|
|
|
|
|
|
Additionally, whenever a PARI object appears in a situation that requires integer, |
|
598
|
|
|
|
|
|
|
numeric, boolean or string data, it is converted to the corresponding |
|
599
|
|
|
|
|
|
|
type. Boolean conversion is subject to usual PARI pitfalls related to |
|
600
|
|
|
|
|
|
|
imprecise zeros (see documentation of C in PARI reference). |
|
601
|
|
|
|
|
|
|
|
|
602
|
|
|
|
|
|
|
For details on overloading, see L. |
|
603
|
|
|
|
|
|
|
|
|
604
|
|
|
|
|
|
|
Note that a check for equality is subject to same pitfalls as in PARI |
|
605
|
|
|
|
|
|
|
due to imprecise values. PARI may also refuse to compare data of |
|
606
|
|
|
|
|
|
|
different types for equality if it thinks this may lead to |
|
607
|
|
|
|
|
|
|
counterintuitive results. |
|
608
|
|
|
|
|
|
|
|
|
609
|
|
|
|
|
|
|
Note also that in PARI the numeric ordering is not defined for some |
|
610
|
|
|
|
|
|
|
types of PARI objects. For string comparison operations we use |
|
611
|
|
|
|
|
|
|
PARI-lexicographical ordering. |
|
612
|
|
|
|
|
|
|
|
|
613
|
|
|
|
|
|
|
=head1 PREREQUISITES |
|
614
|
|
|
|
|
|
|
|
|
615
|
|
|
|
|
|
|
=head2 Perl |
|
616
|
|
|
|
|
|
|
|
|
617
|
|
|
|
|
|
|
In the versions of perl earlier than 5.003 overloading used a |
|
618
|
|
|
|
|
|
|
different interface, so you may need to convert C |
|
619
|
|
|
|
|
|
|
to C<%OVERLOAD>, or, better, upgrade. |
|
620
|
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
=head2 PARI |
|
622
|
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
Starting from version 2.0, this module comes without a PARI library included. |
|
624
|
|
|
|
|
|
|
|
|
625
|
|
|
|
|
|
|
For the source of PARI library see |
|
626
|
|
|
|
|
|
|
L. |
|
627
|
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
=head1 Perl vs. PARI: different syntax |
|
629
|
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
Note that the PARI notations should be used in the string arguments to |
|
631
|
|
|
|
|
|
|
PARI() function, while the Perl notations should be used otherwise. |
|
632
|
|
|
|
|
|
|
|
|
633
|
|
|
|
|
|
|
=over 4 |
|
634
|
|
|
|
|
|
|
|
|
635
|
|
|
|
|
|
|
=item C<^> |
|
636
|
|
|
|
|
|
|
|
|
637
|
|
|
|
|
|
|
Power is denoted by C<**> in Perl. |
|
638
|
|
|
|
|
|
|
|
|
639
|
|
|
|
|
|
|
=item C<\> and C<\/> |
|
640
|
|
|
|
|
|
|
|
|
641
|
|
|
|
|
|
|
There are no such operators in Perl, use the word forms |
|
642
|
|
|
|
|
|
|
C and C instead. |
|
643
|
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
=item C<~> |
|
645
|
|
|
|
|
|
|
|
|
646
|
|
|
|
|
|
|
There is no postfix C<~> Perl operator. Use mattranspose() instead. |
|
647
|
|
|
|
|
|
|
|
|
648
|
|
|
|
|
|
|
=item C<'> |
|
649
|
|
|
|
|
|
|
|
|
650
|
|
|
|
|
|
|
There is no postfix C<'> Perl operator. Use deriv() instead. |
|
651
|
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
=item C |
|
653
|
|
|
|
|
|
|
|
|
654
|
|
|
|
|
|
|
There is no postfix C Perl operator. Use factorial()/ifact() instead |
|
655
|
|
|
|
|
|
|
(returning a real or an integer correspondingly). |
|
656
|
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
=item big integers |
|
658
|
|
|
|
|
|
|
|
|
659
|
|
|
|
|
|
|
Perl converts big I integers to doubles if they could not be |
|
660
|
|
|
|
|
|
|
put into B integers (the particular flavor can be found in the |
|
661
|
|
|
|
|
|
|
output of C in newer version of Perl, look for |
|
662
|
|
|
|
|
|
|
C/C). If you want to input such an integer, use |
|
663
|
|
|
|
|
|
|
|
|
664
|
|
|
|
|
|
|
while ($x < PARI('12345678901234567890')) ... |
|
665
|
|
|
|
|
|
|
|
|
666
|
|
|
|
|
|
|
instead of |
|
667
|
|
|
|
|
|
|
|
|
668
|
|
|
|
|
|
|
while ($x < 12345678901234567890) ... |
|
669
|
|
|
|
|
|
|
|
|
670
|
|
|
|
|
|
|
Why? Because conversion to double leads to precision loss (typically |
|
671
|
|
|
|
|
|
|
above 1e15, see L), and you will get something like |
|
672
|
|
|
|
|
|
|
12345678901234567168 otherwise. |
|
673
|
|
|
|
|
|
|
|
|
674
|
|
|
|
|
|
|
Starting from version 5.005 of Perl, if the tag C<:int> is used on the |
|
675
|
|
|
|
|
|
|
'use Math::Pari' line, all of the integer literals in Perl will be |
|
676
|
|
|
|
|
|
|
automatically converted to became PARI objects. E.g., |
|
677
|
|
|
|
|
|
|
|
|
678
|
|
|
|
|
|
|
use Math::Pari ':int'; |
|
679
|
|
|
|
|
|
|
print 2**1000; |
|
680
|
|
|
|
|
|
|
|
|
681
|
|
|
|
|
|
|
is equivalent to |
|
682
|
|
|
|
|
|
|
|
|
683
|
|
|
|
|
|
|
print PARI(2)**PARI(1000); |
|
684
|
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
Similarly, large integer literals do not lose precision. |
|
686
|
|
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
This directive is lexically scoped. There is a similar tag C<:hex> |
|
688
|
|
|
|
|
|
|
which affects hexadecimal, octal and binary constants. One may |
|
689
|
|
|
|
|
|
|
also need to use tag C<:float> for auto-conversion of large integer literals |
|
690
|
|
|
|
|
|
|
which Perl considers as floating point literals (see L with arguments> |
|
691
|
|
|
|
|
|
|
for details). |
|
692
|
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
=item doubles |
|
694
|
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
Doubles in Perl are typically of precision approximately 15 digits |
|
696
|
|
|
|
|
|
|
(see L). When you use them as arguments to PARI |
|
697
|
|
|
|
|
|
|
functions, they are converted to PARI real variables, and due to |
|
698
|
|
|
|
|
|
|
intermediate 15-digits-to-binary conversion of Perl variables the |
|
699
|
|
|
|
|
|
|
result may be different than with the PARI many-digits-to-binary |
|
700
|
|
|
|
|
|
|
conversion. E.g., C and C differ at 19-th |
|
701
|
|
|
|
|
|
|
place, as |
|
702
|
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
setprecision(38); |
|
704
|
|
|
|
|
|
|
print pari_print(0.01), "\n", |
|
705
|
|
|
|
|
|
|
pari_print('0.01'), "\n"; |
|
706
|
|
|
|
|
|
|
|
|
707
|
|
|
|
|
|
|
shows. |
|
708
|
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
Note that setprecision() changes the output format of pari_print() and |
|
710
|
|
|
|
|
|
|
friends, as well as the default internal precision. The generic |
|
711
|
|
|
|
|
|
|
PARI===>string conversion does not take into account the output |
|
712
|
|
|
|
|
|
|
format, thus |
|
713
|
|
|
|
|
|
|
|
|
714
|
|
|
|
|
|
|
setprecision(38); |
|
715
|
|
|
|
|
|
|
print PARI(0.01), "\n", |
|
716
|
|
|
|
|
|
|
PARI('0.01'), "\n", |
|
717
|
|
|
|
|
|
|
pari_print(0.01), "\n"; |
|
718
|
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
will print all the lines with different number of digits after the |
|
720
|
|
|
|
|
|
|
point: the first one with 22, since the double 0.01 was converted to a |
|
721
|
|
|
|
|
|
|
low-precision PARI object, the second one with 41, since internal form |
|
722
|
|
|
|
|
|
|
for precision 38 requires that many digits for representation, and the |
|
723
|
|
|
|
|
|
|
last one with 39 to have 38 significant digits. |
|
724
|
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
Starting from version 5.005 of Perl, if the tag C<:float> is used on |
|
726
|
|
|
|
|
|
|
the C |
|
727
|
|
|
|
|
|
|
automatically converted to became PARI objects. E.g., |
|
728
|
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
use Math::Pari ':float'; |
|
730
|
|
|
|
|
|
|
print atan(1.); |
|
731
|
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
is equivalent to |
|
733
|
|
|
|
|
|
|
|
|
734
|
|
|
|
|
|
|
print atan(PARI('1.')); |
|
735
|
|
|
|
|
|
|
|
|
736
|
|
|
|
|
|
|
Similarly, large float literals do not lose precision. |
|
737
|
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
This directive is lexically scoped. |
|
739
|
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
=item array base |
|
741
|
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
Arrays are 1-based in PARI, are 0-based in Perl. So while array |
|
743
|
|
|
|
|
|
|
access is possible in Perl, you need to use different indices: |
|
744
|
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
$nf = PARI 'nf'; # assume that PARI variable nf contains a number field |
|
746
|
|
|
|
|
|
|
$a = PARI('nf[7]'); |
|
747
|
|
|
|
|
|
|
$b = $nf->[6]; |
|
748
|
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
Now $a and $b contain the same value. |
|
750
|
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
=item matrices |
|
752
|
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
Note that C constructor creates a matrix |
|
754
|
|
|
|
|
|
|
with specified columns, while in PARI the command C<[1,2,3;4,5,6]> |
|
755
|
|
|
|
|
|
|
creates a matrix with specified rows. Use a convenience function |
|
756
|
|
|
|
|
|
|
PARImat_tr() which will transpose a matrix created by PARImat() to use |
|
757
|
|
|
|
|
|
|
the same order of elements as in PARI. |
|
758
|
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
=item builtin perl functions |
|
760
|
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
Some PARI functions, like C and C, are Perl |
|
762
|
|
|
|
|
|
|
(semi-)reserved words. To reach these functions, one should either |
|
763
|
|
|
|
|
|
|
import them: |
|
764
|
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
use Math::Pari qw(length eval); |
|
766
|
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
or call them with prefix (like C<&length>) or the full name (like |
|
768
|
|
|
|
|
|
|
C). |
|
769
|
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
=back |
|
771
|
|
|
|
|
|
|
|
|
772
|
|
|
|
|
|
|
=head1 High-resolution graphics |
|
773
|
|
|
|
|
|
|
|
|
774
|
|
|
|
|
|
|
If you have Term::Gnuplot Perl module installed, you may use high-resolution |
|
775
|
|
|
|
|
|
|
graphic primitives of B. Before the usage you need to establish |
|
776
|
|
|
|
|
|
|
a link between Math::Pari and Term::Gnuplot by calling link_gnuplot(). |
|
777
|
|
|
|
|
|
|
You can change the output filehandle by calling set_plot_fh(), and |
|
778
|
|
|
|
|
|
|
output terminal by calling plotterm(), as in |
|
779
|
|
|
|
|
|
|
|
|
780
|
|
|
|
|
|
|
use Math::Pari qw(:graphic asin); |
|
781
|
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
link_gnuplot(); # automatically loads Term::Gnuplot |
|
783
|
|
|
|
|
|
|
plotterm('emtex'); |
|
784
|
|
|
|
|
|
|
plot_outfile_set('out.tex'); # better do after plotterm() |
|
785
|
|
|
|
|
|
|
ploth($x, .5, .999, sub {asin $x}); |
|
786
|
|
|
|
|
|
|
close FH or die; |
|
787
|
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
=head1 libPARI documentation |
|
789
|
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
libPARI documentation is included, see L. It is converted |
|
791
|
|
|
|
|
|
|
from Chapter 3 of B documentation by the F script of GP/PARI. |
|
792
|
|
|
|
|
|
|
|
|
793
|
|
|
|
|
|
|
=head1 ENVIRONMENT |
|
794
|
|
|
|
|
|
|
|
|
795
|
|
|
|
|
|
|
No environment variables are used. |
|
796
|
|
|
|
|
|
|
|
|
797
|
|
|
|
|
|
|
=head1 BUGS |
|
798
|
|
|
|
|
|
|
|
|
799
|
|
|
|
|
|
|
=over 5 |
|
800
|
|
|
|
|
|
|
|
|
801
|
|
|
|
|
|
|
=item * |
|
802
|
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
A few of PARI functions are available indirectly only. |
|
804
|
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
=item * |
|
806
|
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
Using overloading constants with the Perl versions below 5.005_57 could lead to |
|
808
|
|
|
|
|
|
|
segfaults (at least without C<-D usemymalloc>), as in: |
|
809
|
|
|
|
|
|
|
|
|
810
|
|
|
|
|
|
|
use Math::Pari ':int'; |
|
811
|
|
|
|
|
|
|
for ( $i = 0; $i < 10 ; $i++ ) { print "$i\n" } |
|
812
|
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
=item * |
|
814
|
|
|
|
|
|
|
|
|
815
|
|
|
|
|
|
|
It may be possible that conversion of a Perl value which has both the |
|
816
|
|
|
|
|
|
|
integer slot and the floating slot set may create a PARI integer, even |
|
817
|
|
|
|
|
|
|
if the actual value is not an integer. |
|
818
|
|
|
|
|
|
|
|
|
819
|
|
|
|
|
|
|
=item * |
|
820
|
|
|
|
|
|
|
|
|
821
|
|
|
|
|
|
|
problems with refcounting of array elements and Mod(). |
|
822
|
|
|
|
|
|
|
|
|
823
|
|
|
|
|
|
|
Workaround: make the modulus live longer than the result of Mod(). |
|
824
|
|
|
|
|
|
|
Until Perl version C<5.6.1>, one should exercise a special care so |
|
825
|
|
|
|
|
|
|
that the modulus goes out of scope on a different statement than the |
|
826
|
|
|
|
|
|
|
result: |
|
827
|
|
|
|
|
|
|
|
|
828
|
|
|
|
|
|
|
{ my $modulus = 125; |
|
829
|
|
|
|
|
|
|
{ my $res = Mod(34, $modulus); |
|
830
|
|
|
|
|
|
|
print $res; |
|
831
|
|
|
|
|
|
|
} |
|
832
|
|
|
|
|
|
|
$fake = 1; # A (fake) statement here is required |
|
833
|
|
|
|
|
|
|
} |
|
834
|
|
|
|
|
|
|
|
|
835
|
|
|
|
|
|
|
Here $res is destructed before the C<$fake = 1> statement, $modulus is |
|
836
|
|
|
|
|
|
|
destructed before the first statement after the provided block. |
|
837
|
|
|
|
|
|
|
However, if you remove the C<$fake = 1> statement, both these |
|
838
|
|
|
|
|
|
|
variables are destructed on the first statement after the provided |
|
839
|
|
|
|
|
|
|
block (and in a wrong order!). |
|
840
|
|
|
|
|
|
|
|
|
841
|
|
|
|
|
|
|
In C<5.6.1> declaring $modulus before $res is all that is needed to |
|
842
|
|
|
|
|
|
|
circumvent the same problem: |
|
843
|
|
|
|
|
|
|
|
|
844
|
|
|
|
|
|
|
{ my $modulus = 125; |
|
845
|
|
|
|
|
|
|
my $res = Mod(34, $modulus); |
|
846
|
|
|
|
|
|
|
print $res; |
|
847
|
|
|
|
|
|
|
} # destruction will happen in a correct order. |
|
848
|
|
|
|
|
|
|
|
|
849
|
|
|
|
|
|
|
Access to array elements may result in similar problems. Hard to fix |
|
850
|
|
|
|
|
|
|
since in PARI the data is not refcounted. |
|
851
|
|
|
|
|
|
|
|
|
852
|
|
|
|
|
|
|
=item * |
|
853
|
|
|
|
|
|
|
|
|
854
|
|
|
|
|
|
|
Legacy implementations of dynalinking require the code of DLL to be |
|
855
|
|
|
|
|
|
|
compiled to be "position independent" code (PIC). This slows down the |
|
856
|
|
|
|
|
|
|
execution, while allowing sharing the loaded copy of the DLL between |
|
857
|
|
|
|
|
|
|
different processes. [On contemporary architectures the same effect |
|
858
|
|
|
|
|
|
|
is allowed without the position-independent hack.] |
|
859
|
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
Currently, PARI assembler files are not position-independent. When |
|
861
|
|
|
|
|
|
|
compiled for the dynamic linking on legacy systems, this creates a DLL |
|
862
|
|
|
|
|
|
|
which cannot be shared between processes. Some legacy systems are |
|
863
|
|
|
|
|
|
|
reported to recognize this situation, and load the DLL as a non-shared |
|
864
|
|
|
|
|
|
|
module. However, there may be systems (are there?) on which this can |
|
865
|
|
|
|
|
|
|
cause some "problems". |
|
866
|
|
|
|
|
|
|
|
|
867
|
|
|
|
|
|
|
Summary: if the dynaloading on your system requires some kind of C<-fPIC> flag, using "assembler" compiles (anything but C) *may* force you to do a static build (i.e., creation of a custom Perl executable with |
|
868
|
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
perl Makefile.PL static |
|
870
|
|
|
|
|
|
|
make perl |
|
871
|
|
|
|
|
|
|
make test_static |
|
872
|
|
|
|
|
|
|
|
|
873
|
|
|
|
|
|
|
). |
|
874
|
|
|
|
|
|
|
|
|
875
|
|
|
|
|
|
|
=item * |
|
876
|
|
|
|
|
|
|
|
|
877
|
|
|
|
|
|
|
isprime() is a misnomer before PARI version 2.3! |
|
878
|
|
|
|
|
|
|
|
|
879
|
|
|
|
|
|
|
In older versions of PARI, the one-argument variant of the function isprime() |
|
880
|
|
|
|
|
|
|
is actually checking for probable primes. Moreover, it has certain problems. |
|
881
|
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
B before version 2.3 of PARI, to get probability of |
|
883
|
|
|
|
|
|
|
misdetecting a prime below 1e-12, call isprime() twice; below 1e-18, call |
|
884
|
|
|
|
|
|
|
it 3 times; etc. (The algorithm is probabilistic, and the implementation is |
|
885
|
|
|
|
|
|
|
such that the result depends on which calls to isprime() were performed ealier.) |
|
886
|
|
|
|
|
|
|
|
|
887
|
|
|
|
|
|
|
The problems: first, while the default algorithm (before version 2.3) gives practically |
|
888
|
|
|
|
|
|
|
acceptable results in non-adversarial situations, the worst-case behaviour is |
|
889
|
|
|
|
|
|
|
significantly worse than the average behaviour. The algorithm is looking for so-called |
|
890
|
|
|
|
|
|
|
"witnesses" (with up to 10 tries) among random integers; usually, witnesses are abundant. However, |
|
891
|
|
|
|
|
|
|
there are non-prime numbers for which the fraction of witnesses is close to the theoretical |
|
892
|
|
|
|
|
|
|
minimum, 0.75; with 10 random tries, the probability |
|
893
|
|
|
|
|
|
|
of missing a witness for such numbers is close to 1e-6. (The known worst-case numbers M |
|
894
|
|
|
|
|
|
|
have phi(M)/4 non-witnesses, with M=P(2P-1), prime P, 2P-1 and 4|P+1; the proportion of such |
|
895
|
|
|
|
|
|
|
numbers near K is expected to be const/sqrt(K)log(K)^2. Note that numbers which have more than |
|
896
|
|
|
|
|
|
|
about 5% non-witnesses may also be candidates for false positives. Conjecturally, they |
|
897
|
|
|
|
|
|
|
are of the form (aD+1)(bD+1) with a
|
|
898
|
|
|
|
|
|
|
by high power of 2 (above a=1, b=2 and D is odd); the proportion of such numbers may have |
|
899
|
|
|
|
|
|
|
a similar asymptotic const/sqrt(K)log(K)^2.) |
|
900
|
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
Second, the random number generator is "reset to known state" when PARI library |
|
902
|
|
|
|
|
|
|
is initialized. That means that the behaviour is actually predictable if one knows |
|
903
|
|
|
|
|
|
|
which calls to isprime() are performed; an adversary can find non-primes M which will |
|
904
|
|
|
|
|
|
|
trigger a false positive exactly on the Nth call to isprime(M) (for particular values |
|
905
|
|
|
|
|
|
|
of N). With enough computing resources, one can find non-primes M for which N is |
|
906
|
|
|
|
|
|
|
relatively small (with M about 1e9, one can achieve N as low as 1000). |
|
907
|
|
|
|
|
|
|
Compare with similar (but less abundant) examples for simpler algorithm, |
|
908
|
|
|
|
|
|
|
L; |
|
909
|
|
|
|
|
|
|
see also L and L
|
|
910
|
|
|
|
|
|
|
with many non-witnesses|http://oeis.org/A141768>, and L
|
|
911
|
|
|
|
|
|
|
proportion|http://web.archive.org/web/*/http://www.ma.iup.edu/MAA/proceedings/vol1/higgins.pdf>. |
|
912
|
|
|
|
|
|
|
|
|
913
|
|
|
|
|
|
|
See L. |
|
914
|
|
|
|
|
|
|
|
|
915
|
|
|
|
|
|
|
=back |
|
916
|
|
|
|
|
|
|
|
|
917
|
|
|
|
|
|
|
=head1 INITIALIZATION |
|
918
|
|
|
|
|
|
|
|
|
919
|
|
|
|
|
|
|
When Math::Pari is loaded, it examines variables $Math::Pari::initmem |
|
920
|
|
|
|
|
|
|
and $Math::Pari::initprimes. They specify up to which number the |
|
921
|
|
|
|
|
|
|
initial list of primes should be precalculated, and how large should |
|
922
|
|
|
|
|
|
|
be the arena for PARI calculations (in bytes). (These values have |
|
923
|
|
|
|
|
|
|
safe defaults.) |
|
924
|
|
|
|
|
|
|
|
|
925
|
|
|
|
|
|
|
Since setting these values before loading requires either a C |
|
926
|
|
|
|
|
|
|
block, or postponing the loading (C |
|
927
|
|
|
|
|
|
|
more convenient to set them via Math::PariInit: |
|
928
|
|
|
|
|
|
|
|
|
929
|
|
|
|
|
|
|
use Math::PariInit qw( primes=12000000 stack=1e8 ); |
|
930
|
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
C |
|
932
|
|
|
|
|
|
|
see L. |
|
933
|
|
|
|
|
|
|
|
|
934
|
|
|
|
|
|
|
These values may be changed at runtime too, via allocatemem() and |
|
935
|
|
|
|
|
|
|
setprimelimit(), with performance penalties for recalculation/reallocation. |
|
936
|
|
|
|
|
|
|
|
|
937
|
|
|
|
|
|
|
=head1 AUTHOR |
|
938
|
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
Ilya Zakharevich, I |
|
940
|
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
=cut |
|
942
|
|
|
|
|
|
|
|
|
943
|
243
|
|
|
243
|
|
6479
|
use strict; |
|
|
243
|
|
|
|
|
414
|
|
|
|
243
|
|
|
|
|
13624
|
|
|
944
|
|
|
|
|
|
|
|
|
945
|
|
|
|
|
|
|
# $Id: Pari.pm,v 1.3 1994/11/25 23:40:52 ilya Exp ilya $ |
|
946
|
|
|
|
|
|
|
package Math::Pari::Arr; |
|
947
|
|
|
|
|
|
|
|
|
948
|
|
|
|
|
|
|
#sub TIEARRAY { $_[0] } |
|
949
|
0
|
|
|
0
|
|
0
|
sub STORE { die "Storing into array elements unsupported" } |
|
950
|
|
|
|
|
|
|
|
|
951
|
|
|
|
|
|
|
package Math::Pari; # %converted $initmem $initprimes inspected by xs |
|
952
|
243
|
|
|
|
|
42000
|
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT $AUTOLOAD |
|
953
|
243
|
|
|
243
|
|
1157
|
%converted $initmem $initprimes %names %sections); # XXX may need to access %names %sections? |
|
|
243
|
|
|
|
|
379
|
|
|
954
|
|
|
|
|
|
|
|
|
955
|
|
|
|
|
|
|
require Exporter; |
|
956
|
|
|
|
|
|
|
require DynaLoader; |
|
957
|
|
|
|
|
|
|
#use autouse Carp => 'croak'; |
|
958
|
|
|
|
|
|
|
|
|
959
|
|
|
|
|
|
|
@ISA = qw(Exporter DynaLoader); |
|
960
|
|
|
|
|
|
|
@Math::Pari::Ep::ISA = qw(Math::Pari); |
|
961
|
|
|
|
|
|
|
|
|
962
|
|
|
|
|
|
|
# Items to export into callers namespace by default |
|
963
|
|
|
|
|
|
|
# (move infrequently used names to @EXPORT_OK below) |
|
964
|
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
@EXPORT = qw( |
|
966
|
|
|
|
|
|
|
PARI PARIcol PARImat PARIvecL PARIcolL PARImatL PARIvar PARImat_tr parse_as_gp |
|
967
|
|
|
|
|
|
|
); |
|
968
|
|
|
|
|
|
|
|
|
969
|
|
|
|
|
|
|
# Other items we are prepared to export if requested (may be extended during |
|
970
|
|
|
|
|
|
|
# ->import. ) |
|
971
|
|
|
|
|
|
|
@EXPORT_OK = qw( |
|
972
|
|
|
|
|
|
|
sv2pari sv2parimat pari2iv pari2nv pari2num pari2pv pari2bool loadPari _bool |
|
973
|
|
|
|
|
|
|
listPari pari_print pari_pprint pari_texprint O ifact gdivent gdivround |
|
974
|
|
|
|
|
|
|
changevalue set_plot_fh plot_outfile_set link_gnuplot setprecision setseriesprecision |
|
975
|
|
|
|
|
|
|
setprimelimit allocatemem type_name pari2num_ |
|
976
|
|
|
|
|
|
|
); |
|
977
|
|
|
|
|
|
|
|
|
978
|
243
|
|
|
|
|
1116
|
use subs qw( |
|
979
|
|
|
|
|
|
|
_gneg |
|
980
|
|
|
|
|
|
|
_gadd |
|
981
|
|
|
|
|
|
|
_gsub |
|
982
|
|
|
|
|
|
|
_gmul |
|
983
|
|
|
|
|
|
|
_gdiv |
|
984
|
|
|
|
|
|
|
_gmod |
|
985
|
|
|
|
|
|
|
_gpui |
|
986
|
|
|
|
|
|
|
_gle |
|
987
|
|
|
|
|
|
|
_gge |
|
988
|
|
|
|
|
|
|
_glt |
|
989
|
|
|
|
|
|
|
_ggt |
|
990
|
|
|
|
|
|
|
_geq |
|
991
|
|
|
|
|
|
|
_gne |
|
992
|
|
|
|
|
|
|
_gcmp |
|
993
|
|
|
|
|
|
|
_lex |
|
994
|
|
|
|
|
|
|
_2bool |
|
995
|
|
|
|
|
|
|
pari2pv |
|
996
|
|
|
|
|
|
|
pari2num |
|
997
|
|
|
|
|
|
|
pari2num_ |
|
998
|
|
|
|
|
|
|
_abs |
|
999
|
|
|
|
|
|
|
_cos |
|
1000
|
|
|
|
|
|
|
_sin |
|
1001
|
|
|
|
|
|
|
_exp |
|
1002
|
|
|
|
|
|
|
_log |
|
1003
|
|
|
|
|
|
|
_sqrt |
|
1004
|
|
|
|
|
|
|
_gbitand |
|
1005
|
|
|
|
|
|
|
_gbitor |
|
1006
|
|
|
|
|
|
|
_gbitxor |
|
1007
|
|
|
|
|
|
|
_gbitneg |
|
1008
|
|
|
|
|
|
|
_to_int |
|
1009
|
|
|
|
|
|
|
_gbitshiftr |
|
1010
|
|
|
|
|
|
|
_gbitshiftl |
|
1011
|
243
|
|
|
243
|
|
107972
|
); # Otherwise overload->import would complain... |
|
|
243
|
|
|
|
|
5605
|
|
|
1012
|
|
|
|
|
|
|
|
|
1013
|
|
|
|
|
|
|
my $two; |
|
1014
|
|
|
|
|
|
|
|
|
1015
|
|
|
|
|
|
|
sub _shiftl { |
|
1016
|
0
|
|
|
0
|
|
0
|
my ($left,$right) = (shift,shift); |
|
1017
|
0
|
0
|
|
|
|
0
|
($left,$right) = ($right, $left) if shift; |
|
1018
|
0
|
|
|
|
|
0
|
$left * $two**$right; |
|
1019
|
|
|
|
|
|
|
} |
|
1020
|
|
|
|
|
|
|
|
|
1021
|
|
|
|
|
|
|
sub _shiftr { |
|
1022
|
7
|
|
|
7
|
|
36
|
my ($left,$right) = (shift,shift); |
|
1023
|
7
|
100
|
|
|
|
14
|
($left,$right) = ($right, $left) if shift; |
|
1024
|
7
|
|
|
|
|
195
|
floor($left / $two**$right); |
|
1025
|
|
|
|
|
|
|
} |
|
1026
|
|
|
|
|
|
|
|
|
1027
|
|
|
|
|
|
|
$initmem ||= 4000000; # How much memory for the stack |
|
1028
|
|
|
|
|
|
|
$initprimes ||= 500000; # Calculate primes up to this number |
|
1029
|
|
|
|
|
|
|
|
|
1030
|
|
|
|
|
|
|
$VERSION = '2.130400_030523'; |
|
1031
|
|
|
|
|
|
|
|
|
1032
|
|
|
|
|
|
|
my $true = 1; |
|
1033
|
|
|
|
|
|
|
# Propagate sv_true, sv_false to SvIOK: |
|
1034
|
|
|
|
|
|
|
my $dummy = pack 'ii', $true == 1, $true == 0; |
|
1035
|
|
|
|
|
|
|
|
|
1036
|
|
|
|
|
|
|
bootstrap Math::Pari; |
|
1037
|
|
|
|
|
|
|
|
|
1038
|
243
|
|
|
|
|
1527
|
use overload qw( |
|
1039
|
|
|
|
|
|
|
neg _gneg |
|
1040
|
|
|
|
|
|
|
+ _gadd |
|
1041
|
|
|
|
|
|
|
- _gsub |
|
1042
|
|
|
|
|
|
|
* _gmul |
|
1043
|
|
|
|
|
|
|
/ _gdiv |
|
1044
|
|
|
|
|
|
|
% _gmod |
|
1045
|
|
|
|
|
|
|
** _gpui |
|
1046
|
|
|
|
|
|
|
<= _gle |
|
1047
|
|
|
|
|
|
|
>= _gge |
|
1048
|
|
|
|
|
|
|
< _glt |
|
1049
|
|
|
|
|
|
|
> _ggt |
|
1050
|
|
|
|
|
|
|
== _geq |
|
1051
|
|
|
|
|
|
|
!= _gne |
|
1052
|
|
|
|
|
|
|
<=> _gcmp |
|
1053
|
|
|
|
|
|
|
cmp _lex |
|
1054
|
|
|
|
|
|
|
bool _2bool |
|
1055
|
|
|
|
|
|
|
"" pari2pv |
|
1056
|
|
|
|
|
|
|
0+ pari2num_ |
|
1057
|
|
|
|
|
|
|
abs _abs |
|
1058
|
|
|
|
|
|
|
cos _cos |
|
1059
|
|
|
|
|
|
|
sin _sin |
|
1060
|
|
|
|
|
|
|
exp _exp |
|
1061
|
|
|
|
|
|
|
log _log |
|
1062
|
|
|
|
|
|
|
sqrt _sqrt |
|
1063
|
|
|
|
|
|
|
int _to_int |
|
1064
|
243
|
|
|
243
|
|
91329
|
); |
|
|
243
|
|
|
|
|
4888
|
|
|
1065
|
|
|
|
|
|
|
|
|
1066
|
|
|
|
|
|
|
if (pari_version_exp() >= 2000018) { |
|
1067
|
|
|
|
|
|
|
'overload'->import( qw( |
|
1068
|
|
|
|
|
|
|
| _gbitor |
|
1069
|
|
|
|
|
|
|
& _gbitand |
|
1070
|
|
|
|
|
|
|
^ _gbitxor |
|
1071
|
|
|
|
|
|
|
~ _gbitneg |
|
1072
|
|
|
|
|
|
|
) ); |
|
1073
|
|
|
|
|
|
|
} |
|
1074
|
|
|
|
|
|
|
|
|
1075
|
|
|
|
|
|
|
if (pari_version_exp() >= 2002001) { |
|
1076
|
|
|
|
|
|
|
'overload'->import( qw( << _gbitshiftl ) ); |
|
1077
|
|
|
|
|
|
|
} else { |
|
1078
|
|
|
|
|
|
|
'overload'->import( qw( << _shiftl ) ); |
|
1079
|
|
|
|
|
|
|
} |
|
1080
|
|
|
|
|
|
|
if (pari_version_exp() >= 2002001 && pari_version_exp() <= 2002007) { |
|
1081
|
|
|
|
|
|
|
'overload'->import( qw( >> _gbitshiftr ) ); |
|
1082
|
|
|
|
|
|
|
} else { |
|
1083
|
|
|
|
|
|
|
'overload'->import( qw( >> _shiftr ) ); |
|
1084
|
|
|
|
|
|
|
} |
|
1085
|
|
|
|
|
|
|
|
|
1086
|
|
|
|
|
|
|
sub AUTOLOAD { |
|
1087
|
117
|
|
|
117
|
|
4224
|
$AUTOLOAD =~ /^(?:Math::Pari::)?(.*)/; |
|
1088
|
|
|
|
|
|
|
# warn "Autoloading $1...\n"; |
|
1089
|
|
|
|
|
|
|
# exit 4 if $1 eq 'loadPari'; |
|
1090
|
117
|
|
|
|
|
1230
|
my $cv = loadPari($1); |
|
1091
|
|
|
|
|
|
|
|
|
1092
|
|
|
|
|
|
|
# goto &$cv; |
|
1093
|
|
|
|
|
|
|
# goto &$AUTOLOAD; |
|
1094
|
|
|
|
|
|
|
# &$cv; |
|
1095
|
243
|
|
|
243
|
|
107947
|
no strict 'refs'; |
|
|
243
|
|
|
|
|
434
|
|
|
|
243
|
|
|
|
|
334784
|
|
|
1096
|
117
|
|
|
|
|
78231
|
&$1; |
|
1097
|
|
|
|
|
|
|
# &$AUTOLOAD; |
|
1098
|
|
|
|
|
|
|
} |
|
1099
|
|
|
|
|
|
|
|
|
1100
|
|
|
|
|
|
|
# Needed this guy to circumvent autoloading while no XS definition |
|
1101
|
|
|
|
|
|
|
|
|
1102
|
|
|
|
|
|
|
#### sub DESTROY {} |
|
1103
|
|
|
|
|
|
|
|
|
1104
|
|
|
|
|
|
|
|
|
1105
|
|
|
|
|
|
|
# sub AUTOLOAD { |
|
1106
|
|
|
|
|
|
|
# if ((caller(0))[4]) { |
|
1107
|
|
|
|
|
|
|
# $AutoLoader::AUTOLOAD = $AUTOLOAD; |
|
1108
|
|
|
|
|
|
|
# goto &AutoLoader::AUTOLOAD; |
|
1109
|
|
|
|
|
|
|
# } |
|
1110
|
|
|
|
|
|
|
# local($constname); |
|
1111
|
|
|
|
|
|
|
# ($constname = $AUTOLOAD) =~ s/.*:://; |
|
1112
|
|
|
|
|
|
|
# $val = constant($constname, @_ ? $_[0] : 0); |
|
1113
|
|
|
|
|
|
|
# if ($! != 0) { |
|
1114
|
|
|
|
|
|
|
# if ($! =~ /Invalid/) { |
|
1115
|
|
|
|
|
|
|
# $AutoLoader::AUTOLOAD = $AUTOLOAD; |
|
1116
|
|
|
|
|
|
|
# goto &AutoLoader::AUTOLOAD; |
|
1117
|
|
|
|
|
|
|
# } |
|
1118
|
|
|
|
|
|
|
# else { |
|
1119
|
|
|
|
|
|
|
# ($pack,$file,$line) = caller; |
|
1120
|
|
|
|
|
|
|
# die "Your vendor has not defined Math::Pari macro $constname, used at $file line $line. |
|
1121
|
|
|
|
|
|
|
# "; |
|
1122
|
|
|
|
|
|
|
# } |
|
1123
|
|
|
|
|
|
|
# } |
|
1124
|
|
|
|
|
|
|
# eval "sub $AUTOLOAD { $val }"; |
|
1125
|
|
|
|
|
|
|
# goto &$AUTOLOAD; |
|
1126
|
|
|
|
|
|
|
# } |
|
1127
|
|
|
|
|
|
|
|
|
1128
|
|
|
|
|
|
|
# Preloaded methods go here. Autoload methods go after __END__, and are |
|
1129
|
|
|
|
|
|
|
# processed by the autosplit program. |
|
1130
|
|
|
|
|
|
|
|
|
1131
|
|
|
|
|
|
|
sub new { |
|
1132
|
7
|
|
|
7
|
0
|
597
|
shift; |
|
1133
|
7
|
50
|
|
|
|
20
|
if (@_>1) {my(@t)=@_;return sv2pari(\@t)} |
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
1134
|
7
|
|
|
|
|
296
|
return sv2pari(shift); |
|
1135
|
|
|
|
|
|
|
} |
|
1136
|
|
|
|
|
|
|
|
|
1137
|
|
|
|
|
|
|
###sub PARI {new Math::Pari @_} |
|
1138
|
|
|
|
|
|
|
|
|
1139
|
|
|
|
|
|
|
%names = qw( |
|
1140
|
|
|
|
|
|
|
1 standard |
|
1141
|
|
|
|
|
|
|
2 conversions |
|
1142
|
|
|
|
|
|
|
3 transcendental |
|
1143
|
|
|
|
|
|
|
4 number |
|
1144
|
|
|
|
|
|
|
5 elliptic |
|
1145
|
|
|
|
|
|
|
6 fields |
|
1146
|
|
|
|
|
|
|
7 polynomials |
|
1147
|
|
|
|
|
|
|
8 vectors |
|
1148
|
|
|
|
|
|
|
9 sums |
|
1149
|
|
|
|
|
|
|
10 graphic |
|
1150
|
|
|
|
|
|
|
11 programming |
|
1151
|
|
|
|
|
|
|
|
|
1152
|
|
|
|
|
|
|
100 l_functions |
|
1153
|
|
|
|
|
|
|
101 modular_symb |
|
1154
|
|
|
|
|
|
|
102 algebras |
|
1155
|
|
|
|
|
|
|
103 combinatorics |
|
1156
|
|
|
|
|
|
|
104 modular |
|
1157
|
|
|
|
|
|
|
); |
|
1158
|
|
|
|
|
|
|
@sections{values %names} = keys %names; |
|
1159
|
|
|
|
|
|
|
# warn "No code to handle added sections yet" if added_sections(); # Now tested in 02_sections.t |
|
1160
|
|
|
|
|
|
|
|
|
1161
|
|
|
|
|
|
|
if (pari_version_exp() < 2009000) { |
|
1162
|
|
|
|
|
|
|
*listPari = \&_listPari; |
|
1163
|
|
|
|
|
|
|
*old2newsec = sub ($) {shift}; |
|
1164
|
|
|
|
|
|
|
} else { # XXX only 2.9.* supported so far |
|
1165
|
|
|
|
|
|
|
my %sec2; |
|
1166
|
|
|
|
|
|
|
if (pari_version_exp() < 2011000) { |
|
1167
|
|
|
|
|
|
|
%sec2 = (100 => 6+2, 101 => 7+2, 102 => 9+2, map {($_, $_ + 2 + 2*($_>=6) + ($_>=7))} -1..11); |
|
1168
|
|
|
|
|
|
|
} else { |
|
1169
|
|
|
|
|
|
|
my @S = (0, 2, 3, 8, 5, 12, 10, 6, 7, undef, 16, 1); # (1,2,4) +1; 3 -> 8, (5,6) -> (12,10), (7,8) -> -1, (10,11) -> 16,1 |
|
1170
|
|
|
|
|
|
|
my @aS = (13,15,11,4,14); |
|
1171
|
|
|
|
|
|
|
%sec2 = (-1, 1, map {($_, 2+($S[$_] || $aS[$_-100] || $_))} 0..11, 100..104); |
|
1172
|
|
|
|
|
|
|
} |
|
1173
|
0
|
|
0
|
0
|
|
0
|
*old2newsec = sub ($) {($sec2{shift()} || 202) - 2}; # unknowns => 200 |
|
1174
|
255
|
|
50
|
255
|
|
85068
|
*listPari = sub ($) {_listPari(($sec2{shift()} || 202) - 2)}; |
|
1175
|
|
|
|
|
|
|
# *listPari = sub ($) {_listPari(old2newsec(shift))}; |
|
1176
|
|
|
|
|
|
|
} |
|
1177
|
|
|
|
|
|
|
|
|
1178
|
|
|
|
|
|
|
# buch* not appearing in newer PARIs (at least as of 2.3.5) |
|
1179
|
|
|
|
|
|
|
@converted{qw(buchimag buchreal |
|
1180
|
|
|
|
|
|
|
buchgen buchgenforcefu buchgenfu buchinit buchinitforcefu buchinitfu |
|
1181
|
|
|
|
|
|
|
plotstring addhelp kill)} = (1) x 100; |
|
1182
|
|
|
|
|
|
|
|
|
1183
|
|
|
|
|
|
|
# Now even tested... |
|
1184
|
6
|
|
|
6
|
|
209
|
sub _cvt { PARI(shift) } |
|
1185
|
|
|
|
|
|
|
sub _hex_cvt { |
|
1186
|
7
|
|
|
7
|
|
19
|
my $in = shift; |
|
1187
|
7
|
|
|
|
|
32
|
my $mult = PARI(1); |
|
1188
|
7
|
|
|
|
|
12
|
my $ret = 0; |
|
1189
|
7
|
|
|
|
|
8
|
my $shift = 1<<(4*7); |
|
1190
|
|
|
|
|
|
|
|
|
1191
|
7
|
50
|
|
|
|
34
|
$in =~ s/^0([xb])?// or die; |
|
1192
|
7
|
|
|
|
|
15
|
my $hex = $1; |
|
1193
|
7
|
100
|
100
|
|
|
28
|
if ($hex and $1 eq 'b') { |
|
1194
|
5
|
|
|
|
|
16
|
my $b = '0' x (15 * length($in) % 16) . $in; |
|
1195
|
5
|
|
|
|
|
6
|
$hex = ''; |
|
1196
|
5
|
|
|
|
|
11
|
while ($b) { |
|
1197
|
21
|
|
|
|
|
24
|
my $s = substr $b, 0, 16; |
|
1198
|
21
|
|
|
|
|
26
|
substr($b, 0, 16) = ''; |
|
1199
|
21
|
|
|
|
|
62
|
$hex .= unpack 'H4', pack 'B16', $s; |
|
1200
|
|
|
|
|
|
|
} |
|
1201
|
5
|
|
|
|
|
38
|
$in = $hex; |
|
1202
|
|
|
|
|
|
|
} |
|
1203
|
7
|
100
|
|
|
|
14
|
$shift = 1<<(3*7) unless $hex; |
|
1204
|
7
|
|
|
|
|
26
|
while ($in =~ s/([a-fA-F\d]{1,7})$//) { |
|
1205
|
|
|
|
|
|
|
# In 5.6.0 hex() can return a floating number: |
|
1206
|
16
|
50
|
|
|
|
41
|
my $part = int($hex ? hex $1 : oct $1); |
|
1207
|
|
|
|
|
|
|
|
|
1208
|
16
|
|
|
|
|
99
|
$ret += $part * $mult; |
|
1209
|
16
|
|
|
|
|
118
|
$mult *= $shift; |
|
1210
|
|
|
|
|
|
|
} |
|
1211
|
7
|
50
|
|
|
|
15
|
die "Cannot hex '$in'" if length $in; |
|
1212
|
7
|
|
|
|
|
172
|
return $ret; |
|
1213
|
|
|
|
|
|
|
} |
|
1214
|
|
|
|
|
|
|
my %overloaded_const = ( 'int' => \&_cvt, float => \&_cvt, 'hex' => \&_hex_cvt); |
|
1215
|
|
|
|
|
|
|
my %overloaded_const_word |
|
1216
|
|
|
|
|
|
|
= ( 'int' => 'integer', float => 'float', 'hex' => 'binary'); |
|
1217
|
|
|
|
|
|
|
|
|
1218
|
|
|
|
|
|
|
my %export_ok; |
|
1219
|
|
|
|
|
|
|
|
|
1220
|
|
|
|
|
|
|
sub import { |
|
1221
|
249
|
|
|
249
|
|
812
|
my $p=shift; |
|
1222
|
249
|
|
|
|
|
484
|
my @const; # Need to do it outside any block! |
|
1223
|
|
|
|
|
|
|
@_ = map { |
|
1224
|
249
|
100
|
|
|
|
628
|
if (/^:(?!DEFAULT)(.*)/) { |
|
|
720
|
|
|
|
|
3372
|
|
|
1225
|
241
|
|
|
|
|
1074
|
my $tag = $1; |
|
1226
|
241
|
|
|
|
|
483
|
my $sect = $tag; |
|
1227
|
241
|
|
|
|
|
389
|
my @pre; |
|
1228
|
241
|
100
|
|
|
|
1823
|
$tag = -1, @pre = (@EXPORT_OK,@EXPORT) if ($tag eq 'all'); |
|
1229
|
241
|
50
|
|
|
|
792
|
$tag = -1 if ($tag eq 'PARI'); |
|
1230
|
241
|
50
|
66
|
|
|
1446
|
$tag = $sections{$tag} if $tag !~ /^-?\d+$/ and exists $sections{$tag}; |
|
1231
|
241
|
50
|
|
|
|
847
|
push @pre, 'link_gnuplot', 'set_plot_fh', 'plot_outfile_set' if $tag eq $sections{graphic}; |
|
1232
|
241
|
50
|
33
|
|
|
2717
|
if ($tag =~ /^prec=(\d+)$/) { |
|
|
|
100
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
1233
|
0
|
|
|
|
|
0
|
setprecision($1); |
|
1234
|
0
|
|
|
|
|
0
|
(); |
|
1235
|
|
|
|
|
|
|
} elsif ($tag =~ /^(int|hex|float)$/) { |
|
1236
|
3
|
50
|
|
|
|
7
|
die "Overloaded constants are not supported in this version of Perl" |
|
1237
|
|
|
|
|
|
|
if $] < 5.004_69; |
|
1238
|
3
|
|
|
|
|
8
|
push @const, $overloaded_const_word{$tag} => $overloaded_const{$tag}; |
|
1239
|
|
|
|
|
|
|
# print "Constants: $overloaded_const_word{$tag} => $overloaded_const{$tag} \n"; |
|
1240
|
3
|
|
|
|
|
6
|
(); |
|
1241
|
|
|
|
|
|
|
} elsif (defined $tag and $tag =~ /^-?\d+$/) { |
|
1242
|
238
|
|
|
|
|
1497
|
(@pre, listPari($tag)); |
|
1243
|
|
|
|
|
|
|
} else { |
|
1244
|
0
|
|
|
|
|
0
|
die "Unknown section '$sect' specified"; |
|
1245
|
|
|
|
|
|
|
} |
|
1246
|
|
|
|
|
|
|
} else { |
|
1247
|
479
|
|
|
|
|
1003
|
($_); |
|
1248
|
|
|
|
|
|
|
} |
|
1249
|
|
|
|
|
|
|
} @_; |
|
1250
|
|
|
|
|
|
|
|
|
1251
|
249
|
|
|
|
|
2761
|
overload::constant(splice @const, 0, 2) while @const; |
|
1252
|
|
|
|
|
|
|
|
|
1253
|
|
|
|
|
|
|
# print "EXPORT_OK: @EXPORT_OK\n"; |
|
1254
|
|
|
|
|
|
|
push @EXPORT_OK, |
|
1255
|
|
|
|
|
|
|
grep( ($_ ne ':DEFAULT' |
|
1256
|
|
|
|
|
|
|
and not $export_ok{$_}++ |
|
1257
|
249
|
|
66
|
|
|
15916
|
and (eval {loadPari($_), 1} or warn $@), !$@) , |
|
1258
|
|
|
|
|
|
|
@_); |
|
1259
|
|
|
|
|
|
|
# Invalidate Exporter cache, so that new %EXPORT_OK is noticed: |
|
1260
|
249
|
|
|
|
|
1632
|
undef %EXPORT; |
|
1261
|
|
|
|
|
|
|
# print "EXPORT_OK: @EXPORT_OK\n"; |
|
1262
|
249
|
|
|
|
|
1127601
|
&Exporter::export($p,(caller(0))[0],@_); |
|
1263
|
|
|
|
|
|
|
} |
|
1264
|
|
|
|
|
|
|
|
|
1265
|
|
|
|
|
|
|
sub _can { # Without taking into account inheritance... |
|
1266
|
3
|
|
|
3
|
|
146
|
my ($obj, $meth) = (shift, shift); |
|
1267
|
3
|
100
|
|
|
|
17
|
return \&$meth if defined &$meth; |
|
1268
|
2
|
100
|
|
|
|
2
|
return \&$meth if eval {loadPari($meth), 1}; |
|
|
2
|
|
|
|
|
27
|
|
|
1269
|
1
|
|
|
|
|
4
|
return; |
|
1270
|
|
|
|
|
|
|
} |
|
1271
|
|
|
|
|
|
|
|
|
1272
|
|
|
|
|
|
|
sub can { |
|
1273
|
7
|
|
|
7
|
0
|
378
|
my ($obj, $meth) = (@_); |
|
1274
|
7
|
|
|
|
|
44
|
my $f = $obj->SUPER::can($meth); |
|
1275
|
7
|
100
|
|
|
|
26
|
return $f if defined $f; |
|
1276
|
|
|
|
|
|
|
# There is no "usual" way to get the function; try loadPari() |
|
1277
|
3
|
|
|
|
|
5
|
$f = eval { loadPari($meth) }; |
|
|
3
|
|
|
|
|
40
|
|
|
1278
|
3
|
100
|
|
|
|
22
|
return $f if defined $f; |
|
1279
|
1
|
|
|
|
|
3
|
return; |
|
1280
|
|
|
|
|
|
|
} |
|
1281
|
|
|
|
|
|
|
|
|
1282
|
|
|
|
|
|
|
sub O ($;$) { |
|
1283
|
3
|
100
|
|
3
|
0
|
217
|
return PARI("O($_[0]^$_[1])") if @_ == 2; |
|
1284
|
1
|
50
|
|
|
|
32
|
return PARI("O($_[0])") if typ($_[0]) == 10; # Poly |
|
1285
|
0
|
|
|
|
|
0
|
Carp::croak("O(number**power) not implemented, use O(number,power) instead"); |
|
1286
|
|
|
|
|
|
|
} |
|
1287
|
|
|
|
|
|
|
|
|
1288
|
286
|
|
|
286
|
1
|
23266
|
sub PARImat_tr {mattranspose(PARImat(@_))} |
|
1289
|
|
|
|
|
|
|
#sub string ($$) { |
|
1290
|
|
|
|
|
|
|
# PARI (qq'string($_[0],"$_[1]")'); |
|
1291
|
|
|
|
|
|
|
#} |
|
1292
|
|
|
|
|
|
|
|
|
1293
|
1
|
|
|
1
|
0
|
69
|
sub installPerlFunction {my @a=@_; $a[0] = \&{$a[0]}; installPerlFunctionCV(@a)} |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
11
|
|
|
1294
|
|
|
|
|
|
|
|
|
1295
|
|
|
|
|
|
|
my $name; |
|
1296
|
|
|
|
|
|
|
|
|
1297
|
|
|
|
|
|
|
for $name (keys %converted) { |
|
1298
|
|
|
|
|
|
|
push @EXPORT_OK, $name; |
|
1299
|
|
|
|
|
|
|
next if defined &$name; |
|
1300
|
|
|
|
|
|
|
# string needs to format numbers to 8.3... |
|
1301
|
243
|
|
|
243
|
|
1882
|
no strict 'refs'; |
|
|
243
|
|
|
|
|
420
|
|
|
|
243
|
|
|
|
|
250028
|
|
|
1302
|
|
|
|
|
|
|
if ($name eq 'addhelp' or $name eq 'plotstring') { |
|
1303
|
4
|
|
|
4
|
|
274
|
*$name = sub { PARI ( qq($name($_[0],"$_[1]")) ) } |
|
1304
|
|
|
|
|
|
|
} else { # probably `kill' only |
|
1305
|
1
|
|
|
1
|
|
4
|
*$name = sub { local $"=','; PARI("$name(@_)") } # " |
|
|
1
|
|
|
|
|
60
|
|
|
1306
|
|
|
|
|
|
|
} |
|
1307
|
|
|
|
|
|
|
} |
|
1308
|
|
|
|
|
|
|
|
|
1309
|
|
|
|
|
|
|
@export_ok{@EXPORT_OK,@EXPORT} = (1) x (@EXPORT_OK + @EXPORT); |
|
1310
|
|
|
|
|
|
|
|
|
1311
|
|
|
|
0
|
|
|
sub __my_NOP {} |
|
1312
|
|
|
|
|
|
|
|
|
1313
|
|
|
|
|
|
|
my %supported_cmd = qw(q 0 p setprecision e __my_NOP); # ??? WRONG !!! |
|
1314
|
|
|
|
|
|
|
my $supported_cmd_rx = '(?:' . join( '|', keys %supported_cmd) . ')'; |
|
1315
|
|
|
|
|
|
|
$supported_cmd_rx = qr($supported_cmd_rx); |
|
1316
|
|
|
|
|
|
|
my $matched_par; |
|
1317
|
|
|
|
|
|
|
$matched_par = qr[[^()]*(?:\((??{$matched_par})\)[^()]*)*]; # arbitrary string with ( and ) matching |
|
1318
|
|
|
|
|
|
|
|
|
1319
|
5
|
|
|
5
|
0
|
33
|
sub remove_nl ($) { (my $in = shift) =~ s/\n//g; $in } |
|
|
5
|
|
|
|
|
31
|
|
|
1320
|
|
|
|
|
|
|
|
|
1321
|
|
|
|
|
|
|
my %POSTF = qw(K 1 M 2 G 3 T 4); |
|
1322
|
|
|
|
|
|
|
sub allocatemem_prot ($) { |
|
1323
|
1
|
|
|
1
|
0
|
2
|
my $mem = shift; |
|
1324
|
1
|
|
|
|
|
4
|
$mem =~ s/^(.*)([KMGT])/$1*1000**$POSTF{$2}/e; |
|
|
1
|
|
|
|
|
6
|
|
|
1325
|
1
|
50
|
33
|
|
|
2
|
eval {allocatemem($mem); 1} or $@ =~ /^PARI:\s\sat\s+\S*\s+line\s+\d+\.?\s*$/ or die "allocatemem($mem) died: $@" |
|
|
1
|
|
|
|
|
57
|
|
|
|
1
|
|
|
|
|
8
|
|
|
1326
|
|
|
|
|
|
|
} |
|
1327
|
|
|
|
|
|
|
|
|
1328
|
35762
|
|
|
35762
|
0
|
6646132
|
sub MP___a___($) { $Math::Pari::__args::a->[shift] } |
|
1329
|
|
|
|
|
|
|
sub __wrap_PARI_macro ($) { |
|
1330
|
33
|
|
|
33
|
|
117
|
my $name = shift; |
|
1331
|
|
|
|
|
|
|
sub { |
|
1332
|
35713
|
|
|
35713
|
|
64979
|
local $Math::Pari::__args::a = [@_]; |
|
1333
|
35713
|
|
|
|
|
592206
|
PARI("$name(" . (join ',', map "MP___a___($_)", 0..$#_) . ")") |
|
1334
|
|
|
|
|
|
|
} |
|
1335
|
33
|
|
|
|
|
1781
|
} |
|
1336
|
|
|
|
|
|
|
|
|
1337
|
|
|
|
|
|
|
sub PARI_with_default_mem ($) { |
|
1338
|
440
|
|
|
440
|
0
|
904
|
my($in) = shift; |
|
1339
|
440
|
100
|
|
|
|
17242597
|
$in =~ s/(?:^|;)default\(parisize,("?)($matched_par)\1\)\s*$// or return PARI($in); |
|
1340
|
1
|
|
|
|
|
5
|
my $s = "$2"; |
|
1341
|
1
|
|
|
|
|
7
|
PARI($in); |
|
1342
|
1
|
|
|
|
|
4
|
allocatemem_prot($s); |
|
1343
|
|
|
|
|
|
|
} |
|
1344
|
|
|
|
|
|
|
|
|
1345
|
|
|
|
|
|
|
sub parse_as_gp ($;$$$) { # string, quote-and-return, , count to use on the first numbered output (like %33 = 2*x+1) |
|
1346
|
18
|
|
|
18
|
1
|
251
|
my($in, $quote, $echo, $c, $def) = (shift, shift, shift, shift); |
|
1347
|
18
|
|
33
|
|
|
188
|
$def = ($quote and ($quote eq 'define' or ref $quote) and $quote); |
|
1348
|
18
|
50
|
66
|
0
|
|
139
|
$def = sub ($) {shift} if $def and not ref $def; |
|
|
0
|
|
|
|
|
0
|
|
|
1349
|
18
|
|
66
|
|
|
83
|
$quote = ($quote and not $def); |
|
1350
|
18
|
100
|
|
|
|
116
|
$in =~ s/(\\(?!\\)|\/(?!\*)|[^"\s\\\/]|\n|"([^"\\]|\\.)*")|\/\*.*?\*\/|[^\S\n\/]+|\\\\[^\n]*/ defined($1) ? $1 : '' /ges; |
|
|
12720
|
|
|
|
|
30881
|
|
|
1351
|
|
|
|
|
|
|
# Now all unneeded whitespace (except LF) and comments are removed |
|
1352
|
18
|
|
|
|
|
1827
|
$in =~ s/(?:^\s*\{|\{\s*$)(.*?)(?:^\s*\}|\}\s*$)/ remove_nl $1 /gems; # XXXX In fact, braces may appear everywhere??? Strings? |
|
|
5
|
|
|
|
|
18
|
|
|
1353
|
18
|
|
|
|
|
130
|
$in =~ s/(?<=[-=+*\/%^><|&,\(\[])\n(? |