Source code for pyecsca.ec.formula.expand

from typing import Set, Callable, Any
from public import public

from .base import Formula
from .efd import EFDFormula
from .fliparoo import recursive_fliparoo
from .metrics import ivs_norm
from .partitions import reduce_all_adds, expand_all_muls, expand_all_nopower2_muls
from .switch_sign import generate_switched_formulas


def reduce_with_similarity(formulas: Set[Formula], norm: Callable[[Formula], Any]) -> Set[Formula]:
    reduced = set(filter(lambda x: isinstance(x, EFDFormula), formulas))
    similarities = list(map(norm, reduced))
    for formula in formulas:
        n = norm(formula)
        if n in similarities:
            continue
        similarities.append(n)
        reduced.add(formula)
    return reduced


[docs] @public def expand_formula_set( formulas: Set[Formula], norm: Callable[[Formula], Any] = ivs_norm ) -> Set[Formula]: extended = reduce_with_similarity(formulas, norm) fliparood: Set[Formula] = set().union(*map(recursive_fliparoo, extended)) extended.update(fliparood) extended = reduce_with_similarity(extended, norm) switch_signs: Set[Formula] = set().union(*(set(generate_switched_formulas(f)) for f in extended)) extended.update(switch_signs) extended = reduce_with_similarity(extended, norm) extended.update(set(map(reduce_all_adds, extended))) extended = reduce_with_similarity(extended, norm) extended.update(set(map(expand_all_muls, extended))) extended = reduce_with_similarity(extended, norm) extended.update(set(map(expand_all_nopower2_muls, extended))) extended = reduce_with_similarity(extended, norm) return extended