Skip to content

quotient has a Linear strategy that is an unimplemented stub and is commented out of the hook table, so requesting it is an error #4642

Description

@d-torrance

This issue was triaged from one request inside bugs/dan/0-bugs-eisenbud.m2, one of the 857 files removed from the pre-GitHub bugs/ tree by d2c8d27826 and catalogued in #36. That file is a wishlist holding several unrelated requests, so its asks were split apart and filed separately rather than as one issue nobody could close. The commentary below was written by Claude (Claude Opus 5, via Claude Code), not by @d-torrance, whose account posted it -- please weigh it accordingly.

The request, verbatim

quotient should check to see if the second arg is a variable -- in this case it should always use the "linear" strategy. [Merged with Dan's fourth paragraph: "time quotient(i3,S_0,Strategy=>Linear) Claims that the strategy is not implemented."]

The rest of the file is unrelated to this request; it is linked in the footer below.

Where it stands today

quotient has a Linear strategy that is a stub, and it is commented out of the hook table, so asking for it
is an error rather than a slow answer:

i1 : S = QQ[x,y,z];

i2 : I = ideal(x^2*y, x*z, y*z^2);

i3 : quotient(I, ideal x, Strategy => Linear)
stdio:3:1:(3): error: unrecognized Strategy => 'Linear' for (quotient,Ideal,Ideal)

The default path is fine — quotient(I, ideal x) and I : x agree, both giving ideal(z, x*y) — so nothing
is broken. What is missing is the optimisation.

The stub already contains the requested condition

Saturation.m2:241-246:

    Linear => (opts, I, J) -> (
	-- assumptions: J is a single linear element, and everything is homogeneous
	if not isHomogeneous I
	or not isHomogeneous J or not isLinearForm J_0
	then return null;
	stderr << "warning: quotient strategy Linear is not yet implemented" << endl; null),

so the test for "the divisor is a linear form", which is what the request below asks quotient to check
automatically, is already written — inside the strategy that does not exist yet. That is why the two halves of
the original request are treated as one piece of work here.

And it is unregistered, so the warning is unreachable

Saturation.m2:261 and :306:

scan({Quotient, Iterate-*, Linear*-, Monomial}, strategy ->
    addHook(key := (quotient, Ideal, Ideal), algorithms#key#strategy, Strategy => strategy))
...
scan({Quotient, Iterate-*, Linear*-}, strategy ->
    addHook(key := (quotient, Module, Ideal), algorithms#key#strategy, Strategy => strategy))

Linear is inside a -* … *- block comment in both. A caller therefore never sees the "not yet implemented"
warning; they get unrecognized Strategy from the hook dispatcher instead.

Nothing published is being broken

Worth stating, because it changes how urgent this is: Linear is not advertised. hooks methods(quotient, Ideal, Ideal) lists only Quotient, Iterate and Monomial, and the [quotient, Strategy] node at
Saturation/quotient-doc.m2:97 describes Quotient and Iterate and directs the reader to hooks for the
list. So no documented promise is unmet — this is an internal optimisation that was started and left.

It was advertised once. #1317, from 2020, quotes the help
output of the day:

* Strategy => ..., -- Possible strategies are: Iterate, Linear, and Quotient

so the enumeration existed and was removed somewhere in the documentation restructuring since.

What would close this

Either implement the strategy and register it, and have quotient select it automatically when the divisor is
a linear form — which is what the request asks for and what the stub's own precondition anticipates — or, if
nobody intends to, delete the stub and the two commented-out registrations so the next reader does not spend
the same time working out that Linear is unreachable.

Provenance

Two requests from bugs/dan/0-bugs-eisenbud.m2, a wishlist file removed with the bugs/ tree in d2c8d27826
and catalogued in #36, merged here because the evidence above shows they are one piece of work:

quotient should check to see if the second arg is a variable -- in this case it should always use the
"linear" strategy

time quotient(i3,S_0,Strategy=>Linear) Claims that the strategy is not implemented.

The second still holds in substance, though the wording has drifted: the claim is no longer "not implemented"
but "unrecognized", because the strategy is not even registered.

Nothing in the tracker covers this — searched titles for quotient and "Linear strategy", bodies for
"quotient strategy Linear", and comments for "quotient strategy", "Strategy => Linear", Saturation.m2 and
isLinearForm.

open · disposition issue · ask 2 of bugs/dan/0-bugs-eisenbud.m2 · source of truth: bug-triage/asks.tsv

Metadata

Metadata

Assignees

No one assigned

    Labels

    CoreIssues involving the Core scripts.bugs directoryConverted from a file in the old `bugs` directory

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions