variable change exhaustive search
This commit is contained in:
+22
-21
@@ -12,24 +12,24 @@ class Tea3Model:
|
||||
self.step_count = 0
|
||||
|
||||
names = (
|
||||
[f"x{i}{j}" for i in range(5) for j in range(8)] +
|
||||
[f"r{i}{j}" for i in range(5) for j in range(8)] +
|
||||
[f"R{i}{j}" for i in range(8) for j in range(8)] +
|
||||
["g"]
|
||||
[f"x{i}{j}" for i in range(5) for j in range(8)] + # 0–39
|
||||
[f"y{i}{j}" for i in range(5) for j in range(8)] + # 40–79
|
||||
[f"r{i}{j}" for i in range(5) for j in range(8)] + # 80–119
|
||||
[f"R{i}{j}" for i in range(8) for j in range(8)] + # 120–183
|
||||
["g"] # 184
|
||||
)
|
||||
|
||||
name_string = ",".join(names)
|
||||
self.S = BooleanPolynomialRing(len(names), name_string)
|
||||
self.v = self.S.gens()
|
||||
|
||||
self.x_bits = [list(self.v[i*8:(i+1)*8]) for i in range(5)]
|
||||
self.r_bits = [list(self.v[40 + i*8 : 40 + (i+1)*8]) for i in range(5)]
|
||||
self.R_bits = [list(self.v[80 + i*8 : 80 + (i+1)*8]) for i in range(8)]
|
||||
|
||||
self.x_bits = [list(self.v[i*8 : (i+1)*8 ]) for i in range(5)]
|
||||
self.y_bits = [list(self.v[40 + i*8 : 40 + (i+1)*8]) for i in range(5)]
|
||||
self.r_bits = [list(self.v[80 + i*8 : 80 + (i+1)*8]) for i in range(5)]
|
||||
self.R_bits = [list(self.v[120 + i*8 : 120 + (i+1)*8]) for i in range(8)]
|
||||
self.g = self.v[-1]
|
||||
|
||||
def _abstract_R(self):
|
||||
s = self.step_count
|
||||
one = self.S.one()
|
||||
zero = self.S.zero()
|
||||
|
||||
@@ -38,28 +38,28 @@ class Tea3Model:
|
||||
poly = self.R_bits[i][j]
|
||||
|
||||
groups = {}
|
||||
pure_xr = zero
|
||||
const = one if bool(poly.constant_coefficient()) else zero
|
||||
pure_xyr = zero
|
||||
const = one if bool(poly.constant_coefficient()) else zero
|
||||
|
||||
for monom in poly:
|
||||
term_vars = monom.variables()
|
||||
if not term_vars:
|
||||
continue
|
||||
|
||||
xr_vars = [v for v in term_vars if str(v)[0] in ('x', 'r')]
|
||||
Rf_vars = [v for v in term_vars if str(v)[0] in ('R', 'f', 'g')]
|
||||
xyr_vars = [v for v in term_vars if str(v)[0] in ('x', 'y', 'r')]
|
||||
Rg_vars = [v for v in term_vars if str(v)[0] in ('R', 'g')]
|
||||
|
||||
xr_mono = reduce(mul, (self.S(v) for v in xr_vars), one)
|
||||
xr_key = frozenset(str(v) for v in xr_vars)
|
||||
xyr_mono = reduce(mul, (self.S(v) for v in xyr_vars), one)
|
||||
xyr_key = frozenset(str(v) for v in xyr_vars)
|
||||
|
||||
if not Rf_vars:
|
||||
pure_xr += xr_mono
|
||||
if not Rg_vars:
|
||||
pure_xyr += xyr_mono
|
||||
else:
|
||||
groups[xr_key] = xr_mono
|
||||
groups[xyr_key] = xyr_mono
|
||||
|
||||
result = pure_xr + const
|
||||
for xr_key, xr_mono in groups.items():
|
||||
result += xr_mono * self.g
|
||||
result = pure_xyr + const
|
||||
for xyr_key, xyr_mono in groups.items():
|
||||
result += xyr_mono * self.g
|
||||
|
||||
self.R_bits[i][j] = result
|
||||
|
||||
@@ -101,6 +101,7 @@ class Tea3Model:
|
||||
|
||||
return R7
|
||||
|
||||
|
||||
def S(r):
|
||||
# placeholder
|
||||
return r
|
||||
|
||||
Reference in New Issue
Block a user