Karim Belabas on Mon, 24 Mar 2014 12:11:46 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

pari-2.7.0 (STABLE) released !


Dear PARI lovers,

I am pleasted to announce the release of pari-2.7.0 (STABLE) ! 
The sources can be obtained through the address

  http://pari.math.u-bordeaux.fr/download.html

This is a major STABLE release, ending the 2.6.* development cycle, which
started 2 years and a half ago. For those still using pari-2.5.*, it is time
to upgrade.

Binary distributions for Windows and Android are available at the same address.

Have fun !

    K.B.

HIGHLIGHTS:
===========

[Configure]

  - Configure --mt=pthread or --mt=mpi: GP now supports POSIX threads and MPI.
    See doc/parallel.dvi for an introduction, and have a look at the new
    parxxx GP functions.

  - Configure -gcov: support for gcov/lcov. As a result, the regression suite
    (make test-all) has been much expanded and lots of obscure bugs fixed. See
        http://pari.math.u-bordeaux1.fr/lcov-report/
    for current coverage test reports.

  - Configure now generates a file 'config.log' to help diagnose problems
    (contains all messages from compilers)

[The GP language]

  - Ranges and slices: [a..b], x[a..b], x[^a]
    ? v = [2..8]
    %1 = [2, 3, 4, 5, 6, 7, 8]
    ? v[2..4]
    %2 = [3, 4, 5]
    ? v[^2]     \\ remove 2nd element
    %3 = [2, 4, 5, 6, 7, 8]
    ? M = matid(3); M[1..2, ^2]  \\ first two rows, remove 2nd col
    %4 =
    [1 0]

    [0 0]

  - Set notations:
    ? [ p | p <- primes(10), isprime(p+2) ]
    %1 = [3, 5, 11, 17, 29]

  - Multiple assignments: [a,b,c] = V, for a = V[1], b = V[2], c = V[3]
    ? [D,U,V] = matsnf(A, 1)    \\ returns SNF and transformation matrices

  - Error trapping: iferr() + a new data type 't_ERROR' to represent error
    contexts. See ??iferr

     \\ Compute [B]P on a "curve over Z/NZ". If an exception occurs,
     \\ we found a zero divisor in Z/NZ, thereby factoring N.
     ECM(N, B = 1000!, nb = 100)=
     {
       for(a = 1, nb,
         iferr(ellmul(ellinit([a,1], N), [0,1], B),
           E, return(gcd(lift(component(E,2)),N)),
           errname(E) == "e_INV"));
     }
     ? ECM(2^101-1)
     %1 = 7432339208719

  - Timeouts: alarm(delay, expr) spends 'delay' seconds trying to evaluate
    'expr', then aborts returning a t_ERROR object.

  - Multi-if: to simplify successive 'else' clauses
      ? if (a == 1,     print("1"),          \
            a < 0,      print("negative"),   \
            isprime(a), print("prime"),      \
            print("generic"))

  - new function cmp() to "compare" arbitrary objects (transitive order
    relation, returns 0 iff x === y). Useful for sets.

  - new function getenv()

[The GP calculator]

  - parallel GP support: parapply, pareval, parfor, parforprime, parselect,
    parsum, parvector. E.g.
      ? parapply(factor, [2^256 + 1, 2^193 - 1])
    will factor these two integers in parallel.

  - forprime(p = a, b, ...) now iterates over arbitrary ranges of primes,
    independently of 'primelimit'. Parameter 'b' can be omitted (no upper
    limit). More generally, primelimit is now deprecated: libpari functions
    can quickly produce their own primes without relying on (enough)
    precomputed primes.

  - new iterators:  forcomposite(), forpart() forqfvec(), to loop
    over composite integers, (possibly restricted) partitions and integer
    points in ellipsoids.

  - GP debugger, new functions expanding the 'break loop' mechanism: dbg_up(),
    dbg_down(), dbg_x(), breakpoint()

  - liftall(), liftint(), liftpol() give more flexibility than lift() in
    complicated situations

  - characteristic(x) returns the "characteristic" of the base ring over which
    x is defined.

  - ffgen(p^f), as an alias for ffgen(ffinit(p,f))

  - vecsum(v), as an alias for sum(i=1,#v,v[i])

  - variable() no longer raise exceptions, but returns 0 if the object
    has no main variable.

  - getabstime() returns the CPU time elapsed since gp startup, providing a
    reentrant version of gettime()

  - %#n returns the time it took to compute history result %n

  - new default 'linewrap'

  - arbitrary GP 'defaults' can now be set via the command-line:
      gp -D default=value
    gp --primelimit lim (gp -p lim) and gp --stacksize=lim are deprecated.
    Use the generic form  (-D parisize=lim or -D primelimit=lim)

[Multiprecision Kernel & Transcendental functions]

  - binary splitting: Catalan's constant, Pi, log(2) (to be expanded)

  - logint(x,b) for floor(log(x) / log(b)), avoiding rounding problems

  - sqrtnint(x,b) for floor(x^(1/b))

  - expm1(x) for exp(x) - 1, but also accurate for x ~ 0

[Polynomial Arithmetic & Power series]

  - Mulders/Hanrot-Zimmerman short products for power series

  - Allow t_SER arguments for gamma, lngamma, and psi around arbitrary
    complex numbers (was either forbidden or limited to z = 0 or 1)

  - seralgdep: to find linear relations with polynomial coefficients
    ? s = 1+1/2*y+3/8*y^2-3/16*y^3+3/128*y^4+15/256*y^5-57/1024*y^6 + O(y^7);
    ? seralgdep(s,2,2) \\ relation of degree <= 2, degree(coeffs) <= 2
    %2 = -x^2 + (y^2 + y + 1)

  - polgraeffe(f): returns g such that g(x^2) = f(x)f(-x)

  - poliscyclo(), poliscycloprod(), polcyclofactors(): cyclotomic factors
    of rational polynomials

[Linear Algebra]
  - port of the program ISOM by Bernd Souvignier for computation of
    automorphisms and isomorphisms of lattices.
    New GP functions: qfauto, qfisom, qfisominit, qfautoexport

  - linear algebra routines now try to convert generic GP constructions
    involving t_INTMODs or t_FFELTs to appropriate (faster, more memory
    efficient) representations, then call routines in the libpari modular
    kernel (FpM, Flm, F2m, FqM, FlxqM, F2xqM).

  - add optional flag to mateigen to also return the eigenvalues

  - charpoly() now selects an appropriate algorithm by itself, depending
    on the input. Using a flag should no longer be necessary and is
    deprecated.

  - mathnf for matrices over K[X]

  - mathnfmodid(x,D), where D = [d1,...,dn] compute the HNF of
    concat(x,matdiagonal(D)); in a more efficient way

  - matqr() to compute the QR-decomposition of a real square matrix;
    mathouseholder() to apply a sequence of Householder transforms

  - internal support for sparse matrices and Wiedemann algorithm; currently
    only used by the discrete log algorithms.

  - matinverseimage(A, t_MAT B) would treat individual columns B[,i]
    independently and successively. Now use a single Gauss reduction.

  - normlp(): true L^p norm [ N.B. the old norml2() is still available,
    and returns the *square* of the L^2 norm ].

  - clean generalizations of current norml2: qfnorm(), qfbil()

[Elementary Number Theory]

  - arithmetic functions now accept factorization matrices as input, you can
    use any of f(N), f(factor(N)) or f([N, factor(N)]).

  - arithmetic functions no longer apply componentwise to vector / matrix
    arguments [ to allow passing factorization matrices ]: use apply()

  - new convenience functions: hamming(), ispowerful(), digits() /
    sumdigits(), ispolygonal(), istotient(), isprimepower()

  - randomprime(), random([a,b])

  - Bernoulli polynomials: bernpol() and sumformal()
    ? sumformal(n^2)     \\ F such that F(b) = \sum_{n <= b} n^2
    %1 = 1/3*n^3 + 1/2*n^2 + 1/6*n

  - sumdivmult: to sum multiplicative expressions

  - sieve algorithms for znlog() and fflog(), computing discrete logs in F_q^*

[Elliptic curves & Arithmetic geometry]

  - new dynamic implementation of the 'ell' data structure: ellinit is now
    used to record the coefficients of the curve and the domain over which it
    is defined. Further data is added to the structure on demand, if and when
    it is needed, e.g. cardinality and group structure. See ??ellinit.

  - elliptic curves functions no longer assume that a curve over Q is given by
    a minimal model. A non-miminal model used to silently produce wrong
    answers; no longer!

  - allow ellinit(E / Qp) for arbitrary p (also p = 2) and reduction type
    (no longer restricted to Tate curves)

  - allow ellinit(E / Fq) for non-prime finite fields, incl. point counting
    (SEA, Harley)

  - allow ellinit(E / C)

  - new function ellheegner() to find a non-torsion rational point on
    E / Q of rank 1.

  - new implementation of ellweilpairing / elltatepairing

  - ellsearch now accepts both syntaxes allowed by ellconvertname(),
    e.g. "11a3" / "11a" and [11,0,3] / [11,0]

  - extend ellinit inputs: ellinit([a4, a6]). On singular curve, return []
    instead of raising an error. New function ellfromj().

  - genus2red: an implementation of Liu's algorithm to determine the
     reduction of a genus 2 curve (at p > 2). Based on genus2reduction-0.3,
       http://www.math.u-bordeaux1.fr/~liu/G2R/ (Cohen & Liu, 1994)
    mostly rewritten from scratch, and fixing known problems in the original
    implementation (so-called bug27, bug28). The regression bench contains a
    check of at least one instance of each of Namikawa-Ueno's types + all
    cases on which the original genus2reduction was known to fail.
    CAVEAT: the interface will probably change & reduction at p = 2 not handled

[Number Fields]

  - maximal orders (when the discriminant is hard to factor): allow to specify
    a list of primes at which the order nf.zk must be maximal. This [T, listP]
    format supersedes the old addprimes() hack as well as rigid optional
    flags for nfbasis, nfdisc, polredabs. (And no longer depends on the
    global 'primelimit'...) See ??nfinit
    ? T = polcompositum(x^5 - 101, polcyclo(7))[1];
    ? nf = nfinit( [T, 10^3] );
    ? nfcertify(nf)
    %3 = []
    A priori, nf.zk defines an order which is known to be maximal at all
    p <= 10^3. The final certification step proves it is in fact
    globally maximal.

  - polredbest / rnfpolredbest: "best-effort" variants of polredabs /
    rnfpolredabs. Not canonical but often smaller, and run in poly-time !

  - idealprincipalunits: structure of the multiplicative group
    (1 + pr) / (1 + pr^k), for a prime ideal pr
    [ special case of idealstar, faster ]

[COMPATIBILITY WARNING]

  - lift(x,'v) / centerlift(x,'v) now only lift t_POLMODs in variable v,
    no longer (most) t_INTMOD / t_PADICs met along the way

  - rnf.pol (absolute defining polynomial / Q) has been renamed rnf.polabs.
    rnf.pol is now the relative polynomial, defining the relative extension
    over the base.

  - as a side effect of the new %#n construction, all GP results are now stored
    as history entries,  including the "void" object returned by functions
    such as print() or for().

  - renamed bezout() -> gcdext()

  - renamed ellpow() -> ellmul()

--
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1          Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation    http://www.math.u-bordeaux1.fr/~kbelabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux1.fr/  [PARI/GP]
`