private SquareMatrixElem<U, R, S> iinvertRight() throws NotInvertibleException
	{
		SquareMatrixElem<U,R,S> ret = getFac().identity();
		
		final BigInteger max = dim.getVal();
		BigInteger cnt = BigInteger.ZERO;
		while( cnt.compareTo( max ) < 0 )
		{
			final R mv = setUpColumnRight( cnt , ret );
			
			multiplyThroughColumnRight( cnt , mv );
			ret.multiplyThroughColumnRight( cnt , mv);
			
			if( mv instanceof SymbolicElem )
			{
				SymbolicMult ae = (SymbolicMult)( this.getVal(cnt, cnt) );
				SymbolicInvertRight sr = (SymbolicInvertRight)( ae.getElemB() );
				if( sr.getElem() == ae.getElemA() )
				{
					this.setVal(cnt, cnt, fac.identity() );
				}
				else
				{
					throw( new RuntimeException( "Fail." ) );
				}
			}
			
			BigInteger srcCol = cnt;
			BigInteger destCol = BigInteger.ZERO;
			while( destCol.compareTo( max ) < 0 )
			{
				if( destCol.compareTo(srcCol) != 0 )
				{
					R mult = this.getVal(srcCol, destCol);
					columnSubtractRight( srcCol , destCol , mult );
					ret.columnSubtractRight(srcCol, destCol, mult);
					
					if( mult instanceof SymbolicElem )
					{
						SymbolicAdd el = (SymbolicAdd)( this.getVal(srcCol, destCol) );
						SymbolicElem elA = el.getElemA();
						SymbolicNegate elB = (SymbolicNegate)( el.getElemB() );
						SymbolicMult elbm = (SymbolicMult)( elB.getElem() );
						if( ! ( elbm.getElemA() instanceof SymbolicIdentity ) )
						{
							throw( new RuntimeException( "Fail." ) );
						}
						
						if( elbm.getElemB() == elA )
						{
							this.setVal(srcCol, destCol, fac.zero() );
						}
						else
						{
							throw( new RuntimeException( "Fail." ) );
						}
					}
					
				}
				
				destCol = destCol.add( BigInteger.ONE );
			}
			
			cnt = cnt.add( BigInteger.ONE );
		}
		
		return( ret );
	}