def test_NF_module(): K = NumberField("a^2 - 2", "a", "1.414 +/- .1") trivial = NumberFieldModule(K) NF = NumberFieldModule(K, RealNumber.rational(1)) M = NumberFieldModule(K, RealNumber.rational(1), RealNumber.random()) assert str(trivial) == "K-Module()" assert trivial.rank() == 0 assert NF.rank() == 1 assert M.rank() == 2
def random_hexagon(R2): x = K.gen() M = NumberFieldModule(K, RealNumber.rational(1), RealNumber.random(), RealNumber.random()) # The side lengths are going to be 2, 2·μ, 2·ν where μ,ν are the random parameters of M. one = M.gen(0) μ = M.gen(1) ν = M.gen(2) # We build our vectors from (2, 0), μ·(1, √3), ν.(-1, √3). u = R2(2 * one, 0 * one) v = R2(μ, x * μ) w = R2(-ν, x * ν) vectors = [u, v, u + v, -w, u + v - w, u + v] vertices = [[1, 3, -4, -5, -3, -2], [2, -1, -6, 4, 5, 6]] return Surface(vertices, vectors)
def test_multiplication(): from pyexactreal import RealNumber, NumberFieldModule, NumberField # The following came up when doing arithmetic between renf_elem_class and # Element<NumberField> when trying to construct a hexagon with random side # lengths K = NumberField("x^2 - 3", "x", "1.73 +/- 0.1") x = K.gen() M = NumberFieldModule(K, RealNumber.rational(1), RealNumber.random(), RealNumber.random()) one = M.gen(0) μ = M.gen(1) ν = M.gen(2) assert 2*one == one + one assert 0*one == one - one assert x*μ == μ*x assert 2*one + μ - ν - 2*one - μ + ν == 0 assert 0*one + x*μ + x*ν - 0*one - x*ν - x*μ == 0
def test_serialization(): from pyexactreal import RealNumber, ZZModule, QQModule, NumberFieldModule, NumberField M = ZZModule(RealNumber.rational(1)) assert M.gen(0).to_json() == '{"parent": {"shared": 2147483649, "basis": [{"shared": 2147483650, "kind": "rational", "value": "1"}], "ring": {}}, "coefficients": ["1"]}' M = QQModule(RealNumber.rational(1)) assert M.gen(0).to_json() == '{"parent": {"shared": 2147483649, "basis": [{"shared": 2147483650, "kind": "rational", "value": "1"}], "ring": {}}, "coefficients": ["1"]}' K = NumberField("x^2 - 3", "x", "1.73 +/- 0.1") M = NumberFieldModule(K, RealNumber.rational(1)) assert M.gen(0).to_json() == '{"parent": {"shared": 2147483649, "basis": [{"shared": 2147483650, "kind": "rational", "value": "1"}], "ring": {"field": {"shared": 2147483651, "name": "x", "embedding": "[1.7320508075688772935274463415058723669 +/- 5.08e-38]", "minpoly": "x^2 - 3", "precision": 64}}}, "coefficients": [{"cereal_class_version": 0, "parent": {"shared": 2147483652, "name": "a", "embedding": "1e+0", "minpoly": "a-1", "precision": 64}, "value": "1"}]}'
def __init__(self, base=None, category=None): if base is QQ: self._element_factory = exactreal.Element[type(exactreal.RationalField())] self._module_factory = lambda gens: QQModule(*gens) number_field = QQ else: base = RealEmbeddedNumberField(base) ring = exactreal.NumberField(base.renf) self._element_factory = exactreal.Element[type(ring)] self._module_factory = lambda gens: NumberFieldModule(ring, *gens) number_field = base.number_field CommutativeRing.__init__(self, base, category=category) H = Hom(number_field, self) coercion = H.__make_element_class__(CoercionExactRealsNumberField)(H) self.register_coercion(coercion)