list every single any type of error! In your reply, just lis...
Prompt
list every single any type of error! In your reply, just list the results, nothing else. import { Q } from "./Rationals"; import { MPoly, Monom } from "./MultivariatePoly"; function monomTotalDegree(e: Monom): number { return e.reduce((a, b) => a + b, 0); } function monomLexCmp(a: Monom, b: Monom): number { for (let i = 0; i < Math.max(a.length, b.length); i++) { const ai = i < a.length ? a[i] : 0; const bi = i < b.length ? b[i] : 0; if (ai !== bi) return bi - ai; } return 0; } function monomGrlexCmp(a: Monom, b: Monom): number { const da = monomTotalDegree(a); const db = monomTotalDegree(b); if (da !== db) return db - da; return monomLexCmp(a, b); } function monomGrevlexCmp(a: Monom, b: Monom): number { const da = monomTotalDegree(a); const db = monomTotalDegree(b); if (da !== db) return db - da; for (let i = a.length - 1; i >= 0; i--) { const ai = a[i]; const bi = b[i]; if (ai !== bi) return ai - bi; } return 0; } export type MonomOrder = "lex" | "grlex" | "grevlex"; export function monomCmp(a: Monom, b: Monom, order: MonomOrder): number { if (order === "lex") return monomLexCmp(a, b); if (order === "grlex") return monomGrlexCmp(a, b); return monomGrevlexCmp(a, b); } function monomLCM(a: Monom, b: Monom, n: number): Monom { const r: number[] = []; for (let i = 0; i < n; i++) { r.push(Math.max(i < a.length ? a[i] : 0, i < b.length ? b[i] : 0)); } return r; } function monomDiv(a: Monom, b: Monom, n: number): Monom { const r: number[] = []; for (let i = 0; i < n; i++) { r.push((i < a.length ? a[i] : 0) - (i < b.length ? b[i] : 0)); } return r; } function monomIsDivisibleBy(a: Monom, b: Monom): boolean { for (let i = 0; i < Math.max(a.length, b.length); i++) { const ai = i < a.length ? a[i] : 0; const bi = i < b.length ? b[i] : 0; if (ai < bi) return false; } return true; } export function leadingTerm(p: MPoly, order: MonomOrder): { e: Monom; c: Q } | null { if (p.isZero()) return null; let bestE: Monom | null = null; let bestC: Q = Q.zero; for (const [k, v] of p.terms) { const e = MPoly.parseKey(k, p.nVars); if (bestE === null || monomCmp(e, bestE, order) < 0) { bestE = e; bestC = v; } } return { e: bestE!, c: bestC }; } export function polyNormalize(p: MPoly): MPoly { const lt = leadingTerm(p, "grevlex"); if (!lt) return p; const inv = lt.c.inv(); return p.mulScalar(inv); } export function sPoly(f: MPoly, g: MPoly, order: MonomOrder): MPoly { const ltf = leadingTerm(f, order); const ltg = leadingTerm(g, order); if (!ltf || !ltg) return MPoly.zero(f.nVars, f.vars); const n = f.nVars; const lcm = monomLCM(ltf.e, ltg.e, n); const ef = monomDiv(lcm, ltf.e, n); const eg = monomDiv(lcm, ltg.e, n); const cf = ltg.c; const cg = ltf.c; let fTerm = f; for (let i = 0; i < n; i++) { for (let j = 0; j < ef[i]; j++) { fTerm = fTerm.mul(MPoly.var(n, i, f.vars)); } } fTerm = fTerm.mulScalar(cf); let gTerm = g; for (let i = 0; i < n; i++) { for (let j = 0; j < eg[i]; j++) { gTerm = gTerm.mul(MPoly.var(n, i, g.vars)); } } gTerm = gTerm.mulScalar(cg); return fTerm.sub(gTerm); } export function divide(p: MPoly, divisors: MPoly[], order: MonomOrder): { quotients: MPoly[]; remainder: MPoly; } { const n = p.nVars; const vars = p.vars; const qs = divisors.map(() => MPoly.zero(n, vars)); let r = MPoly.zero(n, vars); let h = p; const divLTs = divisors.map((d) => leadingTerm(d, order)); let guard = 0; while (!h.isZero() && guard < 100000) { guard++; const lth = leadingTerm(h, order)!; let divided = false; for (let i = 0; i < divisors.length; i++) { const ltd = divLTs[i]; if (!ltd) continue; if (monomIsDivisibleBy(lth.e, ltd.e)) { const e = monomDiv(lth.e, ltd.e, n); const c = lth.c.mul(ltd.c.inv()); const term = MPoly.fromMonom(n, e, c, vars); qs[i] = qs[i].add(term); let prod = divisors[i]; for (let k = 0; k < n; k++) { for (let j = 0; j < e[k]; j++) { prod = prod.mul(MPoly.var(n, k, vars)); } } prod = prod.mulScalar(c); h = h.sub(prod); divided = true; break; } } if (!divided) { const monomPoly = MPoly.fromMonom(n, lth.e, lth.c, vars); r = r.add(monomPoly); h = h.sub(monomPoly); } } return { quotients: qs, remainder: r }; } export function groebnerBasis(F: MPoly[], order: MonomOrder = "grevlex", maxSteps = 2000): MPoly[] { const n = F[0]?.nVars ?? 0; if (n === 0) return []; let G: MPoly[] = F.filter((f) => !f.isZero()).map((f) => polyNormalize(f)); const pairs: [number, number][] = []; for (let i = 0; i < G.length; i++) { for (let j = i + 1; j < G.length; j++) { pairs.push([i, j]); } } let steps = 0; while (pairs.length > 0 && steps < maxSteps) { steps++; const [i, j] = pairs.shift()!; const f = G[i]; const g = G[j]; const sp = sPoly(f, g, order); const { remainder } = divide(sp, G, order); if (!remainder.isZero()) { const nrm = polyNormalize(remainder); if (nrm.isOne()) { return [MPoly.one(n, F[0]?.vars)]; } for (let k = 0; k < G.length; k++) { pairs.push([k, G.length]); } G.push(nrm); } } return G; } export function reduceGroebnerBasis(G: MPoly[], order: MonomOrder): MPoly[] { let result: MPoly[] = []; const current = G.slice(); for (let i = 0; i < current.length; i++) { const others = [...current.slice(0, i), ...current.slice(i + 1)]; const { remainder } = divide(current[i], others, order); if (!remainder.isZero()) { result.push(polyNormalize(remainder)); } } let changed = true; while (changed) { changed = false; for (let i = 0; i < result.length; i++) { const others = [...result.slice(0, i), ...result.slice(i + 1)]; const { remainder } = divide(result[i], others, order); if (remainder.isZero()) { result = [...result.slice(0, i), ...result.slice(i + 1)]; changed = true; break; } const lt = leadingTerm(remainder, order); if (lt && !lt.c.isOne()) { result[i] = remainder.mulScalar(lt.c.inv()); } else { result[i] = remainder; } } } return result; }