test_egyptian_fraction.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from sympy.core.numbers import Rational
  2. from sympy.ntheory.egyptian_fraction import egyptian_fraction
  3. from sympy.core.add import Add
  4. from sympy.testing.pytest import raises
  5. from sympy.core.random import random_complex_number
  6. def test_egyptian_fraction():
  7. def test_equality(r, alg="Greedy"):
  8. return r == Add(*[Rational(1, i) for i in egyptian_fraction(r, alg)])
  9. r = random_complex_number(a=0, c=1, b=0, d=0, rational=True)
  10. assert test_equality(r)
  11. assert egyptian_fraction(Rational(4, 17)) == [5, 29, 1233, 3039345]
  12. assert egyptian_fraction(Rational(7, 13), "Greedy") == [2, 26]
  13. assert egyptian_fraction(Rational(23, 101), "Greedy") == \
  14. [5, 37, 1438, 2985448, 40108045937720]
  15. assert egyptian_fraction(Rational(18, 23), "Takenouchi") == \
  16. [2, 6, 12, 35, 276, 2415]
  17. assert egyptian_fraction(Rational(5, 6), "Graham Jewett") == \
  18. [6, 7, 8, 9, 10, 42, 43, 44, 45, 56, 57, 58, 72, 73, 90, 1806, 1807,
  19. 1808, 1892, 1893, 1980, 3192, 3193, 3306, 5256, 3263442, 3263443,
  20. 3267056, 3581556, 10192056, 10650056950806]
  21. assert egyptian_fraction(Rational(5, 6), "Golomb") == [2, 6, 12, 20, 30]
  22. assert egyptian_fraction(Rational(5, 121), "Golomb") == [25, 1225, 3577, 7081, 11737]
  23. raises(ValueError, lambda: egyptian_fraction(Rational(-4, 9)))
  24. assert egyptian_fraction(Rational(8, 3), "Golomb") == [1, 2, 3, 4, 5, 6, 7,
  25. 14, 574, 2788, 6460,
  26. 11590, 33062, 113820]
  27. assert egyptian_fraction(Rational(355, 113)) == [1, 2, 3, 4, 5, 6, 7, 8, 9,
  28. 10, 11, 12, 27, 744, 893588,
  29. 1251493536607,
  30. 20361068938197002344405230]
  31. def test_input():
  32. r = (2,3), Rational(2, 3), (Rational(2), Rational(3))
  33. for m in ["Greedy", "Graham Jewett", "Takenouchi", "Golomb"]:
  34. for i in r:
  35. d = egyptian_fraction(i, m)
  36. assert all(i.is_Integer for i in d)
  37. if m == "Graham Jewett":
  38. assert d == [3, 4, 12]
  39. else:
  40. assert d == [2, 6]
  41. # check prefix
  42. d = egyptian_fraction(Rational(5, 3))
  43. assert d == [1, 2, 6] and all(i.is_Integer for i in d)