summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Fabbro <bicatali@gentoo.org>2013-06-11 17:33:11 +0000
committerSebastien Fabbro <bicatali@gentoo.org>2013-06-11 17:33:11 +0000
commit0114e9b5bf8621f0af48b9a4060f3c6e18423349 (patch)
tree3ec0544242d674a29d537d693b4d8ff89bc4d641 /sci-mathematics
parentBump LeechCraft suite to 0.5.97, thanks to 0xd34df00d. (diff)
downloadgentoo-2-0114e9b5bf8621f0af48b9a4060f3c6e18423349.tar.gz
gentoo-2-0114e9b5bf8621f0af48b9a4060f3c6e18423349.tar.bz2
gentoo-2-0114e9b5bf8621f0af48b9a4060f3c6e18423349.zip
Version bump, also closing bug #472362, thanks Martin von Gagern and Francois Bissey
(Portage version: 2.2.01.21938-prefix/cvs/Linux x86_64, signed Manifest commit with key 0x13CB1360)
Diffstat (limited to 'sci-mathematics')
-rw-r--r--sci-mathematics/pari/ChangeLog10
-rw-r--r--sci-mathematics/pari/files/pari-2.5.4-polred.patch754
-rw-r--r--sci-mathematics/pari/files/pari-2.5.4-slow_determinant.patch100
-rw-r--r--sci-mathematics/pari/pari-2.5.4.ebuild144
4 files changed, 1007 insertions, 1 deletions
diff --git a/sci-mathematics/pari/ChangeLog b/sci-mathematics/pari/ChangeLog
index a5685e28a840..74b688b4affa 100644
--- a/sci-mathematics/pari/ChangeLog
+++ b/sci-mathematics/pari/ChangeLog
@@ -1,6 +1,14 @@
# ChangeLog for sci-mathematics/pari
# Copyright 1999-2013 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sci-mathematics/pari/ChangeLog,v 1.94 2013/03/02 23:25:30 hwoarang Exp $
+# $Header: /var/cvsroot/gentoo-x86/sci-mathematics/pari/ChangeLog,v 1.95 2013/06/11 17:33:11 bicatali Exp $
+
+*pari-2.5.4 (11 Jun 2013)
+
+ 11 Jun 2013; Sébastien Fabbro <bicatali@gentoo.org>
+ +files/pari-2.5.4-polred.patch, +files/pari-2.5.4-slow_determinant.patch,
+ +pari-2.5.4.ebuild:
+ Version bump, also closing bug #472362, thanks Martin von Gagern and Francois
+ Bissey
02 Mar 2013; Markos Chandras <hwoarang@gentoo.org> pari-2.5.1-r1.ebuild,
pari-2.5.2.ebuild, pari-2.5.3.ebuild:
diff --git a/sci-mathematics/pari/files/pari-2.5.4-polred.patch b/sci-mathematics/pari/files/pari-2.5.4-polred.patch
new file mode 100644
index 000000000000..4287c9d35d66
--- /dev/null
+++ b/sci-mathematics/pari/files/pari-2.5.4-polred.patch
@@ -0,0 +1,754 @@
+diff -ru src/src/basemath/base1.c b/src/basemath/base1.c
+--- src/src/basemath/base1.c 2013-05-06 16:01:56.000000000 +0200
++++ b/src/basemath/base1.c 2013-05-06 16:49:09.042406927 +0200
+@@ -1675,40 +1675,42 @@
+ ZX_is_better(GEN y, GEN x, GEN *dx)
+ {
+ GEN d = ZX_disc(y);
+- long cmp = absi_cmp(d, *dx);
++ int cmp;
++ if (!*dx) *dx = ZX_disc(x);
++ cmp = absi_cmp(d, *dx);
+ if (cmp < 0) { *dx = d; return 1; }
+ if (cmp == 0) return cmp_abs_ZX(y, x) < 0;
+ return 0;
+ }
+
+-static GEN polred_aux(nfbasic_t *T, GEN *pro, long flag);
++static void polredbest_aux(nfbasic_t *T, GEN *pro, GEN *px, GEN *pdx, GEN *pa);
+ /* Seek a simpler, polynomial pol defining the same number field as
+ * x (assumed to be monic at this point) */
+ static GEN
+ nfpolred(nfbasic_t *T, GEN *pro)
+ {
+- GEN x = T->x, dx = T->dx, a, z, rev, pow, dpow;
++ GEN x = T->x, dx, b, rev, pow, dpow;
+ long i, n = degpol(x), v = varn(x);
+
+ if (n == 1) {
+ T->x = deg1pol_shallow(gen_1, gen_m1, v);
+ *pro = NULL; return pol_1(v);
+ }
+- z = polred_aux(T, pro, nf_ORIG | nf_RED);
+- if (typ(z) != t_VEC || !ZX_is_better(gel(z,1),x,&dx))
+- return NULL; /* no improvement */
+-
+- rev = QXQ_reverse(gel(z,2), x);
+- x = gel(z,1); if (DEBUGLEVEL>1) err_printf("xbest = %Ps\n",x);
++ polredbest_aux(T, pro, &x, &dx, &b);
++ if (x == T->x) return NULL; /* no improvement */
++ if (DEBUGLEVEL>1) err_printf("xbest = %Ps\n",x);
+
+ /* update T */
++ rev = QXQ_reverse(b, T->x);
+ pow = QXQ_powers(rev, n-1, x);
+ pow = Q_remove_denom(pow, &dpow);
+- a = T->bas;
+- for (i=2; i<=n; i++) gel(a,i) = QX_ZXQV_eval(gel(a,i), pow, dpow);
++ for (i=2; i<=n; i++) gel(T->bas,i) = QX_ZXQV_eval(gel(T->bas,i), pow, dpow);
+ (void)Z_issquareall(diviiexact(dx,T->dK), &(T->index));
+- T->basden = get_bas_den(a);
+- T->dx = dx; T->x = x; *pro = NULL; return rev;
++ T->basden = get_bas_den(T->bas);
++ T->dx = dx;
++ T->x = x;
++ *pro = NULL; /* reset */
++ return rev;
+ }
+
+ /* let bas a t_VEC of QX giving a Z-basis of O_K. Return the index of the
+@@ -1776,7 +1778,7 @@
+ x = Q_primpart(x);
+ RgX_check_ZX(x, "nfinit");
+ if (!ZX_is_irred(x)) pari_err(redpoler, "nfinit");
+- if (flag & nf_RED || !gequal1(gel(x,lg(x)-1)))
++ if (flag & nf_RED || !equali1(gel(x,lg(x)-1)))
+ x = ZX_Q_normalize(x, &(T->lead));
+ nfmaxord(&S, x, flag, fa);
+ index = S.index;
+@@ -1822,26 +1824,32 @@
+ nfinitall(GEN x, long flag, long prec)
+ {
+ const pari_sp av = avma;
+- GEN nf;
++ GEN nf, lead;
+ nfbasic_t T;
+
+ nfbasic_init(x, flag, NULL, &T);
+ nfbasic_add_disc(&T); /* more expensive after set_LLL_basis */
+- if (T.lead != gen_1 && !(flag & nf_RED))
++ lead = T.lead;
++ if (lead != gen_1 && !(flag & nf_RED))
+ {
+ pari_warn(warner,"non-monic polynomial. Result of the form [nf,c]");
+ flag |= nf_RED | nf_ORIG;
+ }
+ if (flag & nf_RED)
+ {
+- GEN ro, rev = nfpolred(&T, &ro);
++ GEN ro, rev;
++ /* lie to polred: more efficient to update *after* modreverse, than to
++ * unscale in the polred subsystem */
++ T.lead = gen_1;
++ rev = nfpolred(&T, &ro);
+ nf = nfbasic_to_nf(&T, ro, prec);
+ if (flag & nf_ORIG)
+ {
+ if (!rev) rev = pol_x(varn(T.x)); /* no improvement */
+- if (T.lead != gen_1) rev = RgX_Rg_div(rev, T.lead);
++ if (lead != gen_1) rev = RgX_Rg_div(rev, lead);
+ nf = mkvec2(nf, mkpolmod(rev, T.x));
+ }
++ T.lead = lead; /* restore */
+ } else {
+ GEN ro; set_LLL_basis(&T, &ro, 0.99);
+ nf = nfbasic_to_nf(&T, ro, prec);
+@@ -1948,7 +1956,7 @@
+ get_polchar(CG_data *d, GEN x)
+ { return get_pol(d, RgM_RgC_mul(d->ZKembed,x)); }
+
+-/* return a defining polynomial for Q(w_i) */
++/* return a defining polynomial for Q(w_k) */
+ static GEN
+ get_polmin_w(CG_data *d, long k)
+ {
+@@ -1956,6 +1964,22 @@
+ if (g) (void)ZX_gcd_all(g, ZX_deriv(g), &g);
+ return g;
+ }
++/* return a defining polynomial for Q(w_k+w_l) */
++static GEN
++get_polmin_add2(CG_data *d, long k, long l)
++{
++ GEN g = get_pol(d, RgV_add(gel(d->ZKembed,k), gel(d->ZKembed,l)));
++ if (g) (void)ZX_gcd_all(g, ZX_deriv(g), &g);
++ return g;
++}
++/* return a defining polynomial for Q(w_k-w_l) */
++static GEN
++get_polmin_sub2(CG_data *d, long k, long l)
++{
++ GEN g = get_pol(d, RgV_sub(gel(d->ZKembed,k), gel(d->ZKembed,l)));
++ if (g) (void)ZX_gcd_all(g, ZX_deriv(g), &g);
++ return g;
++}
+
+ /* does x generate the correct field ? */
+ static GEN
+@@ -2044,13 +2068,67 @@
+ d->v = varn(T->x);
+ d->r1= T->r1; return prec;
+ }
++static void
++update(GEN *pai, GEN *pch, nfbasic_t *T, long orig)
++{
++ GEN ch = *pch, ai = *pai;
++ if (!ch)
++ { /* accuracy too low, compute algebraically */
++ ch = ZXQ_charpoly(ai, T->x, varn(T->x));
++ (void)ZX_gcd_all(ch, ZX_deriv(ch), &ch);
++ }
++ if (ZX_canon_neg(ch) && orig) ai = RgX_neg(ai);
++ if (DEBUGLEVEL>3) err_printf("polred: generator %Ps\n", ch);
++ if (T->lead != gen_1 && orig) ai = RgX_unscale(ai, ginv(T->lead));
++ *pch = ch; *pai = ai;
++}
++static GEN
++findmindisc(GEN y, GEN *pa)
++{
++ GEN a = *pa, x = gel(y,1), b = gel(a,1), dx = NULL;
++ long i, l = lg(y);
++ for (i = 2; i < l; i++)
++ {
++ GEN yi = gel(y,i);
++ if (ZX_is_better(yi,x,&dx)) { x = yi; b = gel(a,i); }
++ }
++ *pa = b; return x;
++}
++/* filter [y,b] from polred_aux: keep a single polynomial of degree n in y
++ * [ the best wrt discriminant ordering ], but keep all non-primitive
++ * polynomials */
++static void
++filter(GEN y, GEN b, long n)
++{
++ GEN x, a, dx;
++ long i, k = 1, l = lg(y);
++ a = x = dx = NULL;
++ for (i = 1; i < l; i++)
++ {
++ GEN yi = gel(y,i), ai = gel(b,i);
++ if (degpol(yi) == n)
++ {
++ if (dx && !ZX_is_better(yi,x,&dx)) continue;
++ if (!dx) dx = ZX_disc(yi);
++ x = yi; a = ai; continue;
++ }
++ gel(y,k) = yi;
++ gel(b,k) = ai; k++;
++ }
++ if (dx)
++ {
++ gel(y,k) = x;
++ gel(b,k) = a; k++;
++ }
++ setlg(y, k);
++ setlg(b, k);
++}
++
+ static GEN
+-polred_aux(nfbasic_t *T, GEN *pro, long flag)
++polred_aux(nfbasic_t *T, GEN *pro, long orig)
+ {
+ GEN b, y, x = T->x;
+- long i, v = varn(x), l = lg(T->bas);
+- const long orig = flag & nf_ORIG;
+- const long nfred = flag & nf_RED;
++ long maxi, i, j, k, v = varn(x), n = lg(T->bas)-1;
+ nffp_t F;
+ CG_data d;
+
+@@ -2058,27 +2136,41 @@
+ *pro = F.ro;
+ d.ZKembed = F.M;
+
+- y = cgetg(l, t_VEC);
+- b = cgetg(l, t_COL);
++ /* n + 2 sum_{1 <= i <= n} n-i = n + n(n-1) = n*n */
++ y = cgetg(n*n + 1, t_VEC);
++ b = cgetg(n*n + 1, t_COL);
++ /* i = 1 */
+ gel(y,1) = deg1pol_shallow(gen_1, gen_m1, v);
+ gel(b,1) = gen_1;
+- for (i = 2; i < l; i++)
++ for (i = k = 2; i <= n; i++)
+ {
+- GEN ch, ai = gel(T->bas,i);
++ GEN ch, ai;
++ ai = gel(T->bas,i);
+ ch = get_polmin_w(&d, i);
+- /* if accuracy too low, compute algebraically */
+- if (!ch)
++ update(&ai, &ch, T, orig);
++ gel(y,k) = ch;
++ gel(b,k) = ai; k++;
++ }
++ k = i;
++ maxi = minss(n, 3);
++ for (i = 1; i <= maxi; i++)
++ for (j = i+1; j <= n; j++)
+ {
+- ch = ZXQ_charpoly(ai, x, v);
+- (void)ZX_gcd_all(ch, ZX_deriv(ch), &ch);
++ GEN ch, ai;
++ ai = gadd(gel(T->bas,i), gel(T->bas,j));
++ ch = get_polmin_add2(&d, i, j);
++ update(&ai, &ch, T, orig);
++ gel(y,k) = ch;
++ gel(b,k) = ai; k++;
++
++ ai = gsub(gel(T->bas,i), gel(T->bas,j));
++ ch = get_polmin_sub2(&d, i, j);
++ update(&ai, &ch, T, orig);
++ gel(y,k) = ch;
++ gel(b,k) = ai; k++;
+ }
+- if (ZX_canon_neg(ch) && orig) ai = RgX_neg(ai);
+- if (nfred && degpol(ch) == l-1) return mkvec2(ch, ai);
+- if (DEBUGLEVEL>3) err_printf("polred: generator %Ps\n", ch);
+- if (T->lead != gen_1 && orig) ai = RgX_unscale(ai, ginv(T->lead));
+- gel(y,i) = ch;
+- gel(b,i) = ai;
+- }
++ setlg(y, k);
++ setlg(b, k); filter(y, b, n);
+ if (!orig) return gen_sort_uniq(y, (void*)cmpii, &gen_cmp_RgX);
+ (void)sort_factor_pol(mkmat2(y, b), cmpii);
+ settyp(y, t_COL); return mkmat2(b, y);
+@@ -2089,10 +2181,58 @@
+ {
+ pari_sp av = avma;
+ GEN ro;
+- nfbasic_t T; nfbasic_init(x, flag & (nf_PARTIALFACT|nf_RED), fa, &T);
++ nfbasic_t T; nfbasic_init(x, flag & nf_PARTIALFACT, fa, &T);
+ return gerepilecopy(av, polred_aux(&T, &ro, flag & nf_ORIG));
+ }
+
++/* finds "best" polynomial in polred_aux list, defaulting to T->x if none of
++ * them is primitive. *px is the ZX, characteristic polynomial of *pb, *pdx
++ * its discriminant.
++ * Set *pro = polroots(T->x) [ NOT *px ], in case caller needs it. */
++static void
++polredbest_aux(nfbasic_t *T, GEN *pro, GEN *px, GEN *pdx, GEN *pb)
++{
++ GEN a, v, y, x = T->x, b = pol_x(varn(x)); /* default values */
++ long i, l, n = degpol(x);
++ v = polred_aux(T, pro, nf_ORIG);
++ *pdx = T->dx;
++ y = gel(v,2);
++ a = gel(v,1); l = lg(a);
++ for (i=1; i<l; i++)
++ {
++ GEN yi = gel(y,i);
++ pari_sp av = avma;
++ if (degpol(yi) == n && ZX_is_better(yi,x,pdx)) { x = yi; b = gel(a,i); }
++ else avma = av;
++ }
++ *px = x;
++ *pb = b;
++}
++GEN
++polredbest(GEN x, long flag)
++{
++ pari_sp av = avma;
++ GEN dx, ro, b;
++ long fl;
++ nfbasic_t T;
++ switch(flag)
++ {
++ default: pari_err(talker, "invalid flag in polredbest()");
++ case 0: fl = nf_PARTIALFACT; break;
++ case 1: fl = nf_PARTIALFACT|nf_ORIG; break;
++ }
++ nfbasic_init(x, fl, NULL, &T);
++ polredbest_aux(&T, &ro, &x, &dx, &b);
++ if (flag)
++ {
++ if (x == T.x)
++ b = pol_x(varn(x)); /* no improvement */
++ else
++ b = QXQ_reverse(b, T.x);
++ x = mkvec2(x, mkpolmod(b,x));
++ }
++ return gerepilecopy(av, x);
++}
+ /* FIXME: backward compatibility */
+ GEN
+ polred0(GEN x, long flag, GEN fa)
+@@ -2273,22 +2413,6 @@
+ return bound;
+ }
+
+-static GEN
+-findmindisc(GEN y, GEN *pa)
+-{
+- GEN a = *pa, x = gel(y,1), b = gel(a,1), dx;
+- long i, l = lg(y);
+-
+- if (l == 2) { *pa = b; return x; }
+- dx = ZX_disc(x);
+- for (i = 2; i < l; i++)
+- {
+- GEN yi = gel(y,i);
+- if (ZX_is_better(yi,x,&dx)) { x = yi; b = gel(a,i); }
+- }
+- *pa = b; return x;
+-}
+-
+ /* z "small" minimal polynomial of Mod(a,x), deg z = deg x */
+ static GEN
+ store(GEN x, GEN z, GEN a, nfbasic_t *T, long flag, GEN u)
+@@ -2355,7 +2479,7 @@
+ GEN y, a, u;
+ nfbasic_t T;
+
+- nfbasic_init(x, flag & (nf_PARTIALFACT|nf_RED), NULL, &T);
++ nfbasic_init(x, flag & nf_PARTIALFACT, NULL, &T);
+ x = T.x; vx = varn(x);
+
+ if (degpol(x) == 1)
+diff -ru src/src/functions/number_fields/polredabs b/src/functions/number_fields/polredabs
+--- src/src/functions/number_fields/polredabs 2013-05-06 16:01:57.000000000 +0200
++++ b/src/functions/number_fields/polredabs 2013-05-06 16:47:04.542393431 +0200
+@@ -17,8 +17,8 @@
+ \misctitle{Warning} This routine uses an exponential-time algorithm to
+ enumerate all potential generators, and may be exceedingly slow when the
+ number field has many subfields, hence a lot of elements of small $T_2$-norm.
+- E.g. do not try it on the compositum of many quadratic fields; in that case,
+- use \tet{polred} instead.
++ The function \tet{polredbest} is in general much faster (it runs in
++ polynomial time), and tends to return polynomials with smaller discriminants.
+
+ The binary digits of $\fl$ mean
+
+@@ -38,6 +38,15 @@
+ (has at most one large prime factor not in the \kbd{addprimes} table), the
+ result is the same.
+
++ \bprog
++ ? T = x^16 - 136*x^14 + 6476*x^12 - 141912*x^10 + 1513334*x^8 - 7453176*x^6 + 13950764*x^4 - 5596840*x^2 + 46225
++ ? T1 = polredabs(T); T2 = polredbest(T);
++ ? [ norml2(polroots(T1)), norml2(polroots(T2)) ]
++ %3 = [88.0000000, 120.000000]
++ ? [ sizedigit(poldisc(T1)), sizedigit(poldisc(T2)) ]
++ %4 = [75, 67]
++ @eprog
++
+ Variant: Instead of the above hardcoded numerical flags, one should use an
+ or-ed combination of
+
+diff -ruN src/src/functions/number_fields/polredbest b/src/functions/number_fields/polredbest
+--- src/src/functions/number_fields/polredbest 1970-01-01 01:00:00.000000000 +0100
++++ b/src/functions/number_fields/polredbest 2013-01-31 14:49:05.547513332 +0100
+@@ -0,0 +1,21 @@
++Function: polredbest
++Section: number_fields
++C-Name: polredbest
++Prototype: GD0,L,
++Help: polredbest(T,{flag=0}): reduction of the polynomial T (gives minimal
++ polynomials only). If flag=1, gives also elements.
++Doc: finds a polynomial with reasonably
++ small coefficients defining the same number field as $T$.
++ All $T$ accepted by \tet{nfinit} are also allowed here (e.g. non-monic
++ polynomials, \kbd{nf}, \kbd{bnf}, \kbd{[T,Z\_K\_basis]}). Contrary to
++ \tet{polredabs}, this routine runs in polynomial time, but it offers no
++ guarantee as to the minimality of its result.
++
++ If $\fl = 1$: outputs a two-component row vector $[P,a]$, where $P$ is the
++ default output and \kbd{Mod(a, P)} is a root of the original $T$.
++ \bprog
++ ? polredbest(x^4 + 8, 1)
++ %1 = [x^4 + 2, Mod(x^3, x^4 + 2)]
++ ? charpoly(%[2])
++ %2 = x^4 + 8
++ @eprog
+diff -ruN src/src/headers/paridecl.h b/src/headers/paridecl.h
+--- src/src/headers/paridecl.h 2012-09-25 23:10:47.000000000 +0200
++++ b/src/headers/paridecl.h 2013-01-31 14:49:05.557525771 +0100
+@@ -889,6 +889,7 @@
+ GEN polredabs0(GEN x, long flag);
+ GEN polredabs2(GEN x);
+ GEN polredabsall(GEN x, long flun);
++GEN polredbest(GEN x, long flag);
+ GEN smallpolred(GEN x);
+ GEN smallpolred2(GEN x);
+ GEN tschirnhaus(GEN x);
+diff -ru src/src/test/32/compat b/src/test/32/compat
+--- src/src/test/32/compat 2013-05-06 16:01:57.000000000 +0200
++++ b/src/test/32/compat 2013-05-06 16:47:04.542393431 +0200
+@@ -787,13 +787,9 @@
+ ? factoreddiscf(p,fa)
+ 136866601
+ ? factoredpolred(p,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? factoredpolred2(p,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? factornf(x^3+x^2-2*x-1,t^3+t^2-2*t-1)
+
+ [x + mod(-t, t^3 + t^2 - 2*t - 1) 1]
+@@ -904,7 +900,7 @@
+ ? gcd(12345678,87654321)
+ 9
+ ? getheap()
+-[208, 45748]
++[208, 45584]
+ ? getrand()
+ Vecsmall([1220248512, -582244995, 485580680, -1643185972, -2103930341, -9694
+ 07356, 336208700, 1439513079, -1910826353, -2042699820, 222745475, 183991374
+@@ -2014,7 +2010,7 @@
+ ? orderell(tcurve,[1,2])
+ 6
+ ? ordred(x^3-12*x+45*x-1)
+-[x - 1, x^3 - 363*x - 2663, x^3 + 33*x - 1]
++[x - 1, x^3 + 33*x - 1]
+ ? padicprec(padicno,127)
+ 5
+ ? pascal(8)
+@@ -2093,15 +2089,16 @@
+ ? polint([0,2,3],[0,4,9],5)
+ 25
+ ? polred(x^5-2*x^4-4*x^3-96*x^2-352*x-568)
+-[x - 1, x^5 - x^4 - 6*x^3 + 6*x^2 + 13*x - 5, x^5 - x^4 + 2*x^3 - 4*x^2 + x
+-- 1, x^5 - x^4 + 4*x^3 - 2*x^2 + x - 1, x^5 + 4*x^3 - 4*x^2 + 8*x - 8]
++[x - 1, x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1]
+ ? polred2(x^4-28*x^3-458*x^2+9156*x-25321)
+
+ [1 x - 1]
+
+-[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
++[1/115*x^2 - 14/115*x - 212/115 x^2 - 2*x - 9]
++
++[-1/115*x^2 + 14/115*x + 442/115 x^2 - 2*x - 9]
+
+-[2/897*x^3 - 14/299*x^2 - 1171/897*x + 9569/897 x^4 - 32*x^2 + 6]
++[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
+
+ [1/4485*x^3 - 7/1495*x^2 - 1034/4485*x + 7924/4485 x^4 - 8*x^2 + 6]
+
+@@ -2454,13 +2451,21 @@
+ ? smallinitell([0,0,0,-17,0])
+ [0, 0, 0, -17, 0, 0, -34, 0, -289, 816, 0, 314432, 1728]
+ ? smallpolred(x^4+576)
+-[x - 1, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
++[x - 1, x^2 - 3*x + 3, x^2 - 2*x + 2, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
+ ? smallpolred2(x^4+576)
+
+ [1 x - 1]
+
++[-1/192*x^3 - 1/8*x + 3/2 x^2 - 3*x + 3]
++
++[1/24*x^2 + 1 x^2 - 2*x + 2]
++
++[-1/24*x^2 + 1 x^2 - 2*x + 2]
++
+ [-1/192*x^3 - 1/8*x + 1/2 x^2 - x + 1]
+
++[1/192*x^3 + 1/8*x + 1/2 x^2 - x + 1]
++
+ [1/24*x^2 x^2 + 1]
+
+ [1/192*x^3 + 1/48*x^2 - 1/8*x x^4 - x^2 + 1]
+@@ -2650,6 +2655,6 @@
+ ? getstack()
+ 104
+ ? getheap()
+-[599, 110982]
++[599, 110954]
+ ? print("Total time spent: ",gettime);
+-Total time spent: 236
++Total time spent: 140
+diff -ru src/src/test/32/nfields b/src/test/32/nfields
+--- src/src/test/32/nfields 2013-05-06 16:01:57.000000000 +0200
++++ b/src/test/32/nfields 2013-05-06 16:47:04.542393431 +0200
+@@ -926,45 +926,50 @@
+ ? polgalois(x^6-3*x^2-1)
+ [12, 1, 1, "A_4(6) = [2^2]3"]
+ ? polred(x^5-2*x^4-4*x^3-96*x^2-352*x-568)
+-[x - 1, x^5 - x^4 - 6*x^3 + 6*x^2 + 13*x - 5, x^5 - x^4 + 2*x^3 - 4*x^2 + x
+-- 1, x^5 - x^4 + 4*x^3 - 2*x^2 + x - 1, x^5 + 4*x^3 - 4*x^2 + 8*x - 8]
++[x - 1, x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1]
+ ? polred(x^4-28*x^3-458*x^2+9156*x-25321,3)
+
+ [1 x - 1]
+
+-[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
++[1/115*x^2 - 14/115*x - 212/115 x^2 - 2*x - 9]
++
++[-1/115*x^2 + 14/115*x + 442/115 x^2 - 2*x - 9]
+
+-[2/897*x^3 - 14/299*x^2 - 1171/897*x + 9569/897 x^4 - 32*x^2 + 6]
++[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
+
+ [1/4485*x^3 - 7/1495*x^2 - 1034/4485*x + 7924/4485 x^4 - 8*x^2 + 6]
+
+ ? polred(x^4+576,1)
+-[x - 1, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
++[x - 1, x^2 - 3*x + 3, x^2 - 2*x + 2, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
+ ? polred(x^4+576,3)
+
+ [1 x - 1]
+
++[-1/192*x^3 - 1/8*x + 3/2 x^2 - 3*x + 3]
++
++[1/24*x^2 + 1 x^2 - 2*x + 2]
++
++[-1/24*x^2 + 1 x^2 - 2*x + 2]
++
+ [-1/192*x^3 - 1/8*x + 1/2 x^2 - x + 1]
+
++[1/192*x^3 + 1/8*x + 1/2 x^2 - x + 1]
++
+ [1/24*x^2 x^2 + 1]
+
+ [1/192*x^3 + 1/48*x^2 - 1/8*x x^4 - x^2 + 1]
+
+ ? polred(p2,0,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? polred(p2,1,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? polredabs(x^5-2*x^4-4*x^3-96*x^2-352*x-568)
+ x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1
+ ? polredabs(x^5-2*x^4-4*x^3-96*x^2-352*x-568,1)
+ [x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1, Mod(2*x^4 - x^3 + 3*x^2 - 3*x - 1, x^5 -
+ x^4 + 2*x^3 - 4*x^2 + x - 1)]
+ ? polredord(x^3-12*x+45*x-1)
+-[x - 1, x^3 - 363*x - 2663, x^3 + 33*x - 1]
++[x - 1, x^3 + 33*x - 1]
+ ? polsubcyclo(31,5)
+ x^5 + x^4 - 12*x^3 - 21*x^2 + x + 5
+ ? setrand(1);poltschirnhaus(x^5-x-1)
+@@ -1028,6 +1033,6 @@
+ ? sizebyte(%)
+ 152
+ ? getheap
+-[175, 113027]
++[175, 112999]
+ ? print("Total time spent: ",gettime);
+-Total time spent: 116
++Total time spent: 76
+diff -ru src/src/test/64/compat b/src/test/64/compat
+--- src/src/test/64/compat 2013-05-06 16:01:58.000000000 +0200
++++ b/src/test/64/compat 2013-05-06 16:47:04.542393431 +0200
+@@ -789,13 +789,9 @@
+ ? factoreddiscf(p,fa)
+ 136866601
+ ? factoredpolred(p,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? factoredpolred2(p,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? factornf(x^3+x^2-2*x-1,t^3+t^2-2*t-1)
+
+ [x + mod(-t, t^3 + t^2 - 2*t - 1) 1]
+@@ -906,7 +902,7 @@
+ ? gcd(12345678,87654321)
+ 9
+ ? getheap()
+-[208, 44472]
++[208, 44308]
+ ? getrand()
+ Vecsmall([-696235626332558091, -7363039021536514678, -3123062006620239999, -
+ 2510915082749224356, -5278885121447018503, 8033304491650294704, 333461878925
+@@ -2014,7 +2010,7 @@
+ ? orderell(tcurve,[1,2])
+ 6
+ ? ordred(x^3-12*x+45*x-1)
+-[x - 1, x^3 - 363*x - 2663, x^3 + 33*x - 1]
++[x - 1, x^3 + 33*x - 1]
+ ? padicprec(padicno,127)
+ 5
+ ? pascal(8)
+@@ -2093,15 +2089,16 @@
+ ? polint([0,2,3],[0,4,9],5)
+ 25
+ ? polred(x^5-2*x^4-4*x^3-96*x^2-352*x-568)
+-[x - 1, x^5 - x^4 - 6*x^3 + 6*x^2 + 13*x - 5, x^5 - x^4 + 2*x^3 - 4*x^2 + x
+-- 1, x^5 - x^4 + 4*x^3 - 2*x^2 + x - 1, x^5 + 4*x^3 - 4*x^2 + 8*x - 8]
++[x - 1, x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1]
+ ? polred2(x^4-28*x^3-458*x^2+9156*x-25321)
+
+ [1 x - 1]
+
+-[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
++[1/115*x^2 - 14/115*x - 212/115 x^2 - 2*x - 9]
++
++[-1/115*x^2 + 14/115*x + 442/115 x^2 - 2*x - 9]
+
+-[2/897*x^3 - 14/299*x^2 - 1171/897*x + 9569/897 x^4 - 32*x^2 + 6]
++[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
+
+ [1/4485*x^3 - 7/1495*x^2 - 1034/4485*x + 7924/4485 x^4 - 8*x^2 + 6]
+
+@@ -2454,13 +2451,21 @@
+ ? smallinitell([0,0,0,-17,0])
+ [0, 0, 0, -17, 0, 0, -34, 0, -289, 816, 0, 314432, 1728]
+ ? smallpolred(x^4+576)
+-[x - 1, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
++[x - 1, x^2 - 3*x + 3, x^2 - 2*x + 2, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
+ ? smallpolred2(x^4+576)
+
+ [1 x - 1]
+
++[-1/192*x^3 - 1/8*x + 3/2 x^2 - 3*x + 3]
++
++[1/24*x^2 + 1 x^2 - 2*x + 2]
++
++[-1/24*x^2 + 1 x^2 - 2*x + 2]
++
+ [-1/192*x^3 - 1/8*x + 1/2 x^2 - x + 1]
+
++[1/192*x^3 + 1/8*x + 1/2 x^2 - x + 1]
++
+ [1/24*x^2 x^2 + 1]
+
+ [1/192*x^3 + 1/48*x^2 - 1/8*x x^4 - x^2 + 1]
+@@ -2649,6 +2654,6 @@
+ ? getstack()
+ 200
+ ? getheap()
+-[599, 100048]
++[599, 100020]
+ ? print("Total time spent: ",gettime);
+-Total time spent: 152
++Total time spent: 180
+diff -ru src/src/test/64/nfields b/src/test/64/nfields
+--- src/src/test/64/nfields 2013-05-06 16:01:58.000000000 +0200
++++ b/src/test/64/nfields 2013-05-06 16:47:04.542393431 +0200
+@@ -928,45 +928,50 @@
+ ? polgalois(x^6-3*x^2-1)
+ [12, 1, 1, "A_4(6) = [2^2]3"]
+ ? polred(x^5-2*x^4-4*x^3-96*x^2-352*x-568)
+-[x - 1, x^5 - x^4 - 6*x^3 + 6*x^2 + 13*x - 5, x^5 - x^4 + 2*x^3 - 4*x^2 + x
+-- 1, x^5 - x^4 + 4*x^3 - 2*x^2 + x - 1, x^5 + 4*x^3 - 4*x^2 + 8*x - 8]
++[x - 1, x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1]
+ ? polred(x^4-28*x^3-458*x^2+9156*x-25321,3)
+
+ [1 x - 1]
+
+-[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
++[1/115*x^2 - 14/115*x - 212/115 x^2 - 2*x - 9]
++
++[-1/115*x^2 + 14/115*x + 442/115 x^2 - 2*x - 9]
+
+-[2/897*x^3 - 14/299*x^2 - 1171/897*x + 9569/897 x^4 - 32*x^2 + 6]
++[1/115*x^2 - 14/115*x - 327/115 x^2 - 10]
+
+ [1/4485*x^3 - 7/1495*x^2 - 1034/4485*x + 7924/4485 x^4 - 8*x^2 + 6]
+
+ ? polred(x^4+576,1)
+-[x - 1, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
++[x - 1, x^2 - 3*x + 3, x^2 - 2*x + 2, x^2 - x + 1, x^2 + 1, x^4 - x^2 + 1]
+ ? polred(x^4+576,3)
+
+ [1 x - 1]
+
++[-1/192*x^3 - 1/8*x + 3/2 x^2 - 3*x + 3]
++
++[1/24*x^2 + 1 x^2 - 2*x + 2]
++
++[-1/24*x^2 + 1 x^2 - 2*x + 2]
++
+ [-1/192*x^3 - 1/8*x + 1/2 x^2 - x + 1]
+
++[1/192*x^3 + 1/8*x + 1/2 x^2 - x + 1]
++
+ [1/24*x^2 x^2 + 1]
+
+ [1/192*x^3 + 1/48*x^2 - 1/8*x x^4 - x^2 + 1]
+
+ ? polred(p2,0,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? polred(p2,1,fa)
+-[x - 1, x^5 - 2*x^4 - 62*x^3 + 85*x^2 + 818*x + 1, x^5 - 2*x^4 - 53*x^3 - 46
+-*x^2 + 508*x + 913, x^5 - 2*x^4 - 13*x^3 + 37*x^2 - 21*x - 1, x^5 - x^4 - 52
+-*x^3 - 197*x^2 - 273*x - 127]
++[x - 1, x^5 - 80*x^3 - 223*x^2 + 800*x + 2671]
+ ? polredabs(x^5-2*x^4-4*x^3-96*x^2-352*x-568)
+ x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1
+ ? polredabs(x^5-2*x^4-4*x^3-96*x^2-352*x-568,1)
+ [x^5 - x^4 + 2*x^3 - 4*x^2 + x - 1, Mod(2*x^4 - x^3 + 3*x^2 - 3*x - 1, x^5 -
+ x^4 + 2*x^3 - 4*x^2 + x - 1)]
+ ? polredord(x^3-12*x+45*x-1)
+-[x - 1, x^3 - 363*x - 2663, x^3 + 33*x - 1]
++[x - 1, x^3 + 33*x - 1]
+ ? polsubcyclo(31,5)
+ x^5 + x^4 - 12*x^3 - 21*x^2 + x + 5
+ ? setrand(1);poltschirnhaus(x^5-x-1)
+@@ -1030,6 +1035,6 @@
+ ? sizebyte(%)
+ 288
+ ? getheap
+-[175, 102929]
++[175, 102901]
+ ? print("Total time spent: ",gettime);
+-Total time spent: 84
++Total time spent: 110
diff --git a/sci-mathematics/pari/files/pari-2.5.4-slow_determinant.patch b/sci-mathematics/pari/files/pari-2.5.4-slow_determinant.patch
new file mode 100644
index 000000000000..14833da62709
--- /dev/null
+++ b/sci-mathematics/pari/files/pari-2.5.4-slow_determinant.patch
@@ -0,0 +1,100 @@
+diff -ru src/src/basemath/alglin1.c b/src/basemath/alglin1.c
+--- src/src/basemath/alglin1.c 2012-09-25 23:10:46.000000000 +0200
++++ b/src/basemath/alglin1.c 2013-01-03 13:56:55.487513420 +0100
+@@ -2969,6 +2969,21 @@
+ return NULL; /* not reached */
+ }
+
++/* A a 2x2 matrix
++ returns the determinant of A computed by the simple formula
++*/
++static GEN
++det2x2(GEN A)
++{
++ pari_sp av = avma;
++ GEN a = gcoeff(A, 1, 1),
++ b = gcoeff(A, 1, 2),
++ c = gcoeff(A, 2, 1),
++ d = gcoeff(A, 2, 2);
++ return gerepileupto(av, gsub(gmul(a, d), gmul(b, c)));
++}
++
++
+ static GEN
+ det_simple_gauss(GEN a, GEN data, pivot_fun pivot)
+ {
+@@ -3021,6 +3036,7 @@
+ if (typ(a)!=t_MAT) pari_err(mattype1,"det2");
+ if (!nbco) return gen_1;
+ if (nbco != lg(a[1])-1) pari_err(mattype1,"det2");
++ if (nbco == 2) return det2x2 (a);
+ pivot = get_pivot_fun(a, &data);
+ return det_simple_gauss(a, data, pivot);
+ }
+@@ -3158,11 +3174,7 @@
+ {
+ case 0: return gen_1;
+ case 1: return gcopy(gcoeff(M,1,1));
+- case 2: {
+- GEN a = gcoeff(M,1,1), b = gcoeff(M,1,2);
+- GEN c = gcoeff(M,2,1), d = gcoeff(M,2,2);
+- return gerepileupto(av, gsub(gmul(a,d), gmul(b,c)));
+- }
++ case 2: return det2x2(M);
+ }
+ if (max > ((n+2)>>1)) max = (n+2)>>1;
+ for (j = 1; j <= n; j++)
+@@ -3193,9 +3205,10 @@
+ }
+ if (best_row)
+ {
++ double d = lbest-1;
+ GEN s = NULL;
+ long k;
+- bound /= (lbest-1);
++ bound /= d*d*d;
+ for (k = 1; k < lbest; k++)
+ {
+ GEN c = coeff_det(M, best_row, best[k], max, bound);
+@@ -3205,9 +3218,10 @@
+ }
+ if (best_col)
+ {
++ double d = lbest-1;
+ GEN s = NULL;
+ long k;
+- bound /= (lbest-1);
++ bound /= d*d*d;
+ for (k = 1; k < lbest; k++)
+ {
+ GEN c = coeff_det(M, best[k], best_col, max, bound);
+@@ -3230,15 +3244,24 @@
+ if (!n) return gen_1;
+ if (n != lg(a[1])-1) pari_err(mattype1,"det");
+ if (n == 1) return gcopy(gcoeff(a,1,1));
+- if (RgM_is_FpM(a, &p) && p)
++ if (RgM_is_FpM(a, &p))
+ {
+- pari_sp av = avma;
+- return gerepilecopy(av, Fp_to_mod(FpM_det(RgM_to_FpM(a, p), p), p));
++ pari_sp av;
++ if (!p)
++ { /* ZM */
++ return det_simple_gauss(a, NULL, &gauss_get_pivot_NZ);
++ }
++ else
++ { /* FpM */
++ av = avma;
++ return gerepilecopy(av, Fp_to_mod(FpM_det(RgM_to_FpM(a, p), p), p));
++ }
+ }
++ if (n == 2) return det2x2 (a);
+ pivot = get_pivot_fun(a, &data);
+ if (pivot != gauss_get_pivot_NZ) return det_simple_gauss(a, data, pivot);
+- B = (double)n; B = B*B; B = B*B;
+- return det_develop(a, 7, B);
++ B = (double)n;
++ return det_develop(a, 7, B*B*B);
+ }
+
+
diff --git a/sci-mathematics/pari/pari-2.5.4.ebuild b/sci-mathematics/pari/pari-2.5.4.ebuild
new file mode 100644
index 000000000000..71f409bc2c6c
--- /dev/null
+++ b/sci-mathematics/pari/pari-2.5.4.ebuild
@@ -0,0 +1,144 @@
+# Copyright 1999-2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sci-mathematics/pari/pari-2.5.4.ebuild,v 1.1 2013/06/11 17:33:11 bicatali Exp $
+
+EAPI=5
+
+inherit eutils flag-o-matic toolchain-funcs multilib
+
+DESCRIPTION="Computer-aided number theory C library and tools"
+HOMEPAGE="http://pari.math.u-bordeaux.fr/"
+SRC_URI="http://pari.math.u-bordeaux.fr/pub/${PN}/unix/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~hppa ~mips ~ppc ~ppc64 ~sparc ~x86 ~amd64-linux ~x86-fbsd ~x86-linux ~x86-macos ~x86-solaris"
+IUSE="data doc fltk gmp qt4 X"
+
+RDEPEND="
+ sys-libs/readline
+ data? ( sci-mathematics/pari-data )
+ doc? ( X? ( x11-misc/xdg-utils ) )
+ fltk? ( x11-libs/fltk:1 )
+ gmp? ( dev-libs/gmp )
+ qt4? ( dev-qt/qtgui:4 )
+ X? ( x11-libs/libX11 )"
+DEPEND="${RDEPEND}
+ doc? ( virtual/latex-base )"
+
+get_compile_dir() {
+ pushd "${S}/config" > /dev/null
+ local fastread=yes
+ source ./get_archos
+ popd > /dev/null
+ echo "O${osname}-${arch}"
+}
+
+src_prepare() {
+ epatch "${FILESDIR}"/${PN}-2.3.2-strip.patch
+ epatch "${FILESDIR}"/${PN}-2.3.2-ppc-powerpc-arch-fix.patch
+ # fix parallel make
+ epatch "${FILESDIR}"/${PN}-2.5.0-doc-make.patch
+ # sage error handling patch
+ epatch "${FILESDIR}"/${PN}-2.5.0-mp.c.patch
+ # OS X: add -install_name to the linker option
+ epatch "${FILESDIR}"/${PN}-2.5.0-macos.patch
+ # fix automagic
+ epatch "${FILESDIR}"/${PN}-2.5.1-no-automagic.patch
+ # sage-on-gentoo trac 13902: Slowdown for PARI integer determinant
+ epatch "${FILESDIR}"/${PN}-2.5.4-slow_determinant.patch
+ # sage-on-gentoo trac 13054: polred bug / pari bug 1395
+ epatch "${FILESDIR}"/${PN}-2.5.4-polred.patch
+
+ # disable default building of docs during install
+ sed -i \
+ -e "s:install-doc install-examples:install-examples:" \
+ config/Makefile.SH || die "Failed to fix makefile"
+
+ # propagate ldflags
+ sed -i \
+ -e 's/$shared $extra/$shared $extra \\$(LDFLAGS)/' \
+ config/get_dlld || die "failed to fix LDFLAGS"
+ # move doc dir to a gentoo doc dir and replace acroread by xdg-open
+ sed -i \
+ -e "s:\$d = \$0:\$d = '${EPREFIX}/usr/share/doc/${PF}':" \
+ -e 's:"acroread":"xdg-open":' \
+ doc/gphelp.in || die "Failed to fix doc dir"
+
+ sed -i "s:/\(usr\|lib64\):${EPREFIX}/\1:g" \
+ config/get_{Qt,X11,include_path,libpth} \
+ || die "Failed to fix get_X11"
+
+ # usersch3.tex is generated
+ rm doc/usersch3.tex || die "failed to remove generated file"
+}
+
+src_configure() {
+ tc-export CC
+ export CPLUSPLUS=$(tc-getCXX)
+
+ # need to force optimization here, as it breaks without
+ if is-flag -O0; then
+ replace-flags -O0 -O2
+ elif ! is-flag -O?; then
+ append-flags -O2
+ fi
+
+ # sysdatadir installs a pari.cfg stuff which is informative only
+ ./Configure \
+ --prefix="${EPREFIX}"/usr \
+ --datadir="${EPREFIX}"/usr/share/${PN} \
+ --libdir="${EPREFIX}"/usr/$(get_libdir) \
+ --sysdatadir="${EPREFIX}"/usr/share/doc/${PF} \
+ --mandir="${EPREFIX}"/usr/share/man/man1 \
+ --with-readline="${EPREFIX}"/usr \
+ --with-ncurses-lib="${EPREFIX}"/usr/$(get_libdir) \
+ $(use_with fltk) \
+ $(use_with gmp) \
+ $(use_with qt4 qt) \
+ || die "./Configure failed"
+}
+
+src_compile() {
+ use hppa && \
+ mymake=DLLD\="${EPREFIX}"/usr/bin/gcc\ DLLDFLAGS\=-shared\ -Wl,-soname=\$\(LIBPARI_SONAME\)\ -lm
+
+ mycxxmake=LD\=$(tc-getCXX)
+
+ local installdir=$(get_compile_dir)
+ cd "${installdir}" || die "failed to change directory"
+ # upstream set -fno-strict-aliasing.
+ # aliasing is a known issue on amd64, work on x86 by sheer luck
+ emake ${mymake} \
+ CFLAGS="${CFLAGS} -fno-strict-aliasing -DGCC_INLINE -fPIC" lib-dyn
+ emake ${mymake} ${mycxxmake} \
+ CFLAGS="${CFLAGS} -DGCC_INLINE" gp ../gp
+
+ if use doc; then
+ cd "${S}" || die "failed to change directory"
+ # To prevent sandbox violations by metafont
+ VARTEXFONTS="${T}"/fonts emake docpdf
+ fi
+}
+
+src_test() {
+ emake dobench
+}
+
+src_install() {
+ emake ${mymake} ${mycxxmake} DESTDIR="${D}" install
+ dodoc MACHINES COMPAT
+ if use doc; then
+ # install gphelp and the pdf documentations manually.
+ # the install-doc target is overkill.
+ dodoc doc/*.pdf
+ dobin doc/gphelp
+ insinto /usr/share/doc/${PF}
+ # gphelp looks for some of the tex sources...
+ doins doc/*.tex doc/translations
+ # Install the examples - for real.
+ local installdir=$(get_compile_dir)
+ cd "${installdir}" || die "failed to change directory"
+ emake EXDIR="${ED}/usr/share/doc/${PF}/examples" install-examples
+ fi
+}