public FiniteFieldElement( IAlgebraFieldFinite <DomainType> field, DomainType value) { Algebra = field; Value = value; }
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; }
public static void CheckField <ElementType>( IAlgebraFieldFinite <ElementType> field) { PrintField(field); CheckFieldIdentities(field); CheckFieldInverses(field); CheckFieldDistributivity(field); }
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))); }
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); }
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); }
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); } } } }
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])); } }