| 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; |
| |
| } |