On Thu, Dec 14, 2023 at 5:37 AM Nils Bruin <
nbr...@sfu.ca> wrote:
>
> (side note: Q is generally considered a PID, but indeed it makes little sense worrying about Smith normal form over it)
>
> Concerning the slow performance: from the documentation, R._matrix_smith_form would allow an optimized routine to kick in. That doesn't exist, though.
> ZZ doesn't have it either, but there is a whole different class for that in sage/matrix/matrix_integer_dense.pyx that provides a specific-for-ZZ smith form algorithm. For QQ['t'] you end up with the generic algorithm, which is liable to be inefficient and have quirks such having large variations in runtime, depending on the specific input.
>
> So: it makes sense it's not very optimal (yet?). It would require work to get a better implementation specific for QQ['t']. This could be worthwhile to do well. Summer of Code?
Can't Sage just wrap PARI/gp matsnf (and mathnf) for QQ[t]? They work
for this case too, e.g.
sage: R.<x> = QQ[]
sage: M=matrix(R, [[1+x^2, 2-x+x^3],[42-x, x^3]])
sage: M.__pari__().matsnf(0)
[x^5 + x^4 - 41*x^3 - x^2 + 44*x - 84, 1]
sage: M.__pari__().mathnf(0)
[x^5 + x^4 - 41*x^3 - x^2 + 44*x - 84, 1/74088*x^4 + 43/74088*x^3 +
1765/74088*x^2 + 41/74088*x + 883/37044; 0, 1]
For some reason
sage: M.__pari__().matsnf(0).sage()
cannot deal with conversion back to Sage, which is probably a bug:
NameError Traceback (most recent call last)
Cell In[15], line 1
----> 1 M.__pari__().matsnf(Integer(0)).sage()
File cypari2/gen.pyx:1965, in cypari2.gen.Gen.sage()
File /mnt/opt/Sage/sage-dev/src/sage/libs/pari/convert_sage.pyx:41, in
sage.libs.pari.convert_sage.gen_to_sage()
39
40
---> 41 cpdef gen_to_sage(Gen z, locals=None) noexcept:
42 """
43 Convert a PARI gen to a Sage/Python object.
File /mnt/opt/Sage/sage-dev/src/sage/libs/pari/convert_sage.pyx:300,
in sage.libs.pari.convert_sage.gen_to_sage()
298 return K([gen_to_sage(real), gen_to_sage(imag)])
299 elif t == t_VEC or t == t_COL:
--> 300 return [gen_to_sage(x, locals) for x in z.python_list()]
301 elif t == t_VECSMALL:
302 return z.python_list_small()
File /mnt/opt/Sage/sage-dev/src/sage/libs/pari/convert_sage.pyx:326,
in sage.libs.pari.convert_sage.gen_to_sage()
324 from sage.misc.sage_eval import sage_eval
325 locals = {} if locals is None else locals
--> 326 return sage_eval(str(z), locals=locals)
327
328
File /mnt/opt/Sage/sage-dev/src/sage/misc/sage_eval.py:199, in
sage_eval(source, locals, cmds, preparse)
197 return locals['_sage_eval_returnval_']
198 else:
--> 199 return eval(source, sage.all.__dict__, locals)
File <string>:1
NameError: name 'x' is not defined
> To view this discussion on the web visit
https://groups.google.com/d/msgid/sage-support/eae0bd95-4ba8-4e8e-a5c7-c6ec8d83518an%40googlegroups.com.