diff options
| author | J08nY | 2024-07-12 15:30:22 +0200 |
|---|---|---|
| committer | J08nY | 2024-07-12 15:30:22 +0200 |
| commit | 5d8773da1c0b69c35ec51cf57c61180dc16133eb (patch) | |
| tree | 432785509ce3593374070e199ccaebe9ad2052dc | |
| parent | 3ed8338d53e7bcfcecfddb55452882dfce34b609 (diff) | |
| download | pyecsca-5d8773da1c0b69c35ec51cf57c61180dc16133eb.tar.gz pyecsca-5d8773da1c0b69c35ec51cf57c61180dc16133eb.tar.zst pyecsca-5d8773da1c0b69c35ec51cf57c61180dc16133eb.zip | |
Handle simple parameter assumption faster.
| -rw-r--r-- | pyecsca/ec/formula/base.py | 25 |
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 = [] |
