aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2024-07-12 15:30:22 +0200
committerJ08nY2024-07-12 15:30:22 +0200
commit5d8773da1c0b69c35ec51cf57c61180dc16133eb (patch)
tree432785509ce3593374070e199ccaebe9ad2052dc
parent3ed8338d53e7bcfcecfddb55452882dfce34b609 (diff)
downloadpyecsca-5d8773da1c0b69c35ec51cf57c61180dc16133eb.tar.gz
pyecsca-5d8773da1c0b69c35ec51cf57c61180dc16133eb.tar.zst
pyecsca-5d8773da1c0b69c35ec51cf57c61180dc16133eb.zip
Handle simple parameter assumption faster.
-rw-r--r--pyecsca/ec/formula/base.py25
1 files changed, 18 insertions, 7 deletions
diff --git a/pyecsca/ec/formula/base.py b/pyecsca/ec/formula/base.py
index 22148cb..a102283 100644
--- a/pyecsca/ec/formula/base.py
+++ b/pyecsca/ec/formula/base.py
@@ -176,15 +176,26 @@ class Formula(ABC):
getconfig().ec.unsatisfied_formula_assumption_action,
f"Unsatisfied assumption in the formula ({assumption_string}).",
)
- elif lhs in self.parameters and is_symbolic:
- # Handle a symbolic assignment to a new parameter.
+ elif lhs in self.parameters:
expr = sympify(rhs, evaluate=False)
- for curve_param, value in params.items():
- if isinstance(value, SymbolicMod):
- expr = expr.subs(curve_param, value.x)
+ for symbol in expr.free_symbols:
+ if (value := params.get(str(symbol), None)) is not None:
+ if isinstance(value, SymbolicMod):
+ expr = expr.subs(symbol, value.x)
+ else:
+ expr = expr.subs(symbol, int(value))
else:
- expr = expr.subs(curve_param, int(value))
- params[lhs] = SymbolicMod(expr, field)
+ raise_unsatisified_assumption(
+ getconfig().ec.unsatisfied_formula_assumption_action,
+ f"Unsatisfied assumption in the formula ({assumption_string}).",
+ )
+ if is_symbolic:
+ params[lhs] = SymbolicMod(expr, field)
+ else:
+ domain = FF(field)
+ numerator, denominator = expr.as_numer_denom()
+ val = int(domain.from_sympy(numerator) / domain.from_sympy(denominator))
+ params[lhs] = Mod(val, field)
else:
expr = sympify(f"{rhs} - {lhs}", evaluate=False)
remaining = []