On Dec 26, 2007 8:51 PM, Mike Hansen <[EMAIL PROTECTED]> wrote: > > I had made this a ticket a few days ago: > http://sagetrac.org/sage_trac/ticket/1587
Thanks. I've updated the ticket based on the above discussion, and suggested that the fix is to improve the documentation. Literally changing the behavior in that one function, would break dozens of other functions, at least. It might be really useful to have sage: A.right_kernel() to mean the set of vectors v such that A*v = 0, i.e., the vectors on the right. That would have to be clearly documented -- the function itself would be defined in matrix2.pyx and would just transpose A and call kernel on the resulting transpose. It would also cache the result. We have A.right_eigenvectors() in some cases (e.g., A an RDF matrix), and the documentation makes the meaning very clear: ------------------------------ sage: A = random_matrix(RDF,3) sage: A.right_eigenvectors() ([1.34856636676, -1.04338481358, -0.208244283695], [-0.250271326138 0.846883172518 0.0580964218791] [ 0.884959315834 0.223023546117 -0.702413116863] [ 0.392697431404 0.48275189278 0.709394543977]) sage: A.left_eigenvectors() ([1.34856636676, -1.04338481358, -0.208244283695], [ -0.51163197441 0.589230432257 0.625332088145] [ 0.967591994779 0.214539369634 0.133186300037] [-0.344957735432 -0.460493249193 0.817893714497]) sage: A.right_eigenvectors? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in method right_eigenvectors of sage.matrix.matrix_real_double_dense.Matrix_real_double_dense object at 0x2b077b08c3b0> Namespace: Interactive Docstring: Computes the eigenvalues and *right* eigenvectors of this matrix m acting *from the left*. I.e., vectors v such that m * v = lambda*v, where v is viewed as a column vector. ------------------------------ It actually might be possible to define sage: A.left_kernel() and sage: A.right_kernel() and have sage: A.kernel() default to A.right_kernel() without breaking sage into a million pieces. One would first define only A.left_kernel and A.right_kernel. Then one would go through all of Sage and make sure every instance of A.kernel where A is a matrix is changed to A.left_kernel -- since that is what is currently assumed, then doctest everything, and finally define a function kernel() in matrix2.pyx, which just calls self.right_kernel(). This would of course break code not in Sage that relies on the current behavior, which is not desirable, but not a deal breaker either at this stage in Sage development. Since x*A and A*x are both defined for x = vector(...), I think this would be reasonable. Another possibility would be to *only* define A.left_kernel() and A.right_kernel() and deprecate A.kernel(). That seems a little too anal to me. If we decide to do the above, what are the other similar functions to worry about? Certainly eigenspaces.... Since this issue has come up _numerous_ times I've made a trac ticket for it: http://trac.sagemath.org/sage_trac/ticket/1607 -- William > On 12/26/07, William Stein <[EMAIL PROTECTED]> wrote: > > > > On Dec 26, 2007 7:35 PM, Marshall Hampton <[EMAIL PROTECTED]> wrote: > > > > > > At least in the United States, and I assume some other places as well, > > > matrices are usually considered to act from the left. So the kernel > > > of a matrix A would be the set of vectors x such that Ax = 0. In > > > sage, the kernel is given for the matrix acting from the right, i.e. > > > the set of vectors y such that yA = 0. If there is compelling > > > argument as to why that makes sense, I can live with it. > > > > There are 2 or 3 reasons why things are as they are with matrix > > actions on vectors in Sage. > > > > 1. In Sage vectors are row vectors: > > sage: v = vector([1,2,3]) > > sage: v > > (1, 2, 3) # <-- that's a row > > > > Matrices act naturally from the right on row vectors. > > > > Nonetheless, we now allow both actions in Sage for convenience: > > > > sage: A = random_matrix(QQ,3) > > sage: A*v > > (5, -4, 3) > > sage: v*A > > (6, 3/2, -1) > > > > 2. David Kohel and I made the decision about which side matrices would act > > on > > when I started Sage, i.e., back when Sage was called "Software for > > Arithmetic > > Geometry Experimentation", and the main goal of Sage was to provide a viable > > open source alternative to the subset of Magma that David Kohel and I used, > > and > > to do so in a way that made it as easy as possible to port our code from > > Magma, > > and to go back and forth between Sage and Magma. > > In Magma matrices act from the right, probably because vectors are row > > vectors > > and also because Magma is Australian. > > > > 3. At some point I was about to change everything to matrices acting from > > the > > left, and David Kohel stopped me. > > > > I don't know if that is a compelling enough reason. A fourth reason is > > that > > changing things now would be really really really hard, and would likely > > introduce numerous bugs all over the place. > > > > A Magma example: > > ----- > > > > sage: A = random_matrix(QQ,3) > > sage: v = vector([1,2,3]) > > sage: v*A > > (9, 4, 3/2) > > sage: A*v > > (-5, 2, 15/2) > > sage: aa = magma(A) > > sage: vv = magma('VectorSpace(RationalField(),3)![1,2,3]') # trac > > 1605 -- I'm on it. > > sage: vv*aa > > ( 9 4 3/2) > > sage: aa*vv > > ... (boom!) > > <type 'exceptions.TypeError'>: Error evaluation Magma code. > > IN:_sage_[7] := _sage_[4] * _sage_[5]; > > OUT: > > >> _sage_[7] := _sage_[4] * _sage_[5]; > > ^ > > Runtime error in '*': Arguments are not compatible > > Argument types given: AlgMatElt[FldRat], ModTupFldElt[FldRat] > > > > > > > But the > > > documentation for kernel() obscures, rather than clarifies, this > > > issue: > > > > > > Docstring: > > > > > > Return the kernel of x. > > > > > > EXAMPLES: > > > sage: M = MatrixSpace(QQ,3,3) > > > sage: A = M([1,2,3,4,5,6,7,8,9]) > > > sage: kernel(A) > > > Vector space of degree 3 and dimension 1 over Rational Field > > > Basis matrix: > > > [ 1 -2 1] > > > > > > The problem with this example is that A is quite an unusual matrix: > > > its left-kernel is equal to its right-kernel. I recommend that a non- > > > square example be given that makes the current behavior clearer. > > > > Good idea. Please create a trac ticket, then put in some examples. > > You'll modify the file > > sage/matrix/matrix_rational_dense.pyx > > Please put in a bunch (i.e., maybe 4 or 5) of examples to illustrate all > > kinds of things, including edge cases (0 by n or n by 0 matrices, > > denominators, etc.). > > > > -- William > > > > > > > > > > > > -- William Stein Associate Professor of Mathematics University of Washington http://wstein.org --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://sage.math.washington.edu/sage/ and http://sage.scipy.org/sage/ -~----------~----~----~----~------~----~------~--~---