def test_element(): from pyeantic import eantic from sage.all import ZZ, QQ K = eantic.renf('x^2 - 2', 'x', '[1.4142 +/- 0.0001]') assert str(eantic.renf_elem(K, [ZZ(2), ZZ(3)])) == "(3*x+2 ~ 6.2426407)" assert str(eantic.renf_elem(K, [1/ZZ(2), 1/ZZ(3)])) == "(1/3*x+1/2 ~ 0.97140452)"
def __init__(self, embedded, category=None): r""" TESTS:: sage: from pyeantic import eantic, RealEmbeddedNumberField sage: K = NumberField(x**2 - 2, 'a', embedding=sqrt(AA(2))) sage: K = RealEmbeddedNumberField(K) sage: from pyeantic.real_embedded_number_field import RealEmbeddedNumberField sage: isinstance(K, RealEmbeddedNumberField) True sage: TestSuite(K).run() """ self.number_field = embedded var = self.number_field.variable_name() self.renf = eantic.renf( repr(self.number_field.polynomial().change_variable_name(var)), var, str(RBF(self.number_field.gen()))) Field.__init__(self, QQ, category=category) self.register_coercion(self.number_field) self.number_field.register_conversion(ConversionNumberFieldRenf(self))
def test_arithmetic(): from pyeantic import eantic from sage.all import ZZ, QQ K = eantic.renf('x^2 - 2', 'x', '[1.4142 +/- 0.0001]') a = K.gen() assert (a + ZZ(1)) * (a - ZZ(1)) == (a*a - ZZ(1)) assert (a + 1/ZZ(2)) * (a - 1/ZZ(2)) == (a*a - 1/ZZ(4))
def test_eantic(): from pyeantic import eantic L = eantic.renf("a^3 - a^2 - a - 1", "a", "[1.84 +/- 0.01]") lengths = [] lengths.append(eantic.renf_elem(L, "a")) lengths.append(eantic.renf_elem(L, "2*a^2 - 3")) iet = IntervalExchangeTransformation(lengths, [1, 0]) iet_10_check(iet)
def test_arithmetic(): K = eantic.renf("x^2 - 3", "x", "1.73 +/- 0.1") x = K.gen() assert x + x == 2 * x assert not (x - x) assert (x + 1) * (x - 1) == x * x - 1 assert x**2 == 3 assert -x != x
def test_cmp(): from pyeantic import eantic from sage.all import ZZ, QQ K = eantic.renf('x^2 - 2', 'x', '[1.4142 +/- 0.0001]') a = K.gen() assert a == a assert a <= a assert a >= a assert a > 0 assert 0 < a assert a != 0
def test_construct(): K = eantic.renf("A^3 - 3", "A", "1.44 +/- 0.1") zero = K.zero() one = K.one() A = K.gen() assert eantic.renf_elem(K) == zero assert eantic.renf_elem(K, "A") == A assert eantic.renf_elem(K, "A - 3") == A - 3 assert eantic.renf_elem(K, "1") == one assert eantic.renf_elem(A) == A assert eantic.renf_elem(K, 1) == one assert eantic.renf_elem(K, [0, 0, 0]) == zero assert eantic.renf_elem(K, [1, 0, 0]) == one assert eantic.renf_elem(K, [0, 1, 0]) == A
def lengths(coefficients, permutation): r""" Produces lengths for the given permutation in a ring represented by coefficients. """ if len(permutation) == 2: lengths = [18, 3] elif len(permutation) == 7: lengths = [4, 56, 23, 11, 21, 9, 65] else: lengths = [1] * len(permutation) if coefficients == "mpz": from gmpxxyy import mpz return [mpz(l) for l in lengths] elif coefficients == "mpq": from gmpxxyy import mpq return [mpq(l) for l in lengths] elif coefficients == "renf_elem": from pyeantic import eantic L = eantic.renf("a^3 - a^2 - a - 1", "a", "[1.84 +/- 0.01]") return [eantic.renf_elem(L, l) for l in lengths] else: raise NotImplementedError( f"Cannot create lengths for {coefficients} yet.")
def test_delete_parent_before_binop(): K = eantic.renf("x^3 - 3", "x", "1.44 +/- 0.1") x = K.gen() y = K.gen() + 1 del K z = x + y
def test_repr(): K = eantic.renf("x^2 - 3", "x", "1.73 +/- 0.1") x = K.gen() assert repr(x) == "(x ~ 1.7320508)"
def __init__(self, embedded, category=None): r""" TESTS:: sage: import pyeantic sage: from pyeantic import RealEmbeddedNumberField sage: K = RealEmbeddedNumberField(QQ) sage: isinstance(K, pyeantic.real_embedded_number_field.RealEmbeddedNumberField) True sage: TestSuite(K).run() :: sage: K = NumberField(x**2 - 2, 'a', embedding=sqrt(AA(2))) sage: K = RealEmbeddedNumberField(K) sage: import pyeantic.real_embedded_number_field sage: isinstance(K, pyeantic.real_embedded_number_field.RealEmbeddedNumberField) True sage: TestSuite(K).run() :: sage: K = NumberField(x**2 - 2, 'b', embedding=sqrt(AA(2))) sage: K = RealEmbeddedNumberField(K) sage: isinstance(K, pyeantic.real_embedded_number_field.RealEmbeddedNumberField) True sage: TestSuite(K).run() :: sage: K.an_element() in K.number_field True sage: K.an_element() in QQbar True sage: K.number_field.an_element() in K True sage: 1 in K True :: sage: type(K.one() - K.number_field.one()) <class 'sage.rings.number_field.number_field_element_quadratic.NumberFieldElement_quadratic'> sage: type(K.number_field.one() - K.one()) <class 'sage.rings.number_field.number_field_element_quadratic.NumberFieldElement_quadratic'> sage: type(K.one() - 1) <class 'pyeantic.real_embedded_number_field.RealEmbeddedNumberField_with_category.element_class'> sage: type(1 - K.one()) <class 'pyeantic.real_embedded_number_field.RealEmbeddedNumberField_with_category.element_class'> """ self.number_field = embedded var = self.number_field.variable_name() self.renf = eantic.renf( repr(self.number_field.polynomial().change_variable_name(var)), var, str(RBF(self.number_field.gen()))) CommutativeRing.__init__(self, QQ, category=category) # It is usually not a good idea to introduce cycles in the coercion # framework: when performing a + b with a in A and b in B, it's a bit # random whether the result will be in A or in B. So we make the map # into the SageMath number field a coercion since it makes lots of # stuff work that depends on having coercions to other number fields # and AA, QQbar, …. We register this coercion as an embedding so # transitive coercions are detected by the coercion framework such as # the coercion into AA. self.register_embedding(CoercionNumberFieldRenf(self)) self.register_conversion(self.number_field) # Allow coercion of rationals and integers so arithmetic with integers # works on the SageMath prompt. self.register_coercion(QQ)
def test_repr(): K = eantic.renf("x^2 - 3", "x", "1.73 +/- 0.1") assert str(K) == repr(K) assert str(K) == "NumberField(x^2 - 3, [1.7320508075688772935274463415058723669 +/- 5.08e-38])"