Spaces:
Running
Running
File size: 7,639 Bytes
6a86ad5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
"""Tests for sparse distributed modules. """
from sympy.polys.distributedmodules import (
sdm_monomial_mul, sdm_monomial_deg, sdm_monomial_divides,
sdm_add, sdm_LM, sdm_LT, sdm_mul_term, sdm_zero, sdm_deg,
sdm_LC, sdm_from_dict,
sdm_spoly, sdm_ecart, sdm_nf_mora, sdm_groebner,
sdm_from_vector, sdm_to_vector, sdm_monomial_lcm
)
from sympy.polys.orderings import lex, grlex, InverseOrder
from sympy.polys.domains import QQ
from sympy.abc import x, y, z
def test_sdm_monomial_mul():
assert sdm_monomial_mul((1, 1, 0), (1, 3)) == (1, 2, 3)
def test_sdm_monomial_deg():
assert sdm_monomial_deg((5, 2, 1)) == 3
def test_sdm_monomial_lcm():
assert sdm_monomial_lcm((1, 2, 3), (1, 5, 0)) == (1, 5, 3)
def test_sdm_monomial_divides():
assert sdm_monomial_divides((1, 0, 0), (1, 0, 0)) is True
assert sdm_monomial_divides((1, 0, 0), (1, 2, 1)) is True
assert sdm_monomial_divides((5, 1, 1), (5, 2, 1)) is True
assert sdm_monomial_divides((1, 0, 0), (2, 0, 0)) is False
assert sdm_monomial_divides((1, 1, 0), (1, 0, 0)) is False
assert sdm_monomial_divides((5, 1, 2), (5, 0, 1)) is False
def test_sdm_LC():
assert sdm_LC([((1, 2, 3), QQ(5))], QQ) == QQ(5)
def test_sdm_from_dict():
dic = {(1, 2, 1, 1): QQ(1), (1, 1, 2, 1): QQ(1), (1, 0, 2, 1): QQ(1),
(1, 0, 0, 3): QQ(1), (1, 1, 1, 0): QQ(1)}
assert sdm_from_dict(dic, grlex) == \
[((1, 2, 1, 1), QQ(1)), ((1, 1, 2, 1), QQ(1)),
((1, 0, 2, 1), QQ(1)), ((1, 0, 0, 3), QQ(1)), ((1, 1, 1, 0), QQ(1))]
# TODO test to_dict?
def test_sdm_add():
assert sdm_add([((1, 1, 1), QQ(1))], [((2, 0, 0), QQ(1))], lex, QQ) == \
[((2, 0, 0), QQ(1)), ((1, 1, 1), QQ(1))]
assert sdm_add([((1, 1, 1), QQ(1))], [((1, 1, 1), QQ(-1))], lex, QQ) == []
assert sdm_add([((1, 0, 0), QQ(1))], [((1, 0, 0), QQ(2))], lex, QQ) == \
[((1, 0, 0), QQ(3))]
assert sdm_add([((1, 0, 1), QQ(1))], [((1, 1, 0), QQ(1))], lex, QQ) == \
[((1, 1, 0), QQ(1)), ((1, 0, 1), QQ(1))]
def test_sdm_LM():
dic = {(1, 2, 3): QQ(1), (4, 0, 0): QQ(1), (4, 0, 1): QQ(1)}
assert sdm_LM(sdm_from_dict(dic, lex)) == (4, 0, 1)
def test_sdm_LT():
dic = {(1, 2, 3): QQ(1), (4, 0, 0): QQ(2), (4, 0, 1): QQ(3)}
assert sdm_LT(sdm_from_dict(dic, lex)) == ((4, 0, 1), QQ(3))
def test_sdm_mul_term():
assert sdm_mul_term([((1, 0, 0), QQ(1))], ((0, 0), QQ(0)), lex, QQ) == []
assert sdm_mul_term([], ((1, 0), QQ(1)), lex, QQ) == []
assert sdm_mul_term([((1, 0, 0), QQ(1))], ((1, 0), QQ(1)), lex, QQ) == \
[((1, 1, 0), QQ(1))]
f = [((2, 0, 1), QQ(4)), ((1, 1, 0), QQ(3))]
assert sdm_mul_term(f, ((1, 1), QQ(2)), lex, QQ) == \
[((2, 1, 2), QQ(8)), ((1, 2, 1), QQ(6))]
def test_sdm_zero():
assert sdm_zero() == []
def test_sdm_deg():
assert sdm_deg([((1, 2, 3), 1), ((10, 0, 1), 1), ((2, 3, 4), 4)]) == 7
def test_sdm_spoly():
f = [((2, 1, 1), QQ(1)), ((1, 0, 1), QQ(1))]
g = [((2, 3, 0), QQ(1))]
h = [((1, 2, 3), QQ(1))]
assert sdm_spoly(f, h, lex, QQ) == []
assert sdm_spoly(f, g, lex, QQ) == [((1, 2, 1), QQ(1))]
def test_sdm_ecart():
assert sdm_ecart([((1, 2, 3), 1), ((1, 0, 1), 1)]) == 0
assert sdm_ecart([((2, 2, 1), 1), ((1, 5, 1), 1)]) == 3
def test_sdm_nf_mora():
f = sdm_from_dict({(1, 2, 1, 1): QQ(1), (1, 1, 2, 1): QQ(1),
(1, 0, 2, 1): QQ(1), (1, 0, 0, 3): QQ(1), (1, 1, 1, 0): QQ(1)},
grlex)
f1 = sdm_from_dict({(1, 1, 1, 0): QQ(1), (1, 0, 2, 0): QQ(1),
(1, 0, 0, 0): QQ(-1)}, grlex)
f2 = sdm_from_dict({(1, 1, 1, 0): QQ(1)}, grlex)
(id0, id1, id2) = [sdm_from_dict({(i, 0, 0, 0): QQ(1)}, grlex)
for i in range(3)]
assert sdm_nf_mora(f, [f1, f2], grlex, QQ, phantom=(id0, [id1, id2])) == \
([((1, 0, 2, 1), QQ(1)), ((1, 0, 0, 3), QQ(1)), ((1, 1, 1, 0), QQ(1)),
((1, 1, 0, 1), QQ(1))],
[((1, 1, 0, 1), QQ(-1)), ((0, 0, 0, 0), QQ(1))])
assert sdm_nf_mora(f, [f2, f1], grlex, QQ, phantom=(id0, [id2, id1])) == \
([((1, 0, 2, 1), QQ(1)), ((1, 0, 0, 3), QQ(1)), ((1, 1, 1, 0), QQ(1))],
[((2, 1, 0, 1), QQ(-1)), ((2, 0, 1, 1), QQ(-1)), ((0, 0, 0, 0), QQ(1))])
f = sdm_from_vector([x*z, y**2 + y*z - z, y], lex, QQ, gens=[x, y, z])
f1 = sdm_from_vector([x, y, 1], lex, QQ, gens=[x, y, z])
f2 = sdm_from_vector([x*y, z, z**2], lex, QQ, gens=[x, y, z])
assert sdm_nf_mora(f, [f1, f2], lex, QQ) == \
sdm_nf_mora(f, [f2, f1], lex, QQ) == \
[((1, 0, 1, 1), QQ(1)), ((1, 0, 0, 1), QQ(-1)), ((0, 1, 1, 0), QQ(-1)),
((0, 1, 0, 1), QQ(1))]
def test_conversion():
f = [x**2 + y**2, 2*z]
g = [((1, 0, 0, 1), QQ(2)), ((0, 2, 0, 0), QQ(1)), ((0, 0, 2, 0), QQ(1))]
assert sdm_to_vector(g, [x, y, z], QQ) == f
assert sdm_from_vector(f, lex, QQ) == g
assert sdm_from_vector(
[x, 1], lex, QQ) == [((1, 0), QQ(1)), ((0, 1), QQ(1))]
assert sdm_to_vector([((1, 1, 0, 0), 1)], [x, y, z], QQ, n=3) == [0, x, 0]
assert sdm_from_vector([0, 0], lex, QQ, gens=[x, y]) == sdm_zero()
def test_nontrivial():
gens = [x, y, z]
def contains(I, f):
S = [sdm_from_vector([g], lex, QQ, gens=gens) for g in I]
G = sdm_groebner(S, sdm_nf_mora, lex, QQ)
return sdm_nf_mora(sdm_from_vector([f], lex, QQ, gens=gens),
G, lex, QQ) == sdm_zero()
assert contains([x, y], x)
assert contains([x, y], x + y)
assert not contains([x, y], 1)
assert not contains([x, y], z)
assert contains([x**2 + y, x**2 + x], x - y)
assert not contains([x + y + z, x*y + x*z + y*z, x*y*z], x**2)
assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x**3)
assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x**4)
assert not contains([x + y + z, x*y + x*z + y*z, x*y*z], x*y**2)
assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x**4 + y**3 + 2*z*y*x)
assert contains([x + y + z, x*y + x*z + y*z, x*y*z], x*y*z)
assert contains([x, 1 + x + y, 5 - 7*y], 1)
assert contains(
[x**3 + y**3, y**3 + z**3, z**3 + x**3, x**2*y + x**2*z + y**2*z],
x**3)
assert not contains(
[x**3 + y**3, y**3 + z**3, z**3 + x**3, x**2*y + x**2*z + y**2*z],
x**2 + y**2)
# compare local order
assert not contains([x*(1 + x + y), y*(1 + z)], x)
assert not contains([x*(1 + x + y), y*(1 + z)], x + y)
def test_local():
igrlex = InverseOrder(grlex)
gens = [x, y, z]
def contains(I, f):
S = [sdm_from_vector([g], igrlex, QQ, gens=gens) for g in I]
G = sdm_groebner(S, sdm_nf_mora, igrlex, QQ)
return sdm_nf_mora(sdm_from_vector([f], lex, QQ, gens=gens),
G, lex, QQ) == sdm_zero()
assert contains([x, y], x)
assert contains([x, y], x + y)
assert not contains([x, y], 1)
assert not contains([x, y], z)
assert contains([x**2 + y, x**2 + x], x - y)
assert not contains([x + y + z, x*y + x*z + y*z, x*y*z], x**2)
assert contains([x*(1 + x + y), y*(1 + z)], x)
assert contains([x*(1 + x + y), y*(1 + z)], x + y)
def test_uncovered_line():
gens = [x, y]
f1 = sdm_zero()
f2 = sdm_from_vector([x, 0], lex, QQ, gens=gens)
f3 = sdm_from_vector([0, y], lex, QQ, gens=gens)
assert sdm_spoly(f1, f2, lex, QQ) == sdm_zero()
assert sdm_spoly(f3, f2, lex, QQ) == sdm_zero()
def test_chain_criterion():
gens = [x]
f1 = sdm_from_vector([1, x], grlex, QQ, gens=gens)
f2 = sdm_from_vector([0, x - 2], grlex, QQ, gens=gens)
assert len(sdm_groebner([f1, f2], sdm_nf_mora, grlex, QQ)) == 2
|