This file highlights some of the novelties in PARI/GP 2.19 compared to
latest stable branch 2.19.*. The detailed Changelog is in CHANGES.
Incompatible changes are described in COMPAT.

%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION 2.19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[GP language and calculator interface]
  - new bit functions for fast in-place operations on integers seen as bit
    vectors: bitclear, bitflip, bitset
  - new function fingerprint: architecture-independent hash function. Not
    suitable for cryptographic use but allowing quick sanity checks on huge
    known outputs.
  - new default doctest: when on, simplify copy-pasting examples from the
    documentation (ignore lines not starting with defaut prompt '? ', the
    strip prompt)
  - new meta commands for debugging: \qf (stop reading current GP file)
    and \z (enter doctesting mode)

[Elementary Algebra / Number Theory]
  - faster computation of order of elements in generic finite groups
    (improves ellorder fforder, znorder)
  - faster n-th root in finite fields
  - gp-2.17 introduced fast batch trial division and used it in most
    arithmetic functions requiring integer factorizations. It is now also
    used in the remaining functions, where full factorization may not be
    needed: core, ispowerful, moebius
  - nextprime(x, Mod(a, b)): smallest prime >= x in arithmetic
    progression a + k*b. Shorthand: nextprime(x, b) for primes = 1 (mod b).
  - allow t_PADICs in chinese()
  - faster (3M) multiplication for t_QUADs
  - implement contfrac for real binary quadratic forms and quadratic numbers
    (continued fraction for the largest root / real embedding)
  - subst: fast polynomial substitution P(x) -> P(a*x^d + b)

[Elliptic Curves]
  - new function ellheegnertwist: fast heuristic variant of ellheegner to
    compute a non-torsion rational point on rank 1 twists:
      ? E = ellinit("442e1");
      ? ellheegner(elltwist(E,101));
      time = 35,640 ms. \\ slowish
      ? ellheegnertwist(E, 101);
      time = 12,973ms. \\ faster
    Note that the point need not generate E(Q) modulo torsion: use
    ellsaturation to look for simpler generators.
  - new function ellcharpoly(E): characteristic polynomial of Frobenius
    acting on the curve if E is defined over a finite field. In other
    cases, ellcharpoly(E, p) considers Frobenius acting on the Picard group
    of the reduction of E at p.
  - new functions ellchangecompose, ellchangeinvert to compose and invert
    [u,r,s,t] tranformations
  - ellchangepoint / ellchangepointinv: although backward compatibility
    is maintained for now, both functions now expect the elliptic curve as
    first argument, which indicates the domain over which the transformation
    is performed. The old
      ellchangepoint(P, [u,r,s,t])
    still works where it used to (it never supported components u,r,s,t
    in a number field, given in terms of nf.zk). But the new preferred form
      ellchangepoint(E, P, [u,r,s,t])
    now works in all cases (because nf can be extracted from E).
  - ellfromeqn: new flag to return the map from a quartic or biquadratic
    model to the elliptic curve
  - polclass, polmodular: add support for Atkin modular invariants of
    (prime) level 3 to 31
  - ellmaninconstant: new flag for fast result if N <= 400,000, using
    Cremona's tables. Should also work up to N = 500,000 but the result is
    now conditional on Stevens's conjecture. More precisely, that Cremona's
    table correctly identifies the optimal curve in each isogeny class.

[Hyperelliptic Curves]
  - new function genus2charpoly: returns the caracteristic polynomial of
    Frobenius acting on the Picard group of a genus 2 curve at a prime p
  - new function hyperellperiods: period matrix for the integration
    pairing attached to a nonsingular complex hyperelliptic curve
  - new functions hyperellchangeinvert and hyperellchangecompose to handle
    change of coordinates on general Weierstrass equations (see
    hyperellchangecurve).
  - new function hyperellisisom to find the isomorphisms between two curves
    given by Weierstrass equations; hyperellauto(C) = hyperellisisom(C,C)
    finds all automorphisms of a curve.
  - new function hyperellextremalmodels(C, p) to compute a maximal chain
    of minimal Weierstrass models at the prime p.

[L-functions]
  - lfuncreate now allows non-integral conductors and weights

[Number Fields]
  - new function primeisregular: p does no divide h(Q(zeta_p)) ?
  - new function idealfromgens: returns the ideal generated by any number of
    elements of K (generalizes idealhnf)
  - galoisinit: support for non-WSS Galois groups
  - bnfinit: add optional parallel search for relation, give access to more
    technical parameters to tune the search for relations
  - quadclassunit now uses the MPQS engine for negative discriminants.

[Central Simple Algebras]
  - alginit: construction from Hasse invariants now allows a shortcut in the
    quaternion case, giving only the ramification set.
  - allow algpoleval(al, basis form, relative polynomial).
  - alginit(nf,[a,b]) now allows a to be a square in nf.
  - new functions
        algeltfromnf         alginvol         algmodprinit
        algquattobasis       algisisom        algmodprlift
        algbasistoquat       algisquatalg     algnewprec
        algeichlerbasis      algmodpr         algskolemnoether

[Transcendental functions]
  - new semantics for theta, now computes all four 1-variable theta
    functions simultaneously. New functions thetanull, elljacobi.
  - allow elleisnum(w, [k1, ..., kn])
  - zetahurwitz(t_PADIC,, d): use dth-power of the Teichmuller character

[Linear algebra]
  - new function parmatrix: matrix constructor, entries are computed in
    parallel
  - new function matmodhnf: reduce modulo an integer matrix in HNF (canonical
    forms for abelian groups Z^n / Im_Z M)

[Kernel]
  - add loongarch64 assembly kernel


COMPATIBILITY ISSUES BETWEEN 2.17.* and 2.19.*
==============================================

0) Obsoleted functions and interfaces:
  - [libpari] garbage collection: gerepile is now obsolete; all GC functions
    have been renamed or rewritten for ease of use and consistency:
      gerepileallsp -> gc_all_unsafe
      gerepilecoeffs -> gc_slice
      gerepilecoeffssp -> gc_slice_unsafe
      gerepilecopy -> gc_GEN
      gerepileupto -> gc_upto
      gerepileuptoint -> gc_INT
      gerepileuptoleaf -> gc_leaf

    This includes debugging functions:
      chk_gerepileupto -> chk_gc_upto
      dbg_gerepile -> dbg_stack,
      dbg_gerepileupto -> dbg_gc_upto

    Some functions have been obsoleted:
      gerepileall, gerepilemany: use gc_all
      gerepilemanysp : use gc_all_unsafe

  - [libpari]
    * generic gaffect and gaffsg are gone, as well as most "funz" functions
    assigning the value of a function to a pre-located argument, e.g,
    gabsz, gaddz, etc. There were not well documented, hard to use properly
    and not implemented consistently. Proper GC is a better alternative.

    * low level combinations of a type-specific function and assignement
    (such as addiiz, mpaddz, mpcosz, etc.) have been removed as well: use
    a standard function then proper GC or a low level assignment for the
    relevant types (such as affii, affrr, affir, etc.)

  - [libpari] removed obscure function cgetp: use mkpadic

  - idealhnf(nf, u): it is now deprecated to input u = a matrix whose columns
    generate the ideal; the only (trivial) such use is for an HNF matrix
    as output by all functions returning ideals in matrix forms, which allows
    to replace an ideal in any standard form by an HNF through
      A = idealhnf(nf,A).
    Use idealfromgens to convert a vector of elements to the ideal they
    generate.

  - the function trap() has been removed: use iferr instead.

  - the functions listcreate and listkill have been removed. Use L = List()
    instead.

1) Output changes:
  - default 'simplify' now defaults to 0. Object returned by evaluating
    a command from gp's prompt are no longer simplified before being saved
    in gp history. This is a big change, for the sake of consistency and
    predictability. Before :
      ? P = 'x + 2 - 'x
      %1 = 2
    would assign a constant polynomial to P but the integer 2 (= simplify(P))
    to %1. Now P and %1 are identical.

  - default 'new_galois_format' now defaults to 1. The polgalois functin

  - rnfconductor now returns a bnr without generators, which is the
    default for bnrinit; this saves time and no PARI function needs them

  - elleisnum(elliptic curve, k): return exact result in the coefficient
    field of the curve instead of a floating point approximation

2) Input changes:
  - ??? and gphelp -k now perfrm a case sensitive search if the keyword is
    all uppercase. For instance ??? LLL no longer outputs elllog and ellL1,
    whereas ??? lll still does.

  - removed elleisnum optional flag. If you really want elliptic
    invariants, use E4/12 and -E6/216.

  - polteichmuller(T,p,r) now requires T to be irreducible

  - polsturm: the undocumented form polsturm(pol, a, b) where a or b
    could be omitted is no longer accepted. Use polsturm(pol, [a,b]), where
    a = -oo and b = +oo can be used instead of an omitted argument.
