* ''Goal'' -- Write new classes of p-adic elements, analogous to `IntegerMod_int` and `IntegerMod_int64` for the case that `self.unit` or `self.value` fits into machine precision. * ''Type'' -- speed improvements * ''Priority'' -- Medium-Low * ''Difficulty'' -- Easy * ''Prerequisites'' -- None * ''Background'' -- understand the inheritance structure for p-adic base rings, take a look at `sage.rings.finite_rings.integer_mod` * ''Contributors'' -- David Roe * ''Progress'' - not started * ''Related Tickets'' -- == Discussion == This will be useful in the following cases: || p || max precision on 32-bit || max precision on 64-bit || || 2 || 15 || 30 || || 3 || 9 || 19 || || 5 || 6 || 13 || || 7 || 5 || 11 || || 11,13 || 4 || 8 || || 17,19 || 3 || 7 || || 23,29,31 || 3 || 6 || || 37-73 || 2 || 5 || || 79-211 || 2 || 4 || || 223-1289 || 1 || 3 || || 1291-46337 || 1 || 2 || To get an idea of the speed improvements available: {{{ sage: R19 = Zmod(3^19) sage: type((R19)(1)) sage: R20 = Zmod(3^20) sage: type((R20)(1)) sage: a19 = R19.random_element(); b19 = R19.random_element(); a20 = R20.random_element(); b20 = R20.random_element() sage: timeit("c19 = a19*b19") 625 loops, best of 3: 197 ns per loop sage: timeit("c20 = a20*b20") 625 loops, best of 3: 454 ns per loop sage: timeit("c19 = a19 + b19") 625 loops, best of 3: 178 ns per loop sage: timeit("c20 = a20+b20") 625 loops, best of 3: 389 ns per loop }}} This may be better done as an interface to p-adics in FLINT 2: see [[https://github.com/SPancratz/flint2/blob/trunk/padic.h]] == Tasks == 1. Using `sage/rings/finite_rings/integer_mod.pyx` and `sage/rings/padics/padic_(capped_relative_element.pyx AND capped_absolute_element.pyx AND fixed_modulus_element.pyx)` as a model, implement Zp and Qp using machine arithmetic.