Pari/GP Reference Documentation | Contents - Global index - GP keyboard shortcuts |
Col Colrev List Map Mat Mod Pol Polrev Qfb Ser Set Str Strchr Strexpand Strtex Vec Vecrev Vecsmall binary bitand bitneg bitnegimply bitor bitprecision bittest bitxor ceil centerlift characteristic component conj conjvec denominator digits floor frac fromdigits hammingweight imag length lift liftall liftint liftpol norm numerator numtoperm oo padicprec permtonum precision random real round serprec simplify sizebyte sizedigit truncate valuation varhigher variable variables varlower | |
Many of the conversion functions are rounding or truncating operations. In this case, if the argument is a rational function, the result is the Euclidean quotient of the numerator by the denominator, and if the argument is a vector or a matrix, the operation is done componentwise. This will not be restated for every function.
| |
Col | |
Transforms the object x into a column vector. The dimension of the resulting vector can be optionally specified via the extra parameter n. If n is omitted or 0, the dimension depends on the type of x; the vector has a single component, except when x is * a vector or a quadratic form (in which case the resulting vector is simply the initial object considered as a row vector),
* a polynomial or a power series. In the case of a polynomial, the
coefficients of the vector start with the leading coefficient of the
polynomial, while for power series only the significant coefficients are
taken into account, but this time by increasing order of degree.
In this last case, * a matrix (the column of row vector comprising the matrix is returned), * a character string (a vector of individual characters is returned). In the last two cases (matrix and character string), n is meaningless and must be omitted or an error is raised. Otherwise, if n is given, 0 entries are appended at the end of the vector if n > 0, and prepended at the beginning if n < 0. The dimension of the resulting vector is |n|.
Note that the function
The library syntax is
| |
Colrev | |
As
The library syntax is
| |
List | |
Transforms a (row or column) vector x into a list, whose components are the entries of x. Similarly for a list, but rather useless in this case. For other types, creates a list with the single element x. Note that, except when x is omitted, this function creates a small memory leak; so, either initialize all lists to the empty list, or use them sparingly.
The library syntax is
| |
Map | |
A "Map" is an associative array, or dictionary: a data
type composed of a collection of (key, value) pairs, such that
each key appears just once in the collection. This function
converts the matrix [a_1,b_1;a_2,b_2;...;a_n,b_n] to the map a_i
? M = Map(factor(13!)); ? mapget(M,3) %2 = 5
If the argument x is omitted, creates an empty map, which
may be filled later via
The library syntax is
| |
Mat | |
Transforms the object x into a matrix. If x is already a matrix, a copy of x is created. If x is a row (resp. column) vector, this creates a 1-row (resp. 1-column) matrix, unless all elements are column (resp. row) vectors of the same length, in which case the vectors are concatenated sideways and the attached big matrix is returned. If x is a binary quadratic form, creates the attached 2 x 2 matrix. Otherwise, this creates a 1 x 1 matrix containing x.
? Mat(x + 1) %1 = [x + 1] ? Vec( matid(3) ) %2 = [[1, 0, 0]~, [0, 1, 0]~, [0, 0, 1]~] ? Mat(%) %3 = [1 0 0] [0 1 0] [0 0 1] ? Col( [1,2; 3,4] ) %4 = [[1, 2], [3, 4]]~ ? Mat(%) %5 = [1 2] [3 4] ? Mat(Qfb(1,2,3)) %6 = [1 1] [1 3]
The library syntax is
| |
Mod | |
In its basic form, creates an intmod or a polmod (a mod b); b must
be an integer or a polynomial. We then obtain a
? t = Mod(2,17); t^8 %1 = Mod(1, 17) ? t = Mod(x,x^2+1); t^2 %2 = Mod(-1, x^2+1)
If a % b makes sense and yields a result of the
appropriate type (
? Mod(1/2, 5) %3 = Mod(3, 5) ? Mod(7 + O(3^6), 3) %4 = Mod(1, 3) ? Mod(Mod(1,12), 9) %5 = Mod(1, 3) ? Mod(1/x, x^2+1) %6 = Mod(-1, x^2+1) ? Mod(exp(x), x^4) %7 = Mod(1/6*x^3 + 1/2*x^2 + x + 1, x^4)
If a is a complex object, "base change" it to ℤ/bℤ or K[x]/(b),
which is equivalent to, but faster than, multiplying it by
? Mod([1,2;3,4], 2) %8 = [Mod(1, 2) Mod(0, 2)] [Mod(1, 2) Mod(0, 2)] ? Mod(3*x+5, 2) %9 = Mod(1, 2)*x + Mod(1, 2) ? Mod(x^2 + y*x + y^3, y^2+1) %10 = Mod(1, y^2 + 1)*x^2 + Mod(y, y^2 + 1)*x + Mod(-y, y^2 + 1)
This function is not the same as x
? x = 4 % 5; x + 1 %1 = 5 ? x = Mod(4,5); x + 1 %2 = Mod(0,5)
Note that such "modular" objects can be lifted via
The library syntax is
| |
Pol | |
Transforms the object t into a polynomial with main variable v. If t
is a scalar, this gives a constant polynomial. If t is a power series with
non-negative valuation or a rational function, the effect is similar to
The main use of this function is when t is a vector: it creates the
polynomial whose coefficients are given by t, with t[1] being the leading
coefficient (which can be zero). It is much faster to evaluate
? Pol([1,2,3]) %1 = x^2 + 2*x + 3 ? Polrev([1,2,3]) %2 = 3*x^2 + 2*x + 1
The reciprocal function of
? Vec(Pol([1,2,3])) %1 = [1, 2, 3] ? Vecrev( Polrev([1,2,3]) ) %2 = [1, 2, 3] Warning. This is not a substitution function. It will not transform an object containing variables of higher priority than v.
? Pol(x + y, y) *** at top-level: Pol(x+y,y) *** ^---------- *** Pol: variable must have higher priority in gtopoly.
The library syntax is
| |
Polrev | |
Transform the object t into a polynomial
with main variable v. If t is a scalar, this gives a constant polynomial.
If t is a power series, the effect is identical to
The main use of this function is when t is a vector: it creates the
polynomial whose coefficients are given by t, with t[1] being the
constant term.
? Polrev([1,2,3]) %1 = 3*x^2 + 2*x + 1 ? Pol([1,2,3]) %2 = x^2 + 2*x + 3
The reciprocal function of
The library syntax is
| |
Qfb | |
Creates the binary quadratic form ax^2+bxy+cy^2. If b^2-4ac > 0, initialize Shanks' distance function to D. Negative definite forms are not implemented, use their positive definite counterpart instead.
The library syntax is
| |
Ser | |
Transforms the object s into a power series with main variable v
(x by default) and precision (number of significant terms) equal to
d ≥ 0 (d =
? Ser(1, 'y, 5) %1 = 1 + O(y^5) ? Ser(x^2,, 5) %2 = x^2 + O(x^7) ? T = polcyclo(100) %3 = x^40 - x^30 + x^20 - x^10 + 1 ? Ser(T, 'x, 11) %4 = 1 - x^10 + O(x^11) The function is more or less equivalent with multiplication by 1 + O(v^d) in theses cases, only faster.
If s is a vector, on the other hand, the coefficients of the vector are
understood to be the coefficients of the power series starting from the
constant term (as in
? v = [1,2,3]; Ser(v, t, 7) %5 = 1 + 2*t + 3*t^2 + O(t^3) \\ 3 terms: 7 is ignored! ? Ser(Polrev(v,t), t, 7) %6 = 1 + 2*t + 3*t^2 + O(t^7) ? s = 1+x+O(x^2); Ser(s, x, 7) %7 = 1 + x + O(x^2) \\ 2 terms: 7 ignored ? Ser(truncate(s), x, 7) %8 = 1 + x + O(x^7)
The warning given for
The library syntax is
| |
Set | |
Converts x into a set, i.e. into a row vector, with strictly increasing
entries with respect to the (somewhat arbitrary) universal comparison function
? Set([1,2,4,2,1,3]) %1 = [1, 2, 3, 4] ? Set(x) %2 = [x] ? Set(Vecsmall([1,3,2,1,3])) %3 = [1, 2, 3]
The library syntax is
| |
Str | |
Converts its argument list into a
single character string (type
? x2 = 0; i = 2; Str(x, i) %1 = "x2" ? eval(%) %2 = 0
This function is mostly useless in library mode. Use the pair
| |
Strchr | |
Converts x to a string, translating each integer into a character.
? Strchr(97) %1 = "a" ? Vecsmall("hello world") %2 = Vecsmall([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]) ? Strchr(%) %3 = "hello world"
The library syntax is
| |
Strexpand | |
Converts its argument list into a
single character string (type
? Strexpand("$HOME/doc") %1 = "/home/pari/doc" The individual arguments are read in string context, see Section se:strings.
| |
Strtex | |
Translates its arguments to TeX
format, and concatenates the results into a single character string (type
The individual arguments are read in string context, see Section se:strings.
| |
Vec | |
Transforms the object x into a row vector. The dimension of the resulting vector can be optionally specified via the extra parameter n. If n is omitted or 0, the dimension depends on the type of x; the vector has a single component, except when x is * a vector or a quadratic form: returns the initial object considered as a row vector,
* a polynomial or a power series: returns a vector consisting of the coefficients.
In the case of a polynomial, the coefficients of the vector start with the leading
coefficient of the polynomial, while for power series only the significant coefficients
are taken into account, but this time by increasing order of degree.
* a matrix: returns the vector of columns comprising the matrix, * a character string: returns the vector of individual characters, * a map: returns the vector of the domain of the map,
* an error context (
In the last four cases (matrix, character string, map, error), n is
meaningless and must be omitted or an error is raised. Otherwise, if n is
given, 0 entries are appended at the end of the vector if n > 0, and
prepended at the beginning if n < 0. The dimension of the resulting vector
is |n|. Variant:
The library syntax is
| |
Vecrev | |
As
The library syntax is
| |
Vecsmall | |
Transforms the object x into a row vector of type
This acts as
The library syntax is
| |
binary | |
Outputs the vector of the binary digits of |x|. Here x can be an integer, a real number (in which case the result has two components, one for the integer part, one for the fractional part) or a vector/matrix.
? binary(10) %1 = [1, 0, 1, 0] ? binary(3.14) %2 = [[1, 1], [0, 0, 1, 0, 0, 0, [...]] ? binary([1,2]) %3 = [[1], [1, 0]] By convention, 0 has no digits:
? binary(0) %4 = []
The library syntax is
| |
bitand | |
Bitwise
Negative numbers behave 2-adically, i.e. the result is the 2-adic limit
of
? bitand(5, 3) %1 = 1 ? bitand(-5, 3) %2 = 3 ? bitand(-5, -3) %3 = -7
The library syntax is
| |
bitneg | |
bitwise negation of an integer x,
truncated to n bits, n ≥ 0, that is the integer
∑_{i = 0}^{n-1} See Section se:bitand for the behavior for negative arguments.
The library syntax is
| |
bitnegimply | |
Bitwise negated imply of two integers x and
y (or See Section se:bitand for the behavior for negative arguments.
The library syntax is
| |
bitor | |
bitwise (inclusive)
See Section se:bitand for the behavior for negative arguments.
The library syntax is
| |
bitprecision | |
The function behaves differently according to whether n is
present and positive or not. If n is missing, the function returns the
(floating point) precision in bits of the PARI object x. If x is an
exact object, the function returns
? bitprecision(exp(1e-100)) %1 = 512 \\ 512 bits ? bitprecision( [ exp(1e-100), 0.5 ] ) %2 = 128 \\ minimal accuracy among components ? bitprecision(2 + x) %3 = +oo \\ exact object If n is present and positive, the function creates a new object equal to x with the new bit-precision roughly n. In fact, the smallest multiple of 64 (resp. 32 on a 32-bit machine) larger than or equal to n. For x a vector or a matrix, the operation is done componentwise; for series and polynomials, the operation is done coefficientwise. For real x, n is the number of desired significant bits. If n is smaller than the precision of x, x is truncated, otherwise x is extended with zeros. For exact or non-floating point types, no change.
? bitprecision(Pi, 10) \\ actually 64 bits ~ 19 decimal digits %1 = 3.141592653589793239 ? bitprecision(1, 10) %2 = 1 ? bitprecision(1 + O(x), 10) %3 = 1 + O(x) ? bitprecision(2 + O(3^5), 10) %4 = 2 + O(3^5)
The library syntax is
| |
bittest | |
Outputs the n-th bit of x starting from the right (i.e. the coefficient of 2^n in the binary expansion of x). The result is 0 or 1.
? bittest(7, 0) %1 = 1 \\ the bit 0 is 1 ? bittest(7, 2) %2 = 1 \\ the bit 2 is 1 ? bittest(7, 3) %3 = 0 \\ the bit 3 is 0 See Section se:bitand for the behavior at negative arguments.
The library syntax is
| |
bitxor | |
Bitwise (exclusive) See Section se:bitand for the behavior for negative arguments.
The library syntax is
| |
ceil | |
Ceiling of x. When x is in ℝ, the result is the
smallest integer greater than or equal to x. Applied to a rational
function,
The library syntax is
| |
centerlift | |
Same as
* for a
* a
For backward compatibility,
The library syntax is
| |
characteristic | |
Returns the characteristic of the base ring over which x is defined (as
defined by
? characteristic(Mod(1,24)*x + Mod(1,18)*y) %1 = 6
The library syntax is
| |
component | |
Extracts the n-th-component of x. This is to be understood as follows: every PARI type has one or two initial code words. The components are counted, starting at 1, after these code words. In particular if x is a vector, this is indeed the n-th-component of x, if x is a matrix, the n-th column, if x is a polynomial, the n-th coefficient (i.e. of degree n-1), and for power series, the n-th significant coefficient.
For polynomials and power series, one should rather use Using of this function requires detailed knowledge of the structure of the different PARI types, and thus it should almost never be used directly. Some useful exceptions:
? x = 3 + O(3^5); ? component(x, 2) %2 = 81 \\ p^(p-adic accuracy) ? component(x, 1) %3 = 3 \\ p ? q = Qfb(1,2,3); ? component(q, 1) %5 = 1
The library syntax is
| |
conj | |
Conjugate of x. The meaning of this
is clear, except that for real quadratic numbers, it means conjugation in the
real quadratic field. This function has no effect on integers, reals,
intmods, fractions or p-adics. The only forbidden type is polmod
(see
The library syntax is
| |
conjvec | |
Conjugate vector representation of z. If z is a
polmod, equal to
* the complex embeddings of z if T has rational coefficients,
i.e. the a(r[i]) where r = * the conjugates of z if T has some intmod coefficients; if z is a finite field element, the result is the vector of conjugates [z,z^p,z^{p^2},...,z^{p^{n-1}}] where n = degree(T). If z is an integer or a rational number, the result is z. If z is a (row or column) vector, the result is a matrix whose columns are the conjugate vectors of the individual elements of z.
The library syntax is
| |
denominator | |
Denominator of x. The meaning of this is clear when x is a rational number or function. If x is an integer or a polynomial, it is treated as a rational number or function, respectively, and the result is equal to 1. For polynomials, you probably want to use
denominator( content(x) )
instead. As for modular objects,
If x is a recursive structure, for instance a vector or matrix, the lcm
of the denominators of its components (a common denominator) is computed.
This also applies for Warning. Multivariate objects are created according to variable priorities, with possibly surprising side effects (x/y is a polynomial, but y/x is a rational function). See Section se:priority.
The library syntax is
| |
digits | |
Outputs the vector of the digits of |x| in base b, where x and b are
integers (b = 10 by default). See
? digits(123) %1 = [1, 2, 3, 0] ? digits(10, 2) \\ base 2 %2 = [1, 0, 1, 0] By convention, 0 has no digits:
? digits(0) %3 = []
The library syntax is
| |
floor | |
Floor of x. When x is in ℝ, the result is the
largest integer smaller than or equal to x. Applied to a rational function,
The library syntax is
| |
frac | |
Fractional part of x. Identical to x-floor(x). If x is real, the result is in [0,1[.
The library syntax is
| |
fromdigits | |
Gives the integer formed by the elements of x seen as the digits of a
number in base b (b = 10 by default). This is the reverse of
? digits(1234,5) %1 = [1,4,4,1,4] ? fromdigits([1,4,4,1,4],5) %2 = 1234 By convention, 0 has no digits:
? fromdigits([]) %3 = 0
The library syntax is
| |
hammingweight | |
If x is a
? hammingweight(15) %1 = 4 ? hammingweight(x^100 + 2*x + 1) %2 = 3 ? hammingweight([Mod(1,2), 2, Mod(0,3)]) %3 = 2 ? hammingweight(matid(100)) %4 = 100
The library syntax is
| |
imag | |
Imaginary part of x. When x is a quadratic number, this is the coefficient of ω in the "canonical" integral basis (1,ω).
The library syntax is
| |
length | |
Length of x; * vectors: dimension (0 for empty vectors), * lists: number of entries (0 for empty lists), * matrices: number of columns,
* character strings: number of actual characters (without
trailing
? #"a string" %1 = 8 ? #[3,2,1] %2 = 3 ? #[] %3 = 0 ? #matrix(2,5) %4 = 5 ? L = List([1,2,3,4]); #L %5 = 4
The routine is in fact defined for arbitrary GP types, but is awkward and
useless in other cases: it returns the number of non-code words in x, e.g.
the effective length minus 2 for integers since the
The library syntax is
| |
lift | |
If v is omitted, lifts intmods from ℤ/nℤ in ℤ,
p-adics from ℚ_p to ℚ (as
? lift(Mod(5,3)) %1 = 2 ? lift(3 + O(3^9)) %2 = 3 ? lift(Mod(x,x^2+1)) %3 = x ? lift(Mod(x,x^2+1)) %4 = x
Lifts are performed recursively on an object components, but only
by one level: once a
? lift(x * Mod(1,3) + Mod(2,3)) %4 = x + 2 ? lift(x * Mod(y,y^2+1) + Mod(2,3)) %5 = y*x + Mod(2, 3) \\ do you understand this one? ? lift(x * Mod(y,y^2+1) + Mod(2,3), 'x) %6 = Mod(y, y^2 + 1)*x + Mod(Mod(2, 3), y^2 + 1) ? lift(%, y) %7 = y*x + Mod(2, 3)
To recursively lift all components not only by one level,
but as long as possible, use
The library syntax is
| |
liftall | |
Recursively lift all components of x from ℤ/nℤ to ℤ,
from ℚ_p to ℚ (as
? liftall(x * (1 + O(3)) + Mod(2,3)) %1 = x + 2 ? liftall(x * Mod(y,y^2+1) + Mod(2,3)*Mod(z,z^2)) %2 = y*x + 2*z
The library syntax is
| |
liftint | |
Recursively lift all components of x from ℤ/nℤ to ℤ and
from ℚ_p to ℚ (as
? liftint(x * (1 + O(3)) + Mod(2,3)) %1 = x + 2 ? liftint(x * Mod(y,y^2+1) + Mod(2,3)*Mod(z,z^2)) %2 = Mod(y, y^2 + 1)*x + Mod(Mod(2*z, z^2), y^2 + 1)
The library syntax is
| |
liftpol | |
Recursively lift all components of x which are polmods to
polynomials.
? liftpol(x * (1 + O(3)) + Mod(2,3)) %1 = (1 + O(3))*x + Mod(2, 3) ? liftpol(x * Mod(y,y^2+1) + Mod(2,3)*Mod(z,z^2)) %2 = y*x + Mod(2, 3)*z
The library syntax is
| |
norm | |
Algebraic norm of x, i.e. the product of x with
its conjugate (no square roots are taken), or conjugates for polmods. For
vectors and matrices, the norm is taken componentwise and hence is not the
L^2-norm (see
The library syntax is
| |
numerator | |
Numerator of x. The meaning of this is clear when x is a rational number or function. If x is an integer or a polynomial, it is treated as a rational number or function, respectively, and the result is x itself. For polynomials, you probably want to use
numerator( content(x) ) instead.
In other cases, Warning. Multivariate objects are created according to variable priorities, with possibly surprising side effects (x/y is a polynomial, but y/x is a rational function). See Section se:priority.
The library syntax is
| |
numtoperm | |
Generates the k-th permutation (as a row vector of length n) of the
numbers 1 to n. The number k is taken modulo n!, i.e. inverse
function of
The library syntax is
| |
oo | |
Returns an object meaning + oo , for use in functions such as
The library syntax is
| |
padicprec | |
Returns the absolute p-adic precision of the object x; this is the
minimum precision of the components of x. The result is
? padicprec((1 + O(2^5)) * x + (2 + O(2^4)), 2) %1 = 4 ? padicprec(x + 2, 2) %2 = +oo ? padicprec(2 + x + O(x^2), 2) %3 = +oo The function raises an exception if it encounters an object incompatible with p-adic computations:
? padicprec(O(3), 2) *** at top-level: padicprec(O(3),2) *** ^----------------- *** padicprec: inconsistent moduli in padicprec: 3 != 2 ? padicprec(1.0, 2) *** at top-level: padicprec(1.0,2) *** ^---------------- *** padicprec: incorrect type in padicprec (t_REAL).
The library syntax is
| |
permtonum | |
Given a permutation x on n elements, gives the number k such that
x =
The library syntax is
| |
precision | |
The function behaves differently according to whether n is
present and positive or not. If n is missing, the function returns the
precision in decimal digits of the PARI object x. If x is an exact
object, the function returns
? precision(exp(1e-100)) %1 = 154 \\ 154 significant decimal digits ? precision(2 + x) %2 = +oo \\ exact object ? precision(0.5 + O(x)) %3 = 38 \\ floating point accuracy, NOT series precision ? precision( [ exp(1e-100), 0.5 ] ) %4 = 38 \\ minimal accuracy among components
If n is present, the function creates a new object equal to x with a new
floating point precision n: n is the number of desired significant
decimal digits. If n is smaller than the precision of a
The library syntax is
| |
random | |
Returns a random element in various natural sets depending on the argument N.
*
*
*
*
*
*
*
? random(10) %1 = 9 ? random(Mod(0,7)) %2 = Mod(1, 7) ? a = ffgen(ffinit(3,7), 'a); random(a) %3 = a^6 + 2*a^5 + a^4 + a^3 + a^2 + 2*a ? E = ellinit([3,7]*Mod(1,109)); random(E) %4 = [Mod(103, 109), Mod(10, 109)] ? E = ellinit([1,7]*a^0); random(E) %5 = [a^6 + a^5 + 2*a^4 + 2*a^2, 2*a^6 + 2*a^4 + 2*a^3 + a^2 + 2*a] ? random(Mod(1,7)*x^4) %6 = Mod(5, 7)*x^4 + Mod(6, 7)*x^3 + Mod(2, 7)*x^2 + Mod(2, 7)*x + Mod(5, 7)
These variants all depend on a single internal generator, and are
independent from your operating system's random number generators.
A random seed may be obtained via
Technical note.
Up to
version 2.4 included, the internal generator produced pseudo-random numbers
by means of linear congruences, which were not well distributed in arithmetic
progressions. We now
use Brent's XORGEN algorithm, based on Feedback Shift Registers, see
The library syntax is
Also available:
| |
real | |
Real part of x. In the case where x is a quadratic number, this is the coefficient of 1 in the "canonical" integral basis (1,ω).
The library syntax is
| |
round | |
If x is in ℝ, rounds x to the nearest integer (rounding to + oo in case of ties), then and sets e to the number of error bits, that is the binary exponent of the difference between the original and the rounded value (the "fractional part"). If the exponent of x is too large compared to its precision (i.e. e > 0), the result is undefined and an error occurs if e was not given.
Important remark. Contrary to the other truncation functions,
this function operates on every coefficient at every level of a PARI object.
For example
truncate((2.4*X^2-1.7)/(X)) = 2.4*X,
whereas
round((2.4*X^2-1.7)/(X)) = (2*X^2-2)/(X).
An important use of
The library syntax is
| |
serprec | |
Returns the absolute precision of x with respec to power series
in the variable v; this is the
minimum precision of the components of x. The result is
? serprec(x + O(y^2), y) %1 = 2 ? serprec(x + 2, x) %2 = +oo ? serprec(2 + x + O(x^2), y) %3 = +oo
The library syntax is
| |
simplify | |
This function simplifies x as much as it can. Specifically, a complex or
quadratic number whose imaginary part is the integer 0 (i.e. not This function is especially useful before using arithmetic functions, which expect integer arguments:
? x = 2 + y - y %1 = 2 ? isprime(x) *** at top-level: isprime(x) *** ^---------- *** isprime: not an integer argument in an arithmetic function ? type(x) %2 = "t_POL" ? type(simplify(x)) %3 = "t_INT"
Note that GP results are simplified as above before they are stored in the
history. (Unless you disable automatic simplification with
? type(%1) %4 = "t_INT"
The library syntax is
| |
sizebyte | |
Outputs the total number of bytes occupied by the tree representing the PARI object x.
The library syntax is
| |
sizedigit | |
This function is DEPRECATED, essentially meaningless, and provided for backwards compatibility only. Don't use it!
outputs a quick upper bound for the number of decimal digits of (the
components of) x, off by at most 1. More precisely, for a positive
integer x, it computes (approximately) the ceiling of
To count the number of decimal digits of a positive integer x, use
The library syntax is
| |
truncate | |
Truncates x and sets e to the number of error bits. When x is in ℝ, this means that the part after the decimal point is chopped away, e is the binary exponent of the difference between the original and the truncated value (the "fractional part"). If the exponent of x is too large compared to its precision (i.e. e > 0), the result is undefined and an error occurs if e was not given. The function applies componentwise on vector / matrices; e is then the maximal number of error bits. If x is a rational function, the result is the "integer part" (Euclidean quotient of numerator by denominator) and e is not set.
Note a very special use of
The library syntax is
| |
valuation | |
Computes the highest exponent of p dividing x. If p is of type integer, x must be an integer, an intmod whose modulus is divisible by p, a fraction, a q-adic number with q = p, or a polynomial or power series in which case the valuation is the minimum of the valuation of the coefficients. If p is of type polynomial, x must be of type polynomial or rational function, and also a power series if x is a monomial. Finally, the valuation of a vector, complex or quadratic number is the minimum of the component valuations.
If x = 0, the result is
The library syntax is
| |
varhigher | |
Return a variable name whose priority is higher
than the priority of v (of all existing variables if v is omitted).
This is a counterpart to
? Pol([x,x], t) *** at top-level: Pol([x,x],t) *** ^------------ *** Pol: incorrect priority in gtopoly: variable x <= t ? t = varhigher("t", x); ? Pol([x,x], t) %3 = x*t + x This routine is useful since new GP variables directly created by the interpreter always have lower priority than existing GP variables. When some basic objects already exist in a variable that is incompatible with some function requirement, you can now create a new variable with a suitable priority instead of changing variables in existing objects:
? K = nfinit(x^2+1); ? rnfequation(K,y^2-2) *** at top-level: rnfequation(K,y^2-2) *** ^-------------------- *** rnfequation: incorrect priority in rnfequation: variable y >= x ? y = varhigher("y", x); ? rnfequation(K, y^2-2) %3 = y^4 - 2*y^2 + 9 Caution 1. The name is an arbitrary character string, only used for display purposes and need not be related to the GP variable holding the result, nor to be a valid variable name. In particular the name can not be used to retrieve the variable, it is not even present in the parser's hash tables.
? x = varhigher("#"); ? x^2 %2 = #^2
Caution 2. There are a limited number of variables and if no
existing variable with the given display name has the requested
priority, the call to
\\ quickly use up all variables ? n = 0; while(1,varhigher("tmp"); n++) *** at top-level: n=0;while(1,varhigher("tmp");n++) *** ^------------------- *** varhigher: no more variables available. *** Break loop: type 'break' to go back to GP prompt break> n 65510 \\ infinite loop: here we reuse the same 'tmp' ? n = 0; while(1,varhigher("tmp", x); n++)
The library syntax is
| |
variable | |
Gives the main variable of the object x (the variable with the highest priority used in x), and p if x is a p-adic number. Return 0 if x has no variable attached to it.
? variable(x^2 + y) %1 = x ? variable(1 + O(5^2)) %2 = 5 ? variable([x,y,z,t]) %3 = x ? variable(1) %4 = 0 The construction
if (!variable(x),...) can be used to test whether a variable is attached to x.
If x is omitted, returns the list of user variables known to the
interpreter, by order of decreasing priority. (Highest priority is initially
x, which come first until
? varhigher("y"); ? varlower("y"); ? variable() %4 = [y, x, y]
Using
The library syntax is
| |
variables | |
Returns the list of all variables occuring in object x (all user variables known to the interpreter if x is omitted), sorted by decreasing priority.
? variables([x^2 + y*z + O(t), a+x]) %1 = [x, y, z, t, a] The construction
if (!variables(x),...) can be used to test whether a variable is attached to x.
If
? y1 = varhigher("y"); ? y2 = varlower("y"); ? variables(y*y1*y2) %4 = [y, y, y]
The library syntax is
Also available is
| |
varlower | |
Return a variable name whose priority is lower
than the priority of v (of all existing variables if v is omitted).
This is a counterpart to New GP variables directly created by the interpreter always have lower priority than existing GP variables, but it is not easy to check whether an identifier is currently unused, so that the corresponding variable has the expected priority when it's created! Thus, depending on the session history, the same command may fail or succeed:
? t; z; \\ now t > z ? rnfequation(t^2+1,z^2-t) *** at top-level: rnfequation(t^2+1,z^ *** ^-------------------- *** rnfequation: incorrect priority in rnfequation: variable t >= t Restart and retry:
? z; t; \\ now z > t ? rnfequation(t^2+1,z^2-t) %2 = z^4 + 1 It is quite annoying for package authors, when trying to define a base ring, to notice that the package may fail for some users depending on their session history. The safe way to do this is as follows:
? z; t; \\ In new session: now z > t ... ? t = varlower("t", 'z); ? rnfequation(t^2+1,z^2-2) %2 = z^4 - 2*z^2 + 9 ? variable() %3 = [x, y, z, t]
? t; z; \\ In new session: now t > z ... ? t = varlower("t", 'z); \\ create a new variable, still printed "t" ? rnfequation(t^2+1,z^2-2) %2 = z^4 - 2*z^2 + 9 ? variable() %3 = [x, y, t, z, t]
Now both constructions succeed. Note that in the
first case, Caution 1. The name is an arbitrary character string, only used for display purposes and need not be related to the GP variable holding the result, nor to be a valid variable name. In particular the name can not be used to retrieve the variable, it is not even present in the parser's hash tables.
? x = varlower("#"); ? x^2 %2 = #^2
Caution 2. There are a limited number of variables and if no
existing variable with the given display name has the requested
priority, the call to
\\ quickly use up all variables ? n = 0; while(1,varlower("x"); n++) *** at top-level: n=0;while(1,varlower("x");n++) *** ^------------------- *** varlower: no more variables available. *** Break loop: type 'break' to go back to GP prompt break> n 65510 \\ infinite loop: here we reuse the same 'tmp' ? n = 0; while(1,varlower("tmp", x); n++)
The library syntax is
| |