Opened 5 years ago

# Wrong results in vector matrix multiplication

Reported by: Owned by: Simon Brandhorst major sage-9.8 linear algebra sd91 Travis Scrimshaw N/A u/roed/vmat_action 6021daa7081396ae0c418b8f34ad69dc96a682c7

### Description

```sage: M = FreeModule(ZZ,1).span([vector([1/3])])
sage: x = M([1/3])
sage: x
(1/3)
sage: A = Matrix(QQ,[1])
sage: x*A , A*x
((1/3), (1/3))
```

This is good.

```sage: B = Matrix(ZZ,[1])
sage: x*B , B*x
((1), (1/3))
```

The first entry is clearly wrong. Somehow the first product is carried out in a wrong basis representation for x.

### comment:2 Changed 5 years ago by David Roe

The problem appears in line 1122 of `sage.matrix.matrix_integer_dense.pyx`, inside the function `cdef _vector_times_matrix_(self, Vector v)`:

```w = <Vector_integer_dense> v
```

If you change that to

```w = <Vector_integer_dense?> v
```

you'll get an error, because `v` is a `Vector_rational_dense`, and if you change it to

```try:
w = <Vector_integer_dense?> v
except TypeError:
return Matrix_dense._vector_times_matrix_(self, v)
```

you get `(1/3)`.

This function is replacing a more general implementation in `sage.matrix.matrix0`, but it only replaces `_vector_times_matrix_`, not `_matrix_times_vector_`, thus the disparity based on whether `B` is acting on the left or right.

I don't know if the try/except block is the right answer. I'll think about it....

### comment:3 Changed 5 years ago by David Roe

There's maybe a separate issue in `sage.matrix.action`, since it detects the base ring of the result by checking the base ring of the inputs. But here `x` and `B` both have base ring `ZZ`, and indeed

```sage: from sage.structure.element import coercion_model
sage: from operator import mul
sage: coercion_model.explain(x.parent(), B.parent(), mul)
Action discovered.
Right action by Full MatrixSpace of 1 by 1 dense matrices over Integer Ring on Free module of degree 1 and rank 1 over Integer Ring
Echelon basis matrix:
[1/3]
Result lives in Ambient free module of rank 1 over the principal ideal domain Integer Ring
Ambient free module of rank 1 over the principal ideal domain Integer Ring
```

The result should probably have rational entries....

Last edited 5 years ago by David Roe (previous) (diff)

### comment:4 Changed 5 years ago by David Roe

Branch: → u/roed/vmat_action

### comment:5 Changed 5 years ago by David Roe

There are segfaults in the new implementation that multiplies a non-square integral matrix times a rational vector. Still working on them...

New commits:

 ​6021daa `Correct base ring for matrices acting on submodules, implement multiplication for Vector_rational_dense times an integral matrix.`

### comment:6 Changed 5 years ago by Simon Brandhorst

*ping* :) Maybe #24031 is related to this? After all that bug occurs for vectors as well. Does this one for matrices too?

### comment:7 Changed 2 years ago by Matthias Köppe

Cc: Travis Scrimshaw added sage-8.1 → sage-9.2

Still unresolved as of 9.2.beta2

### comment:8 Changed 2 years ago by Samuel Lelièvre

There is a possibility that #28544 will solve this, see comment 10 there.

### comment:9 Changed 2 years ago by Matthias Köppe

Milestone: sage-9.2 → sage-9.3

### comment:10 Changed 19 months ago by Matthias Köppe

Milestone: sage-9.3 → sage-9.4

Moving to 9.4, as 9.3 has been released.

### comment:11 Changed 16 months ago by Matthias Köppe

Milestone: sage-9.4 → sage-9.5

### comment:12 Changed 12 months ago by Matthias Köppe

Milestone: sage-9.5 → sage-9.6

### comment:13 Changed 7 months ago by Matthias Köppe

Milestone: sage-9.6 → sage-9.7

### comment:14 Changed 2 months ago by Matthias Köppe

Milestone: sage-9.7 → sage-9.8
Note: See TracTickets for help on using tickets.