static void Main(string[] args) { QuadraticSieve.primeSupply = new derpy(); BigInteger N = 90283; int B = 14; SieveRequest sievereq = new SieveRequest(); QuadraticSieve.InitSievingRequest(N, B, x => x * x - N, sievereq); QuadraticSieve.SegmentSievingRequest(0, 60, sievereq); SievingData sievedat = new SievingData(); QuadraticSieve.EvaluatePoly(sievereq, sievedat); QuadraticSieve.Sieve(sievereq, sievedat); SieveResult sieveres = new SieveResult(); QuadraticSieve.CreateFormattedSievingResult(sievereq, sievedat, sieveres); printarr(sieveres.V); printarr(sieveres.SmoothRelations); Console.WriteLine(); SolveRequest solvereq = new SolveRequest(); QuadraticSieve.InitSolveRequest(sievereq.B, sieveres.V.Count, solvereq); QuadraticSieve.AddDataToSolveRequest(sieveres, solvereq); printarr(solvereq.Coefficients); Console.WriteLine(); QuadraticSieve.Gaussian(solvereq); printarr(solvereq.Coefficients); Console.ReadLine(); }
public static void AddDataToSolveRequest(SieveResult data, SolveRequest solvereq) { //transpose matrix, add it to the coefficients (making sure to offset by startIdx of data) solvereq.V.AddRange(solvereq.V); for (int i = 0; i < data.V.Count; i++) { for (int j = 0; j < data.SourceRequest.B; j++) { solvereq.Coefficients[j][i + solvereq.V.Count] = data.SmoothRelations[i][j]; } } }
/// <summary> /// Takes a SieveResult object, and adds the data to a SolveRequest object /// </summary> /// <param name="solvereq">The SieveRequest to add the data to</param> /// <param name="data">The data to add</param> public static void AddDataToSolveRequest(SieveResult data, SolveRequest solvereq) { for (int i = 0; i < data.V.Count; i++) { for (int j = 0; j < data.SourceRequest.B; j++) { solvereq.Coefficients[j][i + data.SourceRequest.StartIdx] = data.SmoothRelations[i][j]; } } }
/// <summary> /// Formats data in a SieveData object into a proper SieveResult /// </summary> /// <param name="sievereq"></param> /// <param name="sievedat">The data to be formatted</param> /// <param name="sieveres">The SieveResult object where the formatted data will be put</param> public static void CreateFormattedSievingResult(SieveRequest sievereq, SievingData sievedat, SieveResult sieveres) { sieveres.SourceRequest = sievereq; sieveres.SmoothRelations = new List<BinaryVector>(); sieveres.V = new List<BigInteger>(); for (int i = 0; i < sievereq.L; i++) { if (sievedat.V[i] == 1) { sieveres.V.Add(sievereq.polyFunction(i + sievereq.AStart + sievereq.StartIdx)); sieveres.SmoothRelations.Add(sievedat.Coefficients[i]); } } }
public static void CreateFormattedSievingResult(SieveRequest sievereq, SievingData sievedat, SieveResult sieveres) { sieveres.SourceRequest = sievereq; sieveres.SmoothRelations = new List <BinaryVector>(); sieveres.V = new List <BigInteger>(); for (int i = 0; i < sievereq.L; i++) { //if number only consisted of primes that were sieved, then it is smooth if (sievedat.V[i] == 1) { sieveres.V.Add(sievereq.polyFunction(i + sievereq.AStart + StartIdx)); sieveres.SmoothRelations.Add(sievedat.Coefficients[i]); } } }