init commit

This commit is contained in:
2025-10-09 09:57:24 +09:00
commit 4d551bd74f
6636 changed files with 1218703 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
using System;
namespace Org.BouncyCastle.Math.Field;
public abstract class FiniteFields
{
internal static readonly IFiniteField GF_2 = new PrimeField(BigInteger.ValueOf(2L));
internal static readonly IFiniteField GF_3 = new PrimeField(BigInteger.ValueOf(3L));
public static IPolynomialExtensionField GetBinaryExtensionField(int[] exponents)
{
if (exponents[0] != 0)
{
throw new ArgumentException("Irreducible polynomials in GF(2) must have constant term", "exponents");
}
for (int i = 1; i < exponents.Length; i++)
{
if (exponents[i] <= exponents[i - 1])
{
throw new ArgumentException("Polynomial exponents must be montonically increasing", "exponents");
}
}
return new GenericPolynomialExtensionField(GF_2, new GF2Polynomial(exponents));
}
public static IFiniteField GetPrimeField(BigInteger characteristic)
{
int bitLength = characteristic.BitLength;
if (characteristic.SignValue <= 0 || bitLength < 2)
{
throw new ArgumentException("Must be >= 2", "characteristic");
}
if (bitLength < 3)
{
switch (characteristic.IntValue)
{
case 2:
return GF_2;
case 3:
return GF_3;
}
}
return new PrimeField(characteristic);
}
}

View File

@@ -0,0 +1,38 @@
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Math.Field;
internal class GF2Polynomial : IPolynomial
{
protected readonly int[] exponents;
public virtual int Degree => exponents[exponents.Length - 1];
internal GF2Polynomial(int[] exponents)
{
this.exponents = Arrays.Clone(exponents);
}
public virtual int[] GetExponentsPresent()
{
return Arrays.Clone(exponents);
}
public override bool Equals(object obj)
{
if (this == obj)
{
return true;
}
if (!(obj is GF2Polynomial gF2Polynomial))
{
return false;
}
return Arrays.AreEqual(exponents, gF2Polynomial.exponents);
}
public override int GetHashCode()
{
return Arrays.GetHashCode(exponents);
}
}

View File

@@ -0,0 +1,48 @@
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Math.Field;
internal class GenericPolynomialExtensionField : IPolynomialExtensionField, IExtensionField, IFiniteField
{
protected readonly IFiniteField subfield;
protected readonly IPolynomial minimalPolynomial;
public virtual BigInteger Characteristic => subfield.Characteristic;
public virtual int Dimension => subfield.Dimension * minimalPolynomial.Degree;
public virtual IFiniteField Subfield => subfield;
public virtual int Degree => minimalPolynomial.Degree;
public virtual IPolynomial MinimalPolynomial => minimalPolynomial;
internal GenericPolynomialExtensionField(IFiniteField subfield, IPolynomial polynomial)
{
this.subfield = subfield;
minimalPolynomial = polynomial;
}
public override bool Equals(object obj)
{
if (this == obj)
{
return true;
}
if (!(obj is GenericPolynomialExtensionField genericPolynomialExtensionField))
{
return false;
}
if (subfield.Equals(genericPolynomialExtensionField.subfield))
{
return minimalPolynomial.Equals(genericPolynomialExtensionField.minimalPolynomial);
}
return false;
}
public override int GetHashCode()
{
return subfield.GetHashCode() ^ Integers.RotateLeft(minimalPolynomial.GetHashCode(), 16);
}
}

View File

@@ -0,0 +1,8 @@
namespace Org.BouncyCastle.Math.Field;
public interface IExtensionField : IFiniteField
{
IFiniteField Subfield { get; }
int Degree { get; }
}

View File

@@ -0,0 +1,8 @@
namespace Org.BouncyCastle.Math.Field;
public interface IFiniteField
{
BigInteger Characteristic { get; }
int Dimension { get; }
}

View File

@@ -0,0 +1,8 @@
namespace Org.BouncyCastle.Math.Field;
public interface IPolynomial
{
int Degree { get; }
int[] GetExponentsPresent();
}

View File

@@ -0,0 +1,6 @@
namespace Org.BouncyCastle.Math.Field;
public interface IPolynomialExtensionField : IExtensionField, IFiniteField
{
IPolynomial MinimalPolynomial { get; }
}

View File

@@ -0,0 +1,33 @@
namespace Org.BouncyCastle.Math.Field;
internal class PrimeField : IFiniteField
{
protected readonly BigInteger characteristic;
public virtual BigInteger Characteristic => characteristic;
public virtual int Dimension => 1;
internal PrimeField(BigInteger characteristic)
{
this.characteristic = characteristic;
}
public override bool Equals(object obj)
{
if (this == obj)
{
return true;
}
if (!(obj is PrimeField primeField))
{
return false;
}
return characteristic.Equals(primeField.characteristic);
}
public override int GetHashCode()
{
return characteristic.GetHashCode();
}
}