⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecfieldelement.java

📁 kmlnjlkj nlkjlkjkljl okopokipoipo oipipipo i
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
         */        private int m;        /**         * TPB: The integer <code>k</code> where <code>x<sup>m</sup> +         * x<sup>k</sup> + 1</code> represents the reduction polynomial         * <code>f(z)</code>.<br>         * PPB: The integer <code>k1</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        private int k1;        /**         * TPB: Always set to <code>0</code><br>         * PPB: The integer <code>k2</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        private int k2;        /**         * TPB: Always set to <code>0</code><br>         * PPB: The integer <code>k3</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        private int k3;        /**         * The <code>IntArray</code> holding the bits.         */        private IntArray x;        /**         * The number of <code>int</code>s required to hold <code>m</code> bits.         */        private int t;        /**         * Constructor for PPB.         * @param m  The exponent <code>m</code> of         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param x The BigInteger representing the value of the field element.         */        public F2m(            int m,             int k1,             int k2,             int k3,            BigInteger x)        {            // t = m / 32 rounded up to the next integer            t = (m + 31) >> 5;            this.x = new IntArray(x, t);            if ((k2 == 0) && (k3 == 0))            {                this.representation = TPB;            }            else            {                if (k2 >= k3)                {                    throw new IllegalArgumentException(                            "k2 must be smaller than k3");                }                if (k2 <= 0)                {                    throw new IllegalArgumentException(                            "k2 must be larger than 0");                }                this.representation = PPB;            }            if (x.signum() < 0)            {                throw new IllegalArgumentException("x value cannot be negative");            }            this.m = m;            this.k1 = k1;            this.k2 = k2;            this.k3 = k3;        }        /**         * Constructor for TPB.         * @param m  The exponent <code>m</code> of         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param k The integer <code>k</code> where <code>x<sup>m</sup> +         * x<sup>k</sup> + 1</code> represents the reduction         * polynomial <code>f(z)</code>.         * @param x The BigInteger representing the value of the field element.         */        public F2m(int m, int k, BigInteger x)        {            // Set k1 to k, and set k2 and k3 to 0            this(m, k, 0, 0, x);        }        private F2m(int m, int k1, int k2, int k3, IntArray x)        {            t = (m + 31) >> 5;            this.x = x;            this.m = m;            this.k1 = k1;            this.k2 = k2;            this.k3 = k3;            if ((k2 == 0) && (k3 == 0))            {                this.representation = TPB;            }            else            {                this.representation = PPB;            }        }        public BigInteger toBigInteger()        {            return x.toBigInteger();        }        public String getFieldName()        {            return "F2m";        }        public int getFieldSize()        {            return m;        }        /**         * Checks, if the ECFieldElements <code>a</code> and <code>b</code>         * are elements of the same field <code>F<sub>2<sup>m</sup></sub></code>         * (having the same representation).         * @param a field element.         * @param b field element to be compared.         * @throws IllegalArgumentException if <code>a</code> and <code>b</code>         * are not elements of the same field         * <code>F<sub>2<sup>m</sup></sub></code> (having the same         * representation).          */        public static void checkFieldElements(            ECFieldElement a,            ECFieldElement b)        {            if ((!(a instanceof F2m)) || (!(b instanceof F2m)))            {                throw new IllegalArgumentException("Field elements are not "                        + "both instances of ECFieldElement.F2m");            }            ECFieldElement.F2m aF2m = (ECFieldElement.F2m)a;            ECFieldElement.F2m bF2m = (ECFieldElement.F2m)b;            if ((aF2m.m != bF2m.m) || (aF2m.k1 != bF2m.k1)                    || (aF2m.k2 != bF2m.k2) || (aF2m.k3 != bF2m.k3))            {                throw new IllegalArgumentException("Field elements are not "                        + "elements of the same field F2m");            }            if (aF2m.representation != bF2m.representation)            {                // Should never occur                throw new IllegalArgumentException(                        "One of the field "                                + "elements are not elements has incorrect representation");            }        }        public ECFieldElement add(final ECFieldElement b)        {            // No check performed here for performance reasons. Instead the            // elements involved are checked in ECPoint.F2m            // checkFieldElements(this, b);            IntArray iarrClone = (IntArray)this.x.clone();            F2m bF2m = (F2m)b;            iarrClone.addShifted(bF2m.x, 0);            return new F2m(m, k1, k2, k3, iarrClone);        }        public ECFieldElement subtract(final ECFieldElement b)        {            // Addition and subtraction are the same in F2m            return add(b);        }        public ECFieldElement multiply(final ECFieldElement b)        {            // Right-to-left comb multiplication in the IntArray            // Input: Binary polynomials a(z) and b(z) of degree at most m-1            // Output: c(z) = a(z) * b(z) mod f(z)            // No check performed here for performance reasons. Instead the            // elements involved are checked in ECPoint.F2m            // checkFieldElements(this, b);            F2m bF2m = (F2m)b;            IntArray mult = x.multiply(bF2m.x, m);            mult.reduce(m, new int[]{k1, k2, k3});            return new F2m(m, k1, k2, k3, mult);        }        public ECFieldElement divide(final ECFieldElement b)        {            // There may be more efficient implementations            ECFieldElement bInv = b.invert();            return multiply(bInv);        }        public ECFieldElement negate()        {            // -x == x holds for all x in F2m            return this;        }        public ECFieldElement square()        {            IntArray squared = x.square(m);            squared.reduce(m, new int[]{k1, k2, k3});            return new F2m(m, k1, k2, k3, squared);        }        public ECFieldElement invert()        {            // Inversion in F2m using the extended Euclidean algorithm            // Input: A nonzero polynomial a(z) of degree at most m-1            // Output: a(z)^(-1) mod f(z)            // u(z) := a(z)            IntArray uz = (IntArray)this.x.clone();            // v(z) := f(z)            IntArray vz = new IntArray(t);            vz.setBit(m);            vz.setBit(0);            vz.setBit(this.k1);            if (this.representation == PPB)             {                vz.setBit(this.k2);                vz.setBit(this.k3);            }            // g1(z) := 1, g2(z) := 0            IntArray g1z = new IntArray(t);            g1z.setBit(0);            IntArray g2z = new IntArray(t);            // while u != 0            while (!uz.isZero())//            while (uz.getUsedLength() > 0)//            while (uz.bitLength() > 1)            {                // j := deg(u(z)) - deg(v(z))                int j = uz.bitLength() - vz.bitLength();                // If j < 0 then: u(z) <-> v(z), g1(z) <-> g2(z), j := -j                if (j < 0)                 {                    final IntArray uzCopy = uz;                    uz = vz;                    vz = uzCopy;                    final IntArray g1zCopy = g1z;                    g1z = g2z;                    g2z = g1zCopy;                    j = -j;                }                // u(z) := u(z) + z^j * v(z)                // Note, that no reduction modulo f(z) is required, because                // deg(u(z) + z^j * v(z)) <= max(deg(u(z)), j + deg(v(z)))                // = max(deg(u(z)), deg(u(z)) - deg(v(z)) + deg(v(z))                // = deg(u(z))                // uz = uz.xor(vz.shiftLeft(j));                // jInt = n / 32                int jInt = j >> 5;                // jInt = n % 32                int jBit = j & 0x1F;                IntArray vzShift = vz.shiftLeft(jBit);                uz.addShifted(vzShift, jInt);                // g1(z) := g1(z) + z^j * g2(z)//                g1z = g1z.xor(g2z.shiftLeft(j));                IntArray g2zShift = g2z.shiftLeft(jBit);                g1z.addShifted(g2zShift, jInt);                            }            return new ECFieldElement.F2m(                    this.m, this.k1, this.k2, this.k3, g2z);        }        public ECFieldElement sqrt()        {            throw new RuntimeException("Not implemented");        }        /**         * @return the representation of the field         * <code>F<sub>2<sup>m</sup></sub></code>, either of         * TPB (trinomial         * basis representation) or         * PPB (pentanomial         * basis representation).         */        public int getRepresentation()        {            return this.representation;        }        /**         * @return the degree <code>m</code> of the reduction polynomial         * <code>f(z)</code>.         */        public int getM()        {            return this.m;        }        /**         * @return TPB: The integer <code>k</code> where <code>x<sup>m</sup> +         * x<sup>k</sup> + 1</code> represents the reduction polynomial         * <code>f(z)</code>.<br>         * PPB: The integer <code>k1</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        public int getK1()        {            return this.k1;        }        /**         * @return TPB: Always returns <code>0</code><br>         * PPB: The integer <code>k2</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        public int getK2()        {            return this.k2;        }        /**         * @return TPB: Always set to <code>0</code><br>         * PPB: The integer <code>k3</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        public int getK3()        {            return this.k3;        }        public boolean equals(Object anObject)        {            if (anObject == this)             {                return true;            }            if (!(anObject instanceof ECFieldElement.F2m))             {                return false;            }            ECFieldElement.F2m b = (ECFieldElement.F2m)anObject;                        return ((this.m == b.m) && (this.k1 == b.k1) && (this.k2 == b.k2)                && (this.k3 == b.k3)                && (this.representation == b.representation)                && (this.x.equals(b.x)));        }        public int hashCode()        {            return x.hashCode() ^ m ^ k1 ^ k2 ^ k3;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -