Karim Belabas on Mon, 01 Mar 2004 22:21:59 +0100


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

Re: bnfsunit


[ following-up to the list after a private discussion with Olivier ]

* Olivier Wittenberg [2004-03-01 15:36]:
>> bnfsunit's first argument is a bnf. When you get this message, just make sure
>> that this bnf contains fundamental units. E.g
>> 
>>   bnf = bnfinit(pol, 1);
>>   bnfsunit(bnf, S)

[ Olivier sent me this simple example (slightly edited), which does not work:]

> ------------------------------------------------------------
> g = x^5 + 1291*x^4 + 5*x^3 - 1723*x^2 - 3894*x + 13824;
> 
> foo(s) =
> {
>   local(sp, k, t);
> 
>   k = bnfinit(g, 1);
> 
>   sp = [];
>   for (i = 1, length(s),
>     t = idealprimedec(k, s[i]);
>     sp = concat(sp, t));
> 
>   bnfsunit(k, sp)[1];
> }
> 
> foo([2]);
> ------------------------------------------------------------

OK, this is a bug according to the documentation. It is impossible to compute
fundamental units in this example: k.reg ~ 1.1e13. This is the determinant 
of the matrix of logarithmic embeddings, and one must compute the
exponentials of its entries (then do exact computations with about that
accuracy...). Unfeasible.

So bnfinit(,1) can't work in this example. Instead of entering an infinite
loop (as the stable version would), it returns without the requested units.

I have changed this in CVS so that bnfinit(,1) raises an explicit error

  ***   bnfinit: fundamental units too large.


An idea that _might_ work in other examples (in this one, it doesn't): you
can't increase the precision but you may compute the initial bnf at a higher
accuracy, and it might be enough.

Check out the behaviour at \g2 or higher. You'll get to see something like

  ***   Warning: precision too low for generators, e = 620323.

e is more or less the _extra_ bit accuracy required to get a result. (No hope
in this case.) You want to try it at a few different accuracies, just in case
you get a bogus indication the first time because of catastrophic loss of
accuracy (it shouldn't happen, but...).

    Karim.

P.S: Btw, you may write the loop building sp as

  sp = concat( vector(#s, i, idealprimedec(k, s[i])) );
-- 
Karim Belabas                     Tel: (+33) (0)1 69 15 57 48
Dep. de Mathematiques, Bat. 425   Fax: (+33) (0)1 69 15 60 19
Universite Paris-Sud              http://www.math.u-psud.fr/~belabas/ 
F-91405 Orsay (France)            http://pari.math.u-bordeaux.fr/  [PARI/GP]