Sure, any field is a PID but it is not the targe of a Smith form :)
This question came from an actual computation of a colleague where the 
direct approach is taking days and hermite+smith is very fast, and could be 
useful for any one variable ring. Any way,  I agree with you that maybe a 
Summer of Code is a good idea. Until this, a small PR could be helpful?

El jueves, 14 de diciembre de 2023 a las 6:37:29 UTC+1, Nils Bruin escribió:

> (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?
>
>
> 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/64db95b0-6db8-44eb-93ab-ff5ff4c5570dn%40googlegroups.com.

Reply via email to