fhelium.experimental.bootstrap.reduction.exponential
Exponential-seed periodic reduction with repeated squaring.
ExponentialSquaringReduction
class View source
ExponentialSquaringReduction(input_bound: int, degree: int, evaluator: Any = BalancedPowerEvaluator(), fuse_input_normalization: bool = False)Reduce one real branch through a truncated exponential and squaring.
Let input_bound,
Repeated squaring computes
reference(values) always consumes normalized evaluate(...) consumes raw fuse_input_normalization=False; with fusion enabled its caller must provide
The ciphertext state, axes, functional behavior, depth transition, and depth-dependent scale schedule are the same as for CosineDoubleAngleReduction. This strategy additionally requires a conjugation key. It returns a two-component coefficient-domain, standard-RNS Q ciphertext at ciphertext.depth + required_depths, with the corresponding active prime_ids and the arithmetic owner's target scale.
Attributes
| Name | Type | Default/value |
|---|---|---|
requires_relinearization | True | |
input_bound | int | |
degree | int | |
evaluator | Any | BalancedPowerEvaluator() |
fuse_input_normalization | bool | False |
polynomial
property
polynomial: PolynomialApproximationReturn ascending power coefficients for
Entry
squaring_iterations
property
squaring_iterations: intReturn
fused_input_divisor
property
fused_input_divisor: floatReturn
required_depths
property
required_depths: intCount normalization, polynomial DAG, squarings, and sine scaling.
evaluate
method
def evaluate(arithmetic: BootstrapArithmetic, ciphertext: Ciphertext, *, relinearization_key: RelinearizationKey | None, conjugation_key: ConjugationKey | None=None) -> Ciphertext: ...Evaluate
Non-fused evaluation first maps raw
reference
method
def reference(values: np.ndarray) -> np.ndarray: ...Evaluate the plaintext oracle on normalized coordinates
The input shape is preserved. This method never divides by values / input_bound. It models polynomial truncation and repeated squaring but not CKKS error.