def test_continued_fraction_golden_ratio(self): golden_ratio = (1 + math.sqrt(5)) / 2 expected = [1] * 40 result = list(contfrac.continued_fraction(golden_ratio, maxlen=2)) self.assertListEqual(expected[:2], result) result = list(contfrac.continued_fraction(golden_ratio, maxlen=20)) self.assertListEqual(expected[:20], result) result = list(contfrac.continued_fraction(golden_ratio, maxlen=31)) self.assertListEqual(expected[:31], result)
def test_rounding_errors(self): golden_ratio = (1 + math.sqrt(5)) / 2 as_ratio = golden_ratio.as_integer_ratio() result = list(contfrac.continued_fraction(golden_ratio, maxlen=50)) self.assertNotEqual([1] * 50, result) evaluated_value = contfrac.evaluate(result) self.assertEqual(golden_ratio, evaluated_value) result = list(contfrac.continued_fraction(as_ratio, maxlen=50)) self.assertNotEqual([1] * 50, result) evaluated_value = contfrac.evaluate(result) self.assertEqual(as_ratio, evaluated_value.as_integer_ratio())
def get_alpha_1_2(alpha): coefficients = list(contfrac.continued_fraction(alpha)) alpha_1 = contfrac_to_fraction(coefficients[:-1]) coefficients[-1] -= 1 alpha_2 = contfrac_to_fraction(coefficients) return alpha_1, alpha_2
def test_example_irrational(self): import contfrac import math coefficients = list(contfrac.continued_fraction(math.e, maxlen=10)) print(coefficients) convergent = contfrac.convergent(math.e, 3) print(convergent, convergent[0] / convergent[1], math.e) convergent = contfrac.convergent(math.e, 7) print(convergent, convergent[0] / convergent[1], math.e)
def test_continued_fraction_illegal_maxlen(self): self.assertRaises(ValueError, contfrac.continued_fraction, 2.2, maxlen=-1) self.assertRaises(ValueError, contfrac.continued_fraction, 2.2, maxlen=0) list(contfrac.continued_fraction(2.2, maxlen=1))
def test_example_high_accuracy(self): import contfrac value = (415, 93) coefficients = list(contfrac.continued_fraction(value)) print(coefficients) expression = contfrac.arithmetical_expr(coefficients) print('Value: {:} = {:s}'.format(value, expression)) eval_value = contfrac.evaluate(coefficients) print(eval_value, value[0] / value[1]) convergents = list(contfrac.convergents(value)) print(convergents)
def test_example_usage_as_in_readme(self): import contfrac value = 415 / 93 coefficients = list(contfrac.continued_fraction(value)) print(coefficients) expression = contfrac.arithmetical_expr(coefficients) print('Value: {:f} = {:s}'.format(value, expression)) eval_value = contfrac.evaluate(coefficients) print(eval_value, value) convergents = list(contfrac.convergents(value)) print(convergents)
def test_continued_fraction_legal_values(self): test_values = { # Integers 0: [0], 1: [1], 123: [123], -1: [-1], -123: [-123], # Tuples: (nominator, denominator) (649, 200): [3, 4, 12, 4], (415, 93): [4, 2, 6, 7], (-649, 200): [-4, 1, 3, 12, 4], (415, -93): [-5, 1, 1, 6, 7], # Fractions fractions.Fraction(649, 200): [3, 4, 12, 4], fractions.Fraction(415, 93): [4, 2, 6, 7], fractions.Fraction(-649, 200): [-4, 1, 3, 12, 4], fractions.Fraction(415, -93): [-5, 1, 1, 6, 7], # Floats 649 / 200: [3, 4, 12, 4], -649 / 200: [-3, -4, -12, -4], 415 / 93: [4, 2, 6, 7], 0.84375: [0, 1, 5, 2, 2], } for input_value, expected_output in test_values.items(): with self.subTest(contfrac_of=input_value): result = list(contfrac.continued_fraction(input_value)) self.assertListEqual(expected_output, result) with self.subTest(evaluating_contfrac_of=input_value): if isinstance(input_value, tuple): input_value = input_value[0] / input_value[1] elif isinstance(input_value, fractions.Fraction): input_value = float(input_value) evaluated = contfrac.evaluate(result) self.assertAlmostEqual(input_value, evaluated, delta=1e-8)
print("\tMean eq. year without adjustment = {} days, {} hours, {} minutes, {} seconds\n".format(dd,hh,mm,ss)) approx = (days + adjust) / float(years) print("\tAdjusted days =", days + adjust) print("\tbasetup =", basetup) print("\tendtup =", endtup) print("\tDecimal mean eq. year =", approx) frac = (days + adjust) / float(years) dd, hh, mm, ss = frac2dhms(frac) print(("Mean eq. year = {} days, " "{} hours, " "{} minutes, " "{} seconds").format(dd,hh,mm,ss)) contfrac.main(frac) fmt = ("\tx ~= p / q = {p:10} / {q:10} = {d:03} " "{h:02}:{m:02}:{s:07.4f} " ", p days modulo 7 = {r:1}") print("\nContinued fraction approximations in DHMS form:") for a, p, q in contfrac.continued_fraction(frac): d, h, m, s = frac2dhms(p / float(q)) r = p % 7 print(fmt.format(p=p, q=q, d=d, h=h, m=m, s=s, r=r))
print( "\tMean eq. year without adjustment = {} days, {} hours, {} minutes, {} seconds\n" .format(dd, hh, mm, ss)) approx = (days + adjust) / float(years) print("\tAdjusted days =", days + adjust) print("\tbasetup =", basetup) print("\tendtup =", endtup) print("\tDecimal mean eq. year =", approx) frac = (days + adjust) / float(years) dd, hh, mm, ss = frac2dhms(frac) print(("Mean eq. year = {} days, " "{} hours, " "{} minutes, " "{} seconds").format(dd, hh, mm, ss)) contfrac.main(frac) fmt = ("\tx ~= p / q = {p:10} / {q:10} = {d:03} " "{h:02}:{m:02}:{s:07.4f} " ", p days modulo 7 = {r:1}") print("\nContinued fraction approximations in DHMS form:") for a, p, q in contfrac.continued_fraction(frac): d, h, m, s = frac2dhms(p / float(q)) r = p % 7 print(fmt.format(p=p, q=q, d=d, h=h, m=m, s=s, r=r))
def test_continued_fraction_is_generators(self): result = contfrac.continued_fraction(1) self.assertIsInstance(result, typing.Generator)