test_lll.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from sympy.polys.domains import ZZ, QQ
  2. from sympy.polys.matrices import DM
  3. from sympy.polys.matrices.domainmatrix import DomainMatrix
  4. from sympy.polys.matrices.exceptions import DMRankError, DMValueError, DMShapeError, DMDomainError
  5. from sympy.polys.matrices.lll import _ddm_lll, ddm_lll, ddm_lll_transform
  6. from sympy.testing.pytest import raises
  7. def test_lll():
  8. normal_test_data = [
  9. (
  10. DM([[1, 0, 0, 0, -20160],
  11. [0, 1, 0, 0, 33768],
  12. [0, 0, 1, 0, 39578],
  13. [0, 0, 0, 1, 47757]], ZZ),
  14. DM([[10, -3, -2, 8, -4],
  15. [3, -9, 8, 1, -11],
  16. [-3, 13, -9, -3, -9],
  17. [-12, -7, -11, 9, -1]], ZZ)
  18. ),
  19. (
  20. DM([[20, 52, 3456],
  21. [14, 31, -1],
  22. [34, -442, 0]], ZZ),
  23. DM([[14, 31, -1],
  24. [188, -101, -11],
  25. [236, 13, 3443]], ZZ)
  26. ),
  27. (
  28. DM([[34, -1, -86, 12],
  29. [-54, 34, 55, 678],
  30. [23, 3498, 234, 6783],
  31. [87, 49, 665, 11]], ZZ),
  32. DM([[34, -1, -86, 12],
  33. [291, 43, 149, 83],
  34. [-54, 34, 55, 678],
  35. [-189, 3077, -184, -223]], ZZ)
  36. )
  37. ]
  38. delta = QQ(5, 6)
  39. for basis_dm, reduced_dm in normal_test_data:
  40. reduced = _ddm_lll(basis_dm.rep, delta=delta)[0]
  41. assert reduced == reduced_dm.rep
  42. reduced = ddm_lll(basis_dm.rep, delta=delta)
  43. assert reduced == reduced_dm.rep
  44. reduced, transform = _ddm_lll(basis_dm.rep, delta=delta, return_transform=True)
  45. assert reduced == reduced_dm.rep
  46. assert transform.matmul(basis_dm.rep) == reduced_dm.rep
  47. reduced, transform = ddm_lll_transform(basis_dm.rep, delta=delta)
  48. assert reduced == reduced_dm.rep
  49. assert transform.matmul(basis_dm.rep) == reduced_dm.rep
  50. reduced = basis_dm.rep.lll(delta=delta)
  51. assert reduced == reduced_dm.rep
  52. reduced, transform = basis_dm.rep.lll_transform(delta=delta)
  53. assert reduced == reduced_dm.rep
  54. assert transform.matmul(basis_dm.rep) == reduced_dm.rep
  55. reduced = basis_dm.rep.to_sdm().lll(delta=delta)
  56. assert reduced == reduced_dm.rep.to_sdm()
  57. reduced, transform = basis_dm.rep.to_sdm().lll_transform(delta=delta)
  58. assert reduced == reduced_dm.rep.to_sdm()
  59. assert transform.matmul(basis_dm.rep.to_sdm()) == reduced_dm.rep.to_sdm()
  60. reduced = basis_dm.lll(delta=delta)
  61. assert reduced == reduced_dm
  62. reduced, transform = basis_dm.lll_transform(delta=delta)
  63. assert reduced == reduced_dm
  64. assert transform.matmul(basis_dm) == reduced_dm
  65. def test_lll_linear_dependent():
  66. linear_dependent_test_data = [
  67. DM([[0, -1, -2, -3],
  68. [1, 0, -1, -2],
  69. [2, 1, 0, -1],
  70. [3, 2, 1, 0]], ZZ),
  71. DM([[1, 0, 0, 1],
  72. [0, 1, 0, 1],
  73. [0, 0, 1, 1],
  74. [1, 2, 3, 6]], ZZ),
  75. DM([[3, -5, 1],
  76. [4, 6, 0],
  77. [10, -4, 2]], ZZ)
  78. ]
  79. for not_basis in linear_dependent_test_data:
  80. raises(DMRankError, lambda: _ddm_lll(not_basis.rep))
  81. raises(DMRankError, lambda: ddm_lll(not_basis.rep))
  82. raises(DMRankError, lambda: not_basis.rep.lll())
  83. raises(DMRankError, lambda: not_basis.rep.to_sdm().lll())
  84. raises(DMRankError, lambda: not_basis.lll())
  85. raises(DMRankError, lambda: _ddm_lll(not_basis.rep, return_transform=True))
  86. raises(DMRankError, lambda: ddm_lll_transform(not_basis.rep))
  87. raises(DMRankError, lambda: not_basis.rep.lll_transform())
  88. raises(DMRankError, lambda: not_basis.rep.to_sdm().lll_transform())
  89. raises(DMRankError, lambda: not_basis.lll_transform())
  90. def test_lll_wrong_delta():
  91. dummy_matrix = DomainMatrix.ones((3, 3), ZZ)
  92. for wrong_delta in [QQ(-1, 4), QQ(0, 1), QQ(1, 4), QQ(1, 1), QQ(100, 1)]:
  93. raises(DMValueError, lambda: _ddm_lll(dummy_matrix.rep, delta=wrong_delta))
  94. raises(DMValueError, lambda: ddm_lll(dummy_matrix.rep, delta=wrong_delta))
  95. raises(DMValueError, lambda: dummy_matrix.rep.lll(delta=wrong_delta))
  96. raises(DMValueError, lambda: dummy_matrix.rep.to_sdm().lll(delta=wrong_delta))
  97. raises(DMValueError, lambda: dummy_matrix.lll(delta=wrong_delta))
  98. raises(DMValueError, lambda: _ddm_lll(dummy_matrix.rep, delta=wrong_delta, return_transform=True))
  99. raises(DMValueError, lambda: ddm_lll_transform(dummy_matrix.rep, delta=wrong_delta))
  100. raises(DMValueError, lambda: dummy_matrix.rep.lll_transform(delta=wrong_delta))
  101. raises(DMValueError, lambda: dummy_matrix.rep.to_sdm().lll_transform(delta=wrong_delta))
  102. raises(DMValueError, lambda: dummy_matrix.lll_transform(delta=wrong_delta))
  103. def test_lll_wrong_shape():
  104. wrong_shape_matrix = DomainMatrix.ones((4, 3), ZZ)
  105. raises(DMShapeError, lambda: _ddm_lll(wrong_shape_matrix.rep))
  106. raises(DMShapeError, lambda: ddm_lll(wrong_shape_matrix.rep))
  107. raises(DMShapeError, lambda: wrong_shape_matrix.rep.lll())
  108. raises(DMShapeError, lambda: wrong_shape_matrix.rep.to_sdm().lll())
  109. raises(DMShapeError, lambda: wrong_shape_matrix.lll())
  110. raises(DMShapeError, lambda: _ddm_lll(wrong_shape_matrix.rep, return_transform=True))
  111. raises(DMShapeError, lambda: ddm_lll_transform(wrong_shape_matrix.rep))
  112. raises(DMShapeError, lambda: wrong_shape_matrix.rep.lll_transform())
  113. raises(DMShapeError, lambda: wrong_shape_matrix.rep.to_sdm().lll_transform())
  114. raises(DMShapeError, lambda: wrong_shape_matrix.lll_transform())
  115. def test_lll_wrong_domain():
  116. wrong_domain_matrix = DomainMatrix.ones((3, 3), QQ)
  117. raises(DMDomainError, lambda: _ddm_lll(wrong_domain_matrix.rep))
  118. raises(DMDomainError, lambda: ddm_lll(wrong_domain_matrix.rep))
  119. raises(DMDomainError, lambda: wrong_domain_matrix.rep.lll())
  120. raises(DMDomainError, lambda: wrong_domain_matrix.rep.to_sdm().lll())
  121. raises(DMDomainError, lambda: wrong_domain_matrix.lll())
  122. raises(DMDomainError, lambda: _ddm_lll(wrong_domain_matrix.rep, return_transform=True))
  123. raises(DMDomainError, lambda: ddm_lll_transform(wrong_domain_matrix.rep))
  124. raises(DMDomainError, lambda: wrong_domain_matrix.rep.lll_transform())
  125. raises(DMDomainError, lambda: wrong_domain_matrix.rep.to_sdm().lll_transform())
  126. raises(DMDomainError, lambda: wrong_domain_matrix.lll_transform())