soft3/strata/ext/src/lib.rs

#![no_std]
//! strata-ext β€” tier 4: structural traits.
//!
//! traits for specific algebraic structures that not every field needs.
//!
//! ## Extension
//!
//! tower fields: F_p β†’ Fp2 β†’ Fp3 β†’ Fp4 (nebu extensions), or
//! Fβ‚‚ β†’ Fβ‚‚Β² β†’ F₂⁴ β†’ ... β†’ F₂¹²⁸ (kuro tower). an extension field
//! has a base field, a degree, and a Frobenius endomorphism.
//!
//! ## Batch
//!
//! Montgomery's trick: invert N elements with 1 inversion + 3(N-1)
//! multiplications. nebu and kuro both implement this independently β€”
//! this trait unifies the interface.
//!
//! ## Blind
//!
//! timing-safe operations for privacy-critical code. genies (CSIDH)
//! requires constant-time arithmetic β€” no branches on secret data.
//! other algebras may implement this for defense in depth.

use strata_core::Field;

/// an extension field over a base field.
///
/// E is an extension of B if B βŠ‚ E and E is a vector space over B.
/// the extension degree [E:B] = dim_B(E) β€” how many base elements
/// represent one extension element.
///
/// examples:
/// - Fp2 over Goldilocks: degree 2, Frobenius is conjugation
/// - F₂¹²⁸ over F₂⁢⁴: degree 2, defined by xΒ² + x + Ξ±
/// - F₂¹²⁸ over Fβ‚‚: degree 128, Frobenius is squaring
pub trait Extension<Base: Field>: Field {
    /// extension degree: [Self : Base].
    const DEGREE: usize;

    /// decompose into base field coefficients.
    /// returns DEGREE elements.
    fn to_base_elements(&self) -> alloc::vec::Vec<Base>;

    /// construct from base field coefficients.
    fn from_base_elements(coeffs: &[Base]) -> Self;

    /// embed a base element into the extension (as degree-0 coefficient).
    fn from_base(b: Base) -> Self;

    /// Frobenius endomorphism: x ↦ x^(|Base|^power).
    /// for prime fields of char p: Frobenius(x) = x^p.
    /// for binary fields: Frobenius(x) = xΒ² (squaring).
    fn frobenius_map(&self, power: usize) -> Self;
}

/// batch operations via Montgomery's trick.
///
/// invert N elements using 1 inversion + 3(N-1) multiplications.
/// prefix products β†’ invert the product β†’ back-propagate individual inverses.
pub trait Batch: Field {
    /// batch-invert a slice of field elements in-place.
    /// zero elements are left as zero.
    fn batch_inv(elements: &mut [Self]);
}

/// constant-time operations for privacy-critical arithmetic.
///
/// genies (CSIDH) requires this: isogeny walks on secret exponents
/// must not leak timing information. no branches on secret data,
/// no variable-time memory access, no early exits.
pub trait Blind: Field {
    /// constant-time equality comparison.
    fn ct_eq(&self, other: &Self) -> bool;

    /// constant-time conditional select: if choice is true, return a; else b.
    /// executes both branches regardless of choice.
    fn ct_select(a: &Self, b: &Self, choice: bool) -> Self;

    /// constant-time conditional swap: if choice is true, swap a and b.
    fn ct_swap(a: &mut Self, b: &mut Self, choice: bool);
}

extern crate alloc;

Homonyms

cyb/optica/src/lib.rs
soft3/strata/src/lib.rs
cyb/honeycrisp/src/lib.rs
warriors/trisha/honeycrisp/lib.rs
warriors/trisha/wgpu/lib.rs
soft3/glia/import/lib.rs
soft3/foculus/src/lib.rs
soft3/nox/rs/lib.rs
soft3/cybergraph/src/lib.rs
soft3/tru/rs/lib.rs
soft3/mudra/src/lib.rs
soft3/glia/run/lib.rs
cyb/prysm/rs/lib.rs
warriors/trisha/rs/lib.rs
cyb/src-tauri/src/lib.rs
soft3/mir/src/lib.rs
soft3/lens/src/lib.rs
neural/trident/src/lib.rs
neural/rune/rs/subject/lib.rs
cyb/cyb/cyb-services/src/lib.rs
soft3/strata/nebu/rs/lib.rs
soft3/lens/core/src/lib.rs
neural/rs/mir-format/src/lib.rs
soft3/zheng/rs/src/lib.rs
neural/rune/rs/interp/lib.rs
soft3/radio/iroh-willow/src/lib.rs
neural/rune/rs/parse/lib.rs
neural/eidos/rs/src/lib.rs
neural/rs/darwin-sys/src/lib.rs
soft3/radio/iroh-gossip/src/lib.rs
soft3/radio/iroh-ffi/src/lib.rs
soft3/radio/iroh-car/src/lib.rs
soft3/radio/iroh-relay/src/lib.rs
soft3/bbg/rs/src/lib.rs
soft3/radio/iroh-docs/src/lib.rs
soft3/lens/ikat/src/lib.rs
neural/rune/rs/lex/lib.rs
cyb/honeycrisp/aruminium/src/lib.rs
soft3/hemera/rs/src/lib.rs
neural/rune/rs/ast/lib.rs
soft3/radio/iroh-blobs/src/lib.rs
cyb/honeycrisp/acpu/src/lib.rs
soft3/lens/porphyry/src/lib.rs
cyb/honeycrisp/rane/src/lib.rs
neural/rune/rs/compile/lib.rs
neural/rune/rs/parse-pure/lib.rs
neural/rs/codegen/src/lib.rs
soft3/lens/binius/src/lib.rs
neural/rune/rs/prysm/lib.rs
neural/rs/link/src/lib.rs
neural/rune/rs/mold/lib.rs
soft3/strata/proof/src/lib.rs
soft3/lens/brakedown/src/lib.rs
soft3/strata/kuro/rs/lib.rs
soft3/lens/assayer/src/lib.rs
neural/rs/core/src/lib.rs
neural/rs/macros/src/lib.rs
soft3/radio/cyber-bao/src/lib.rs
soft3/strata/compute/src/lib.rs
soft3/radio/iroh-base/src/lib.rs
soft3/radio/iroh-dns-server/src/lib.rs
neural/rune/rs/lower/lib.rs
soft3/strata/core/src/lib.rs
soft3/hemera/wgsl/src/lib.rs
soft3/radio/iroh/src/lib.rs
cyb/honeycrisp/unimem/src/lib.rs
cyb/evy/crates/evy_engine_tasks/src/lib.rs
cyb/evy/crates/evy_dialect/src/lib.rs
cyb/wysm/crates/wasi/src/lib.rs
cyb/wysm/crates/fuzz/src/lib.rs
soft3/strata/genies/rs/src/lib.rs
cyb/evy/crates/evy_platform_caps/src/lib.rs
neural/inf/rs/oracle/src/lib.rs
soft3/strata/jali/wgsl/src/lib.rs
cyb/evy/forks/bevy_transform/src/lib.rs
soft3/tape/impl/rust/src/lib.rs
cyb/wysm/crates/wasmi/src/lib.rs
cyb/evy/forks/bevy_render/src/lib.rs
cyb/evy/crates/evy_ecs_storage/src/lib.rs
cyb/evy/forks/naga/src/lib.rs
soft3/strata/trop/wgsl/src/lib.rs
cyb/wysm/crates/c_api/artifact/lib.rs
cyb/evy/forks/bevy_ecs/src/lib.rs
cyb/wysm/crates/ir/src/lib.rs
cyb/evy/forks/bevy_animation/src/lib.rs
cyb/evy/forks/bevy_sprite_render/src/lib.rs
cyb/wysm/crates/c_api/src/lib.rs
neural/inf/rs/parse/src/lib.rs
soft3/strata/trop/rs/src/lib.rs
soft3/strata/kuro/wgsl/src/lib.rs
neural/trident/editor/zed/src/lib.rs
cyb/evy/forks/bevy_mesh/src/lib.rs
cyb/evy/crates/evy_radio/src/lib.rs
cyb/evy/forks/bevy_anti_alias/src/lib.rs
soft3/strata/jali/rs/src/lib.rs
cyb/wysm/crates/wast/src/lib.rs
neural/inf/rs/plan/src/lib.rs
neural/rs/tests/macro-integration/src/lib.rs
soft3/radio/iroh-ffi/iroh-js/src/lib.rs
cyb/evy/forks/bevy_image/src/lib.rs
cyb/evy/forks/bevy_post_process/src/lib.rs
neural/inf/rs/source/src/lib.rs
cyb/wysm/crates/core/src/lib.rs
cyb/evy/crates/evy_diagnostic/src/lib.rs
cyb/evy/crates/evy_engine_dispatch/src/lib.rs
cyb/evy/forks/bevy_pbr/src/lib.rs
cyb/evy/forks/bevy_gizmos/src/lib.rs
cyb/evy/forks/bevy_gizmos_render/src/lib.rs
soft3/radio/iroh/bench/src/lib.rs
neural/inf/rs/lex/src/lib.rs
neural/inf/rs/ast/src/lib.rs
soft3/strata/genies/wgsl/src/lib.rs
soft3/strata/nebu/wgsl/src/lib.rs
cyb/wysm/crates/collections/src/lib.rs
neural/inf/rs/lower/src/lib.rs
cyb/evy/forks/bevy_sprite/src/lib.rs
cyb/evy/forks/bevy_diagnostic/src/lib.rs
neural/inf/rs/eval/src/lib.rs
cyb/wysm/crates/c_api/macro/lib.rs
cyb/evy/forks/bevy_tasks/src/lib.rs
cyb/evy/forks/bevy_core_pipeline/src/lib.rs
cyb/evy/crates/evy_prysm_core/src/lib.rs
neural/inf/rs/value/src/lib.rs
cyb/evy/crates/evy_engine_core/src/lib.rs
soft3/radio/tests/integration/src/lib.rs
bootloader/go-cyber/cw/packages/cyber-std-test/src/lib.rs
bootloader/go-cyber/cw/contracts/std-test/src/lib.rs
bootloader/go-cyber/cw/contracts/graph-filter/src/lib.rs
bootloader/go-cyber/cw/packages/cyber-std/src/lib.rs

Graph