In this chapter \(p\) is always a (fixed) prime integer.
The \(p\)-adic numbers \(Q_p\) are the completion of the rational numbers with respect to the valuation \(\nu_p( p^v \cdot a / b) = v\) if \(p\) divides neither \(a\) nor \(b\). They form a field of characteristic 0 which nevertheless shows some behaviour of the finite field with \(p\) elements.
A \(p\)-adic numbers can be represented by a "\(p\)-adic expansion" which is similar to the decimal expansion used for the reals (but written from left to right). So for example if \(p = 2\), the numbers \(1\), \(2\), \(3\), \(4\), \(1/2\), and \(4/5\) are represented as \(1(2)\), \(0.1(2)\), \(1.1(2)\), \(0.01(2)\), \(10(2)\), and the infinite periodic expansion \(0.010110011001100...(2)\). \(p\)-adic numbers can be approximated by ignoring higher powers of \(p\), so for example with only 2 digits accuracy \(4/5\) would be approximated as \(0.01(2)\). This is different from the decimal approximation of real numbers in that \(p\)-adic approximation is a ring homomorphism on the subrings of \(p\)-adic numbers whose valuation is bounded from below so that rounding errors do not increase with repeated calculations.
In GAP, \(p\)-adic numbers are always represented by such approximations. A family of approximated \(p\)-adic numbers consists of \(p\)-adic numbers with a fixed prime \(p\) and a certain precision, and arithmetic with these numbers is done with this precision.
Pure \(p\)-adic numbers are the \(p\)-adic numbers described so far.
‣ PurePadicNumberFamily ( p, precision ) | ( function ) |
returns the family of pure \(p\)-adic numbers over the prime p with precision "digits". That is to say, the approximate value will differ from the correct value by a multiple of \(p^{digits}\).
‣ PadicNumber ( fam, rat ) | ( operation ) |
returns the element of the \(p\)-adic number family fam that approximates the rational number rat.
\(p\)-adic numbers allow the usual operations for fields.
gap> fam:=PurePadicNumberFamily(2,20);; gap> a:=PadicNumber(fam,4/5); 0.010110011001100110011(2) gap> fam:=PurePadicNumberFamily(2,3);; gap> a:=PadicNumber(fam,4/5); 0.0101(2) gap> 3*a; 0.0111(2) gap> a/2; 0.101(2) gap> a*10; 0.001(2)
See PadicNumber
(68.2-2) for other methods for PadicNumber
.
‣ Valuation ( obj ) | ( operation ) |
The valuation is the \(p\)-part of the \(p\)-adic number.
‣ ShiftedPadicNumber ( padic, int ) | ( operation ) |
ShiftedPadicNumber
takes a \(p\)-adic number padic and an integer shift and returns the \(p\)-adic number \(c\), that is padic *
\(p\)^
shift.
‣ IsPurePadicNumber ( obj ) | ( category ) |
The category of pure \(p\)-adic numbers.
‣ IsPurePadicNumberFamily ( fam ) | ( category ) |
The family of pure \(p\)-adic numbers.
The usual Kronecker construction with an irreducible polynomial can be used to construct extensions of the \(p\)-adic numbers. Let \(L\) be such an extension. Then there is a subfield \(K < L\) such that \(K\) is an unramified extension of the \(p\)-adic numbers and \(L/K\) is purely ramified.
(For an explanation of "ramification" see for example [Neu92, Section II.7], or another book on algebraic number theory. Essentially, an extension \(L\) of the \(p\)-adic numbers generated by a rational polynomial \(f\) is unramified if \(f\) remains squarefree modulo \(p\) and is completely ramified if modulo \(p\) the polynomial \(f\) is a power of a linear factor while remaining irreducible over the \(p\)-adic numbers.)
The representation of extensions of \(p\)-adic numbers in GAP uses the subfield \(K\).
‣ PadicExtensionNumberFamily ( p, precision, unram, ram ) | ( function ) |
An extended \(p\)-adic field \(L\) is given by two polynomials \(h\) and \(g\) with coefficient lists unram (for the unramified part) and ram (for the ramified part). Then \(L\) is isomorphic to \(Q_p[x,y]/(h(x),g(y))\).
This function takes the prime number p and the two coefficient lists unram and ram for the two polynomials. The polynomial given by the coefficients in unram must be a cyclotomic polynomial and the polynomial given by ram must be either an Eisenstein polynomial or \(1+x\). This is not checked by GAP.
Every number in \(L\) is represented as a coefficient list w. r. t. the basis \(\{ 1, x, x^2, \ldots, y, xy, x^2 y, \ldots \}\) of \(L\). The integer precision is the number of "digits" that all the coefficients have.
A general comment:
The polynomials with which PadicExtensionNumberFamily
is called define an extension of \(Q_p\). It must be ensured that both polynomials are really irreducible over \(Q_p\)! For example \(x^2+x+1\) is not irreducible over \(Q_p\). Therefore the "extension" PadicExtensionNumberFamily(3, 4, [1,1,1], [1,1])
contains non-invertible "pseudo-p-adic numbers". Conversely, if an "extension" contains noninvertible elements then one of the defining polynomials was not irreducible.
‣ PadicNumber ( fam, rat ) | ( operation ) |
‣ PadicNumber ( purefam, list ) | ( operation ) |
‣ PadicNumber ( extfam, list ) | ( operation ) |
(see also PadicNumber
(68.1-2)).
PadicNumber
creates a \(p\)-adic number in the \(p\)-adic numbers family fam. The first form returns the \(p\)-adic number corresponding to the rational rat.
The second form takes a pure \(p\)-adic numbers family purefam and a list list of length two, and returns the number \(p\)^
list[1] *
list[2]
. It must be guaranteed that no entry of list[2]
is divisible by the prime \(p\). (Otherwise precision will get lost.)
The third form creates a number in the family extfam of a \(p\)-adic extension. The second argument must be a list list of length two such that list[2]
is the list of coefficients w.r.t. the basis \(\{ 1, \ldots, x^{{f-1}} \cdot y^{{e-1}} \}\) of the extended \(p\)-adic field and list[1]
is a common \(p\)-part of all these coefficients.
\(p\)-adic numbers admit the usual field operations.
gap> efam:=PadicExtensionNumberFamily(3, 5, [1,1,1], [1,1]);; gap> PadicNumber(efam,7/9); padic(120(3),0(3))
A word of warning:
Depending on the actual representation of quotients, precision may seem to "vanish". For example in PadicExtensionNumberFamily(3, 5, [1,1,1], [1,1])
the number (1.2000, 0.1210)(3)
can be represented as [ 0, [ 1.2000, 0.1210 ] ]
or as [ -1, [ 12.000, 1.2100 ] ]
(here the coefficients have to be multiplied by \(p^{{-1}}\)).
So there may be a number (1.2, 2.2)(3)
which seems to have only two digits of precision instead of the declared 5. But internally the number is stored as [ -3, [ 0.0012, 0.0022 ] ]
and so has in fact maximum precision.
‣ IsPadicExtensionNumber ( obj ) | ( category ) |
The category of elements of the extended \(p\)-adic field.
gap> efam:=PadicExtensionNumberFamily(3, 5, [1,1,1], [1,1]);; gap> IsPadicExtensionNumber(PadicNumber(efam,7/9)); true
‣ IsPadicExtensionNumberFamily ( fam ) | ( category ) |
Family of elements of the extended \(p\)-adic field.
gap> efam:=PadicExtensionNumberFamily(3, 5, [1,1,1], [1,1]);; gap> IsPadicExtensionNumberFamily(efam); true
generated by GAPDoc2HTML