@Override
	public SquareMatrixElem<U, R, S> mult(SquareMatrixElem<U, R, S> b) {
		SquareMatrixElem<U,R,S> ret = new SquareMatrixElem<U,R,S>(fac,dim);
		
		Iterator<BigInteger> rowi = rowMap.keySet().iterator();
		while( rowi.hasNext() )
		{
			BigInteger row = rowi.next();
			HashMap<BigInteger,R> subMapRowa = rowMap.get( row );
			Iterator<BigInteger> colj = b.columnMap.keySet().iterator();
			while( colj.hasNext() )
			{
				BigInteger col = colj.next();
				HashMap<BigInteger,R> subMapColb = b.columnMap.get( col );
				R val = null;
				Iterator<BigInteger> vk = ( subMapRowa.size() < subMapColb.size() ) ? 
						subMapRowa.keySet().iterator() : subMapColb.keySet().iterator();
				while( vk.hasNext() )
				{
					BigInteger k = vk.next();
					R av = subMapRowa.get( k );
					R bv = subMapColb.get( k );
					if( ( av != null ) && ( bv != null ) )
					{
						R prod = av.mult( bv );
						if( val == null )
						{
							val = prod;
						}
						else
						{
							val = val.add( prod );
						}
					}
				}
				if( val != null )
				{
					ret.setVal(row, col, val);
				}
			}
		}
		return( ret );
		
	}