diff --git a/M2/Macaulay2/m2/matrix.m2 b/M2/Macaulay2/m2/matrix.m2 index db084df609..125623d1cf 100644 --- a/M2/Macaulay2/m2/matrix.m2 +++ b/M2/Macaulay2/m2/matrix.m2 @@ -102,8 +102,10 @@ Matrix _ Sequence := RingElement => (m,ind) -> ( else error "expected a sequence of length two" ) -Number == Matrix := -RingElement == Matrix := (r,m) -> m == r +Number == Matrix := +RingElement == Matrix := +Number == Vector := +RingElement == Vector := (r,m) -> m == r Matrix == Matrix := (f,g) -> ( if source f === source g @@ -115,26 +117,34 @@ Matrix == Matrix := (f,g) -> ( target f == target g and raw(super f * inducedMap(source f, source g)) === raw super g ) +Vector == Matrix := (v,m) -> matrix v == m +Matrix == Vector := (m,v) -> m == matrix v Matrix == Number := Matrix == RingElement := (m,f) -> m - f == 0 -- slow! +Vector == Number := +Vector == RingElement := (v,f) -> matrix v == f Matrix == ZZ := (m,i) -> if i === 0 then rawIsZero m.RawMatrix else m - i == 0 Matrix + Matrix := Matrix => ( (f,g) -> map(target f, source f, reduce(target f, raw f + raw g)) ) @@ toSameRing -Matrix + RingElement := (f,r) -> if r == 0 then f else f + r*id_(target f) -RingElement + Matrix := (r,f) -> if r == 0 then f else r*id_(target f) + f -Number + Matrix := (i,f) -> if i === 0 then f else i*id_(target f) + f -Matrix + Number := (f,i) -> if i === 0 then f else f + i*id_(target f) +Matrix + RingElement := +Matrix + Number := (f,r) -> if r == 0 then f else f + r*id_(target f) +RingElement + Matrix := +Number + Matrix := (r,f) -> f + r +Vector + Number := Vector + RingElement := (v,r) -> vector(matrix v + r) +Number + Vector := RingElement + Vector := (r,v) -> vector(r + matrix v) Matrix - Matrix := Matrix => ( (f,g) -> map(target f, source f, reduce(target f, raw f - raw g)) ) @@ toSameRing -Matrix - RingElement := (f,r) -> if r == 0 then f else f - r*id_(target f) -RingElement - Matrix := (r,f) -> if r == 0 then -f else r*id_(target f) - f -Number - Matrix := (i,f) -> if i === 0 then -f else i*id_(target f) - f -Matrix - Number := (f,i) -> if i === 0 then f else f - i*id_(target f) +Matrix - RingElement := +Matrix - Number := (f,r) -> if r == 0 then f else f - r*id_(target f) +RingElement - Matrix := +Number - Matrix := (r,f) -> -f + r +Vector - Number := Vector - RingElement := (v,r) -> vector(matrix v - r) +Number - Vector := RingElement - Vector := (r,v) -> vector(r - matrix v) - Matrix := Matrix => f -> new Matrix from { symbol ring => ring f, diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 index cb1ce1e424..91b5477976 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/minus.m2 @@ -82,14 +82,18 @@ document { (symbol -, Number, InfiniteNumber), (symbol -, Number, Matrix), (symbol -, Number, RingElement), + (symbol -, Number, Vector), (symbol -, RingElement), (symbol -, RingElement, Constant), (symbol -, RingElement, InexactNumber), (symbol -, RingElement, Matrix), (symbol -, RingElement, Number), (symbol -, RingElement, RingElement), + (symbol -, RingElement, Vector), (symbol -, Tally), (symbol -, Vector), + (symbol -, Vector, Number), + (symbol -, Vector, RingElement), (symbol -, Vector, Vector), }, Headline => "a unary or binary operator, usually used for negation or subtraction", diff --git a/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 b/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 index bbc876d0df..d09899c3f9 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/operators/plus.m2 @@ -72,6 +72,7 @@ document { (symbol +, Number, InfiniteNumber), (symbol +, Number, Matrix), (symbol +, Number, RingElement), + (symbol +, Number, Vector), (symbol +, RingElement), (symbol +, RingElement, Constant), (symbol +, RingElement, Ideal), @@ -79,9 +80,12 @@ document { (symbol +, RingElement, Matrix), (symbol +, RingElement, Number), (symbol +, RingElement, RingElement), + (symbol +, RingElement, Vector), (symbol +, Ideal, Number), (symbol +, Ideal, RingElement), (symbol +, Vector), + (symbol +, Vector, Number), + (symbol +, Vector, RingElement), (symbol +, Vector, Vector), }, Headline => "a unary or binary operator, usually used for addition", diff --git a/M2/Macaulay2/tests/normal/matrix.m2 b/M2/Macaulay2/tests/normal/matrix.m2 index a9d1a3877f..95206c3079 100644 --- a/M2/Macaulay2/tests/normal/matrix.m2 +++ b/M2/Macaulay2/tests/normal/matrix.m2 @@ -363,6 +363,7 @@ A = map(M, ZZ^1, {{1}}) assert Equation(A + A, 0) assert Equation(A - A, 0) assert Equation(A, -A) +assert Equation(A + 1, 1 + A) -- empty matrix scan({matrix {}, matrix(ZZ, {}), map(ZZ^0, ZZ^0, {}), map(ZZ^0,, {})}, A -> ( diff --git a/M2/Macaulay2/tests/normal/vector.m2 b/M2/Macaulay2/tests/normal/vector.m2 index e9ebb36aa8..a1e8af77a4 100644 --- a/M2/Macaulay2/tests/normal/vector.m2 +++ b/M2/Macaulay2/tests/normal/vector.m2 @@ -19,6 +19,10 @@ N = image vars R v = vector(N, {1, 2, 3}) w = vector(N, {4, 5, 6}) assert Equation(v, vector map(N,, {{1}, {2}, {3}})) +assert Equation(v, matrix v) +assert Equation(matrix v, v) + +assert zero vector {0, 0, 0} -- module operations assert Equation(+v, v)