Karim Belabas on Fri, 27 Jun 2025 12:31:13 +0200


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

Re: question on converting a decimal back into an algebraic number


Hi Radall,

* American Citizen [2025-06-27 10:14]:
> This is a question about moving points on an elliptic curve from reals to a
> number field, and from a number field to reals (which uses a subst and a
> lift)
> 
> I can do a subst(lift) command on an algebraic number to find a decimal
> value
> 
> Example:
> 
> Mod(-1156/4489*x + 24633/4489, x^2 - 290), Mod(387549/300763*x -
> 11978472/300763, x^2 - 290)]
> 
> lifts* under the nf (x^2-290) to
> 
> [x,y] = [1.1020337181976119964245667123185152487,
> -17.883683642175364504497552094101227420]

This is not well-defined a priori: a number field L has (exactly) [L:Q]
complex embeddings; you need to specify your choice of embedding.
Nothing I write below is specific to the reals, you can just as well
use complex numbers if your number field doesn't have a real embedding.

I advise to create an 'nf' structure then use the high level functions.
In your case, 'nfeltembed' and approximate complex embeddings.

In general, if T is the polynomial defining your number field (integral,
irreducible, monic), and nf = nfinit(T), the embeddings are associated
to the complex roots of T, or nf.roots

\\ your data
  nf = nfinit(x^2 - 290);
  a = Mod(-1156/4489*x + 24633/4489, x^2 - 290)

? nf.roots
%2 = [-17.029386365926401166133321823877322706, 17.029386365926401166133321823877322706]

?  nfeltembed(nf, a)
%1 = [9.8727936375609088322677923877037614276, 1.1020337181976119964245667123185152487]

There are two (real) embeddings and you chose the 2nd one, attached to the
second root nf.roots[2].

\\ restricting to the 2nd embedding
?  nfeltembed(nf, a, 2)
%2 = 1.1020337181976119964245667123185152487

\\ low level alternative (don't do that):
? subst(lift(a), 'x, nf.roots[2])
%3 = 1.1020337181976119964245667123185152487


> But how do I go the reverse direction? This question is 2 parts. The first
> is if I know the nf polynomial, x^2 - 290, and I suspect it is easy to find
> the algebraic number. But the second part of the question is if I don't know
> the algebraic field.

[...]

> Suppose I have a decimal value for a point
> 
> [48.524409093877418991299749586199724677,
> -358.16199519959579719705531742590169930]
> 
> How do I recover
> 
> [Mod(x^2 - 3, x^4 - 1752*x^2 + 87616), Mod(-591/592*x^3 + 57/37*x, x^4 -
> 1752*x^2 + 87616)]

I'm answering the first question. It's not "easy" and it can fail.

\\ Your data :
  T = x^4 - 1752*x^2 + 87616;
  nf = nfinit(T);
  P = [48.524409093877418991299749586199724677, \
       -358.16199519959579719705531742590169930];

\\ we now have a quartic field and 4 embeddings
? nf.roots 
%4 = [-41.236823239746809829774803782284534820, -7.1780505078940074975081601345298894069, 7.1780505078940074975081601345298894069, 41.236823239746809829774803782284534820]

Here's a naive solution with lindep, using the first embedding by default:

nfrecognize(nf, z, j = 1) = 
{
  my(M = Mat(apply(conjvec, Mod(nf.zk, nf.pol))));
  \\ N.B. we actually have M = nf[5][1]
  my(L = lindep(concat(nf[5][1][j,], z)));
  my(a = L[#L]);
  if (abs(a) != 1, error("Failed to recognize ", z));
  if (a == 1, L = -L);
  nfbasistoalg(nf, L[1..-2]);
}

\\ using the default (= first) embedding; not what you expected.
? nfrecognize(nf, P[1])
%5 = Mod(-x^2 + 1749, x^4 - 1752*x^2 + 87616)
? nfrecognize(nf, P[2])
%6 = Mod(-3495/592*x^3 + 371769/37*x, x^4 - 1752*x^2 + 87616)
? nfrecognize(nf, Pi) \\ Good.
  ***   user error: Failed to recognize 3.1415926535897932384626433832795028842

? apply(z->nfrecognize(nf,z), P)
%7 = [Mod(-x^2 + 1749, x^4 - 1752*x^2 + 87616), Mod(-3495/592*x^3 + 371769/37*x, x^4 - 1752*x^2 + 87616)]

\\ using the second embedding
? apply(z->nfrecognize(nf,z,2), P)
%8 = [Mod(x^2 - 3, x^4 - 1752*x^2 + 87616), Mod(591/592*x^3 - 57/37*x, x^4 - 1752*x^2 + 87616)]

Maybe algdep + nfrecognize will solve the second part of your question.

If not, please make it more precise.

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/