Idèles

Idèles of Number Fields

Let \(K = \QQ(\alpha)\) be the number field generated by \(\alpha\) over \(\QQ\). Let \(O\) be the ring of integers of \(K\). Define a finite prime of \(K\) to be a prime ideal of \(O\). Define an infinite prime of \(K\) to be an embedding \(\phi: K \to \CC\) such that \(\phi(\alpha) \geq 0\). By a prime of \(K\) we shall mean either a finite or an infinite prime of \(K\). The set of primes of \(K\) corresponds bijectively to the set of equivalence classes of absolute values on \(K\).

For \(p\) a prime of \(K\), write \(K_p\) for the completion of \(K\) at \(p\) and call it the field of \(p\)-adic numbers. We write \(O_p\) for the ring of \(p\)-adic integers, which we define to be \(K_p\) itself if \(p\) if infinite.

The idèle group \(J_K\) of \(K\) is the restricted product \(\prod_p' K_p^*\) of the unit groups \(K_p^*\) with respect to the open subgroups \(O_p^*\), where \(p\) ranges over all primes of \(K\). Concretely, that means

\[J_K = \left\{ (x_p)_p \in \prod_p K_p^* : x_p \in O_p^* \text{ for all but finitely many } p \right\}\]

This is a multiplicative topological group with component-wise multiplication. As a group is it equal to the unit group of the adèle ring \(\Bold{A}_K\), but not as a topological group.

We define the finite idèle group \(J_K^0\) of \(K\) to be the same restricted prodcut \(\prod_p' K_p^*\) but with \(p\) ranging over the finite primes only.

Let \((r,s)\) be the signature of \(K\). Similar to what we did for adèles, we view the idèle group as

\[J_K = \prod_{i=1}^r \RR^* \times \prod_{j=1}^s \CC^* \times J_K^0\]

where the order of the real and complex fields is given by K.places().

This leads us to let an Idele consist of a pair \(u = (x, y)\) where

  • \(x\) is called the infinite part of \(u\) and is list with \(r+s\) entries, the first \(r\) of which are non-zero elements of RIF and the last \(s\) of of which are non-zero elements of CIF;

  • \(y\) is called the finite part of \(u\) and is either an element of \(K^*\) or is a dictionary with finite primes of \(K\) as values such that the value at a finite prime \(p\) is a multiplicative \(p\)-adic over \(K\).

sage: K.<a> = NumberField(x^2-3)
sage: J = Ideles(K); J
Idele Group of Number Field in a with defining polynomial x^2 - 3
sage: u = J([-1, 9.7], {a: (a+1, 20), 5: (1/10*a, 20)}); u
Idèle with values:
  infinity_0:   -1
  infinity_1:   9.6999999999999993?
  (3, a):       (a + 1) * U(20)
  (5):          1/10*a * U(20)
  other primes: 1 * U(0)
sage: u.infinite_part()
[-1, 9.6999999999999993?]
sage: u.finite_part()
{Fractional ideal (a): (a + 1) * U(20), Fractional ideal (5): 1/10*a * U(20)}

Above we created an Idele u whose finite part is a dictionary. The keys are the prime ideals above \(3\) and \(5\). We call primes stored as keys in the finite part of an Idele the stored primes:

sage: u.stored_primes()
[Fractional ideal (a), Fractional ideal (5)]

We can get the multiplicative \(p\)-adic that we stored for a stored prime \(p\) by indexing the Idele:

sage: u[a]
(a + 1) * U(20)
sage: u[5]
1/10*a * U(20)
sage: u[a].parent()
Group of multiplicative (3, a)-adics of Number Field in a with defining polynomial x^2 - 3

We can even ask for a multiplicative \(p\)-adic for finite primes \(p\) of \(K\) which are not stored:

sage: p7 = K.prime_above(7)
sage: u[p7]
1 * U(0)
sage: u[p7].parent()
Group of multiplicative (7)-adics of Number Field in a with defining polynomial x^2 - 3

This always returns a multiplicative \(p\)-adic representing \(O_p^*\).

And we can also ask the individual values in the infinite part of \(u\) by indexing:

sage: u[oo, 0]
-1
sage: u[oo, 1]
9.6999999999999993?

The represented subset of an Idele \(u\) with finite part a dictionary is given by

\[\prod_{i=1}^{r+s} (R(u[\infty, i]) \setminus \{0\}) \times \prod_{p \in S} R(u[p]) \times \prod_{p \not\in S} O_p^*\]

where the last product ranges over the finite primes of \(K\) not in \(S\) and

  • \(u[\infty, i]\) denotes the \(i\)-th entry of the infinite part of \(u\);

  • \(R(u[\infty, i])\) denotes the real or complex interval that \(u[\infty, i]\) represents;

  • \(S\) denotes the set of stored primes of \(u\);

  • \(u[p]\) denotes the multiplicative \(p\)-adic stored at \(p\);

  • \(R(u[p])\) denotes the represented subset of \(u[p]\) (which is a subset of \(K_p^*\)).

We can also create an Idele whose finite part is an element of \(K^*\):

sage: v = J([7.9, 4], a/3); v
Idèle with values:
  infinity_0:   7.9000000000000004?
  infinity_1:   4
  other primes: 1/3*a
sage: v.finite_part()
1/3*a
sage: v.finite_part().parent()
Number Field in a with defining polynomial x^2 - 3

We say that an Idele whose finite part lies in \(K^*\) has exact finite part.

sage: u.has_exact_finite_part()
False
sage: v.has_exact_finite_part()
True

This terminology comes from the fact that an Idele \(v\) that has exact finite part has represented subset

\[\prod_{i=1}^{r+s} (R(v[\infty, i]) \setminus \{0\}) \times \prod_p \{v_0\}\]

where \(p\) ranges over all finite primes of \(K\) and \(v_0 \in K^*\) denotes the finite part of \(v\).

We can still index v by finite primes of \(K\).

sage: v[5]
1/3*a
sage: v[5].parent()
Group of multiplicative (5)-adics of Number Field in a with defining polynomial x^2 - 3

We can perform arithmetic with idèles.

sage: u * v
Idèle with values:
  infinity_0:   -7.9000000000000004?
  infinity_1:   38.799999999999998?
  (3, a):       (1/3*a + 1) * U(20)
  (5):          1/10 * U(20)
  other primes: 1 * U(0)
sage: u / v
Idèle with values:
  infinity_0:   -0.1265822784810127?
  infinity_1:   2.4249999999999999?
  (3, a):       (a + 3) * U(20)
  (5):          3/10 * U(20)
  other primes: 1 * U(0)

We can ask an Idele its valuation at a finite prime of \(K\).

sage: u.valuation(5)
-1
sage: u.valuation(K.prime_above(97))
0

The natural (diagonal) embedding \(K^* \to J_K\) is implemented as a conversion.

sage: J(a)
Idèle with values:
  infinity_0:   -1.732050807568878?
  infinity_1:   1.732050807568878?
  other primes: a

A basis of the topology on \(J_K^0\) is given by the sets

\[\prod_{p \in S} V_p \times \prod_{p \not\in S} O_p^*\]

where \(S\) is a finite set of finite primes of \(K\) and each \(V_p\) is an open subset of \(K_p^*\). Let the finite represented subset of an Idele be the projection of its represented subset to \(J_K^0\). We can approximate any \(\alpha \in J_K^0\) arbitrarily closely by an Idele in the following sense: for any neighborhood \(U\) of \(\alpha\) in \(J_K^0\), the exists an Idele whose finite represented subset contains \(\alpha\) and is contained in \(U\).

REFERENCES:

[Her2021] Mathé Hertogh, Computing with adèles and idèles, master’s thesis, Leiden University, 2021.

This implementation of idèles is based on [Her2021]. An extensive exposition of properties, design choices and two applications can be found there.

AUTHORS:

  • Mathé Hertogh (2021-07): initial version based on [Her2021]

class adeles.idele.Idele(parent, infinite, finite)

Bases: sage.structure.element.MultiplicativeGroupElement

Idèle over a Number Field

REFERENCES:

Section 3.6 of [Her2021].

__init__(parent, infinite, finite)

Construct an idèle

INPUT:

  • parent – an idèle group of some number field \(K\); the parent

  • infinite – a list of length \(r+s\) (for \((r,s)\) the signature of \(K\)) whose first \(r\) entries lie in RIF and whose last \(s\) entries lie in CIF and none of whose entries equals zero. If \(r+s=1\), then we also accept a single non-zero element in RIF/CIF.

  • finite – a non-zero element of \(K\) or a dictionary with keys finite primes of \(K\) (as specified by is_finite_prime()) such that the value at \(p\) is (data to construct) a multiplicative \(p\)-adic.

EXAMPLES:

We begin with the easiest case: \(K = \QQ\):

sage: J = Ideles(QQ)
sage: Idele(J, 3.14, {2: (5/3, 2), 5: (1, 9)})
Idèle with values:
  infinity_0:   3.1400000000000002?
  2:            5/3 * U(2)
  5:            1 * U(9)
  other primes: 1 * U(0)
sage: Idele(J, RIF(-1.122, -1.119), 1/3)
Idèle with values:
  infinity_0:   -1.12?
  other primes: 1/3
sage: Idele(J, RIF(-oo, oo), {7: (1/7, 0)})
Idèle with values:
  infinity_0:   RR^*
  7:            1/7 * U(0)
  other primes: 1 * U(0)

Now let’s take a non-trivial number field:

sage: K.<a> = NumberField(x^4-17)
sage: Jk = Ideles(K)
sage: p3, p7 = K.prime_above(3), K.prime_above(7)
sage: Idele(Jk, [3.14, -1, 1+I], {p3: (a^3, 7), p7: (a^2, 4)})
Idèle with values:
  infinity_0:   3.1400000000000002?
  infinity_1:   -1
  infinity_2:   1 + 1*I
  (3, 1/2*a^2 - a - 1/2):       a^3 * U(7)
  (7, 1/2*a^2 + a - 5/2):       a^2 * U(4)
  other primes: 1 * U(0)
sage: Idele(Jk, [RIF(7.8, 7.9), -1, I], a^3-a^2+2*a-5)
Idèle with values:
  infinity_0:   8.?
  infinity_1:   -1
  infinity_2:   1*I
  other primes: a^3 - a^2 + 2*a - 5

TESTS:

sage: Idele(J, [1], 0)
Traceback (most recent call last):
...
ValueError: exact finite value must be non-zero
sage: Idele(J, [1], "blah")
Traceback (most recent call last):
...
TypeError: finite must be a dictionary or a non-zero number field element
__getitem__(prime)

Get the value of this idèle at the prime prime

INPUT:

  • prime - a prime of our base number field \(K\), which can be:

    • a finite prime of \(K\), as specified by is_finite_prime();

    • an infinite prime of \(K\) in the form of a pair (Infinity, i) where i is a non-negative integer specifying the index of the infinite prime;

    If \(K\) ony has one infinite prime, then we also accept Infinity and interpret it as (Infinity, 0).

OUTPUT:

The value of this idèle at prime. If prime is a finite prime, then this is a multiplicative prime-adic. If prime is (Infinity, i), then this is an element of RIF or CIF.

EXAMPLES:

sage: J = Ideles(QQ)
sage: u = J(3.1, {2: (1,2)})
sage: u[oo]
3.1000000000000001?
sage: u[2]
1 * U(2)
sage: u[3]
1 * U(0)
sage: K.<a> = NumberField(x^5-3)
sage: Jk = Ideles(K)
sage: v = Jk([-1.5, -I, 1+I], {K.prime_above(3): (a, 4)})
sage: v[oo, 0]
-1.5000000000000000?
sage: v[oo, 2]
1 + 1*I
sage: v[K.prime_above(3)]
a * U(4)

We may throw the following exceptions:

sage: u[oo, 5]
Traceback (most recent call last):
...
IndexError: list index out of range
sage: v[2] # the ideal (2) is not prime in K
Traceback (most recent call last):
...
KeyError: 'You can only index by a finite prime or (Infinity, index)'
_mul_(other)

Return the product of this idèle and other

EXAMPLES:

sage: J = Ideles(QQ)
sage: u = J(-1, {2: (1/2, 7), 3: (2/5, 8)}); u
Idèle with values:
  infinity_0:   -1
  2:            1/2 * U(7)
  3:            2/5 * U(8)
  other primes: 1 * U(0)
sage: v = J(2.5, {3: (-1, 4)}); v
Idèle with values:
  infinity_0:   2.5000000000000000?
  3:            80 * U(4)
  other primes: 1 * U(0)
sage: u * v
Idèle with values:
  infinity_0:   -2.5000000000000000?
  2:            1/2 * U(0)
  3:            32 * U(4)
  other primes: 1 * U(0)
sage: K.<a> = NumberField(x^3-2)
sage: J = Ideles(K)
sage: u = J([1, 1], {a+1: (-a^2/2, 3), 7: (1/3, 0)}); u
Idèle with values:
  infinity_0:   1
  infinity_1:   1
  (3, a + 1):   -1/2*a^2 * U(3)
  (7):          1/3 * U(0)
  other primes: 1 * U(0)
sage: J(a) * u
Idèle with values:
  infinity_0:   1.259921049894873?
  infinity_1:   -0.62996052494743671? + 1.0911236359717214?*I
  (2, a):       a * U(0)
  (3, a + 1):   -1 * U(3)
  (7):          1/3*a * U(0)
  other primes: 1 * U(0)

REFERENCES:

Section Arithmetic in Section 3.6 of [Her2021].

_div_(other)

Return the quotient of this idèle by other

EXAMPLES:

sage: J = Ideles(QQ)
sage: u = J(3.0, {3: (1/3, 6), 7: (2, 1)})
sage: v = J(2.0, {3: (3, 4), 5: (50, 1)})
sage: u / v
Idèle with values:
  infinity_0:   1.5000000000000000?
  3:            1/9 * U(4)
  5:            1/50 * U(0)
  7:            2 * U(0)
  other primes: 1 * U(0)
sage: v / u
Idèle with values:
  infinity_0:   0.6666666666666667?
  3:            9 * U(4)
  5:            50 * U(0)
  7:            1/2 * U(0)
  other primes: 1 * U(0)
sage: u / J(11/2)
Idèle with values:
  infinity_0:   0.545454545454546?
  2:            2/11 * U(0)
  3:            2/33 * U(6)
  7:            4/11 * U(1)
  11:           2/11 * U(0)
  other primes: 1 * U(0)
sage: K.<i> = NumberField(x^2+1)
sage: J = Ideles(K)
sage: u = J(2*I, {i+1: (i, 10), 3: (i/3, 10)})
sage: u / J(i)
Idèle with values:
  infinity_0:   2
  (2, i + 1):   1 * U(10)
  (3):          1/3 * U(10)
  other primes: 1 * U(0)
sage: v = J(-1.25, {3: (2, 8), 7: (2*i+1, 12)})
sage: u / v
Idèle with values:
  infinity_0:   -1.600000000000000?*I
  (2, i + 1):   i * U(0)
  (3):          1/6*i * U(8)
  (7):          (-2/5*i + 1/5) * U(0)
  other primes: 1 * U(0)

REFERENCES:

Section Arithmetic in Section 3.6 of [Her2021].

_richcmp_(other, op)

Return the result of operator op applied to self and other

Only equality and inequality are implented.

We declare self and other equal if their represented subsets have non-empty intersection.

EXAMPLES:

sage: J = Ideles(QQ)
sage: J(1, 1) == J(RIF(0, 2), 1)
True
sage: J(1, 1) != J(RIF(-7, -5), 1)
True

The represented subsets do not contain zero at infinite primes:

sage: J(RIF(-oo, 1), 1) == J(RIF(1, oo), 1) # intersection is {1}
True
sage: J(RIF(-oo, 0), 1) == J(RIF(0, oo), 1) # intersection is empty (not {0})
False
sage: J(1, 1) != J(1, 1/2)
True
sage: J(1, -1) == J(1, {2: (-1, 4)})
True
sage: J(1, 15) != J(1, {2: (-1, 4)})
True
sage: J(1, {2: (4, 0)}) == J(1, {2: (4, 5)})
True
sage: J(1, {2: (4, 0)}) == J(1, {2: (2, 5)})
False
sage: J(1, {2: (4, 0)}) == J(1, {97: (1, 0)})
False

REFERENCES:

Section 5.4 of [Her2021].

finite_part()

Return the finite part of this idèle

This could be either a number field element or a dictionary.

EXAMPLES:

sage: K.<a> = NumberField(x^5-3*x+1)
sage: J = Ideles(K)
sage: u = J([1, 1, 1, 1], a^2)
sage: u.finite_part()
a^2
sage: p3, q3 = K.primes_above(3)
sage: v = J([1, 1, 1, 1], {p3: (a, 10), q3: (-1-a^2, 7)})
sage: v.finite_part()
{Fractional ideal (-a^2 + 1): -11107*a^4 * U(10),
 Fractional ideal (-2*a^4 - a^3 - 2*a^2 - a + 4): (-920*a^4 - 31*a^3 - 90*a^2 - 961*a) * U(7)}
has_exact_finite_part()

Return whether or not this idèle has exact finite part

EXAMPLES:

sage: J = Ideles(QQ)
sage: u = J(-1, 7)
sage: u.has_exact_finite_part()
True
sage: v = J(-1, {2: (1, 1)})
sage: v.has_exact_finite_part()
False
ideal()

Return the fractional ideal with the same valuations as this idèle

OUTPUT:

The fractional ideal \(I\) of our base field \(K\) such that \(I\) has the same valuation as this idèle at every finite prime of \(K\) if \(K \neq \QQ\). If \(K = \QQ\), then we return the rational number that has the same valuations as this idèle at every prime number.

EXAMPLES:

sage: J = Ideles(QQ)
sage: J(9/7).ideal()
9/7
sage: u = J(3.1415, {2: (3, 2), 5: (1/5, 0)})
sage: u.ideal()
1/5
sage: K.<a> = NumberField(x^2+5)
sage: Jk = Ideles(K)
sage: Jk(a-1).ideal()
Fractional ideal (a - 1)
sage: p2 = K.prime_above(2)
sage: p3, q3 = K.primes_above(3)
sage: v = Jk(-1, {p2: (4, 3), p3: (3, 10), q3: (1/6, 20)})
sage: I = v.ideal(); I
Fractional ideal (4/3*a - 8/3)
sage: all([I.valuation(p) == v.valuation(p) for p in K.primes_of_bounded_norm(50)])
True
increase_precision(primes, prec_increment=1)

Increase the precision of this idèle at the primes given in primes

INPUT:

  • primes – an iterable containing finite primes and/or (rational) prime numbers, or a single prime

  • prec_increment – integer (default = 1); the amount by which we increase the precision at each prime in primes

Write \(K\) for our base number field. Let \(p\) be a finite prime of \(K\) in primes. Increasing the precision of self at \(p\) will increase the precision of self[p] by prec_increment, while making sure that self[p] still represents the original center of self[p].

If \(p\) in primes is a rational prime number, then the above is done for each prime \(q\) lying above \(p\) with prec_increment multiplied by the ramification index of \(q\) over \(p\).

Note

If this idèle has exact finite part, then this method does not do anything. If one sees exactness as having infinite precision, this just corresponds to oo + prec_increment == oo.

Note

Setting prec_increment to a negative value will decrease the precision, but not below zero.

EXAMPLE:

sage: K.<a> = NumberField(x^3-2)
sage: J = Ideles(K)
sage: p2, p5 = K.prime_above(2), K.prime_above(5)
sage: u = J([1, I], {p2: (a, 5), p5: (1/3, 1)})

Let’s increase the precision of p2 and both prime ideals above 5 by 3:

sage: u.increase_precision([p2, 5], 3); u
Idèle with values:
  infinity_0:   1
  infinity_1:   1*I
  (2, a):       a * U(8)
  (5, a^2 - 2*a - 1):   (a^2 - 2*a) * U(3)
  (5, a + 2):   1/3 * U(4)
  other primes: 1 * U(0)

We can also decrease precision:

sage: u.increase_precision(p2, -1); u
Idèle with values:
  infinity_0:   1
  infinity_1:   1*I
  (2, a):       a * U(7)
  (5, a^2 - 2*a - 1):   (a^2 - 2*a) * U(3)
  (5, a + 2):   1/3 * U(4)
  other primes: 1 * U(0)

As p2 has ramification index 3, the following will increase the precision of u at p2 by 3:

sage: u.increase_precision(2); u
Idèle with values:
  infinity_0:   1
  infinity_1:   1*I
  (2, a):       a * U(13)
  (5, a^2 - 2*a - 1):   (a^2 - 2*a) * U(3)
  (5, a + 2):   1/3 * U(4)
  other primes: 1 * U(0)

Nothing changes for idèles with exact finite part:

sage: v = J([2, 2*I], a^2)
sage: v.increase_precision([p2, p5]); v
Idèle with values:
  infinity_0:   2
  infinity_1:   2*I
  other primes: a^2

REFERENCES:

Section 9.3.1 of [Her2021].

TESTS:

sage: u.increase_precision([QQ])
Traceback (most recent call last):
...
ValueError: primes should be a (list of) prime(s)
infinite_part()

Return the infinite part of this idèle

EXAMPLES:

sage: K.<a> = NumberField(x^5-3*x+1)
sage: J = Ideles(K)
sage: u = J([-1, 7.9, 1, 1+I], a^2)
sage: u.infinite_part()
[-1, 7.9000000000000004?, 1, 1 + 1*I]
inverse()

Return the inverse of this idèle

EXAMPLES:

sage: K.<a> = NumberField(x^2-2)
sage: J = Ideles(K)
sage: J([2, 3], a/2).inverse()
Idèle with values:
  infinity_0:   0.50000000000000000?
  infinity_1:   0.3333333333333334?
  other primes: a
sage: J([-1, 1/4], {a: (a, 3), 3: (-1, 5)}).inverse()
Idèle with values:
  infinity_0:   -1
  infinity_1:   4
  (2, a):       1/2*a * U(3)
  (3):          -1 * U(5)
  other primes: 1 * U(0)

REFERENCES:

Section Arithmetic in Section 3.6 of [Her2021].

is_integral()

Return whether or not this idèle is integral

Integral means that its valuation at each finite prime of our base field is non-negative.

EXAMPLES:

sage: J = Ideles(QQ)
sage: J(1, 3).is_integral()
True
sage: J(1, 1/3).is_integral()
False
sage: J(1, {2: (1/3, 10)}).is_integral()
True
sage: J(1, {2: (1/2, 10)}).is_integral()
False
is_very_integral()

Return whether or not this idèle is very integral

An idèle \(u\) is called very integral if at each finite prime \(p\) of the base number field \(K\), the center of \(u[p]\) is an integral element of \(K\).

This is stronger than \(u\) being integral (see the examples below).

EXAMPLES:

sage: J = Ideles(QQ)
sage: J(1, 5).is_very_integral()
True
sage: J(1, 1/5).is_very_integral()
False
sage: J(1, {2: (10, 0)}).is_very_integral()
True
sage: J(1, {2: (1/10, 0)}).is_very_integral()
False

Being very integral is stronger than being integral:

sage: u = J(1, {3: (1/2, 3)})
sage: u.is_integral()
True
sage: u.is_very_integral()
False

REFERENCES:

Section 4.3 of [Her2021].

stored_primes()

Return the set of stored primes of this idèle as an ordered list.

A stored prime is a finite prime of the base number field \(K\) for which this idèle has stored a value in its finite part.

If this idèle has exact finite part, then it has no stored primes.

The order is determined by the implemented order on number field ideals, or by the natural order on \(\NN\) if \(K = \QQ\) (in which case the primes are prime numbers).

EXAMPLES:

sage: K.<a> = NumberField(x^2+17)
sage: J = Ideles(K)
sage: p2, p5 = K.prime_above(2), K.prime_above(5)
sage: p7, q7 = K.primes_above(7)
sage: u = J(I, {q7: (a, 1), p2: (8, 0), p7: (1,0), p5: (a, 3)})
sage: u.stored_primes()
[Fractional ideal (2, a + 1),
 Fractional ideal (5),
 Fractional ideal (7, a + 2),
 Fractional ideal (7, a + 5)]
sage: v = J(-1, a+1)
sage: v.stored_primes()
[]
to_ray_class(modulus)

Return the image of this idèle in the ray class group modulo modulus

This idèle must have enough precision to have a well-defined image in the ray class group modulo modulus. This means that (1) for each infinite prime \(p\) dividing modulus, the real interval that this idèle represents at \(p\) lies in eithe \(\RR_{<0}\) or \(\RR_{>0}\) and (2) that for each finite prime \(p\) dividing modulus, the precision of self[p] is at least the valuation of modulus at \(p\).

INPUT:

Warning

The ray class group of QQ is not implemented. To use this functionality over \(\QQ\), use the isormophic number field NumberField(x-1), as in the examples below.

EXAMPLES:

sage: Q = NumberField(x-1, "one")
sage: J = Ideles(Q)
sage: u = J(-9.0, {2: (10, 1), 3: (3, 2), 7: (1/2, 4)})
sage: m = Modulus(Q.ideal(18), [0])
sage: u.to_ray_class(m).ideal()
Fractional ideal (7)
sage: K.<a> = NumberField(x^3-x-1)
sage: Jk = Ideles(K)
sage: p7, q7 = K.primes_above(7)
sage: u = Jk([2, I], {p7: (1/2, 1), q7: (7*a, 2)})
sage: m = Modulus(K.ideal(7), [0])
sage: u.to_ray_class(m).ideal()
Fractional ideal (2*a^2 - a + 3)

TESTS:

sage: K = NumberField(x^2 + 5*x - 3, 'a')
sage: J = Ideles(K)
sage: G = ray_class_group(K, Modulus(K.ideal(14), [0])); G
Ray class group of order 18 with structure C6 x C3 of Number Field in a with defining polynomial x^2 + 5*x - 3 of modulus (Fractional ideal (14)) * infinity_0
sage: c0, c1 = G.gens()
sage: for e in range(6):
....:     for f in range(3):
....:         r = c0^e * c1^f
....:         assert G(J(r)) == r, "bug!"  # long time

ALGORITHM:

We construct an idèle \(v\) satisfying:
  • \(v \equiv self \mod K^*\)

  • \(v \equiv 1 \mod^* modulus\)

We do this by starting of with \(v =\) self and then improve \(v\) in three steps:

  1. Make \(v\) integral at the primes dividing modulus.

  2. Make \(v \equiv 1 \mod^*\) modulus.finite_part()

  3. Make \(v \equiv 1 \mod^*\) modulus (fix the infinite part)

In every step we only change \(v\) by multiplying it with principal idèles (i.e. elements of K^*) as to never violate the first desired condition on \(v\). For Step 2 we use the number field version of the Chinese Remainder Theorem (cf. solve_CRT()). For Step 3 we use get_one_mod_star_finite_with_fixed_signs().

Once we have such a \(v\), we return the image of the ideal \(\prod_{p} p^{ord_p(v)}\) in G, where \(p\) ranges over the stored primes of \(v\).

REFERENCES:

Section 4.5 of [Her2021].

valuation(prime)

Return the valuation of this idèle at the finite prime prime

INPUT:

  • prime – a finite prime of our base number field, as described by is_finite_prime()

EXAMPLES:

sage: J = Ideles(QQ)
sage: u = J([1], 1/25)
sage: u.valuation(2)
0
sage: u.valuation(5)
-2
sage: v = J([1], {2: (8, 10)})
sage: v.valuation(2)
3
sage: v.valuation(3)
0
sage: K.<a> = NumberField(x^2+5)
sage: J = Ideles(K)
sage: p3, q3 = K.primes_above(3)
sage: u = J([I], {p3: (3, 0)})
sage: u.valuation(p3)
1
sage: u.valuation(q3)
0

TESTS:

sage: Q.<one> = NumberField(x-1)
sage: J = Ideles(Q)
sage: u = J([-1], {7: (7^20, 3)})
sage: u.valuation(Q.prime_above(7))
20
very_integral_split()

Split this idèle into a very integral idèle and a denominator

OUTPUT:

A pair \((u, d)\) where \(u\) is a very integral idèle and \(d\) is a positive integer such that this idèle equals \(u/d\).

See also

is_very_intergral()

EXAMPLES:

sage: J = Ideles(QQ)
sage: u, d = J(1, 1/4).very_integral_split(); u, d
(Idèle with values:
   infinity_0:  4
   other primes:        1,
 4)
sage: u/J(d)
Idèle with values:
  infinity_0:   1
  other primes: 1/4
sage: K.<a> = NumberField(x^2-5)
sage: J = Ideles(K)
sage: u = J([2, -1], {2: (a, 3), 3: (a/5, 1), a: (1/7, 0)}); u
Idèle with values:
  infinity_0:   2
  infinity_1:   -1
  (2):          a * U(3)
  (3):          1/5*a * U(1)
  (5, 1/2*a + 5/2):     1/7 * U(0)
  other primes: 1 * U(0)
sage: v, d = u.very_integral_split()
sage: d
35
sage: v
Idèle with values:
  infinity_0:   70
  infinity_1:   -35
  (2):          3*a * U(3)
  (3):          a * U(1)
  (5, 1/2*a + 5/2):     (5*a + 5) * U(0)
  (7):          (49/2*a + 21/2) * U(0)
  other primes: 1 * U(0)
sage: u == v/J(d)
True
class adeles.idele.Ideles(K)

Bases: sage.structure.unique_representation.UniqueRepresentation, sage.groups.group.Group

Idèle Group of a Number Field

REFERENCES:

Section 3.6 of [Her2021].

_element_constructor_(x, y=None)

Construct an idèle

INPUT:

Denote our base number field by \(K\) and its signature by \((r, s)\). The standard format to construct an idèle is giving two variables:

  • infinite – a list of length \(r+s\) whose first \(r\) values lie in RIF and whose last \(s\) values lie in CIF; the infinite part

  • finite – either a non-zero element of \(K\) or a dictionary with keys finite primes of \(K\) (cf. is_finite_prime()) such that the value at a finite prime \(p\) is (data to construct) a multiplicative \(p\)-adic; the finite part.

One can also give one of the following objects:

  • a non-zero element of \(K\); create the corresponding principal idèle

  • an element of \((O/I)^*\), for \(O\) the maximal order of \(K\) and \(I\) an \(O\)-ideal; see _from_modulo_element()

  • a ray class group element; see _from_ray_class()

EXAMPLES:

We start by constructing idèles over \(\QQ\) in the standard manner.

sage: J = Ideles(QQ)
sage: J(5.4321, 1/7)
Idèle with values:
  infinity_0:   5.4321000000000002?
  other primes: 1/7
sage: J(-1.5, {2: (1/2, 0), 3: (4, 2), 17: (-1, 1), 31: (1/5, 10)})
Idèle with values:
  infinity_0:   -1.5000000000000000?
  2:            1/2 * U(0)
  3:            4 * U(2)
  17:           16 * U(1)
  31:           1/5 * U(10)
  other primes: 1 * U(0)

Next we will create idèles over \(\QQ(\sqrt{3})\).

sage: K.<a> = NumberField(x^2-3)
sage: J = Ideles(K)

We start by specifying the infinite and finite parts:

sage: J([-7.9, 9.7], 1/2*a+5)
Idèle with values:
  infinity_0:   -7.9000000000000004?
  infinity_1:   9.6999999999999993?
  other primes: 1/2*a + 5
sage: J([pi.n(), e.n()], {a+1: (16, 3), a: (1/6, 0), 5: (-1, 10)})
Idèle with values:
  infinity_0:   3.1415926535897932?
  infinity_1:   2.7182818284590451?
  (2, a + 1):   16 * U(3)
  (3, a):       1/6 * U(0)
  (5):          -1 * U(10)
  other primes: 1 * U(0)

We convert the square root a of \(3\) to an idèle:

sage: J(a)
Idèle with values:
  infinity_0:   -1.732050807568878?
  infinity_1:   1.732050807568878?
  other primes: a

We construct an idèle from \(a+2 + 8a^3O_K \in (O_K/8a^3O_K)^*\):

sage: O = K.maximal_order()
sage: Q = O.quotient(8*a^3, 'b')
sage: J(Q(a+2))
Idèle with values:
  infinity_0:   RR^*
  infinity_1:   RR^*
  (2, a + 1):   (a + 2) * U(6)
  (3, a):       (a + 2) * U(3)
  other primes: 1 * U(0)

And lastly we create an idèle from a ray class group element.

sage: G = ray_class_group(K, Modulus(K.ideal(5), [1]))
sage: J(G.gen())
Idèle with values:
  infinity_0:   RR^*
  infinity_1:   [0.0000000000000000 .. +infinity]
  (3, a):       a * U(0)
  (5):          1 * U(1)
  other primes: 1 * U(0)
_from_modulo_element(x)

Create an idèle from an element of \((O/I)^*\), with \(O\) the maximal order of our base field and \(I\) an \(O\)-ideal

EXAMPLES:

sage: J = Ideles()
sage: J._from_modulo_element(Zmod(100)(7))
Idèle with values:
  infinity_0:   RR^*
  2:            3 * U(2)
  5:            7 * U(2)
  other primes: 1 * U(0)
sage: J._from_modulo_element(Zmod(1024 * 27)(97))
Idèle with values:
  infinity_0:   RR^*
  2:            97 * U(10)
  3:            16 * U(3)
  other primes: 1 * U(0)
sage: K.<a> = NumberField(x^3-7)
sage: J = Ideles(K)
sage: O = K.maximal_order()
sage: Q = O.quotient(5*a^5, 'b')
sage: J._from_modulo_element(Q(a+1))
Idèle with values:
  infinity_0:   RR^*
  infinity_1:   CC^*
  (5, a^2 - 2*a - 1):   (a^2 - a) * U(1)
  (5, a + 2):   a^2 * U(1)
  (7, a):       (a + 1) * U(5)
  other primes: 1 * U(0)

REFERENCES:

Section 4.2 of [Her2021].

_from_ray_class(r)

Convert the ray class group element r to an idèle

Denote the ray class group to which r belongs by \(G\) and denote this idèle group by \(J\). This method implements a section of the natural homomorphism \(\phi: J \to G\).

INPUT:

  • r – a ray class group element

OUPUT:

An idèle whose represented subset is contained in the inverse image of r under \(\phi\).

EXAMPLES:

sage: Q = NumberField(x-1, "one")
sage: J = Ideles(Q)
sage: G = ray_class_group(Q, Modulus(Q.ideal(10), [0]))
sage: r = G(Q.ideal(7))
sage: r.ideal()
Fractional ideal (67)
sage: J._from_ray_class(r)
Idèle with values:
  infinity_0:   [0.0000000000000000 .. +infinity]
  (2):          1 * U(1)
  (5):          1 * U(1)
  (67):         67 * U(0)
  other primes: 1 * U(0)
sage: s = G(Q.ideal(9))
sage: factor(s.ideal())
(Fractional ideal (3)) * (Fractional ideal (163))
sage: J._from_ray_class(s)
Idèle with values:
  infinity_0:   [0.0000000000000000 .. +infinity]
  (2):          1 * U(1)
  (3):          3 * U(0)
  (5):          1 * U(1)
  (163):        163 * U(0)
  other primes: 1 * U(0)
sage: K.<a> = NumberField(x^2-6)
sage: G = ray_class_group(K, Modulus(K.ideal(10*a), [1]))
sage: r = G([3, 0, 1])
sage: [P.gens_two() for P in r.ideal().prime_factors()]
[(3389, a + 543),
 (4079, a + 2767),
 (15053, a + 13254),
 (11483827, a + 1242116)]
sage: Ideles(K)(r)
Idèle with values:
  infinity_0:   RR^*
  infinity_1:   [0.0000000000000000 .. +infinity]
  (2, a):       1 * U(3)
  (3, a):       1 * U(1)
  (5, a + 1):   -a * U(1)
  (5, a + 4):   a * U(1)
  (3389, a + 543):      2846760*a * U(0)
  (4079, a + 2767):     -2916485*a * U(0)
  (15053, a + 13254):   -94683370*a * U(0)
  (11483827, a + 1242116):      -22108284774109*a * U(0)
  other primes: 1 * U(0)

REFERENCES:

Section 4.5 of [Her2021].

Element

alias of Idele

gen(n=0)

Return the n-th generator of this group

As this group has only one generator, we only accept n == 0.

INPUT:

  • n – the index of the generator to return (default: 0); must be zero

EXAMPLES:

sage: Ideles(QQ).gen()
1
sage: Ideles(CyclotomicField(7)).gen(0)
1

TESTS:

sage: Ideles(QQ).gen(1)
Traceback (most recent call last):
...
IndexError: n must be 0
gens()

Return a tuple of generators of this group, which is (1,)

EXAMPLES:

sage: Ideles(QQ).gens()
(1,)
is_abelian()

Return True, indicating that this group is abelian

EXAMPLES:

sage: Ideles().is_abelian()
True
is_commutative()

Return True, indicating that this group is commutative

EXAMPLES:

sage: Ideles().is_commutative()
True
is_exact()

Return False, indicating that doing arithmetic can lead to precision loss

EXAMPLES:

sage: Ideles().is_exact()
False
is_finite()

Return False, indicating that this group is not finite

EXAMPLES:

sage: Ideles().is_finite()
False
ngens()

Return the number of generators of this group, which is \(1\)

EXAMPLES:

sage: Ideles().ngens()
1
number_field()

Return the base number field of this idèle group

EXAMPLES:

sage: K.<a> = NumberField(x^7-1000*x+1)
sage: J = Ideles(K)
sage: J.number_field()
Number Field in a with defining polynomial x^7 - 1000*x + 1
order()

Return the order of this group, which is Infinity

The order of a group is its number of elements.

EXAMPLES:

sage: Ideles().order()
+Infinity
random_element()

Return a random element of this idèle group

EXAMPLES:

sage: K.<a> = CyclotomicField(7)
sage: [Ideles(K).random_element() for i in range(3)] # random
[Idèle with values:
   infinity_0:  -0.51975171438300394? - 0.67367014750726840?*I
   infinity_1:  -0.85107695762543690? - 0.36389292097382331?*I
   infinity_2:  0.35558791902846210? - 0.68617671826900418?*I
   (2, a^3 + a + 1):    (1/2*a^5 + 1/13*a^4 - 2/5*a^2 - 1/3*a - 1/12) * U(2)
   (2, a^3 + a^2 + 1):  (-6*a^5 - 7*a^4 + 4*a^3 + 5/26*a^2 + 1/13) * U(5)
   (3):         -61*a^5 + 1/5*a^2 + 1/3
   (5):         1/2*a^5 - a^4 + 3*a^3 + a^2 + a + 1
   (29, a + 4): (2*a^5 + 1/2*a^3) * U(1)
   (29, a + 13):        (-589/3*a^5 + 1/2*a^3 - 1/3) * U(2)
   (71, a + 23):        (89/4*a^5 + 4/39*a^4) * U(1)
   (14183891, a - 5143802):     (-286578*a^5 + 3/8*a^2) * U(1)
   other primes:        1 * U(0),
 Idèle with values:
   infinity_0:  0.17867179666343170? - 0.14359113026337789?*I
   infinity_1:  -0.0056081648383310423? - 0.72504509402939422?*I
   infinity_2:  0.65035239845213578? - 0.76425573918357848?*I
   (2, a^3 + a + 1):    (1/2*a^4 + 1/3*a^2) * U(1)
   (2, a^3 + a^2 + 1):  (417*a^5 - 143/9*a^4 - 17*a^3 - 1/11) * U(8)
   (3):         (1/7*a^5 - 1/2*a^3 + 3/2*a^2 - 4*a - 1) * U(17)
   (127, a - 16):       (-13610448578379057367615*a^5 + 1/5*a^2 + 1/2*a - 1/3) * U(11)
   (14939, a + 3745):   (-1586328428659*a^5 - 1/7*a^3 - 1/3*a^2) * U(3)
   (1608209, a + 681759):       -a^5 * U(1)
   other primes:        1 * U(0),
 Idèle with values:
   infinity_0:  -0.79630434007873397? + 0.036877119019420591?*I
   infinity_1:  0.86806032709460435? + 0.96171997458908343?*I
   infinity_2:  0.73364936718846652? + 0.18087036068983698?*I
   (2, a^3 + a + 1):    (2*a^5 - 3/8*a^4 - a^3) * U(5)
   (2, a^3 + a^2 + 1):  (a^5 + a^3) * U(1)
   (29, a + 5): (69/8*a^5 + 1/2*a^2 + 1/5*a) * U(0)
   (29, a + 6): (-116687219*a^5 + 1/13*a^4) * U(6)
   (4943, a - 144):     -a^5 - 3*a^4 - 2/5*a^2 + a + 1/2
   other primes:        1 * U(0)]
some_elements()

Return some elements of this idèle group

EXAMPLES:

sage: K.<a> = NumberField(x^3-3)
sage: Ideles(K).some_elements()
[Idèle with values:
   infinity_0:  1
   infinity_1:  1
   other primes:        1,
 Idèle with values:
   infinity_0:  1.1000000000000001?
   infinity_1:  1*I
   (2, a + 1):  1/2 * U(0)
   (5, a - 2):  -227*a^2 * U(4)
   (7):         -1/3*a^2 * U(1)
   other primes:        1 * U(0),
 Idèle with values:
   infinity_0:  -1.442249570307409?
   infinity_1:  0.72112478515370416? - 1.2490247664834065?*I
   other primes:        -a,
 Idèle with values:
   infinity_0:  0.3666666666666667?
   infinity_1:  0.3333333333333334?*I
   (2, a + 1):  1/6 * U(0)
   (3, a):      1/3 * U(0)
   (5, a - 2):  -227/3*a^2 * U(4)
   (7):         -1/9*a^2 * U(1)
   other primes:        1 * U(0)]