/*
* (C) Copyright 2005 Arnaud Bailly (arnaud.oqube@gmail.com),
* Yves Roos (yroos@lifl.fr) and others.
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package rationals.algebra;
/**
* An interface implemented by objects that can be coefficients of a
* Matrix.
* <p>
* A semi-ring is a structure <code>(R,+,*,0,1)</code> such that:
* <ol>
* <li><code>(R,+,0)</code> is a commutative monoid </li>
* <li><code>(R,*,1)</code> is a monoid </li>
* <li><code>x*(y+z) = x*y + x*z</code> and <code>(y+z)*x = y*x + z*x</code> : multiplication
* is distributive with respect to addition </li>
* <li><code>x*0 = 0*x = 0</code>: 0 is an absorbing element for *</li>
* </ol>
*
* @author nono
* @version $Id: SemiRing.java 2 2006-08-24 14:41:48Z oqube $
* @see Matrix
*/
public interface SemiRing {
/**
* Addition of a Semi-ring element with another element.
*
* @param s1
* @param s2
* @return
*/
public SemiRing plus(SemiRing s2);
/**
* Multiplication of semiring element with another element.
*
* @param s1
* @param s2
* @return
*/
public SemiRing mult(SemiRing s2);
/**
* Neutral element for multiplication.
*
* @return
*/
public SemiRing one();
/**
* Neutral element for addition.
*
* @return
*/
public SemiRing zero();
}