blob: faa99dcb8243198b996f2a68fe2d899b4bba8cd7 [file] [log] [blame]
package org.bouncycastle.pqc.math.linearalgebra;
/**
* This abstract class implements an element of the finite field <i>GF(2)<sup>n
* </sup></i> in either <i>optimal normal basis</i> representation (<i>ONB</i>)
* or in <i>polynomial</i> representation. It is extended by the classes <a
* href = GF2nONBElement.html><tt> GF2nONBElement</tt></a> and <a href =
* GF2nPolynomialElement.html> <tt>GF2nPolynomialElement</tt> </a>.
*
* @see GF2nPolynomialElement
* @see GF2nONBElement
* @see GF2nONBField
*/
public abstract class GF2nElement
implements GFElement
{
// /////////////////////////////////////////////////////////////////////
// member variables
// /////////////////////////////////////////////////////////////////////
/**
* holds a pointer to this element's corresponding field.
*/
protected GF2nField mField;
/**
* holds the extension degree <i>n</i> of this element's corresponding
* field.
*/
protected int mDegree;
// /////////////////////////////////////////////////////////////////////
// pseudo-constructors
// /////////////////////////////////////////////////////////////////////
/**
* @return a copy of this GF2nElement
*/
public abstract Object clone();
// /////////////////////////////////////////////////////////////////////
// assignments
// /////////////////////////////////////////////////////////////////////
/**
* Assign the value 0 to this element.
*/
abstract void assignZero();
/**
* Assigns the value 1 to this element.
*/
abstract void assignOne();
// /////////////////////////////////////////////////////////////////////
// access
// /////////////////////////////////////////////////////////////////////
/**
* Returns whether the rightmost bit of the bit representation is set. This
* is needed for data conversion according to 1363.
*
* @return true if the rightmost bit of this element is set
*/
public abstract boolean testRightmostBit();
/**
* Checks whether the indexed bit of the bit representation is set
*
* @param index the index of the bit to test
* @return <tt>true</tt> if the indexed bit is set
*/
abstract boolean testBit(int index);
/**
* Returns the field of this element.
*
* @return the field of this element
*/
public final GF2nField getField()
{
return mField;
}
// /////////////////////////////////////////////////////////////////////
// arithmetic
// /////////////////////////////////////////////////////////////////////
/**
* Returns <tt>this</tt> element + 1.
*
* @return <tt>this</tt> + 1
*/
public abstract GF2nElement increase();
/**
* Increases this element by one.
*/
public abstract void increaseThis();
/**
* Compute the difference of this element and <tt>minuend</tt>.
*
* @param minuend the minuend
* @return <tt>this - minuend</tt> (newly created)
* @throws DifferentFieldsException if the elements are of different fields.
*/
public final GFElement subtract(GFElement minuend)
throws RuntimeException
{
return add(minuend);
}
/**
* Compute the difference of this element and <tt>minuend</tt>,
* overwriting this element.
*
* @param minuend the minuend
* @throws DifferentFieldsException if the elements are of different fields.
*/
public final void subtractFromThis(GFElement minuend)
{
addToThis(minuend);
}
/**
* Returns <tt>this</tt> element to the power of 2.
*
* @return <tt>this</tt><sup>2</sup>
*/
public abstract GF2nElement square();
/**
* Squares <tt>this</tt> element.
*/
public abstract void squareThis();
/**
* Compute the square root of this element and return the result in a new
* {@link GF2nElement}.
*
* @return <tt>this<sup>1/2</sup></tt> (newly created)
*/
public abstract GF2nElement squareRoot();
/**
* Compute the square root of this element.
*/
public abstract void squareRootThis();
/**
* Performs a basis transformation of this element to the given GF2nField
* <tt>basis</tt>.
*
* @param basis the GF2nField representation to transform this element to
* @return this element in the representation of <tt>basis</tt>
* @throws DifferentFieldsException if <tt>this</tt> cannot be converted according to
* <tt>basis</tt>.
*/
public final GF2nElement convert(GF2nField basis)
throws RuntimeException
{
return mField.convert(this, basis);
}
/**
* Returns the trace of this element.
*
* @return the trace of this element
*/
public abstract int trace();
/**
* Solves a quadratic equation.<br>
* Let z<sup>2</sup> + z = <tt>this</tt>. Then this method returns z.
*
* @return z with z<sup>2</sup> + z = <tt>this</tt>
* @throws NoSolutionException if z<sup>2</sup> + z = <tt>this</tt> does not have a
* solution
*/
public abstract GF2nElement solveQuadraticEquation()
throws RuntimeException;
}