public FiniteFieldElement(
     IAlgebraFieldFinite <DomainType> field,
     DomainType value)
 {
     Algebra = field;
     Value   = value;
 }
Exemple #2
0
        public static void CheckFieldInverses <ElementType>(
            IAlgebraFieldFinite <ElementType> field)
        {
            FiniteFieldElement <ElementType>[] elements = field.GetElements();

            // check + inverse
            for (int index_0 = 1; index_0 < elements.Length; index_0++)
            {
                for (int index_1 = 1; index_1 < elements.Length; index_1++)
                {
                    Assert.AreEqual(elements[index_0], (elements[index_0] + elements[index_1]) - elements[index_1], elements[index_0] + " +- " + elements[index_1] + " should yield " + elements[index_0] + " but yielded " + ((elements[index_0] + elements[index_1]) - elements[index_1]));
                    Assert.AreEqual(elements[index_0], (elements[index_0] - elements[index_1]) + elements[index_1], elements[index_0] + " -+ " + elements[index_1] + " should yield " + elements[index_0] + " but yielded " + ((elements[index_0] - elements[index_1]) + elements[index_1]));
                }
            }

            // check * inverse
            for (int index_0 = 2; index_0 < elements.Length; index_0++)
            {
                for (int index_1 = 2; index_1 < elements.Length; index_1++)
                {
                    Assert.AreEqual(elements[index_0], (elements[index_0] * elements[index_1]) / elements[index_1]);
                    Assert.AreEqual(elements[index_0], (elements[index_0] / elements[index_1]) * elements[index_1]);
                }
            }
        }
 public ThresholdLagrangeBigInteger(IAlgebraFieldFinite <BigInteger> algebra, int required_key_count, BigInteger secret_point, IFunction <BigInteger, BigInteger> hashing_function, BigInteger secret_result_hash)
 {
     this.algebra            = algebra;
     this.RequiredKeyCount   = required_key_count;
     this.secret_point       = secret_point;
     this.hashing_function   = hashing_function;
     this.secret_result_hash = secret_result_hash;
 }
Exemple #4
0
 public static void CheckField <ElementType>(
     IAlgebraFieldFinite <ElementType> field)
 {
     PrintField(field);
     CheckFieldIdentities(field);
     CheckFieldInverses(field);
     CheckFieldDistributivity(field);
 }
Exemple #5
0
 public static void PrintField <ElementType>(
     IAlgebraFieldFinite <ElementType> field)
 {
     Console.WriteLine("add table");
     Console.WriteLine(ToolsCollection.ToString(ToolsMathFiniteField.GetAdditionTable(field)));
     Console.WriteLine("subtract table");
     Console.WriteLine(ToolsCollection.ToString(ToolsMathFiniteField.GetSubtractionTable(field)));
     Console.WriteLine("multiply table");
     Console.WriteLine(ToolsCollection.ToString(ToolsMathFiniteField.GetMultiplicationTable(field)));
     Console.WriteLine("divide table");
     Console.WriteLine(ToolsCollection.ToString(ToolsMathFiniteField.GetDivisionTable(field)));
 }
Exemple #6
0
 public static string [,] GetDivisionTable <ElementType>(
     IAlgebraFieldFinite <ElementType> field)
 {
     FiniteFieldElement <ElementType> [] elements = field.GetElements();
     string[,] table = new string[elements.Length, elements.Length];
     for (int index_0 = 0; index_0 < elements.Length; index_0++)
     {
         for (int index_1 = 0; index_1 < elements.Length; index_1++)
         {
             table[index_0, index_1] = field.Divide(elements[index_0], elements[index_1]).ToString();
         }
     }
     return(table);
 }
Exemple #7
0
        public AlgebraFiniteFieldGenericPrimePower(IAlgebraInteger <IntegerType> algebra, IntegerType prime, IntegerType power)
        {
            if (!ToolsMathBigIntegerPrime.IsPrime(algebra.ToBigInteger(prime)))
            {
                throw new Exception("Number " + prime.ToString() + " is not prime");
            }
            Algebra          = algebra;
            Prime            = prime;
            Power            = power;
            PrimeFiniteField = new AlgebraFiniteFieldGenericPrime <IntegerType>(algebra, prime);

            ElementCount = Algebra.ToBigInteger(prime).Pow(Algebra.ToBigInteger(power));

            AddIdentity      = new FiniteFieldElement <IntegerType>(this, Algebra.AddIdentity);
            MultiplyIdentity = new FiniteFieldElement <IntegerType>(this, Algebra.MultiplyIdentity);
        }
Exemple #8
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);
             }
         }
     }
 }
Exemple #9
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]));
            }
        }