Karim Belabas on Fri, 23 Feb 2024 15:14:33 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: bnfisintnorm() is eager for memory |
Hi Max, it's easy from the representation I described: y = \prod {y_i}^{e_i}. - Embed K into R using x -> ±sqrt(2305843005992468481), you get the two real embeddings of y by embedding all y_i and performing floating point computations; from this, you can compute y as a t_POLMOD with floating point coefficients. This is stable since only multiplications are involved (but exponents may overflow; one can compute with logarithmic embeddings to avoid the problem, this time taking into account cancellations that occur when adding logs). You then know for sure whether that y has "small enough" coefficients - When a y is "small enough", you can round it (taking into account a potential denominator 2). Or alternatively expand it mod p for any given largish prime p (say larger than twice your bound): it's guaranteed that the norm of y_i is supported on small primes; so for any larger p there is no issue of (y_i mod p) not being invertible; then centerlift the result multiplied by 2. That gives an independent check of the floating point computation, but it's not really relevant since one can always check whether a (small!) result is correct. The only problem is to get the bnfisintnorm function to output y in this form: I can add an optional flag to bnfisintnorm to allow this. It's a 5 minutes job. Cheers, K.B. * Max Alekseyev [2024-02-23 13:59]: > Hi Karim, > Thank you for the analysis. > What if I look for solutions where at least one of the coefficients is > below 10^16 by absolute value? Is there a shortcut to get those or > establish that there are none? > Regards, > Max > > On Fri, Feb 23, 2024 at 4:52 AM Karim Belabas < > Karim.Belabas@math.u-bordeaux.fr> wrote: > > > * Max Alekseyev [2024-02-23 02:21]: > > > In the following example, bnfisintnorm() runs out of memory even with a > > > 32GB stack. Is there a way to overcome this? > > > > > > ? b = bnfinit('x^2-2305843005992468481,1) > > > ? bnfisintnorm(b,2305843008139952128) > > > > Not really with the current specification for the function. One could > > easily obtain the solutions as "algebraic numbers in factored form", but > > have > > a look at the simplest such solution 'y', attached to this mail: > > > > ? nfeltnorm(b, y) > > %1 = 2305843008139952128 > > > > y is given by a factorization matrix, corresponding to an expression > > \prod_i {y_i}^{e_i}, where the y_i are small algebraic integers and the > > e_i are (positive or negative) integers. > > > > Check the exponents y[,2]: its a vector with length 151 and sup-norm > > 5345503542932135311077290. > > > > It's (relatively) easy to get all solutions in this form, with exponents > > e_i of that magnitude. It's a completely explicit and well defined > > expression, but no hope of expanding that as the expected t_POLMOD. > > > > A related difficulty: b.fu has a hard time finishing as well, about 2 > > minutes. The result has coefficients about exp(b.reg) ~ 10^6103581 > > and requires about 5 MB of storage (more than 5 times the size of the > > original full bnf, which contains the same data in factored form and is > > computed in 0.1 s). > > > > Cheers, > > > > K.B. > > -- > > Pr. Karim Belabas, U. Bordeaux, Vice-président en charge du Numérique > > Institut de Mathématiques de Bordeaux UMR 5251 - (+33) 05 40 00 29 77 > > http://www.math.u-bordeaux.fr/~kbelabas/ > > K.B. -- Pr. Karim Belabas, U. Bordeaux, Vice-président en charge du Numérique Institut de Mathématiques de Bordeaux UMR 5251 - (+33) 05 40 00 29 77 http://www.math.u-bordeaux.fr/~kbelabas/