All MicroEvals
list every single any type of error! In your reply, just lis...
Create MicroEval

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; }

Drag to resize
Drag to resize
Drag to resize