| 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/