Smooth characters of -adic fields¶
Let
This module contains classes to represent such characters when
An example with characters of
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp
sage: K.<z> = CyclotomicField(42)
sage: G = SmoothCharacterGroupQp(7, K)
sage: G.unit_gens(2), G.exponents(2)
([3, 7], [42, 0])
>>> from sage.all import *
>>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp
>>> K = CyclotomicField(Integer(42), names=('z',)); (z,) = K._first_ngens(1)
>>> G = SmoothCharacterGroupQp(Integer(7), K)
>>> G.unit_gens(Integer(2)), G.exponents(Integer(2))
([3, 7], [42, 0])
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp K.<z> = CyclotomicField(42) G = SmoothCharacterGroupQp(7, K) G.unit_gens(2), G.exponents(2)
The output of the last line means that the group
sage: chi = G.character(2, [z^5, 11 + z]); chi
Character of Q_7*, of level 2, mapping 3 |--> z^5, 7 |--> z + 11
sage: chi(4)
z^8
sage: chi(42)
z^10 + 11*z^9
>>> from sage.all import *
>>> chi = G.character(Integer(2), [z**Integer(5), Integer(11) + z]); chi
Character of Q_7*, of level 2, mapping 3 |--> z^5, 7 |--> z + 11
>>> chi(Integer(4))
z^8
>>> chi(Integer(42))
z^10 + 11*z^9
chi = G.character(2, [z^5, 11 + z]); chi chi(4) chi(42)
Characters are themselves group elements, and basic arithmetic on them works:
sage: chi**3
Character of Q_7*, of level 2, mapping 3 |--> z^8 - z, 7 |--> z^3 + 33*z^2 + 363*z + 1331
sage: chi.multiplicative_order()
+Infinity
>>> from sage.all import *
>>> chi**Integer(3)
Character of Q_7*, of level 2, mapping 3 |--> z^8 - z, 7 |--> z^3 + 33*z^2 + 363*z + 1331
>>> chi.multiplicative_order()
+Infinity
chi**3 chi.multiplicative_order()
- class sage.modular.local_comp.smoothchar.SmoothCharacterGeneric(parent, c, values_on_gens)[source]¶
Bases:
MultiplicativeGroupElement
A smooth (i.e. locally constant) character of
, for some finite extension of .- galois_conjugate()[source]¶
Return the composite of this character with the order
automorphism of (assuming is quadratic).Note that this is the Galois operation on the domain, not on the codomain.
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: K.<w> = CyclotomicField(3) sage: G = SmoothCharacterGroupUnramifiedQuadratic(2, K) sage: chi = G.character(2, [w, -1,-1, 3*w]) sage: chi2 = chi.galois_conjugate(); chi2 Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 2, mapping s |--> -w - 1, 2*s + 1 |--> 1, -1 |--> -1, 2 |--> 3*w sage: chi.restrict_to_Qp() == chi2.restrict_to_Qp() True sage: chi * chi2 == chi.parent().compose_with_norm(chi.restrict_to_Qp()) True
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> K = CyclotomicField(Integer(3), names=('w',)); (w,) = K._first_ngens(1) >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(2), K) >>> chi = G.character(Integer(2), [w, -Integer(1),-Integer(1), Integer(3)*w]) >>> chi2 = chi.galois_conjugate(); chi2 Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 2, mapping s |--> -w - 1, 2*s + 1 |--> 1, -1 |--> -1, 2 |--> 3*w >>> chi.restrict_to_Qp() == chi2.restrict_to_Qp() True >>> chi * chi2 == chi.parent().compose_with_norm(chi.restrict_to_Qp()) True
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic K.<w> = CyclotomicField(3) G = SmoothCharacterGroupUnramifiedQuadratic(2, K) chi = G.character(2, [w, -1,-1, 3*w]) chi2 = chi.galois_conjugate(); chi2 chi.restrict_to_Qp() == chi2.restrict_to_Qp() chi * chi2 == chi.parent().compose_with_norm(chi.restrict_to_Qp())
- level()[source]¶
Return the level of this character, i.e. the smallest integer
such that it is trivial on .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, QQ).character(2, [-1, 1]).level() 1
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), QQ).character(Integer(2), [-Integer(1), Integer(1)]).level() 1
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, QQ).character(2, [-1, 1]).level()
- multiplicative_order()[source]¶
Return the order of this character as an element of the character group.
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: K.<z> = CyclotomicField(42) sage: G = SmoothCharacterGroupQp(7, K) sage: G.character(3, [z^10 - z^3, 11]).multiplicative_order() +Infinity sage: G.character(3, [z^10 - z^3, 1]).multiplicative_order() 42 sage: G.character(1, [z^7, z^14]).multiplicative_order() 6 sage: G.character(0, [1]).multiplicative_order() 1
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> K = CyclotomicField(Integer(42), names=('z',)); (z,) = K._first_ngens(1) >>> G = SmoothCharacterGroupQp(Integer(7), K) >>> G.character(Integer(3), [z**Integer(10) - z**Integer(3), Integer(11)]).multiplicative_order() +Infinity >>> G.character(Integer(3), [z**Integer(10) - z**Integer(3), Integer(1)]).multiplicative_order() 42 >>> G.character(Integer(1), [z**Integer(7), z**Integer(14)]).multiplicative_order() 6 >>> G.character(Integer(0), [Integer(1)]).multiplicative_order() 1
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp K.<z> = CyclotomicField(42) G = SmoothCharacterGroupQp(7, K) G.character(3, [z^10 - z^3, 11]).multiplicative_order() G.character(3, [z^10 - z^3, 1]).multiplicative_order() G.character(1, [z^7, z^14]).multiplicative_order() G.character(0, [1]).multiplicative_order()
- restrict_to_Qp()[source]¶
Return the restriction of this character to
, embedded as a subfield of .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: SmoothCharacterGroupRamifiedQuadratic(3, 0, QQ).character(0, [2]).restrict_to_Qp() Character of Q_3*, of level 0, mapping 3 |--> 4
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> SmoothCharacterGroupRamifiedQuadratic(Integer(3), Integer(0), QQ).character(Integer(0), [Integer(2)]).restrict_to_Qp() Character of Q_3*, of level 0, mapping 3 |--> 4
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic SmoothCharacterGroupRamifiedQuadratic(3, 0, QQ).character(0, [2]).restrict_to_Qp()
- class sage.modular.local_comp.smoothchar.SmoothCharacterGroupGeneric(p, base_ring)[source]¶
Bases:
Parent
The group of smooth (i.e. locally constant) characters of a
-adic field, with values in some ring . This is an abstract base class and should not be instantiated directly.- Element[source]¶
alias of
SmoothCharacterGeneric
- base_extend(ring)[source]¶
Return the character group of the same field, but with values in a new coefficient ring into which the old coefficient ring coerces. An error will be raised if there is no coercion map from the old coefficient ring to the new one.
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: G = SmoothCharacterGroupQp(3, QQ) sage: G.base_extend(QQbar) Group of smooth characters of Q_3* with values in Algebraic Field sage: G.base_extend(Zmod(3)) Traceback (most recent call last): ... TypeError: no canonical coercion from Rational Field to Ring of integers modulo 3
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> G = SmoothCharacterGroupQp(Integer(3), QQ) >>> G.base_extend(QQbar) Group of smooth characters of Q_3* with values in Algebraic Field >>> G.base_extend(Zmod(Integer(3))) Traceback (most recent call last): ... TypeError: no canonical coercion from Rational Field to Ring of integers modulo 3
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp G = SmoothCharacterGroupQp(3, QQ) G.base_extend(QQbar) G.base_extend(Zmod(3))
- change_ring(ring)[source]¶
Return the character group of the same field, but with values in a different coefficient ring. To be implemented by all derived classes (since the generic base class can’t know the parameters).
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).change_ring(ZZ) Traceback (most recent call last): ... NotImplementedError: <abstract method change_ring at ...>
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).change_ring(ZZ) Traceback (most recent call last): ... NotImplementedError: <abstract method change_ring at ...>
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).change_ring(ZZ)
- character(level, values_on_gens)[source]¶
Return the unique character of the given level whose values on the generators returned by
self.unit_gens(level)
arevalues_on_gens
.INPUT:
level
– integer an integervalues_on_gens
– sequence a sequence of elements of length equal to the length ofself.unit_gens(level)
. The values should be convertible (that is, possibly noncanonically) into the base ring of self; they should all be units, and all but the last must be roots of unity (of the orders given byself.exponents(level)
.
Note
The character returned may have level less than
level
in general.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: K.<z> = CyclotomicField(42) sage: G = SmoothCharacterGroupQp(7, K) sage: G.character(2, [z^6, 8]) Character of Q_7*, of level 2, mapping 3 |--> z^6, 7 |--> 8 sage: G.character(2, [z^7, 8]) Character of Q_7*, of level 1, mapping 3 |--> z^7, 7 |--> 8
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> K = CyclotomicField(Integer(42), names=('z',)); (z,) = K._first_ngens(1) >>> G = SmoothCharacterGroupQp(Integer(7), K) >>> G.character(Integer(2), [z**Integer(6), Integer(8)]) Character of Q_7*, of level 2, mapping 3 |--> z^6, 7 |--> 8 >>> G.character(Integer(2), [z**Integer(7), Integer(8)]) Character of Q_7*, of level 1, mapping 3 |--> z^7, 7 |--> 8
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp K.<z> = CyclotomicField(42) G = SmoothCharacterGroupQp(7, K) G.character(2, [z^6, 8]) G.character(2, [z^7, 8])
Non-examples:
sage: G.character(1, [z, 1]) Traceback (most recent call last): ... ValueError: value on generator 3 (=z) should be a root of unity of order 6 sage: G.character(1, [1, 0]) Traceback (most recent call last): ... ValueError: value on uniformiser 7 (=0) should be a unit
>>> from sage.all import * >>> G.character(Integer(1), [z, Integer(1)]) Traceback (most recent call last): ... ValueError: value on generator 3 (=z) should be a root of unity of order 6 >>> G.character(Integer(1), [Integer(1), Integer(0)]) Traceback (most recent call last): ... ValueError: value on uniformiser 7 (=0) should be a unit
G.character(1, [z, 1]) G.character(1, [1, 0])
An example with a funky coefficient ring:
sage: G = SmoothCharacterGroupQp(7, Zmod(9)) sage: G.character(1, [2, 2]) Character of Q_7*, of level 1, mapping 3 |--> 2, 7 |--> 2 sage: G.character(1, [2, 3]) Traceback (most recent call last): ... ValueError: value on uniformiser 7 (=3) should be a unit
>>> from sage.all import * >>> G = SmoothCharacterGroupQp(Integer(7), Zmod(Integer(9))) >>> G.character(Integer(1), [Integer(2), Integer(2)]) Character of Q_7*, of level 1, mapping 3 |--> 2, 7 |--> 2 >>> G.character(Integer(1), [Integer(2), Integer(3)]) Traceback (most recent call last): ... ValueError: value on uniformiser 7 (=3) should be a unit
G = SmoothCharacterGroupQp(7, Zmod(9)) G.character(1, [2, 2]) G.character(1, [2, 3])
- compose_with_norm(chi)[source]¶
Calculate the character of
given by . Here should be a quadratic extension and a character of .EXAMPLES:
When
is the unramified quadratic extension, the level of the new character is the same as the old:sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupRamifiedQuadratic, SmoothCharacterGroupUnramifiedQuadratic sage: K.<w> = CyclotomicField(6) sage: G = SmoothCharacterGroupQp(3, K) sage: chi = G.character(2, [w, 5]) sage: H = SmoothCharacterGroupUnramifiedQuadratic(3, K) sage: H.compose_with_norm(chi) Character of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0), of level 2, mapping -2*s |--> -1, 4 |--> -w, 3*s + 1 |--> w - 1, 3 |--> 25
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupRamifiedQuadratic, SmoothCharacterGroupUnramifiedQuadratic >>> K = CyclotomicField(Integer(6), names=('w',)); (w,) = K._first_ngens(1) >>> G = SmoothCharacterGroupQp(Integer(3), K) >>> chi = G.character(Integer(2), [w, Integer(5)]) >>> H = SmoothCharacterGroupUnramifiedQuadratic(Integer(3), K) >>> H.compose_with_norm(chi) Character of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0), of level 2, mapping -2*s |--> -1, 4 |--> -w, 3*s + 1 |--> w - 1, 3 |--> 25
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupRamifiedQuadratic, SmoothCharacterGroupUnramifiedQuadratic K.<w> = CyclotomicField(6) G = SmoothCharacterGroupQp(3, K) chi = G.character(2, [w, 5]) H = SmoothCharacterGroupUnramifiedQuadratic(3, K) H.compose_with_norm(chi)
In ramified cases, the level of the new character may be larger:
sage: H = SmoothCharacterGroupRamifiedQuadratic(3, 0, K) sage: H.compose_with_norm(chi) Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 3, mapping 2 |--> w - 1, s + 1 |--> -w, s |--> -5
>>> from sage.all import * >>> H = SmoothCharacterGroupRamifiedQuadratic(Integer(3), Integer(0), K) >>> H.compose_with_norm(chi) Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 3, mapping 2 |--> w - 1, s + 1 |--> -w, s |--> -5
H = SmoothCharacterGroupRamifiedQuadratic(3, 0, K) H.compose_with_norm(chi)
On the other hand, since norm is not surjective, the result can even be trivial:
sage: chi = G.character(1, [-1, -1]); chi Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> -1 sage: H.compose_with_norm(chi) Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 0, mapping s |--> 1
>>> from sage.all import * >>> chi = G.character(Integer(1), [-Integer(1), -Integer(1)]); chi Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> -1 >>> H.compose_with_norm(chi) Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 0, mapping s |--> 1
chi = G.character(1, [-1, -1]); chi H.compose_with_norm(chi)
- discrete_log(level)[source]¶
Given an element
(lying in the number field of which is a completion, see module docstring), express the class of in terms of the generators of returned byunit_gens()
.This should be overridden by all derived classes. The method should first attempt to canonically coerce
intoself.number_field()
, and check that the result is not zero.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).discrete_log(3) Traceback (most recent call last): ... NotImplementedError: <abstract method discrete_log at ...>
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).discrete_log(Integer(3)) Traceback (most recent call last): ... NotImplementedError: <abstract method discrete_log at ...>
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).discrete_log(3)
- exponents(level)[source]¶
The orders
of the generators of returned byunit_gens()
.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).exponents(3) Traceback (most recent call last): ... NotImplementedError: <abstract method exponents at ...>
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).exponents(Integer(3)) Traceback (most recent call last): ... NotImplementedError: <abstract method exponents at ...>
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).exponents(3)
- ideal(level)[source]¶
Return the
level
-th power of the maximal ideal of the ring of integers of the -adic field. Since we approximate by using number field arithmetic, what is actually returned is an ideal in a number field.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).ideal(3) Traceback (most recent call last): ... NotImplementedError: <abstract method ideal at ...>
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).ideal(Integer(3)) Traceback (most recent call last): ... NotImplementedError: <abstract method ideal at ...>
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).ideal(3)
- norm_character()[source]¶
Return the normalised absolute value character in this group (mapping a uniformiser to
where is the order of the residue field).EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic sage: SmoothCharacterGroupQp(5, QQ).norm_character() Character of Q_5*, of level 0, mapping 5 |--> 1/5 sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).norm_character() Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 0, mapping 2 |--> 1/4
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic >>> SmoothCharacterGroupQp(Integer(5), QQ).norm_character() Character of Q_5*, of level 0, mapping 5 |--> 1/5 >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).norm_character() Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 0, mapping 2 |--> 1/4
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic SmoothCharacterGroupQp(5, QQ).norm_character() SmoothCharacterGroupUnramifiedQuadratic(2, QQ).norm_character()
- prime()[source]¶
The residue characteristic of the underlying field.
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).prime() 3
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).prime() 3
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).prime()
- subgroup_gens(level)[source]¶
A set of elements of
generating the kernel of the reduction map to .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).subgroup_gens(3) Traceback (most recent call last): ... NotImplementedError: <abstract method subgroup_gens at ...>
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).subgroup_gens(Integer(3)) Traceback (most recent call last): ... NotImplementedError: <abstract method subgroup_gens at ...>
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).subgroup_gens(3)
- unit_gens(level)[source]¶
A list of generators
of the abelian group , where is the given level, satisfying no relations other than for each (where the integers are returned byexponents()
). We adopt the convention that the final generator is a uniformiser (and ).EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric sage: SmoothCharacterGroupGeneric(3, QQ).unit_gens(3) Traceback (most recent call last): ... NotImplementedError: <abstract method unit_gens at ...>
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric >>> SmoothCharacterGroupGeneric(Integer(3), QQ).unit_gens(Integer(3)) Traceback (most recent call last): ... NotImplementedError: <abstract method unit_gens at ...>
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupGeneric SmoothCharacterGroupGeneric(3, QQ).unit_gens(3)
- class sage.modular.local_comp.smoothchar.SmoothCharacterGroupQp(p, base_ring)[source]¶
Bases:
SmoothCharacterGroupGeneric
The group of smooth characters of
, with values in some fixed base ring.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: G = SmoothCharacterGroupQp(7, QQ); G Group of smooth characters of Q_7* with values in Rational Field sage: TestSuite(G).run() sage: G == loads(dumps(G)) True
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> G = SmoothCharacterGroupQp(Integer(7), QQ); G Group of smooth characters of Q_7* with values in Rational Field >>> TestSuite(G).run() >>> G == loads(dumps(G)) True
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp G = SmoothCharacterGroupQp(7, QQ); G TestSuite(G).run() G == loads(dumps(G))
- change_ring(ring)[source]¶
Return the group of characters of the same field but with values in a different ring. This need not have anything to do with the original base ring, and in particular there won’t generally be a coercion map from
self
to the new group – usebase_extend()
if you want this.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, Zmod(3)).change_ring(CC) Group of smooth characters of Q_7* with values in Complex Field with 53 bits of precision
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), Zmod(Integer(3))).change_ring(CC) Group of smooth characters of Q_7* with values in Complex Field with 53 bits of precision
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, Zmod(3)).change_ring(CC)
- discrete_log(level, x)[source]¶
Express the class of
in in terms of the generators returned byunit_gens()
.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: G = SmoothCharacterGroupQp(7, QQ) sage: G.discrete_log(0, 14) [1] sage: G.discrete_log(1, 14) [2, 1] sage: G.discrete_log(5, 14) [9308, 1]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> G = SmoothCharacterGroupQp(Integer(7), QQ) >>> G.discrete_log(Integer(0), Integer(14)) [1] >>> G.discrete_log(Integer(1), Integer(14)) [2, 1] >>> G.discrete_log(Integer(5), Integer(14)) [9308, 1]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp G = SmoothCharacterGroupQp(7, QQ) G.discrete_log(0, 14) G.discrete_log(1, 14) G.discrete_log(5, 14)
- exponents(level)[source]¶
Return the exponents of the generators returned by
unit_gens()
.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, QQ).exponents(3) [294, 0] sage: SmoothCharacterGroupQp(2, QQ).exponents(4) [2, 4, 0]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), QQ).exponents(Integer(3)) [294, 0] >>> SmoothCharacterGroupQp(Integer(2), QQ).exponents(Integer(4)) [2, 4, 0]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, QQ).exponents(3) SmoothCharacterGroupQp(2, QQ).exponents(4)
- from_dirichlet(chi)[source]¶
Given a Dirichlet character
, return the factor at p of the adelic character which satisfies for almost all , where is a uniformizer at .More concretely, if we write
as a product of characters of p-power, resp prime-to-p, conductor, then this function returns the character of sending to and agreeing with on integers that are 1 modulo M and coprime to .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: G = SmoothCharacterGroupQp(3, CyclotomicField(6)) sage: G.from_dirichlet(DirichletGroup(9).0) Character of Q_3*, of level 2, mapping 2 |--> -zeta6 + 1, 3 |--> 1
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> G = SmoothCharacterGroupQp(Integer(3), CyclotomicField(Integer(6))) >>> G.from_dirichlet(DirichletGroup(Integer(9)).gen(0)) Character of Q_3*, of level 2, mapping 2 |--> -zeta6 + 1, 3 |--> 1
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp G = SmoothCharacterGroupQp(3, CyclotomicField(6)) G.from_dirichlet(DirichletGroup(9).0)
- ideal(level)[source]¶
Return the
level
-th power of the maximal ideal. Since we approximate by using rational arithmetic, what is actually returned is an ideal of .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, Zmod(3)).ideal(2) Principal ideal (49) of Integer Ring
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), Zmod(Integer(3))).ideal(Integer(2)) Principal ideal (49) of Integer Ring
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, Zmod(3)).ideal(2)
- number_field()[source]¶
Return the number field used for calculations (a dense subfield of the local field of which this is the character group). In this case, this is always the rational field.
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, Zmod(3)).number_field() Rational Field
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), Zmod(Integer(3))).number_field() Rational Field
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, Zmod(3)).number_field()
- quadratic_chars()[source]¶
Return a list of the (non-trivial) quadratic characters in this group. This will be a list of 3 characters, unless
when there are 7.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, QQ).quadratic_chars() [Character of Q_7*, of level 0, mapping 7 |--> -1, Character of Q_7*, of level 1, mapping 3 |--> -1, 7 |--> -1, Character of Q_7*, of level 1, mapping 3 |--> -1, 7 |--> 1] sage: SmoothCharacterGroupQp(2, QQ).quadratic_chars() [Character of Q_2*, of level 0, mapping 2 |--> -1, Character of Q_2*, of level 2, mapping 3 |--> -1, 2 |--> -1, Character of Q_2*, of level 2, mapping 3 |--> -1, 2 |--> 1, Character of Q_2*, of level 3, mapping 7 |--> -1, 5 |--> -1, 2 |--> -1, Character of Q_2*, of level 3, mapping 7 |--> -1, 5 |--> -1, 2 |--> 1, Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> -1, Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> 1]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), QQ).quadratic_chars() [Character of Q_7*, of level 0, mapping 7 |--> -1, Character of Q_7*, of level 1, mapping 3 |--> -1, 7 |--> -1, Character of Q_7*, of level 1, mapping 3 |--> -1, 7 |--> 1] >>> SmoothCharacterGroupQp(Integer(2), QQ).quadratic_chars() [Character of Q_2*, of level 0, mapping 2 |--> -1, Character of Q_2*, of level 2, mapping 3 |--> -1, 2 |--> -1, Character of Q_2*, of level 2, mapping 3 |--> -1, 2 |--> 1, Character of Q_2*, of level 3, mapping 7 |--> -1, 5 |--> -1, 2 |--> -1, Character of Q_2*, of level 3, mapping 7 |--> -1, 5 |--> -1, 2 |--> 1, Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> -1, Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> 1]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, QQ).quadratic_chars() SmoothCharacterGroupQp(2, QQ).quadratic_chars()
- subgroup_gens(level)[source]¶
Return a list of generators for the kernel of the map
.INPUT:
c
– integer
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: G = SmoothCharacterGroupQp(7, QQ) sage: G.subgroup_gens(1) [3] sage: G.subgroup_gens(2) [8] sage: G = SmoothCharacterGroupQp(2, QQ) sage: G.subgroup_gens(1) [] sage: G.subgroup_gens(2) [3] sage: G.subgroup_gens(3) [5]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> G = SmoothCharacterGroupQp(Integer(7), QQ) >>> G.subgroup_gens(Integer(1)) [3] >>> G.subgroup_gens(Integer(2)) [8] >>> G = SmoothCharacterGroupQp(Integer(2), QQ) >>> G.subgroup_gens(Integer(1)) [] >>> G.subgroup_gens(Integer(2)) [3] >>> G.subgroup_gens(Integer(3)) [5]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp G = SmoothCharacterGroupQp(7, QQ) G.subgroup_gens(1) G.subgroup_gens(2) G = SmoothCharacterGroupQp(2, QQ) G.subgroup_gens(1) G.subgroup_gens(2) G.subgroup_gens(3)
- unit_gens(level)[source]¶
Return a set of generators
for . These must be independent in the sense that there are no relations between them other than relations of the form . They need not, however, be in Smith normal form.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp sage: SmoothCharacterGroupQp(7, QQ).unit_gens(3) [3, 7] sage: SmoothCharacterGroupQp(2, QQ).unit_gens(4) [15, 5, 2]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp >>> SmoothCharacterGroupQp(Integer(7), QQ).unit_gens(Integer(3)) [3, 7] >>> SmoothCharacterGroupQp(Integer(2), QQ).unit_gens(Integer(4)) [15, 5, 2]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp SmoothCharacterGroupQp(7, QQ).unit_gens(3) SmoothCharacterGroupQp(2, QQ).unit_gens(4)
- class sage.modular.local_comp.smoothchar.SmoothCharacterGroupQuadratic(p, base_ring)[source]¶
Bases:
SmoothCharacterGroupGeneric
The group of smooth characters of
, where is a quadratic extension of .- discrete_log(level, x, gens=None)[source]¶
Express the class of
in in terms of the generators returned byself.unit_gens(level)
, or a custom set of generators if given.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: G = SmoothCharacterGroupUnramifiedQuadratic(2, QQ) sage: G.discrete_log(0, 12) [2] sage: G.discrete_log(1, 12) [0, 2] sage: v = G.discrete_log(5, 12); v [0, 2, 0, 1, 2] sage: g = G.unit_gens(5); prod([g[i]**v[i] for i in [0..4]])/12 - 1 in G.ideal(5) True sage: G.discrete_log(3,G.number_field()([1,1])) [2, 0, 0, 1, 0] sage: H = SmoothCharacterGroupUnramifiedQuadratic(5, QQ) sage: x = H.number_field()([1,1]); x s + 1 sage: v = H.discrete_log(5, x); v [22, 263, 379, 0] sage: h = H.unit_gens(5); prod([h[i]**v[i] for i in [0..3]])/x - 1 in H.ideal(5) True sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: G = SmoothCharacterGroupRamifiedQuadratic(3, 1, QQ) sage: s = G.number_field().gen() sage: dl = G.discrete_log(4, 3 + 2*s) sage: gs = G.unit_gens(4); gs[0]^dl[0] * gs[1]^dl[1] * gs[2]^dl[2] * gs[3]^dl[3] - (3 + 2*s) in G.ideal(4) True
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ) >>> G.discrete_log(Integer(0), Integer(12)) [2] >>> G.discrete_log(Integer(1), Integer(12)) [0, 2] >>> v = G.discrete_log(Integer(5), Integer(12)); v [0, 2, 0, 1, 2] >>> g = G.unit_gens(Integer(5)); prod([g[i]**v[i] for i in (ellipsis_range(Integer(0),Ellipsis,Integer(4)))])/Integer(12) - Integer(1) in G.ideal(Integer(5)) True >>> G.discrete_log(Integer(3),G.number_field()([Integer(1),Integer(1)])) [2, 0, 0, 1, 0] >>> H = SmoothCharacterGroupUnramifiedQuadratic(Integer(5), QQ) >>> x = H.number_field()([Integer(1),Integer(1)]); x s + 1 >>> v = H.discrete_log(Integer(5), x); v [22, 263, 379, 0] >>> h = H.unit_gens(Integer(5)); prod([h[i]**v[i] for i in (ellipsis_range(Integer(0),Ellipsis,Integer(3)))])/x - Integer(1) in H.ideal(Integer(5)) True >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> G = SmoothCharacterGroupRamifiedQuadratic(Integer(3), Integer(1), QQ) >>> s = G.number_field().gen() >>> dl = G.discrete_log(Integer(4), Integer(3) + Integer(2)*s) >>> gs = G.unit_gens(Integer(4)); gs[Integer(0)]**dl[Integer(0)] * gs[Integer(1)]**dl[Integer(1)] * gs[Integer(2)]**dl[Integer(2)] * gs[Integer(3)]**dl[Integer(3)] - (Integer(3) + Integer(2)*s) in G.ideal(Integer(4)) True
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic G = SmoothCharacterGroupUnramifiedQuadratic(2, QQ) G.discrete_log(0, 12) G.discrete_log(1, 12) v = G.discrete_log(5, 12); v g = G.unit_gens(5); prod([g[i]**v[i] for i in [0..4]])/12 - 1 in G.ideal(5) G.discrete_log(3,G.number_field()([1,1])) H = SmoothCharacterGroupUnramifiedQuadratic(5, QQ) x = H.number_field()([1,1]); x v = H.discrete_log(5, x); v h = H.unit_gens(5); prod([h[i]**v[i] for i in [0..3]])/x - 1 in H.ideal(5) from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic G = SmoothCharacterGroupRamifiedQuadratic(3, 1, QQ) s = G.number_field().gen() dl = G.discrete_log(4, 3 + 2*s) gs = G.unit_gens(4); gs[0]^dl[0] * gs[1]^dl[1] * gs[2]^dl[2] * gs[3]^dl[3] - (3 + 2*s) in G.ideal(4)
An example with a custom generating set:
sage: G.discrete_log(2, s+3, gens=[s, s+1, 2]) [1, 2, 0]
>>> from sage.all import * >>> G.discrete_log(Integer(2), s+Integer(3), gens=[s, s+Integer(1), Integer(2)]) [1, 2, 0]
G.discrete_log(2, s+3, gens=[s, s+1, 2])
- extend_character(level, chi, vals, check=True)[source]¶
Return the unique character of
which coincides with on and maps the generators of the quotient returned byquotient_gens()
tovals
.INPUT:
chi
– a smooth character of , where is the residue characteristic of , with values in the base ring ofself
(or some other ring coercible to it)level
– the level of the new character (which should be at least the level ofchi
)vals
– a list of elements of the base ring ofself
(or some other ring coercible to it), specifying values on the quotients returned byquotient_gens()
A
ValueError
will be raised if , where is the smallest integer such that is congruent modulo to an element of .EXAMPLES:
We extend an unramified character of
to the unramified quadratic extension in various ways.sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic sage: chi = SmoothCharacterGroupQp(5, QQ).character(0, [7]); chi Character of Q_5*, of level 0, mapping 5 |--> 7 sage: G = SmoothCharacterGroupUnramifiedQuadratic(5, QQ) sage: G.extend_character(1, chi, [-1]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1, 5 |--> 7 sage: G.extend_character(2, chi, [-1]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1, 5 |--> 7 sage: G.extend_character(3, chi, [1]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 0, mapping 5 |--> 7 sage: K.<z> = CyclotomicField(6); G.base_extend(K).extend_character(1, chi, [z]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -z + 1, 5 |--> 7
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic >>> chi = SmoothCharacterGroupQp(Integer(5), QQ).character(Integer(0), [Integer(7)]); chi Character of Q_5*, of level 0, mapping 5 |--> 7 >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(5), QQ) >>> G.extend_character(Integer(1), chi, [-Integer(1)]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1, 5 |--> 7 >>> G.extend_character(Integer(2), chi, [-Integer(1)]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1, 5 |--> 7 >>> G.extend_character(Integer(3), chi, [Integer(1)]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 0, mapping 5 |--> 7 >>> K = CyclotomicField(Integer(6), names=('z',)); (z,) = K._first_ngens(1); G.base_extend(K).extend_character(Integer(1), chi, [z]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -z + 1, 5 |--> 7
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupQp, SmoothCharacterGroupUnramifiedQuadratic chi = SmoothCharacterGroupQp(5, QQ).character(0, [7]); chi G = SmoothCharacterGroupUnramifiedQuadratic(5, QQ) G.extend_character(1, chi, [-1]) G.extend_character(2, chi, [-1]) G.extend_character(3, chi, [1]) K.<z> = CyclotomicField(6); G.base_extend(K).extend_character(1, chi, [z])
We extend the nontrivial quadratic character:
sage: chi = SmoothCharacterGroupQp(5, QQ).character(1, [-1, 7]) sage: K.<z> = CyclotomicField(24); G.base_extend(K).extend_character(1, chi, [z^6]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -z^6, 5 |--> 7
>>> from sage.all import * >>> chi = SmoothCharacterGroupQp(Integer(5), QQ).character(Integer(1), [-Integer(1), Integer(7)]) >>> K = CyclotomicField(Integer(24), names=('z',)); (z,) = K._first_ngens(1); G.base_extend(K).extend_character(Integer(1), chi, [z**Integer(6)]) Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -z^6, 5 |--> 7
chi = SmoothCharacterGroupQp(5, QQ).character(1, [-1, 7]) K.<z> = CyclotomicField(24); G.base_extend(K).extend_character(1, chi, [z^6])
Extensions of higher level:
sage: K.<z> = CyclotomicField(20); rho = G.base_extend(K).extend_character(2, chi, [z]); rho Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 2, mapping 11*s - 10 |--> z^5, 6 |--> 1, 5*s + 1 |--> z^4, 5 |--> 7 sage: rho(3) -1
>>> from sage.all import * >>> K = CyclotomicField(Integer(20), names=('z',)); (z,) = K._first_ngens(1); rho = G.base_extend(K).extend_character(Integer(2), chi, [z]); rho Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 2, mapping 11*s - 10 |--> z^5, 6 |--> 1, 5*s + 1 |--> z^4, 5 |--> 7 >>> rho(Integer(3)) -1
K.<z> = CyclotomicField(20); rho = G.base_extend(K).extend_character(2, chi, [z]); rho rho(3)
Examples where it doesn’t work:
sage: G.extend_character(1, chi, [1]) Traceback (most recent call last): ... ValueError: Invalid values for extension sage: G = SmoothCharacterGroupQp(2, QQ); H = SmoothCharacterGroupUnramifiedQuadratic(2, QQ) sage: chi = G.character(3, [1, -1, 7]) sage: H.extend_character(2, chi, [-1]) Traceback (most recent call last): ... ValueError: Level of extended character cannot be smaller than level of character of Qp
>>> from sage.all import * >>> G.extend_character(Integer(1), chi, [Integer(1)]) Traceback (most recent call last): ... ValueError: Invalid values for extension >>> G = SmoothCharacterGroupQp(Integer(2), QQ); H = SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ) >>> chi = G.character(Integer(3), [Integer(1), -Integer(1), Integer(7)]) >>> H.extend_character(Integer(2), chi, [-Integer(1)]) Traceback (most recent call last): ... ValueError: Level of extended character cannot be smaller than level of character of Qp
G.extend_character(1, chi, [1]) G = SmoothCharacterGroupQp(2, QQ); H = SmoothCharacterGroupUnramifiedQuadratic(2, QQ) chi = G.character(3, [1, -1, 7]) H.extend_character(2, chi, [-1])
- quotient_gens(n)[source]¶
Return a list of elements of
which are a generating set for the quotient , consisting of elements which are “minimal” in the sense of [LW12].In the examples we implement here, this quotient is almost always cyclic: the exceptions are the unramified quadratic extension of
for , and the extension for .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: G = SmoothCharacterGroupUnramifiedQuadratic(7,QQ) sage: G.quotient_gens(1) [2*s - 2] sage: G.quotient_gens(2) [15*s + 21] sage: G.quotient_gens(3) [-75*s + 33]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(7),QQ) >>> G.quotient_gens(Integer(1)) [2*s - 2] >>> G.quotient_gens(Integer(2)) [15*s + 21] >>> G.quotient_gens(Integer(3)) [-75*s + 33]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic G = SmoothCharacterGroupUnramifiedQuadratic(7,QQ) G.quotient_gens(1) G.quotient_gens(2) G.quotient_gens(3)
A ramified case:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: G = SmoothCharacterGroupRamifiedQuadratic(7, 0, QQ) sage: G.quotient_gens(3) [22*s + 21]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> G = SmoothCharacterGroupRamifiedQuadratic(Integer(7), Integer(0), QQ) >>> G.quotient_gens(Integer(3)) [22*s + 21]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic G = SmoothCharacterGroupRamifiedQuadratic(7, 0, QQ) G.quotient_gens(3)
An example where the quotient group is not cyclic:
sage: G = SmoothCharacterGroupUnramifiedQuadratic(2,QQ) sage: G.quotient_gens(1) [s + 1] sage: G.quotient_gens(2) [-s + 2] sage: G.quotient_gens(3) [-17*s - 14, 3*s - 2]
>>> from sage.all import * >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(2),QQ) >>> G.quotient_gens(Integer(1)) [s + 1] >>> G.quotient_gens(Integer(2)) [-s + 2] >>> G.quotient_gens(Integer(3)) [-17*s - 14, 3*s - 2]
G = SmoothCharacterGroupUnramifiedQuadratic(2,QQ) G.quotient_gens(1) G.quotient_gens(2) G.quotient_gens(3)
- class sage.modular.local_comp.smoothchar.SmoothCharacterGroupRamifiedQuadratic(prime, flag, base_ring, names='s')[source]¶
Bases:
SmoothCharacterGroupQuadratic
The group of smooth characters of
, where is a ramified quadratic extension of , and .- change_ring(ring)[source]¶
Return the character group of the same field, but with values in a different coefficient ring. This need not have anything to do with the original base ring, and in particular there won’t generally be a coercion map from
self
to the new group – usebase_extend()
if you want this.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: SmoothCharacterGroupRamifiedQuadratic(7, 1, Zmod(3), names='foo').change_ring(CC) Group of smooth characters of ramified extension Q_7(foo)* (foo^2 - 35 = 0) with values in Complex Field with 53 bits of precision
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> SmoothCharacterGroupRamifiedQuadratic(Integer(7), Integer(1), Zmod(Integer(3)), names='foo').change_ring(CC) Group of smooth characters of ramified extension Q_7(foo)* (foo^2 - 35 = 0) with values in Complex Field with 53 bits of precision
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic SmoothCharacterGroupRamifiedQuadratic(7, 1, Zmod(3), names='foo').change_ring(CC)
- exponents(c)[source]¶
Return the orders of the independent generators of the unit group returned by
unit_gens()
.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: G = SmoothCharacterGroupRamifiedQuadratic(5, 0, QQ) sage: G.exponents(0) (0,) sage: G.exponents(1) (4, 0) sage: G.exponents(8) (500, 625, 0)
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> G = SmoothCharacterGroupRamifiedQuadratic(Integer(5), Integer(0), QQ) >>> G.exponents(Integer(0)) (0,) >>> G.exponents(Integer(1)) (4, 0) >>> G.exponents(Integer(8)) (500, 625, 0)
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic G = SmoothCharacterGroupRamifiedQuadratic(5, 0, QQ) G.exponents(0) G.exponents(1) G.exponents(8)
- ideal(c)[source]¶
Return the ideal
ofself.number_field()
. The result is cached, since we use the methodsidealstar()
andideallog()
which cache a Paribid
structure.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: G = SmoothCharacterGroupRamifiedQuadratic(5, 1, QQ, 'a'); I = G.ideal(3); I Fractional ideal (25, 5*a) sage: I is G.ideal(3) True
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> G = SmoothCharacterGroupRamifiedQuadratic(Integer(5), Integer(1), QQ, 'a'); I = G.ideal(Integer(3)); I Fractional ideal (25, 5*a) >>> I is G.ideal(Integer(3)) True
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic G = SmoothCharacterGroupRamifiedQuadratic(5, 1, QQ, 'a'); I = G.ideal(3); I I is G.ideal(3)
- number_field()[source]¶
Return a number field of which this is the completion at
.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: SmoothCharacterGroupRamifiedQuadratic(7, 0, QQ, 'a').number_field() Number Field in a with defining polynomial x^2 - 7 sage: SmoothCharacterGroupRamifiedQuadratic(5, 1, QQ, 'b').number_field() Number Field in b with defining polynomial x^2 - 10 sage: SmoothCharacterGroupRamifiedQuadratic(7, 1, Zmod(6), 'c').number_field() Number Field in c with defining polynomial x^2 - 35
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> SmoothCharacterGroupRamifiedQuadratic(Integer(7), Integer(0), QQ, 'a').number_field() Number Field in a with defining polynomial x^2 - 7 >>> SmoothCharacterGroupRamifiedQuadratic(Integer(5), Integer(1), QQ, 'b').number_field() Number Field in b with defining polynomial x^2 - 10 >>> SmoothCharacterGroupRamifiedQuadratic(Integer(7), Integer(1), Zmod(Integer(6)), 'c').number_field() Number Field in c with defining polynomial x^2 - 35
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic SmoothCharacterGroupRamifiedQuadratic(7, 0, QQ, 'a').number_field() SmoothCharacterGroupRamifiedQuadratic(5, 1, QQ, 'b').number_field() SmoothCharacterGroupRamifiedQuadratic(7, 1, Zmod(6), 'c').number_field()
- subgroup_gens(level)[source]¶
A set of elements of
generating the kernel of the reduction map to .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: G = SmoothCharacterGroupRamifiedQuadratic(3, 1, QQ) sage: G.subgroup_gens(2) [s + 1]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> G = SmoothCharacterGroupRamifiedQuadratic(Integer(3), Integer(1), QQ) >>> G.subgroup_gens(Integer(2)) [s + 1]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic G = SmoothCharacterGroupRamifiedQuadratic(3, 1, QQ) G.subgroup_gens(2)
- unit_gens(c)[source]¶
A list of generators
of the abelian group , where is the given level, satisfying no relations other than for each (where the integers are returned byexponents()
). We adopt the convention that the final generator is a uniformiser.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic sage: G = SmoothCharacterGroupRamifiedQuadratic(5, 0, QQ) sage: G.unit_gens(0) [s] sage: G.unit_gens(1) [2, s] sage: G.unit_gens(8) [2, s + 1, s]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic >>> G = SmoothCharacterGroupRamifiedQuadratic(Integer(5), Integer(0), QQ) >>> G.unit_gens(Integer(0)) [s] >>> G.unit_gens(Integer(1)) [2, s] >>> G.unit_gens(Integer(8)) [2, s + 1, s]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupRamifiedQuadratic G = SmoothCharacterGroupRamifiedQuadratic(5, 0, QQ) G.unit_gens(0) G.unit_gens(1) G.unit_gens(8)
- class sage.modular.local_comp.smoothchar.SmoothCharacterGroupUnramifiedQuadratic(prime, base_ring, names='s')[source]¶
Bases:
SmoothCharacterGroupQuadratic
The group of smooth characters of
, where is the unique unramified quadratic extension of . We represent internally as the completion at the prime above of a quadratic number field, defined by (the obvious lift to of) the Conway polynomial modulo of degree 2.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: G = SmoothCharacterGroupUnramifiedQuadratic(3, QQ); G Group of smooth characters of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0) with values in Rational Field sage: G.unit_gens(3) [-11*s, 4, 3*s + 1, 3] sage: TestSuite(G).run() sage: TestSuite(SmoothCharacterGroupUnramifiedQuadratic(2, QQ)).run()
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(3), QQ); G Group of smooth characters of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0) with values in Rational Field >>> G.unit_gens(Integer(3)) [-11*s, 4, 3*s + 1, 3] >>> TestSuite(G).run() >>> TestSuite(SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ)).run()
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic G = SmoothCharacterGroupUnramifiedQuadratic(3, QQ); G G.unit_gens(3) TestSuite(G).run() TestSuite(SmoothCharacterGroupUnramifiedQuadratic(2, QQ)).run()
- change_ring(ring)[source]¶
Return the character group of the same field, but with values in a different coefficient ring. This need not have anything to do with the original base ring, and in particular there won’t generally be a coercion map from
self
to the new group – usebase_extend()
if you want this.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: SmoothCharacterGroupUnramifiedQuadratic(7, Zmod(3), names='foo').change_ring(CC) Group of smooth characters of unramified extension Q_7(foo)* (foo^2 + 6*foo + 3 = 0) with values in Complex Field with 53 bits of precision
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), Zmod(Integer(3)), names='foo').change_ring(CC) Group of smooth characters of unramified extension Q_7(foo)* (foo^2 + 6*foo + 3 = 0) with values in Complex Field with 53 bits of precision
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic SmoothCharacterGroupUnramifiedQuadratic(7, Zmod(3), names='foo').change_ring(CC)
- exponents(c)[source]¶
The orders
of the generators of returned byunit_gens()
.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).exponents(2) [48, 7, 7, 0] sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).exponents(3) [3, 4, 2, 2, 0] sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).exponents(2) [3, 2, 2, 0]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).exponents(Integer(2)) [48, 7, 7, 0] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).exponents(Integer(3)) [3, 4, 2, 2, 0] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).exponents(Integer(2)) [3, 2, 2, 0]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic SmoothCharacterGroupUnramifiedQuadratic(7, QQ).exponents(2) SmoothCharacterGroupUnramifiedQuadratic(2, QQ).exponents(3) SmoothCharacterGroupUnramifiedQuadratic(2, QQ).exponents(2)
- ideal(c)[source]¶
Return the ideal
ofself.number_field()
. The result is cached, since we use the methodsidealstar()
andideallog()
which cache a Paribid
structure.EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: G = SmoothCharacterGroupUnramifiedQuadratic(7, QQ, 'a'); I = G.ideal(3); I Fractional ideal (343) sage: I is G.ideal(3) True
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> G = SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ, 'a'); I = G.ideal(Integer(3)); I Fractional ideal (343) >>> I is G.ideal(Integer(3)) True
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic G = SmoothCharacterGroupUnramifiedQuadratic(7, QQ, 'a'); I = G.ideal(3); I I is G.ideal(3)
- number_field()[source]¶
Return a number field of which this is the completion at
, defined by a polynomial whose discriminant is not divisible by .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ, 'a').number_field() Number Field in a with defining polynomial x^2 + 6*x + 3 sage: SmoothCharacterGroupUnramifiedQuadratic(5, QQ, 'b').number_field() Number Field in b with defining polynomial x^2 + 4*x + 2 sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ, 'c').number_field() Number Field in c with defining polynomial x^2 + x + 1
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ, 'a').number_field() Number Field in a with defining polynomial x^2 + 6*x + 3 >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(5), QQ, 'b').number_field() Number Field in b with defining polynomial x^2 + 4*x + 2 >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ, 'c').number_field() Number Field in c with defining polynomial x^2 + x + 1
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic SmoothCharacterGroupUnramifiedQuadratic(7, QQ, 'a').number_field() SmoothCharacterGroupUnramifiedQuadratic(5, QQ, 'b').number_field() SmoothCharacterGroupUnramifiedQuadratic(2, QQ, 'c').number_field()
- subgroup_gens(level)[source]¶
A set of elements of
generating the kernel of the reduction map to .EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).subgroup_gens(1) [s] sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).subgroup_gens(2) [8, 7*s + 1] sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).subgroup_gens(2) [3, 2*s + 1]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).subgroup_gens(Integer(1)) [s] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).subgroup_gens(Integer(2)) [8, 7*s + 1] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).subgroup_gens(Integer(2)) [3, 2*s + 1]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic SmoothCharacterGroupUnramifiedQuadratic(7, QQ).subgroup_gens(1) SmoothCharacterGroupUnramifiedQuadratic(7, QQ).subgroup_gens(2) SmoothCharacterGroupUnramifiedQuadratic(2, QQ).subgroup_gens(2)
- unit_gens(c)[source]¶
A list of generators
of the abelian group , where is the given level, satisfying no relations other than for each (where the integers are returned byexponents()
). We adopt the convention that the final generator is a uniformiser (and ).ALGORITHM: Use Teichmueller lifts.
EXAMPLES:
sage: from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(0) [7] sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(1) [s, 7] sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(2) [22*s, 8, 7*s + 1, 7] sage: SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(3) [169*s + 49, 8, 7*s + 1, 7]
>>> from sage.all import * >>> from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).unit_gens(Integer(0)) [7] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).unit_gens(Integer(1)) [s, 7] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).unit_gens(Integer(2)) [22*s, 8, 7*s + 1, 7] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(7), QQ).unit_gens(Integer(3)) [169*s + 49, 8, 7*s + 1, 7]
from sage.modular.local_comp.smoothchar import SmoothCharacterGroupUnramifiedQuadratic SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(0) SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(1) SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(2) SmoothCharacterGroupUnramifiedQuadratic(7, QQ).unit_gens(3)
In the 2-adic case there can be more than 4 generators:
sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(0) [2] sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(1) [s, 2] sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(2) [s, 2*s + 1, -1, 2] sage: SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(3) [s, 2*s + 1, 4*s + 1, -1, 2]
>>> from sage.all import * >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).unit_gens(Integer(0)) [2] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).unit_gens(Integer(1)) [s, 2] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).unit_gens(Integer(2)) [s, 2*s + 1, -1, 2] >>> SmoothCharacterGroupUnramifiedQuadratic(Integer(2), QQ).unit_gens(Integer(3)) [s, 2*s + 1, 4*s + 1, -1, 2]
SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(0) SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(1) SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(2) SmoothCharacterGroupUnramifiedQuadratic(2, QQ).unit_gens(3)