variable change exhaustive search

This commit is contained in:
2026-04-23 14:53:31 +02:00
parent 4386cb72e9
commit a6d4647105
3 changed files with 101 additions and 35 deletions
+22 -21
View File
@@ -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)] + # 039
[f"y{i}{j}" for i in range(5) for j in range(8)] + # 4079
[f"r{i}{j}" for i in range(5) for j in range(8)] + # 80119
[f"R{i}{j}" for i in range(8) for j in range(8)] + # 120183
["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