You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
755 lines
23 KiB
755 lines
23 KiB
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
|