Hilbert Symbols and Embeddings

Let A be a quaternion algebra over Q, Fq(X) (with q odd) or a number field F with defining elements a, b, and let v be a place of F. If v is unramified in A (i.e. A tensor F Fv isomorphic to M2(Fv), we define the Hilbert symbol (a, b)v to be 1, and otherwise we define (a, b)v= - 1.

HilbertSymbol(a, b, p) : FldRatElt, FldRatElt, RngIntElt -> RngIntElt
HilbertSymbol(a, b, p) : FldFunRatElt, FldFunRatElt, RngElt p -> RngIntElt
HilbertSymbol(a, b, p) : FldNumElt, FldNumElt, RngOrdIdl -> RngIntElt
HilbertSymbol(A, p) : AlgQuat[FldRat], RngIntElt -> RngIntElt
HilbertSymbol(A, p) : AlgQuat[FldFunRat], RngElt -> RngIntElt
HilbertSymbol(A, p) : AlgQuat, RngOrdIdl -> RngIntElt
    Al: MonStgElt                       Default: "NormResidueSymbol"
Computes the Hilbert symbol for the quaternion algebra A over F, namely (a, b)p, where a, b ∈F and p is either a prime (if a, b ∈Q or Fq(X)) or a prime ideal. If a, b ∈Q, by default table-lookup is used to compute the Hilbert symbol; one can optionally insist on using the full algorithm by setting the parameter Al to the value "Evaluate".
IsRamified(p, A) : RngElt, AlgQuat -> BoolElt
IsUnramified(p, A) : RngElt, AlgQuat -> BoolElt
IsRamified(p, A) : RngUPol, AlgQuat[FldFunRat] -> BoolElt
IsUnramified(p, A) : RngUPol, AlgQuat[FldFunRat] -> BoolElt
IsRamified(p, A) : RngOrdIdl, AlgQuat[FldAlg] -> BoolElt
IsUnramified(p, A) : RngOrdIdl, AlgQuat[FldAlg] -> BoolElt
Returns true if and only if the prime or prime ideal p is ramified (unramified) in the quaternion algebra A.

Example AlgQuat_Hilbert_Symbols (H93E12)

We first verify the correctness of all Hilbert symbols over the rationals.
> QQ := Rationals();
> for a,b in [1..8] do
>   bl := HilbertSymbol(QQ ! a, QQ ! b,2 : Al := "Evaluate")
>                eq NormResidueSymbol(a,b,2);
>   print <a,b,bl>;
>   if not bl then
>     break a;
>   end if;
> end for;
<1, 1, true>
<1, 2, true>
<1, 3, true>
...

For a second test, we input a quaternion algebra which is unramified at all finite places.

> P<x> := PolynomialRing(Rationals());
> F<b> := NumberField(x^3-3*x-1);
> Z_F := MaximalOrder(F);
> A := QuaternionAlgebra<F | -3,b>;
> symbols := [];
> for p in [p : p in [2..100] | IsPrime(p)] do
>   pps := Decomposition(Z_F,p);
>   for pp in pps do
>     Append(~symbols,HilbertSymbol(A,pp[1]));
>   end for;
> end for;
> symbols;
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]

Finally, we test "random" quaternion algebras over quadratic extensions at even primes, the hardest case. We use the fact that the quaternion algebra (a, b) is ramified at a prime ideal p if and only if b is a norm from the extension F(Sqrt(a)), so we can test this condition using IsLocalNorm. Note that this takes substantially more time.

> for c in [2,-2,6,-6,-1,3,-3] do
>   K<s> := NumberField(x^2-c);
>   Z_K := MaximalOrder(K);
>   Z_Kmod8, f8 := quo<Z_K | 8>;
>   PPK<xK> := PolynomialRing(K);
>   for i := 1 to 10 do
>     S := [x+y*Z_K.2 : x,y in [0..7] | x*y ne 0];
>     a := Random(S);
>     b := Random(S);
>     A := QuaternionAlgebra<K | a,b>;
>     for pp in Decomposition(Z_K,2) do
>       hsym := HilbertSymbol(A,pp[1]);
>       if not IsIrreducible(xK^2-a) then
>         print <c, a, b, hsym eq 1>;
>         if hsym ne 1 then
>           break c;
>         end if;
>       else
>         lclsym := IsLocalNorm(AbelianExtension(ext<K | xK^2-a>),Z_K ! b,pp[1]);
>         bl := (hsym eq 1) eq lclsym;
>         print <c, a, b, bl>;
>         if not bl then
>           break c;
>         end if;
>       end if;
>     end for;
>   end for;
> end for;
<2, 5/1*Z_K.1 + 3/1*Z_K.2, Z_K.1 + 7/1*Z_K.2, true>
<2, 6/1*Z_K.1 + 4/1*Z_K.2, 4/1*Z_K.1 + Z_K.2, true>
<2, 7/1*Z_K.1 + Z_K.2, 2/1*Z_K.1 + 2/1*Z_K.2, true>
...
pMatrixRing(A, p) : AlgQuat, RngOrdIdl -> AlgMat, Map, Map
pMatrixRing(A, p) : AlgQuat, RngElt -> AlgMat, Map, Map
pMatrixRing(O, p) : AlgAssVOrd, RngOrdIdl -> AlgMat, Map, Map
pMatrixRing(O, p) : AlgQuatOrd, RngElt -> AlgMat, Map, Map
pMatrixRing(O, p) : AlgQuatOrd[RngInt], RngInt -> AlgMat, Map, Map
    Precision: RngIntElt                Default: 
Let A be a quaternion algebra A over a field F where F is the rationals, a number field or Fq(x) with q odd. Given A and a prime (ideal) p of the ring of integers R of F such that p is unramified in A, this function returns the matrix ring over the completion Fp of F at p, a map from A to M2(Fp) and the embedding F to Fp.

Given a p-maximal order O in A, the map from A to M2(Fp) induces a map from O to <Meta>-2(Rp).

IsSplittingField(K, A) : Fld, AlgQuat -> BoolElt, AlgQuatElt, Map
HasEmbedding(K, A) : Fld, AlgQuat -> BoolElt, AlgQuatElt, Map
    ComputeEmbedding: BoolElt           Default: false
Given a quaternion algebra A defined over Q, Fq(X) (with q odd) or a number field F and K a quadratic extension of F, the function returns true if and only if there exists an embedding K to A over F. This is done by comparison of ramified places in K and A (see [Vig80, Cor. III.3.5]). If no embedding exists, the second return value will be a witness place. If an embedding exists and the optional argument ComputeEmbedding is set to true, the second and third return values contain the result of a call to Embed as described below.
Embed(K, A) : Fld, AlgQuat -> AlgQuatElt, Map
    Al: MonStgElt                       Default: "NormEquation"
Given a quaternion algebra A defined over Q, Fq(X) (with q odd) or a number field F and K a quadratic extension of F, returns an embedding K to A over F, given as an element of A, the image of the primitive generator of K, and the map K to A.

The algorithm by default involves solving a relative norm equation. Alternatively, a naive search algorithm may be selected by setting the optional parameter Al:="Search".

If there is no embedding, a runtime error occurs (or the "Search" runs forever). To check whether an embedding exists, use HasEmbedding (see immediately above).

Embed(Oc, O) : RngOrd, AlgAssVOrd -> AlgAssVOrdElt, Map
    Al: MonStgElt                       Default: "NormEquation"
Given a quadratic order Oc with base number ring R and a quaternion order O with base ring R, the function computes an embedding Oc -> O over R. It returns the image of the second generator Oc.2 of Oc; secondly it returns the embedding map Oc to O.

The algorithm by default involves solving a relative norm equation. Alternatively, a naive search algorithm may be selected by setting the optional parameter Al:="Search".

Notes. Let K be the number field containing Oc.

(i) Oc.1, Oc.2 are the generators of Oc as a module, and Oc.2 is unrelated to K.1, where K is the number field containing Oc.

(ii) To check whether an embedding of K into the algebra exists, one can use HasEmbedding(K, Algebra(O) : ComputeEmbedding:=false).

Example AlgQuat_Embed (H93E13)

> F<b> := NumberField(Polynomial([1,-3,0,1]));
> A := QuaternionAlgebra<F | -3, b>;
> K := ext<F | Polynomial([2,-1,1])>;
> mu, iota := Embed(K, A);
> mu;
1/2 + 1/6*(-2*b^2 + 2*b + 7)*i + 1/2*(2*b^2 + b - 6)*j + 1/6*(-2*b^2 - b + 4)*k
> MinimalPolynomial(mu);
$.1^2 - $.1 + 2
> iota(K.1) eq mu;
true
V2.28, 13 July 2023