import { ops, scalar, scalarRational, scalarExt } from './core'; import complex, { complexT } from './complex'; import rational, { rationalB } from './rational'; type normalized = T extends bigint ? rationalB : T; type realRoots = T extends number ? number[] : T extends bigint ? rationalB[] : T extends scalar ? T[] : never; type complexRoots = T extends number ? complex[] : T extends scalarExt ? complexT[] : never; type rationalRoots = T extends number ? rational[] : T extends bigint ? rationalB[] : T extends rational ? rational[] : T extends rationalB ? rationalB[] : T extends scalarRational ? rationalB[] : never; type PolyNTypes = number | ops; type PolyTypes = PolyNTypes | bigint; export interface PolynomialN { c: C[]; degree(): number; dup(): PolynomialN; evaluate(t: C): C; evaluate(t: C[]): C[]; deriv(): Polynomial; mul(b: PolynomialN): PolynomialN; divmod(b: PolynomialN): Polynomial; rationalRoots(): rationalRoots; realRoots(epsilon?: number): realRoots; allRoots(epsilon?: number): complexRoots; refine_roots(x: realRoots, count?: number): realRoots; } export interface Polynomial extends PolynomialN { leadCoeff(): C; dup(): Polynomial; add(b: C | Polynomial): Polynomial; sub(b: C | Polynomial): Polynomial; scale(b: C): Polynomial; rscale(b: C): Polynomial; mul(b: Polynomial): Polynomial; divmod(b: Polynomial): Polynomial; div(b: Polynomial): Polynomial; selfAdd(b: C | Polynomial): void; selfSub(b: C | Polynomial): void; selfScale(b: C): void; selfRscale(b: C): void; pseudoRemainder(b: Polynomial): void; content(): C; abs(): Polynomial; sign(): number; normalise(epsilon?: number): PolynomialN>; map(func: (c: C, i: number) => U): Polynomial; } export declare function PolynomialN(c: readonly number[]): PolynomialN; export declare function PolynomialN>(c: T[]): PolynomialN; export declare function Polynomial(c: readonly number[]): Polynomial; export declare function Polynomial(c: readonly bigint[]): Polynomial; export declare function Polynomial>(c: T[]): Polynomial; export declare function Polynomial(c: T[]): Polynomial; declare class polynomialT> implements Polynomial { c: T[]; constructor(c: T[]); degree(): number; leadCoeff(): T; dup(): polynomialT; evaluate(t: T): T; evaluate(t: T[]): T[]; deriv(): polynomialT; add(b: T | polynomialT): polynomialT; sub(b: T | polynomialT): polynomialT; scale(b: number | T): polynomialT; rscale(b: number | T): polynomialT; mul(b: polynomialT): polynomialT; div(b: polynomialT): polynomialT; selfAdd(b: T | polynomialT): void; selfSub(b: T | polynomialT): void; selfScale(b: number | T): void; selfRscale(b: number | T): void; divmod(b: polynomialT): polynomialT; pseudoRemainder(b: polynomialT): void; content(): T extends scalar ? T : never; abs(): Polynomial; sign(): number; normalise(epsilon?: number): PolynomialN>; rationalRoots(): rationalRoots; realRoots(epsilon?: number): realRoots; allRoots(epsilon?: number): complexRoots; map(func: (c: T, i: number) => U): Polynomial; refine_roots(x: realRoots, count?: number): realRoots; toString(debug?: boolean): string; } export declare function polyGCD(A: Polynomial, B: Polynomial): Polynomial; export declare function squareFreeFactorization(f: Polynomial): { factor: Polynomial; multiplicity: number; }[]; export declare function multiplicityAt>(poly: Polynomial | PolynomialN, x: T, epsilon?: number): number; export declare function interpolate(points: [T, T][], one?: T): Polynomial; export declare function sylvesterMatrix(p: T[], q: T[], zero: T): T[][]; export declare function resultant>(p: Polynomial, q: Polynomial): T; export declare function discriminant>(p: Polynomial): T; /** * Generate Vieta's formulas for a polynomial of given degree * Returns equations relating roots to coefficients * * For degree n with roots r₁, r₂, ..., rₙ and coefficients c₁, c₂, ..., cₙ: * - σ₁ = r₁ + r₂ + ... + rₙ = -c₁ * - σ₂ = r₁r₂ + r₁r₃ + ... = c₂ * - σ₃ = r₁r₂r₃ + ... = -c₃ * - ... * - σₙ = r₁r₂...rₙ = (-1)ⁿcₙ */ export declare function vietasFormulas>(poly: polynomialT, roots: T[]): T[]; export declare function legendrePolynomial(n: number): Polynomial; export declare function legendreTable(n: number): [number, number][]; export {};