예제 #1
0
        public FiniteFieldElement <IntegerType> Divide(
            FiniteFieldElement <IntegerType> element_0,
            FiniteFieldElement <IntegerType> element_1)
        {
            FiniteFieldElement <IntegerType> inverse = MutiplicativeInverse(element_1);

            return(new FiniteFieldElement <IntegerType>(this, Algebra.Modulo(Algebra.Multiply(element_0.Value, inverse.Value), Prime)));
        }
예제 #2
0
 public FiniteFieldElement <uint>[] GetElements()
 {
     FiniteFieldElement <uint>[] elements = new FiniteFieldElement <uint> [256];
     for (int index = 0; index < 256; index++)
     {
         elements[index] = new FiniteFieldElement <uint>(this, (uint)index);
     }
     return(elements);
 }
예제 #3
0
        public FiniteFieldElement <IntegerType> ToDomain(BigInteger value)
        {
            FiniteFieldElement <IntegerType> element = new FiniteFieldElement <IntegerType>(this, Algebra.ToDomain(value));

            if (!Contains(element))
            {
                throw new Exception("Cannot convert to domain");
            }
            return(element);
        }
        public FiniteFieldElement <byte> Divide(FiniteFieldElement <byte> value_0, FiniteFieldElement <byte> value_1)
        {
            if ((value_0.Value == 0) || (value_1.Value == 0))
            {
                return(new FiniteFieldElement <byte>(this, 0));
            }
            byte result = (byte)((((value_0.Value - value_1.Value) + size) - 1) % (size - 1) + 1);

            return(new FiniteFieldElement <byte>(this, result));
        }
        public FiniteFieldElement <byte>[] GetElements()
        {
            FiniteFieldElement <byte>[] elements = new FiniteFieldElement <byte> [(int)size];

            for (int index = 0; index < elements.Length; index++)
            {
                elements[index] = new FiniteFieldElement <byte>(this, (byte)index);
            }
            return(elements);
        }
예제 #6
0
 public AlgebraFiniteFieldGenericPrime(IAlgebraInteger <IntegerType> algebra, IntegerType prime)
 {
     if (!ToolsMathBigIntegerPrime.IsPrime(algebra.ToBigInteger(prime)))
     {
         throw new Exception("Number " + prime.ToString() + " is not prime");
     }
     Prime            = prime;
     Algebra          = algebra;
     ElementCount     = Algebra.ToBigInteger(prime);
     AddIdentity      = new FiniteFieldElement <IntegerType>(this, Algebra.AddIdentity);
     MultiplyIdentity = new FiniteFieldElement <IntegerType>(this, Algebra.MultiplyIdentity);
 }
예제 #7
0
 public override bool Equals(object other)
 {
     if (other is FiniteFieldElement <DomainType> )
     {
         FiniteFieldElement <DomainType> other_typed = (FiniteFieldElement <DomainType>)other;
         return(this == other_typed);
     }
     else
     {
         return(false);
     }
 }
예제 #8
0
        public FiniteFieldElement <int> Divide(
            FiniteFieldElement <int> element_0,
            FiniteFieldElement <int> element_1)
        {
            if (Math.Min(element_0.Value, element_1.Value) == 0)
            {
                return(new FiniteFieldElement <int>(this, 0));
            }
            FiniteFieldElement <int> inverse = MutiplicativeInverse(element_1); //TODO really expensive for big fields

            return(new FiniteFieldElement <int>(this, (gf_mult(element_0.Value, element_1.Value))));
        }
        public FiniteFieldElement <byte> Multiply(
            FiniteFieldElement <byte> value_0,
            FiniteFieldElement <byte> value_1)
        {
            if ((value_0.Value == 0) || (value_1.Value == 0))
            {
                return(new FiniteFieldElement <byte>(this, 0));
            }
            byte result = (byte)(((value_0.Value + value_1.Value - 2) % (size - 1)) + 1);

            return(new FiniteFieldElement <byte>(this, result));
        }
예제 #10
0
        public FiniteFieldElement <IntegerType> [] GetElements()
        {
            if (1000000 < ElementCount)
            {
                throw new Exception("Groups is to big, you do not want this");
            }

            FiniteFieldElement <IntegerType> [] elements = new FiniteFieldElement <IntegerType> [(int)ElementCount];
            for (int index = 0; index < elements.Length; index++)
            {
                elements[index] = new FiniteFieldElement <IntegerType>(this, Algebra.ToDomain(index));
            }
            return(elements);
        }
예제 #11
0
        public FiniteFieldElement <int> [] GetElements()
        {
            if (1000000 < size)
            {
                throw new Exception("Groups is to big, you do not want this");
            }

            FiniteFieldElement <int> [] elements = new FiniteFieldElement <int> [(int)size];
            for (int index = 0; index < elements.Length; index++)
            {
                elements[index] = new FiniteFieldElement <int>(this, index);
            }
            return(elements);
        }
예제 #12
0
        private FiniteFieldElement <int> MutiplicativeInverse(FiniteFieldElement <int> element)
        {
            FiniteFieldElement <int>[] elements  = GetElements();
            FiniteFieldElement <int>   indentity = MultiplyIdentity;

            for (int element_index = 0; element_index < elements.Length; element_index++)
            {
                if (element * elements[element_index] == indentity)
                {
                    return(elements[element_index]);
                }
            }
            throw new Exception("Mutiplicative Inverse should always exist also for " + element);
        }
예제 #13
0
 public static void CheckFieldDistributivity <ElementType>(
     IAlgebraFieldFinite <ElementType> field)
 {
     FiniteFieldElement <ElementType>[] elements = field.GetElements();
     // check distributivity  a X (b + c) = (a X b) + (a X c).
     for (int index_0 = 0; index_0 < elements.Length; index_0++)
     {
         for (int index_1 = 0; index_1 < elements.Length; index_1++)
         {
             for (int index_2 = 0; index_2 < elements.Length; index_2++)
             {
                 FiniteFieldElement <ElementType> result_0 = (elements[index_0] + elements[index_1]) * elements[index_2];
                 FiniteFieldElement <ElementType> result_1 = (elements[index_0] * elements[index_2]) + (elements[index_1] * elements[index_2]);
                 Assert.AreEqual(result_0, result_1);
             }
         }
     }
 }
예제 #14
0
        public static void CheckFieldIdentities <ElementType>(
            IAlgebraFieldFinite <ElementType> field)
        {
            FiniteFieldElement <ElementType>[] elements          = field.GetElements();
            FiniteFieldElement <ElementType>   add_identity      = field.AddIdentity;
            FiniteFieldElement <ElementType>   multiply_identity = field.MultiplyIdentity;

            Assert.AreNotEqual(add_identity, multiply_identity, "add_identiy should be different from multiply_identity");
            // check identity elements
            for (int index_0 = 0; index_0 < elements.Length; index_0++)
            {
                Assert.AreEqual(elements[index_0], elements[index_0] + add_identity, elements[index_0] + " + " + add_identity + " should yield " + elements[index_0] + " but yielded " + (elements[index_0] + add_identity));
                Assert.AreEqual(elements[index_0], add_identity + elements[index_0], add_identity + " + " + elements[index_0] + " should yield " + elements[index_0] + " but yielded " + (add_identity + elements[index_0]));

                Assert.AreEqual(elements[index_0], elements[index_0] * multiply_identity, elements[index_0] + " * " + multiply_identity + " should yield " + elements[index_0] + " but yielded " + (elements[index_0] * multiply_identity));
                Assert.AreEqual(elements[index_0], multiply_identity * elements[index_0], multiply_identity + " * " + elements[index_0] + " should yield " + elements[index_0] + " but yielded " + (multiply_identity * elements[index_0]));
            }
        }
예제 #15
0
        /* Multiply two numbers in the GF(2^8) finite field defined
         * by the polynomial x^8 + x^4 + x^3 + x + 1 = 0 */
        public FiniteFieldElement <uint> Multiply(FiniteFieldElement <uint> value_0, FiniteFieldElement <uint> value_1)
        {
            uint a = value_0.Value;
            uint b = value_1.Value;
            uint p = 0;
            uint counter;
            uint carry;

            for (counter = 0; counter < 8; counter++)
            {
                if ((b & 1) == 0)
                {
                    p ^= a;
                }
                carry = (a & 0x80);  /* detect if x^8 term is about to be generated */
                a   <<= 1;
                if (carry == 0)
                {
                    a ^= 0x1B; /* replace x^8 with x^4 + x^3 + x + 1 */
                }
                b >>= 1;
            }
            return(new FiniteFieldElement <uint>(this, p));
        }
예제 #16
0
 public FiniteFieldElement <int> Multiply(
     FiniteFieldElement <int> element_0,
     FiniteFieldElement <int> element_1)
 {
     return(new FiniteFieldElement <int>(this, gf_mult(element_0.Value, element_1.Value)));
 }
예제 #17
0
 public FiniteFieldElement <int> Subtract(
     FiniteFieldElement <int> element_0,
     FiniteFieldElement <int> element_1)
 {
     return(new FiniteFieldElement <int>(this, (element_0.Value ^ element_1.Value)));
 }
예제 #18
0
 public bool Contains(FiniteFieldElement <int> input)
 {
     return(input.Algebra == this);
 }
예제 #19
0
 public FiniteFieldElement <BigInteger> Subtract(
     FiniteFieldElement <BigInteger> element_0,
     FiniteFieldElement <BigInteger> element_1)
 {
     return(new FiniteFieldElement <BigInteger>(this, element_0.Value ^ element_1.Value));
 }
예제 #20
0
 public int ToInt32(FiniteFieldElement <int> value)
 {
     throw new NotImplementedException();
 }
예제 #21
0
 public BigInteger ToBigInteger(FiniteFieldElement <int> value)
 {
     throw new NotImplementedException();
 }
예제 #22
0
 public int ToInt32(FiniteFieldElement <IntegerType> value)
 {
     return(Algebra.ToInt32(value.Value));
 }
예제 #23
0
        private FiniteFieldElement <IntegerType> MutiplicativeInverse(FiniteFieldElement <IntegerType> element_0)
        {
            Tuple <IntegerType, IntegerType, IntegerType> xyd = ToolsMath.ExtendedEuclideanAlgorithm(Algebra, element_0.Value, Prime);

            return(new FiniteFieldElement <IntegerType>(this, Algebra.Modulo(xyd.Item1, Prime)));
        }
예제 #24
0
 public FiniteFieldElement <DomainType> Multiply(
     FiniteFieldElement <DomainType> other)
 {
     return(Algebra.Multiply(this, other));
 }
예제 #25
0
 public bool Contains(FiniteFieldElement <IntegerType> input)
 {
     return(input.Algebra == this);
 }
예제 #26
0
 public FiniteFieldElement <BigInteger> Multiply(
     FiniteFieldElement <BigInteger> element_0,
     FiniteFieldElement <BigInteger> element_1)
 {
     return(new FiniteFieldElement <BigInteger>(this, ((element_0.Value + element_1.Value - 2) % (size - 1)) + 1));
 }
예제 #27
0
 public FiniteFieldElement <BigInteger> Divide(
     FiniteFieldElement <BigInteger> value_0,
     FiniteFieldElement <BigInteger> value_1)
 {
     return(new FiniteFieldElement <BigInteger>(this, (((value_0.Value - value_1.Value) + size) - 1) % (size - 1) + 1));
 }
예제 #28
0
 public FiniteFieldElement <DomainType> Divide(
     FiniteFieldElement <DomainType> other)
 {
     return(Algebra.Divide(this, other));
 }
예제 #29
0
 public FiniteFieldElement <IntegerType> Multiply(
     FiniteFieldElement <IntegerType> element_0,
     FiniteFieldElement <IntegerType> element_1)
 {
     return(new FiniteFieldElement <IntegerType>(this, Algebra.Modulo(Algebra.Multiply(element_0.Value, element_1.Value), Prime)));
 }
예제 #30
0
 public BigInteger ToBigInteger(FiniteFieldElement <IntegerType> value)
 {
     return(Algebra.ToBigInteger(value.Value));
 }