Constructors Summary |
---|
public ECFieldF2m(int m)Creates an elliptic curve characteristic 2 finite
field which has 2^m elements with normal basis.
if (m <= 0) {
throw new IllegalArgumentException("m is not positive");
}
this.m = m;
this.ks = null;
this.rp = null;
|
public ECFieldF2m(int m, BigInteger rp)Creates an elliptic curve characteristic 2 finite
field which has 2^m elements with
polynomial basis.
The reduction polynomial for this field is based
on rp whose i-th bit correspondes to
the i-th coefficient of the reduction polynomial.
Note: A valid reduction polynomial is either a
trinomial (X^m + X^k + 1
with m > k >= 1) or a
pentanomial (X^m + X^k3
+ X^k2 + X^k1 + 1 with
m > k3 > k2
> k1 >= 1).
// check m and rp
this.m = m;
this.rp = rp;
if (m <= 0) {
throw new IllegalArgumentException("m is not positive");
}
int bitCount = this.rp.bitCount();
if (!this.rp.testBit(0) || !this.rp.testBit(m) ||
((bitCount != 3) && (bitCount != 5))) {
throw new IllegalArgumentException
("rp does not represent a valid reduction polynomial");
}
// convert rp into ks
BigInteger temp = this.rp.clearBit(0).clearBit(m);
this.ks = new int[bitCount-2];
for (int i = this.ks.length-1; i >= 0; i--) {
int index = temp.getLowestSetBit();
this.ks[i] = index;
temp = temp.clearBit(index);
}
|
public ECFieldF2m(int m, int[] ks)Creates an elliptic curve characteristic 2 finite
field which has 2^m elements with
polynomial basis. The reduction polynomial for this
field is based on ks whose content
contains the order of the middle term(s) of the
reduction polynomial.
Note: A valid reduction polynomial is either a
trinomial (X^m + X^k + 1
with m > k >= 1) or a
pentanomial (X^m + X^k3
+ X^k2 + X^k1 + 1 with
m > k3 > k2
> k1 >= 1), so ks should
have length 1 or 3.
// check m and ks
this.m = m;
this.ks = (int[]) ks.clone();
if (m <= 0) {
throw new IllegalArgumentException("m is not positive");
}
if ((this.ks.length != 1) && (this.ks.length != 3)) {
throw new IllegalArgumentException
("length of ks is neither 1 nor 3");
}
for (int i = 0; i < this.ks.length; i++) {
if ((this.ks[i] < 1) || (this.ks[i] > m-1)) {
throw new IllegalArgumentException
("ks["+ i + "] is out of range");
}
if ((i != 0) && (this.ks[i] >= this.ks[i-1])) {
throw new IllegalArgumentException
("values in ks are not in descending order");
}
}
// convert ks into rp
this.rp = BigInteger.ONE;
this.rp = rp.setBit(m);
for (int j = 0; j < this.ks.length; j++) {
rp = rp.setBit(this.ks[j]);
}
|
Methods Summary |
---|
public boolean | equals(java.lang.Object obj)Compares this finite field for equality with the
specified object.
if (this == obj) return true;
if (obj instanceof ECFieldF2m) {
// no need to compare rp here since ks and rp
// should be equivalent
return ((m == ((ECFieldF2m)obj).m) &&
(Arrays.equals(ks, ((ECFieldF2m) obj).ks)));
}
return false;
|
public int | getFieldSize()Returns the field size in bits which is m
for this characteristic 2 finite field.
return m;
|
public int | getM()Returns the value m of this characteristic
2 finite field.
return m;
|
public int[] | getMidTermsOfReductionPolynomial()Returns an integer array which contains the order of the
middle term(s) of the reduction polynomial for polynomial
basis or null for normal basis.
if (ks == null) {
return null;
} else {
return (int[]) ks.clone();
}
|
public java.math.BigInteger | getReductionPolynomial()Returns a BigInteger whose i-th bit corresponds to the
i-th coefficient of the reduction polynomial for polynomial
basis or null for normal basis.
return rp;
|
public int | hashCode()Returns a hash code value for this characteristic 2
finite field.
int value = m << 5;
value += (rp==null? 0:rp.hashCode());
// no need to involve ks here since ks and rp
// should be equivalent.
return value;
|