Karim Belabas on Wed, 02 Nov 2016 10:57:57 +0100

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

pari-2.9.0 (STABLE) released !

Dear PARI lovers,

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


This is a major STABLE release, ending a development cycle which started in
march 2014. For those still using pari-2.7.*, it is time to upgrade.

Binary distributions for Windows and Android are available at the same

Have fun !



A new set of reference cards was prepared for an overview of 2.9.* GP
functions, see doc/refcard*.dvi or http://pari.math.u-bordeaux.fr/doc#refcard

  - Mingw64 support (Windows 64 bit)

  - Unify 32/64 bit random generators. Probabilistic algorithms should now
    behave identically on all architecture, provided they do not involve
    the floating point kernel

[The GP language]
  - Support for variadic GP functions (having any number of arguments), e.g.
     ? f(v[..]) = sum(i = 1, #v, v[i])
     ? f(1, 2, 3, 4, 5)
     %2 = 15

  - New constant "oo" (for +/- infinity)

  - Simpler handling of polynomial variables: polynomial variables no longer
    spring into existence whenever a new identifier occurs in the parser,
    only if a polynomial is explicitly created; e.g. t = 0 no longer creates
    the "polynomial variable" t thereby messing up variable ordering.

    Functions varhigher() and varlower() allow to define
    variables of arbitrary priority independently of the session history;
    variables() returns the list of variables occuring in an object:
     ? variable(x + y*z / t)
     %1 = x
     ? variables(x + y*z / t)
     %2 = [x, y, z, t]

  - Hashtables/dictionaries in GP via functions Map, mapget, mapput,
    mapisdefined, mapdelete
     ? M = Map(); \\ empty dictionary
     ? mapput(M, "a", 23); \\ insert key/value: "a" maps to 23
     ? mapput(M, "b", 43); \\ "b" maps to 43
     ? mapget(M, "a")      \\ retrieve value attached to key "a"
     %3 = 23
     ? M = Map(["a", 23; "b", 43]); \\ fast initialization

  - New functions allow setting precision at the bit-level (instead of the
    word-level = 64 bits); new default 'realbitprecision' and \pb shortcut,
    and a function bitprecision()

  - Warn when coercing quotient rings when 'debug' is non-zero
      ? \g1
      ? Mod(1,2)+Mod(1,3)
        *** _+_: Warning: coercing quotient rings; moduli 2 and 3 -> 1.

  - More versatile closures: function self() for recursive anonymous
    functions, call() to apply a function of unspecified arity to arbitrary
    arguments), fold() such that fold(f,v) = f(...(f(v[1], v[2]), ...,) v[#v])

  - Miscellaneous new GP functions: serprec, powers, parforvec

[Multiprecision Kernel]
  - incgam, incgamc, eint1 more reliable

  - new functions sinc(x) = sin(x) / x and cotanh = 1 / tanh

  - improved p-adic log at high accuracy

  - improved gamma, lngamma and psi at power series arguments

[Numerical sumation and integration]
  - rewrote numerical integration routines, which can of course
    directly use the new oo symbol:
      ? intnum(t = -oo, oo, 1/(1+t^2)) - Pi
      %1 = 0.E-37
  - Gauss-Legendre quadrature: intnumgauss()

  - Rewrote numerical sumation (replace Abel-Plana by Euler-Mac Laurin).
    This changed the sumnum() interface !

  - Monien summation: sumnummonien()

  - Numerical extrapolation: limitnum(), asympnum()

     ? limitnum(n -> (1+1/n)^n) - exp(1)
     %1 = 0.E-37

     ? asympnum(n -> n! / (sqrt(2*Pi) * n^(n+1/2) * exp(-n)))
     %2 = [1, 1/12, 1/288, -139/51840, -571/2488320, 163879/209018880,
     5246819/75246796800, -534703531/902961561600]

  - Continued fractions for numerical approximation via Pade approximants:
    contfracinit() and contfraceval()

  - Inverse Mellin transforms of Gamma products: gammamellininv()

  - Multiple Zeta Values: zetamult()

      ? zetamult([2,1]) - zeta(3) \\ Euler's identity
      %1 = 0.E-38

  - zeta(odd integer): use Borwein's "sumalt" algorithm (10 times faster
    than previous at \p1000)

[Elementary Number Theory]
  - Bounded factorization factor(n,lim) now always respects the 'lim'
    argument (was ignored when n fit into a long integer)

  - sumdigits() now allows to specify the base; new function fromdigits()

  - Allow ffgen([p,f]) in addition to ffgen(p^f) and ffgen(T*Mod(1,p))

  - New functions for generic characters: charker, charorder, charconj,
    charmul, chardiv, chareval

  - New functions for Dirichlet characters: znconreychar, znconreyexp,
    znconreylog, znconreyconductor, zncharinduce, zncharisodd,
    znchartokronecker. See ??Dirichlet
    The functions idealstar / ideallog now allow omitting 'nf' argument for
    nf = Q allowing to handle efficiently Dirichlet characters as Hecke

  - Miscellaneous new functions: qfbredsl2(), ispseudoprimepower(),

  - Real root finder: new function polrootsreal(T, [a,b])

  - factorcantor now uses Shoup-Kaltofen algorithm (much faster)

  - padicfields(p, d) much faster for huge prime p

[Linear Algebra]
  - faster matrix multiplication over Z (Strassen) and finite fields (better
    handling of modular kernel)

  - matsolve(a,b) and a^(-1) could give wrong results [or SEGV] when t_MAT
    'a' was non-square

  - faster implementation of matfrobenius/minpoly

  - matkerint: replace underlying LLL algorithm by mathnf
    Simple bench: M=matrix(50,55,i,j,random(10^5)); \\ 200 times faster

[Elliptic curves]
  - Twists and Isogenies: elltwist, ellisogeny, ellisogenyapply, ellxn.

  - Modular polynomial attached to various class invariants: polmodular();
    attached class polynomials defining Hilbert class fields: polclass().

  - Formal groups: ellformalw, ellformalpoint, ellformaldifferential,
    ellformallog, ellformalexp

  - Elliptic curves over finite fields: ellissupersingular(), fast ellcard()
    over fields of small, medium or large characteristic (SEA, Kedlaya, Satoh),
    ellsea() for ellcard with early abort (almost prime cardinality);
    elltatepairing() now reliable for self-pairings

  - Elliptic curves over Q: ellrootno(e, 2 or 3) for non-minimal e is now
    properly supported; more robust and much faster ellL1() and
    ellanalyticrank() (the condition ord(L_E,s=1) <= r in ellL1(E,r) is no
    longer necessary; r is now optional, 0 by default); p-adic heights:
    ellpadics2, ellpadicheight, ellpadicheightmatrix; p-adic L function:
    ellpadicL (see also mspadicL);

    Q-isogenous curves and matrix of isogeny degrees: ellisomat; minimal
    quadratic twist: ellminimaltwist; smallest multiple having good reduction
    everywhere: ellnonsingularmultiple; new optional flag to forell to loop
    over isogeny classes.

  - Elliptic curves over number fields: ellinit([a1,...,a5], nf);
    support elltors, ellorder, elisdivisible, elllocalred, ellminimalmodel,
    ellan, ellap(E,P), ellcard(E,P) for P a maximal ideal

  - Elliptic curves over p-adic fields: Q_2 is now properly supported,
    ellpointtoz(E / Qp) has been fixed and the converse ellztopoint
    implemented, added Mazur-Tate-Teitelbaum's L invariant to E.tate;
    new function ellpadiclog.

[Other Curves of small genus]
  - Rational points on conics/Q : qfsolve, qfparam [ adapted from Denis Simon's
    qfsolve.gp ]

  - General cubic/binary quartic to Weierstrass model: ellfromeqn()

  - genus2red: allow rational non integral models + change input so that either
    genus2red(P) for y^2 = P and genus2red([P,Q]) for y^2 + x*Q = P are
    recognized; the output is now normalized + many bug fixes.

  - new functions ellpadicfrobenius, hyperellpadicfrobenius, hyperellcharpoly

[Modular symbols & p-adic L functions] New package; see ??8
  - Modular symbols for Gamma_0(N):
    msatkinlehner     msfromell        mshecke       mspathlog
    mscuspidal        msfromhecke      msinit        msqexpansion
    mseisenstein      msgetlevel       msissymbol    mssplit
    mseval            msgetsign        msnew         msstar
    msfromcusp        msgetweight      mspathgens

  - Attached overconvergent symbols, p-adic distributions and L-functions:
    mstooms, msomseval, mspadicL, mspadicinit, mspadicmoments, mspadicseries

[Complex L-functions] New package; see ??6 and ??Ldata
   lfun                lfundiv             lfunmfspec
   lfunabelianrelinit  lfunetaquo          lfunmul             lfuntheta
   lfunan              lfunhardy           lfunorderzero       lfunthetainit
   lfuncheckfeq        lfuninit            lfunqf              lfunzeros
   lfunconductor       lfunlambda          lfunrootres         lfunartin

[Associative and central simple algebras] New package, see the tutorial !
   algabsdim         algdisc           algisramified     algrandom
   algadd            algdivl           algissemisimple   algrelmultable
   algalgtobasis     algdivr           algissimple       algsimpledec
   algaut            alghasse          algissplit        algsplittingdata
   algb              alghassef         algleftmultable   algsplittingfield
   algbasis          alghassei         algmul            algsplittingmatrix
   algbasistoalg     algindex          algmultable       algsqr
   algcenter         alginit           algneg            algsub
   algcentralproj    alginv            algnorm           algsubalg
   algchar           alginvbasis       algpoleval        algtableinit
   algcharpoly       algisassociative  algpow            algtensor
   algdecomposition  algiscommutative  algprimesubalg    algtrace
   algdegree         algisdivision     algquotient       algtype
   algdim            algisdivl         algradical
                     algisinv          algramifiedplaces

[Number Fields]
  - New "compositum" functions. nfcompositum(): over number fields;
    new binary flag to polcompositum() to assume fields are linearly disjoint;
    nfsplitting: equation for splitting field / Q

  - Class groups and units: use GRH-guaranteed bounds in bnfinit for residue
    estimate; made qfbclassno more reliable: correct for |D| < 2.10^10 and no
    known counter example; of course you can double check with quadclassunit()
    (rigorous under GRH but much slower up to |D| ~ 10^18 or so).

  - Class field theory: bnrisgalois, bnrgaloismatrix, bnrgaloisapply;
    faster and more reliable rnfkummer;  bnrconductor(bnr, chi) as a shortcut
    for bnrconductor(bnr, Ker chi), same for bnrisconductor, bnrdisc and
    bnrclassno; bnrchar to define classes of Hecke characters, e.g. trivial on
    some congruence subgroup. Faster bnfcertify when the field has
    Q-automorphisms. New function nfislocalpower.

    Logarithmic class groups: new functions bnflog, bnflogdegree, bnflogef,

  - Relative number fields: rnf structures may now contain a full absolute nf
    struct, attached to rnf.polabs; nfinit(rnf) returns it. This allows rnf
    functions to return objects in standard notation (e.g. ideals in HNF
    instead of as a vector of t_POLMOD generators); add optional flag to
    that effect in rnfeltabstorel, rnfeltdown, rnfeltup, rnfidealreltoabs,
    rnfinit. New functions rnfidealprimedec, rnfidealfactor. Add optional
    flag to nfhnf and nfsnf to return transformation matrices.

  - Projection to / lift from residue field: nfmodpr, nfmodprlift. (Functions
    nfeltdivmodpr, nfeltmulmodpr, nfeltpowmodpr, nfeltreducemodpr, nfkermodpr,
    nfsolvemodpr are now obsolete: use nfmodpr, work in the finite field,
    then lift back using nfmodprlift.)
    Faster idealchinese and allow sign conditions at specified real places

  - idealprimedec now allows an optional 3rd argument, to limit f(P/p)

  - Improvements in thue(), whose solutions are now canonically ordered
    (lexsort); support (powers of) imaginary quadratic equations.


  - [libpari] function names obsoleted during the 2.3.* cycle
    (deprecated before 2007) have been commented out. See PARI_OLD_NAMES.

  - t_STR used to compare as larger than any real number via < or >
    operators. Such a comparison now raises an exception.

  - valuation(0,p), nfeltval(nf,0,pr), idealval(nf,0) precision(0),
    padicprec(0,p) now all return +oo
    infinite slopes of newtonpoly replaced by +oo (instead of 2^63-1)
    poldegree(0) now returns -oo

  - default 'compatible' and 'strictmatch' have been obsoleted. They are now

  - GP: polynomial variable 'y' is now always defined on startup,
    with priority lower than 'x'; variables of arbitrary priority can now be
    created: 'x' is no longer guaranteed to have maximal priority,
    nor MAXVARN to have minimal priority.

  - the meaning of precision(x, n) no longer depends on the type of x: it now
    always refers to floating point precision. Before the change:
    precision([O(2),O(3),O(x)], 10) -> [O(2^10),O(3^10),O(x^10)]

  - no longer print a 0 t_POLMOD as "0", e.g. output explicitly Mod(0,x)
    instead of '0'.

  - content([]) -> 0 [ was 1 ]

  - polsturm(T, a, b) is still supported but deprecated, use
    polsturm(T, [a,b])

  - nfdisc() and nfbasis() no longer support the old (T,flag,factorization)
    arguments. Use the generic [T,listP] syntax

  - ellbil(E,P,Q) is now deprecated, use ellheight(E,P,Q)

  - rnfconductor now returns [cond, bnr, H] instead of [cond, bnr.clgp, H]

  - The sumnum interface has changed, see ??sumnum

  - The broken implementation of Dedekind zeta function zetakinit / zetak 
    has been removed, use the new Lfun package ! E.g.
      \\ ~ zetakinit(x^3-2) on the critical line up to height 100
      ? L = lfuninit(x^3 - 2, [100]);
      \\ ~ zetak
      ? lfun(L, 1/2 + 10*I) \\ value at this point

  - polredabs(T) now internally uses the polredabs([T,listP]) strategy,
    making it much faster in favourable cases, while still always returning
    a canonical defining polynomial; polredabs([T,listP]) no longer returns 0
    if the attached order cannot be proven to be maximal: it computes the
    expected canonical polynomial in all cases, which can be slow. Always use
    polredbest() if you do not require a canonical output.
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite de Bordeaux         Fax: (+33) (0)5 40 00 21 23
351, cours de la Liberation    http://www.math.u-bordeaux.fr/~kbelabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux.fr/  [PARI/GP]