def test_sqrt235(self): from constructible import sqrt r = sqrt(2) + sqrt(3) + sqrt(5) r2 = r * r r4 = r2 * r2 r6 = r2 * r4 r8 = r2 * r6 self.assertTrue(r > 0) self.assertEqual(r8 - 40 * r6 + 352 * r4 - 960 * r2 + 576, 0)
def test_sqrt235(self): from constructible import sqrt r = sqrt(2) + sqrt(3) + sqrt(5) r2 = r*r r4 = r2*r2 r6 = r2*r4 r8 = r2*r6 self.assertTrue(r > 0) self.assertEqual(r8 - 40*r6 + 352*r4 - 960*r2 + 576, 0)
def test_sqrt2(self): from constructible import sqrt r = sqrt(2) two = r*r self.assertEqual(two, 2) s = two._try_sqrt() self.assertEqual(r, s)
def test_comparison_Qsqrt2(self): ''' test comparison operators on instances of Q[sqrt(2)] ''' from constructible import sqrt from operator import eq, ne, gt, lt, ge, le s = sqrt(2) t = 3 - 2 * s u = s - s v = -t self.assertTrue(s.field == t.field == u.field == v.field, "Precondition") # numbers is sorted ascending, so the comarison of numbers and therir indices must be same numbers = [v, u, t, s] self.assertTrue(s.field == t.field == u.field == v.field, "Precondition") for op in (eq, ne, gt, lt, ge, le): with self.subTest(op=op): for i, a in enumerate(numbers): for j, b in enumerate(numbers): result = op(a, b) self.assertEqual(result, op(i, j)) self.assertIsInstance(result, bool)
def test_sqrt2(self): from constructible import sqrt r = sqrt(2) two = r * r self.assertEqual(two, 2) s = two._try_sqrt() self.assertEqual(r, s)
def test_sqrt_2(self): from constructible import sqrt r = sqrt(2) self.assertEqual(r.a, 0) self.assertEqual(r.b, 1) self.assertEqual(len(r.field), 2) self.assertEqual(r.field[0], 2) self.assertEqual(str(r), 'sqrt(2)') self.assertTrue(r > 0)
def test_equal(self): ''' hash of multiple representations of the same value must be equal ''' from constructible import sqrt from fractions import Fraction as F for a,b in [(sqrt(2), 2/sqrt(2)), (sqrt(2), 1/sqrt(F(1,2))), (sqrt(2) + sqrt(3), sqrt(3) + sqrt(2))]: with self.subTest(a=a, b=b): self.assertEqual(a,b, 'precondition for this test') self.assertEqual(hash(a), hash(b), '%s == %s, but hash is different' % (a,b))
def test_equal(self): ''' hash of multiple representations of the same value must be equal ''' from constructible import sqrt from fractions import Fraction as F for a, b in [(sqrt(2), 2 / sqrt(2)), (sqrt(2), 1 / sqrt(F(1, 2))), (sqrt(2) + sqrt(3), sqrt(3) + sqrt(2))]: with self.subTest(a=a, b=b): self.assertEqual(a, b, 'precondition for this test') self.assertEqual(hash(a), hash(b), '%s == %s, but hash is different' % (a, b))
def test_roots(self): from constructible import sqrt r = sqrt(17) u = sqrt(2 * (17 - r)) v = sqrt(2 * (17 + r)) cos = (-1 + r + u + 2*sqrt(17 + 3*r - u - 2*v)) / 16 sin = sqrt(1 - cos*cos) s_i = 0 c_i = 1 for i in range(17): s = sin * c_i + cos * s_i c = cos * c_i - sin * s_i self.assertEqual(s*s + c*c, 1, "radius not equal to 1 at i=%d" % i) s_i = s c_i = c self.assertEqual(s_i, 0) self.assertEqual(c_i, 1)
def test_roots(self): from constructible import sqrt r = sqrt(17) u = sqrt(2 * (17 - r)) v = sqrt(2 * (17 + r)) cos = (-1 + r + u + 2 * sqrt(17 + 3 * r - u - 2 * v)) / 16 sin = sqrt(1 - cos * cos) s_i = 0 c_i = 1 for i in range(17): s = sin * c_i + cos * s_i c = cos * c_i - sin * s_i self.assertEqual(s * s + c * c, 1, "radius not equal to 1 at i=%d" % i) s_i = s c_i = c self.assertEqual(s_i, 0) self.assertEqual(c_i, 1)
def test_expressions_type(self): from constructible import sqrt, Constructible s = sqrt(2) self.assertIsInstance(s, Constructible) self.assertIsInstance(2 * s, Constructible) self.assertIsInstance(2 - s, Constructible) t = 3 - 2 * s self.assertIsInstance(t, Constructible) u = s - s self.assertIsInstance(u, Constructible) v = -t self.assertIsInstance(v, Constructible)
def test_degree(self): ''' test that `a.minpoly()` has a certain degree ''' from constructible import sqrt, Constructible from fractions import Fraction as F def deg(num): assert isinstance(num, Constructible) value = 0 while num.field: if num.b != 0: value += 1 num = num.a return 2**value for a in [ sqrt(2), 2 / sqrt(5), 1 / sqrt(F(1, 2)), sqrt(2) + sqrt(3), (sqrt(3) + sqrt(2)) - sqrt(3) ]: with self.subTest(a=a): self.assertEqual( len(a.minpoly()) - 1, deg(a), 'minpoly of %s has the wrong degree' % (a, ))
def test_substitution(self): ''' test that `a` substituted to `a.minpoly()` gives 0 ''' from constructible import sqrt from fractions import Fraction as F def eval(poly, arg): value = 0 for coef in reversed(poly): value = coef + value * arg return value for a in [ sqrt(2), 2 / sqrt(5), 1 / sqrt(F(1, 2)), sqrt(2) + sqrt(3), sqrt(3) + sqrt(2) ]: with self.subTest(a=a): self.assertEqual(eval(a.minpoly(), a), 0, '%s is not a root of its minpoly' % (a, ))
def test_sqrt_square(self): from constructible import sqrt r = sqrt(2) + sqrt(3) + sqrt(5) self.assertEqual(sqrt(r * r), r)
def test_sqrt623(self): from constructible import sqrt r = sqrt(6) / sqrt(3) self.assertTrue(r > 0) self.assertEqual(r, sqrt(2))
def test_sqrt23(self): from constructible import sqrt r = sqrt(2) + sqrt(3) self.assertTrue(r > 0) self.assertEqual(r * r * r * r - 10 * r * r + 1, 0)
def test_double_sqrt(self): from constructible import sqrt r = sqrt(2) s = sqrt(r) self.assertEqual(str(s), 'sqrt(sqrt(2))')
def test_sqrt23(self): from constructible import sqrt r = sqrt(2) + sqrt(3) self.assertTrue(r > 0) self.assertEqual(r*r*r*r - 10*r*r + 1, 0)
def test_sqrt_square(self): from constructible import sqrt r = sqrt(2) + sqrt(3) + sqrt(5) self.assertEqual(sqrt(r*r), r)