1package org.bouncycastle.math.field;
2
3import java.math.BigInteger;
4
5import org.bouncycastle.util.Integers;
6
7class GenericPolynomialExtensionField implements PolynomialExtensionField
8{
9    protected final FiniteField subfield;
10    protected final Polynomial minimalPolynomial;
11
12    GenericPolynomialExtensionField(FiniteField subfield, Polynomial polynomial)
13    {
14        this.subfield = subfield;
15        this.minimalPolynomial = polynomial;
16    }
17
18    public BigInteger getCharacteristic()
19    {
20        return subfield.getCharacteristic();
21    }
22
23    public int getDimension()
24    {
25        return subfield.getDimension() * minimalPolynomial.getDegree();
26    }
27
28    public FiniteField getSubfield()
29    {
30        return subfield;
31    }
32
33    public int getDegree()
34    {
35        return minimalPolynomial.getDegree();
36    }
37
38    public Polynomial getMinimalPolynomial()
39    {
40        return minimalPolynomial;
41    }
42
43    public boolean equals(Object obj)
44    {
45        if (this == obj)
46        {
47            return true;
48        }
49        if (!(obj instanceof GenericPolynomialExtensionField))
50        {
51            return false;
52        }
53        GenericPolynomialExtensionField other = (GenericPolynomialExtensionField)obj;
54        return subfield.equals(other.subfield) && minimalPolynomial.equals(other.minimalPolynomial);
55    }
56
57    public int hashCode()
58    {
59        return subfield.hashCode()
60            ^ Integers.rotateLeft(minimalPolynomial.hashCode(), 16);
61    }
62}
63