/** * Exact arithmetic for Coxeter group enumeration. * * Group elements and vertex orbits are identified by exact * mirror-distance tuples — never by Float64 comparison — so enumeration * cannot invent or merge chambers. The unit-normal mirror basis keeps * the required constants tiny: every doubled-Gram entry is 2, 0, −1, * −√2, or −φ, so three quadratic rings cover all built-in groups: * * ℤ (A, D families — simply laced) * ℤ[√2] (B, F families — the 4-marked link) * ℤ[φ] (H families — the 5-marked link, φ² = φ + 1) * * Elements are pairs (a, b) of bigints meaning a + b·ρ for the ring's * radical ρ; the integer ring simply keeps b = 0. */ /** An element a + b·ρ of one of the supported quadratic rings. */ export interface ExactValue { readonly a: bigint; readonly b: bigint; } export type ExactRingKind = 'integer' | 'sqrt2' | 'phi'; export interface ExactRing { readonly kind: ExactRingKind; readonly zero: ExactValue; readonly one: ExactValue; fromInt(n: number): ExactValue; add(x: ExactValue, y: ExactValue): ExactValue; sub(x: ExactValue, y: ExactValue): ExactValue; neg(x: ExactValue): ExactValue; mul(x: ExactValue, y: ExactValue): ExactValue; /** The radical ρ itself (√2 or φ); throws for the integer ring. */ radical(): ExactValue; /** Exact hash key; equal keys ⇔ equal ring elements. */ key(x: ExactValue): string; keyTuple(xs: readonly ExactValue[]): string; /** Exact order in the selected real embedding: −1, 0, or +1. */ sign(x: ExactValue): -1 | 0 | 1; compare(x: ExactValue, y: ExactValue): -1 | 0 | 1; /** One-time conversion to Float64 (a + b·ρ numerically). */ toNumber(x: ExactValue): number; } /** ℤ: ρ unused (b stays 0). */ export declare const integerRing: ExactRing; /** ℤ[√2]: ρ² = 2. */ export declare const sqrt2Ring: ExactRing; /** ℤ[φ]: ρ² = ρ + 1 (the golden ratio). */ export declare const phiRing: ExactRing; //# sourceMappingURL=exact.d.ts.map