This file lists the incompatible changes between Version 2.x and older versions
%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION 2.8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  - removed useless function sumnumalt: use sumalt
  - replace algorithm behind sumnum / sumnuminit : replace Abel-Plana
    (slow, imprecise, forced to assume holomorphy and evaluate at complex
    values, yielding determination problems) by Euler MacLaurin (none of
    these disadvantages). The interface had to change : the (mandatory)
    abcissa of integration becomes meaningless, and the initialization
    possibilities are different. Please read the documentation ??sumnum
    and ??sumnuminit
  - 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) now all return +oo
    under GP [ used to return LONG_MAX ]
  - precision(0), bitprecision(0), padicprec(0,p) now all return +oo
    under GP [ used to return LONG_MAX ]
  - infinite slopes of newtonpoly replaced by +oo (instead of LONG_MAX)
  - poldegree(0) now returns -oo [ used to return -LONG_MAX ]
  - polsturm interface change
     * polsturm(T, a, b) is still supported but deprecated, use
       polsturm(T, [a,b])
     * polsturm(T, a, b) used to return the number of roots in ]a,b],
       we now use the closed interval [a,b]: more intuitive given the new
       syntax, and compatible with polrootsreal()
  - nfdisc, nfbasis: no longer support the old (T,flag,fa) arguments.
    Use the generic [T,listP] syntax (see 2.6.0-C105)
  - factorpadic: no longer support the deprecated (no-op) 'flag' argument
  - optional flag to ellheight is gone (useless)
  - ellbil(E,P,Q) is now deprecated, use ellheight(E,P,Q)
  - default 'strictmatch' has been obsoleted. It is now a no-op.
  - default 'compatible' has been obsoleted. It is now a no-op.
  - GP and libpari polynomial variables of arbitrary priority can now be
    created: 'x' is no longer guaranteed to have maximal priority,
    nor MAXVARN to have minimal priority.
  - GP: polynomial variables no longer spring into existence unless a true
    t_POL/t_SER in the variable is needed. E.g. y = 0 does not create the
    "variable" y, thereby messing up variable ordering.
  - genus2red: change syntax. Allow either genus2red(P) or genus2red([P,Q])
    instead of mandatory Q (was: genus2red(Q,P) with Q almost always 0).
    Allow uniformization with hyperellcharpoly
  - remove useless function intnuminitgen (not very useful and impossible to
    use reliably together with intnum with boundary conditions)
  - remove useless function intnumstep: instead of intnum(a,b, intnumstep()+m),
    use intnum(a,b,m)
  - remove partially implemented functions intfouriercos / intfouriersin /
    intfourierexp / intlaplaceinv / intmellininv / intmellinvshort: use
    intnum (possibly intfuncinit). Make sure to indicate oscillating behaviour
    when function decrease slowly at oo
  - remove optional flag to intfuncinit: misleading and only affords
    a 2 x speedup in an 'init' function (maybe reimplement later in a
    more general form...)
  - remove badly implemented functions zetakinit / zetak: the interface did not
    make sense (it is impossible to initialize for Dedekind zeta without
    specifying a domain where the function is to be evaluated). Closest
    equivalent to zetakinit:
        L = lfuninit(x^2+1, [c, w, h]);
    to compute zeta_Q(i)(s) for |Re(s - c)| < w, |Im(s)| < h. Then
        lfun(L, s)
    as an analog to zetak(). Or directly lfun(x^2+1, s) if a single value
    is needed. [closes #368, #1647]
  - rnfconductor now returns [cond, bnr, H] instead of [cond, bnr.clgp, H]
  - 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 very slow. Always use polredbest() if you
     don't require a canonical output.
  - 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)].
    Now in order to truncate a p-adic or series, you have to multiply by
    1 + O(t^n); in order to extend it, use truncate.
  - remove useless flag in idealappr: directly allow factorization
  - replace qfbil(x,y,{q}) by qfeval({q},x,y) and qfnorm(x,{q}) by
    qfeval({q},x): it makes more sense to have q first, and a single
    function for qf+polar form (as in all other qf-like routines:
    ellheight, etc.)
  - functions nfeltdivmodpr, nfeltmulmodpr, nfeltpowmodpr, nfeltreducemodpr,
    nfkermodpr, nfsolvemodpr are obsolete. Use nfmodpr, work in the finite
    field, then lift back using nfmodprlift.
  - changed bnf format (allow dynamically adding units): old bnfs will be
    detected as invalid. Dirty trick to force conversion: bnf[10]=vector(3);
  - changed idealstar format, to access data more conveniently (and avoid
    recomputations): old bid and bnr structures from versions up to 2.8.0
    are now invalid
  - gcd(t_VEC/t_COL/t_MAT, ...) is now forbidden, same for lcm

* Specific to the PARI library:
===============================
  - renamed RgX_mullow -> RgXn_mul, RgX_sqrlow -> RgXn_sqr,
    RgX_modXn_eval -> RgXn_eval, RgX_modXn_shallow -> RgXn_shallow
  - top and bot are replaced by pari_mainstack->top and pari_mainstack->bot.
  - allocatemem() is replaced by paristack_resize.
  - rootpadicfast was renamed to ZpX_roots
  - mkintn() now handles arguments as 32bit unsigned int on both 64/32 bits.
  - sturmpart(x, a, b) is deprecated, use RgX_sturmpart(x, ab) or (better)
    ZX_sturmpart(x, ab)
  - removed deprecated functions nfbasis0, nfdisc0, factorpadic0
  - Flx_pow renamed to Flx_powu
  - [libpari] rename ghell->ellheight, mathell->ellheightmatrix
  - Rg_to_RgV renamed to Rg_to_RgC, RgX_to_RgV renamed to RgX_to_RgC
  - powruvec was replaced by powersr
  - renamed ZV_gcdext -> ZV_extgcd for consistency with other 'gcdext' methods
  - comment out libpari function names obsoleted during the 2.3.* cycle
    See PARI_OLD_NAMES.
  - ellsea is replaced by Fp_ellcard_SEA
  - rename PI -> M_PI
  - renamed row_zm -> zm_row, row_Flm -> Flm_row
  - nucomp now takes L = floor(|D|^(1/4)) as a 3rd argument. Former
    nucomp(x,n) is nucomp(x,n,NULL).
  - divide_conquer_assoc renamed to gen_product, divide_conquer_prod removed
  - rename concat to gconcat, concat1 to gconcat1
  - rename Flc_Fl_mul -> Flv_Fl_mul, Flc_Fl_div -> Flv_Fl_div,
       RgC_to_Flc to RgV_to_Flv, F2c_to_Flc to F2v_to_Flv
  - rename leading_term -> leading_coeff, constant_term -> constant_coeff
  - Z_to_Flx now takes a shifted variable number, as Fl_to_Flx.
  - rename FlxqX_pow to FlxqX_powu
  - rename anell -> ellan, anellsmall -> ellanQ_zv
  - ellsea: the argument p was removed and the interface modified
  - renamed absi_cmp -> abscmpii, absr_cmp -> abscmprr, absi_equal
    -> absequalii, absi_factor -> absZ_factor, absi_factor_limit
    -> absZ_factor_limit, equaliu -> absequaliu, equalui -> absequalui,
    cmpiu -> abscmpiu, cmpui -> abscmpui
  - idealappr0 is obsolete: use idealappr
  - qfbil, qfnorm are obsolete: use qfeval0, qfeval or qfevalb
  - changed set_sign_mod_divisor prototype: module is now useless (implicitly
    contained in sarch argument), hence removed.
  - removed discrayabs, discrayabscond, discrayrel, discrayrelcond,
    discrayabslistlong: obsoleted since 2.0
  - ZpX_liftfact no more handles extensions of Qp, use ZqX_liftfact for that
  - rename listcreate to mklist

%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION 2.6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  - eval() no longer evaluates its arguments in "permissive" mode: eval("1a")
    now produces a syntax error.
  - '|' is no longer a synonym for '||' (boolean 'or'); '&' for '&&' is still
    supported but deprecated.
  - GP set elements are no longer converted to t_STR (requiring "eval" to
    recover the underlying object). Arbitrary GENs can be stored in a set.
  - no longer allow 3 arguments in bestappr() [useless], no longer
    mix Pade approximants and continued fractions [too confusing: must a
    t_SER be converted to a t_RFRAC or be treated coefficientwise?]. Use
    bestapprPade() to obtain rational functions, and bestappr() to obtain
    rational numbers.
  - [non-Unix systems] the name of the preferences file is now "gprc.txt"
    (it remains ".gprc" on Unix systems)
  - removed rootsold() code : polroots(x, 1) is no longer accepted.
  - format of cached Bernoulli table: now a t_VEC of t_FRAC / t_REALs.
    Removed bern() macro. The new data must be accessed using bernfrac /
    bernreal.
  - forprime loop: no longer allow to modify the loop index
    ? forprime(p = 2, 10, p = [])
     ***   at top-level: forprime(p=2,10,p=[])
     ***                                   ^---
     ***   prime index read-only: was changed to [].
  - rename ellpow -> ellmul
  - polrootsmod(, 4) is no longer accepted. The second argument must be prime.
  - binary(0) now return []
  - arithmetic functions no longer accept vector / matrix arguments [ to
    later allow passing factorization matrices ]: use apply()
  - permtonum/numtoperm now use the standadr lexicographic numbering.
  - ellsigma: removed flags 3 and 4 [ inefficient algorithm using the product
    formula ]
  - removed member function 'w' (this is technical, and no longer needed:-)
  - ellpointtoz(E / Qp, ...), now return phi(P) [ used to return the same
    result for phi(P) and phi(-P) [ split multiplicative reduction ],
    resp. phi(P) + 1/phi(P) [ non-split reduction ]
  - ellinit(E / Qp).tate : the u component is now always a square root
    of u2, also in the non-split case (in which case it lives in a
    quadratic extension of Qp)
  - when timer = 1, no longer print timing if the time is negligible;
    in particular, no timing should be printed when defining a user function
    or and alias.
  - change nfbasis(T, flag, fa) to nfbasis(T, listP). flag was used to invoke
    round2 instead of round4 (inefficient=> useless) OR to only
    partially factor poldisc(T), up to primelimit (very dangerous since
    primelimit is a global variable). Now listP describes a list of primes,
    and we return a basis of an order which is p-maximal at all those primes:
    either a vector of primes, a factorisation (as fa before) or an integer
    B to indicated {p <= B} (a safe and flexible version of nfbasis(T, 1)).
    nfdisc() was changed similarly.
  - The proper way to initialize an nf structure when the polynomial
    discriminant is hard to factor is nfinit([T, listP]), where listP
    specifies a list of primes (see ??nfinit). nfdisc, nfbasis, all the
    polred functions allow analogous arguments. This is cleaner and more
    flexible than optionnal flags relying on the value primelimit
    (e.g. nfinit([T, nfbasis(T, 1)]), now deprecated). Also, the nfinit
    function now sees the local specifications directly and can take steps
    to fix problems. The result can also be certified (nfcertify)
  - renamed bezout() -> gcdext(), polresultant() -> polresultantext()
  - the prime table is now computed once and for all on startup and can
    no longer be increased by modifying primelimit: the dynamic forprime
    machinery allows fast primes up to primelimit^2 which is more than
    enough even with a small table. The default value of 500.000 is already
    larger than necessary
  - removed optional flag to factorpadic() / factorpadic0() [ enabling
    Buchman-Lenstra + round2 ] Use the default factorpadic(T, p, r), both
    under GP and in library mode.
  - default help text for a user function is now as in \u: ?fun produces
      fun =
        (args)->body
  - after addhelp(f,...), ?f no longer include default help text for a
    user function (function code). Type 'f' to see the function code.
  - rnf structure: added new components
  - 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) is now called rnf.polabs,
    rnf.pol is now the relative polynomial, defining the relative extension
    over the base.
  - the prid structure returned by idealprimedec: the anti-uniformizer
    tau (pr_get_tau / pr[5]) is now stored via its multiplication table

* Specific to the PARI library:
===============================
  - renamed all libpari error codes [ pari_err() arguments ]
  - ellwp0(): remove precdl argument
  - rename stackmalloc -> stack_malloc
  - rename ggval -> gvaluation
  - simplify init_primepointer(n, p, &pd) interface
    => init_primepointer(n, &pd). Remove argument 'p', ignore the previous
    value of pd [ remove assumption that it pointed into a prime table ]
    and always set pd to a pointer into the private prime table.
  - powell, addell, subell renamed to ellpow, elladd, ellsub.
  - last tow arguments of FpX_factorff and FpX_rootsff have been swapped.
  - rnf_fix_pol() takes an extra argument, the calling function's name
  - rename leftright_pow_fold -> gen_pow_fold, leftright_pow_fold_i
       -> gen_pow_fold_i
  - upowuu(x,n) now returns 0 on overflow. Used to return x^n mod 2^BITS_IN_LONG
  - rename RgX_check_ZXY -> RgX_check_ZXX, ZXY_max_lg -> to ZXX_max_lg
  - removed gisfundamental, gkronecker, gbigomega, geulerphi, gissquarefree,
    gmoebius, gnextprime, gnumbdiv, gomega, gprecprime, gsumdiv, gdumdivk,
    znprimroot0
  - rename zv_cmp0 -> to zv_equal0
  - removed obsolete function weipell(). Use ellwpseries()
  - the prototype of nfbasis() changed [ remove 'flag'; if you needed it, use
    nfmaxord() ]. The old nfbasis0 / nfdisc0 are deprecated: don't use them.
  - removed obsolete Polred(): use polred() or polredbest()
  - rename exp_Ir -> expIr
  - the *_invimage function no longer accept a t_COL second argument. Use the
    RgM_RgC_invimage variant. They now return NULL when no solution exist
    (used to return a t_COL / t_MAT of length 1)
  - the forvec_start() function has been replaced by a standard
    iterator: forvec_init() / forvec_next()
  - renamed rnfelementxxx -> rnfeltxxx, rnfidealhermite -> rnfidealhnf
  - removed useless wrappers map_proto_GG, map_proto_GL, map_proto_lGG
  - renamed ZM_hnfremdiv -> ZM_hnfdivrem
  - removed useless functions gand, gor
  - removed useless function ratlift [ use Fp_ratlift ]
  - renamed gcmpX -> gequalX
  - renamed ordred -> polredord: useless function, use polredbest!
  - renamed recip -> serreverse
  - renamed FlxYqQ_pow -> FlxYqq_pow
  - FpXYQQ_pow/FlxYqq_pow: the order of the moduli S,T have been swapped to
    match FpXQXQ_pow
  - renamed gsh -> gsinh, gch -> gcosh, gth -> gtanh,
    gash -> gasinh, gach -> gacosh, gath -> gatanh, ggamd -> ggammah
    (follow GP names)

%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION 2.4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  - The "break loop" is now *on* by default, and no longer controlled by
    trap(), but by the default 'breakloop'. To get out of a break loop, hit
    <C-D> or type 'next', 'return', or 'break'
  - trap() no longer allows installing default error handlers.
  - GP's break loop is now *enabled* by default [ set breakloop = 0 in your
    gprc to disable it ]
  - random() now uses Brent's XORGEN (replaces congruential linear generator)
    As a consequence, getrand() returns the FSR internal state array,
    used by setrand() and the prototypes of both functions changed.
    To adapt simple library code, replace
      long seed = getrand(); ...; (void)setrand(seed);
    by
      GEN seed = getrand(); ...; setrand(seed);
    The sequence of generated pseudo-random numbers are completely different.
  - install(): parser code 'E' and 'I' now refer to closure, not strings:
    'I': closure whose value is ignored, like in for() loop
    'E': closure whose value is used, like in sum() loop
  - changevar()  [ use substvec ] and reorder() [ use variable() for the list
    of user variables ] have been removed
  - The quasi-periods e.eta (and elleta(e)) are now twice the old value,
    so that e.eta = 2 ellzeta(e,e.omega/2)
  - Change e.omega so that e.omega[1] / e.omega[2] belongs to the Poincare
    half plane [ used to be the inverse ].
  - indexrank, indexsort and indexlexsort now return t_VECSMALLs
  - besselk no longer admits a flag, the default implementation caters for
    all cases
  - removed (obsolete) optional flag in ellap(), Mod() and gcd()
  - the weird extra argument to listcreate() [ maximal length ] has
    disappeared. In fact, listcreate() is now obsolete: juste use List() to
    create an empty list. It will grow as needed.
  - listkill() is also obsolete: no need for a specific function
    to kill old lists floating around. L = List() reclaims memory just as
    efficiently as listkill(L) would. In most cases, you won't even need
    that, e.g. local variables are automatically cleared when a user function
    returns; no need to kill the ones which are lists specifically.
  - local variables declared implicitly (user function parameters, loop
    indices) are now lexically-scoped. The keyword 'my' allows to declare
    lexically-scoped variables explicitly.
  - global(), being awkward to implement in the new parser model and
    essentially useless is now a no-op, scheduled for removal.
  - PariEmacs is now distributed as a separate package, and is no longer
    included in the PARI distribution
  - distinction between user functions and user variables has been removed.
    As a consequence, calling a user function without parentheses no more
    evaluate it.
  - syntax errors are no longer trap-ped, only runtime errors are. First,
    error trapping and compile-time errors are best left unrelated. Second,
    since the code is first byte-compiled, then evaluated, it made no sense
    trapping a syntax error that would necessarily occur in the first
    milliseconds after inputing the command to the interpreter. (Not so
    in the old evaluator which could notice syntax errors very late, and one
    was happy to be able to still salvage something when it bombed.)
  - quadray no longer allows an (optional) 3rd argument: was not properly
    documented, broke the symmetry between real / imaginary case (was ignored
    if D > 0), complicated the code, and was rather useless in any case.
  - the "minimum field width" component of the 'format' default is now
    ignored (was used only for integers in 'prettyprint' output mode and
    defaulted to 0 [no effect]). Use printf !
  - removed the fieldw "minimum field width" field from the undocumented
    pariout_t struct
  - remove obsolete "prettyprint" support: printp / printp1 now act as
    print/print1
  - the conversion style 'g' of the 'format' default now printfs in style 'f'
    if the decimal exponent is < -4 ( was: if the binary exponent is < -32 ),
    in order to conform to standard printf specifications.
  - all LLL variants now use an implementation of NGuyen & Stehle's algorithm
    The LLL-reduced bases will be different from previous versions.
  - plotinit: change the way default arguments are evaluated (omit dimension,
    instead of interpreting 0 in a special way)
  - nfbasistoalg / nfalgtobasis no longer accept t_VEC/t_COL/t_MAT
    (not being able to apply nfbasistoalg to nfalgtobasis(nf,x) was awkward
    and inconsistent; the doc stated that those were inverse functions,
    but they were not). Use matbasistoalg / matalgtobasis, which now also
    accept t_VEC/t_COL.
  - removed obsolete optional argument to quadhilbert(D < 0)
  - removed obsolete GP functions printp, printp1. Use print.
  - bittest(x, n) no longer accepts t_VEC arguments n
  - remove obsolete GP functions bnfclassunit, bnfreg, bnfclgp, bnfunit.
    Use bnfinit.
  - remove obsolete GP functions bnrclass. Use bnrinit or bnrclassno.
  - remove awkward flag '3' for bnfinit. Use bnfcompress().
  - remove badly named bnfmake. Use bnfinit(sbnf).
  - idealmin now returns a number field element, instead of the associated
    "principal idele"
  - removed obsolete GP functions idealprincipal. Use number field elements
    "as is".
  - Functions quadunit(), quadregulator(), and factor() no longer apply
    componentwise to vector / matrix arguments. Use apply()
  - factorback() no longer accepts an optional 3rd argument (nf). Use
    idealfactorback(). See also nffactorback().
  - no longer export private library function incgam2. Remove it also under
    GP when compatible = 3. Situation is the same as incgam1 (removed long
    ago), 1.39.15 doc stated both were provided "for debugging only".
  - Change of behaviour for Set(t_STR): Set("1") used to return ["1"], now
    it returns ["\"1\""], i.e returns the set whose element evaluates to the
    character string "1".
  - Flags 4, 5, 6 (useless) have disappeared in nfinit()
  - norml2(t_POL) now returns the expected (square of) the polynomial L^2 norm.
    Use x * conj(x) to get back the old behaviour. norml2 now raises an error
    on t_POLMOD and t_FFELT components; used to add relative norms as in
      ? norml2([Mod(Mod(1,3)*x,x^2-2), 2])
      %1 = Mod(2, 3)
  - kill(z) has essentially the same effect as z = 'z [ it also kills addhelp
    messages attached to z, and works for aliases and installed functions too ]
  - removed optional flag to rnfconductor, use rnfisabelian.
  - changed the "zetakinit" format: bnf no longer included
  - factor(t_INT/t_FRAC, lim) used to trial divide by primes up to
    min(lim, primelimit). Now we trial divide up to lim and raise an error
    if lim > primelimit. [ Having the routine return an obviously "wrong"
    result depending on an invisible parameter was not a good idea. ]
  - factor(t_INT/t_FRAC, 1) was the same as factor(t_INT/t_FRAC, 0). Now
    abide by the input value and leave (..., 0) as the single special case
    (shortcut for "the largest precomputed prime")
  - listsort(L) no longer returns the list L: it now returns nothing.
    (No point in sorting in place if we must immediately copy the result.)
  - ellwp now outputs a number of terms equal to the default seriesprecision,
    instead of *twice* that number.
  - inverse trigonometric functions (acos,asin,atan,acosh,asinh,atanh):
    values on the branch cuts changed to conform to standards, e.g.
    "implementations shall map a cut so the function is continuous as the cut
    is approached coming around the finite endpoint of the cut in a counter
    clockwise direction." (ISO C99)
  - bnfinit no longer outputs a warning when fundamental units couldn't be
    computed (annoying and rather useless) [#1166]
  -[Configure] no longer support a link to an uninstalled readline library
   in PARI toplevel
  - thue() no longer outputs a Warning when the result is conditional on
    the GRH.
  - addprimes() now includes its argument as-is (used to take gcds,
    making an insertion linear in the table size instead of O(1); filling
    an inially empty table was quadratic in the final table size). They
    must be true primes, otherwise number theoretic routines may return
    wrong values. [#322]

* Specific to the PARI library:
===============================
  - allocatemoremem() is gone. Use allocatemem().
  - rename fprintferr() -> err_printf().
  - rename TIMER -> timer_delay, TIMERread -> timer_get, TIMERstart ->
    timer_start, msgTIMER -> timer_printf
  - rename gener_Fp -> pgener_Fp, gener_Fl -> pgener_Fp [ contrary to
    'gener', these assume that their argument is prime ]
  - rename Flx_rand -> random_Flx, FpX_rand -> random_FpX
  - rename cyclo -> polcyclo (GP name), subcyclo -> polsubcyclo (GP name),
    tchebi -> polchebyshev (GP name), legendre -> pollegendre (GP name)
  - only scalar types (and vectors/matrices of such) are allowed in gaffect
    and gaffsg.
  - pol_x and pol_1 are now functions, not global arrays. Use pol_x(v)
    instead of pol_x[v]. polvar[] and ordvar[] have disappeared
  - rename ZY_ZXY_resultant   -> ZX_ZXY_resultant,
           ZY_ZXY_rnfequation -> ZX_ZXY_rnfequation and
           FpY_FpXY_resultant -> FpX_FpXY_resultant
  - FpX_ functions no longer accept p==NULL.
  - Fl_pow renamed to Fl_powu [ exponent may not be negative ]
  - rename pointch ->  ellchangepoint, coordch -> ellchangecurve,
    ordell -> ellordinate
  - remove obsolete undocumented functions outerr, outbeauterr, outsor,
    outtex. Rename voir -> dbgGEN. Functions brute, outbrute, matbrute,
    outmat, sor, outbeaut are obsoleted and no longer documented.
  - rename errfile -> pari_errfile, infile -> pari_infile, logfile ->
    pari_logfile
  - manage_var obsoleted (kept for backward compatibility, to be removed),
    use pari_var_init, pari_var_next, pari_var_max_avil, pari_var_create
    instead.
  - rename sqred -> qfgaussred, signat -> qfsign
  - rename gscalmat -> scalarmat, gscalsmat -> scalarmat_s,
    gscalcol -> scalarcol, gscalcol_i -> scalarcol_shallow
  - removed obsolete apell2, ellap0. Rename apell -> ellap.
  - typedef for type col_counter [last argument of unused, undocumented
    plot_count()] changed (must be malloced since MAX_COLORS is no longer
    a constant)
  - rename gissquarerem -> gissquareall, uissquarerem -> uissquareall,
    Z_issquarerem -> Z_issquareall (analogy with sqrtrem was faulty: we do
    not store a remainder but the square root)
  - rename assmat -> matcompanion, polymodrecip -> modreverse
  - removed obsolete undocumented bruteall()
  - %Z is no longer a valid conversion specification for PARI formats,
    since this is now handled as a length modifier. Use %Ps instead.
  - rename pariprintf -> pari_printf (%Z conversion disappeared, use %Ps)
  - rename pariputc -> pari_putc, pariputs -> pari_puts, pariflush -> pari_flush
  - rename gpmalloc -> pari_malloc, gprealloc -> pari_realloc,
    gpfree -> pari_free
  - rename derivpol -> RgX_deriv
  - obsolete library functions roots2 and rootsold are no longer public
  - rename factorpadic4 -> factorpadic, factorpadic2 now static
  - the "prec" parameter has disappeared in all floating point LLL various
  - remove obsolete function factpol()
  - rename library functions nfhermite -> nfhnf, nfhermitemod -> nfhnfmod,
    nfsmith -> nfsnf
  - rename subres -> resultant, subresall -> resultant_all.
  - remove obsolete discsr. Use RgX_disc (or quad_disc, qfb_disc...)
  - remove obsolete allbase, base, base2, factoredbase, smallbase,
    discf2, factoreddiscf, smalldiscf. Use nfbasis0 / nfdisc0 / nfmaxord
  - rename library functions matrixqz2 -> QM_ImZ_hnf, matrixqz3 ->
    QM_ImQ_hnf, matrixqz -> QM_minors_coprime
  - rename library functions hil0->hilbert, hilii->hilbertii
  - rename library functions srgcd -> RgX_gcd
  - rename library functions ismonome -> RgX_is_monomial
  - remove obsolete buchray, buchrayinit, buchrayinitgen: use Buchray.
  - rename library functions minideal -> idealmin and change prototype
  - rename library functions element_mulmodpr -> nfmulmodpr,
    element_powmodpr -> nfpowmodpr, element_val -> nfval,
    element_add -> nfadd, element_divmodpr -> nfdivmodpr,
    element_mul -> nfmul, element_pow -> nfpow, element_div -> nfdiv.
  - remove obsolete library function smallfact; use boundfact or Z_factor_limit
  - rename mu -> moebius, gmu -> gmoebius, phi -> eulerphi, gphi ->
    geulerphi, phiu -> eulerphiu, gener -> znprimroot, ggener -> znprimroot0,
    racine -> sqrtint [ NO COMPATIBILITY #define PROVIDED: too dangerous ]
  - rename regula -> quadregulator, fundunit -> quadunit
  - remove obsolete library function gracine
  - remove obsolete library function ispsp, gispsp. Use ispseudoprime
    or BPSW_psp.
  - remove obsolete library function gregula, gfundunit. Use quadregulator and
    quadunit
  - removed obsolete 'prec' argument from prototypes of idealmul0,
    idealmulred, idealpow0, idealpowred, ideallllred, algdep, algdep0,
    lindep, lindep0
  - removed obsolete library functions ideallistunit, ideallistunitgen,
    ideallistzstar, ideallistzstargen. Use ideallist0.
  - removed obsolete library function algdep2. Use algdep0 (same arguments).
  - removed obsolete library function Mod0. Use gmodulo.
  - factorback() now accepts a single argument.
  - rename library functions factorback0 -> factorback2,
    subfields0 -> nfsubfields, ideallllred -> idealred0, zideallog -> ideallog,
    isunit -> bnfisunit, ideal_two_elt* -> idealtwoelt*
  - changed prototypes of bnrdisc, bnrconductor, bnrisconductor [ actually
    renamed bnrdisc0, bnrconductor0, bnrisconductor0 ]. Just use the new
    prototype, it's more convenient.
  - removed obsolete library function kerin1. Use kerint or [simpler if
    LLL reduction of the returned basis is not deisred] ZM_lll(,0.99,LLL_KER)
  - rename library functions initell -> ellinit, smallinitell -> smallellinit
    initalg -> nfinit, initalgred -> nfinitred -> initalgred2 -> nfinitred2
    primedec -> idealprimedec, powraw -> qfbpowraw, compraw -> qfbcompraw
  - rename library function u2toi -> uu32toi.
  - remove obsolete library functions sor, outbrute, outbeaut
  - basic kernel functions involving a t_INT and a t_REAL now return a
    t_REAL, e.g. divsr(0, x) or mulir(gen_0,x) return real_0(...) [ used
    to return gen_0 ] ==> much better control of object types when writing
    kernel code. Generic functions (gmul, gdiv), as called from gp still
    return a result as precise as possible given the input: 0 * 1. --> gen_0
  - deprecated global constants gi; use mulcxI, gen_I() or mkcomplex().
  - deprecated global constants geuler & gpi; use mpeuler() & mppi().
  - changed prototype of galoisconj: galoisconj(x) -> galoisconj(x,NULL)
  - commented out a large section of pariold.h. Define PARI_OLD_NAMES to
    recover compatibility macros for old friends like 'un' and 'lstoi'
  - rename greffe -> RgX_to_ser and remove the "use_pari_stack" flag
  - rename Buchall -> Buchall_param and export a new Buchall with a
    simplified interface.
  - rename certifybuchall -> bnfcertify
  - the bitvec family function was replaced by the new F2v family functions.
  - prototype change: added a flag to the (mostly useless) function
    rnfdedekind(), the version with the flag set is more useful.
  - rename gcmp0 -> gequal0, gcmp1 -> gequal1, gcmp_1 -> gequalm1
  - rename ZX_caract -> ZXQ_charpoly and swap arguments.
  - rename RgXQ_u_pow -> RgXQ_powu
  - remove function delete_named_var (using kill0 instead).
  - remove RgM_ishnf (use ZM_ishnf instead).
  - rename leftright_pow to gen_pow, leftright_pow_u to gen_powu.
  - remove unused 'prec' argument in rnfinitalg(). Rename rnfinitalg -> rnfinit
  - remove unused 'prec' argument in bnfisnorm()
  - add a third precdl argument to gtoser()
  - the last 2 arguments of ellwp0 (prec and precdl) have been swapped
  - prototype of "summation" functions (suminf,intnum,prodinf,etc.) now is
    fun(void *E, GEN call(void*, GEN),...)

%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION 2.2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

* General:  [ use GP function names in description ]
==========
  - Default args for user defined functions now evaluated when function is
    called (used to be: at definition time)
    E.g f(x) = local(z = x); z.
    Before: f(2) -> x
    Now:    f(2) -> 2

  - rnfisnorm() input format has changed. Older version was complicated and
    only worked if rnfequation(bnf, p, 1)[3] == 0  [otherwise, crash].
    Use rnfisnorminit() now.

  - rnfidealreltoabs, rnfidealup: now return a Z-basis as a vector of
    elements in the relative extension, instead of a meaningless HNF matrix
    wrt an unknown basis. Was especially dangerous if the extension also existed
    in nfinit form, since the HNF matrices were _not_ ideals wrt this nf
    structure. [ also consistent with rnfeltreltoabs ]. Use the following
    construction instead, referring to an explicit NF structure:

      \\ return y = rnfidealup(rnf,...) as an ideal in HNF form associated to
      \\ nf = nfinit(rnf.pol);
      idealgentoHNF(nf, y) = mathnf( Mat( nfalgtobasis(nf, y) ) );

  - the "bit accuracy component" for computations of principal ideal generators
    (bnfisprincipal), units (bnfunit), and some of the bnf structures has
    been removed.

  - the "technical parameter" to bnfinit() has been shortened to 3 components
    (the others were deprecated / useless): [c, c2, nrpid]. The output format
    has changed (technical components).

  - poldegree(0) now returns -VERYBIGINT, not -1. Before using d = poldegree(x),
    always check for 0 first: either (x == 0) or (d >= 0) as you prefer. Never
    check for  d == -1 or -2^31-1 which is not portable.

  - ellheight now uses the standard normalization: twice the value it used to
    return. The values returned by ellbil() and ellheightmatrix are
    unaffected. In particular, ellheightmatrix() is the polar form of
    elleight(), and ellbil now satisfies the proper identity
    B(P, Q) = (h(P+Q)-h(P)-h(Q)) / 2

  - ':' no longer allowed as a substitute for ';' if compatible = 0. Use GP2C
    semantics [ x:int, v:vec ]. For the time being the type information is
    discarded.

  - log(x, {flag}): optional flag removed. Decide alone whether to use AGM.

  - valuation(x, 1) used to return 1, valuation(x, -1) returned 0 if (x >= 0)
    and 1 otherwise. Not anymore: error message.

  - bnrdisclist has lost its 4th argument 'flag', and omitting the
    archimedean component now means that all 2^r1 possible values are
    substituted (formerly: indicate no ramification at infinity).

  - 'buffersize' default has disappeared: it is adjusted internally whenever
    needed. The -b xxx flag to gp is a no-op.

  - the member function bnr.zkst is deprecated, use bnr.bid.clgp

  - the member function bnr.futu is deprecated. Please don't use bnr.tufu
    either.
  - use \frac instead of \over in TeX output. Define
      \def\frac#1#2{{#1\over#2}}
    if you insist on using plain TeX and run into problems.
  - automatic concatenation for strings: use longest match for expression.
    print("a"[1]) is not valid since "a" is not a vector print("a", [1])
    prints 'a[1]'.
  - isprime() now guarantees primality, use ispseudoprime() for fast
    pseudo-primality tests.
  - default() now always returns the value of the (possibly changed) default.
    No need for a flag anymore.
  - semantic of t_SER with inexact coefficients is now the same as for
    t_POL: the sign is 0 iff all coefficients are zero. Either there are
    no coefficients, or the leading coefficient is an inexact zero.
  - No longer assume that part of an object is "permanent" when it is out
    of the stack (was used by INTMOD/POLMOD/PADIC). Always copy it.
    As a result, 'gmodulo' and 'forcecopy' become obsolete.
    Rename gmodulcp -> gmodulo.

* Specific to the PARI library:
===============================
Incompatible changes:
---------------------
  - gsize() -> gsizeword()  [conflict with gtk]
    taille2 -> gsizebyte()
  - hnfhavas removed (didn't work properly, hnflll provides an alternative)
  - real zeroes are now coded on 2 words. Beware of constructs like
    t = cgetg(lg(x), t_REAL); gaffect(y, t). If x = 0, so will be t.
  - polgalois(): old format deprecated. New preferred format for result
    has 3rd component giving numbering among all transitive subgroups of S_n
    [ was ad hoc up to 7, as described above for n >= 8 ]. Old format is
    still the default, but will eventually change. Use
    default(new_galois_format, 1) or, in library mode, set global variable
    new_galois_format to 1 to enable the new format.
  - The nf structure output by nfinit has changed:
    *) nf.zk is now T2-LLL-reduced, not in HNF wrt the power basis
    *) the internal components of nf[5] have changed (MC and T2 not needed
       anymore)
  - polred & polredabs do not take a 'prec' argument anymore [was unused]
  - gentimer / genmsgtimer / get_timer have been removed. They are superseded
    by TIMER and msgTIMER which are fully reentrant and easier to use.
  - (undocumented) macros buch[gen | genfu | init | iniftu]
  - rnfisnorm() prototype has changed [ + need to call rnfisnorminit first ]
  - incgam4 renamed to incgam0, incgam3 renamed to incgamc
  - prototypes of buchall and smallbuchinit have changed (much simpler)
  - co8() renamed to quadtoc()
  - ker_mod_p() renamed to FpM_ker [ and supplemented with many analogous
    modular routines ]
  - nfreducemodpr2() removed, use an nfmodpr structure from nfmodprinit() or
    zkmodprinit() instead
  - smodsi() removed [ not well defined ]. Use either modsi() or umodui()
  - Many error codes were removed. It is usually better to use only talker
    outside libpari.
  - Macro BITS_IN_RANDOM has been removed. Used to be 32.
  - mymyrand() has been removed, use pari_rand31() or pari_rand() instead
  - diviiz(x,y,z), divisz, divsiz and divssz always assign the euclidean
    quotient [ used to  depend on the type of z: if t_REAL computed exact
    quotient ]. Use rdivii, rdivis, rdivsi, rdivss for analogous
    functionality (no "z" variant);
  - mpdivz(x,y,z) assigns the euclidean quotient when x,y are t_INT (used
    to depend on the type of z)
  - removed inconsistently named macros mpinv[sir]r [ were "z" functions ]
  - removed useless routine shifts [ use shifti( stoi() ) ]
  - library interface of functions intnum, prodeuler, suminf, sumalt,
       sumalt2, sumpos, sumpos2, prodinf, prodinf1  [ use GEN
       (*eval)(GEN,void*) everywhere instead of entree * ]
  - changed the prototype of bnrdisclist0
  - removed ideallistarch0, ideallistarchgen, ideallistunitarch,
    ideallistunitarchgen. Just use ideallistarch.
  - change the output of ideallist with technical (flag 2,3) [ with units ]:
    instead of two vectors, output a vector of 2-component vectors.
    change the input of all list routines (bnrclassnolist, bnrdisclist)
    accordingly.
  - rename gtrans_i -> shallowtrans, concatsp -> shallowconcat.
  - pari_err(warner | warnmem | warnfile | warnprec,) no longer accepted. Use
    pari_warn.

Partially compatible changes:
-----------------------------
[ not mandatory for your program to work with 2.3, since compatibility macros
support the old names but are likely to become mandatory in 2.4, so we
advise you to update soon ]

  - typecasting macros (e.g. ladd(), lmul() ...) are obsolete and
    shouldn't be used in new programs. Use accessors gel() and friends.
  - stack locations used to be of type long or ulong, now they have a
    dedicated type pari_sp [ pari stack pointer ]
  - in order to compare variable numbers, use the macro varncmp() instead of
    < or > operators.
  - access to the prime numbers table is done via the macros
    NEXT_PRIME_VIADIFF or NEXT_PRIME_VIADIFF_CHECK.
  - direct access to the mantissa of t_INT is deprecated. Instead you should
    use the t_INT API (macros int_MSW, int_LSW, int_precW, int_nextW, int_W).
    This will ensure your code is compatible with both native and GMP kernels.
  - the macros lgef / setlgef / evallgef have been removed. t_POLs no longer
    include an "effective length". One should use lg() for t_POLs as for
    most other types. Don't use lgef() in new code.

    lgef() and setlgef() are aliased to lg() and setlg(). They will break on
    hackish code accessing directly the first component of t_POL objets, e.g
      x = cgetg(20, t_POL);
      x[1] = evalsigne(1) | evalvarn(0) | evallgef( 10 )  /* 10, not 20 */
      ...
      setlgef(x, 20); /* now create/use further coefficients */
  - types t_FRACN, t_RFRACN and gred() have been removed (complicated, unused,
    and very inefficient). There are now aliases to t_FRAC, t_RFRAC and gcopy
    respectively for backward compatibility.
  - renamed nfdivres -> nfdivrem, poldivres -> poldivrem
  - renamed permute -> numtoperm, permuteInv -> permtonum
  - renamed gzero -> gen_0, gun -> gen_1, gdeux -> gen_2, polx -> pol_x,
    polun -> pol_1
  - renamed gegal -> gequal, gegalgs -> gequalgs, gegalsg -> gequalsg,
    egalii -> equalii
  - renamed binome -> binomial, chinois -> chinese
  - renamed apprgen9, apprgen -> padicappr, factmod9 -> factorff
  - rename resss -> remss, ressi -> remsi, resis -> remis, resii -> remii,
    gres -> grem
  - rename divise -> dvdii, gdivise -> gdvd, mpdivis -> dvdiiz, mpdivisis
    -> dvdisz
  - rename mpent -> mpfloor
  - rename isprincipalrayall -> bnrisprincipal, rayclassno -> bnrclassno
    rayclassnolist -> bnrclassnolist
  - rename globalreduction -> ellglobalred, localreduction -> elllocalred
  - taniyama(e) is deprecated. Use elltaniyama(e, prec) instead of
      old = precdl; precdl = prec; x = taniyama(e); precdl = old;
  - rename lisexpr -> readexp, lisseq -> readseq
  - rename flisexpr, flisseq -> gp_read_str
  - rename lisGEN  -> gp_read_stream
  - rename idmat -> matid
  - rename coefs_to_col -> mkcoln, coefs_to_int -> mkintn
           coefs_to_pol -> mkpoln, coefs_to_vec -> mkvecn
  - rename wf -> weberf, wf1 -> weberf1, wf2 -> weberf2
  - rename err -> pari_err, pariputsf -> pariprintf
  - rename rnfhermitebasis -> rnfhnfbasis
  - rename gcarreparfait -> gissquare, gcarrecomplet -> gissquarerem
  - rename lseriesell -> elllseries
  - gmodulo and forcecopy are obsolete. Use gmodulcp and gcopy.

%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION 2.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

* The calculator GP:
====================
 - most function names have changed (see misc/new.dic or use whatnow under GP)
 - lowercase / uppercase letters distinguished.
 - the syntax \var = value is not recognized anymore. Use standard
   metacommands instead.
(setting the compatibility level "compatible" to 3, with "default" will give
you those three back).

 - strict parenthesis matching before executing the command
(set strictmatch to 0 to get old behaviour)

 - functions label / goto have been removed (use break/next/return instead).
 - conjugation x_ has been removed. '_' can be freely used in identifiers.
 - \k metacommand removed

 - result history is now cyclic (older results are erased when the maximal
   size "histsize" is reached).
 - the Set() function turns objects into strings (so that set functions are
   able to treat arbitrary objects). Use eval to turn them back to GENs.
 - the type() function returns a string and not a number.
 - sum(X=a,b,...,x) yields x if b<a. Analogous statement for prod.

* The library PARI:
===================
 - use symbolic type names (t_INT, etc.). Don't use any explicit type number
   in your programs since these are liable to change (they have not, but will).
 - the codewords of GEN objects have a different internal structure. The
   components should only be accessed through the documented macros. When
   creating codeword x[1] for the GEN x, use the eval* macros (the set* ones
   don't fill the codeword completely).
 - the following constant names have changed ("pari" prepended): C1, C2, C3, K,
   K1, K2, K4. The constant C31 has disappeared.
 - prec and defaultpadicprecision are no longer global. The latter has
   disapeared.
 - char *pariversion not set anymore (use the macros PARIVERSION/PARIINFO)
 - LONG_IS_32BIT is never defined (test whether LONG_IS_64BIT is defined
   or not).
 - gen2str() renamed to GENtostr().
 - gitoascii() suppressed, use GENtostr().
 - init() renamed to pari_init().
 - the macro mant() has been suppressed.
 - imprimer() suppressed. output() is now a function and can be used under
   all debuggers.
 - the prototypes and behaviour of gredsp() and normalize() have changed.
   They are not documented anymore.
 - the install() function has been modified (use codes instead of valence).
 - gpuigs only has two arguments.
 - integ now takes two arguments, like deriv.
 - setrand, getrand, getstack, gettime, glength return a C long, and not a GEN.
 - pari_randseed no longer global, use setrand/getrand
 - gerepile(ltop,lbot,0) no longer returns ltop - lbot
 - nf[5][7] stored in two element form (was Z-basis) for faster inversion
 - t_POL and t_POLMOD can be freely mixed as long as main variables are the
   same (result is the expected POLMOD)

