public static List <BigInteger> GetPrimeFactors(BigInteger p) { var list = new List <BigInteger>(); if (p % 2 == 0) { list.Add(2); while (p % 2 == 0) { p = p / 2; } } for (int i = 3; i <= BigIntegerExtension.Sqrt(p) + 1; i = i + 2) { if (p % i == 0) { list.Add(i); while (p % i == 0) { p = p / i; } } } if (p > 2) { list.Add(p); } return(list); }
public static BigInteger SolveLinearEquatation(DLPInput input, BigInteger logatithmicExpression, BigInteger a, BigInteger b) { var mod = input.order; var gcd = BigInteger.GreatestCommonDivisor(a, mod); if (gcd == -1) { return((b * a.ModInverse(mod)).ModPositive(mod)); } else { //return 1; Console.WriteLine(gcd); BigInteger u, v; BigIntegerExtension.ExtendedGcd(a, mod, out u, out v); var reducedMOD = mod / gcd; var x0 = ((b / gcd) * u).ModPositive(reducedMOD); for (BigInteger j = 0; j < gcd; j++) { var x = x0 + j * reducedMOD; // Console.WriteLine(x); if (BigInteger.ModPow(input.g, x, input.p) == logatithmicExpression) { return(x); } } } return(-1); }