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 > > > On Thursday 14 December 2023 at 04:05:47 UTC+13 Enrique Artal wrote: >> >> It is over the ring of polynomials in one variable over Q. >> >> El miércoles, 13 de diciembre de 2023 a las 15:05:00 UTC+1, Dima Pasechnik >> escribió: >>> >>> On Wed, Dec 13, 2023 at 10:55 AM Enrique Artal <enriqu...@gmail.com> wrote: >>> > >>> > I have the toy example belowto compare the direct use of smith_form and >>> > the combination of hermite_form and smith_form. >>> > >>> > Last execution (there are random inputs) gave: >>> > CPU times: user 2.22 s, sys: 5.93 ms, total: 2.23 s Wall time: 2.23 s CPU >>> > times: user 454 ms, sys: 990 µs, total: 455 ms Wall time: 456 ms >>> > >>> > %%%%%%%%%%%%%%%%%%%%% >>> > R.<t> = QQ[] >>> > n = 3 >>> > m = 5 >>> > ds = (n, m) >>> > M = MatrixSpace(R, n, m) >>> > V = random_vector(R, n) >>> > A0 = Matrix(R, n, m) >>> > A0[0, 0] = R.random_element() >>> > for j in range(1, n): >>> > A0[j, j] = A0[j -1, j - 1] * R.random_element() >>> > def par(n): >>> > i1 = ZZ.random_element(0,n) >>> > j1 = i1 >>> > while j1 == i1: >>> > j1 = ZZ.random_element(0,n) >>> > return (i1, j1) >>> > def smith_hermite(A): >>> > D1, U1 = A.hermite_form(transformation=True) >>> > D, U2, V = D1.smith_form() >>> > U = U2 * U1 >>> > return D, U, V >>> > P = {j: identity_matrix(R, ds[j]) for j in range(2)} >>> > s = 20 >>> > for k in range(2): >>> > for a in range(s): >>> > i, j = par(n) >>> > f = R.random_element() >>> > P[k].add_multiple_of_row(i, j ,f) >>> > i, j = par(n) >>> > P[k].swap_rows(i, j) >>> > i, j = par(n) >>> > f = R.random_element() >>> > P[k].add_multiple_of_column(i, j ,f) >>> > i, j = par(n) >>> > P[0].swap_columns(i, j) >>> > A = P[0] * A0 * P[1] >>> > %time D, U, V = A.smith_form() >>> > %time D1, U1, V1 = smith_hermite(A) >>> >>> hmm, what's Smith form of a matrix over Q ? >>> Q is not a PID. >>> > >>> > -- >>> > You received this message because you are subscribed to the Google Groups >>> > "sage-support" group. >>> > To unsubscribe from this group and stop receiving emails from it, send an >>> > email to sage-support...@googlegroups.com. >>> > To view this discussion on the web visit >>> > https://groups.google.com/d/msgid/sage-support/dec24250-3a00-4c3e-a2e6-e352cde6ff2bn%40googlegroups.com. > > -- > You received this message because you are subscribed to the Google Groups > "sage-support" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sage-support+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sage-support/eae0bd95-4ba8-4e8e-a5c7-c6ec8d83518an%40googlegroups.com. -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/CAAWYfq125b2W6VPY2%2B1vSERXZ-o1-JoqmmskNd7213-HSgR1zQ%40mail.gmail.com.